@konoui/mjimage 0.0.56 → 0.0.57
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +8 -8
- package/dist/index.js +173 -171
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";var Hs=Object.defineProperty;var Ws=(n,t,e)=>t in n?Hs(n,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):n[t]=e;var _=(n,t,e)=>Ws(n,typeof t!="symbol"?t+"":t,e);Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const Ue="MS Gothic, sans-serif",nt={WIDTH:66,HEIGHT:90,TEXT_SCALE:.8,BLOCK_MARGIN_SCALE:.3},ve={WIDTH:125,HEIGHT:27.5},Wn={BASE:40},q=",",p={M:"m",P:"p",S:"s",Z:"z",BACK:"_"},y={TSUMO:"t",RON:"v",DORA:"d",HORIZONTAL:"-",RED:"r",COLOR_GRAYSCALE:"^"},b={PON:"pon",CHI:"chi",SHO_KAN:"shokan",DAI_KAN:"daikan",AN_KAN:"ankan",TSUMO:"tsumo",PAIR:"pair",ISOLATED:"isolated",THREE:"three",RUN:"run",HAND:"hand",IMAGE_DORA:"dora",IMAGE_DISCARD:"simple-discard",UNKNOWN:"unknown"},E={E:"1w",S:"2w",W:"3w",N:"4w"},k={E1:"1w1",E2:"1w2",E3:"1w3",E4:"1w4",S1:"2w1",S2:"2w2",S3:"2w3",S4:"2w4",W1:"3w1",W2:"3w2",W3:"3w3",W4:"3w4",N1:"4w1",N2:"4w2",N3:"4w3",N4:"4w4"},de={[E.E]:"東",[E.S]:"南",[E.W]:"西",[E.N]:"北"},Fe={[k.E1]:"東1局",[k.E2]:"東2局",[k.E3]:"東3局",[k.E4]:"東4局",[k.S1]:"南1局",[k.S2]:"南2局",[k.S3]:"南3局",[k.S4]:"南4局",[k.W1]:"西1局",[k.W2]:"西2局",[k.W3]:"西3局",[k.W4]:"西4局",[k.N1]:"北1局",[k.N2]:"北2局",[k.N3]:"北3局",[k.N4]:"北4局"};function N(n,t){if(!n)throw new Error(t)}class Bs{constructor(t="東",e="2"){_(this,"ctx",null);_(this,"strText");_(this,"numText");_(this,"measure",(t,e)=>{this.ctx==null&&(this.ctx=document.createElement("canvas").getContext("2d"),N(this.ctx,"context is null"));const s=this.ctx;s.font=e;const r=s.measureText(t);let i=r.width,o=r.actualBoundingBoxAscent+r.actualBoundingBoxDescent;return[i,o]});_(this,"measureFontContext",(t,e)=>{const s={family:t,size:e},r=`${s.size}px ${s.family}`,[i,o]=this.measure(this.strText,r),[a,c]=this.measure(this.numText,r);return{font:{family:t,size:e},textWidth:i,textHeight:o,numWidth:a,numHeight:c}});_(this,"measureTableFontContext",t=>{const e=this.measureFontContext(Ue,Wn.BASE*t);return e.textHeight=e.textWidth,e.numHeight=e.numWidth,e});this.strText=t,this.numText=e}}class Ds{constructor(t){_(this,"input");_(this,"position");_(this,"nextPosition");_(this,"char");_(this,"eof","\0");this.input=t,this.position=0,this.nextPosition=0,this.char=this.readChar()}readChar(){return this.nextPosition>=this.input.length?(this.char=this.eof,this.char):(this.char=this.input[this.nextPosition],this.position=this.nextPosition,this.nextPosition++,this.char)}peekChar(){return this.nextPosition>=this.input.length?this.eof:this.input[this.nextPosition]}peekCharN(t){if(t<0)throw new Error("arg must be positive value");return this.position+t>=this.input.length?this.eof:this.input[this.position+t]}prevChar(){return this.position>=this.input.length?this.eof:this.position>0?this.input[this.position-1]:this.eof}skipWhitespace(){for(;this.isWhitespace(this.char);)this.readChar()}isWhitespace(t){return/\s/.test(t)}}const Jt=(n,t)=>{if(n.t==t.t){if(C(n)&&C(t)){if(n.has(y.RED))return-1;if(t.has(y.RED))return 1}return n.n-t.n}const e={[p.M]:1,[p.P]:2,[p.S]:3,[p.Z]:4,[p.BACK]:5};return e[n.t]-e[t.t]},Ks=(n,t)=>{const e={[y.HORIZONTAL]:1,[y.TSUMO]:2,[y.RON]:3,[y.DORA]:4,[y.COLOR_GRAYSCALE]:5,[y.RED]:6};return e[n]-e[t]},Bn=n=>{const t=[];n.forEach((s,r)=>{s.has(y.HORIZONTAL)&&t.push(r)});const e=n.filter(s=>!s.has(y.HORIZONTAL)).sort(Jt);return t.forEach(s=>{e.splice(s,0,n[s])}),e};function C(n){return n.isNum()&&n.n==5}function Ls(n){for(const t of Object.values(p))if(t==n)return[t,!0];return[p.BACK,!1]}class w{constructor(t,e,s=[]){this.t=t,this.n=e,this.ops=s}static from(t){const e=new W(t).tiles();if(e.length!=1)throw new Error(`input is not a single tile ${t}`);return e[0]}toString(){return this.t===p.BACK?this.t:`${[...this.ops].sort(Ks).join("")}${this.n}${this.t}`}toJSON(){return this.toString()}clone(t){const e=(t==null?void 0:t.t)??this.t,s=(t==null?void 0:t.n)??this.n,r=t!=null&&t.removeAll?[]:this.ops.filter(o=>Array.isArray(t==null?void 0:t.remove)?!t.remove.includes(o):(t==null?void 0:t.remove)!=o),i=new Set([...r]);return t!=null&&t.add&&(Array.isArray(t.add)?t.add.forEach(o=>i.add(o)):i.add(t.add)),new w(e,s,Array.from(i))}has(t){return this.ops.includes(t)}isNum(){return this.t==p.M||this.t==p.P||this.t==p.S}equals(t){return t.t==p.BACK&&this.t==p.BACK?!0:this.t==t.t&&this.n==t.n}}class v{constructor(t,e){_(this,"_tiles");_(this,"_type");if(this._tiles=t,this._type=e,this.isCalled()){this._tiles=Bn(this._tiles);return}if(this._type!=b.IMAGE_DISCARD){this._tiles=[...this._tiles].sort(Jt);return}}static from(t){const e=new W(t).parse();if(e.length!=1)throw new Error(`block must be 1: ${t}`);return e[0]}static deserialize(t){const e=v.from(t.tiles),s=e.type;if(!(t.type==b.PAIR||t.type==b.ISOLATED||t.type==b.THREE||t.type==b.RUN)&&s!=t.type)throw new Error(`input type is ${t.type} but got is ${s}: ${t.tiles}`);return ie(e.tiles,t.type)}serialize(){return{tiles:this.toString(),type:this.type}}toJSON(){return this.serialize()}get type(){return this._type}get tiles(){return this._tiles}is(t){return this._type==t}isCalled(){return[b.PON.toString(),b.CHI.toString(),b.DAI_KAN.toString(),b.SHO_KAN.toString(),b.AN_KAN.toString()].includes(this._type.toString())}clone(t){const e=t==null?void 0:t.replace,s=[...this.tiles];return e&&(s[e.idx]=e.tile),ie(s,this._type)}}const _t=n=>{let t="";for(const e of n){if(e.t==p.BACK)return n.join("");t+=e.toString().slice(0,-1)}return`${t}${n[0].t}`},Ge=n=>{let t=n[0].t,e="";for(const r of n){const i=r.t,o=i==p.BACK?r.toString():r.toString().slice(0,-1);i!=t&&t!=p.BACK&&(e+=t),t=i,e+=o}const s=n.at(-1);return s.t!=p.BACK&&(e+=s.t),e};class Z extends v{constructor(t){super(t,b.CHI)}static from(t){return v.deserialize({tiles:t,type:b.CHI})}toString(){return _t(this.tiles)}}class V extends v{constructor(t){super(t,b.PON)}static from(t){return v.deserialize({tiles:t,type:b.PON})}toString(){return _t(this.tiles)}}class R extends v{constructor(t){const e=t.filter(r=>r.t!=p.BACK),s=e[0];if(e.length<t.length){if(C(s)){const r=new w(s.t,5);super([r.clone({add:y.RED}),r,r,r],b.AN_KAN);return}super([s,s,s,s],b.AN_KAN);return}super(t,b.AN_KAN)}get tilesWithBack(){const t=this.tiles[0].clone({remove:y.RED}),e=C(t)?t.clone({add:y.RED}):t;return[new w(p.BACK,0),e,t,new w(p.BACK,0)]}static from(t){return v.deserialize({tiles:t,type:b.AN_KAN})}toString(){return Ge(this.tilesWithBack)}}class Y extends v{constructor(t){super(t,b.DAI_KAN)}static from(t){return v.deserialize({tiles:t,type:b.DAI_KAN})}toString(){return _t(this.tiles)}}class D extends v{constructor(t){super(t,b.SHO_KAN)}static from(t){return v.deserialize({tiles:t,type:b.SHO_KAN})}static fromPon(t,e){const s=t.tiles.findIndex(i=>i.has(y.HORIZONTAL)),r=[...t.tiles];return r.splice(s,0,e.clone({add:y.HORIZONTAL})),new D(r)}toString(){return _t(this.tiles)}}class H extends v{constructor(t,e){super([t,e],b.PAIR)}toString(){return _t(this.tiles)}static from(t){return v.deserialize({tiles:t,type:b.PAIR})}}class z extends v{constructor(t){super(t,b.THREE)}static from(t){return v.deserialize({tiles:t,type:b.THREE})}toString(){return _t(this.tiles)}}class Q extends v{constructor(t){super(t,b.RUN)}static from(t){return v.deserialize({tiles:t,type:b.RUN})}toString(){return _t(this.tiles)}}class Ze extends v{constructor(t){super([t],b.ISOLATED)}static from(t){return v.deserialize({tiles:t,type:b.ISOLATED})}toString(){return this.tiles[0].toString()}}class kt extends v{constructor(t){super(t,b.HAND)}static from(t){return v.deserialize({tiles:t,type:b.HAND})}toString(){return Ge(this.tiles)}}class Ve extends v{constructor(t,e){super(t,e)}toString(){return this.is(b.IMAGE_DISCARD)?this.tiles.join(""):Ge(this.tiles)}}const ie=(n,t)=>{switch(t){case b.CHI:return new Z([n[0],n[1],n[2]]);case b.PON:return new V([n[0],n[1],n[2]]);case b.AN_KAN:return new R(n);case b.DAI_KAN:return new Y(n);case b.SHO_KAN:return new D(n);case b.THREE:return new z(n);case b.RUN:return new Q(n);case b.PAIR:return new H(n[0],n[1]);case b.ISOLATED:return new Ze(n[0]);case b.HAND:return new kt(n);default:return new Ve(n,t)}};class W{constructor(t){_(this,"maxInputLength",600);this.input=t,this.input=t.replace(/\s/g,"")}parse(){const t=this.tileSeparators();return this.makeBlocks(t)}tiles(){return this.tileSeparators().filter(t=>t!=q)}tileSeparators(){const t=new Ds(this.input),e=[];let s=[];for(this.validate(this.input);;){t.skipWhitespace();const r=t.char;if(r===t.eof)break;if(r==q){e.push(q),t.readChar();continue}const[i,o]=wn(r,s);if(o){if(i==p.BACK){e.push(new w(i,0)),t.readChar();continue}e.push(...js(s,i)),s=[],t.readChar();continue}else{const[a,c]=Us(t);if(c){s.push(a),t.readChar();continue}const[l,u]=Dn(r);if(!u)throw new Error(`encounter unexpected number. n: ${l}, current: ${r}, input: ${t.input}`);s.push({n:l})}t.readChar()}if(s.length>0)throw new Error(`remaining values ${s.toString()}`);return e}makeBlocks(t){let e=[];const s=[];if(t.length==0)return s;for(const o of t){if(o==q){const a=mn(e),c=ie(e,a);s.push(c),e=[];continue}e.push(o)}const r=mn(e),i=ie(e,r);return s.push(i),e=[],s}validate(t){if(t.length==0)return;if(t.length>this.maxInputLength)throw new Error(`exceeded maximum input length(${t.length})`);const e=t.charAt(t.length-1),[s,r]=wn(e,[new w(p.BACK,1)]);if(!r)throw new Error(`last character(${e}) is not type value`)}}function mn(n){if(n.length===0)return b.UNKNOWN;if(n.length===1)return n[0].has(y.DORA)?b.IMAGE_DORA:n[0].has(y.TSUMO)?b.TSUMO:b.HAND;const t=n.every(i=>i.equals(n[0])),e=n.filter(i=>i.has(y.HORIZONTAL)).length,s=n.filter(i=>i.has(y.TSUMO)||i.has(y.DORA)).length,r=n.filter(i=>i.t==p.BACK).length;if(s>0)return b.UNKNOWN;if(e==0&&r==0)return b.HAND;if(n.length===3&&r===0)return t?b.PON:e==1&&zs(n)?b.CHI:b.IMAGE_DISCARD;if(n.length==4&&r==2)return b.AN_KAN;if(n.length==4&&t){if(e==1)return b.DAI_KAN;if(e==2)return b.SHO_KAN}return e==1||s==0?b.IMAGE_DISCARD:b.UNKNOWN}function zs(n){const t=[...n].sort(Jt);if(t.some(s=>t[0].t!=s.t))return!1;const e=t.map(s=>s.n);for(let s=0;s<e.length-1;s++)if(e[s]!=e[s+1]-1)return!1;return!0}function js(n,t){return n.map(e=>{const s=new w(t,e.n,e.ops);return s.isNum()&&s.n==0?s.clone({n:5,add:y.RED}):s})}function wn(n,t){const[e,s]=Ls(n);if(s)return[e,!0];if((n==="w"||n==="d")&&t.length>0){for(let i=0;i<t.length;i++){const o=t[i];n==="d"&&(t[i].n=o.n+4)}return[p.Z,!0]}return[p.BACK,!1]}function Dn(n){const t=Number(n),e=0<=t&&t<=9;return[t,e]}function Us(n){const t=Object.values(y);if(!t.includes(n.char))return[new w(p.BACK,0),!1];const e=[];for(let s=0;s<4;s++){const r=n.peekCharN(s);if(t.includes(r))e.push(r);else{const[i,o]=Dn(r);if(!o)break;for(const c of e)n.readChar();const a=new w(p.BACK,i,e);if(a.has(y.RED)&&a.n!=5)throw new Error(`found ${y.RED} but number is not 5: ${i}`);if(a.has(y.DORA)&&a.has(y.TSUMO))throw new Error(`unable to specify both ${y.DORA} and ${y.TSUMO}`);return[a,!0]}}return[new w(p.BACK,0),!1]}function $(n,t=!1){const e={[E.E]:n,[E.S]:n,[E.W]:n,[E.N]:n};if(t)for(let s of Object.values(E))e[s]=structuredClone(n);return e}const Ft=n=>{let t=n.substring(0,2),e=Number(n.substring(2,3));return e==4?(e=1,t=gt(t)):e++,`${t}${e}`},Fs=n=>Ft(Ft(Ft(n))),gt=n=>{let t=Number(n.toString()[0]);return t=t%4+1,`${t}w`},fe=n=>{let t=Number(n.toString()[0]);const e=[1,4,3,2],s=e.indexOf(t);return`${e[(s+1)%e.length]}w`},Ie=(n,t,e)=>{const s=Math.abs(Number(n[0])-Number(t[0]));return N(s==1||s==2||s==3),e==b.PON?s==3?0:s==2?1:2:s==3?0:s==1?3:2};function bn(n){return typeof n>"u"}function Oe(n,t=0){return{a:1,c:0,e:n,b:0,d:1,f:t}}function Je(...n){n=Array.isArray(n[0])?n[0]:n;const t=(e,s)=>({a:e.a*s.a+e.c*s.b,c:e.a*s.c+e.c*s.d,e:e.a*s.e+e.c*s.f+e.e,b:e.b*s.a+e.d*s.b,d:e.b*s.c+e.d*s.d,f:e.b*s.e+e.d*s.f+e.f});switch(n.length){case 0:throw new Error("no matrices provided");case 1:return n[0];case 2:return t(n[0],n[1]);default:{const[e,s,...r]=n,i=t(e,s);return Je(i,...r)}}}function Gs(...n){return Je(...n)}const{cos:Zs,sin:Vs,PI:Js}=Math;function Xs(n,t,e){const s=Zs(n),r=Vs(n),i={a:s,c:-r,e:0,b:r,d:s,f:0};return bn(t)||bn(e)?i:Je([Oe(t,e),i,Oe(-t,-e)])}function Ys(n,t=void 0,e=void 0){return Xs(n*Js/180,t,e)}function qs(n){return Qs(n)}function Qs(n){return`matrix(${n.a},${n.b},${n.c},${n.d},${n.e},${n.f})`}function tr(n,t){function e(){this.constructor=n}e.prototype=t.prototype,n.prototype=new e}function pe(n,t,e,s){var r=Error.call(this,n);return Object.setPrototypeOf&&Object.setPrototypeOf(r,pe.prototype),r.expected=t,r.found=e,r.location=s,r.name="SyntaxError",r}tr(pe,Error);function we(n,t,e){return e=e||" ",n.length>t?n:(t-=n.length,e+=e.repeat(t),n+e.slice(0,t))}pe.prototype.format=function(n){var t="Error: "+this.message;if(this.location){var e=null,s;for(s=0;s<n.length;s++)if(n[s].source===this.location.source){e=n[s].text.split(/\r\n|\n|\r/g);break}var r=this.location.start,i=this.location.source&&typeof this.location.source.offset=="function"?this.location.source.offset(r):r,o=this.location.source+":"+i.line+":"+i.column;if(e){var a=this.location.end,c=we("",i.line.toString().length," "),l=e[r.line-1],u=r.line===a.line?a.column:l.length+1,h=u-r.column||1;t+=`
|
|
1
|
+
"use strict";var Hs=Object.defineProperty;var Ws=(n,t,e)=>t in n?Hs(n,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):n[t]=e;var _=(n,t,e)=>Ws(n,typeof t!="symbol"?t+"":t,e);Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const Ue="MS Gothic, sans-serif",nt={WIDTH:66,HEIGHT:90,TEXT_SCALE:.8,BLOCK_MARGIN_SCALE:.3},ve={WIDTH:125,HEIGHT:27.5},Wn={BASE:40},q=",",p={M:"m",P:"p",S:"s",Z:"z",BACK:"_"},g={TSUMO:"t",RON:"v",DORA:"d",HORIZONTAL:"-",RED:"r",COLOR_GRAYSCALE:"^"},b={PON:"pon",CHI:"chi",SHO_KAN:"shokan",DAI_KAN:"daikan",AN_KAN:"ankan",TSUMO:"tsumo",PAIR:"pair",ISOLATED:"isolated",THREE:"three",RUN:"run",HAND:"hand",IMAGE_DORA:"dora",IMAGE_DISCARD:"simple-discard",UNKNOWN:"unknown"},E={E:"1w",S:"2w",W:"3w",N:"4w"},k={E1:"1w1",E2:"1w2",E3:"1w3",E4:"1w4",S1:"2w1",S2:"2w2",S3:"2w3",S4:"2w4",W1:"3w1",W2:"3w2",W3:"3w3",W4:"3w4",N1:"4w1",N2:"4w2",N3:"4w3",N4:"4w4"},de={[E.E]:"東",[E.S]:"南",[E.W]:"西",[E.N]:"北"},Fe={[k.E1]:"東1局",[k.E2]:"東2局",[k.E3]:"東3局",[k.E4]:"東4局",[k.S1]:"南1局",[k.S2]:"南2局",[k.S3]:"南3局",[k.S4]:"南4局",[k.W1]:"西1局",[k.W2]:"西2局",[k.W3]:"西3局",[k.W4]:"西4局",[k.N1]:"北1局",[k.N2]:"北2局",[k.N3]:"北3局",[k.N4]:"北4局"};function N(n,t){if(!n)throw new Error(t)}class Bs{constructor(t="東",e="2"){_(this,"ctx",null);_(this,"strText");_(this,"numText");_(this,"measure",(t,e)=>{this.ctx==null&&(this.ctx=document.createElement("canvas").getContext("2d"),N(this.ctx,"context is null"));const s=this.ctx;s.font=e;const r=s.measureText(t);let i=r.width,o=r.actualBoundingBoxAscent+r.actualBoundingBoxDescent;return[i,o]});_(this,"measureFontContext",(t,e)=>{const s={family:t,size:e},r=`${s.size}px ${s.family}`,[i,o]=this.measure(this.strText,r),[a,c]=this.measure(this.numText,r);return{font:{family:t,size:e},textWidth:i,textHeight:o,numWidth:a,numHeight:c}});_(this,"measureTableFontContext",t=>{const e=this.measureFontContext(Ue,Wn.BASE*t);return e.textHeight=e.textWidth,e.numHeight=e.numWidth,e});this.strText=t,this.numText=e}}class Ds{constructor(t){_(this,"input");_(this,"position");_(this,"nextPosition");_(this,"char");_(this,"eof","\0");this.input=t,this.position=0,this.nextPosition=0,this.char=this.readChar()}readChar(){return this.nextPosition>=this.input.length?(this.char=this.eof,this.char):(this.char=this.input[this.nextPosition],this.position=this.nextPosition,this.nextPosition++,this.char)}peekChar(){return this.nextPosition>=this.input.length?this.eof:this.input[this.nextPosition]}peekCharN(t){if(t<0)throw new Error("arg must be positive value");return this.position+t>=this.input.length?this.eof:this.input[this.position+t]}prevChar(){return this.position>=this.input.length?this.eof:this.position>0?this.input[this.position-1]:this.eof}skipWhitespace(){for(;this.isWhitespace(this.char);)this.readChar()}isWhitespace(t){return/\s/.test(t)}}const Jt=(n,t)=>{if(n.t==t.t){if(C(n)&&C(t)){if(n.has(g.RED))return-1;if(t.has(g.RED))return 1}return n.n-t.n}const e={[p.M]:1,[p.P]:2,[p.S]:3,[p.Z]:4,[p.BACK]:5};return e[n.t]-e[t.t]},Ks=(n,t)=>{const e={[g.HORIZONTAL]:1,[g.TSUMO]:2,[g.RON]:3,[g.DORA]:4,[g.COLOR_GRAYSCALE]:5,[g.RED]:6};return e[n]-e[t]},Bn=n=>{const t=[];n.forEach((s,r)=>{s.has(g.HORIZONTAL)&&t.push(r)});const e=n.filter(s=>!s.has(g.HORIZONTAL)).sort(Jt);return t.forEach(s=>{e.splice(s,0,n[s])}),e};function C(n){return n.isNum()&&n.n==5}function Ls(n){for(const t of Object.values(p))if(t==n)return[t,!0];return[p.BACK,!1]}class w{constructor(t,e,s=[]){this.t=t,this.n=e,this.ops=s}static from(t){const e=new W(t).tiles();if(e.length!=1)throw new Error(`input is not a single tile ${t}`);return e[0]}toString(){return this.t===p.BACK?this.t:`${[...this.ops].sort(Ks).join("")}${this.n}${this.t}`}toJSON(){return this.toString()}clone(t){const e=(t==null?void 0:t.t)??this.t,s=(t==null?void 0:t.n)??this.n,r=t!=null&&t.removeAll?[]:this.ops.filter(o=>Array.isArray(t==null?void 0:t.remove)?!t.remove.includes(o):(t==null?void 0:t.remove)!=o),i=new Set([...r]);return t!=null&&t.add&&(Array.isArray(t.add)?t.add.forEach(o=>i.add(o)):i.add(t.add)),new w(e,s,Array.from(i))}has(t){return this.ops.includes(t)}isNum(){return this.t==p.M||this.t==p.P||this.t==p.S}equals(t){return t.t==p.BACK&&this.t==p.BACK?!0:this.t==t.t&&this.n==t.n}}class v{constructor(t,e){_(this,"_tiles");_(this,"_type");if(this._tiles=t,this._type=e,this.isCalled()){this._tiles=Bn(this._tiles);return}if(this._type!=b.IMAGE_DISCARD){this._tiles=[...this._tiles].sort(Jt);return}}static from(t){const e=new W(t).parse();if(e.length!=1)throw new Error(`block must be 1: ${t}`);return e[0]}static deserialize(t){const e=v.from(t.tiles),s=e.type;if(!(t.type==b.PAIR||t.type==b.ISOLATED||t.type==b.THREE||t.type==b.RUN)&&s!=t.type)throw new Error(`input type is ${t.type} but got is ${s}: ${t.tiles}`);return ie(e.tiles,t.type)}serialize(){return{tiles:this.toString(),type:this.type}}toJSON(){return this.serialize()}get type(){return this._type}get tiles(){return this._tiles}is(t){return this._type==t}isCalled(){return[b.PON.toString(),b.CHI.toString(),b.DAI_KAN.toString(),b.SHO_KAN.toString(),b.AN_KAN.toString()].includes(this._type.toString())}clone(t){const e=t==null?void 0:t.replace,s=[...this.tiles];return e&&(s[e.idx]=e.tile),ie(s,this._type)}}const _t=n=>{let t="";for(const e of n){if(e.t==p.BACK)return n.join("");t+=e.toString().slice(0,-1)}return`${t}${n[0].t}`},Ge=n=>{let t=n[0].t,e="";for(const r of n){const i=r.t,o=i==p.BACK?r.toString():r.toString().slice(0,-1);i!=t&&t!=p.BACK&&(e+=t),t=i,e+=o}const s=n.at(-1);return s.t!=p.BACK&&(e+=s.t),e};class Z extends v{constructor(t){super(t,b.CHI)}static from(t){return v.deserialize({tiles:t,type:b.CHI})}toString(){return _t(this.tiles)}}class V extends v{constructor(t){super(t,b.PON)}static from(t){return v.deserialize({tiles:t,type:b.PON})}toString(){return _t(this.tiles)}}class R extends v{constructor(t){const e=t.filter(r=>r.t!=p.BACK),s=e[0];if(e.length<t.length){if(C(s)){const r=new w(s.t,5);super([r.clone({add:g.RED}),r,r,r],b.AN_KAN);return}super([s,s,s,s],b.AN_KAN);return}super(t,b.AN_KAN)}get tilesWithBack(){const t=this.tiles[0].clone({remove:g.RED}),e=C(t)?t.clone({add:g.RED}):t;return[new w(p.BACK,0),e,t,new w(p.BACK,0)]}static from(t){return v.deserialize({tiles:t,type:b.AN_KAN})}toString(){return Ge(this.tilesWithBack)}}class Y extends v{constructor(t){super(t,b.DAI_KAN)}static from(t){return v.deserialize({tiles:t,type:b.DAI_KAN})}toString(){return _t(this.tiles)}}class D extends v{constructor(t){super(t,b.SHO_KAN)}static from(t){return v.deserialize({tiles:t,type:b.SHO_KAN})}static fromPon(t,e){const s=t.tiles.findIndex(i=>i.has(g.HORIZONTAL)),r=[...t.tiles];return r.splice(s,0,e.clone({add:g.HORIZONTAL})),new D(r)}toString(){return _t(this.tiles)}}class H extends v{constructor(t,e){super([t,e],b.PAIR)}toString(){return _t(this.tiles)}static from(t){return v.deserialize({tiles:t,type:b.PAIR})}}class z extends v{constructor(t){super(t,b.THREE)}static from(t){return v.deserialize({tiles:t,type:b.THREE})}toString(){return _t(this.tiles)}}class Q extends v{constructor(t){super(t,b.RUN)}static from(t){return v.deserialize({tiles:t,type:b.RUN})}toString(){return _t(this.tiles)}}class Ze extends v{constructor(t){super([t],b.ISOLATED)}static from(t){return v.deserialize({tiles:t,type:b.ISOLATED})}toString(){return this.tiles[0].toString()}}class kt extends v{constructor(t){super(t,b.HAND)}static from(t){return v.deserialize({tiles:t,type:b.HAND})}toString(){return Ge(this.tiles)}}class Ve extends v{constructor(t,e){super(t,e)}toString(){return this.is(b.IMAGE_DISCARD)?this.tiles.join(""):Ge(this.tiles)}}const ie=(n,t)=>{switch(t){case b.CHI:return new Z([n[0],n[1],n[2]]);case b.PON:return new V([n[0],n[1],n[2]]);case b.AN_KAN:return new R(n);case b.DAI_KAN:return new Y(n);case b.SHO_KAN:return new D(n);case b.THREE:return new z(n);case b.RUN:return new Q(n);case b.PAIR:return new H(n[0],n[1]);case b.ISOLATED:return new Ze(n[0]);case b.HAND:return new kt(n);default:return new Ve(n,t)}};class W{constructor(t){_(this,"maxInputLength",600);this.input=t,this.input=t.replace(/\s/g,"")}parse(){const t=this.tileSeparators();return this.makeBlocks(t)}tiles(){return this.tileSeparators().filter(t=>t!=q)}tileSeparators(){const t=new Ds(this.input),e=[];let s=[];for(this.validate(this.input);;){t.skipWhitespace();const r=t.char;if(r===t.eof)break;if(r==q){e.push(q),t.readChar();continue}const[i,o]=wn(r,s);if(o){if(i==p.BACK){e.push(new w(i,0)),t.readChar();continue}e.push(...js(s,i)),s=[],t.readChar();continue}else{const[a,c]=Us(t);if(c){s.push(a),t.readChar();continue}const[l,u]=Dn(r);if(!u)throw new Error(`encounter unexpected number. n: ${l}, current: ${r}, input: ${t.input}`);s.push({n:l})}t.readChar()}if(s.length>0)throw new Error(`remaining values ${s.toString()}`);return e}makeBlocks(t){let e=[];const s=[];if(t.length==0)return s;for(const o of t){if(o==q){const a=mn(e),c=ie(e,a);s.push(c),e=[];continue}e.push(o)}const r=mn(e),i=ie(e,r);return s.push(i),e=[],s}validate(t){if(t.length==0)return;if(t.length>this.maxInputLength)throw new Error(`exceeded maximum input length(${t.length})`);const e=t.charAt(t.length-1),[s,r]=wn(e,[new w(p.BACK,1)]);if(!r)throw new Error(`last character(${e}) is not type value`)}}function mn(n){if(n.length===0)return b.UNKNOWN;if(n.length===1)return n[0].has(g.DORA)?b.IMAGE_DORA:n[0].has(g.TSUMO)?b.TSUMO:b.HAND;const t=n.every(i=>i.equals(n[0])),e=n.filter(i=>i.has(g.HORIZONTAL)).length,s=n.filter(i=>i.has(g.TSUMO)||i.has(g.DORA)).length,r=n.filter(i=>i.t==p.BACK).length;if(s>0)return b.UNKNOWN;if(e==0&&r==0)return b.HAND;if(n.length===3&&r===0)return t?b.PON:e==1&&zs(n)?b.CHI:b.IMAGE_DISCARD;if(n.length==4&&r==2)return b.AN_KAN;if(n.length==4&&t){if(e==1)return b.DAI_KAN;if(e==2)return b.SHO_KAN}return e==1||s==0?b.IMAGE_DISCARD:b.UNKNOWN}function zs(n){const t=[...n].sort(Jt);if(t.some(s=>t[0].t!=s.t))return!1;const e=t.map(s=>s.n);for(let s=0;s<e.length-1;s++)if(e[s]!=e[s+1]-1)return!1;return!0}function js(n,t){return n.map(e=>{const s=new w(t,e.n,e.ops);return s.isNum()&&s.n==0?s.clone({n:5,add:g.RED}):s})}function wn(n,t){const[e,s]=Ls(n);if(s)return[e,!0];if((n==="w"||n==="d")&&t.length>0){for(let i=0;i<t.length;i++){const o=t[i];n==="d"&&(t[i].n=o.n+4)}return[p.Z,!0]}return[p.BACK,!1]}function Dn(n){const t=Number(n),e=0<=t&&t<=9;return[t,e]}function Us(n){const t=Object.values(g);if(!t.includes(n.char))return[new w(p.BACK,0),!1];const e=[];for(let s=0;s<4;s++){const r=n.peekCharN(s);if(t.includes(r))e.push(r);else{const[i,o]=Dn(r);if(!o)break;for(const c of e)n.readChar();const a=new w(p.BACK,i,e);if(a.has(g.RED)&&a.n!=5)throw new Error(`found ${g.RED} but number is not 5: ${i}`);if(a.has(g.DORA)&&a.has(g.TSUMO))throw new Error(`unable to specify both ${g.DORA} and ${g.TSUMO}`);return[a,!0]}}return[new w(p.BACK,0),!1]}function $(n,t=!1){const e={[E.E]:n,[E.S]:n,[E.W]:n,[E.N]:n};if(t)for(let s of Object.values(E))e[s]=structuredClone(n);return e}const Ft=n=>{let t=n.substring(0,2),e=Number(n.substring(2,3));return e==4?(e=1,t=gt(t)):e++,`${t}${e}`},Fs=n=>Ft(Ft(Ft(n))),gt=n=>{let t=Number(n.toString()[0]);return t=t%4+1,`${t}w`},fe=n=>{let t=Number(n.toString()[0]);const e=[1,4,3,2],s=e.indexOf(t);return`${e[(s+1)%e.length]}w`},Ie=(n,t,e)=>{const s=Math.abs(Number(n[0])-Number(t[0]));return N(s==1||s==2||s==3),e==b.PON?s==3?0:s==2?1:2:s==3?0:s==1?3:2};function bn(n){return typeof n>"u"}function Oe(n,t=0){return{a:1,c:0,e:n,b:0,d:1,f:t}}function Je(...n){n=Array.isArray(n[0])?n[0]:n;const t=(e,s)=>({a:e.a*s.a+e.c*s.b,c:e.a*s.c+e.c*s.d,e:e.a*s.e+e.c*s.f+e.e,b:e.b*s.a+e.d*s.b,d:e.b*s.c+e.d*s.d,f:e.b*s.e+e.d*s.f+e.f});switch(n.length){case 0:throw new Error("no matrices provided");case 1:return n[0];case 2:return t(n[0],n[1]);default:{const[e,s,...r]=n,i=t(e,s);return Je(i,...r)}}}function Gs(...n){return Je(...n)}const{cos:Zs,sin:Vs,PI:Js}=Math;function Xs(n,t,e){const s=Zs(n),r=Vs(n),i={a:s,c:-r,e:0,b:r,d:s,f:0};return bn(t)||bn(e)?i:Je([Oe(t,e),i,Oe(-t,-e)])}function Ys(n,t=void 0,e=void 0){return Xs(n*Js/180,t,e)}function qs(n){return Qs(n)}function Qs(n){return`matrix(${n.a},${n.b},${n.c},${n.d},${n.e},${n.f})`}function tr(n,t){function e(){this.constructor=n}e.prototype=t.prototype,n.prototype=new e}function pe(n,t,e,s){var r=Error.call(this,n);return Object.setPrototypeOf&&Object.setPrototypeOf(r,pe.prototype),r.expected=t,r.found=e,r.location=s,r.name="SyntaxError",r}tr(pe,Error);function we(n,t,e){return e=e||" ",n.length>t?n:(t-=n.length,e+=e.repeat(t),n+e.slice(0,t))}pe.prototype.format=function(n){var t="Error: "+this.message;if(this.location){var e=null,s;for(s=0;s<n.length;s++)if(n[s].source===this.location.source){e=n[s].text.split(/\r\n|\n|\r/g);break}var r=this.location.start,i=this.location.source&&typeof this.location.source.offset=="function"?this.location.source.offset(r):r,o=this.location.source+":"+i.line+":"+i.column;if(e){var a=this.location.end,c=we("",i.line.toString().length," "),l=e[r.line-1],u=r.line===a.line?a.column:l.length+1,h=u-r.column||1;t+=`
|
|
2
2
|
--> `+o+`
|
|
3
3
|
`+c+` |
|
|
4
4
|
`+i.line+" | "+l+`
|
|
@@ -6,14 +6,14 @@
|
|
|
6
6
|
at `+o}return t};pe.buildMessage=function(n,t){var e={literal:function(l){return'"'+r(l.text)+'"'},class:function(l){var u=l.parts.map(function(h){return Array.isArray(h)?i(h[0])+"-"+i(h[1]):i(h)});return"["+(l.inverted?"^":"")+u.join("")+"]"},any:function(){return"any character"},end:function(){return"end of input"},other:function(l){return l.description}};function s(l){return l.charCodeAt(0).toString(16).toUpperCase()}function r(l){return l.replace(/\\/g,"\\\\").replace(/"/g,'\\"').replace(/\0/g,"\\0").replace(/\t/g,"\\t").replace(/\n/g,"\\n").replace(/\r/g,"\\r").replace(/[\x00-\x0F]/g,function(u){return"\\x0"+s(u)}).replace(/[\x10-\x1F\x7F-\x9F]/g,function(u){return"\\x"+s(u)})}function i(l){return l.replace(/\\/g,"\\\\").replace(/\]/g,"\\]").replace(/\^/g,"\\^").replace(/-/g,"\\-").replace(/\0/g,"\\0").replace(/\t/g,"\\t").replace(/\n/g,"\\n").replace(/\r/g,"\\r").replace(/[\x00-\x0F]/g,function(u){return"\\x0"+s(u)}).replace(/[\x10-\x1F\x7F-\x9F]/g,function(u){return"\\x"+s(u)})}function o(l){return e[l.type](l)}function a(l){var u=l.map(o),h,d;if(u.sort(),u.length>0){for(h=1,d=1;h<u.length;h++)u[h-1]!==u[h]&&(u[d]=u[h],d++);u.length=d}switch(u.length){case 1:return u[0];case 2:return u[0]+" or "+u[1];default:return u.slice(0,-1).join(", ")+", or "+u[u.length-1]}}function c(l){return l?'"'+r(l)+'"':"end of input"}return"Expected "+a(n)+" but "+c(t)+" found."};const Kn=":A-Za-z_\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD",er=Kn+"\\-.\\d\\u00B7\\u0300-\\u036F\\u203F-\\u2040",nr="["+Kn+"]["+er+"]*",sr=new RegExp("^"+nr+"$");function Ln(n,t){const e=[];let s=t.exec(n);for(;s;){const r=[];r.startIndex=t.lastIndex-s[0].length;const i=s.length;for(let o=0;o<i;o++)r.push(s[o]);e.push(r),s=t.exec(n)}return e}const Xe=function(n){const t=sr.exec(n);return!(t===null||typeof t>"u")};function rr(n){return typeof n<"u"}const ir={allowBooleanAttributes:!1,unpairedTags:[]};function or(n,t){t=Object.assign({},ir,t);const e=[];let s=!1,r=!1;n[0]==="\uFEFF"&&(n=n.substr(1));for(let i=0;i<n.length;i++)if(n[i]==="<"&&n[i+1]==="?"){if(i+=2,i=En(n,i),i.err)return i}else if(n[i]==="<"){let o=i;if(i++,n[i]==="!"){i=An(n,i);continue}else{let a=!1;n[i]==="/"&&(a=!0,i++);let c="";for(;i<n.length&&n[i]!==">"&&n[i]!==" "&&n[i]!==" "&&n[i]!==`
|
|
7
7
|
`&&n[i]!=="\r";i++)c+=n[i];if(c=c.trim(),c[c.length-1]==="/"&&(c=c.substring(0,c.length-1),i--),!pr(c)){let h;return c.trim().length===0?h="Invalid space after '<'.":h="Tag '"+c+"' is an invalid name.",I("InvalidTag",h,x(n,i))}const l=lr(n,i);if(l===!1)return I("InvalidAttr","Attributes for '"+c+"' have open quote.",x(n,i));let u=l.value;if(i=l.index,u[u.length-1]==="/"){const h=i-u.length;u=u.substring(0,u.length-1);const d=Sn(u,t);if(d===!0)s=!0;else return I(d.err.code,d.err.msg,x(n,h+d.err.line))}else if(a)if(l.tagClosed){if(u.trim().length>0)return I("InvalidTag","Closing tag '"+c+"' can't have attributes or invalid starting.",x(n,o));if(e.length===0)return I("InvalidTag","Closing tag '"+c+"' has not been opened.",x(n,o));{const h=e.pop();if(c!==h.tagName){let d=x(n,h.tagStartPos);return I("InvalidTag","Expected closing tag '"+h.tagName+"' (opened in line "+d.line+", col "+d.col+") instead of closing tag '"+c+"'.",x(n,o))}e.length==0&&(r=!0)}}else return I("InvalidTag","Closing tag '"+c+"' doesn't have proper closing.",x(n,i));else{const h=Sn(u,t);if(h!==!0)return I(h.err.code,h.err.msg,x(n,i-u.length+h.err.line));if(r===!0)return I("InvalidXml","Multiple possible root nodes found.",x(n,i));t.unpairedTags.indexOf(c)!==-1||e.push({tagName:c,tagStartPos:o}),s=!0}for(i++;i<n.length;i++)if(n[i]==="<")if(n[i+1]==="!"){i++,i=An(n,i);continue}else if(n[i+1]==="?"){if(i=En(n,++i),i.err)return i}else break;else if(n[i]==="&"){const h=dr(n,i);if(h==-1)return I("InvalidChar","char '&' is not expected.",x(n,i));i=h}else if(r===!0&&!_n(n[i]))return I("InvalidXml","Extra text at the end",x(n,i));n[i]==="<"&&i--}}else{if(_n(n[i]))continue;return I("InvalidChar","char '"+n[i]+"' is not expected.",x(n,i))}if(s){if(e.length==1)return I("InvalidTag","Unclosed tag '"+e[0].tagName+"'.",x(n,e[0].tagStartPos));if(e.length>0)return I("InvalidXml","Invalid '"+JSON.stringify(e.map(i=>i.tagName),null,4).replace(/\r?\n/g,"")+"' found.",{line:1,col:1})}else return I("InvalidXml","Start tag expected.",1);return!0}function _n(n){return n===" "||n===" "||n===`
|
|
8
8
|
`||n==="\r"}function En(n,t){const e=t;for(;t<n.length;t++)if(n[t]=="?"||n[t]==" "){const s=n.substr(e,t-e);if(t>5&&s==="xml")return I("InvalidXml","XML declaration allowed only at the start of the document.",x(n,t));if(n[t]=="?"&&n[t+1]==">"){t++;break}else continue}return t}function An(n,t){if(n.length>t+5&&n[t+1]==="-"&&n[t+2]==="-"){for(t+=3;t<n.length;t++)if(n[t]==="-"&&n[t+1]==="-"&&n[t+2]===">"){t+=2;break}}else if(n.length>t+8&&n[t+1]==="D"&&n[t+2]==="O"&&n[t+3]==="C"&&n[t+4]==="T"&&n[t+5]==="Y"&&n[t+6]==="P"&&n[t+7]==="E"){let e=1;for(t+=8;t<n.length;t++)if(n[t]==="<")e++;else if(n[t]===">"&&(e--,e===0))break}else if(n.length>t+9&&n[t+1]==="["&&n[t+2]==="C"&&n[t+3]==="D"&&n[t+4]==="A"&&n[t+5]==="T"&&n[t+6]==="A"&&n[t+7]==="["){for(t+=8;t<n.length;t++)if(n[t]==="]"&&n[t+1]==="]"&&n[t+2]===">"){t+=2;break}}return t}const ar='"',cr="'";function lr(n,t){let e="",s="",r=!1;for(;t<n.length;t++){if(n[t]===ar||n[t]===cr)s===""?s=n[t]:s!==n[t]||(s="");else if(n[t]===">"&&s===""){r=!0;break}e+=n[t]}return s!==""?!1:{value:e,index:t,tagClosed:r}}const ur=new RegExp(`(\\s*)([^\\s=]+)(\\s*=)?(\\s*(['"])(([\\s\\S])*?)\\5)?`,"g");function Sn(n,t){const e=Ln(n,ur),s={};for(let r=0;r<e.length;r++){if(e[r][1].length===0)return I("InvalidAttr","Attribute '"+e[r][2]+"' has no space in starting.",Kt(e[r]));if(e[r][3]!==void 0&&e[r][4]===void 0)return I("InvalidAttr","Attribute '"+e[r][2]+"' is without value.",Kt(e[r]));if(e[r][3]===void 0&&!t.allowBooleanAttributes)return I("InvalidAttr","boolean attribute '"+e[r][2]+"' is not allowed.",Kt(e[r]));const i=e[r][2];if(!fr(i))return I("InvalidAttr","Attribute '"+i+"' is an invalid name.",Kt(e[r]));if(!s.hasOwnProperty(i))s[i]=1;else return I("InvalidAttr","Attribute '"+i+"' is repeated.",Kt(e[r]))}return!0}function hr(n,t){let e=/\d/;for(n[t]==="x"&&(t++,e=/[\da-fA-F]/);t<n.length;t++){if(n[t]===";")return t;if(!n[t].match(e))break}return-1}function dr(n,t){if(t++,n[t]===";")return-1;if(n[t]==="#")return t++,hr(n,t);let e=0;for(;t<n.length;t++,e++)if(!(n[t].match(/\w/)&&e<20)){if(n[t]===";")break;return-1}return t}function I(n,t,e){return{err:{code:n,msg:t,line:e.line||e,col:e.col}}}function fr(n){return Xe(n)}function pr(n){return Xe(n)}function x(n,t){const e=n.substring(0,t).split(/\r?\n/);return{line:e.length,col:e[e.length-1].length+1}}function Kt(n){return n.startIndex+n[1].length}const gr={preserveOrder:!1,attributeNamePrefix:"@_",attributesGroupName:!1,textNodeName:"#text",ignoreAttributes:!0,removeNSPrefix:!1,allowBooleanAttributes:!1,parseTagValue:!0,parseAttributeValue:!1,trimValues:!0,cdataPropName:!1,numberParseOptions:{hex:!0,leadingZeros:!0,eNotation:!0},tagValueProcessor:function(n,t){return t},attributeValueProcessor:function(n,t){return t},stopNodes:[],alwaysCreateTextNode:!1,isArray:()=>!1,commentPropName:!1,unpairedTags:[],processEntities:!0,htmlEntities:!1,ignoreDeclaration:!1,ignorePiTags:!1,transformTagName:!1,transformAttributeName:!1,updateTag:function(n,t,e){return n},captureMetaData:!1},yr=function(n){return Object.assign({},gr,n)};let oe;typeof Symbol!="function"?oe="@@xmlMetadata":oe=Symbol("XML Node Metadata");class ht{constructor(t){this.tagname=t,this.child=[],this[":@"]={}}add(t,e){t==="__proto__"&&(t="#__proto__"),this.child.push({[t]:e})}addChild(t,e){t.tagname==="__proto__"&&(t.tagname="#__proto__"),t[":@"]&&Object.keys(t[":@"]).length>0?this.child.push({[t.tagname]:t.child,":@":t[":@"]}):this.child.push({[t.tagname]:t.child}),e!==void 0&&(this.child[this.child.length-1][oe]={startIndex:e})}static getMetaDataSymbol(){return oe}}function mr(n,t){const e={};if(n[t+3]==="O"&&n[t+4]==="C"&&n[t+5]==="T"&&n[t+6]==="Y"&&n[t+7]==="P"&&n[t+8]==="E"){t=t+9;let s=1,r=!1,i=!1,o="";for(;t<n.length;t++)if(n[t]==="<"&&!i){if(r&&Ar(n,t)){t+=7;let a,c;[a,c,t]=wr(n,t+1),c.indexOf("&")===-1&&(e[a]={regx:RegExp(`&${a};`,"g"),val:c})}else if(r&&Sr(n,t)){t+=8;const{index:a}=_r(n,t+1);t=a}else if(r&&Nr(n,t))t+=8;else if(r&&Tr(n,t)){t+=9;const{index:a}=br(n,t+1);t=a}else if(Er)i=!0;else throw new Error("Invalid DOCTYPE");s++,o=""}else if(n[t]===">"){if(i?n[t-1]==="-"&&n[t-2]==="-"&&(i=!1,s--):s--,s===0)break}else n[t]==="["?r=!0:o+=n[t];if(s!==0)throw new Error("Unclosed DOCTYPE")}else throw new Error("Invalid Tag instead of DOCTYPE");return{entities:e,i:t}}const tt=(n,t)=>{for(;t<n.length&&/\s/.test(n[t]);)t++;return t};function wr(n,t){t=tt(n,t);let e="";for(;t<n.length&&!/\s/.test(n[t])&&n[t]!=='"'&&n[t]!=="'";)e+=n[t],t++;if(Ye(e),t=tt(n,t),n.substring(t,t+6).toUpperCase()==="SYSTEM")throw new Error("External entities are not supported");if(n[t]==="%")throw new Error("Parameter entities are not supported");let s="";return[t,s]=se(n,t,"entity"),t--,[e,s,t]}function br(n,t){t=tt(n,t);let e="";for(;t<n.length&&!/\s/.test(n[t]);)e+=n[t],t++;Ye(e),t=tt(n,t);const s=n.substring(t,t+6).toUpperCase();if(s!=="SYSTEM"&&s!=="PUBLIC")throw new Error(`Expected SYSTEM or PUBLIC, found "${s}"`);t+=s.length,t=tt(n,t);let r=null,i=null;if(s==="PUBLIC")[t,r]=se(n,t,"publicIdentifier"),t=tt(n,t),(n[t]==='"'||n[t]==="'")&&([t,i]=se(n,t,"systemIdentifier"));else if(s==="SYSTEM"&&([t,i]=se(n,t,"systemIdentifier"),!i))throw new Error("Missing mandatory system identifier for SYSTEM notation");return{notationName:e,publicIdentifier:r,systemIdentifier:i,index:--t}}function se(n,t,e){let s="";const r=n[t];if(r!=='"'&&r!=="'")throw new Error(`Expected quoted string, found "${r}"`);for(t++;t<n.length&&n[t]!==r;)s+=n[t],t++;if(n[t]!==r)throw new Error(`Unterminated ${e} value`);return t++,[t,s]}function _r(n,t){t=tt(n,t);let e="";for(;t<n.length&&!/\s/.test(n[t]);)e+=n[t],t++;if(!Ye(e))throw new Error(`Invalid element name: "${e}"`);if(t=tt(n,t),n[t]!=="(")throw new Error(`Expected '(', found "${n[t]}"`);t++;let s="";for(;t<n.length&&n[t]!==")";)s+=n[t],t++;if(n[t]!==")")throw new Error("Unterminated content model");return{elementName:e,contentModel:s.trim(),index:t}}function Er(n,t){return n[t+1]==="!"&&n[t+2]==="-"&&n[t+3]==="-"}function Ar(n,t){return n[t+1]==="!"&&n[t+2]==="E"&&n[t+3]==="N"&&n[t+4]==="T"&&n[t+5]==="I"&&n[t+6]==="T"&&n[t+7]==="Y"}function Sr(n,t){return n[t+1]==="!"&&n[t+2]==="E"&&n[t+3]==="L"&&n[t+4]==="E"&&n[t+5]==="M"&&n[t+6]==="E"&&n[t+7]==="N"&&n[t+8]==="T"}function Nr(n,t){return n[t+1]==="!"&&n[t+2]==="A"&&n[t+3]==="T"&&n[t+4]==="T"&&n[t+5]==="L"&&n[t+6]==="I"&&n[t+7]==="S"&&n[t+8]==="T"}function Tr(n,t){return n[t+1]==="!"&&n[t+2]==="N"&&n[t+3]==="O"&&n[t+4]==="T"&&n[t+5]==="A"&&n[t+6]==="T"&&n[t+7]==="I"&&n[t+8]==="O"&&n[t+9]==="N"}function Ye(n){if(Xe(n))return n;throw new Error(`Invalid entity name ${n}`)}const vr=/^[-+]?0x[a-fA-F0-9]+$/,Ir=/^([\-\+])?(0*)([0-9]*(\.[0-9]*)?)$/,Or={hex:!0,leadingZeros:!0,decimalPoint:".",eNotation:!0};function kr(n,t={}){if(t=Object.assign({},Or,t),!n||typeof n!="string")return n;let e=n.trim();if(t.skipLike!==void 0&&t.skipLike.test(e))return n;if(n==="0")return 0;if(t.hex&&vr.test(e))return Rr(e,16);if(e.search(/[eE]/)!==-1){const s=e.match(/^([-\+])?(0*)([0-9]*(\.[0-9]*)?[eE][-\+]?[0-9]+)$/);if(s){if(t.leadingZeros)e=(s[1]||"")+s[3];else if(!(s[2]==="0"&&s[3][0]==="."))return n;return t.eNotation?Number(e):n}else return n}else{const s=Ir.exec(e);if(s){const r=s[1],i=s[2];let o=Cr(s[3]);if(!t.leadingZeros&&i.length>0&&r&&e[2]!==".")return n;if(!t.leadingZeros&&i.length>0&&!r&&e[1]!==".")return n;if(t.leadingZeros&&i===n)return 0;{const a=Number(e),c=""+a;return c.search(/[eE]/)!==-1?t.eNotation?a:n:e.indexOf(".")!==-1?c==="0"&&o===""||c===o||r&&c==="-"+o?a:n:i?o===c||r+o===c?a:n:e===c||e===r+c?a:n}}else return n}}function Cr(n){return n&&n.indexOf(".")!==-1&&(n=n.replace(/0+$/,""),n==="."?n="0":n[0]==="."?n="0"+n:n[n.length-1]==="."&&(n=n.substr(0,n.length-1))),n}function Rr(n,t){if(parseInt)return parseInt(n,t);if(Number.parseInt)return Number.parseInt(n,t);if(window&&window.parseInt)return window.parseInt(n,t);throw new Error("parseInt, Number.parseInt, window.parseInt are not supported")}function zn(n){return typeof n=="function"?n:Array.isArray(n)?t=>{for(const e of n)if(typeof e=="string"&&t===e||e instanceof RegExp&&e.test(t))return!0}:()=>!1}class Mr{constructor(t){this.options=t,this.currentNode=null,this.tagsNodeStack=[],this.docTypeEntities={},this.lastEntities={apos:{regex:/&(apos|#39|#x27);/g,val:"'"},gt:{regex:/&(gt|#62|#x3E);/g,val:">"},lt:{regex:/&(lt|#60|#x3C);/g,val:"<"},quot:{regex:/&(quot|#34|#x22);/g,val:'"'}},this.ampEntity={regex:/&(amp|#38|#x26);/g,val:"&"},this.htmlEntities={space:{regex:/&(nbsp|#160);/g,val:" "},cent:{regex:/&(cent|#162);/g,val:"¢"},pound:{regex:/&(pound|#163);/g,val:"£"},yen:{regex:/&(yen|#165);/g,val:"¥"},euro:{regex:/&(euro|#8364);/g,val:"€"},copyright:{regex:/&(copy|#169);/g,val:"©"},reg:{regex:/&(reg|#174);/g,val:"®"},inr:{regex:/&(inr|#8377);/g,val:"₹"},num_dec:{regex:/&#([0-9]{1,7});/g,val:(e,s)=>String.fromCodePoint(Number.parseInt(s,10))},num_hex:{regex:/&#x([0-9a-fA-F]{1,6});/g,val:(e,s)=>String.fromCodePoint(Number.parseInt(s,16))}},this.addExternalEntities=xr,this.parseXml=Br,this.parseTextData=$r,this.resolveNameSpace=Pr,this.buildAttributesMap=Wr,this.isItStopNode=zr,this.replaceEntitiesValue=Kr,this.readStopNodeData=Ur,this.saveTextToParentTag=Lr,this.addChild=Dr,this.ignoreAttributesFn=zn(this.options.ignoreAttributes)}}function xr(n){const t=Object.keys(n);for(let e=0;e<t.length;e++){const s=t[e];this.lastEntities[s]={regex:new RegExp("&"+s+";","g"),val:n[s]}}}function $r(n,t,e,s,r,i,o){if(n!==void 0&&(this.options.trimValues&&!s&&(n=n.trim()),n.length>0)){o||(n=this.replaceEntitiesValue(n));const a=this.options.tagValueProcessor(t,n,e,r,i);return a==null?n:typeof a!=typeof n||a!==n?a:this.options.trimValues?Ce(n,this.options.parseTagValue,this.options.numberParseOptions):n.trim()===n?Ce(n,this.options.parseTagValue,this.options.numberParseOptions):n}}function Pr(n){if(this.options.removeNSPrefix){const t=n.split(":"),e=n.charAt(0)==="/"?"/":"";if(t[0]==="xmlns")return"";t.length===2&&(n=e+t[1])}return n}const Hr=new RegExp(`([^\\s=]+)\\s*(=\\s*(['"])([\\s\\S]*?)\\3)?`,"gm");function Wr(n,t,e){if(this.options.ignoreAttributes!==!0&&typeof n=="string"){const s=Ln(n,Hr),r=s.length,i={};for(let o=0;o<r;o++){const a=this.resolveNameSpace(s[o][1]);if(this.ignoreAttributesFn(a,t))continue;let c=s[o][4],l=this.options.attributeNamePrefix+a;if(a.length)if(this.options.transformAttributeName&&(l=this.options.transformAttributeName(l)),l==="__proto__"&&(l="#__proto__"),c!==void 0){this.options.trimValues&&(c=c.trim()),c=this.replaceEntitiesValue(c);const u=this.options.attributeValueProcessor(a,c,t);u==null?i[l]=c:typeof u!=typeof c||u!==c?i[l]=u:i[l]=Ce(c,this.options.parseAttributeValue,this.options.numberParseOptions)}else this.options.allowBooleanAttributes&&(i[l]=!0)}if(!Object.keys(i).length)return;if(this.options.attributesGroupName){const o={};return o[this.options.attributesGroupName]=i,o}return i}}const Br=function(n){n=n.replace(/\r\n?/g,`
|
|
9
|
-
`);const t=new ht("!xml");let e=t,s="",r="";for(let i=0;i<n.length;i++)if(n[i]==="<")if(n[i+1]==="/"){const a=ft(n,">",i,"Closing Tag is not closed.");let c=n.substring(i+2,a).trim();if(this.options.removeNSPrefix){const h=c.indexOf(":");h!==-1&&(c=c.substr(h+1))}this.options.transformTagName&&(c=this.options.transformTagName(c)),e&&(s=this.saveTextToParentTag(s,e,r));const l=r.substring(r.lastIndexOf(".")+1);if(c&&this.options.unpairedTags.indexOf(c)!==-1)throw new Error(`Unpaired tag can not be used as closing tag: </${c}>`);let u=0;l&&this.options.unpairedTags.indexOf(l)!==-1?(u=r.lastIndexOf(".",r.lastIndexOf(".")-1),this.tagsNodeStack.pop()):u=r.lastIndexOf("."),r=r.substring(0,u),e=this.tagsNodeStack.pop(),s="",i=a}else if(n[i+1]==="?"){let a=ke(n,i,!1,"?>");if(!a)throw new Error("Pi Tag is not closed.");if(s=this.saveTextToParentTag(s,e,r),!(this.options.ignoreDeclaration&&a.tagName==="?xml"||this.options.ignorePiTags)){const c=new ht(a.tagName);c.add(this.options.textNodeName,""),a.tagName!==a.tagExp&&a.attrExpPresent&&(c[":@"]=this.buildAttributesMap(a.tagExp,r,a.tagName)),this.addChild(e,c,r,i)}i=a.closeIndex+1}else if(n.substr(i+1,3)==="!--"){const a=ft(n,"-->",i+4,"Comment is not closed.");if(this.options.commentPropName){const c=n.substring(i+4,a-2);s=this.saveTextToParentTag(s,e,r),e.add(this.options.commentPropName,[{[this.options.textNodeName]:c}])}i=a}else if(n.substr(i+1,2)==="!D"){const a=mr(n,i);this.docTypeEntities=a.entities,i=a.i}else if(n.substr(i+1,2)==="!["){const a=ft(n,"]]>",i,"CDATA is not closed.")-2,c=n.substring(i+9,a);s=this.saveTextToParentTag(s,e,r);let l=this.parseTextData(c,e.tagname,r,!0,!1,!0,!0);l==null&&(l=""),this.options.cdataPropName?e.add(this.options.cdataPropName,[{[this.options.textNodeName]:c}]):e.add(this.options.textNodeName,l),i=a+2}else{let a=ke(n,i,this.options.removeNSPrefix),c=a.tagName;const l=a.rawTagName;let u=a.tagExp,h=a.attrExpPresent,d=a.closeIndex;this.options.transformTagName&&(c=this.options.transformTagName(c)),e&&s&&e.tagname!=="!xml"&&(s=this.saveTextToParentTag(s,e,r,!1));const
|
|
10
|
-
`;function Yr(n,t){let e="";return t.format&&t.indentBy.length>0&&(e=Xr),Un(n,t,"",e)}function Un(n,t,e,s){let r="",i=!1;for(let o=0;o<n.length;o++){const a=n[o],c=qr(a);if(c===void 0)continue;let l="";if(e.length===0?l=c:l=`${e}.${c}`,c===t.textNodeName){let f=a[c];Qr(l,t)||(f=t.tagValueProcessor(c,f),f=Fn(f,t)),i&&(r+=s),r+=f,i=!1;continue}else if(c===t.cdataPropName){i&&(r+=s),r+=`<![CDATA[${a[c][0][t.textNodeName]}]]>`,i=!1;continue}else if(c===t.commentPropName){r+=s+`<!--${a[c][0][t.textNodeName]}-->`,i=!0;continue}else if(c[0]==="?"){const f=Nn(a[":@"],t),m=c==="?xml"?"":s;let A=a[c][0][t.textNodeName];A=A.length!==0?" "+A:"",r+=m+`<${c}${A}${f}?>`,i=!0;continue}let u=s;u!==""&&(u+=t.indentBy);const h=Nn(a[":@"],t),d=s+`<${c}${h}`,
|
|
9
|
+
`);const t=new ht("!xml");let e=t,s="",r="";for(let i=0;i<n.length;i++)if(n[i]==="<")if(n[i+1]==="/"){const a=ft(n,">",i,"Closing Tag is not closed.");let c=n.substring(i+2,a).trim();if(this.options.removeNSPrefix){const h=c.indexOf(":");h!==-1&&(c=c.substr(h+1))}this.options.transformTagName&&(c=this.options.transformTagName(c)),e&&(s=this.saveTextToParentTag(s,e,r));const l=r.substring(r.lastIndexOf(".")+1);if(c&&this.options.unpairedTags.indexOf(c)!==-1)throw new Error(`Unpaired tag can not be used as closing tag: </${c}>`);let u=0;l&&this.options.unpairedTags.indexOf(l)!==-1?(u=r.lastIndexOf(".",r.lastIndexOf(".")-1),this.tagsNodeStack.pop()):u=r.lastIndexOf("."),r=r.substring(0,u),e=this.tagsNodeStack.pop(),s="",i=a}else if(n[i+1]==="?"){let a=ke(n,i,!1,"?>");if(!a)throw new Error("Pi Tag is not closed.");if(s=this.saveTextToParentTag(s,e,r),!(this.options.ignoreDeclaration&&a.tagName==="?xml"||this.options.ignorePiTags)){const c=new ht(a.tagName);c.add(this.options.textNodeName,""),a.tagName!==a.tagExp&&a.attrExpPresent&&(c[":@"]=this.buildAttributesMap(a.tagExp,r,a.tagName)),this.addChild(e,c,r,i)}i=a.closeIndex+1}else if(n.substr(i+1,3)==="!--"){const a=ft(n,"-->",i+4,"Comment is not closed.");if(this.options.commentPropName){const c=n.substring(i+4,a-2);s=this.saveTextToParentTag(s,e,r),e.add(this.options.commentPropName,[{[this.options.textNodeName]:c}])}i=a}else if(n.substr(i+1,2)==="!D"){const a=mr(n,i);this.docTypeEntities=a.entities,i=a.i}else if(n.substr(i+1,2)==="!["){const a=ft(n,"]]>",i,"CDATA is not closed.")-2,c=n.substring(i+9,a);s=this.saveTextToParentTag(s,e,r);let l=this.parseTextData(c,e.tagname,r,!0,!1,!0,!0);l==null&&(l=""),this.options.cdataPropName?e.add(this.options.cdataPropName,[{[this.options.textNodeName]:c}]):e.add(this.options.textNodeName,l),i=a+2}else{let a=ke(n,i,this.options.removeNSPrefix),c=a.tagName;const l=a.rawTagName;let u=a.tagExp,h=a.attrExpPresent,d=a.closeIndex;this.options.transformTagName&&(c=this.options.transformTagName(c)),e&&s&&e.tagname!=="!xml"&&(s=this.saveTextToParentTag(s,e,r,!1));const y=e;y&&this.options.unpairedTags.indexOf(y.tagname)!==-1&&(e=this.tagsNodeStack.pop(),r=r.substring(0,r.lastIndexOf("."))),c!==t.tagname&&(r+=r?"."+c:c);const f=i;if(this.isItStopNode(this.options.stopNodes,r,c)){let m="";if(u.length>0&&u.lastIndexOf("/")===u.length-1)c[c.length-1]==="/"?(c=c.substr(0,c.length-1),r=r.substr(0,r.length-1),u=c):u=u.substr(0,u.length-1),i=a.closeIndex;else if(this.options.unpairedTags.indexOf(c)!==-1)i=a.closeIndex;else{const S=this.readStopNodeData(n,l,d+1);if(!S)throw new Error(`Unexpected end of ${l}`);i=S.i,m=S.tagContent}const A=new ht(c);c!==u&&h&&(A[":@"]=this.buildAttributesMap(u,r,c)),m&&(m=this.parseTextData(m,c,r,!0,h,!0,!0)),r=r.substr(0,r.lastIndexOf(".")),A.add(this.options.textNodeName,m),this.addChild(e,A,r,f)}else{if(u.length>0&&u.lastIndexOf("/")===u.length-1){c[c.length-1]==="/"?(c=c.substr(0,c.length-1),r=r.substr(0,r.length-1),u=c):u=u.substr(0,u.length-1),this.options.transformTagName&&(c=this.options.transformTagName(c));const m=new ht(c);c!==u&&h&&(m[":@"]=this.buildAttributesMap(u,r,c)),this.addChild(e,m,r,f),r=r.substr(0,r.lastIndexOf("."))}else{const m=new ht(c);this.tagsNodeStack.push(e),c!==u&&h&&(m[":@"]=this.buildAttributesMap(u,r,c)),this.addChild(e,m,r,f),e=m}s="",i=d}}else s+=n[i];return t.child};function Dr(n,t,e,s){this.options.captureMetaData||(s=void 0);const r=this.options.updateTag(t.tagname,e,t[":@"]);r===!1||(typeof r=="string"&&(t.tagname=r),n.addChild(t,s))}const Kr=function(n){if(this.options.processEntities){for(let t in this.docTypeEntities){const e=this.docTypeEntities[t];n=n.replace(e.regx,e.val)}for(let t in this.lastEntities){const e=this.lastEntities[t];n=n.replace(e.regex,e.val)}if(this.options.htmlEntities)for(let t in this.htmlEntities){const e=this.htmlEntities[t];n=n.replace(e.regex,e.val)}n=n.replace(this.ampEntity.regex,this.ampEntity.val)}return n};function Lr(n,t,e,s){return n&&(s===void 0&&(s=t.child.length===0),n=this.parseTextData(n,t.tagname,e,!1,t[":@"]?Object.keys(t[":@"]).length!==0:!1,s),n!==void 0&&n!==""&&t.add(this.options.textNodeName,n),n=""),n}function zr(n,t,e){const s="*."+e;for(const r in n){const i=n[r];if(s===i||t===i)return!0}return!1}function jr(n,t,e=">"){let s,r="";for(let i=t;i<n.length;i++){let o=n[i];if(s)o===s&&(s="");else if(o==='"'||o==="'")s=o;else if(o===e[0])if(e[1]){if(n[i+1]===e[1])return{data:r,index:i}}else return{data:r,index:i};else o===" "&&(o=" ");r+=o}}function ft(n,t,e,s){const r=n.indexOf(t,e);if(r===-1)throw new Error(s);return r+t.length-1}function ke(n,t,e,s=">"){const r=jr(n,t+1,s);if(!r)return;let i=r.data;const o=r.index,a=i.search(/\s/);let c=i,l=!0;a!==-1&&(c=i.substring(0,a),i=i.substring(a+1).trimStart());const u=c;if(e){const h=c.indexOf(":");h!==-1&&(c=c.substr(h+1),l=c!==r.data.substr(h+1))}return{tagName:c,tagExp:i,closeIndex:o,attrExpPresent:l,rawTagName:u}}function Ur(n,t,e){const s=e;let r=1;for(;e<n.length;e++)if(n[e]==="<")if(n[e+1]==="/"){const i=ft(n,">",e,`${t} is not closed`);if(n.substring(e+2,i).trim()===t&&(r--,r===0))return{tagContent:n.substring(s,e),i};e=i}else if(n[e+1]==="?")e=ft(n,"?>",e+1,"StopNode is not closed.");else if(n.substr(e+1,3)==="!--")e=ft(n,"-->",e+3,"StopNode is not closed.");else if(n.substr(e+1,2)==="![")e=ft(n,"]]>",e,"StopNode is not closed.")-2;else{const i=ke(n,e,">");i&&((i&&i.tagName)===t&&i.tagExp[i.tagExp.length-1]!=="/"&&r++,e=i.closeIndex)}}function Ce(n,t,e){if(t&&typeof n=="string"){const s=n.trim();return s==="true"?!0:s==="false"?!1:kr(n,e)}else return rr(n)?n:""}const be=ht.getMetaDataSymbol();function Fr(n,t){return jn(n,t)}function jn(n,t,e){let s;const r={};for(let i=0;i<n.length;i++){const o=n[i],a=Gr(o);let c="";if(e===void 0?c=a:c=e+"."+a,a===t.textNodeName)s===void 0?s=o[a]:s+=""+o[a];else{if(a===void 0)continue;if(o[a]){let l=jn(o[a],t,c);const u=Vr(l,t);o[be]!==void 0&&(l[be]=o[be]),o[":@"]?Zr(l,o[":@"],c,t):Object.keys(l).length===1&&l[t.textNodeName]!==void 0&&!t.alwaysCreateTextNode?l=l[t.textNodeName]:Object.keys(l).length===0&&(t.alwaysCreateTextNode?l[t.textNodeName]="":l=""),r[a]!==void 0&&r.hasOwnProperty(a)?(Array.isArray(r[a])||(r[a]=[r[a]]),r[a].push(l)):t.isArray(a,c,u)?r[a]=[l]:r[a]=l}}}return typeof s=="string"?s.length>0&&(r[t.textNodeName]=s):s!==void 0&&(r[t.textNodeName]=s),r}function Gr(n){const t=Object.keys(n);for(let e=0;e<t.length;e++){const s=t[e];if(s!==":@")return s}}function Zr(n,t,e,s){if(t){const r=Object.keys(t),i=r.length;for(let o=0;o<i;o++){const a=r[o];s.isArray(a,e+"."+a,!0,!0)?n[a]=[t[a]]:n[a]=t[a]}}}function Vr(n,t){const{textNodeName:e}=t,s=Object.keys(n).length;return!!(s===0||s===1&&(n[e]||typeof n[e]=="boolean"||n[e]===0))}class Jr{constructor(t){this.externalEntities={},this.options=yr(t)}parse(t,e){if(typeof t!="string")if(t.toString)t=t.toString();else throw new Error("XML data is accepted in String or Bytes[] form.");if(e){e===!0&&(e={});const i=or(t,e);if(i!==!0)throw Error(`${i.err.msg}:${i.err.line}:${i.err.col}`)}const s=new Mr(this.options);s.addExternalEntities(this.externalEntities);const r=s.parseXml(t);return this.options.preserveOrder||r===void 0?r:Fr(r,this.options)}addEntity(t,e){if(e.indexOf("&")!==-1)throw new Error("Entity value can't have '&'");if(t.indexOf("&")!==-1||t.indexOf(";")!==-1)throw new Error("An entity must be set without '&' and ';'. Eg. use '#xD' for '
'");if(e==="&")throw new Error("An entity with value '&' is not permitted");this.externalEntities[t]=e}static getMetaDataSymbol(){return ht.getMetaDataSymbol()}}const Xr=`
|
|
10
|
+
`;function Yr(n,t){let e="";return t.format&&t.indentBy.length>0&&(e=Xr),Un(n,t,"",e)}function Un(n,t,e,s){let r="",i=!1;for(let o=0;o<n.length;o++){const a=n[o],c=qr(a);if(c===void 0)continue;let l="";if(e.length===0?l=c:l=`${e}.${c}`,c===t.textNodeName){let f=a[c];Qr(l,t)||(f=t.tagValueProcessor(c,f),f=Fn(f,t)),i&&(r+=s),r+=f,i=!1;continue}else if(c===t.cdataPropName){i&&(r+=s),r+=`<![CDATA[${a[c][0][t.textNodeName]}]]>`,i=!1;continue}else if(c===t.commentPropName){r+=s+`<!--${a[c][0][t.textNodeName]}-->`,i=!0;continue}else if(c[0]==="?"){const f=Nn(a[":@"],t),m=c==="?xml"?"":s;let A=a[c][0][t.textNodeName];A=A.length!==0?" "+A:"",r+=m+`<${c}${A}${f}?>`,i=!0;continue}let u=s;u!==""&&(u+=t.indentBy);const h=Nn(a[":@"],t),d=s+`<${c}${h}`,y=Un(a[c],t,l,u);t.unpairedTags.indexOf(c)!==-1?t.suppressUnpairedNode?r+=d+">":r+=d+"/>":(!y||y.length===0)&&t.suppressEmptyNode?r+=d+"/>":y&&y.endsWith(">")?r+=d+`>${y}${s}</${c}>`:(r+=d+">",y&&s!==""&&(y.includes("/>")||y.includes("</"))?r+=s+t.indentBy+y+s:r+=y,r+=`</${c}>`),i=!0}return r}function qr(n){const t=Object.keys(n);for(let e=0;e<t.length;e++){const s=t[e];if(n.hasOwnProperty(s)&&s!==":@")return s}}function Nn(n,t){let e="";if(n&&!t.ignoreAttributes)for(let s in n){if(!n.hasOwnProperty(s))continue;let r=t.attributeValueProcessor(s,n[s]);r=Fn(r,t),r===!0&&t.suppressBooleanAttributes?e+=` ${s.substr(t.attributeNamePrefix.length)}`:e+=` ${s.substr(t.attributeNamePrefix.length)}="${r}"`}return e}function Qr(n,t){n=n.substr(0,n.length-t.textNodeName.length-1);let e=n.substr(n.lastIndexOf(".")+1);for(let s in t.stopNodes)if(t.stopNodes[s]===n||t.stopNodes[s]==="*."+e)return!0;return!1}function Fn(n,t){if(n&&n.length>0&&t.processEntities)for(let e=0;e<t.entities.length;e++){const s=t.entities[e];n=n.replace(s.regex,s.val)}return n}const ti={attributeNamePrefix:"@_",attributesGroupName:!1,textNodeName:"#text",ignoreAttributes:!0,cdataPropName:!1,format:!1,indentBy:" ",suppressEmptyNode:!1,suppressUnpairedNode:!0,suppressBooleanAttributes:!0,tagValueProcessor:function(n,t){return t},attributeValueProcessor:function(n,t){return t},preserveOrder:!1,commentPropName:!1,unpairedTags:[],entities:[{regex:new RegExp("&","g"),val:"&"},{regex:new RegExp(">","g"),val:">"},{regex:new RegExp("<","g"),val:"<"},{regex:new RegExp("'","g"),val:"'"},{regex:new RegExp('"',"g"),val:"""}],processEntities:!0,stopNodes:[],oneListGroup:!1};function it(n){this.options=Object.assign({},ti,n),this.options.ignoreAttributes===!0||this.options.attributesGroupName?this.isAttribute=function(){return!1}:(this.ignoreAttributesFn=zn(this.options.ignoreAttributes),this.attrPrefixLen=this.options.attributeNamePrefix.length,this.isAttribute=si),this.processTextOrObjNode=ei,this.options.format?(this.indentate=ni,this.tagEndChar=`>
|
|
11
11
|
`,this.newLine=`
|
|
12
|
-
`):(this.indentate=function(){return""},this.tagEndChar=">",this.newLine="")}it.prototype.build=function(n){return this.options.preserveOrder?Yr(n,this.options):(Array.isArray(n)&&this.options.arrayNodeName&&this.options.arrayNodeName.length>1&&(n={[this.options.arrayNodeName]:n}),this.j2x(n,0,[]).val)};it.prototype.j2x=function(n,t,e){let s="",r="";const i=e.join(".");for(let o in n)if(Object.prototype.hasOwnProperty.call(n,o))if(typeof n[o]>"u")this.isAttribute(o)&&(r+="");else if(n[o]===null)this.isAttribute(o)||o===this.options.cdataPropName?r+="":o[0]==="?"?r+=this.indentate(t)+"<"+o+"?"+this.tagEndChar:r+=this.indentate(t)+"<"+o+"/"+this.tagEndChar;else if(n[o]instanceof Date)r+=this.buildTextValNode(n[o],o,"",t);else if(typeof n[o]!="object"){const a=this.isAttribute(o);if(a&&!this.ignoreAttributesFn(a,i))s+=this.buildAttrPairStr(a,""+n[o]);else if(!a)if(o===this.options.textNodeName){let c=this.options.tagValueProcessor(o,""+n[o]);r+=this.replaceEntitiesValue(c)}else r+=this.buildTextValNode(n[o],o,"",t)}else if(Array.isArray(n[o])){const a=n[o].length;let c="",l="";for(let u=0;u<a;u++){const h=n[o][u];if(!(typeof h>"u"))if(h===null)o[0]==="?"?r+=this.indentate(t)+"<"+o+"?"+this.tagEndChar:r+=this.indentate(t)+"<"+o+"/"+this.tagEndChar;else if(typeof h=="object")if(this.options.oneListGroup){const d=this.j2x(h,t+1,e.concat(o));c+=d.val,this.options.attributesGroupName&&h.hasOwnProperty(this.options.attributesGroupName)&&(l+=d.attrStr)}else c+=this.processTextOrObjNode(h,o,t,e);else if(this.options.oneListGroup){let d=this.options.tagValueProcessor(o,h);d=this.replaceEntitiesValue(d),c+=d}else c+=this.buildTextValNode(h,o,"",t)}this.options.oneListGroup&&(c=this.buildObjectNode(c,o,l,t)),r+=c}else if(this.options.attributesGroupName&&o===this.options.attributesGroupName){const a=Object.keys(n[o]),c=a.length;for(let l=0;l<c;l++)s+=this.buildAttrPairStr(a[l],""+n[o][a[l]])}else r+=this.processTextOrObjNode(n[o],o,t,e);return{attrStr:s,val:r}};it.prototype.buildAttrPairStr=function(n,t){return t=this.options.attributeValueProcessor(n,""+t),t=this.replaceEntitiesValue(t),this.options.suppressBooleanAttributes&&t==="true"?" "+n:" "+n+'="'+t+'"'};function ei(n,t,e,s){const r=this.j2x(n,e+1,s.concat(t));return n[this.options.textNodeName]!==void 0&&Object.keys(n).length===1?this.buildTextValNode(n[this.options.textNodeName],t,r.attrStr,e):this.buildObjectNode(r.val,t,r.attrStr,e)}it.prototype.buildObjectNode=function(n,t,e,s){if(n==="")return t[0]==="?"?this.indentate(s)+"<"+t+e+"?"+this.tagEndChar:this.indentate(s)+"<"+t+e+this.closeTag(t)+this.tagEndChar;{let r="</"+t+this.tagEndChar,i="";return t[0]==="?"&&(i="?",r=""),(e||e==="")&&n.indexOf("<")===-1?this.indentate(s)+"<"+t+e+i+">"+n+r:this.options.commentPropName!==!1&&t===this.options.commentPropName&&i.length===0?this.indentate(s)+`<!--${n}-->`+this.newLine:this.indentate(s)+"<"+t+e+i+this.tagEndChar+n+this.indentate(s)+r}};it.prototype.closeTag=function(n){let t="";return this.options.unpairedTags.indexOf(n)!==-1?this.options.suppressUnpairedNode||(t="/"):this.options.suppressEmptyNode?t="/":t=`></${n}`,t};it.prototype.buildTextValNode=function(n,t,e,s){if(this.options.cdataPropName!==!1&&t===this.options.cdataPropName)return this.indentate(s)+`<![CDATA[${n}]]>`+this.newLine;if(this.options.commentPropName!==!1&&t===this.options.commentPropName)return this.indentate(s)+`<!--${n}-->`+this.newLine;if(t[0]==="?")return this.indentate(s)+"<"+t+e+"?"+this.tagEndChar;{let r=this.options.tagValueProcessor(t,n);return r=this.replaceEntitiesValue(r),r===""?this.indentate(s)+"<"+t+e+this.closeTag(t)+this.tagEndChar:this.indentate(s)+"<"+t+e+">"+r+"</"+t+this.tagEndChar}};it.prototype.replaceEntitiesValue=function(n){if(n&&n.length>0&&this.options.processEntities)for(let t=0;t<this.options.entities.length;t++){const e=this.options.entities[t];n=n.replace(e.regex,e.val)}return n};function ni(n){return this.options.indentBy.repeat(n)}function si(n){return n.startsWith(this.options.attributeNamePrefix)&&n!==this.options.textNodeName?n.substr(this.attrPrefixLen):!1}class ot{constructor(t){_(this,"type");_(this,"attrs",{});_(this,"styles",{});_(this,"deleteMarker",!1);this.type=t}dx(t){return this.attrs.x==null?this.attrs.x=t:this.attrs.x+=t,this}dy(t){return this.attrs.y==null?this.attrs.y=t:this.attrs.y+=t,this}x(t){return this.attrs.x=t,this}y(t){return this.attrs.y=t,this}size(t,e){return this.attrs.width=t,this.attrs.height=e,this}remove(){this.deleteMarker=!0}left(...t){return`<${[this.type,Vn(this.attrs),pi(this.styles),...t].filter(e=>e!="").join(" ")}>`}right(){return`</${this.type}>`}center(){return""}toString(){return this.deleteMarker?"":`${this.left()}${this.center()}${this.right()}`}attr(t){if(typeof t=="string")return this.attrs[t]??"";for(const[e,s]of Object.entries(t))this.attrs[e]=s;return this}css(t){return this.styles={...this.styles,...t},this}svg(){return this.toString()}}class qe extends ot{constructor(e){super("image");_(this,"attrs",{});this.attrs={...this.attrs,href:e}}load(e){return this.attrs.href=e,this}}class ge extends ot{constructor(e){super("use");_(this,"attrs",{});this.attrs={...this.attrs,href:this.make(e)}}use(e){return this.attrs.href=`#${e}`,this}make(e){return e==null?e:`#${e}`}}class Qe extends ot{constructor(){super("rect");_(this,"attrs",{})}fill(e){return this.attrs.fill=e,this}stroke(e){return this.attrs.stroke=e,this}}class yt extends ot{constructor(e=""){super("text");_(this,"attrs");_(this,"_text","");this._text=e,this.attrs={}}plain(e){return this._text=e,this}font(e){return this.attrs.fontFamily=e.family,this.attrs.fontSize=e.size,this}center(){return this._text}}let tn=class extends ot{constructor(e){super("symbol");_(this,"raw");this.raw=e}id(){return this.attr("id")}center(){return this.raw}};class T extends ot{constructor(){super("g");_(this,"children",[]);_(this,"rotateMatrix");_(this,"translateMatrix")}add(e){return this.children.push(e),this}rotate(e,s,r){return this.rotateMatrix=Ys(e,s,r),this}translate(e,s){return this.translateMatrix=Oe(e,s),this}center(){return this.children.map(e=>e.toString()).join("")}left(...e){const s=[this.translateMatrix,this.rotateMatrix].filter(r=>r!=null);return s.length==0?super.left():super.left(fi(Gs(s)))}each(e,s){for(let r=0;r<this.children.length;r++){const i=this.children[r];i instanceof T&&s&&i.each(e,!0),e(r,this.children)}}}const ri=['xmlns="http://www.w3.org/2000/svg"','version="1.1"','xmlns:xlink="http://www.w3.org/1999/xlink"'];class Gn extends ot{constructor(){super("svg");_(this,"children",[]);_(this,"viewBox")}add(e){return this.children.push(e),this}center(){return this.children.map(e=>e.toString()).join("")}left(...e){return`<${[this.type,...ri,Vn(this.attrs),di(this.viewBox)].filter(s=>s!="").join(" ")}>`}viewbox(e,s,r,i){return this.viewBox={x:e,y:s,width:r,height:i},this}importSymbol(e){for(const s of gi(e))this.add(s);return this}x(e){throw new Error("unimplemented")}y(e){throw new Error("unimplemented")}dx(e){throw new Error("unimplemented")}dy(e){throw new Error("unimplemented")}each(e,s){for(let r=0;r<this.children.length;r++){const i=this.children[r];i instanceof T&&s&&i.each(e,!0),e(r,this.children)}}}function Zn(){return new Gn}const ii=Zn,oi=T,ai=qe,ci=ge,li=Qe,ui=yt;function hi(n){return n.replace(/[A-Z]/g,t=>"-"+t.toLowerCase())}function di(n){return n==null?"":`viewBox="${n.x} ${n.y} ${n.width} ${n.height}"`}function fi(n){return n==null?"":`transform="${qs(n)}"`}function Vn(n){return Object.entries(n).filter(([t,e])=>e!==void 0).map(([t,e])=>`${hi(t)}="${e}"`).join(" ")}function pi(n){const t=Object.entries(n).map(([e,s])=>`${e}: ${s};`).join(" ");return t!=""?`style="${t}"`:""}function*gi(n){const t=new Jr({ignoreAttributes:!1}),e=new it({ignoreAttributes:!1}),s=t.parse(n);for(const r of s.svg.symbol){const i=e.build(r),o=new tn(i);for(const[a,c]of Object.entries(r))a.startsWith("@_")&&(o.attrs[a.substring(2)]=c);yield o}}const U=(n,t)=>{const e=B(n.tiles[0],t),s=e.baseHeight,r=e.baseWidth;if(n.is(b.SHO_KAN))return{width:r*2+s,height:Math.max(r*2,s)};const i=n.tiles.reduce((a,c)=>{const l=B(c,t).height;return l>a?l:a},0);return{width:n.tiles.reduce((a,c)=>a+B(c,t).width,0),height:i}},B=(n,t)=>{const e=parseFloat((nt.HEIGHT*t).toPrecision(5)),s=parseFloat((nt.WIDTH*t).toPrecision(5)),r=n.has(y.HORIZONTAL)?{width:e,height:s,baseWidth:s,baseHeight:e}:{width:s,height:e,w:s,baseWidth:s,baseHeight:e};return(n.has(y.TSUMO)||n.has(y.DORA))&&(r.width+=s*nt.TEXT_SCALE),r};class Ct{constructor(t={}){_(this,"tileWidth");_(this,"tileHeight");_(this,"imageHostUrl");_(this,"imageExt");_(this,"scale");_(this,"svgSprite");this.scale=t.scale??1,this.imageHostUrl=t.imageHostUrl??"",this.imageExt=t.imageExt??"svg",this.tileWidth=nt.WIDTH*this.scale,this.tileHeight=nt.HEIGHT*this.scale,this.svgSprite=t.svgSprite??!1}getDiffTileHeightWidth(t){const e=B(t,this.scale);return(e.baseHeight-e.baseWidth)/2}image(t){let e=new qe().load(this.buildURL(t));return this.svgSprite&&(e=new ge().use(Ct.buildID(t))),t instanceof w&&t.has(y.COLOR_GRAYSCALE)&&e.css({filter:"contrast(65%)"}),e}createImage(t,e,s){const r=B(t,this.scale);return this.image(t).dx(e).dy(s).size(r.baseWidth,r.baseHeight)}createTextImage(t,e,s,r){const i=this.createImage(t,e,s),o=B(t,this.scale),a=o.baseHeight*.2,c=o.baseWidth,l=o.baseHeight,u=new yt().plain(r);u.size(o.baseWidth,o.baseHeight).font({family:Ue,size:a}).dx(c).dy(l);const h=new T;return h.add(i).add(u).translate(e,s),h}createRotate90Image(t,e,s,r=!1){const i=this.createImage(t,0,0),o=B(t,this.scale),a=o.baseWidth/2,c=o.baseHeight/2,l=e+this.getDiffTileHeightWidth(t),u=r?s-this.getDiffTileHeightWidth(t):s,h=new T;return h.add(i).translate(l,u).rotate(90,a,c),h}createStick(t){return this.image(t)}static buildID(t){if(t==100||t==1e3)return t==100?"stick100":"stick1000";const e=t.t==p.BACK||t.has(y.RED)?0:t.n;return`${t.t}${e}`}buildURL(t){const e=`${Ct.buildID(t)}.${this.imageExt}`;return this.imageHostUrl!=""?`${this.imageHostUrl}${e}`:e}}class en extends Ct{constructor(){super(...arguments);_(this,"blockMargin",nt.WIDTH*nt.BLOCK_MARGIN_SCALE*this.scale)}createBlockHandDiscard(e){const s=e instanceof R?e.tilesWithBack:e.tiles,r=new T;let i=0;for(const o of s){const a=B(o,this.scale),c=o.has(y.HORIZONTAL)?this.createRotate90Image.bind(this):this.createImage.bind(this),l=o.has(y.HORIZONTAL)?this.getDiffTileHeightWidth(o):0,u=c(o,i,l);r.add(u),i+=a.width}return r}createBlockPonChiKan(e){const s=e.tiles.findIndex(o=>o.has(y.HORIZONTAL));let r=0;const i=new T;if(e.type==b.SHO_KAN){let o=s;for(let a=0;a<e.tiles.length;a++)e.tiles[a].has(y.HORIZONTAL)&&(o=a);for(let a=0;a<e.tiles.length;a++){const c=B(e.tiles[a],this.scale);if(a==o)continue;if(a==s){const h=e.tiles[s],d=e.tiles[o],g=B(h,this.scale),f=this.createRotate90Image(h,0,0,!0),m=this.createRotate90Image(d,0,g.height,!0);i.add(new T().translate(r,0).add(f).add(m)),r+=g.width;continue}const l=c.width*2-c.height,u=this.createImage(e.tiles[a],r,l);r+=c.width,i.add(u)}return i}if(e.type==b.CHI){const o=e.tiles[s],a=this.createRotate90Image(o,r,this.getDiffTileHeightWidth(o));r+=B(o,this.scale).width,i.add(a);for(let c=0;c<e.tiles.length;c++){if(c==s)continue;const l=e.tiles[c],u=B(l,this.scale),h=this.createImage(l,r,0);r+=u.width,i.add(h)}return i}for(let o=0;o<e.tiles.length;o++){const a=o==s?this.createRotate90Image.bind(this):this.createImage.bind(this),c=e.tiles[o],l=o==s?this.getDiffTileHeightWidth(c):0,u=B(c,this.scale),h=a(c,r,l);r+=u.width,i.add(h)}return i}}const yi=(n,t)=>{const e=n.scale;return{[b.CHI]:function(r){const i=U(r,e),o=n.createBlockPonChiKan(r);return{...i,e:o}},[b.PON]:function(r){const i=U(r,e),o=n.createBlockPonChiKan(r);return{...i,e:o}},[b.DAI_KAN]:function(r){const i=U(r,e),o=n.createBlockPonChiKan(r);return{...i,e:o}},[b.SHO_KAN]:function(r){const i=U(r,e),o=n.createBlockPonChiKan(r);return{...i,e:o}},[b.AN_KAN]:function(r){N(r instanceof R,`block type is not ankan: ${r.type}`);const i=U(r,e),o=n.createBlockHandDiscard(r);return{...i,e:o}},[b.IMAGE_DORA]:function(r){r=(t==null?void 0:t.doraText)==!1?new kt([r.tiles[0].clone({remove:y.DORA})]):r;const i=U(r,e),o=new T,a=(t==null?void 0:t.doraText)===!1?n.createImage(r.tiles[0],0,0):n.createTextImage(r.tiles[0],0,0,"(ドラ)");return o.add(a),{...i,e:o}},[b.TSUMO]:function(r){r=(t==null?void 0:t.tsumoText)==!1?new kt([r.tiles[0].clone({remove:y.TSUMO})]):r;const i=U(r,e),o=new T,a=(t==null?void 0:t.tsumoText)===!1?n.createImage(r.tiles[0],0,0):n.createTextImage(r.tiles[0],0,0,"(ツモ)");return o.add(a),{...i,e:o}},[b.HAND]:function(r){const i=U(r,e),o=n.createBlockHandDiscard(r);return{...i,e:o}},[b.IMAGE_DISCARD]:function(r){const i=U(r,e),o=n.createBlockHandDiscard(r);return{...i,e:o}},[b.THREE]:function(r){throw new Error("three is unsupported")},[b.RUN]:function(r){throw new Error("run is unsupported")},[b.PAIR]:function(r){throw new Error("pair is unsupported")},[b.ISOLATED]:function(r){throw new Error("isolated is unsupported")},[b.UNKNOWN]:function(r){if(r.tiles.some(a=>a.has(y.TSUMO)||a.has(y.DORA)))throw new Error("found an unknown block with operator tiles");const i=U(r,e),o=n.createBlockHandDiscard(r);return{...i,e:o}}}},vt=(n,t,e)=>{const s=yi(n,e);let r=0,i=0;const o=[];for(const h of t){const d=s[h.type],g=d(h);i+=g.width,r=g.height>r?g.height:r,o.push(g)}const a=r,c=i+(t.length-1)*n.blockMargin,l=new T;let u=0;for(const h of o){const d=a-h.height,g=new T().translate(u,d);g.add(h.e),l.add(g),u+=h.width+n.blockMargin}return{e:l,width:c,height:a}},mi=(n,t,e={},s={responsive:!1,doraText:!0,tsumoText:!0})=>{const r=new en(e),i=vt(r,t,s);s.responsive||n.size(i.width,i.height),n.viewbox(0,0,i.width,i.height),n.add(i.e)},Jn=()=>{const n=[0,1,2,3,4,5,6,7,8,9],t=[];for(const e of Object.values(p)){if(e==p.BACK){t.push(Ct.buildID(new w(e,0)));continue}t.push(...n.map(s=>Ct.buildID(new w(e,s))).flat())}return t},wi=n=>{const t=Jn(),e=[];return n.each((s,r)=>{const i=r[s];if(i instanceof ge){const a=i.attr("href").substring(1);t.includes(a)&&e.push(a)}},!0),e},bi=n=>{const t=Jn(),e=wi(n);n.each((s,r)=>{const i=r[s];i instanceof tn&&(t.includes(i.id())&&e.includes(i.id())||i.remove())},!0)},_i=n=>{const e=[];for(let s=0;s<n.length;s+=6){const r=n.slice(s,s+6);e.push(r)}return e},j=(n,t,e,s,r=0,i=0)=>{const o=new T().add(n);if(s==90){const a=r,c=i-e;return o.rotate(s,0,e).translate(a,c),new T().add(o)}if(s==180){const a=r+t,c=i-e;return o.rotate(s,0,e).translate(a,c),new T().add(o)}if(s==270){const a=r+e,c=i+(t-e);return o.rotate(s,0,e).translate(a,c),new T().add(o)}return new T().add(o)},Qt=(n,t)=>{const e=new T,s=_i(n);for(let r=0;r<s.length;r++){let i=s[r],o=r*t.tileHeight;const a=t.createBlockHandDiscard(new Ve(i,b.IMAGE_DISCARD)).translate(0,o);e.add(a)}return{e,width:t.tileWidth*5+t.tileHeight*1,height:t.tileHeight*s.length}},Ei=(n,t,e)=>{const s=t.font,r=t.textWidth,i=t.textHeight,o=e.sticks.dead,a=e.sticks.reach,c=ve.WIDTH*n.scale,l=ve.HEIGHT*n.scale;let u=r*3,h=i;const d=(c+n.tileWidth+r-u)/2,g=new yt().plain(e.round).font(s).x(d).y(0);h+=25*n.scale;const f=n.tileHeight,m=new T().size(c,f).translate(0,h),A={family:s.family,size:s.size*.7},S=n.createStick(1e3).size(c,l).x(0).y(0),O=new yt().plain(a.toString()).font(A).dx(c).dy(l),M=n.createStick(100).size(c,l).x(0).y(l+l),Et=new yt().plain(o.toString()).font(A).dx(c).dy(l*3);m.add(S),m.add(O),m.add(M),m.add(Et);const At=n.createImage(e.doras[0],0,0).x(c+r).y(0);m.add(At);const St=new T;return St.add(g),St.add(g),St.add(m),{e:St,width:c+n.tileWidth+r,height:h+n.tileHeight}},Ai=(n,t,e=0)=>{const s=vt(n,t.front),r=vt(n,t.right),i=vt(n,t.opposite),o=vt(n,t.left),a=[s.width,r.width,i.width,o.width].reduce((m,A)=>Math.max(m,A)),c=Math.max(e+n.tileHeight*2+n.blockMargin*2,a+n.tileWidth*2+n.blockMargin),l=c,u=j(s.e,s.width,s.height,0).translate((c-s.width)/2,l-s.height),h=j(r.e,r.width,r.height,270).translate(c-r.height,(c-r.width)/2),d=j(i.e,i.width,i.height,180).translate((c-i.width)/2,0),g=j(o.e,o.width,o.height,90).translate(0,(c-o.width)/2),f=new T().size(c,l);return f.add(u),f.add(h),f.add(d),f.add(g),{e:new T().add(f),width:c,height:l}},Si=n=>{const t=Object.values(de),e=t.indexOf(n);return[...t.slice(e),...t.slice(0,e)]},Ni=(n,t,e)=>{const s=n.tileWidth*5+n.tileHeight*1,r=t.font,i=t.textWidth,o=t.textHeight,a=t.numWidth,c=Ei(n,t,e);c.e.translate(s/2-c.width/2,s/2-c.height/2);const l=(Ms,yn,xs)=>{const $s=`${Ms} ${yn}`,Ps=new yt().plain($s).font(r).attr(xs);return{e:new T().add(Ps),width:i+a*yn.toString().length,height:o}},[u,h,d,g]=Si(e.frontPlace),f=e.scores,A=l(u,f.front,{x:s/2,y:s,"dominant-baseline":"text-after-edge","text-anchor":"middle"}).e;let S=l(h,f.right,{"dominant-baseline":"text-after-edge","text-anchor":"middle"});const O=j(S.e,S.width,S.height,270).translate(s,s/2-S.width);let M=l(d,f.opposite,{"text-anchor":"middle","dominant-baseline":"text-after-edge"});const Et=j(M.e,M.width,M.height,180).translate(s/2-M.width,-M.height);let At=l(g,f.left,{"dominant-baseline":"ideographic","text-anchor":"middle"});const St=j(At.e,At.width,At.height,90).translate(-At.height,s/2),at=new T,Rs=new Qe().size(s,s).x(0).y(0).fill("none").stroke("#000000");return at.add(Rs),at.add(c.e),at.add(A),at.add(O),at.add(Et),at.add(St),{e:at,width:s,height:s}},Ti=(n,t)=>{const e=Qt(t.front,n),s=Qt(t.right,n),r=Qt(t.opposite,n),i=Qt(t.left,n),o=[e.height,s.height,r.height,i.height].reduce((O,M)=>Math.max(O,M)),a=n.tileWidth*5+n.tileHeight*1,c=o,l=a+o*2+n.blockMargin,u=l,h=new T().size(l,u),d=l/2-a/2,g=u/2-a/2,f=j(e.e,a,c,0).translate(d,u-c),m=j(s.e,a,c,270).translate(l-c,g),A=j(r.e,a,c,180).translate(d,0),S=j(i.e,a,c,90).translate(0,g);return h.add(f),h.add(m),h.add(A),h.add(S),{e:new T().add(h),width:l,height:u}},Xn=(n,t,e,s,r)=>{const i=new T,o=Ti(n,s),a=Ai(n,e,o.height),c=Ni(n,t,r);return o.e.translate((a.width-o.width)/2,(a.height-o.height)/2),c.e.translate((a.width-c.width)/2,(a.height-c.height)/2),i.add(a.e),i.add(o.e),i.add(c.e),{e:i,width:a.width,height:a.height}},vi=(n,t,e={},s,r={responsive:!1})=>{const i=new en(e),o=s,{discards:a,hands:c,scoreBoard:l}=Qn(t),u=Xn(i,o,c,a,l);r.responsive||n.size(u.width,u.height),n.viewbox(0,0,u.width,u.height),n.add(u.e)};var J;function Yn(n){return{lang:(n==null?void 0:n.lang)??(J==null?void 0:J.lang),message:n==null?void 0:n.message,abortEarly:(n==null?void 0:n.abortEarly)??(J==null?void 0:J.abortEarly),abortPipeEarly:(n==null?void 0:n.abortPipeEarly)??(J==null?void 0:J.abortPipeEarly)}}var _e;function Ii(n){return _e==null?void 0:_e.get(n)}var Ee;function Oi(n){return Ee==null?void 0:Ee.get(n)}var Ae;function ki(n,t){var e;return(e=Ae==null?void 0:Ae.get(n))==null?void 0:e.get(t)}function Rt(n){var e,s;const t=typeof n;return t==="string"?`"${n}"`:t==="number"||t==="bigint"||t==="boolean"?`${n}`:t==="object"||t==="function"?(n&&((s=(e=Object.getPrototypeOf(n))==null?void 0:e.constructor)==null?void 0:s.name))??"null":t}function st(n,t,e,s,r){const i=r&&"input"in r?r.input:e.value,o=(r==null?void 0:r.expected)??n.expects??null,a=(r==null?void 0:r.received)??Rt(i),c={kind:n.kind,type:n.type,input:i,expected:o,received:a,message:`Invalid ${t}: ${o?`Expected ${o} but r`:"R"}eceived ${a}`,requirement:n.requirement,path:r==null?void 0:r.path,issues:r==null?void 0:r.issues,lang:s.lang,abortEarly:s.abortEarly,abortPipeEarly:s.abortPipeEarly},l=n.kind==="schema",u=(r==null?void 0:r.message)??n.message??ki(n.reference,c.lang)??(l?Oi(c.lang):null)??s.message??Ii(c.lang);u!==void 0&&(c.message=typeof u=="function"?u(c):u),l&&(e.typed=!1),e.issues?e.issues.push(c):e.issues=[c]}function Dt(n){return{version:1,vendor:"valibot",validate(t){return n["~run"]({value:t},Yn())}}}function Ci(n,t){const e=[...new Set(n)];return e.length>1?`(${e.join(` ${t} `)})`:e[0]??"never"}function Re(n,t){return{kind:"validation",type:"max_value",reference:Re,async:!1,expects:`<=${n instanceof Date?n.toJSON():Rt(n)}`,requirement:n,message:t,"~run"(e,s){return e.typed&&!(e.value<=this.requirement)&&st(this,"value",e,s,{received:e.value instanceof Date?e.value.toJSON():Rt(e.value)}),e}}}function Me(n,t){return{kind:"validation",type:"min_value",reference:Me,async:!1,expects:`>=${n instanceof Date?n.toJSON():Rt(n)}`,requirement:n,message:t,"~run"(e,s){return e.typed&&!(e.value>=this.requirement)&&st(this,"value",e,s,{received:e.value instanceof Date?e.value.toJSON():Rt(e.value)}),e}}}function Ri(n,t,e){return typeof n.fallback=="function"?n.fallback(t,e):n.fallback}function qn(n,t,e){return typeof n.default=="function"?n.default(t,e):n.default}function ae(n){return{kind:"schema",type:"number",reference:ae,expects:"number",async:!1,message:n,get"~standard"(){return Dt(this)},"~run"(t,e){return typeof t.value=="number"&&!isNaN(t.value)?t.typed=!0:st(this,"type",t,e),t}}}function K(n,t){return{kind:"schema",type:"optional",reference:K,expects:`(${n.expects} | undefined)`,async:!1,wrapped:n,default:t,get"~standard"(){return Dt(this)},"~run"(e,s){return e.value===void 0&&(this.default!==void 0&&(e.value=qn(this,e,s)),e.value===void 0)?(e.typed=!0,e):this.wrapped["~run"](e,s)}}}function xe(n,t){return{kind:"schema",type:"picklist",reference:xe,expects:Ci(n.map(Rt),"|"),async:!1,options:n,message:t,get"~standard"(){return Dt(this)},"~run"(e,s){return this.options.includes(e.value)?e.typed=!0:st(this,"type",e,s),e}}}function Mt(n,t){return{kind:"schema",type:"strict_object",reference:Mt,expects:"Object",async:!1,entries:n,message:t,get"~standard"(){return Dt(this)},"~run"(e,s){var i;const r=e.value;if(r&&typeof r=="object"){e.typed=!0,e.value={};for(const o in this.entries){const a=this.entries[o];if(o in r||(a.type==="exact_optional"||a.type==="optional"||a.type==="nullish")&&a.default!==void 0){const c=o in r?r[o]:qn(a),l=a["~run"]({value:c},s);if(l.issues){const u={type:"object",origin:"value",input:r,key:o,value:c};for(const h of l.issues)h.path?h.path.unshift(u):h.path=[u],(i=e.issues)==null||i.push(h);if(e.issues||(e.issues=l.issues),s.abortEarly){e.typed=!1;break}}l.typed||(e.typed=!1),e.value[o]=l.value}else if(a.fallback!==void 0)e.value[o]=Ri(a);else if(a.type!=="exact_optional"&&a.type!=="optional"&&a.type!=="nullish"&&(st(this,"key",e,s,{input:void 0,expected:`"${o}"`,path:[{type:"object",origin:"key",input:r,key:o,value:r[o]}]}),s.abortEarly))break}if(!e.issues||!s.abortEarly){for(const o in r)if(!(o in this.entries)){st(this,"key",e,s,{input:o,expected:"never",path:[{type:"object",origin:"key",input:r,key:o,value:r[o]}]});break}}}else st(this,"type",e,s);return e}}}function ce(n){return{kind:"schema",type:"string",reference:ce,expects:"string",async:!1,message:n,get"~standard"(){return Dt(this)},"~run"(t,e){return typeof t.value=="string"?t.typed=!0:st(this,"type",t,e),t}}}function Tn(...n){return{...n[0],pipe:n,get"~standard"(){return Dt(this)},"~run"(t,e){for(const s of n)if(s.kind!=="metadata"){if(t.issues&&(s.kind==="schema"||s.kind==="transformation")){t.typed=!1;break}(!t.issues||!e.abortEarly&&!e.abortPipeEarly)&&(t=s["~run"](t,e))}return t}}}function Mi(n,t,e){const s=n["~run"]({value:t},Yn(e));return{typed:s.typed,success:!s.issues,output:s.value,issues:s.issues}}const te=K(Mt({discard:K(ce(),""),hand:K(ce(),""),score:K(ae(),25e3)}),{discard:"",hand:"",score:25e3}),xi=Mt({[E.E]:te,[E.S]:te,[E.W]:te,[E.N]:te}),ct={round:k.E1,sticks:{reach:0,dead:0},doras:E.S,front:E.E},$i=K(Mt({round:K(xe(Object.keys(Fe)),ct.round),sticks:K(Mt({reach:K(Tn(ae(),Me(0,""),Re(9,"")),ct.sticks.reach),dead:K(Tn(ae(),Me(0,""),Re(9,"")),ct.sticks.dead)}),ct.sticks),doras:K(ce(),ct.doras),front:K(xe(Object.keys(de)),ct.front)}),ct),Pi=Mt({...xi.entries,board:$i}),Qn=n=>{const t=ts(n);return es(t)},ts=n=>{const t=Hi(n),e=Mi(Pi,t);if(!e.success)throw e.issues;return e.output},Hi=n=>{const t="table",e="board",s=n.split(`
|
|
13
|
-
`).map(a=>a.trim()).filter(a=>a!="");if(s.length==0)throw new Error("empty input");const r=s.shift();if(!r.startsWith(t))throw new Error(`input does not start with table: ${r}`);const i={};let o=[E.E,E.S,E.W,E.N,e];for(;;){const a=s.shift();if(a==null)break;const c=o.find(l=>a.startsWith(l));if(c==null)throw new Error(`encountered unexpected line ${a}`);if(o=o.filter(l=>!a.startsWith(l)),c==e){const[l,u]=Bi([...s]);i.board=l;for(let h=0;h<u;h++)s.shift()}else{const[l,u]=Wi([...s]);i[c]=l;for(let h=0;h<u;h++)s.shift()}}return i},F=(n,t)=>n.replace(t,"").replace(":","").trim(),Wi=n=>{const t="hand",e="discard",s="score",r={};let i=0;for(;i<n.length;i++){const o=n[i];if(o.startsWith(t))r.hand=F(o,t);else if(o.startsWith(e))r.discard=F(o,e);else if(o.startsWith(s))r.score=Number(F(o,s));else break}return[r,i]},Bi=n=>{const t="doras",e="round",s="front",r="sticks",i="reach",o="dead",a={};let c=0;for(;c<n.length;c++){const l=n[c];if(l.startsWith(t))a.doras=F(l,t);else if(l.startsWith(e))a.round=F(l,e);else if(l.startsWith(s))a.front=F(l,s);else if(l.startsWith(r)){a.sticks={};const u=n[c+1]??"",h=n[c+2]??"";u.startsWith(i)&&(a.sticks.reach=Number(F(u,i))),u.startsWith(o)&&(a.sticks.dead=Number(F(u,o))),h.startsWith(i)&&(a.sticks.reach=Number(F(h,i))),h.startsWith(o)&&(a.sticks.dead=Number(F(h,o))),a.sticks.dead!=null&&c++,a.sticks.reach!=null&&c++}else break}return[a,c]},es=n=>{const t=n.board.front,e=Di(t),s=a=>n[a].discard.replace(/\r?\n/g,""),r={front:new W(s(e.front)).tiles(),right:new W(s(e.right)).tiles(),opposite:new W(s(e.opposite)).tiles(),left:new W(s(e.left)).tiles()},i={front:new W(n[e.front].hand).parse(),right:new W(n[e.right].hand).parse(),opposite:new W(n[e.opposite].hand).parse(),left:new W(n[e.left].hand).parse()},o={round:Fe[n.board.round],frontPlace:de[t],sticks:n.board.sticks,doras:new W(n.board.doras).tiles(),scores:{front:n[e.front].score,right:n[e.right].score,opposite:n[e.opposite].score,left:n[e.left].score}};return{discards:r,hands:i,scoreBoard:o}},Di=n=>({front:n,right:gt(n),opposite:gt(gt(n)),left:fe(n)});function*L(n){const t=n!=null&&n.filterBy&&n.filterBy.length>0?n==null?void 0:n.filterBy:Object.values(p);for(const e of t){if(n!=null&&n.skipBack&&e==p.BACK)continue;const s=e==p.Z?7:e==p.BACK?1:9;for(let r=1;r<=s;r++)yield[e,r]}}class ye{constructor(t,e=!1){_(this,"data");this.data={[p.M]:[0,0,0,0,0,0,0,0,0,0],[p.P]:[0,0,0,0,0,0,0,0,0,0],[p.S]:[0,0,0,0,0,0,0,0,0,0],[p.Z]:[0,0,0,0,0,0,0,0],[p.BACK]:["untouchable",0],called:[],reached:!1,tsumo:null},this.init(t,e)}init(t,e){const s=Array.isArray(t)?t:new W(t).parse();for(const r of s){if(r.isCalled()){this.data.called=[...this.called,r];continue}else if(r.is(b.TSUMO)){const i=r.tiles[0];this.inc([i]),this.data.tsumo=i;continue}else if(r.is(b.HAND)){this.inc(r.tiles);continue}else if(!Array.isArray(t)&&t.split("").every(i=>i===p.BACK)){this.inc(r.tiles);continue}else if(e){this.inc(r.tiles);continue}throw new Error(`unexpected block ${r.type} ${r.toString()}`)}}get hands(){const t=[];for(const[e,s]of L()){let r=this.get(e,s);e!=p.Z&&s==5&&this.get(e,0)>0&&(r-=this.get(e,0),t.push(new w(e,s,[y.RED])));for(let i=0;i<r;i++)t.push(new w(e,s))}if(this.drawn!=null){const e=this.drawn,s=t.findIndex(r=>r.equals(e));N(s>=0,`hand has drawn: ${this.drawn} but no tile in hands: ${t.join("")}`),t[s]=t[s].clone({add:y.TSUMO})}return t}toString(){const t=this.called.length>0?`${q}${this.called.join(q)}`:"",e=this.drawn?`${q}${this.drawn.toString()}`:"",s=this.hands.filter(i=>!i.has(y.TSUMO));return`${new kt(s).toString()}${e}${t}`}get called(){return this.data.called}get reached(){return this.data.reached}get drawn(){return this.data.tsumo}get menzen(){return!this.called.some(t=>!(t instanceof R))}sum(t){let e=0;for(const[s,r]of L({filterBy:[t]}))e+=this.get(s,r);return e}get(t,e){return t==p.BACK?this.data[t][1]:this.data[t][e]}inc(t){const e=[];for(const s of t){if(s.t!=p.BACK&&this.get(s.t,s.n)>=4||s.has(y.RED)&&this.get(s.t,0)>0)throw this.dec(e),new Error(`unable to increase ${s} in ${this.toString()}`);e.push(s),s.t==p.BACK?this.data[s.t][1]+=1:(this.data[s.t][s.n]+=1,s.has(y.RED)&&(this.data[s.t][0]+=1))}return e}dec(t){const e=[];for(const s of t){if(this.get(s.t,s.n)<1||s.has(y.RED)&&this.get(s.t,0)<=0)throw this.inc(e),new Error(`unable to decrease ${s.toString()} in ${this.toString()}`);if(e.push(s),s.t==p.BACK?this.data[s.t][1]-=1:(this.data[s.t][s.n]-=1,s.has(y.RED)&&(this.data[s.t][0]-=1)),C(s)&&this.get(s.t,5)==0&&this.get(s.t,0)>0){this.data[s.t][0]=0;const r=e.pop().clone({add:y.RED});e.push(r)}}return e}draw(t){const e=t.clone({add:y.TSUMO});this.inc([e]),this.data.tsumo=e}discard(t){this.dec([t]),this.data.tsumo=null}reach(){if(!this.menzen)throw new Error("cannot reach");if(this.data.reached)throw new Error("already reached");this.data.reached=!0}call(t){const e=t.tiles.filter(s=>!s.has(y.HORIZONTAL));if(e.length!=t.tiles.length-1)throw new Error(`removal: ${e} block: ${t}`);this.dec(e),this.data.called=[...this.called,t],this.data.tsumo=null}kan(t){if(t instanceof R){this.dec(t.tiles),this.data.called=[...this.called,t],this.data.tsumo=null;return}if(t instanceof D){const e=this.data.called.findIndex(r=>r.is(b.PON)&&r.tiles[0].equals(t.tiles[0]));if(e==-1)throw new Error(`unable to find ${t.tiles[0]}`);let s=t.tiles[0];s=C(s)?s.clone({remove:y.RED}):s,this.dec([s]),this.data.called=[...this.called.slice(0,e),...this.called.slice(e+1),t],this.data.tsumo=null;return}throw new Error(`unexpected input ${t}`)}clone(){const t=new ye(this.toString());return t.data.reached=this.data.reached,t}}class Xt{constructor(t){_(this,"hand");this.hand=t}calc(){return Math.min(this.sevenPairs(),this.thirteenOrphans(),this.fourSetsOnePair())}sevenPairs(){if(this.hand.called.length>0)return 1/0;let t=0,e=0;for(const[s,r]of L({skipBack:!0}))this.hand.get(s,r)==2&&t++,this.hand.get(s,r)==1&&e++;return t>7&&(t=7),t+e>=7&&(e=7-t),13-2*t-e}thirteenOrphans(){if(this.hand.called.length>0)return 1/0;let t=0,e=0;for(const s of Object.values(p)){if(s==p.BACK)continue;const r=s==p.Z?xt:G;for(const i of r)this.hand.get(s,i)>=1&&t++,this.hand.get(s,i)>=2&&e++}return e>=1?12-t:13-t}fourSetsOnePair(){const t=s=>{const r=[0,0,0];for(const[d,g]of L({filterBy:[p.Z]}))this.hand.get(d,g)>=3?r[0]++:this.hand.get(d,g)==2?r[1]++:this.hand.get(d,g)==1&&r[2]++;const i=[0,0,0],o=this.hand.get(p.BACK,0),a=o%3;i[0]=Math.floor(o/3),a==2?i[1]=1:a==1&&(i[2]=1);let c=13;const l=this.patternNumType(p.M),u=this.patternNumType(p.P),h=this.patternNumType(p.S);for(const d of[l.patternA,l.patternB])for(const g of[u.patternA,u.patternB])for(const f of[h.patternA,h.patternB]){const m=[this.hand.called.length,0,0];for(let S=0;S<3;S++)m[S]+=d[S]+g[S]+f[S]+r[S]+i[S];const A=this.calcCommon(m[0],m[1],m[2],s);A<c&&(c=A)}return c};let e=t(!1);for(const[s,r]of L())if(this.hand.get(s,r)>=2){const i=this.hand.dec(new Array(2).fill(new w(s,r))),o=t(!0);this.hand.inc(i),o<e&&(e=o)}return e}patternNumType(t,e=1){if(e>9)return this.groupRemainingTiles(t);let s=this.patternNumType(t,e+1);if(e<=7&&this.hand.get(t,e)>0&&this.hand.get(t,e+1)>0&&this.hand.get(t,e+2)>0){const r=this.hand.dec([new w(t,e),new w(t,e+1),new w(t,e+2)]),i=this.patternNumType(t,e);this.hand.inc(r),i.patternA[0]++,i.patternB[0]++,(i.patternA[2]<s.patternA[2]||i.patternA[2]==s.patternA[2]&&i.patternA[1]<s.patternA[1])&&(s.patternA=i.patternA),(i.patternB[0]>s.patternB[0]||i.patternB[0]==s.patternB[0]&&i.patternB[1]>s.patternB[1])&&(s.patternB=i.patternB)}if(this.hand.get(t,e)>=3){const r=this.hand.dec(new Array(3).fill(new w(t,e))),i=this.patternNumType(t,e);this.hand.inc(r),i.patternA[0]++,i.patternB[0]++,(i.patternA[2]<s.patternA[2]||i.patternA[2]==s.patternA[2]&&i.patternA[1]<s.patternA[1])&&(s.patternA=i.patternA),(i.patternB[0]>s.patternB[0]||i.patternB[0]==s.patternB[0]&&i.patternB[1]>s.patternB[1])&&(s.patternB=i.patternB)}return s}groupRemainingTiles(t){let e=0,s=0,r=0;for(const[i,o]of L({filterBy:[t]}))r+=this.hand.get(i,o),o<=7&&this.hand.get(i,o+1)==0&&this.hand.get(i,o+2)==0&&(e+=r>>1,s+=r%2,r=0);return e+=r>>1,s+=r%2,{patternA:[0,e,s],patternB:[0,e,s]}}calcCommon(t,e,s,r){let i=r?4:5;return t>4&&(e+=t-4,t=4),t+e>4&&(s+=t+e-4,e=4-t),t+e+s>i&&(s=i-t-e),r&&e++,13-t*3-e*2-s}}class ns{constructor(t){_(this,"hand");this.hand=t}calc(t){return this.markDrawn([...this.sevenPairs(),...this.thirteenOrphans(),...this.nineGates(),...this.fourSetsOnePair()],t)}markDrawn(t,e){if(t.length==0)return[];const s=this.hand.drawn!=null||e.has(y.TSUMO)?y.TSUMO:y.RON,r=[];for(let o=0;o<t.length;o++){const a=t[o],c={};for(let l=0;l<a.length;l++){const u=a[l];if(u.isCalled())continue;const h=u.tiles.findIndex(g=>g.equals(e)&&e.has(y.RED)==g.has(y.RED));if(h<0)continue;const d=ss(u);c[d]||(c[d]=!0,r.push([o,l,h]))}}if(r.length==0)throw new Error(`found no tile ${e.toString()} in hands ${t[0].toString()}`);const i=[];for(const[o,a,c]of r){const u=[...t[o]],h=u[a],d=h.tiles[c].clone({add:s});u[a]=h.clone({replace:{idx:c,tile:d}}),i.push(u)}return i}sevenPairs(){if(this.hand.called.length>0)return[];const t=[];for(const[e,s]of L({skipBack:!0})){const r=this.hand.get(e,s);if(r==2){const i=this.hand.dec(new Array(2).fill(new w(e,s)));t.push(new H(i[0],i[1])),this.hand.inc(i)}else{if(r==0)continue;return[]}}return[t]}thirteenOrphans(){const t=[];let e=!1;for(const s of Object.values(p)){if(s==p.BACK)continue;const r=s==p.Z?xt:G;for(let i of r)if(this.hand.get(s,i)==1)t.push(new Ze(new w(s,i)));else if(this.hand.get(s,i)==2&&e==!1)t.unshift(new H(new w(s,i),new w(s,i))),e=!0;else return[]}return[t]}nineGates(){const t=(e,s,r)=>r.includes(this.hand.get(e,s));for(const e of Object.values(p)){if(e==p.BACK||e==p.Z)continue;const s=t(e,1,[3,4])&&t(e,9,[3,4])&&t(e,2,[1,2])&&t(e,3,[1,2])&&t(e,4,[1,2])&&t(e,5,[1,2])&&t(e,6,[1,2])&&t(e,7,[1,2])&&t(e,8,[1,2]),r=this.hand.sum(e)==14;if(s&&r)return[[new kt(this.hand.hands)]]}return[]}fourSetsOnePair(){let t=[];for(const[e,s]of L())if(this.hand.get(e,s)>=2){const r=this.hand.dec(new Array(2).fill(new w(e,s))),i=this.patternAll().filter(o=>o.length==4).map(o=>(o.unshift(new H(r[0],r[1])),o));t=[...t,...i],this.hand.inc(r)}return t}patternAll(){const t=[this.handleNumType(p.M),this.handleNumType(p.P),this.handleNumType(p.S),this.handleZ(),this.handleBack(),[this.hand.called.concat()]].sort((s,r)=>r.length-s.length),e=t[0].concat();for(let s=0;s<e.length;s++)for(let r=1;r<t.length;r++)for(const i of t[r])e[s]=[...e[s],...i];return e}handleBack(){const t=p.BACK,e=this.hand.get(t,0);if(e<3)return[];const s=new w(t,0),r=Array(Math.floor(e/3)).fill(new z([s,s,s]));return r.length==0?[]:[r]}handleZ(){const t=[];for(const[e,s]of L({filterBy:[p.Z]})){if(this.hand.get(e,s)==0)continue;if(this.hand.get(e,s)!=3)return[];const r=new w(e,s);t.push(new z([r,r,r]))}return t.length==0?[]:[t]}handleNumType(t,e=1){if(e>9)return[];if(this.hand.get(t,e)==0)return this.handleNumType(t,e+1);const s=[];if(e<=7&&this.hand.get(t,e)>0&&this.hand.get(t,e+1)>0&&this.hand.get(t,e+2)>0){const r=this.hand.dec([new w(t,e),new w(t,e+1),new w(t,e+2)]);let i=this.handleNumType(t,e);this.hand.inc(r),i.length==0&&(i=[[]]);for(const o of i)o.unshift(new Q([r[0],r[1],r[2]])),s.push(o)}if(this.hand.get(t,e)==3){const r=this.hand.dec(new Array(3).fill(new w(t,e)));let i=this.handleNumType(t,e);this.hand.inc(r),i.length==0&&(i=[[]]);for(const o of i)o.unshift(new z([r[0],r[1],r[2]])),s.push(o)}return s}}const xt=[1,2,3,4,5,6,7],G=[1,9],zt=n=>{var e;const t=n.boardContext;return{...n,hand:n.hand.map(v.deserialize),boardContext:{...t,doraMarkers:t.doraMarkers.map(w.from),blindDoraMarkers:(e=t.blindDoraMarkers)==null?void 0:e.map(w.from)}}};class $e{constructor(t,e){_(this,"hand");_(this,"cfg");this.hand=t,this.cfg={doras:e.doraMarkers.map(s=>In(s)),blindDoras:e.blindDoraMarkers==null?[]:e.blindDoraMarkers.map(s=>In(s)),roundWind:w.from(e.round.substring(0,2)),myWind:w.from(e.myWind),reached:e.reached??0,sticks:e.sticks??{dead:0,reach:0},replacementWin:e.replacementWin??!1,quadWin:e.quadWin??!1,finalWallWin:e.finalWallWin??!1,finalDiscardWin:e.finalDiscardWin??!1,oneShotWin:e.oneShotWin??!1,roundUp8000:e.roundUp8000??!1,orig:e}}calc(...t){const e=this.calcPatterns(t);if(e.length==0)return!1;let s=[0,0],r=0;for(let f=0;f<e.length;f++){const m=e[f],A=m.points.reduce((S,O)=>S+O.double,0);A>s[0]?(r=f,s=[A,m.fu]):A==s[0]&&m.fu>s[1]&&(r=f,s=[A,m.fu])}const i=(f,m=100)=>Math.ceil(f/m)*m,o=s[1]!=25?i(s[1],10):25,a=s[0];let c=Math.min(o*2**(a+2),2e3);switch(a){case 26:c=16e3;break;case 13:c=8e3;break;case 12:case 11:c=6e3;break;case 10:case 9:case 8:c=4e3;break;case 7:case 6:c=3e3;break;case 5:c=2e3;break}a>13&&a<26&&(c=8e3),this.cfg.roundUp8000&&(o==30&&a==4||o==60&&a==3)&&(c=2e3);const l=e[r].hand.some(f=>f.tiles.some(m=>m.has(y.TSUMO))),u=this.cfg.orig.myWind,h=u==E.E,d=$(0);if(l){const f=this.cfg.sticks.dead*100;if(h){const m=i(c*2);d[E.E]+=m*3+f*3,d[E.S]-=m+f,d[E.W]-=m+f,d[E.N]-=m+f}else for(const m of Object.values(E)){if(m==u)continue;const A=m==E.E?2:1,S=i(c*A)+f;d[m]-=S,d[u]+=S}}else{const f=this.cfg.sticks.dead*300;if(this.cfg.orig.ronWind==null)throw new Error("ron wind is not specified in the parameters");const A=i(c*(h?6:4))+f;d[u]+=A,d[this.cfg.orig.ronWind]-=A}return d[u]+=1e3*this.cfg.sticks.reach,{deltas:d,sum:a,fu:o,points:e[r].points,point:d[u],hand:e[r].hand,boardContext:this.cfg.orig}}calcPatterns(t){const e=[];if(t.length==0)return e;for(const s of t){const r=[...this.dA13(s),...this.dB13(s),...this.dC13(s),...this.dD13(s),...this.dE13(s),...this.dF13(s),...this.dG13(s),...this.dH13(s),...this.dI13(s),...this.dJ13(s),...this.dK13(s)];r.length!=0&&e.push({points:r,fu:30,hand:s})}if(e.length>0)return e;for(const s of t){const r=this.calcFu(s),i=[...this.dA1(s),...this.dB1(s),...this.dC1(s),...this.dD1(s),...this.dE1(s),...this.dF1(s),...this.dG1(s),...this.dH1(s),...this.dI1(s),...this.dJ1(s),...this.dK1(s),...this.dA2(s),...this.dB2(s),...this.dC2(s),...this.dD2(s),...this.dE2(s),...this.dF2(s),...this.dG2(s),...this.dH2(s),...this.dI2(s),...this.dJ2(s),...this.dA3(s),...this.dB3(s),...this.dC3(s),...this.dA6(s)];i.length!=0&&(i.push(...this.dX1(s)),e.push({points:i,fu:r,hand:s}))}return e}minus(){return this.hand.menzen?0:1}dA1(t){return this.cfg.reached==1?[{name:"立直",double:1}]:this.cfg.reached==2?[{name:"ダブル立直",double:2}]:[]}dB1(t){return this.minus()!=0?[]:(this.hand.drawn==null,t.some(s=>s.tiles.some(r=>r.has(y.TSUMO)))?[{name:"門前清自摸和",double:1}]:[])}dC1(t){if(this.minus()!=0)return[];const e="平和",s=this.calcFu(t);return s==20?[{name:e,double:1}]:!t.some(r=>r.tiles.some(i=>i.has(y.TSUMO)))&&s==30?[{name:e,double:1}]:[]}dD1(t){return t.some(s=>s.tiles.some(r=>r.t==p.Z||G.includes(r.n)))?[]:[{name:"断么九",double:1}]}dE1(t){return this.minus()!=0?[]:vn(t)==1?[{name:"一盃口",double:1}]:[]}dF1(t){const e=[];return t.forEach(s=>{if(s instanceof H)return;const r=s.tiles[0];r.t==p.Z&&(r.equals(this.cfg.myWind)&&e.push({name:"自風",double:1}),r.equals(this.cfg.roundWind)?e.push({name:"場風",double:1}):r.n==5?e.push({name:"白",double:1}):r.n==6?e.push({name:"發",double:1}):r.n==7&&e.push({name:"中",double:1}))}),e}dG1(t){return this.cfg.oneShotWin?[{name:"一発",double:1}]:[]}dH1(t){return this.cfg.replacementWin?[{name:"嶺上開花",double:1}]:[]}dI1(t){return this.cfg.quadWin?[{name:"搶槓",double:1}]:[]}dJ1(t){return this.cfg.finalWallWin?[{name:"海底摸月",double:1}]:[]}dK1(t){return this.cfg.finalDiscardWin?[{name:"河底撈魚",double:1}]:[]}dX1(t){let e=0,s=0,r=0;for(const o of t)for(const a of o.tiles){for(const c of this.cfg.doras)a.equals(c)&&e++;for(const c of this.cfg.blindDoras)a.equals(c)&&s++;a.has(y.RED)&&r++}const i=[];return e>0&&i.push({name:"ドラ",double:e}),r>0&&i.push({name:"赤ドラ",double:r}),this.hand.reached&&s>0&&i.push({name:"裏ドラ",double:s}),i}dA2(t){return t.length==7?[{name:"七対子",double:2}]:[]}dB2(t){const e=s=>s instanceof Q||s instanceof Z;for(const s of t){if(!e(s))continue;const r=lt(s);if(r.t==p.Z)continue;const i=[p.M,p.P,p.S].filter(c=>c!=r.t),o=t.some(c=>{const l=new w(i[0],r.n);return e(c)&&l.equals(lt(c))}),a=t.some(c=>{const l=new w(i[1],r.n);return e(c)&&l.equals(lt(c))});if(o&&a)return[{name:"三色同順",double:2-this.minus()}]}return[]}dC2(t){return t.length==7?[]:t.every(s=>s instanceof R||s instanceof D||s instanceof Y||s instanceof z||s instanceof V||s instanceof H)?[{name:"対々和",double:2}]:[]}dD2(t){return this.minus()!=0?[]:t.filter(s=>(s instanceof R||s instanceof z)&&!s.tiles.some(r=>r.has(y.RON))).length>=3?[{name:"三暗刻",double:2}]:[]}dE2(t){return t.filter(s=>s instanceof R||s instanceof D||s instanceof Y).length>=3?[{name:"三槓子",double:2}]:[]}dF2(t){const e=s=>s instanceof R||s instanceof D||s instanceof Y||s instanceof z||s instanceof V;for(const s of t){if(!e(s))continue;const r=lt(s);if(r.t==p.Z)continue;const i=[p.M,p.P,p.S].filter(c=>c!=r.t),o=t.some(c=>{const l=new w(i[0],r.n);return e(c)&&l.equals(lt(c))}),a=t.some(c=>{const l=new w(i[1],r.n);return e(c)&&l.equals(lt(c))});if(o&&a)return[{name:"三色同刻",double:2}]}return[]}dG2(t){return t.filter(s=>{const r=s.tiles[0];return r.t==p.Z&&[5,6,7].includes(r.n)}).length==3?[{name:"小三元",double:2}]:[]}dH2(t){return t.every(s=>{const r=s.tiles[0].t==p.Z?xt:G;return s.tiles.every(i=>r.includes(i.n))})?[{name:"混老頭",double:2}]:[]}dI2(t){return t.length==7?[]:t.some(s=>s instanceof Q||s instanceof Z)?t.some(s=>s.tiles[0].t==p.Z)?t.every(s=>{const r=s.tiles[0].t==p.Z?xt:G;return s.tiles.some(i=>r.includes(i.n))})?[{name:"混全帯么九",double:2-this.minus()}]:[]:[]:[]}dJ2(t){const e={[p.M]:[0,0,0],[p.S]:[0,0,0],[p.P]:[0,0,0]};for(const s of t){const r=lt(s);r.t!=p.BACK&&r.t!=p.Z&&(s instanceof Q||s instanceof Z)&&(r.n==1?e[r.t][0]++:r.n==4?e[r.t][1]++:r.n==7&&e[r.t][2]++)}for(const s of Object.values(e))if(s[0]>0&&s[1]>0&&s[2]>0)return[{name:"一気通貫",double:2-this.minus()}];return[]}dA3(t){if(!t.some(s=>s.tiles[0].t==p.Z))return[];for(const s of Object.values(p))if(t.every(i=>i.tiles[0].t==p.Z||i.tiles[0].t==s))return[{name:"混一色",double:3-this.minus()}];return[]}dB3(t){return t.length==7?[]:t.some(s=>s instanceof Q||s instanceof Z)?t.some(s=>s.tiles[0].t==p.Z)?[]:t.every(s=>s.tiles.some(r=>G.includes(r.n)))?[{name:"純全帯么九色",double:3-this.minus()}]:[]:[]}dC3(t){return this.minus()!=0?[]:vn(t)==2?[{name:"ニ盃口",double:3}]:[]}dA6(t){if(t.some(e=>e.tiles[0].t==p.Z))return[];for(const e of Object.values(p)){if(e==p.Z)continue;if(t.every(r=>r.tiles[0].t==e))return[{name:"清一色",double:6-this.minus()}]}return[]}dA13(t){return t.length!=13?[]:t.some(s=>s instanceof H&&s.tiles.some(r=>r.has(y.TSUMO)||r.has(y.RON)))?[{name:"国士無双13面待ち",double:26}]:[{name:"国士無双",double:13}]}dB13(t){return t.length==1?[{name:"九蓮宝燈",double:13}]:[]}dC13(t){return t.length==7?[]:t.every(r=>r instanceof R||r instanceof z&&!r.tiles.some(i=>i.has(y.RON))||r instanceof H)?t.some(r=>r instanceof H&&r.tiles.every(i=>i.has(y.TSUMO)||i.has(y.RON)))?[{name:"四暗刻単騎待ち",double:26}]:[{name:"四暗刻",double:13}]:[]}dD13(t){if(t.length==13)return[];const e=[5,6,7];return t.filter(r=>!(r instanceof H)&&r.tiles.some(i=>i.t==p.Z&&e.includes(i.n))).length==3?[{name:"大三元",double:13}]:[]}dE13(t){return t.every(s=>s.tiles[0].t==p.Z)?[{name:"字一色",double:13}]:[]}dF13(t){return t.every(s=>s.tiles.every(r=>r.t!=p.Z&&G.includes(r.n)))?[{name:"清老頭",double:13}]:[]}dG13(t){return t.filter(s=>s instanceof R||s instanceof D||s instanceof Y).length==4?[{name:"四槓子",double:13}]:[]}dH13(t){if(t.length==13)return[];if(t.length==7)return[];const e=[1,2,3,4];return t.filter(i=>i.tiles.some(o=>o.t==p.Z&&e.includes(o.n))).length==4?t.find(i=>i instanceof H).tiles.some(i=>i.t==p.Z&&e.includes(i.n))?[{name:"小四喜",double:13}]:[{name:"大四喜",double:13}]:[]}dI13(t){const e=s=>!!(s.equals(new w(p.Z,6))||s.t==p.S&&[2,3,4,6,8].includes(s.n));return t.every(s=>s.tiles.every(r=>e(r)))?[{name:"緑一色",double:13}]:[]}dJ13(t){return[]}dK13(t){return[]}calcFu(t){let s=20;const r=this.cfg.myWind.n,i=this.cfg.roundWind.n;if(t.length==7)return 25;const o=t.find(f=>f.tiles.some(m=>m.has(y.TSUMO)||m.has(y.RON))),a=this.minus()==1,c=o.tiles.some(f=>f.has(y.TSUMO)),l=(f,m)=>{const A=f.tiles[0];return A.t==p.Z&&[5,6,7].includes(A.n)||A.t==p.Z&&[r,i].includes(A.n)||G.includes(A.n)?m*2:m};for(const f of t)switch(!0){case f instanceof z:const m=f.tiles.some(A=>A.has(y.RON))?2:4;s+=l(f,m);break;case f instanceof V:s+=l(f,2);break;case(f instanceof Y||f instanceof D):s+=l(f,8);break;case f instanceof R:s+=l(f,16);break}s+=(f=>{if(f instanceof z)return 0;if(f instanceof H)return 2;const m=f.tiles,A=m.findIndex(S=>S.has(y.TSUMO)||S.has(y.RON));return A==1||A==0&&m[2].n==9||A==2&&m[0].n==1?2:0})(o);const d=t.find(f=>f instanceof H).tiles[0];d.t==p.Z&&([5,6,7].includes(d.n)&&(s+=2),d.n==i&&(s+=2),d.n==r&&(s+=2));let g=!1;return!a&&s==20&&(g=!0),c&&!g&&(s+=2),!c&&!a&&(s+=10),!c&&!a&&s==30&&(g=!0),a&&s==20&&(s=30),s}}const ss=n=>n.tiles.reduce((t,e)=>`${t}${e.n}${e.t}`,""),vn=n=>{const t={};for(const s of n){if(!(s instanceof Q))continue;const r=ss(s);t[r]==null?t[r]=1:t[r]++}let e=0;for(const s in t)t[s]>=2&&e++;return e},lt=n=>[...n.tiles].sort(Jt)[0],In=n=>{const t=n.n,e=n.t;if(e==p.Z){if(t==4)return new w(e,1);if(t==7)return new w(e,5)}return new w(e,t%9+1)};class $t{static calcCandidates(t,e,s){N(e.length>0,"choices to discard is zero");const r=new Map;let i=1/0;for(const o of e){const a=t.dec([o]),c=$t.candidateTiles(t,s);t.inc(a);const l=s!=null&&s.arrangeRed&&o.has(y.RED)?o.clone({removeAll:!0}):o.has(y.RED)?o.clone({removeAll:!0,add:y.RED}):o.clone({removeAll:!0});c.shanten<i?(r.clear(),r.set(l.toString(),{shanten:c.shanten,candidates:c.candidates,tile:l}),i=c.shanten):c.shanten==i&&r.set(l.toString(),{shanten:c.shanten,candidates:c.candidates,tile:l})}return Array.from(r.values())}static candidateTiles(t,e){let s=1/0,r=[];const i=new Xt(t);for(const[o,a]of L({skipBack:!0,filterBy:e==null?void 0:e.typeFilter})){if(t.get(o,a)>=4)continue;const c=new w(o,a),l=t.inc([c]),u=e!=null&&e.fourSetsOnePair?i.fourSetsOnePair():i.calc();t.dec(l),u<s?(s=u,r=[c]):u==s&&r.push(c)}return{shanten:s,candidates:r}}}const Pe=()=>{const n=new Set;return{on(t){n.add(t)},off(t){n.delete(t)},offAll(){n.clear()},emit(t){n.forEach(e=>e(t))}}};function rs(n){var i;const t=["RON","DAI_KAN","PON","CHI"],e=n.map(o=>o.choices),r=os(e,t).map(o=>n[o]);return{events:r,type:as(t,(i=r[0])==null?void 0:i.choices)}}function is(n){var i;const t=["TSUMO","REACH","AN_KAN","SHO_KAN","DRAWN_GAME_BY_NINE_ORPHANS","DISCARD"],e=n.map(o=>o.choices),r=os(e,t).map(o=>n[o]);return{events:r,type:as(t,(i=r[0])==null?void 0:i.choices)}}function os(n,t){let e=[],s=Number.POSITIVE_INFINITY;for(let r=0;r<n.length;r++){const i=n[r];if(Ki(i,t)){const o=Li(t,i);o<s?(s=o,e=[r]):o===s&&e.push(r)}}return e}function Ki(n,t){return t.some(e=>!!n[e])}function Li(n,t){for(let e=0;e<n.length;e++){const s=n[e];if(t[s])return e}return Number.POSITIVE_INFINITY}function as(n,t){if(t==null)return!1;for(const e of n)if(t[e])return e;return!1}const jt=()=>{const n=Pe(),t=Pe(),e={emit:n.emit,on:r=>t.on(r)},s={emit:t.emit,on:r=>n.on(r)};return[e,s]},cs=()=>{const n=Pe();return{emit:s=>{n.emit(s)},on:s=>{n.on(s)}}};class Gt{constructor(t){_(this,"reachValue",1e3);_(this,"m");this.m=structuredClone(t)}get summary(){return structuredClone(this.m)}reach(t){this.m[t]-=this.reachValue}update(t,e){for(let s in e){const r=e[s],i=t[r];this.m[s]+=i}}}class Zt{constructor(t,e){_(this,"pToW",{});_(this,"wToP",$(""));_(this,"round");_(this,"sticks");this.round=(e==null?void 0:e.round)??k.E1,this.sticks=structuredClone(e==null?void 0:e.sticks)??{reach:0,dead:0},this.pToW=structuredClone(t);for(let s in this.pToW)this.wToP[this.pToW[s]]=s}update(){for(let t in this.pToW){const e=fe(this.pToW[t]);this.pToW[t]=e,this.wToP[e]=t}}incrementDeadStick(){this.sticks.dead++}incrementReachStick(){this.sticks.reach++}nextRound(){const t=Ft(this.round);this.round=t,this.update()}resetDeadStick(){this.sticks.dead=0}resetReachStick(){this.sticks.reach=0}is(t){return this.round==t}wind(t){return this.pToW[t]}playerID(t){return this.wToP[t]}get playerMap(){return structuredClone(this.pToW)}}function nn(n){for(let t=n.length-1;t>0;t--){const e=Math.floor(Math.random()*(t+1));[n[t],n[e]]=[n[e],n[t]]}return n}class ls{constructor(t=!1){_(this,"c");_(this,"safeMap",$({},!0));this.disable=t,this.c=this.initial()}get(t){return t.t==p.BACK?0:this.c[t.t][t.n]}dec(...t){if(!this.disable){for(let e of t)if(e.t!=p.BACK){if(this.get(e)<=0)throw new Error(`[counter] cannot decrease ${e.toString()} due to zero`);this.c[e.t][e.n]-=1,e.has(y.RED)&&(this.c[e.t][0]-=1)}}}addTileToSafeMap(t,e){this.disable||(this.safeMap[e][this.key(t.t,t.n)]=!0)}isSafeTile(t,e,s){return this.safeMap[s][this.key(t,e)]}key(t,e){return`${t}${e}`}reset(){this.c=this.initial()}initial(){return{[p.M]:[1,4,4,4,4,4,4,4,4,4],[p.S]:[1,4,4,4,4,4,4,4,4,4],[p.P]:[1,4,4,4,4,4,4,4,4,4],[p.Z]:[0,4,4,4,4,4,4,4]}}}class sn{constructor(){_(this,"m",[])}discard(t,e){this.m.push({w:e,t})}discards(t){return t==null?[...this.m]:this.m.filter(e=>e.w==t)}get lastTile(){const t=this.m.at(-1);return N(t!=null,`lastTile is null(${t}). river: ${JSON.stringify(this.m,null,2)}`),t}markCalled(){this.lastTile.callMarker=!0}cannotContinue(){const t=this.discards();if(t.length!=4)return!1;let e=t[0].t;if(e.isNum())return!1;for(let s=0;s<4;s++)if(!e.equals(t[s].t))return!1;return!0}}function zi(){if(typeof globalThis<"u")return globalThis;if(typeof self<"u")return self;if(typeof window<"u")return window;if(typeof global<"u")return global}function ji(){const n=zi();if(n.__xstate__)return n.__xstate__}const Ui=n=>{if(typeof window>"u")return;const t=ji();t&&t.register(n)};class On{constructor(t){this._process=t,this._active=!1,this._current=null,this._last=null}start(){this._active=!0,this.flush()}clear(){this._current&&(this._current.next=null,this._last=this._current)}enqueue(t){const e={value:t,next:null};if(this._current){this._last.next=e,this._last=e;return}this._current=e,this._last=e,this._active&&this.flush()}flush(){for(;this._current;){const t=this._current;this._process(t.value),this._current=t.next}this._last=null}}const us=".",Fi="",hs="",Gi="#",Zi="*",ds="xstate.init",He="xstate.stop";function Vi(n,t){return{type:`xstate.after.${n}.${t}`}}function We(n,t){return{type:`xstate.done.state.${n}`,output:t}}function Ji(n,t){return{type:`xstate.done.actor.${n}`,output:t,actorId:n}}function Xi(n,t){return{type:`xstate.error.actor.${n}`,error:t,actorId:n}}function fs(n){return{type:ds,input:n}}function X(n){setTimeout(()=>{throw n})}const Yi=typeof Symbol=="function"&&Symbol.observable||"@@observable";function ps(n,t){const e=kn(n),s=kn(t);return typeof s=="string"?typeof e=="string"?s===e:!1:typeof e=="string"?e in s:Object.keys(e).every(r=>r in s?ps(e[r],s[r]):!1)}function rn(n){if(ys(n))return n;const t=[];let e="";for(let s=0;s<n.length;s++){switch(n.charCodeAt(s)){case 92:e+=n[s+1],s++;continue;case 46:t.push(e),e="";continue}e+=n[s]}return t.push(e),t}function kn(n){if(Mo(n))return n.value;if(typeof n!="string")return n;const t=rn(n);return qi(t)}function qi(n){if(n.length===1)return n[0];const t={};let e=t;for(let s=0;s<n.length-1;s++)if(s===n.length-2)e[n[s]]=n[s+1];else{const r=e;e={},r[n[s]]=e}return t}function Cn(n,t){const e={},s=Object.keys(n);for(let r=0;r<s.length;r++){const i=s[r];e[i]=t(n[i],i,n,r)}return e}function gs(n){return ys(n)?n:[n]}function et(n){return n===void 0?[]:gs(n)}function Be(n,t,e,s){return typeof n=="function"?n({context:t,event:e,self:s}):n}function ys(n){return Array.isArray(n)}function Qi(n){return n.type.startsWith("xstate.error.actor")}function Tt(n){return gs(n).map(t=>typeof t>"u"||typeof t=="string"?{target:t}:t)}function ms(n){if(!(n===void 0||n===Fi))return et(n)}function De(n,t,e){var i,o,a;const s=typeof n=="object",r=s?n:void 0;return{next:(i=s?n.next:n)==null?void 0:i.bind(r),error:(o=s?n.error:t)==null?void 0:o.bind(r),complete:(a=s?n.complete:e)==null?void 0:a.bind(r)}}function Rn(n,t){return`${t}.${n}`}function on(n,t){const e=t.match(/^xstate\.invoke\.(\d+)\.(.*)/);if(!e)return n.implementations.actors[t];const[,s,r]=e,o=n.getStateNodeById(r).config.invoke;return(Array.isArray(o)?o[s]:o).src}function Mn(n,t){return`${n.sessionId}.${t}`}let to=0;function eo(n,t){const e=new Map,s=new Map,r=new WeakMap,i=new Set,o={},{clock:a,logger:c}=t,l={schedule:(d,g,f,m,A=Math.random().toString(36).slice(2))=>{const S={source:d,target:g,event:f,delay:m,id:A,startedAt:Date.now()},O=Mn(d,A);h._snapshot._scheduledEvents[O]=S;const M=a.setTimeout(()=>{delete o[O],delete h._snapshot._scheduledEvents[O],h._relay(d,g,f)},m);o[O]=M},cancel:(d,g)=>{const f=Mn(d,g),m=o[f];delete o[f],delete h._snapshot._scheduledEvents[f],m!==void 0&&a.clearTimeout(m)},cancelAll:d=>{for(const g in h._snapshot._scheduledEvents){const f=h._snapshot._scheduledEvents[g];f.source===d&&l.cancel(d,f.id)}}},u=d=>{if(!i.size)return;const g={...d,rootId:n.sessionId};i.forEach(f=>{var m;return(m=f.next)==null?void 0:m.call(f,g)})},h={_snapshot:{_scheduledEvents:((t==null?void 0:t.snapshot)&&t.snapshot.scheduler)??{}},_bookId:()=>`x:${to++}`,_register:(d,g)=>(e.set(d,g),d),_unregister:d=>{e.delete(d.sessionId);const g=r.get(d);g!==void 0&&(s.delete(g),r.delete(d))},get:d=>s.get(d),_set:(d,g)=>{const f=s.get(d);if(f&&f!==g)throw new Error(`Actor with system ID '${d}' already exists.`);s.set(d,g),r.set(g,d)},inspect:d=>{const g=De(d);return i.add(g),{unsubscribe(){i.delete(g)}}},_sendInspectionEvent:u,_relay:(d,g,f)=>{h._sendInspectionEvent({type:"@xstate.event",sourceRef:d,actorRef:g,event:f}),g._send(f)},scheduler:l,getSnapshot:()=>({_scheduledEvents:{...h._snapshot._scheduledEvents}}),start:()=>{const d=h._snapshot._scheduledEvents;h._snapshot._scheduledEvents={};for(const g in d){const{source:f,target:m,event:A,delay:S,id:O}=d[g];l.schedule(f,m,A,S,O)}},_clock:a,_logger:c};return h}let Se=!1;const an=1;let P=function(n){return n[n.NotStarted=0]="NotStarted",n[n.Running=1]="Running",n[n.Stopped=2]="Stopped",n}({});const no={clock:{setTimeout:(n,t)=>setTimeout(n,t),clearTimeout:n=>clearTimeout(n)},logger:console.log.bind(console),devTools:!1};class so{constructor(t,e){this.logic=t,this._snapshot=void 0,this.clock=void 0,this.options=void 0,this.id=void 0,this.mailbox=new On(this._process.bind(this)),this.observers=new Set,this.eventListeners=new Map,this.logger=void 0,this._processingStatus=P.NotStarted,this._parent=void 0,this._syncSnapshot=void 0,this.ref=void 0,this._actorScope=void 0,this._systemId=void 0,this.sessionId=void 0,this.system=void 0,this._doneEvent=void 0,this.src=void 0,this._deferred=[];const s={...no,...e},{clock:r,logger:i,parent:o,syncSnapshot:a,id:c,systemId:l,inspect:u}=s;this.system=o?o.system:eo(this,{clock:r,logger:i}),u&&!o&&this.system.inspect(De(u)),this.sessionId=this.system._bookId(),this.id=c??this.sessionId,this.logger=(e==null?void 0:e.logger)??this.system._logger,this.clock=(e==null?void 0:e.clock)??this.system._clock,this._parent=o,this._syncSnapshot=a,this.options=s,this.src=s.src??t,this.ref=this,this._actorScope={self:this,id:this.id,sessionId:this.sessionId,logger:this.logger,defer:h=>{this._deferred.push(h)},system:this.system,stopChild:h=>{if(h._parent!==this)throw new Error(`Cannot stop child actor ${h.id} of ${this.id} because it is not a child`);h._stop()},emit:h=>{const d=this.eventListeners.get(h.type),g=this.eventListeners.get("*");if(!d&&!g)return;const f=[...d?d.values():[],...g?g.values():[]];for(const m of f)m(h)},actionExecutor:h=>{const d=()=>{if(this._actorScope.system._sendInspectionEvent({type:"@xstate.action",actorRef:this,action:{type:h.type,params:h.params}}),!h.exec)return;const g=Se;try{Se=!0,h.exec(h.info,h.params)}finally{Se=g}};this._processingStatus===P.Running?d():this._deferred.push(d)}},this.send=this.send.bind(this),this.system._sendInspectionEvent({type:"@xstate.actor",actorRef:this}),l&&(this._systemId=l,this.system._set(l,this)),this._initState((e==null?void 0:e.snapshot)??(e==null?void 0:e.state)),l&&this._snapshot.status!=="active"&&this.system._unregister(this)}_initState(t){var e;try{this._snapshot=t?this.logic.restoreSnapshot?this.logic.restoreSnapshot(t,this._actorScope):t:this.logic.getInitialSnapshot(this._actorScope,(e=this.options)==null?void 0:e.input)}catch(s){this._snapshot={status:"error",output:void 0,error:s}}}update(t,e){var r,i;this._snapshot=t;let s;for(;s=this._deferred.shift();)try{s()}catch(o){this._deferred.length=0,this._snapshot={...t,status:"error",error:o}}switch(this._snapshot.status){case"active":for(const o of this.observers)try{(r=o.next)==null||r.call(o,t)}catch(a){X(a)}break;case"done":for(const o of this.observers)try{(i=o.next)==null||i.call(o,t)}catch(a){X(a)}this._stopProcedure(),this._complete(),this._doneEvent=Ji(this.id,this._snapshot.output),this._parent&&this.system._relay(this,this._parent,this._doneEvent);break;case"error":this._error(this._snapshot.error);break}this.system._sendInspectionEvent({type:"@xstate.snapshot",actorRef:this,event:e,snapshot:t})}subscribe(t,e,s){var i;const r=De(t,e,s);if(this._processingStatus!==P.Stopped)this.observers.add(r);else switch(this._snapshot.status){case"done":try{(i=r.complete)==null||i.call(r)}catch(o){X(o)}break;case"error":{const o=this._snapshot.error;if(!r.error)X(o);else try{r.error(o)}catch(a){X(a)}break}}return{unsubscribe:()=>{this.observers.delete(r)}}}on(t,e){let s=this.eventListeners.get(t);s||(s=new Set,this.eventListeners.set(t,s));const r=e.bind(void 0);return s.add(r),{unsubscribe:()=>{s.delete(r)}}}start(){if(this._processingStatus===P.Running)return this;this._syncSnapshot&&this.subscribe({next:s=>{s.status==="active"&&this.system._relay(this,this._parent,{type:`xstate.snapshot.${this.id}`,snapshot:s})},error:()=>{}}),this.system._register(this.sessionId,this),this._systemId&&this.system._set(this._systemId,this),this._processingStatus=P.Running;const t=fs(this.options.input);switch(this.system._sendInspectionEvent({type:"@xstate.event",sourceRef:this._parent,actorRef:this,event:t}),this._snapshot.status){case"done":return this.update(this._snapshot,t),this;case"error":return this._error(this._snapshot.error),this}if(this._parent||this.system.start(),this.logic.start)try{this.logic.start(this._snapshot,this._actorScope)}catch(s){return this._snapshot={...this._snapshot,status:"error",error:s},this._error(s),this}return this.update(this._snapshot,t),this.options.devTools&&this.attachDevTools(),this.mailbox.start(),this}_process(t){let e,s;try{e=this.logic.transition(this._snapshot,t,this._actorScope)}catch(r){s={err:r}}if(s){const{err:r}=s;this._snapshot={...this._snapshot,status:"error",error:r},this._error(r);return}this.update(e,t),t.type===He&&(this._stopProcedure(),this._complete())}_stop(){return this._processingStatus===P.Stopped?this:(this.mailbox.clear(),this._processingStatus===P.NotStarted?(this._processingStatus=P.Stopped,this):(this.mailbox.enqueue({type:He}),this))}stop(){if(this._parent)throw new Error("A non-root actor cannot be stopped directly.");return this._stop()}_complete(){var t;for(const e of this.observers)try{(t=e.complete)==null||t.call(e)}catch(s){X(s)}this.observers.clear()}_reportError(t){if(!this.observers.size){this._parent||X(t);return}let e=!1;for(const s of this.observers){const r=s.error;e||(e=!r);try{r==null||r(t)}catch(i){X(i)}}this.observers.clear(),e&&X(t)}_error(t){this._stopProcedure(),this._reportError(t),this._parent&&this.system._relay(this,this._parent,Xi(this.id,t))}_stopProcedure(){return this._processingStatus!==P.Running?this:(this.system.scheduler.cancelAll(this),this.mailbox.clear(),this.mailbox=new On(this._process.bind(this)),this._processingStatus=P.Stopped,this.system._unregister(this),this)}_send(t){this._processingStatus!==P.Stopped&&this.mailbox.enqueue(t)}send(t){this.system._relay(void 0,this,t)}attachDevTools(){const{devTools:t}=this.options;t&&(typeof t=="function"?t:Ui)(this)}toJSON(){return{xstate$$type:an,id:this.id}}getPersistedSnapshot(t){return this.logic.getPersistedSnapshot(this._snapshot,t)}[Yi](){return this}getSnapshot(){return this._snapshot}}function Pt(n,...[t]){return new so(n,t)}function ro(n,t,e,s,{sendId:r}){const i=typeof r=="function"?r(e,s):r;return[t,{sendId:i},void 0]}function io(n,t){n.defer(()=>{n.system.scheduler.cancel(n.self,t.sendId)})}function oo(n){function t(e,s){}return t.type="xstate.cancel",t.sendId=n,t.resolve=ro,t.execute=io,t}function ao(n,t,e,s,{id:r,systemId:i,src:o,input:a,syncSnapshot:c}){const l=typeof o=="string"?on(t.machine,o):o,u=typeof r=="function"?r(e):r;let h,d;return l&&(d=typeof a=="function"?a({context:t.context,event:e.event,self:n.self}):a,h=Pt(l,{id:u,src:o,parent:n.self,syncSnapshot:c,systemId:i,input:d})),[wt(t,{children:{...t.children,[u]:h}}),{id:r,systemId:i,actorRef:h,src:o,input:d},void 0]}function co(n,{actorRef:t}){t&&n.defer(()=>{t._processingStatus!==P.Stopped&&t.start()})}function lo(...[n,{id:t,systemId:e,input:s,syncSnapshot:r=!1}={}]){function i(o,a){}return i.type="xstate.spawnChild",i.id=t,i.systemId=e,i.src=n,i.input=s,i.syncSnapshot=r,i.resolve=ao,i.execute=co,i}function uo(n,t,e,s,{actorRef:r}){const i=typeof r=="function"?r(e,s):r,o=typeof i=="string"?t.children[i]:i;let a=t.children;return o&&(a={...a},delete a[o.id]),[wt(t,{children:a}),o,void 0]}function ho(n,t){if(t){if(n.system._unregister(t),t._processingStatus!==P.Running){n.stopChild(t);return}n.defer(()=>{n.stopChild(t)})}}function ws(n){function t(e,s){}return t.type="xstate.stopChild",t.actorRef=n,t.resolve=uo,t.execute=ho,t}function cn(n,t,e,s){const{machine:r}=s,i=typeof n=="function",o=i?n:r.implementations.guards[typeof n=="string"?n:n.type];if(!i&&!o)throw new Error(`Guard '${typeof n=="string"?n:n.type}' is not implemented.'.`);if(typeof o!="function")return cn(o,t,e,s);const a={context:t,event:e},c=i||typeof n=="string"?void 0:"params"in n?typeof n.params=="function"?n.params({context:t,event:e}):n.params:void 0;return"check"in o?o.check(s,a,o):o(a,c)}const ln=n=>n.type==="atomic"||n.type==="final";function Ht(n){return Object.values(n.states).filter(t=>t.type!=="history")}function Yt(n,t){const e=[];if(t===n)return e;let s=n.parent;for(;s&&s!==t;)e.push(s),s=s.parent;return e}function le(n){const t=new Set(n),e=_s(t);for(const s of t)if(s.type==="compound"&&(!e.get(s)||!e.get(s).length))xn(s).forEach(r=>t.add(r));else if(s.type==="parallel"){for(const r of Ht(s))if(r.type!=="history"&&!t.has(r)){const i=xn(r);for(const o of i)t.add(o)}}for(const s of t){let r=s.parent;for(;r;)t.add(r),r=r.parent}return t}function bs(n,t){const e=t.get(n);if(!e)return{};if(n.type==="compound"){const r=e[0];if(r){if(ln(r))return r.key}else return{}}const s={};for(const r of e)s[r.key]=bs(r,t);return s}function _s(n){const t=new Map;for(const e of n)t.has(e)||t.set(e,[]),e.parent&&(t.has(e.parent)||t.set(e.parent,[]),t.get(e.parent).push(e));return t}function Es(n,t){const e=le(t);return bs(n,_s(e))}function un(n,t){return t.type==="compound"?Ht(t).some(e=>e.type==="final"&&n.has(e)):t.type==="parallel"?Ht(t).every(e=>un(n,e)):t.type==="final"}const me=n=>n[0]===Gi;function fo(n,t){return n.transitions.get(t)||[...n.transitions.keys()].filter(s=>{if(s===Zi)return!0;if(!s.endsWith(".*"))return!1;const r=s.split("."),i=t.split(".");for(let o=0;o<r.length;o++){const a=r[o],c=i[o];if(a==="*")return o===r.length-1;if(a!==c)return!1}return!0}).sort((s,r)=>r.length-s.length).flatMap(s=>n.transitions.get(s))}function po(n){const t=n.config.after;if(!t)return[];const e=r=>{const i=Vi(r,n.id),o=i.type;return n.entry.push(Lo(i,{id:o,delay:r})),n.exit.push(oo(o)),o};return Object.keys(t).flatMap(r=>{const i=t[r],o=typeof i=="string"?{target:i}:i,a=Number.isNaN(+r)?r:+r,c=e(a);return et(o).map(l=>({...l,event:c,delay:a}))}).map(r=>{const{delay:i}=r;return{...dt(n,r.event,r),delay:i}})}function dt(n,t,e){const s=ms(e.target),r=e.reenter??!1,i=mo(n,s),o={...e,actions:et(e.actions),guard:e.guard,target:i,source:n,reenter:r,eventType:t,toJSON:()=>({...o,source:`#${n.id}`,target:i?i.map(a=>`#${a.id}`):void 0})};return o}function go(n){const t=new Map;if(n.config.on)for(const e of Object.keys(n.config.on)){if(e===hs)throw new Error('Null events ("") cannot be specified as a transition key. Use `always: { ... }` instead.');const s=n.config.on[e];t.set(e,Tt(s).map(r=>dt(n,e,r)))}if(n.config.onDone){const e=`xstate.done.state.${n.id}`;t.set(e,Tt(n.config.onDone).map(s=>dt(n,e,s)))}for(const e of n.invoke){if(e.onDone){const s=`xstate.done.actor.${e.id}`;t.set(s,Tt(e.onDone).map(r=>dt(n,s,r)))}if(e.onError){const s=`xstate.error.actor.${e.id}`;t.set(s,Tt(e.onError).map(r=>dt(n,s,r)))}if(e.onSnapshot){const s=`xstate.snapshot.${e.id}`;t.set(s,Tt(e.onSnapshot).map(r=>dt(n,s,r)))}}for(const e of n.after){let s=t.get(e.eventType);s||(s=[],t.set(e.eventType,s)),s.push(e)}return t}function yo(n,t){const e=typeof t=="string"?n.states[t]:t?n.states[t.target]:void 0;if(!e&&t)throw new Error(`Initial state node "${t}" not found on parent state node #${n.id}`);const s={source:n,actions:!t||typeof t=="string"?[]:et(t.actions),eventType:null,reenter:!1,target:e?[e]:[],toJSON:()=>({...s,source:`#${n.id}`,target:e?[`#${e.id}`]:[]})};return s}function mo(n,t){if(t!==void 0)return t.map(e=>{if(typeof e!="string")return e;if(me(e))return n.machine.getStateNodeById(e);const s=e[0]===us;if(s&&!n.parent)return ue(n,e.slice(1));const r=s?n.key+e:e;if(n.parent)try{return ue(n.parent,r)}catch(i){throw new Error(`Invalid transition definition for state node '${n.id}':
|
|
14
|
-
${i.message}`)}else throw new Error(`Invalid target: "${e}" is not a valid target from the root node. Did you mean ".${e}"?`)})}function As(n){const t=ms(n.config.target);return t?{target:t.map(e=>typeof e=="string"?ue(n.parent,e):e)}:n.parent.initial}function pt(n){return n.type==="history"}function xn(n){const t=Ss(n);for(const e of t)for(const s of Yt(e,n))t.add(s);return t}function Ss(n){const t=new Set;function e(s){if(!t.has(s)){if(t.add(s),s.type==="compound")e(s.initial.target[0]);else if(s.type==="parallel")for(const r of Ht(s))e(r)}}return e(n),t}function Wt(n,t){if(me(t))return n.machine.getStateNodeById(t);if(!n.states)throw new Error(`Unable to retrieve child state '${t}' from '${n.id}'; no child states exist.`);const e=n.states[t];if(!e)throw new Error(`Child state '${t}' does not exist on '${n.id}'`);return e}function ue(n,t){if(typeof t=="string"&&me(t))try{return n.machine.getStateNodeById(t)}catch{}const e=rn(t).slice();let s=n;for(;e.length;){const r=e.shift();if(!r.length)break;s=Wt(s,r)}return s}function he(n,t){if(typeof t=="string"){const r=n.states[t];if(!r)throw new Error(`State '${t}' does not exist on '${n.id}'`);return[n,r]}const e=Object.keys(t),s=e.map(r=>Wt(n,r)).filter(Boolean);return[n.machine.root,n].concat(s,e.reduce((r,i)=>{const o=Wt(n,i);if(!o)return r;const a=he(o,t[i]);return r.concat(a)},[]))}function wo(n,t,e,s){const i=Wt(n,t).next(e,s);return!i||!i.length?n.next(e,s):i}function bo(n,t,e,s){const r=Object.keys(t),i=Wt(n,r[0]),o=hn(i,t[r[0]],e,s);return!o||!o.length?n.next(e,s):o}function _o(n,t,e,s){const r=[];for(const i of Object.keys(t)){const o=t[i];if(!o)continue;const a=Wt(n,i),c=hn(a,o,e,s);c&&r.push(...c)}return r.length?r:n.next(e,s)}function hn(n,t,e,s){return typeof t=="string"?wo(n,t,e,s):Object.keys(t).length===1?bo(n,t,e,s):_o(n,t,e,s)}function Eo(n){return Object.keys(n.states).map(t=>n.states[t]).filter(t=>t.type==="history")}function rt(n,t){let e=n;for(;e.parent&&e.parent!==t;)e=e.parent;return e.parent===t}function Ao(n,t){const e=new Set(n),s=new Set(t);for(const r of e)if(s.has(r))return!0;for(const r of s)if(e.has(r))return!0;return!1}function Ns(n,t,e){const s=new Set;for(const r of n){let i=!1;const o=new Set;for(const a of s)if(Ao(Ke([r],t,e),Ke([a],t,e)))if(rt(r.source,a.source))o.add(a);else{i=!0;break}if(!i){for(const a of o)s.delete(a);s.add(r)}}return Array.from(s)}function So(n){const[t,...e]=n;for(const s of Yt(t,void 0))if(e.every(r=>rt(r,s)))return s}function dn(n,t){if(!n.target)return[];const e=new Set;for(const s of n.target)if(pt(s))if(t[s.id])for(const r of t[s.id])e.add(r);else for(const r of dn(As(s),t))e.add(r);else e.add(s);return[...e]}function Ts(n,t){const e=dn(n,t);if(!e)return;if(!n.reenter&&e.every(r=>r===n.source||rt(r,n.source)))return n.source;const s=So(e.concat(n.source));if(s)return s;if(!n.reenter)return n.source.machine.root}function Ke(n,t,e){var r;const s=new Set;for(const i of n)if((r=i.target)!=null&&r.length){const o=Ts(i,e);i.reenter&&i.source===o&&s.add(o);for(const a of t)rt(a,o)&&s.add(a)}return[...s]}function No(n,t){if(n.length!==t.size)return!1;for(const e of n)if(!t.has(e))return!1;return!0}function Le(n,t,e,s,r,i){if(!n.length)return t;const o=new Set(t._nodes);let a=t.historyValue;const c=Ns(n,o,a);let l=t;r||([l,a]=Oo(l,s,e,c,o,a,i,e.actionExecutor)),l=Bt(l,s,e,c.flatMap(h=>h.actions),i,void 0),l=vo(l,s,e,c,o,i,a,r);const u=[...o];l.status==="done"&&(l=Bt(l,s,e,u.sort((h,d)=>d.order-h.order).flatMap(h=>h.exit),i,void 0));try{return a===t.historyValue&&No(t._nodes,o)?l:wt(l,{_nodes:u,historyValue:a})}catch(h){throw h}}function To(n,t,e,s,r){if(s.output===void 0)return;const i=We(r.id,r.output!==void 0&&r.parent?Be(r.output,n.context,t,e.self):void 0);return Be(s.output,n.context,i,e.self)}function vo(n,t,e,s,r,i,o,a){let c=n;const l=new Set,u=new Set;Io(s,o,u,l),a&&u.add(n.machine.root);const h=new Set;for(const d of[...l].sort((g,f)=>g.order-f.order)){r.add(d);const g=[];g.push(...d.entry);for(const f of d.invoke)g.push(lo(f.src,{...f,syncSnapshot:!!f.onSnapshot}));if(u.has(d)){const f=d.initial.actions;g.push(...f)}if(c=Bt(c,t,e,g,i,d.invoke.map(f=>f.id)),d.type==="final"){const f=d.parent;let m=(f==null?void 0:f.type)==="parallel"?f:f==null?void 0:f.parent,A=m||d;for((f==null?void 0:f.type)==="compound"&&i.push(We(f.id,d.output!==void 0?Be(d.output,c.context,t,e.self):void 0));(m==null?void 0:m.type)==="parallel"&&!h.has(m)&&un(r,m);)h.add(m),i.push(We(m.id)),A=m,m=m.parent;if(m)continue;c=wt(c,{status:"done",output:To(c,t,e,c.machine.root,A)})}}return c}function Io(n,t,e,s){for(const r of n){const i=Ts(r,t);for(const a of r.target||[])!pt(a)&&(r.source!==a||r.source!==i||r.reenter)&&(s.add(a),e.add(a)),It(a,t,e,s);const o=dn(r,t);for(const a of o){const c=Yt(a,i);(i==null?void 0:i.type)==="parallel"&&c.push(i),vs(s,t,e,c,!r.source.parent&&r.reenter?void 0:i)}}}function It(n,t,e,s){var r;if(pt(n))if(t[n.id]){const i=t[n.id];for(const o of i)s.add(o),It(o,t,e,s);for(const o of i)Ne(o,n.parent,s,t,e)}else{const i=As(n);for(const o of i.target)s.add(o),i===((r=n.parent)==null?void 0:r.initial)&&e.add(n.parent),It(o,t,e,s);for(const o of i.target)Ne(o,n.parent,s,t,e)}else if(n.type==="compound"){const[i]=n.initial.target;pt(i)||(s.add(i),e.add(i)),It(i,t,e,s),Ne(i,n,s,t,e)}else if(n.type==="parallel")for(const i of Ht(n).filter(o=>!pt(o)))[...s].some(o=>rt(o,i))||(pt(i)||(s.add(i),e.add(i)),It(i,t,e,s))}function vs(n,t,e,s,r){for(const i of s)if((!r||rt(i,r))&&n.add(i),i.type==="parallel")for(const o of Ht(i).filter(a=>!pt(a)))[...n].some(a=>rt(a,o))||(n.add(o),It(o,t,e,n))}function Ne(n,t,e,s,r){vs(e,s,r,Yt(n,t))}function Oo(n,t,e,s,r,i,o,a){let c=n;const l=Ke(s,r,i);l.sort((h,d)=>d.order-h.order);let u;for(const h of l)for(const d of Eo(h)){let g;d.history==="deep"?g=f=>ln(f)&&rt(f,h):g=f=>f.parent===h,u??(u={...i}),u[d.id]=Array.from(r).filter(g)}for(const h of l)c=Bt(c,t,e,[...h.exit,...h.invoke.map(d=>ws(d.id))],o,void 0),r.delete(h);return[c,u||i]}function ko(n,t){return n.implementations.actions[t]}function Is(n,t,e,s,r,i){const{machine:o}=n;let a=n;for(const c of s){const l=typeof c=="function",u=l?c:ko(o,typeof c=="string"?c:c.type),h={context:a.context,event:t,self:e.self,system:e.system},d=l||typeof c=="string"?void 0:"params"in c?typeof c.params=="function"?c.params({context:a.context,event:t}):c.params:void 0;if(!u||!("resolve"in u)){e.actionExecutor({type:typeof c=="string"?c:typeof c=="object"?c.type:c.name||"(anonymous)",info:h,params:d,exec:u});continue}const g=u,[f,m,A]=g.resolve(e,a,h,d,u,r);a=f,"retryResolve"in g&&(i==null||i.push([g,m])),"execute"in g&&e.actionExecutor({type:g.type,info:h,params:m,exec:g.execute.bind(null,e,m)}),A&&(a=Is(a,t,e,A,r,i))}return a}function Bt(n,t,e,s,r,i){const o=i?[]:void 0,a=Is(n,t,e,s,{internalQueue:r,deferredActorIds:i},o);return o==null||o.forEach(([c,l])=>{c.retryResolve(e,a,l)}),a}function Te(n,t,e,s){let r=n;const i=[];function o(l,u,h){e.system._sendInspectionEvent({type:"@xstate.microstep",actorRef:e.self,event:u,snapshot:l,_transitions:h}),i.push(l)}if(t.type===He)return r=wt($n(r,t,e),{status:"stopped"}),o(r,t,[]),{snapshot:r,microstates:i};let a=t;if(a.type!==ds){const l=a,u=Qi(l),h=Pn(l,r);if(u&&!h.length)return r=wt(n,{status:"error",error:l.error}),o(r,l,[]),{snapshot:r,microstates:i};r=Le(h,n,e,a,!1,s),o(r,l,h)}let c=!0;for(;r.status==="active";){let l=c?Co(r,a):[];const u=l.length?r:void 0;if(!l.length){if(!s.length)break;a=s.shift(),l=Pn(a,r)}r=Le(l,r,e,a,!1,s),c=r!==u,o(r,a,l)}return r.status!=="active"&&$n(r,a,e),{snapshot:r,microstates:i}}function $n(n,t,e){return Bt(n,t,e,Object.values(n.children).map(s=>ws(s)),[],void 0)}function Pn(n,t){return t.machine.getTransitionData(t,n)}function Co(n,t){const e=new Set,s=n._nodes.filter(ln);for(const r of s)t:for(const i of[r].concat(Yt(r,void 0)))if(i.always){for(const o of i.always)if(o.guard===void 0||cn(o.guard,n.context,t,n)){e.add(o);break t}}return Ns(Array.from(e),new Set(n._nodes),n.historyValue)}function Ro(n,t){const e=le(he(n,t));return Es(n,[...e])}function Mo(n){return!!n&&typeof n=="object"&&"machine"in n&&"value"in n}const xo=function(t){return ps(t,this.value)},$o=function(t){return this.tags.has(t)},Po=function(t){const e=this.machine.getTransitionData(this,t);return!!(e!=null&&e.length)&&e.some(s=>s.target!==void 0||s.actions.length)},Ho=function(){const{_nodes:t,tags:e,machine:s,getMeta:r,toJSON:i,can:o,hasTag:a,matches:c,...l}=this;return{...l,tags:Array.from(e)}},Wo=function(){return this._nodes.reduce((t,e)=>(e.meta!==void 0&&(t[e.id]=e.meta),t),{})};function re(n,t){return{status:n.status,output:n.output,error:n.error,machine:t,context:n.context,_nodes:n._nodes,value:Es(t.root,n._nodes),tags:new Set(n._nodes.flatMap(e=>e.tags)),children:n.children,historyValue:n.historyValue||{},matches:xo,hasTag:$o,can:Po,getMeta:Wo,toJSON:Ho}}function wt(n,t={}){return re({...n,...t},n.machine)}function Bo(n,t){const{_nodes:e,tags:s,machine:r,children:i,context:o,can:a,hasTag:c,matches:l,getMeta:u,toJSON:h,...d}=n,g={};for(const m in i){const A=i[m];g[m]={snapshot:A.getPersistedSnapshot(t),src:A.src,systemId:A._systemId,syncSnapshot:A._syncSnapshot}}return{...d,context:Os(o),children:g}}function Os(n){let t;for(const e in n){const s=n[e];if(s&&typeof s=="object")if("sessionId"in s&&"send"in s&&"ref"in s)t??(t=Array.isArray(n)?n.slice():{...n}),t[e]={xstate$$type:an,id:s.id};else{const r=Os(s);r!==s&&(t??(t=Array.isArray(n)?n.slice():{...n}),t[e]=r)}}return t??n}function Do(n,t,e,s,{event:r,id:i,delay:o},{internalQueue:a}){const c=t.machine.implementations.delays;if(typeof r=="string")throw new Error(`Only event objects may be used with raise; use raise({ type: "${r}" }) instead`);const l=typeof r=="function"?r(e,s):r;let u;if(typeof o=="string"){const h=c&&c[o];u=typeof h=="function"?h(e,s):h}else u=typeof o=="function"?o(e,s):o;return typeof u!="number"&&a.push(l),[t,{event:l,id:i,delay:u},void 0]}function Ko(n,t){const{event:e,delay:s,id:r}=t;if(typeof s=="number"){n.defer(()=>{const i=n.self;n.system.scheduler.schedule(i,i,e,s,r)});return}}function Lo(n,t){function e(s,r){}return e.type="xstate.raise",e.event=n,e.id=t==null?void 0:t.id,e.delay=t==null?void 0:t.delay,e.resolve=Do,e.execute=Ko,e}function zo(n,{machine:t,context:e},s,r){const i=(o,a)=>{if(typeof o=="string"){const c=on(t,o);if(!c)throw new Error(`Actor logic '${o}' not implemented in machine '${t.id}'`);const l=Pt(c,{id:a==null?void 0:a.id,parent:n.self,syncSnapshot:a==null?void 0:a.syncSnapshot,input:typeof(a==null?void 0:a.input)=="function"?a.input({context:e,event:s,self:n.self}):a==null?void 0:a.input,src:o,systemId:a==null?void 0:a.systemId});return r[l.id]=l,l}else return Pt(o,{id:a==null?void 0:a.id,parent:n.self,syncSnapshot:a==null?void 0:a.syncSnapshot,input:a==null?void 0:a.input,src:o,systemId:a==null?void 0:a.systemId})};return(o,a)=>{const c=i(o,a);return r[c.id]=c,n.defer(()=>{c._processingStatus!==P.Stopped&&c.start()}),c}}function jo(n,t,e,s,{assignment:r}){if(!t.context)throw new Error("Cannot assign to undefined `context`. Ensure that `context` is defined in the machine config.");const i={},o={context:t.context,event:e.event,spawn:zo(n,t,e.event,i),self:n.self,system:n.system};let a={};if(typeof r=="function")a=r(o,s);else for(const l of Object.keys(r)){const u=r[l];a[l]=typeof u=="function"?u(o,s):u}const c=Object.assign({},t.context,a);return[wt(t,{context:c,children:Object.keys(i).length?{...t.children,...i}:t.children}),void 0,void 0]}function Uo(n){function t(e,s){}return t.type="xstate.assign",t.assignment=n,t.resolve=jo,t}const Hn=new WeakMap;function Nt(n,t,e){let s=Hn.get(n);return s?t in s||(s[t]=e()):(s={[t]:e()},Hn.set(n,s)),s[t]}const Fo={},Lt=n=>typeof n=="string"?{type:n}:typeof n=="function"?"resolve"in n?{type:n.type}:{type:n.name}:n;class fn{constructor(t,e){if(this.config=t,this.key=void 0,this.id=void 0,this.type=void 0,this.path=void 0,this.states=void 0,this.history=void 0,this.entry=void 0,this.exit=void 0,this.parent=void 0,this.machine=void 0,this.meta=void 0,this.output=void 0,this.order=-1,this.description=void 0,this.tags=[],this.transitions=void 0,this.always=void 0,this.parent=e._parent,this.key=e._key,this.machine=e._machine,this.path=this.parent?this.parent.path.concat(this.key):[],this.id=this.config.id||[this.machine.id,...this.path].join(us),this.type=this.config.type||(this.config.states&&Object.keys(this.config.states).length?"compound":this.config.history?"history":"atomic"),this.description=this.config.description,this.order=this.machine.idMap.size,this.machine.idMap.set(this.id,this),this.states=this.config.states?Cn(this.config.states,(s,r)=>new fn(s,{_parent:this,_key:r,_machine:this.machine})):Fo,this.type==="compound"&&!this.config.initial)throw new Error(`No initial state specified for compound state node "#${this.id}". Try adding { initial: "${Object.keys(this.states)[0]}" } to the state config.`);this.history=this.config.history===!0?"shallow":this.config.history||!1,this.entry=et(this.config.entry).slice(),this.exit=et(this.config.exit).slice(),this.meta=this.config.meta,this.output=this.type==="final"||!this.parent?this.config.output:void 0,this.tags=et(t.tags).slice()}_initialize(){this.transitions=go(this),this.config.always&&(this.always=Tt(this.config.always).map(t=>dt(this,hs,t))),Object.keys(this.states).forEach(t=>{this.states[t]._initialize()})}get definition(){return{id:this.id,key:this.key,version:this.machine.version,type:this.type,initial:this.initial?{target:this.initial.target,source:this,actions:this.initial.actions.map(Lt),eventType:null,reenter:!1,toJSON:()=>({target:this.initial.target.map(t=>`#${t.id}`),source:`#${this.id}`,actions:this.initial.actions.map(Lt),eventType:null})}:void 0,history:this.history,states:Cn(this.states,t=>t.definition),on:this.on,transitions:[...this.transitions.values()].flat().map(t=>({...t,actions:t.actions.map(Lt)})),entry:this.entry.map(Lt),exit:this.exit.map(Lt),meta:this.meta,order:this.order||-1,output:this.output,invoke:this.invoke,description:this.description,tags:this.tags}}toJSON(){return this.definition}get invoke(){return Nt(this,"invoke",()=>et(this.config.invoke).map((t,e)=>{const{src:s,systemId:r}=t,i=t.id??Rn(this.id,e),o=typeof s=="string"?s:`xstate.invoke.${Rn(this.id,e)}`;return{...t,src:o,id:i,systemId:r,toJSON(){const{onDone:a,onError:c,...l}=t;return{...l,type:"xstate.invoke",src:o,id:i}}}}))}get on(){return Nt(this,"on",()=>[...this.transitions].flatMap(([e,s])=>s.map(r=>[e,r])).reduce((e,[s,r])=>(e[s]=e[s]||[],e[s].push(r),e),{}))}get after(){return Nt(this,"delayedTransitions",()=>po(this))}get initial(){return Nt(this,"initial",()=>yo(this,this.config.initial))}next(t,e){const s=e.type,r=[];let i;const o=Nt(this,`candidates-${s}`,()=>fo(this,s));for(const a of o){const{guard:c}=a,l=t.context;let u=!1;try{u=!c||cn(c,l,e,t)}catch(h){const d=typeof c=="string"?c:typeof c=="object"?c.type:void 0;throw new Error(`Unable to evaluate guard ${d?`'${d}' `:""}in transition for event '${s}' in state node '${this.id}':
|
|
15
|
-
${h.message}`)}if(u){r.push(...a.actions),i=a;break}}return i?[i]:void 0}get events(){return Nt(this,"events",()=>{const{states:t}=this,e=new Set(this.ownEvents);if(t)for(const s of Object.keys(t)){const r=t[s];if(r.states)for(const i of r.events)e.add(`${i}`)}return Array.from(e)})}get ownEvents(){const t=new Set([...this.transitions.keys()].filter(e=>this.transitions.get(e).some(s=>!(!s.target&&!s.actions.length&&!s.reenter))));return Array.from(t)}}const Go="#";class pn{constructor(t,e){this.config=t,this.version=void 0,this.schemas=void 0,this.implementations=void 0,this.__xstatenode=!0,this.idMap=new Map,this.root=void 0,this.id=void 0,this.states=void 0,this.events=void 0,this.id=t.id||"(machine)",this.implementations={actors:(e==null?void 0:e.actors)??{},actions:(e==null?void 0:e.actions)??{},delays:(e==null?void 0:e.delays)??{},guards:(e==null?void 0:e.guards)??{}},this.version=this.config.version,this.schemas=this.config.schemas,this.transition=this.transition.bind(this),this.getInitialSnapshot=this.getInitialSnapshot.bind(this),this.getPersistedSnapshot=this.getPersistedSnapshot.bind(this),this.restoreSnapshot=this.restoreSnapshot.bind(this),this.start=this.start.bind(this),this.root=new fn(t,{_key:this.id,_machine:this}),this.root._initialize(),this.states=this.root.states,this.events=this.root.events}provide(t){const{actions:e,guards:s,actors:r,delays:i}=this.implementations;return new pn(this.config,{actions:{...e,...t.actions},guards:{...s,...t.guards},actors:{...r,...t.actors},delays:{...i,...t.delays}})}resolveState(t){const e=Ro(this.root,t.value),s=le(he(this.root,e));return re({_nodes:[...s],context:t.context||{},children:{},status:un(s,this.root)?"done":t.status||"active",output:t.output,error:t.error,historyValue:t.historyValue},this)}transition(t,e,s){return Te(t,e,s,[]).snapshot}microstep(t,e,s){return Te(t,e,s,[]).microstates}getTransitionData(t,e){return hn(this.root,t.value,t,e)||[]}getPreInitialState(t,e,s){const{context:r}=this.config,i=re({context:typeof r!="function"&&r?r:{},_nodes:[this.root],children:{},status:"active"},this);return typeof r=="function"?Bt(i,e,t,[Uo(({spawn:a,event:c,self:l})=>r({spawn:a,input:c.input,self:l}))],s,void 0):i}getInitialSnapshot(t,e){const s=fs(e),r=[],i=this.getPreInitialState(t,s,r),o=Le([{target:[...Ss(this.root)],source:this.root,reenter:!0,actions:[],eventType:null,toJSON:null}],i,t,s,!0,r),{snapshot:a}=Te(o,s,t,r);return a}start(t){Object.values(t.children).forEach(e=>{e.getSnapshot().status==="active"&&e.start()})}getStateNodeById(t){const e=rn(t),s=e.slice(1),r=me(e[0])?e[0].slice(Go.length):e[0],i=this.idMap.get(r);if(!i)throw new Error(`Child state node '#${r}' does not exist on machine '${this.id}'`);return ue(i,s)}get definition(){return this.root.definition}toJSON(){return this.definition}getPersistedSnapshot(t,e){return Bo(t,e)}restoreSnapshot(t,e){const s={},r=t.children;Object.keys(r).forEach(c=>{const l=r[c],u=l.snapshot,h=l.src,d=typeof h=="string"?on(this,h):h;if(!d)return;const
|
|
12
|
+
`):(this.indentate=function(){return""},this.tagEndChar=">",this.newLine="")}it.prototype.build=function(n){return this.options.preserveOrder?Yr(n,this.options):(Array.isArray(n)&&this.options.arrayNodeName&&this.options.arrayNodeName.length>1&&(n={[this.options.arrayNodeName]:n}),this.j2x(n,0,[]).val)};it.prototype.j2x=function(n,t,e){let s="",r="";const i=e.join(".");for(let o in n)if(Object.prototype.hasOwnProperty.call(n,o))if(typeof n[o]>"u")this.isAttribute(o)&&(r+="");else if(n[o]===null)this.isAttribute(o)||o===this.options.cdataPropName?r+="":o[0]==="?"?r+=this.indentate(t)+"<"+o+"?"+this.tagEndChar:r+=this.indentate(t)+"<"+o+"/"+this.tagEndChar;else if(n[o]instanceof Date)r+=this.buildTextValNode(n[o],o,"",t);else if(typeof n[o]!="object"){const a=this.isAttribute(o);if(a&&!this.ignoreAttributesFn(a,i))s+=this.buildAttrPairStr(a,""+n[o]);else if(!a)if(o===this.options.textNodeName){let c=this.options.tagValueProcessor(o,""+n[o]);r+=this.replaceEntitiesValue(c)}else r+=this.buildTextValNode(n[o],o,"",t)}else if(Array.isArray(n[o])){const a=n[o].length;let c="",l="";for(let u=0;u<a;u++){const h=n[o][u];if(!(typeof h>"u"))if(h===null)o[0]==="?"?r+=this.indentate(t)+"<"+o+"?"+this.tagEndChar:r+=this.indentate(t)+"<"+o+"/"+this.tagEndChar;else if(typeof h=="object")if(this.options.oneListGroup){const d=this.j2x(h,t+1,e.concat(o));c+=d.val,this.options.attributesGroupName&&h.hasOwnProperty(this.options.attributesGroupName)&&(l+=d.attrStr)}else c+=this.processTextOrObjNode(h,o,t,e);else if(this.options.oneListGroup){let d=this.options.tagValueProcessor(o,h);d=this.replaceEntitiesValue(d),c+=d}else c+=this.buildTextValNode(h,o,"",t)}this.options.oneListGroup&&(c=this.buildObjectNode(c,o,l,t)),r+=c}else if(this.options.attributesGroupName&&o===this.options.attributesGroupName){const a=Object.keys(n[o]),c=a.length;for(let l=0;l<c;l++)s+=this.buildAttrPairStr(a[l],""+n[o][a[l]])}else r+=this.processTextOrObjNode(n[o],o,t,e);return{attrStr:s,val:r}};it.prototype.buildAttrPairStr=function(n,t){return t=this.options.attributeValueProcessor(n,""+t),t=this.replaceEntitiesValue(t),this.options.suppressBooleanAttributes&&t==="true"?" "+n:" "+n+'="'+t+'"'};function ei(n,t,e,s){const r=this.j2x(n,e+1,s.concat(t));return n[this.options.textNodeName]!==void 0&&Object.keys(n).length===1?this.buildTextValNode(n[this.options.textNodeName],t,r.attrStr,e):this.buildObjectNode(r.val,t,r.attrStr,e)}it.prototype.buildObjectNode=function(n,t,e,s){if(n==="")return t[0]==="?"?this.indentate(s)+"<"+t+e+"?"+this.tagEndChar:this.indentate(s)+"<"+t+e+this.closeTag(t)+this.tagEndChar;{let r="</"+t+this.tagEndChar,i="";return t[0]==="?"&&(i="?",r=""),(e||e==="")&&n.indexOf("<")===-1?this.indentate(s)+"<"+t+e+i+">"+n+r:this.options.commentPropName!==!1&&t===this.options.commentPropName&&i.length===0?this.indentate(s)+`<!--${n}-->`+this.newLine:this.indentate(s)+"<"+t+e+i+this.tagEndChar+n+this.indentate(s)+r}};it.prototype.closeTag=function(n){let t="";return this.options.unpairedTags.indexOf(n)!==-1?this.options.suppressUnpairedNode||(t="/"):this.options.suppressEmptyNode?t="/":t=`></${n}`,t};it.prototype.buildTextValNode=function(n,t,e,s){if(this.options.cdataPropName!==!1&&t===this.options.cdataPropName)return this.indentate(s)+`<![CDATA[${n}]]>`+this.newLine;if(this.options.commentPropName!==!1&&t===this.options.commentPropName)return this.indentate(s)+`<!--${n}-->`+this.newLine;if(t[0]==="?")return this.indentate(s)+"<"+t+e+"?"+this.tagEndChar;{let r=this.options.tagValueProcessor(t,n);return r=this.replaceEntitiesValue(r),r===""?this.indentate(s)+"<"+t+e+this.closeTag(t)+this.tagEndChar:this.indentate(s)+"<"+t+e+">"+r+"</"+t+this.tagEndChar}};it.prototype.replaceEntitiesValue=function(n){if(n&&n.length>0&&this.options.processEntities)for(let t=0;t<this.options.entities.length;t++){const e=this.options.entities[t];n=n.replace(e.regex,e.val)}return n};function ni(n){return this.options.indentBy.repeat(n)}function si(n){return n.startsWith(this.options.attributeNamePrefix)&&n!==this.options.textNodeName?n.substr(this.attrPrefixLen):!1}class ot{constructor(t){_(this,"type");_(this,"attrs",{});_(this,"styles",{});_(this,"deleteMarker",!1);this.type=t}dx(t){return this.attrs.x==null?this.attrs.x=t:this.attrs.x+=t,this}dy(t){return this.attrs.y==null?this.attrs.y=t:this.attrs.y+=t,this}x(t){return this.attrs.x=t,this}y(t){return this.attrs.y=t,this}size(t,e){return this.attrs.width=t,this.attrs.height=e,this}remove(){this.deleteMarker=!0}left(...t){return`<${[this.type,Vn(this.attrs),pi(this.styles),...t].filter(e=>e!="").join(" ")}>`}right(){return`</${this.type}>`}center(){return""}toString(){return this.deleteMarker?"":`${this.left()}${this.center()}${this.right()}`}attr(t){if(typeof t=="string")return this.attrs[t]??"";for(const[e,s]of Object.entries(t))this.attrs[e]=s;return this}css(t){return this.styles={...this.styles,...t},this}svg(){return this.toString()}}class qe extends ot{constructor(e){super("image");_(this,"attrs",{});this.attrs={...this.attrs,href:e}}load(e){return this.attrs.href=e,this}}class ge extends ot{constructor(e){super("use");_(this,"attrs",{});this.attrs={...this.attrs,href:this.make(e)}}use(e){return this.attrs.href=`#${e}`,this}make(e){return e==null?e:`#${e}`}}class Qe extends ot{constructor(){super("rect");_(this,"attrs",{})}fill(e){return this.attrs.fill=e,this}stroke(e){return this.attrs.stroke=e,this}}class yt extends ot{constructor(e=""){super("text");_(this,"attrs");_(this,"_text","");this._text=e,this.attrs={}}plain(e){return this._text=e,this}font(e){return this.attrs.fontFamily=e.family,this.attrs.fontSize=e.size,this}center(){return this._text}}let tn=class extends ot{constructor(e){super("symbol");_(this,"raw");this.raw=e}id(){return this.attr("id")}center(){return this.raw}};class T extends ot{constructor(){super("g");_(this,"children",[]);_(this,"rotateMatrix");_(this,"translateMatrix")}add(e){return this.children.push(e),this}rotate(e,s,r){return this.rotateMatrix=Ys(e,s,r),this}translate(e,s){return this.translateMatrix=Oe(e,s),this}center(){return this.children.map(e=>e.toString()).join("")}left(...e){const s=[this.translateMatrix,this.rotateMatrix].filter(r=>r!=null);return s.length==0?super.left():super.left(fi(Gs(s)))}each(e,s){for(let r=0;r<this.children.length;r++){const i=this.children[r];i instanceof T&&s&&i.each(e,!0),e(r,this.children)}}}const ri=['xmlns="http://www.w3.org/2000/svg"','version="1.1"','xmlns:xlink="http://www.w3.org/1999/xlink"'];class Gn extends ot{constructor(){super("svg");_(this,"children",[]);_(this,"viewBox")}add(e){return this.children.push(e),this}center(){return this.children.map(e=>e.toString()).join("")}left(...e){return`<${[this.type,...ri,Vn(this.attrs),di(this.viewBox)].filter(s=>s!="").join(" ")}>`}viewbox(e,s,r,i){return this.viewBox={x:e,y:s,width:r,height:i},this}importSymbol(e){for(const s of gi(e))this.add(s);return this}x(e){throw new Error("unimplemented")}y(e){throw new Error("unimplemented")}dx(e){throw new Error("unimplemented")}dy(e){throw new Error("unimplemented")}each(e,s){for(let r=0;r<this.children.length;r++){const i=this.children[r];i instanceof T&&s&&i.each(e,!0),e(r,this.children)}}}function Zn(){return new Gn}const ii=Zn,oi=T,ai=qe,ci=ge,li=Qe,ui=yt;function hi(n){return n.replace(/[A-Z]/g,t=>"-"+t.toLowerCase())}function di(n){return n==null?"":`viewBox="${n.x} ${n.y} ${n.width} ${n.height}"`}function fi(n){return n==null?"":`transform="${qs(n)}"`}function Vn(n){return Object.entries(n).filter(([t,e])=>e!==void 0).map(([t,e])=>`${hi(t)}="${e}"`).join(" ")}function pi(n){const t=Object.entries(n).map(([e,s])=>`${e}: ${s};`).join(" ");return t!=""?`style="${t}"`:""}function*gi(n){const t=new Jr({ignoreAttributes:!1}),e=new it({ignoreAttributes:!1}),s=t.parse(n);for(const r of s.svg.symbol){const i=e.build(r),o=new tn(i);for(const[a,c]of Object.entries(r))a.startsWith("@_")&&(o.attrs[a.substring(2)]=c);yield o}}const U=(n,t)=>{const e=B(n.tiles[0],t),s=e.baseHeight,r=e.baseWidth;if(n.is(b.SHO_KAN))return{width:r*2+s,height:Math.max(r*2,s)};const i=n.tiles.reduce((a,c)=>{const l=B(c,t).height;return l>a?l:a},0);return{width:n.tiles.reduce((a,c)=>a+B(c,t).width,0),height:i}},B=(n,t)=>{const e=parseFloat((nt.HEIGHT*t).toPrecision(5)),s=parseFloat((nt.WIDTH*t).toPrecision(5)),r=n.has(g.HORIZONTAL)?{width:e,height:s,baseWidth:s,baseHeight:e}:{width:s,height:e,w:s,baseWidth:s,baseHeight:e};return(n.has(g.TSUMO)||n.has(g.DORA))&&(r.width+=s*nt.TEXT_SCALE),r};class Ct{constructor(t={}){_(this,"tileWidth");_(this,"tileHeight");_(this,"imageHostUrl");_(this,"imageExt");_(this,"scale");_(this,"svgSprite");this.scale=t.scale??1,this.imageHostUrl=t.imageHostUrl??"",this.imageExt=t.imageExt??"svg",this.tileWidth=nt.WIDTH*this.scale,this.tileHeight=nt.HEIGHT*this.scale,this.svgSprite=t.svgSprite??!1}getDiffTileHeightWidth(t){const e=B(t,this.scale);return(e.baseHeight-e.baseWidth)/2}image(t){let e=new qe().load(this.buildURL(t));return this.svgSprite&&(e=new ge().use(Ct.buildID(t))),t instanceof w&&t.has(g.COLOR_GRAYSCALE)&&e.css({filter:"contrast(65%)"}),e}createImage(t,e,s){const r=B(t,this.scale);return this.image(t).dx(e).dy(s).size(r.baseWidth,r.baseHeight)}createTextImage(t,e,s,r){const i=this.createImage(t,e,s),o=B(t,this.scale),a=o.baseHeight*.2,c=o.baseWidth,l=o.baseHeight,u=new yt().plain(r);u.size(o.baseWidth,o.baseHeight).font({family:Ue,size:a}).dx(c).dy(l);const h=new T;return h.add(i).add(u).translate(e,s),h}createRotate90Image(t,e,s,r=!1){const i=this.createImage(t,0,0),o=B(t,this.scale),a=o.baseWidth/2,c=o.baseHeight/2,l=e+this.getDiffTileHeightWidth(t),u=r?s-this.getDiffTileHeightWidth(t):s,h=new T;return h.add(i).translate(l,u).rotate(90,a,c),h}createStick(t){return this.image(t)}static buildID(t){if(t==100||t==1e3)return t==100?"stick100":"stick1000";const e=t.t==p.BACK||t.has(g.RED)?0:t.n;return`${t.t}${e}`}buildURL(t){const e=`${Ct.buildID(t)}.${this.imageExt}`;return this.imageHostUrl!=""?`${this.imageHostUrl}${e}`:e}}class en extends Ct{constructor(){super(...arguments);_(this,"blockMargin",nt.WIDTH*nt.BLOCK_MARGIN_SCALE*this.scale)}createBlockHandDiscard(e){const s=e instanceof R?e.tilesWithBack:e.tiles,r=new T;let i=0;for(const o of s){const a=B(o,this.scale),c=o.has(g.HORIZONTAL)?this.createRotate90Image.bind(this):this.createImage.bind(this),l=o.has(g.HORIZONTAL)?this.getDiffTileHeightWidth(o):0,u=c(o,i,l);r.add(u),i+=a.width}return r}createBlockPonChiKan(e){const s=e.tiles.findIndex(o=>o.has(g.HORIZONTAL));let r=0;const i=new T;if(e.type==b.SHO_KAN){let o=s;for(let a=0;a<e.tiles.length;a++)e.tiles[a].has(g.HORIZONTAL)&&(o=a);for(let a=0;a<e.tiles.length;a++){const c=B(e.tiles[a],this.scale);if(a==o)continue;if(a==s){const h=e.tiles[s],d=e.tiles[o],y=B(h,this.scale),f=this.createRotate90Image(h,0,0,!0),m=this.createRotate90Image(d,0,y.height,!0);i.add(new T().translate(r,0).add(f).add(m)),r+=y.width;continue}const l=c.width*2-c.height,u=this.createImage(e.tiles[a],r,l);r+=c.width,i.add(u)}return i}if(e.type==b.CHI){const o=e.tiles[s],a=this.createRotate90Image(o,r,this.getDiffTileHeightWidth(o));r+=B(o,this.scale).width,i.add(a);for(let c=0;c<e.tiles.length;c++){if(c==s)continue;const l=e.tiles[c],u=B(l,this.scale),h=this.createImage(l,r,0);r+=u.width,i.add(h)}return i}for(let o=0;o<e.tiles.length;o++){const a=o==s?this.createRotate90Image.bind(this):this.createImage.bind(this),c=e.tiles[o],l=o==s?this.getDiffTileHeightWidth(c):0,u=B(c,this.scale),h=a(c,r,l);r+=u.width,i.add(h)}return i}}const yi=(n,t)=>{const e=n.scale;return{[b.CHI]:function(r){const i=U(r,e),o=n.createBlockPonChiKan(r);return{...i,e:o}},[b.PON]:function(r){const i=U(r,e),o=n.createBlockPonChiKan(r);return{...i,e:o}},[b.DAI_KAN]:function(r){const i=U(r,e),o=n.createBlockPonChiKan(r);return{...i,e:o}},[b.SHO_KAN]:function(r){const i=U(r,e),o=n.createBlockPonChiKan(r);return{...i,e:o}},[b.AN_KAN]:function(r){N(r instanceof R,`block type is not ankan: ${r.type}`);const i=U(r,e),o=n.createBlockHandDiscard(r);return{...i,e:o}},[b.IMAGE_DORA]:function(r){r=(t==null?void 0:t.doraText)==!1?new kt([r.tiles[0].clone({remove:g.DORA})]):r;const i=U(r,e),o=new T,a=(t==null?void 0:t.doraText)===!1?n.createImage(r.tiles[0],0,0):n.createTextImage(r.tiles[0],0,0,"(ドラ)");return o.add(a),{...i,e:o}},[b.TSUMO]:function(r){r=(t==null?void 0:t.tsumoText)==!1?new kt([r.tiles[0].clone({remove:g.TSUMO})]):r;const i=U(r,e),o=new T,a=(t==null?void 0:t.tsumoText)===!1?n.createImage(r.tiles[0],0,0):n.createTextImage(r.tiles[0],0,0,"(ツモ)");return o.add(a),{...i,e:o}},[b.HAND]:function(r){const i=U(r,e),o=n.createBlockHandDiscard(r);return{...i,e:o}},[b.IMAGE_DISCARD]:function(r){const i=U(r,e),o=n.createBlockHandDiscard(r);return{...i,e:o}},[b.THREE]:function(r){throw new Error("three is unsupported")},[b.RUN]:function(r){throw new Error("run is unsupported")},[b.PAIR]:function(r){throw new Error("pair is unsupported")},[b.ISOLATED]:function(r){throw new Error("isolated is unsupported")},[b.UNKNOWN]:function(r){if(r.tiles.some(a=>a.has(g.TSUMO)||a.has(g.DORA)))throw new Error("found an unknown block with operator tiles");const i=U(r,e),o=n.createBlockHandDiscard(r);return{...i,e:o}}}},vt=(n,t,e)=>{const s=yi(n,e);let r=0,i=0;const o=[];for(const h of t){const d=s[h.type],y=d(h);i+=y.width,r=y.height>r?y.height:r,o.push(y)}const a=r,c=i+(t.length-1)*n.blockMargin,l=new T;let u=0;for(const h of o){const d=a-h.height,y=new T().translate(u,d);y.add(h.e),l.add(y),u+=h.width+n.blockMargin}return{e:l,width:c,height:a}},mi=(n,t,e={},s={responsive:!1,doraText:!0,tsumoText:!0})=>{const r=new en(e),i=vt(r,t,s);s.responsive||n.size(i.width,i.height),n.viewbox(0,0,i.width,i.height),n.add(i.e)},Jn=()=>{const n=[0,1,2,3,4,5,6,7,8,9],t=[];for(const e of Object.values(p)){if(e==p.BACK){t.push(Ct.buildID(new w(e,0)));continue}t.push(...n.map(s=>Ct.buildID(new w(e,s))).flat())}return t},wi=n=>{const t=Jn(),e=[];return n.each((s,r)=>{const i=r[s];if(i instanceof ge){const a=i.attr("href").substring(1);t.includes(a)&&e.push(a)}},!0),e},bi=n=>{const t=Jn(),e=wi(n);n.each((s,r)=>{const i=r[s];i instanceof tn&&(t.includes(i.id())&&e.includes(i.id())||i.remove())},!0)},_i=n=>{const e=[];for(let s=0;s<n.length;s+=6){const r=n.slice(s,s+6);e.push(r)}return e},j=(n,t,e,s,r=0,i=0)=>{const o=new T().add(n);if(s==90){const a=r,c=i-e;return o.rotate(s,0,e).translate(a,c),new T().add(o)}if(s==180){const a=r+t,c=i-e;return o.rotate(s,0,e).translate(a,c),new T().add(o)}if(s==270){const a=r+e,c=i+(t-e);return o.rotate(s,0,e).translate(a,c),new T().add(o)}return new T().add(o)},Qt=(n,t)=>{const e=new T,s=_i(n);for(let r=0;r<s.length;r++){let i=s[r],o=r*t.tileHeight;const a=t.createBlockHandDiscard(new Ve(i,b.IMAGE_DISCARD)).translate(0,o);e.add(a)}return{e,width:t.tileWidth*5+t.tileHeight*1,height:t.tileHeight*s.length}},Ei=(n,t,e)=>{const s=t.font,r=t.textWidth,i=t.textHeight,o=e.sticks.dead,a=e.sticks.reach,c=ve.WIDTH*n.scale,l=ve.HEIGHT*n.scale;let u=r*3,h=i;const d=(c+n.tileWidth+r-u)/2,y=new yt().plain(e.round).font(s).x(d).y(0);h+=25*n.scale;const f=n.tileHeight,m=new T().size(c,f).translate(0,h),A={family:s.family,size:s.size*.7},S=n.createStick(1e3).size(c,l).x(0).y(0),O=new yt().plain(a.toString()).font(A).dx(c).dy(l),M=n.createStick(100).size(c,l).x(0).y(l+l),Et=new yt().plain(o.toString()).font(A).dx(c).dy(l*3);m.add(S),m.add(O),m.add(M),m.add(Et);const At=n.createImage(e.doras[0],0,0).x(c+r).y(0);m.add(At);const St=new T;return St.add(y),St.add(y),St.add(m),{e:St,width:c+n.tileWidth+r,height:h+n.tileHeight}},Ai=(n,t,e=0)=>{const s=vt(n,t.front),r=vt(n,t.right),i=vt(n,t.opposite),o=vt(n,t.left),a=[s.width,r.width,i.width,o.width].reduce((m,A)=>Math.max(m,A)),c=Math.max(e+n.tileHeight*2+n.blockMargin*2,a+n.tileWidth*2+n.blockMargin),l=c,u=j(s.e,s.width,s.height,0).translate((c-s.width)/2,l-s.height),h=j(r.e,r.width,r.height,270).translate(c-r.height,(c-r.width)/2),d=j(i.e,i.width,i.height,180).translate((c-i.width)/2,0),y=j(o.e,o.width,o.height,90).translate(0,(c-o.width)/2),f=new T().size(c,l);return f.add(u),f.add(h),f.add(d),f.add(y),{e:new T().add(f),width:c,height:l}},Si=n=>{const t=Object.values(de),e=t.indexOf(n);return[...t.slice(e),...t.slice(0,e)]},Ni=(n,t,e)=>{const s=n.tileWidth*5+n.tileHeight*1,r=t.font,i=t.textWidth,o=t.textHeight,a=t.numWidth,c=Ei(n,t,e);c.e.translate(s/2-c.width/2,s/2-c.height/2);const l=(Ms,yn,xs)=>{const $s=`${Ms} ${yn}`,Ps=new yt().plain($s).font(r).attr(xs);return{e:new T().add(Ps),width:i+a*yn.toString().length,height:o}},[u,h,d,y]=Si(e.frontPlace),f=e.scores,A=l(u,f.front,{x:s/2,y:s,"dominant-baseline":"text-after-edge","text-anchor":"middle"}).e;let S=l(h,f.right,{"dominant-baseline":"text-after-edge","text-anchor":"middle"});const O=j(S.e,S.width,S.height,270).translate(s,s/2-S.width);let M=l(d,f.opposite,{"text-anchor":"middle","dominant-baseline":"text-after-edge"});const Et=j(M.e,M.width,M.height,180).translate(s/2-M.width,-M.height);let At=l(y,f.left,{"dominant-baseline":"ideographic","text-anchor":"middle"});const St=j(At.e,At.width,At.height,90).translate(-At.height,s/2),at=new T,Rs=new Qe().size(s,s).x(0).y(0).fill("none").stroke("#000000");return at.add(Rs),at.add(c.e),at.add(A),at.add(O),at.add(Et),at.add(St),{e:at,width:s,height:s}},Ti=(n,t)=>{const e=Qt(t.front,n),s=Qt(t.right,n),r=Qt(t.opposite,n),i=Qt(t.left,n),o=[e.height,s.height,r.height,i.height].reduce((O,M)=>Math.max(O,M)),a=n.tileWidth*5+n.tileHeight*1,c=o,l=a+o*2+n.blockMargin,u=l,h=new T().size(l,u),d=l/2-a/2,y=u/2-a/2,f=j(e.e,a,c,0).translate(d,u-c),m=j(s.e,a,c,270).translate(l-c,y),A=j(r.e,a,c,180).translate(d,0),S=j(i.e,a,c,90).translate(0,y);return h.add(f),h.add(m),h.add(A),h.add(S),{e:new T().add(h),width:l,height:u}},Xn=(n,t,e,s,r)=>{const i=new T,o=Ti(n,s),a=Ai(n,e,o.height),c=Ni(n,t,r);return o.e.translate((a.width-o.width)/2,(a.height-o.height)/2),c.e.translate((a.width-c.width)/2,(a.height-c.height)/2),i.add(a.e),i.add(o.e),i.add(c.e),{e:i,width:a.width,height:a.height}},vi=(n,t,e={},s,r={responsive:!1})=>{const i=new en(e),o=s,{discards:a,hands:c,scoreBoard:l}=Qn(t),u=Xn(i,o,c,a,l);r.responsive||n.size(u.width,u.height),n.viewbox(0,0,u.width,u.height),n.add(u.e)};var J;function Yn(n){return{lang:(n==null?void 0:n.lang)??(J==null?void 0:J.lang),message:n==null?void 0:n.message,abortEarly:(n==null?void 0:n.abortEarly)??(J==null?void 0:J.abortEarly),abortPipeEarly:(n==null?void 0:n.abortPipeEarly)??(J==null?void 0:J.abortPipeEarly)}}var _e;function Ii(n){return _e==null?void 0:_e.get(n)}var Ee;function Oi(n){return Ee==null?void 0:Ee.get(n)}var Ae;function ki(n,t){var e;return(e=Ae==null?void 0:Ae.get(n))==null?void 0:e.get(t)}function Rt(n){var e,s;const t=typeof n;return t==="string"?`"${n}"`:t==="number"||t==="bigint"||t==="boolean"?`${n}`:t==="object"||t==="function"?(n&&((s=(e=Object.getPrototypeOf(n))==null?void 0:e.constructor)==null?void 0:s.name))??"null":t}function st(n,t,e,s,r){const i=r&&"input"in r?r.input:e.value,o=(r==null?void 0:r.expected)??n.expects??null,a=(r==null?void 0:r.received)??Rt(i),c={kind:n.kind,type:n.type,input:i,expected:o,received:a,message:`Invalid ${t}: ${o?`Expected ${o} but r`:"R"}eceived ${a}`,requirement:n.requirement,path:r==null?void 0:r.path,issues:r==null?void 0:r.issues,lang:s.lang,abortEarly:s.abortEarly,abortPipeEarly:s.abortPipeEarly},l=n.kind==="schema",u=(r==null?void 0:r.message)??n.message??ki(n.reference,c.lang)??(l?Oi(c.lang):null)??s.message??Ii(c.lang);u!==void 0&&(c.message=typeof u=="function"?u(c):u),l&&(e.typed=!1),e.issues?e.issues.push(c):e.issues=[c]}function Dt(n){return{version:1,vendor:"valibot",validate(t){return n["~run"]({value:t},Yn())}}}function Ci(n,t){const e=[...new Set(n)];return e.length>1?`(${e.join(` ${t} `)})`:e[0]??"never"}function Re(n,t){return{kind:"validation",type:"max_value",reference:Re,async:!1,expects:`<=${n instanceof Date?n.toJSON():Rt(n)}`,requirement:n,message:t,"~run"(e,s){return e.typed&&!(e.value<=this.requirement)&&st(this,"value",e,s,{received:e.value instanceof Date?e.value.toJSON():Rt(e.value)}),e}}}function Me(n,t){return{kind:"validation",type:"min_value",reference:Me,async:!1,expects:`>=${n instanceof Date?n.toJSON():Rt(n)}`,requirement:n,message:t,"~run"(e,s){return e.typed&&!(e.value>=this.requirement)&&st(this,"value",e,s,{received:e.value instanceof Date?e.value.toJSON():Rt(e.value)}),e}}}function Ri(n,t,e){return typeof n.fallback=="function"?n.fallback(t,e):n.fallback}function qn(n,t,e){return typeof n.default=="function"?n.default(t,e):n.default}function ae(n){return{kind:"schema",type:"number",reference:ae,expects:"number",async:!1,message:n,get"~standard"(){return Dt(this)},"~run"(t,e){return typeof t.value=="number"&&!isNaN(t.value)?t.typed=!0:st(this,"type",t,e),t}}}function K(n,t){return{kind:"schema",type:"optional",reference:K,expects:`(${n.expects} | undefined)`,async:!1,wrapped:n,default:t,get"~standard"(){return Dt(this)},"~run"(e,s){return e.value===void 0&&(this.default!==void 0&&(e.value=qn(this,e,s)),e.value===void 0)?(e.typed=!0,e):this.wrapped["~run"](e,s)}}}function xe(n,t){return{kind:"schema",type:"picklist",reference:xe,expects:Ci(n.map(Rt),"|"),async:!1,options:n,message:t,get"~standard"(){return Dt(this)},"~run"(e,s){return this.options.includes(e.value)?e.typed=!0:st(this,"type",e,s),e}}}function Mt(n,t){return{kind:"schema",type:"strict_object",reference:Mt,expects:"Object",async:!1,entries:n,message:t,get"~standard"(){return Dt(this)},"~run"(e,s){var i;const r=e.value;if(r&&typeof r=="object"){e.typed=!0,e.value={};for(const o in this.entries){const a=this.entries[o];if(o in r||(a.type==="exact_optional"||a.type==="optional"||a.type==="nullish")&&a.default!==void 0){const c=o in r?r[o]:qn(a),l=a["~run"]({value:c},s);if(l.issues){const u={type:"object",origin:"value",input:r,key:o,value:c};for(const h of l.issues)h.path?h.path.unshift(u):h.path=[u],(i=e.issues)==null||i.push(h);if(e.issues||(e.issues=l.issues),s.abortEarly){e.typed=!1;break}}l.typed||(e.typed=!1),e.value[o]=l.value}else if(a.fallback!==void 0)e.value[o]=Ri(a);else if(a.type!=="exact_optional"&&a.type!=="optional"&&a.type!=="nullish"&&(st(this,"key",e,s,{input:void 0,expected:`"${o}"`,path:[{type:"object",origin:"key",input:r,key:o,value:r[o]}]}),s.abortEarly))break}if(!e.issues||!s.abortEarly){for(const o in r)if(!(o in this.entries)){st(this,"key",e,s,{input:o,expected:"never",path:[{type:"object",origin:"key",input:r,key:o,value:r[o]}]});break}}}else st(this,"type",e,s);return e}}}function ce(n){return{kind:"schema",type:"string",reference:ce,expects:"string",async:!1,message:n,get"~standard"(){return Dt(this)},"~run"(t,e){return typeof t.value=="string"?t.typed=!0:st(this,"type",t,e),t}}}function Tn(...n){return{...n[0],pipe:n,get"~standard"(){return Dt(this)},"~run"(t,e){for(const s of n)if(s.kind!=="metadata"){if(t.issues&&(s.kind==="schema"||s.kind==="transformation")){t.typed=!1;break}(!t.issues||!e.abortEarly&&!e.abortPipeEarly)&&(t=s["~run"](t,e))}return t}}}function Mi(n,t,e){const s=n["~run"]({value:t},Yn(e));return{typed:s.typed,success:!s.issues,output:s.value,issues:s.issues}}const te=K(Mt({discard:K(ce(),""),hand:K(ce(),""),score:K(ae(),25e3)}),{discard:"",hand:"",score:25e3}),xi=Mt({[E.E]:te,[E.S]:te,[E.W]:te,[E.N]:te}),ct={round:k.E1,sticks:{reach:0,dead:0},doras:E.S,front:E.E},$i=K(Mt({round:K(xe(Object.keys(Fe)),ct.round),sticks:K(Mt({reach:K(Tn(ae(),Me(0,""),Re(9,"")),ct.sticks.reach),dead:K(Tn(ae(),Me(0,""),Re(9,"")),ct.sticks.dead)}),ct.sticks),doras:K(ce(),ct.doras),front:K(xe(Object.keys(de)),ct.front)}),ct),Pi=Mt({...xi.entries,board:$i}),Qn=n=>{const t=ts(n);return es(t)},ts=n=>{const t=Hi(n),e=Mi(Pi,t);if(!e.success)throw e.issues;return e.output},Hi=n=>{const t="table",e="board",s=n.split(`
|
|
13
|
+
`).map(a=>a.trim()).filter(a=>a!="");if(s.length==0)throw new Error("empty input");const r=s.shift();if(!r.startsWith(t))throw new Error(`input does not start with table: ${r}`);const i={};let o=[E.E,E.S,E.W,E.N,e];for(;;){const a=s.shift();if(a==null)break;const c=o.find(l=>a.startsWith(l));if(c==null)throw new Error(`encountered unexpected line ${a}`);if(o=o.filter(l=>!a.startsWith(l)),c==e){const[l,u]=Bi([...s]);i.board=l;for(let h=0;h<u;h++)s.shift()}else{const[l,u]=Wi([...s]);i[c]=l;for(let h=0;h<u;h++)s.shift()}}return i},F=(n,t)=>n.replace(t,"").replace(":","").trim(),Wi=n=>{const t="hand",e="discard",s="score",r={};let i=0;for(;i<n.length;i++){const o=n[i];if(o.startsWith(t))r.hand=F(o,t);else if(o.startsWith(e))r.discard=F(o,e);else if(o.startsWith(s))r.score=Number(F(o,s));else break}return[r,i]},Bi=n=>{const t="doras",e="round",s="front",r="sticks",i="reach",o="dead",a={};let c=0;for(;c<n.length;c++){const l=n[c];if(l.startsWith(t))a.doras=F(l,t);else if(l.startsWith(e))a.round=F(l,e);else if(l.startsWith(s))a.front=F(l,s);else if(l.startsWith(r)){a.sticks={};const u=n[c+1]??"",h=n[c+2]??"";u.startsWith(i)&&(a.sticks.reach=Number(F(u,i))),u.startsWith(o)&&(a.sticks.dead=Number(F(u,o))),h.startsWith(i)&&(a.sticks.reach=Number(F(h,i))),h.startsWith(o)&&(a.sticks.dead=Number(F(h,o))),a.sticks.dead!=null&&c++,a.sticks.reach!=null&&c++}else break}return[a,c]},es=n=>{const t=n.board.front,e=Di(t),s=a=>n[a].discard.replace(/\r?\n/g,""),r={front:new W(s(e.front)).tiles(),right:new W(s(e.right)).tiles(),opposite:new W(s(e.opposite)).tiles(),left:new W(s(e.left)).tiles()},i={front:new W(n[e.front].hand).parse(),right:new W(n[e.right].hand).parse(),opposite:new W(n[e.opposite].hand).parse(),left:new W(n[e.left].hand).parse()},o={round:Fe[n.board.round],frontPlace:de[t],sticks:n.board.sticks,doras:new W(n.board.doras).tiles(),scores:{front:n[e.front].score,right:n[e.right].score,opposite:n[e.opposite].score,left:n[e.left].score}};return{discards:r,hands:i,scoreBoard:o}},Di=n=>({front:n,right:gt(n),opposite:gt(gt(n)),left:fe(n)});function*L(n){const t=n!=null&&n.filterBy&&n.filterBy.length>0?n==null?void 0:n.filterBy:Object.values(p);for(const e of t){if(n!=null&&n.skipBack&&e==p.BACK)continue;const s=e==p.Z?7:e==p.BACK?1:9;for(let r=1;r<=s;r++)yield[e,r]}}class ye{constructor(t,e=!1){_(this,"data");this.data={[p.M]:[0,0,0,0,0,0,0,0,0,0],[p.P]:[0,0,0,0,0,0,0,0,0,0],[p.S]:[0,0,0,0,0,0,0,0,0,0],[p.Z]:[0,0,0,0,0,0,0,0],[p.BACK]:["untouchable",0],called:[],reached:!1,tsumo:null},this.init(t,e)}init(t,e){const s=Array.isArray(t)?t:new W(t).parse();for(const r of s){if(r.isCalled()){this.data.called=[...this.called,r];continue}else if(r.is(b.TSUMO)){const i=r.tiles[0];this.inc([i]),this.data.tsumo=i;continue}else if(r.is(b.HAND)){this.inc(r.tiles);continue}else if(!Array.isArray(t)&&t.split("").every(i=>i===p.BACK)){this.inc(r.tiles);continue}else if(e){this.inc(r.tiles);continue}throw new Error(`unexpected block ${r.type} ${r.toString()}`)}}get hands(){const t=[];for(const[e,s]of L()){let r=this.get(e,s);e!=p.Z&&s==5&&this.get(e,0)>0&&(r-=this.get(e,0),t.push(new w(e,s,[g.RED])));for(let i=0;i<r;i++)t.push(new w(e,s))}if(this.drawn!=null){const e=this.drawn,s=t.findIndex(r=>r.equals(e)&&e.has(g.RED)==r.has(g.RED));N(s>=0,`hand has drawn: ${this.drawn} but no tile in hands: ${t.join("")}`),t[s]=t[s].clone({add:g.TSUMO})}return t}toString(){const t=this.called.length>0?`${q}${this.called.join(q)}`:"",e=this.drawn?`${q}${this.drawn.toString()}`:"",s=this.hands.filter(i=>!i.has(g.TSUMO));return`${new kt(s).toString()}${e}${t}`}get called(){return this.data.called}get reached(){return this.data.reached}get drawn(){return this.data.tsumo}get menzen(){return!this.called.some(t=>!(t instanceof R))}sum(t){let e=0;for(const[s,r]of L({filterBy:[t]}))e+=this.get(s,r);return e}get(t,e){return t==p.BACK?this.data[t][1]:this.data[t][e]}inc(t){const e=[];for(const s of t){if(s.t!=p.BACK&&this.get(s.t,s.n)>=4||s.has(g.RED)&&this.get(s.t,0)>0)throw this.dec(e),new Error(`unable to increase ${s} in ${this.toString()}`);e.push(s),s.t==p.BACK?this.data[s.t][1]+=1:(this.data[s.t][s.n]+=1,s.has(g.RED)&&(this.data[s.t][0]+=1))}return e}dec(t){const e=[];for(const s of t){if(this.get(s.t,s.n)<1||s.has(g.RED)&&this.get(s.t,0)<=0)throw this.inc(e),new Error(`unable to decrease ${s.toString()} in ${this.toString()}`);if(e.push(s),s.t==p.BACK?this.data[s.t][1]-=1:(this.data[s.t][s.n]-=1,s.has(g.RED)&&(this.data[s.t][0]-=1)),C(s)&&this.get(s.t,5)==0&&this.get(s.t,0)>0){this.data[s.t][0]=0;const r=e.pop().clone({add:g.RED});e.push(r)}}return e}draw(t){const e=t.clone({add:g.TSUMO});this.inc([e]),this.data.tsumo=e}discard(t){this.dec([t]),this.data.tsumo=null}reach(){if(!this.menzen)throw new Error("cannot reach");if(this.data.reached)throw new Error("already reached");this.data.reached=!0}call(t){const e=t.tiles.filter(s=>!s.has(g.HORIZONTAL));if(e.length!=t.tiles.length-1)throw new Error(`removal: ${e} block: ${t}`);this.dec(e),this.data.called=[...this.called,t],this.data.tsumo=null}kan(t){if(t instanceof R){this.dec(t.tiles),this.data.called=[...this.called,t],this.data.tsumo=null;return}if(t instanceof D){const e=this.data.called.findIndex(r=>r.is(b.PON)&&r.tiles[0].equals(t.tiles[0]));if(e==-1)throw new Error(`unable to find ${t.tiles[0]}`);let s=t.tiles[0];s=C(s)?s.clone({remove:g.RED}):s,this.dec([s]),this.data.called=[...this.called.slice(0,e),...this.called.slice(e+1),t],this.data.tsumo=null;return}throw new Error(`unexpected input ${t}`)}clone(){const t=new ye(this.toString());return t.data.reached=this.data.reached,t}}class Xt{constructor(t){_(this,"hand");this.hand=t}calc(){return Math.min(this.sevenPairs(),this.thirteenOrphans(),this.fourSetsOnePair())}sevenPairs(){if(this.hand.called.length>0)return 1/0;let t=0,e=0;for(const[s,r]of L({skipBack:!0}))this.hand.get(s,r)==2&&t++,this.hand.get(s,r)==1&&e++;return t>7&&(t=7),t+e>=7&&(e=7-t),13-2*t-e}thirteenOrphans(){if(this.hand.called.length>0)return 1/0;let t=0,e=0;for(const s of Object.values(p)){if(s==p.BACK)continue;const r=s==p.Z?xt:G;for(const i of r)this.hand.get(s,i)>=1&&t++,this.hand.get(s,i)>=2&&e++}return e>=1?12-t:13-t}fourSetsOnePair(){const t=s=>{const r=[0,0,0];for(const[d,y]of L({filterBy:[p.Z]}))this.hand.get(d,y)>=3?r[0]++:this.hand.get(d,y)==2?r[1]++:this.hand.get(d,y)==1&&r[2]++;const i=[0,0,0],o=this.hand.get(p.BACK,0),a=o%3;i[0]=Math.floor(o/3),a==2?i[1]=1:a==1&&(i[2]=1);let c=13;const l=this.patternNumType(p.M),u=this.patternNumType(p.P),h=this.patternNumType(p.S);for(const d of[l.patternA,l.patternB])for(const y of[u.patternA,u.patternB])for(const f of[h.patternA,h.patternB]){const m=[this.hand.called.length,0,0];for(let S=0;S<3;S++)m[S]+=d[S]+y[S]+f[S]+r[S]+i[S];const A=this.calcCommon(m[0],m[1],m[2],s);A<c&&(c=A)}return c};let e=t(!1);for(const[s,r]of L())if(this.hand.get(s,r)>=2){const i=this.hand.dec(new Array(2).fill(new w(s,r))),o=t(!0);this.hand.inc(i),o<e&&(e=o)}return e}patternNumType(t,e=1){if(e>9)return this.groupRemainingTiles(t);let s=this.patternNumType(t,e+1);if(e<=7&&this.hand.get(t,e)>0&&this.hand.get(t,e+1)>0&&this.hand.get(t,e+2)>0){const r=this.hand.dec([new w(t,e),new w(t,e+1),new w(t,e+2)]),i=this.patternNumType(t,e);this.hand.inc(r),i.patternA[0]++,i.patternB[0]++,(i.patternA[2]<s.patternA[2]||i.patternA[2]==s.patternA[2]&&i.patternA[1]<s.patternA[1])&&(s.patternA=i.patternA),(i.patternB[0]>s.patternB[0]||i.patternB[0]==s.patternB[0]&&i.patternB[1]>s.patternB[1])&&(s.patternB=i.patternB)}if(this.hand.get(t,e)>=3){const r=this.hand.dec(new Array(3).fill(new w(t,e))),i=this.patternNumType(t,e);this.hand.inc(r),i.patternA[0]++,i.patternB[0]++,(i.patternA[2]<s.patternA[2]||i.patternA[2]==s.patternA[2]&&i.patternA[1]<s.patternA[1])&&(s.patternA=i.patternA),(i.patternB[0]>s.patternB[0]||i.patternB[0]==s.patternB[0]&&i.patternB[1]>s.patternB[1])&&(s.patternB=i.patternB)}return s}groupRemainingTiles(t){let e=0,s=0,r=0;for(const[i,o]of L({filterBy:[t]}))r+=this.hand.get(i,o),o<=7&&this.hand.get(i,o+1)==0&&this.hand.get(i,o+2)==0&&(e+=r>>1,s+=r%2,r=0);return e+=r>>1,s+=r%2,{patternA:[0,e,s],patternB:[0,e,s]}}calcCommon(t,e,s,r){let i=r?4:5;return t>4&&(e+=t-4,t=4),t+e>4&&(s+=t+e-4,e=4-t),t+e+s>i&&(s=i-t-e),r&&e++,13-t*3-e*2-s}}class ns{constructor(t){_(this,"hand");this.hand=t}calc(t){return this.markDrawn([...this.sevenPairs(),...this.thirteenOrphans(),...this.nineGates(),...this.fourSetsOnePair()],t)}markDrawn(t,e){if(t.length==0)return[];const s=this.hand.drawn!=null||e.has(g.TSUMO)?g.TSUMO:g.RON,r=[];for(let o=0;o<t.length;o++){const a=t[o],c={};for(let l=0;l<a.length;l++){const u=a[l];if(u.isCalled())continue;const h=u.tiles.findIndex(y=>y.equals(e)&&e.has(g.RED)==y.has(g.RED));if(h<0)continue;const d=ss(u);c[d]||(c[d]=!0,r.push([o,l,h]))}}if(r.length==0)throw new Error(`found no tile ${e.toString()} in hands ${t[0].toString()}`);const i=[];for(const[o,a,c]of r){const u=[...t[o]],h=u[a],d=h.tiles[c].clone({add:s});u[a]=h.clone({replace:{idx:c,tile:d}}),i.push(u)}return i}sevenPairs(){if(this.hand.called.length>0)return[];const t=[];for(const[e,s]of L({skipBack:!0})){const r=this.hand.get(e,s);if(r==2){const i=this.hand.dec(new Array(2).fill(new w(e,s)));t.push(new H(i[0],i[1])),this.hand.inc(i)}else{if(r==0)continue;return[]}}return[t]}thirteenOrphans(){const t=[];let e=!1;for(const s of Object.values(p)){if(s==p.BACK)continue;const r=s==p.Z?xt:G;for(let i of r)if(this.hand.get(s,i)==1)t.push(new Ze(new w(s,i)));else if(this.hand.get(s,i)==2&&e==!1)t.unshift(new H(new w(s,i),new w(s,i))),e=!0;else return[]}return[t]}nineGates(){const t=(e,s,r)=>r.includes(this.hand.get(e,s));for(const e of Object.values(p)){if(e==p.BACK||e==p.Z)continue;const s=t(e,1,[3,4])&&t(e,9,[3,4])&&t(e,2,[1,2])&&t(e,3,[1,2])&&t(e,4,[1,2])&&t(e,5,[1,2])&&t(e,6,[1,2])&&t(e,7,[1,2])&&t(e,8,[1,2]),r=this.hand.sum(e)==14;if(s&&r)return[[new kt(this.hand.hands)]]}return[]}fourSetsOnePair(){let t=[];for(const[e,s]of L())if(this.hand.get(e,s)>=2){const r=this.hand.dec(new Array(2).fill(new w(e,s))),i=this.patternAll().filter(o=>o.length==4).map(o=>(o.unshift(new H(r[0],r[1])),o));t=[...t,...i],this.hand.inc(r)}return t}patternAll(){const t=[this.handleNumType(p.M),this.handleNumType(p.P),this.handleNumType(p.S),this.handleZ(),this.handleBack(),[this.hand.called.concat()]].sort((s,r)=>r.length-s.length),e=t[0].concat();for(let s=0;s<e.length;s++)for(let r=1;r<t.length;r++)for(const i of t[r])e[s]=[...e[s],...i];return e}handleBack(){const t=p.BACK,e=this.hand.get(t,0);if(e<3)return[];const s=new w(t,0),r=Array(Math.floor(e/3)).fill(new z([s,s,s]));return r.length==0?[]:[r]}handleZ(){const t=[];for(const[e,s]of L({filterBy:[p.Z]})){if(this.hand.get(e,s)==0)continue;if(this.hand.get(e,s)!=3)return[];const r=new w(e,s);t.push(new z([r,r,r]))}return t.length==0?[]:[t]}handleNumType(t,e=1){if(e>9)return[];if(this.hand.get(t,e)==0)return this.handleNumType(t,e+1);const s=[];if(e<=7&&this.hand.get(t,e)>0&&this.hand.get(t,e+1)>0&&this.hand.get(t,e+2)>0){const r=this.hand.dec([new w(t,e),new w(t,e+1),new w(t,e+2)]);let i=this.handleNumType(t,e);this.hand.inc(r),i.length==0&&(i=[[]]);for(const o of i)o.unshift(new Q([r[0],r[1],r[2]])),s.push(o)}if(this.hand.get(t,e)==3){const r=this.hand.dec(new Array(3).fill(new w(t,e)));let i=this.handleNumType(t,e);this.hand.inc(r),i.length==0&&(i=[[]]);for(const o of i)o.unshift(new z([r[0],r[1],r[2]])),s.push(o)}return s}}const xt=[1,2,3,4,5,6,7],G=[1,9],zt=n=>{var e;const t=n.boardContext;return{...n,hand:n.hand.map(v.deserialize),boardContext:{...t,doraMarkers:t.doraMarkers.map(w.from),blindDoraMarkers:(e=t.blindDoraMarkers)==null?void 0:e.map(w.from)}}};class $e{constructor(t,e){_(this,"hand");_(this,"cfg");this.hand=t,this.cfg={doras:e.doraMarkers.map(s=>In(s)),blindDoras:e.blindDoraMarkers==null?[]:e.blindDoraMarkers.map(s=>In(s)),roundWind:w.from(e.round.substring(0,2)),myWind:w.from(e.myWind),reached:e.reached??0,sticks:e.sticks??{dead:0,reach:0},replacementWin:e.replacementWin??!1,quadWin:e.quadWin??!1,finalWallWin:e.finalWallWin??!1,finalDiscardWin:e.finalDiscardWin??!1,oneShotWin:e.oneShotWin??!1,roundUp8000:e.roundUp8000??!1,orig:e}}calc(...t){const e=this.calcPatterns(t);if(e.length==0)return!1;let s=[0,0],r=0;for(let f=0;f<e.length;f++){const m=e[f],A=m.points.reduce((S,O)=>S+O.double,0);A>s[0]?(r=f,s=[A,m.fu]):A==s[0]&&m.fu>s[1]&&(r=f,s=[A,m.fu])}const i=(f,m=100)=>Math.ceil(f/m)*m,o=s[1]!=25?i(s[1],10):25,a=s[0];let c=Math.min(o*2**(a+2),2e3);switch(a){case 26:c=16e3;break;case 13:c=8e3;break;case 12:case 11:c=6e3;break;case 10:case 9:case 8:c=4e3;break;case 7:case 6:c=3e3;break;case 5:c=2e3;break}a>13&&a<26&&(c=8e3),this.cfg.roundUp8000&&(o==30&&a==4||o==60&&a==3)&&(c=2e3);const l=e[r].hand.some(f=>f.tiles.some(m=>m.has(g.TSUMO))),u=this.cfg.orig.myWind,h=u==E.E,d=$(0);if(l){const f=this.cfg.sticks.dead*100;if(h){const m=i(c*2);d[E.E]+=m*3+f*3,d[E.S]-=m+f,d[E.W]-=m+f,d[E.N]-=m+f}else for(const m of Object.values(E)){if(m==u)continue;const A=m==E.E?2:1,S=i(c*A)+f;d[m]-=S,d[u]+=S}}else{const f=this.cfg.sticks.dead*300;if(this.cfg.orig.ronWind==null)throw new Error("ron wind is not specified in the parameters");const A=i(c*(h?6:4))+f;d[u]+=A,d[this.cfg.orig.ronWind]-=A}return d[u]+=1e3*this.cfg.sticks.reach,{deltas:d,sum:a,fu:o,points:e[r].points,point:d[u],hand:e[r].hand,boardContext:this.cfg.orig}}calcPatterns(t){const e=[];if(t.length==0)return e;for(const s of t){const r=[...this.dA13(s),...this.dB13(s),...this.dC13(s),...this.dD13(s),...this.dE13(s),...this.dF13(s),...this.dG13(s),...this.dH13(s),...this.dI13(s),...this.dJ13(s),...this.dK13(s)];r.length!=0&&e.push({points:r,fu:30,hand:s})}if(e.length>0)return e;for(const s of t){const r=this.calcFu(s),i=[...this.dA1(s),...this.dB1(s),...this.dC1(s),...this.dD1(s),...this.dE1(s),...this.dF1(s),...this.dG1(s),...this.dH1(s),...this.dI1(s),...this.dJ1(s),...this.dK1(s),...this.dA2(s),...this.dB2(s),...this.dC2(s),...this.dD2(s),...this.dE2(s),...this.dF2(s),...this.dG2(s),...this.dH2(s),...this.dI2(s),...this.dJ2(s),...this.dA3(s),...this.dB3(s),...this.dC3(s),...this.dA6(s)];i.length!=0&&(i.push(...this.dX1(s)),e.push({points:i,fu:r,hand:s}))}return e}minus(){return this.hand.menzen?0:1}dA1(t){return this.cfg.reached==1?[{name:"立直",double:1}]:this.cfg.reached==2?[{name:"ダブル立直",double:2}]:[]}dB1(t){return this.minus()!=0?[]:(this.hand.drawn==null,t.some(s=>s.tiles.some(r=>r.has(g.TSUMO)))?[{name:"門前清自摸和",double:1}]:[])}dC1(t){if(this.minus()!=0)return[];const e="平和",s=this.calcFu(t);return s==20?[{name:e,double:1}]:!t.some(r=>r.tiles.some(i=>i.has(g.TSUMO)))&&s==30?[{name:e,double:1}]:[]}dD1(t){return t.some(s=>s.tiles.some(r=>r.t==p.Z||G.includes(r.n)))?[]:[{name:"断么九",double:1}]}dE1(t){return this.minus()!=0?[]:vn(t)==1?[{name:"一盃口",double:1}]:[]}dF1(t){const e=[];return t.forEach(s=>{if(s instanceof H)return;const r=s.tiles[0];r.t==p.Z&&(r.equals(this.cfg.myWind)&&e.push({name:"自風",double:1}),r.equals(this.cfg.roundWind)?e.push({name:"場風",double:1}):r.n==5?e.push({name:"白",double:1}):r.n==6?e.push({name:"發",double:1}):r.n==7&&e.push({name:"中",double:1}))}),e}dG1(t){return this.cfg.oneShotWin?[{name:"一発",double:1}]:[]}dH1(t){return this.cfg.replacementWin?[{name:"嶺上開花",double:1}]:[]}dI1(t){return this.cfg.quadWin?[{name:"搶槓",double:1}]:[]}dJ1(t){return this.cfg.finalWallWin?[{name:"海底摸月",double:1}]:[]}dK1(t){return this.cfg.finalDiscardWin?[{name:"河底撈魚",double:1}]:[]}dX1(t){let e=0,s=0,r=0;for(const o of t)for(const a of o.tiles){for(const c of this.cfg.doras)a.equals(c)&&e++;for(const c of this.cfg.blindDoras)a.equals(c)&&s++;a.has(g.RED)&&r++}const i=[];return e>0&&i.push({name:"ドラ",double:e}),r>0&&i.push({name:"赤ドラ",double:r}),this.hand.reached&&s>0&&i.push({name:"裏ドラ",double:s}),i}dA2(t){return t.length==7?[{name:"七対子",double:2}]:[]}dB2(t){const e=s=>s instanceof Q||s instanceof Z;for(const s of t){if(!e(s))continue;const r=lt(s);if(r.t==p.Z)continue;const i=[p.M,p.P,p.S].filter(c=>c!=r.t),o=t.some(c=>{const l=new w(i[0],r.n);return e(c)&&l.equals(lt(c))}),a=t.some(c=>{const l=new w(i[1],r.n);return e(c)&&l.equals(lt(c))});if(o&&a)return[{name:"三色同順",double:2-this.minus()}]}return[]}dC2(t){return t.length==7?[]:t.every(s=>s instanceof R||s instanceof D||s instanceof Y||s instanceof z||s instanceof V||s instanceof H)?[{name:"対々和",double:2}]:[]}dD2(t){return this.minus()!=0?[]:t.filter(s=>(s instanceof R||s instanceof z)&&!s.tiles.some(r=>r.has(g.RON))).length>=3?[{name:"三暗刻",double:2}]:[]}dE2(t){return t.filter(s=>s instanceof R||s instanceof D||s instanceof Y).length>=3?[{name:"三槓子",double:2}]:[]}dF2(t){const e=s=>s instanceof R||s instanceof D||s instanceof Y||s instanceof z||s instanceof V;for(const s of t){if(!e(s))continue;const r=lt(s);if(r.t==p.Z)continue;const i=[p.M,p.P,p.S].filter(c=>c!=r.t),o=t.some(c=>{const l=new w(i[0],r.n);return e(c)&&l.equals(lt(c))}),a=t.some(c=>{const l=new w(i[1],r.n);return e(c)&&l.equals(lt(c))});if(o&&a)return[{name:"三色同刻",double:2}]}return[]}dG2(t){return t.filter(s=>{const r=s.tiles[0];return r.t==p.Z&&[5,6,7].includes(r.n)}).length==3?[{name:"小三元",double:2}]:[]}dH2(t){return t.every(s=>{const r=s.tiles[0].t==p.Z?xt:G;return s.tiles.every(i=>r.includes(i.n))})?[{name:"混老頭",double:2}]:[]}dI2(t){return t.length==7?[]:t.some(s=>s instanceof Q||s instanceof Z)?t.some(s=>s.tiles[0].t==p.Z)?t.every(s=>{const r=s.tiles[0].t==p.Z?xt:G;return s.tiles.some(i=>r.includes(i.n))})?[{name:"混全帯么九",double:2-this.minus()}]:[]:[]:[]}dJ2(t){const e={[p.M]:[0,0,0],[p.S]:[0,0,0],[p.P]:[0,0,0]};for(const s of t){const r=lt(s);r.t!=p.BACK&&r.t!=p.Z&&(s instanceof Q||s instanceof Z)&&(r.n==1?e[r.t][0]++:r.n==4?e[r.t][1]++:r.n==7&&e[r.t][2]++)}for(const s of Object.values(e))if(s[0]>0&&s[1]>0&&s[2]>0)return[{name:"一気通貫",double:2-this.minus()}];return[]}dA3(t){if(!t.some(s=>s.tiles[0].t==p.Z))return[];for(const s of Object.values(p))if(t.every(i=>i.tiles[0].t==p.Z||i.tiles[0].t==s))return[{name:"混一色",double:3-this.minus()}];return[]}dB3(t){return t.length==7?[]:t.some(s=>s instanceof Q||s instanceof Z)?t.some(s=>s.tiles[0].t==p.Z)?[]:t.every(s=>s.tiles.some(r=>G.includes(r.n)))?[{name:"純全帯么九色",double:3-this.minus()}]:[]:[]}dC3(t){return this.minus()!=0?[]:vn(t)==2?[{name:"ニ盃口",double:3}]:[]}dA6(t){if(t.some(e=>e.tiles[0].t==p.Z))return[];for(const e of Object.values(p)){if(e==p.Z)continue;if(t.every(r=>r.tiles[0].t==e))return[{name:"清一色",double:6-this.minus()}]}return[]}dA13(t){return t.length!=13?[]:t.some(s=>s instanceof H&&s.tiles.some(r=>r.has(g.TSUMO)||r.has(g.RON)))?[{name:"国士無双13面待ち",double:26}]:[{name:"国士無双",double:13}]}dB13(t){return t.length==1?[{name:"九蓮宝燈",double:13}]:[]}dC13(t){return t.length==7?[]:t.every(r=>r instanceof R||r instanceof z&&!r.tiles.some(i=>i.has(g.RON))||r instanceof H)?t.some(r=>r instanceof H&&r.tiles.every(i=>i.has(g.TSUMO)||i.has(g.RON)))?[{name:"四暗刻単騎待ち",double:26}]:[{name:"四暗刻",double:13}]:[]}dD13(t){if(t.length==13)return[];const e=[5,6,7];return t.filter(r=>!(r instanceof H)&&r.tiles.some(i=>i.t==p.Z&&e.includes(i.n))).length==3?[{name:"大三元",double:13}]:[]}dE13(t){return t.every(s=>s.tiles[0].t==p.Z)?[{name:"字一色",double:13}]:[]}dF13(t){return t.every(s=>s.tiles.every(r=>r.t!=p.Z&&G.includes(r.n)))?[{name:"清老頭",double:13}]:[]}dG13(t){return t.filter(s=>s instanceof R||s instanceof D||s instanceof Y).length==4?[{name:"四槓子",double:13}]:[]}dH13(t){if(t.length==13)return[];if(t.length==7)return[];const e=[1,2,3,4];return t.filter(i=>i.tiles.some(o=>o.t==p.Z&&e.includes(o.n))).length==4?t.find(i=>i instanceof H).tiles.some(i=>i.t==p.Z&&e.includes(i.n))?[{name:"小四喜",double:13}]:[{name:"大四喜",double:13}]:[]}dI13(t){const e=s=>!!(s.equals(new w(p.Z,6))||s.t==p.S&&[2,3,4,6,8].includes(s.n));return t.every(s=>s.tiles.every(r=>e(r)))?[{name:"緑一色",double:13}]:[]}dJ13(t){return[]}dK13(t){return[]}calcFu(t){let s=20;const r=this.cfg.myWind.n,i=this.cfg.roundWind.n;if(t.length==7)return 25;const o=t.find(f=>f.tiles.some(m=>m.has(g.TSUMO)||m.has(g.RON))),a=this.minus()==1,c=o.tiles.some(f=>f.has(g.TSUMO)),l=(f,m)=>{const A=f.tiles[0];return A.t==p.Z&&[5,6,7].includes(A.n)||A.t==p.Z&&[r,i].includes(A.n)||G.includes(A.n)?m*2:m};for(const f of t)switch(!0){case f instanceof z:const m=f.tiles.some(A=>A.has(g.RON))?2:4;s+=l(f,m);break;case f instanceof V:s+=l(f,2);break;case(f instanceof Y||f instanceof D):s+=l(f,8);break;case f instanceof R:s+=l(f,16);break}s+=(f=>{if(f instanceof z)return 0;if(f instanceof H)return 2;const m=f.tiles,A=m.findIndex(S=>S.has(g.TSUMO)||S.has(g.RON));return A==1||A==0&&m[2].n==9||A==2&&m[0].n==1?2:0})(o);const d=t.find(f=>f instanceof H).tiles[0];d.t==p.Z&&([5,6,7].includes(d.n)&&(s+=2),d.n==i&&(s+=2),d.n==r&&(s+=2));let y=!1;return!a&&s==20&&(y=!0),c&&!y&&(s+=2),!c&&!a&&(s+=10),!c&&!a&&s==30&&(y=!0),a&&s==20&&(s=30),s}}const ss=n=>n.tiles.reduce((t,e)=>`${t}${e.n}${e.t}`,""),vn=n=>{const t={};for(const s of n){if(!(s instanceof Q))continue;const r=ss(s);t[r]==null?t[r]=1:t[r]++}let e=0;for(const s in t)t[s]>=2&&e++;return e},lt=n=>[...n.tiles].sort(Jt)[0],In=n=>{const t=n.n,e=n.t;if(e==p.Z){if(t==4)return new w(e,1);if(t==7)return new w(e,5)}return new w(e,t%9+1)};class $t{static calcCandidates(t,e,s){N(e.length>0,"choices to discard is zero");const r=new Map;let i=1/0;for(const o of e){const a=t.dec([o]),c=$t.candidateTiles(t,s);t.inc(a);const l=s!=null&&s.arrangeRed&&o.has(g.RED)?o.clone({removeAll:!0}):o.has(g.RED)?o.clone({removeAll:!0,add:g.RED}):o.clone({removeAll:!0});c.shanten<i?(r.clear(),r.set(l.toString(),{shanten:c.shanten,candidates:c.candidates,tile:l}),i=c.shanten):c.shanten==i&&r.set(l.toString(),{shanten:c.shanten,candidates:c.candidates,tile:l})}return Array.from(r.values())}static candidateTiles(t,e){let s=1/0,r=[];const i=new Xt(t);for(const[o,a]of L({skipBack:!0,filterBy:e==null?void 0:e.typeFilter})){if(t.get(o,a)>=4)continue;const c=new w(o,a),l=t.inc([c]),u=e!=null&&e.fourSetsOnePair?i.fourSetsOnePair():i.calc();t.dec(l),u<s?(s=u,r=[c]):u==s&&r.push(c)}return{shanten:s,candidates:r}}}const Pe=()=>{const n=new Set;return{on(t){n.add(t)},off(t){n.delete(t)},offAll(){n.clear()},emit(t){n.forEach(e=>e(t))}}};function rs(n){var i;const t=["RON","DAI_KAN","PON","CHI"],e=n.map(o=>o.choices),r=os(e,t).map(o=>n[o]);return{events:r,type:as(t,(i=r[0])==null?void 0:i.choices)}}function is(n){var i;const t=["TSUMO","REACH","AN_KAN","SHO_KAN","DRAWN_GAME_BY_NINE_ORPHANS","DISCARD"],e=n.map(o=>o.choices),r=os(e,t).map(o=>n[o]);return{events:r,type:as(t,(i=r[0])==null?void 0:i.choices)}}function os(n,t){let e=[],s=Number.POSITIVE_INFINITY;for(let r=0;r<n.length;r++){const i=n[r];if(Ki(i,t)){const o=Li(t,i);o<s?(s=o,e=[r]):o===s&&e.push(r)}}return e}function Ki(n,t){return t.some(e=>!!n[e])}function Li(n,t){for(let e=0;e<n.length;e++){const s=n[e];if(t[s])return e}return Number.POSITIVE_INFINITY}function as(n,t){if(t==null)return!1;for(const e of n)if(t[e])return e;return!1}const jt=()=>{const n=Pe(),t=Pe(),e={emit:n.emit,on:r=>t.on(r)},s={emit:t.emit,on:r=>n.on(r)};return[e,s]},cs=()=>{const n=Pe();return{emit:s=>{n.emit(s)},on:s=>{n.on(s)}}};class Gt{constructor(t){_(this,"reachValue",1e3);_(this,"m");this.m=structuredClone(t)}get summary(){return structuredClone(this.m)}reach(t){this.m[t]-=this.reachValue}update(t,e){for(let s in e){const r=e[s],i=t[r];this.m[s]+=i}}}class Zt{constructor(t,e){_(this,"pToW",{});_(this,"wToP",$(""));_(this,"round");_(this,"sticks");this.round=(e==null?void 0:e.round)??k.E1,this.sticks=structuredClone(e==null?void 0:e.sticks)??{reach:0,dead:0},this.pToW=structuredClone(t);for(let s in this.pToW)this.wToP[this.pToW[s]]=s}update(){for(let t in this.pToW){const e=fe(this.pToW[t]);this.pToW[t]=e,this.wToP[e]=t}}incrementDeadStick(){this.sticks.dead++}incrementReachStick(){this.sticks.reach++}nextRound(){const t=Ft(this.round);this.round=t,this.update()}resetDeadStick(){this.sticks.dead=0}resetReachStick(){this.sticks.reach=0}is(t){return this.round==t}wind(t){return this.pToW[t]}playerID(t){return this.wToP[t]}get playerMap(){return structuredClone(this.pToW)}}function nn(n){for(let t=n.length-1;t>0;t--){const e=Math.floor(Math.random()*(t+1));[n[t],n[e]]=[n[e],n[t]]}return n}class ls{constructor(t=!1){_(this,"c");_(this,"safeMap",$({},!0));this.disable=t,this.c=this.initial()}get(t){return t.t==p.BACK?0:this.c[t.t][t.n]}dec(...t){if(!this.disable){for(let e of t)if(e.t!=p.BACK){if(this.get(e)<=0)throw new Error(`[counter] cannot decrease ${e.toString()} due to zero`);this.c[e.t][e.n]-=1,e.has(g.RED)&&(this.c[e.t][0]-=1)}}}addTileToSafeMap(t,e){this.disable||(this.safeMap[e][this.key(t.t,t.n)]=!0)}isSafeTile(t,e,s){return this.safeMap[s][this.key(t,e)]}key(t,e){return`${t}${e}`}reset(){this.c=this.initial()}initial(){return{[p.M]:[1,4,4,4,4,4,4,4,4,4],[p.S]:[1,4,4,4,4,4,4,4,4,4],[p.P]:[1,4,4,4,4,4,4,4,4,4],[p.Z]:[0,4,4,4,4,4,4,4]}}}class sn{constructor(){_(this,"m",[])}discard(t,e){this.m.push({w:e,t})}discards(t){return t==null?[...this.m]:this.m.filter(e=>e.w==t)}get lastTile(){const t=this.m.at(-1);return N(t!=null,`lastTile is null(${t}). river: ${JSON.stringify(this.m,null,2)}`),t}markCalled(){this.lastTile.callMarker=!0}cannotContinue(){const t=this.discards();if(t.length!=4)return!1;let e=t[0].t;if(e.isNum())return!1;for(let s=0;s<4;s++)if(!e.equals(t[s].t))return!1;return!0}}function zi(){if(typeof globalThis<"u")return globalThis;if(typeof self<"u")return self;if(typeof window<"u")return window;if(typeof global<"u")return global}function ji(){const n=zi();if(n.__xstate__)return n.__xstate__}const Ui=n=>{if(typeof window>"u")return;const t=ji();t&&t.register(n)};class On{constructor(t){this._process=t,this._active=!1,this._current=null,this._last=null}start(){this._active=!0,this.flush()}clear(){this._current&&(this._current.next=null,this._last=this._current)}enqueue(t){const e={value:t,next:null};if(this._current){this._last.next=e,this._last=e;return}this._current=e,this._last=e,this._active&&this.flush()}flush(){for(;this._current;){const t=this._current;this._process(t.value),this._current=t.next}this._last=null}}const us=".",Fi="",hs="",Gi="#",Zi="*",ds="xstate.init",He="xstate.stop";function Vi(n,t){return{type:`xstate.after.${n}.${t}`}}function We(n,t){return{type:`xstate.done.state.${n}`,output:t}}function Ji(n,t){return{type:`xstate.done.actor.${n}`,output:t,actorId:n}}function Xi(n,t){return{type:`xstate.error.actor.${n}`,error:t,actorId:n}}function fs(n){return{type:ds,input:n}}function X(n){setTimeout(()=>{throw n})}const Yi=typeof Symbol=="function"&&Symbol.observable||"@@observable";function ps(n,t){const e=kn(n),s=kn(t);return typeof s=="string"?typeof e=="string"?s===e:!1:typeof e=="string"?e in s:Object.keys(e).every(r=>r in s?ps(e[r],s[r]):!1)}function rn(n){if(ys(n))return n;const t=[];let e="";for(let s=0;s<n.length;s++){switch(n.charCodeAt(s)){case 92:e+=n[s+1],s++;continue;case 46:t.push(e),e="";continue}e+=n[s]}return t.push(e),t}function kn(n){if(Mo(n))return n.value;if(typeof n!="string")return n;const t=rn(n);return qi(t)}function qi(n){if(n.length===1)return n[0];const t={};let e=t;for(let s=0;s<n.length-1;s++)if(s===n.length-2)e[n[s]]=n[s+1];else{const r=e;e={},r[n[s]]=e}return t}function Cn(n,t){const e={},s=Object.keys(n);for(let r=0;r<s.length;r++){const i=s[r];e[i]=t(n[i],i,n,r)}return e}function gs(n){return ys(n)?n:[n]}function et(n){return n===void 0?[]:gs(n)}function Be(n,t,e,s){return typeof n=="function"?n({context:t,event:e,self:s}):n}function ys(n){return Array.isArray(n)}function Qi(n){return n.type.startsWith("xstate.error.actor")}function Tt(n){return gs(n).map(t=>typeof t>"u"||typeof t=="string"?{target:t}:t)}function ms(n){if(!(n===void 0||n===Fi))return et(n)}function De(n,t,e){var i,o,a;const s=typeof n=="object",r=s?n:void 0;return{next:(i=s?n.next:n)==null?void 0:i.bind(r),error:(o=s?n.error:t)==null?void 0:o.bind(r),complete:(a=s?n.complete:e)==null?void 0:a.bind(r)}}function Rn(n,t){return`${t}.${n}`}function on(n,t){const e=t.match(/^xstate\.invoke\.(\d+)\.(.*)/);if(!e)return n.implementations.actors[t];const[,s,r]=e,o=n.getStateNodeById(r).config.invoke;return(Array.isArray(o)?o[s]:o).src}function Mn(n,t){return`${n.sessionId}.${t}`}let to=0;function eo(n,t){const e=new Map,s=new Map,r=new WeakMap,i=new Set,o={},{clock:a,logger:c}=t,l={schedule:(d,y,f,m,A=Math.random().toString(36).slice(2))=>{const S={source:d,target:y,event:f,delay:m,id:A,startedAt:Date.now()},O=Mn(d,A);h._snapshot._scheduledEvents[O]=S;const M=a.setTimeout(()=>{delete o[O],delete h._snapshot._scheduledEvents[O],h._relay(d,y,f)},m);o[O]=M},cancel:(d,y)=>{const f=Mn(d,y),m=o[f];delete o[f],delete h._snapshot._scheduledEvents[f],m!==void 0&&a.clearTimeout(m)},cancelAll:d=>{for(const y in h._snapshot._scheduledEvents){const f=h._snapshot._scheduledEvents[y];f.source===d&&l.cancel(d,f.id)}}},u=d=>{if(!i.size)return;const y={...d,rootId:n.sessionId};i.forEach(f=>{var m;return(m=f.next)==null?void 0:m.call(f,y)})},h={_snapshot:{_scheduledEvents:((t==null?void 0:t.snapshot)&&t.snapshot.scheduler)??{}},_bookId:()=>`x:${to++}`,_register:(d,y)=>(e.set(d,y),d),_unregister:d=>{e.delete(d.sessionId);const y=r.get(d);y!==void 0&&(s.delete(y),r.delete(d))},get:d=>s.get(d),_set:(d,y)=>{const f=s.get(d);if(f&&f!==y)throw new Error(`Actor with system ID '${d}' already exists.`);s.set(d,y),r.set(y,d)},inspect:d=>{const y=De(d);return i.add(y),{unsubscribe(){i.delete(y)}}},_sendInspectionEvent:u,_relay:(d,y,f)=>{h._sendInspectionEvent({type:"@xstate.event",sourceRef:d,actorRef:y,event:f}),y._send(f)},scheduler:l,getSnapshot:()=>({_scheduledEvents:{...h._snapshot._scheduledEvents}}),start:()=>{const d=h._snapshot._scheduledEvents;h._snapshot._scheduledEvents={};for(const y in d){const{source:f,target:m,event:A,delay:S,id:O}=d[y];l.schedule(f,m,A,S,O)}},_clock:a,_logger:c};return h}let Se=!1;const an=1;let P=function(n){return n[n.NotStarted=0]="NotStarted",n[n.Running=1]="Running",n[n.Stopped=2]="Stopped",n}({});const no={clock:{setTimeout:(n,t)=>setTimeout(n,t),clearTimeout:n=>clearTimeout(n)},logger:console.log.bind(console),devTools:!1};class so{constructor(t,e){this.logic=t,this._snapshot=void 0,this.clock=void 0,this.options=void 0,this.id=void 0,this.mailbox=new On(this._process.bind(this)),this.observers=new Set,this.eventListeners=new Map,this.logger=void 0,this._processingStatus=P.NotStarted,this._parent=void 0,this._syncSnapshot=void 0,this.ref=void 0,this._actorScope=void 0,this._systemId=void 0,this.sessionId=void 0,this.system=void 0,this._doneEvent=void 0,this.src=void 0,this._deferred=[];const s={...no,...e},{clock:r,logger:i,parent:o,syncSnapshot:a,id:c,systemId:l,inspect:u}=s;this.system=o?o.system:eo(this,{clock:r,logger:i}),u&&!o&&this.system.inspect(De(u)),this.sessionId=this.system._bookId(),this.id=c??this.sessionId,this.logger=(e==null?void 0:e.logger)??this.system._logger,this.clock=(e==null?void 0:e.clock)??this.system._clock,this._parent=o,this._syncSnapshot=a,this.options=s,this.src=s.src??t,this.ref=this,this._actorScope={self:this,id:this.id,sessionId:this.sessionId,logger:this.logger,defer:h=>{this._deferred.push(h)},system:this.system,stopChild:h=>{if(h._parent!==this)throw new Error(`Cannot stop child actor ${h.id} of ${this.id} because it is not a child`);h._stop()},emit:h=>{const d=this.eventListeners.get(h.type),y=this.eventListeners.get("*");if(!d&&!y)return;const f=[...d?d.values():[],...y?y.values():[]];for(const m of f)m(h)},actionExecutor:h=>{const d=()=>{if(this._actorScope.system._sendInspectionEvent({type:"@xstate.action",actorRef:this,action:{type:h.type,params:h.params}}),!h.exec)return;const y=Se;try{Se=!0,h.exec(h.info,h.params)}finally{Se=y}};this._processingStatus===P.Running?d():this._deferred.push(d)}},this.send=this.send.bind(this),this.system._sendInspectionEvent({type:"@xstate.actor",actorRef:this}),l&&(this._systemId=l,this.system._set(l,this)),this._initState((e==null?void 0:e.snapshot)??(e==null?void 0:e.state)),l&&this._snapshot.status!=="active"&&this.system._unregister(this)}_initState(t){var e;try{this._snapshot=t?this.logic.restoreSnapshot?this.logic.restoreSnapshot(t,this._actorScope):t:this.logic.getInitialSnapshot(this._actorScope,(e=this.options)==null?void 0:e.input)}catch(s){this._snapshot={status:"error",output:void 0,error:s}}}update(t,e){var r,i;this._snapshot=t;let s;for(;s=this._deferred.shift();)try{s()}catch(o){this._deferred.length=0,this._snapshot={...t,status:"error",error:o}}switch(this._snapshot.status){case"active":for(const o of this.observers)try{(r=o.next)==null||r.call(o,t)}catch(a){X(a)}break;case"done":for(const o of this.observers)try{(i=o.next)==null||i.call(o,t)}catch(a){X(a)}this._stopProcedure(),this._complete(),this._doneEvent=Ji(this.id,this._snapshot.output),this._parent&&this.system._relay(this,this._parent,this._doneEvent);break;case"error":this._error(this._snapshot.error);break}this.system._sendInspectionEvent({type:"@xstate.snapshot",actorRef:this,event:e,snapshot:t})}subscribe(t,e,s){var i;const r=De(t,e,s);if(this._processingStatus!==P.Stopped)this.observers.add(r);else switch(this._snapshot.status){case"done":try{(i=r.complete)==null||i.call(r)}catch(o){X(o)}break;case"error":{const o=this._snapshot.error;if(!r.error)X(o);else try{r.error(o)}catch(a){X(a)}break}}return{unsubscribe:()=>{this.observers.delete(r)}}}on(t,e){let s=this.eventListeners.get(t);s||(s=new Set,this.eventListeners.set(t,s));const r=e.bind(void 0);return s.add(r),{unsubscribe:()=>{s.delete(r)}}}start(){if(this._processingStatus===P.Running)return this;this._syncSnapshot&&this.subscribe({next:s=>{s.status==="active"&&this.system._relay(this,this._parent,{type:`xstate.snapshot.${this.id}`,snapshot:s})},error:()=>{}}),this.system._register(this.sessionId,this),this._systemId&&this.system._set(this._systemId,this),this._processingStatus=P.Running;const t=fs(this.options.input);switch(this.system._sendInspectionEvent({type:"@xstate.event",sourceRef:this._parent,actorRef:this,event:t}),this._snapshot.status){case"done":return this.update(this._snapshot,t),this;case"error":return this._error(this._snapshot.error),this}if(this._parent||this.system.start(),this.logic.start)try{this.logic.start(this._snapshot,this._actorScope)}catch(s){return this._snapshot={...this._snapshot,status:"error",error:s},this._error(s),this}return this.update(this._snapshot,t),this.options.devTools&&this.attachDevTools(),this.mailbox.start(),this}_process(t){let e,s;try{e=this.logic.transition(this._snapshot,t,this._actorScope)}catch(r){s={err:r}}if(s){const{err:r}=s;this._snapshot={...this._snapshot,status:"error",error:r},this._error(r);return}this.update(e,t),t.type===He&&(this._stopProcedure(),this._complete())}_stop(){return this._processingStatus===P.Stopped?this:(this.mailbox.clear(),this._processingStatus===P.NotStarted?(this._processingStatus=P.Stopped,this):(this.mailbox.enqueue({type:He}),this))}stop(){if(this._parent)throw new Error("A non-root actor cannot be stopped directly.");return this._stop()}_complete(){var t;for(const e of this.observers)try{(t=e.complete)==null||t.call(e)}catch(s){X(s)}this.observers.clear()}_reportError(t){if(!this.observers.size){this._parent||X(t);return}let e=!1;for(const s of this.observers){const r=s.error;e||(e=!r);try{r==null||r(t)}catch(i){X(i)}}this.observers.clear(),e&&X(t)}_error(t){this._stopProcedure(),this._reportError(t),this._parent&&this.system._relay(this,this._parent,Xi(this.id,t))}_stopProcedure(){return this._processingStatus!==P.Running?this:(this.system.scheduler.cancelAll(this),this.mailbox.clear(),this.mailbox=new On(this._process.bind(this)),this._processingStatus=P.Stopped,this.system._unregister(this),this)}_send(t){this._processingStatus!==P.Stopped&&this.mailbox.enqueue(t)}send(t){this.system._relay(void 0,this,t)}attachDevTools(){const{devTools:t}=this.options;t&&(typeof t=="function"?t:Ui)(this)}toJSON(){return{xstate$$type:an,id:this.id}}getPersistedSnapshot(t){return this.logic.getPersistedSnapshot(this._snapshot,t)}[Yi](){return this}getSnapshot(){return this._snapshot}}function Pt(n,...[t]){return new so(n,t)}function ro(n,t,e,s,{sendId:r}){const i=typeof r=="function"?r(e,s):r;return[t,{sendId:i},void 0]}function io(n,t){n.defer(()=>{n.system.scheduler.cancel(n.self,t.sendId)})}function oo(n){function t(e,s){}return t.type="xstate.cancel",t.sendId=n,t.resolve=ro,t.execute=io,t}function ao(n,t,e,s,{id:r,systemId:i,src:o,input:a,syncSnapshot:c}){const l=typeof o=="string"?on(t.machine,o):o,u=typeof r=="function"?r(e):r;let h,d;return l&&(d=typeof a=="function"?a({context:t.context,event:e.event,self:n.self}):a,h=Pt(l,{id:u,src:o,parent:n.self,syncSnapshot:c,systemId:i,input:d})),[wt(t,{children:{...t.children,[u]:h}}),{id:r,systemId:i,actorRef:h,src:o,input:d},void 0]}function co(n,{actorRef:t}){t&&n.defer(()=>{t._processingStatus!==P.Stopped&&t.start()})}function lo(...[n,{id:t,systemId:e,input:s,syncSnapshot:r=!1}={}]){function i(o,a){}return i.type="xstate.spawnChild",i.id=t,i.systemId=e,i.src=n,i.input=s,i.syncSnapshot=r,i.resolve=ao,i.execute=co,i}function uo(n,t,e,s,{actorRef:r}){const i=typeof r=="function"?r(e,s):r,o=typeof i=="string"?t.children[i]:i;let a=t.children;return o&&(a={...a},delete a[o.id]),[wt(t,{children:a}),o,void 0]}function ho(n,t){if(t){if(n.system._unregister(t),t._processingStatus!==P.Running){n.stopChild(t);return}n.defer(()=>{n.stopChild(t)})}}function ws(n){function t(e,s){}return t.type="xstate.stopChild",t.actorRef=n,t.resolve=uo,t.execute=ho,t}function cn(n,t,e,s){const{machine:r}=s,i=typeof n=="function",o=i?n:r.implementations.guards[typeof n=="string"?n:n.type];if(!i&&!o)throw new Error(`Guard '${typeof n=="string"?n:n.type}' is not implemented.'.`);if(typeof o!="function")return cn(o,t,e,s);const a={context:t,event:e},c=i||typeof n=="string"?void 0:"params"in n?typeof n.params=="function"?n.params({context:t,event:e}):n.params:void 0;return"check"in o?o.check(s,a,o):o(a,c)}const ln=n=>n.type==="atomic"||n.type==="final";function Ht(n){return Object.values(n.states).filter(t=>t.type!=="history")}function Yt(n,t){const e=[];if(t===n)return e;let s=n.parent;for(;s&&s!==t;)e.push(s),s=s.parent;return e}function le(n){const t=new Set(n),e=_s(t);for(const s of t)if(s.type==="compound"&&(!e.get(s)||!e.get(s).length))xn(s).forEach(r=>t.add(r));else if(s.type==="parallel"){for(const r of Ht(s))if(r.type!=="history"&&!t.has(r)){const i=xn(r);for(const o of i)t.add(o)}}for(const s of t){let r=s.parent;for(;r;)t.add(r),r=r.parent}return t}function bs(n,t){const e=t.get(n);if(!e)return{};if(n.type==="compound"){const r=e[0];if(r){if(ln(r))return r.key}else return{}}const s={};for(const r of e)s[r.key]=bs(r,t);return s}function _s(n){const t=new Map;for(const e of n)t.has(e)||t.set(e,[]),e.parent&&(t.has(e.parent)||t.set(e.parent,[]),t.get(e.parent).push(e));return t}function Es(n,t){const e=le(t);return bs(n,_s(e))}function un(n,t){return t.type==="compound"?Ht(t).some(e=>e.type==="final"&&n.has(e)):t.type==="parallel"?Ht(t).every(e=>un(n,e)):t.type==="final"}const me=n=>n[0]===Gi;function fo(n,t){return n.transitions.get(t)||[...n.transitions.keys()].filter(s=>{if(s===Zi)return!0;if(!s.endsWith(".*"))return!1;const r=s.split("."),i=t.split(".");for(let o=0;o<r.length;o++){const a=r[o],c=i[o];if(a==="*")return o===r.length-1;if(a!==c)return!1}return!0}).sort((s,r)=>r.length-s.length).flatMap(s=>n.transitions.get(s))}function po(n){const t=n.config.after;if(!t)return[];const e=r=>{const i=Vi(r,n.id),o=i.type;return n.entry.push(Lo(i,{id:o,delay:r})),n.exit.push(oo(o)),o};return Object.keys(t).flatMap(r=>{const i=t[r],o=typeof i=="string"?{target:i}:i,a=Number.isNaN(+r)?r:+r,c=e(a);return et(o).map(l=>({...l,event:c,delay:a}))}).map(r=>{const{delay:i}=r;return{...dt(n,r.event,r),delay:i}})}function dt(n,t,e){const s=ms(e.target),r=e.reenter??!1,i=mo(n,s),o={...e,actions:et(e.actions),guard:e.guard,target:i,source:n,reenter:r,eventType:t,toJSON:()=>({...o,source:`#${n.id}`,target:i?i.map(a=>`#${a.id}`):void 0})};return o}function go(n){const t=new Map;if(n.config.on)for(const e of Object.keys(n.config.on)){if(e===hs)throw new Error('Null events ("") cannot be specified as a transition key. Use `always: { ... }` instead.');const s=n.config.on[e];t.set(e,Tt(s).map(r=>dt(n,e,r)))}if(n.config.onDone){const e=`xstate.done.state.${n.id}`;t.set(e,Tt(n.config.onDone).map(s=>dt(n,e,s)))}for(const e of n.invoke){if(e.onDone){const s=`xstate.done.actor.${e.id}`;t.set(s,Tt(e.onDone).map(r=>dt(n,s,r)))}if(e.onError){const s=`xstate.error.actor.${e.id}`;t.set(s,Tt(e.onError).map(r=>dt(n,s,r)))}if(e.onSnapshot){const s=`xstate.snapshot.${e.id}`;t.set(s,Tt(e.onSnapshot).map(r=>dt(n,s,r)))}}for(const e of n.after){let s=t.get(e.eventType);s||(s=[],t.set(e.eventType,s)),s.push(e)}return t}function yo(n,t){const e=typeof t=="string"?n.states[t]:t?n.states[t.target]:void 0;if(!e&&t)throw new Error(`Initial state node "${t}" not found on parent state node #${n.id}`);const s={source:n,actions:!t||typeof t=="string"?[]:et(t.actions),eventType:null,reenter:!1,target:e?[e]:[],toJSON:()=>({...s,source:`#${n.id}`,target:e?[`#${e.id}`]:[]})};return s}function mo(n,t){if(t!==void 0)return t.map(e=>{if(typeof e!="string")return e;if(me(e))return n.machine.getStateNodeById(e);const s=e[0]===us;if(s&&!n.parent)return ue(n,e.slice(1));const r=s?n.key+e:e;if(n.parent)try{return ue(n.parent,r)}catch(i){throw new Error(`Invalid transition definition for state node '${n.id}':
|
|
14
|
+
${i.message}`)}else throw new Error(`Invalid target: "${e}" is not a valid target from the root node. Did you mean ".${e}"?`)})}function As(n){const t=ms(n.config.target);return t?{target:t.map(e=>typeof e=="string"?ue(n.parent,e):e)}:n.parent.initial}function pt(n){return n.type==="history"}function xn(n){const t=Ss(n);for(const e of t)for(const s of Yt(e,n))t.add(s);return t}function Ss(n){const t=new Set;function e(s){if(!t.has(s)){if(t.add(s),s.type==="compound")e(s.initial.target[0]);else if(s.type==="parallel")for(const r of Ht(s))e(r)}}return e(n),t}function Wt(n,t){if(me(t))return n.machine.getStateNodeById(t);if(!n.states)throw new Error(`Unable to retrieve child state '${t}' from '${n.id}'; no child states exist.`);const e=n.states[t];if(!e)throw new Error(`Child state '${t}' does not exist on '${n.id}'`);return e}function ue(n,t){if(typeof t=="string"&&me(t))try{return n.machine.getStateNodeById(t)}catch{}const e=rn(t).slice();let s=n;for(;e.length;){const r=e.shift();if(!r.length)break;s=Wt(s,r)}return s}function he(n,t){if(typeof t=="string"){const r=n.states[t];if(!r)throw new Error(`State '${t}' does not exist on '${n.id}'`);return[n,r]}const e=Object.keys(t),s=e.map(r=>Wt(n,r)).filter(Boolean);return[n.machine.root,n].concat(s,e.reduce((r,i)=>{const o=Wt(n,i);if(!o)return r;const a=he(o,t[i]);return r.concat(a)},[]))}function wo(n,t,e,s){const i=Wt(n,t).next(e,s);return!i||!i.length?n.next(e,s):i}function bo(n,t,e,s){const r=Object.keys(t),i=Wt(n,r[0]),o=hn(i,t[r[0]],e,s);return!o||!o.length?n.next(e,s):o}function _o(n,t,e,s){const r=[];for(const i of Object.keys(t)){const o=t[i];if(!o)continue;const a=Wt(n,i),c=hn(a,o,e,s);c&&r.push(...c)}return r.length?r:n.next(e,s)}function hn(n,t,e,s){return typeof t=="string"?wo(n,t,e,s):Object.keys(t).length===1?bo(n,t,e,s):_o(n,t,e,s)}function Eo(n){return Object.keys(n.states).map(t=>n.states[t]).filter(t=>t.type==="history")}function rt(n,t){let e=n;for(;e.parent&&e.parent!==t;)e=e.parent;return e.parent===t}function Ao(n,t){const e=new Set(n),s=new Set(t);for(const r of e)if(s.has(r))return!0;for(const r of s)if(e.has(r))return!0;return!1}function Ns(n,t,e){const s=new Set;for(const r of n){let i=!1;const o=new Set;for(const a of s)if(Ao(Ke([r],t,e),Ke([a],t,e)))if(rt(r.source,a.source))o.add(a);else{i=!0;break}if(!i){for(const a of o)s.delete(a);s.add(r)}}return Array.from(s)}function So(n){const[t,...e]=n;for(const s of Yt(t,void 0))if(e.every(r=>rt(r,s)))return s}function dn(n,t){if(!n.target)return[];const e=new Set;for(const s of n.target)if(pt(s))if(t[s.id])for(const r of t[s.id])e.add(r);else for(const r of dn(As(s),t))e.add(r);else e.add(s);return[...e]}function Ts(n,t){const e=dn(n,t);if(!e)return;if(!n.reenter&&e.every(r=>r===n.source||rt(r,n.source)))return n.source;const s=So(e.concat(n.source));if(s)return s;if(!n.reenter)return n.source.machine.root}function Ke(n,t,e){var r;const s=new Set;for(const i of n)if((r=i.target)!=null&&r.length){const o=Ts(i,e);i.reenter&&i.source===o&&s.add(o);for(const a of t)rt(a,o)&&s.add(a)}return[...s]}function No(n,t){if(n.length!==t.size)return!1;for(const e of n)if(!t.has(e))return!1;return!0}function Le(n,t,e,s,r,i){if(!n.length)return t;const o=new Set(t._nodes);let a=t.historyValue;const c=Ns(n,o,a);let l=t;r||([l,a]=Oo(l,s,e,c,o,a,i,e.actionExecutor)),l=Bt(l,s,e,c.flatMap(h=>h.actions),i,void 0),l=vo(l,s,e,c,o,i,a,r);const u=[...o];l.status==="done"&&(l=Bt(l,s,e,u.sort((h,d)=>d.order-h.order).flatMap(h=>h.exit),i,void 0));try{return a===t.historyValue&&No(t._nodes,o)?l:wt(l,{_nodes:u,historyValue:a})}catch(h){throw h}}function To(n,t,e,s,r){if(s.output===void 0)return;const i=We(r.id,r.output!==void 0&&r.parent?Be(r.output,n.context,t,e.self):void 0);return Be(s.output,n.context,i,e.self)}function vo(n,t,e,s,r,i,o,a){let c=n;const l=new Set,u=new Set;Io(s,o,u,l),a&&u.add(n.machine.root);const h=new Set;for(const d of[...l].sort((y,f)=>y.order-f.order)){r.add(d);const y=[];y.push(...d.entry);for(const f of d.invoke)y.push(lo(f.src,{...f,syncSnapshot:!!f.onSnapshot}));if(u.has(d)){const f=d.initial.actions;y.push(...f)}if(c=Bt(c,t,e,y,i,d.invoke.map(f=>f.id)),d.type==="final"){const f=d.parent;let m=(f==null?void 0:f.type)==="parallel"?f:f==null?void 0:f.parent,A=m||d;for((f==null?void 0:f.type)==="compound"&&i.push(We(f.id,d.output!==void 0?Be(d.output,c.context,t,e.self):void 0));(m==null?void 0:m.type)==="parallel"&&!h.has(m)&&un(r,m);)h.add(m),i.push(We(m.id)),A=m,m=m.parent;if(m)continue;c=wt(c,{status:"done",output:To(c,t,e,c.machine.root,A)})}}return c}function Io(n,t,e,s){for(const r of n){const i=Ts(r,t);for(const a of r.target||[])!pt(a)&&(r.source!==a||r.source!==i||r.reenter)&&(s.add(a),e.add(a)),It(a,t,e,s);const o=dn(r,t);for(const a of o){const c=Yt(a,i);(i==null?void 0:i.type)==="parallel"&&c.push(i),vs(s,t,e,c,!r.source.parent&&r.reenter?void 0:i)}}}function It(n,t,e,s){var r;if(pt(n))if(t[n.id]){const i=t[n.id];for(const o of i)s.add(o),It(o,t,e,s);for(const o of i)Ne(o,n.parent,s,t,e)}else{const i=As(n);for(const o of i.target)s.add(o),i===((r=n.parent)==null?void 0:r.initial)&&e.add(n.parent),It(o,t,e,s);for(const o of i.target)Ne(o,n.parent,s,t,e)}else if(n.type==="compound"){const[i]=n.initial.target;pt(i)||(s.add(i),e.add(i)),It(i,t,e,s),Ne(i,n,s,t,e)}else if(n.type==="parallel")for(const i of Ht(n).filter(o=>!pt(o)))[...s].some(o=>rt(o,i))||(pt(i)||(s.add(i),e.add(i)),It(i,t,e,s))}function vs(n,t,e,s,r){for(const i of s)if((!r||rt(i,r))&&n.add(i),i.type==="parallel")for(const o of Ht(i).filter(a=>!pt(a)))[...n].some(a=>rt(a,o))||(n.add(o),It(o,t,e,n))}function Ne(n,t,e,s,r){vs(e,s,r,Yt(n,t))}function Oo(n,t,e,s,r,i,o,a){let c=n;const l=Ke(s,r,i);l.sort((h,d)=>d.order-h.order);let u;for(const h of l)for(const d of Eo(h)){let y;d.history==="deep"?y=f=>ln(f)&&rt(f,h):y=f=>f.parent===h,u??(u={...i}),u[d.id]=Array.from(r).filter(y)}for(const h of l)c=Bt(c,t,e,[...h.exit,...h.invoke.map(d=>ws(d.id))],o,void 0),r.delete(h);return[c,u||i]}function ko(n,t){return n.implementations.actions[t]}function Is(n,t,e,s,r,i){const{machine:o}=n;let a=n;for(const c of s){const l=typeof c=="function",u=l?c:ko(o,typeof c=="string"?c:c.type),h={context:a.context,event:t,self:e.self,system:e.system},d=l||typeof c=="string"?void 0:"params"in c?typeof c.params=="function"?c.params({context:a.context,event:t}):c.params:void 0;if(!u||!("resolve"in u)){e.actionExecutor({type:typeof c=="string"?c:typeof c=="object"?c.type:c.name||"(anonymous)",info:h,params:d,exec:u});continue}const y=u,[f,m,A]=y.resolve(e,a,h,d,u,r);a=f,"retryResolve"in y&&(i==null||i.push([y,m])),"execute"in y&&e.actionExecutor({type:y.type,info:h,params:m,exec:y.execute.bind(null,e,m)}),A&&(a=Is(a,t,e,A,r,i))}return a}function Bt(n,t,e,s,r,i){const o=i?[]:void 0,a=Is(n,t,e,s,{internalQueue:r,deferredActorIds:i},o);return o==null||o.forEach(([c,l])=>{c.retryResolve(e,a,l)}),a}function Te(n,t,e,s){let r=n;const i=[];function o(l,u,h){e.system._sendInspectionEvent({type:"@xstate.microstep",actorRef:e.self,event:u,snapshot:l,_transitions:h}),i.push(l)}if(t.type===He)return r=wt($n(r,t,e),{status:"stopped"}),o(r,t,[]),{snapshot:r,microstates:i};let a=t;if(a.type!==ds){const l=a,u=Qi(l),h=Pn(l,r);if(u&&!h.length)return r=wt(n,{status:"error",error:l.error}),o(r,l,[]),{snapshot:r,microstates:i};r=Le(h,n,e,a,!1,s),o(r,l,h)}let c=!0;for(;r.status==="active";){let l=c?Co(r,a):[];const u=l.length?r:void 0;if(!l.length){if(!s.length)break;a=s.shift(),l=Pn(a,r)}r=Le(l,r,e,a,!1,s),c=r!==u,o(r,a,l)}return r.status!=="active"&&$n(r,a,e),{snapshot:r,microstates:i}}function $n(n,t,e){return Bt(n,t,e,Object.values(n.children).map(s=>ws(s)),[],void 0)}function Pn(n,t){return t.machine.getTransitionData(t,n)}function Co(n,t){const e=new Set,s=n._nodes.filter(ln);for(const r of s)t:for(const i of[r].concat(Yt(r,void 0)))if(i.always){for(const o of i.always)if(o.guard===void 0||cn(o.guard,n.context,t,n)){e.add(o);break t}}return Ns(Array.from(e),new Set(n._nodes),n.historyValue)}function Ro(n,t){const e=le(he(n,t));return Es(n,[...e])}function Mo(n){return!!n&&typeof n=="object"&&"machine"in n&&"value"in n}const xo=function(t){return ps(t,this.value)},$o=function(t){return this.tags.has(t)},Po=function(t){const e=this.machine.getTransitionData(this,t);return!!(e!=null&&e.length)&&e.some(s=>s.target!==void 0||s.actions.length)},Ho=function(){const{_nodes:t,tags:e,machine:s,getMeta:r,toJSON:i,can:o,hasTag:a,matches:c,...l}=this;return{...l,tags:Array.from(e)}},Wo=function(){return this._nodes.reduce((t,e)=>(e.meta!==void 0&&(t[e.id]=e.meta),t),{})};function re(n,t){return{status:n.status,output:n.output,error:n.error,machine:t,context:n.context,_nodes:n._nodes,value:Es(t.root,n._nodes),tags:new Set(n._nodes.flatMap(e=>e.tags)),children:n.children,historyValue:n.historyValue||{},matches:xo,hasTag:$o,can:Po,getMeta:Wo,toJSON:Ho}}function wt(n,t={}){return re({...n,...t},n.machine)}function Bo(n,t){const{_nodes:e,tags:s,machine:r,children:i,context:o,can:a,hasTag:c,matches:l,getMeta:u,toJSON:h,...d}=n,y={};for(const m in i){const A=i[m];y[m]={snapshot:A.getPersistedSnapshot(t),src:A.src,systemId:A._systemId,syncSnapshot:A._syncSnapshot}}return{...d,context:Os(o),children:y}}function Os(n){let t;for(const e in n){const s=n[e];if(s&&typeof s=="object")if("sessionId"in s&&"send"in s&&"ref"in s)t??(t=Array.isArray(n)?n.slice():{...n}),t[e]={xstate$$type:an,id:s.id};else{const r=Os(s);r!==s&&(t??(t=Array.isArray(n)?n.slice():{...n}),t[e]=r)}}return t??n}function Do(n,t,e,s,{event:r,id:i,delay:o},{internalQueue:a}){const c=t.machine.implementations.delays;if(typeof r=="string")throw new Error(`Only event objects may be used with raise; use raise({ type: "${r}" }) instead`);const l=typeof r=="function"?r(e,s):r;let u;if(typeof o=="string"){const h=c&&c[o];u=typeof h=="function"?h(e,s):h}else u=typeof o=="function"?o(e,s):o;return typeof u!="number"&&a.push(l),[t,{event:l,id:i,delay:u},void 0]}function Ko(n,t){const{event:e,delay:s,id:r}=t;if(typeof s=="number"){n.defer(()=>{const i=n.self;n.system.scheduler.schedule(i,i,e,s,r)});return}}function Lo(n,t){function e(s,r){}return e.type="xstate.raise",e.event=n,e.id=t==null?void 0:t.id,e.delay=t==null?void 0:t.delay,e.resolve=Do,e.execute=Ko,e}function zo(n,{machine:t,context:e},s,r){const i=(o,a)=>{if(typeof o=="string"){const c=on(t,o);if(!c)throw new Error(`Actor logic '${o}' not implemented in machine '${t.id}'`);const l=Pt(c,{id:a==null?void 0:a.id,parent:n.self,syncSnapshot:a==null?void 0:a.syncSnapshot,input:typeof(a==null?void 0:a.input)=="function"?a.input({context:e,event:s,self:n.self}):a==null?void 0:a.input,src:o,systemId:a==null?void 0:a.systemId});return r[l.id]=l,l}else return Pt(o,{id:a==null?void 0:a.id,parent:n.self,syncSnapshot:a==null?void 0:a.syncSnapshot,input:a==null?void 0:a.input,src:o,systemId:a==null?void 0:a.systemId})};return(o,a)=>{const c=i(o,a);return r[c.id]=c,n.defer(()=>{c._processingStatus!==P.Stopped&&c.start()}),c}}function jo(n,t,e,s,{assignment:r}){if(!t.context)throw new Error("Cannot assign to undefined `context`. Ensure that `context` is defined in the machine config.");const i={},o={context:t.context,event:e.event,spawn:zo(n,t,e.event,i),self:n.self,system:n.system};let a={};if(typeof r=="function")a=r(o,s);else for(const l of Object.keys(r)){const u=r[l];a[l]=typeof u=="function"?u(o,s):u}const c=Object.assign({},t.context,a);return[wt(t,{context:c,children:Object.keys(i).length?{...t.children,...i}:t.children}),void 0,void 0]}function Uo(n){function t(e,s){}return t.type="xstate.assign",t.assignment=n,t.resolve=jo,t}const Hn=new WeakMap;function Nt(n,t,e){let s=Hn.get(n);return s?t in s||(s[t]=e()):(s={[t]:e()},Hn.set(n,s)),s[t]}const Fo={},Lt=n=>typeof n=="string"?{type:n}:typeof n=="function"?"resolve"in n?{type:n.type}:{type:n.name}:n;class fn{constructor(t,e){if(this.config=t,this.key=void 0,this.id=void 0,this.type=void 0,this.path=void 0,this.states=void 0,this.history=void 0,this.entry=void 0,this.exit=void 0,this.parent=void 0,this.machine=void 0,this.meta=void 0,this.output=void 0,this.order=-1,this.description=void 0,this.tags=[],this.transitions=void 0,this.always=void 0,this.parent=e._parent,this.key=e._key,this.machine=e._machine,this.path=this.parent?this.parent.path.concat(this.key):[],this.id=this.config.id||[this.machine.id,...this.path].join(us),this.type=this.config.type||(this.config.states&&Object.keys(this.config.states).length?"compound":this.config.history?"history":"atomic"),this.description=this.config.description,this.order=this.machine.idMap.size,this.machine.idMap.set(this.id,this),this.states=this.config.states?Cn(this.config.states,(s,r)=>new fn(s,{_parent:this,_key:r,_machine:this.machine})):Fo,this.type==="compound"&&!this.config.initial)throw new Error(`No initial state specified for compound state node "#${this.id}". Try adding { initial: "${Object.keys(this.states)[0]}" } to the state config.`);this.history=this.config.history===!0?"shallow":this.config.history||!1,this.entry=et(this.config.entry).slice(),this.exit=et(this.config.exit).slice(),this.meta=this.config.meta,this.output=this.type==="final"||!this.parent?this.config.output:void 0,this.tags=et(t.tags).slice()}_initialize(){this.transitions=go(this),this.config.always&&(this.always=Tt(this.config.always).map(t=>dt(this,hs,t))),Object.keys(this.states).forEach(t=>{this.states[t]._initialize()})}get definition(){return{id:this.id,key:this.key,version:this.machine.version,type:this.type,initial:this.initial?{target:this.initial.target,source:this,actions:this.initial.actions.map(Lt),eventType:null,reenter:!1,toJSON:()=>({target:this.initial.target.map(t=>`#${t.id}`),source:`#${this.id}`,actions:this.initial.actions.map(Lt),eventType:null})}:void 0,history:this.history,states:Cn(this.states,t=>t.definition),on:this.on,transitions:[...this.transitions.values()].flat().map(t=>({...t,actions:t.actions.map(Lt)})),entry:this.entry.map(Lt),exit:this.exit.map(Lt),meta:this.meta,order:this.order||-1,output:this.output,invoke:this.invoke,description:this.description,tags:this.tags}}toJSON(){return this.definition}get invoke(){return Nt(this,"invoke",()=>et(this.config.invoke).map((t,e)=>{const{src:s,systemId:r}=t,i=t.id??Rn(this.id,e),o=typeof s=="string"?s:`xstate.invoke.${Rn(this.id,e)}`;return{...t,src:o,id:i,systemId:r,toJSON(){const{onDone:a,onError:c,...l}=t;return{...l,type:"xstate.invoke",src:o,id:i}}}}))}get on(){return Nt(this,"on",()=>[...this.transitions].flatMap(([e,s])=>s.map(r=>[e,r])).reduce((e,[s,r])=>(e[s]=e[s]||[],e[s].push(r),e),{}))}get after(){return Nt(this,"delayedTransitions",()=>po(this))}get initial(){return Nt(this,"initial",()=>yo(this,this.config.initial))}next(t,e){const s=e.type,r=[];let i;const o=Nt(this,`candidates-${s}`,()=>fo(this,s));for(const a of o){const{guard:c}=a,l=t.context;let u=!1;try{u=!c||cn(c,l,e,t)}catch(h){const d=typeof c=="string"?c:typeof c=="object"?c.type:void 0;throw new Error(`Unable to evaluate guard ${d?`'${d}' `:""}in transition for event '${s}' in state node '${this.id}':
|
|
15
|
+
${h.message}`)}if(u){r.push(...a.actions),i=a;break}}return i?[i]:void 0}get events(){return Nt(this,"events",()=>{const{states:t}=this,e=new Set(this.ownEvents);if(t)for(const s of Object.keys(t)){const r=t[s];if(r.states)for(const i of r.events)e.add(`${i}`)}return Array.from(e)})}get ownEvents(){const t=new Set([...this.transitions.keys()].filter(e=>this.transitions.get(e).some(s=>!(!s.target&&!s.actions.length&&!s.reenter))));return Array.from(t)}}const Go="#";class pn{constructor(t,e){this.config=t,this.version=void 0,this.schemas=void 0,this.implementations=void 0,this.__xstatenode=!0,this.idMap=new Map,this.root=void 0,this.id=void 0,this.states=void 0,this.events=void 0,this.id=t.id||"(machine)",this.implementations={actors:(e==null?void 0:e.actors)??{},actions:(e==null?void 0:e.actions)??{},delays:(e==null?void 0:e.delays)??{},guards:(e==null?void 0:e.guards)??{}},this.version=this.config.version,this.schemas=this.config.schemas,this.transition=this.transition.bind(this),this.getInitialSnapshot=this.getInitialSnapshot.bind(this),this.getPersistedSnapshot=this.getPersistedSnapshot.bind(this),this.restoreSnapshot=this.restoreSnapshot.bind(this),this.start=this.start.bind(this),this.root=new fn(t,{_key:this.id,_machine:this}),this.root._initialize(),this.states=this.root.states,this.events=this.root.events}provide(t){const{actions:e,guards:s,actors:r,delays:i}=this.implementations;return new pn(this.config,{actions:{...e,...t.actions},guards:{...s,...t.guards},actors:{...r,...t.actors},delays:{...i,...t.delays}})}resolveState(t){const e=Ro(this.root,t.value),s=le(he(this.root,e));return re({_nodes:[...s],context:t.context||{},children:{},status:un(s,this.root)?"done":t.status||"active",output:t.output,error:t.error,historyValue:t.historyValue},this)}transition(t,e,s){return Te(t,e,s,[]).snapshot}microstep(t,e,s){return Te(t,e,s,[]).microstates}getTransitionData(t,e){return hn(this.root,t.value,t,e)||[]}getPreInitialState(t,e,s){const{context:r}=this.config,i=re({context:typeof r!="function"&&r?r:{},_nodes:[this.root],children:{},status:"active"},this);return typeof r=="function"?Bt(i,e,t,[Uo(({spawn:a,event:c,self:l})=>r({spawn:a,input:c.input,self:l}))],s,void 0):i}getInitialSnapshot(t,e){const s=fs(e),r=[],i=this.getPreInitialState(t,s,r),o=Le([{target:[...Ss(this.root)],source:this.root,reenter:!0,actions:[],eventType:null,toJSON:null}],i,t,s,!0,r),{snapshot:a}=Te(o,s,t,r);return a}start(t){Object.values(t.children).forEach(e=>{e.getSnapshot().status==="active"&&e.start()})}getStateNodeById(t){const e=rn(t),s=e.slice(1),r=me(e[0])?e[0].slice(Go.length):e[0],i=this.idMap.get(r);if(!i)throw new Error(`Child state node '#${r}' does not exist on machine '${this.id}'`);return ue(i,s)}get definition(){return this.root.definition}toJSON(){return this.definition}getPersistedSnapshot(t,e){return Bo(t,e)}restoreSnapshot(t,e){const s={},r=t.children;Object.keys(r).forEach(c=>{const l=r[c],u=l.snapshot,h=l.src,d=typeof h=="string"?on(this,h):h;if(!d)return;const y=Pt(d,{id:c,parent:e.self,syncSnapshot:l.syncSnapshot,snapshot:u,src:h,systemId:l.systemId});s[c]=y});const i=re({...t,children:s,_nodes:Array.from(le(he(this.root,t.value)))},this),o=new Set;function a(c,l){if(!o.has(c)){o.add(c);for(const u in c){const h=c[u];if(h&&typeof h=="object"){if("xstate$$type"in h&&h.xstate$$type===an){c[u]=l[h.id];continue}a(h,l)}}}}return a(i.context,s),i}}function Zo(n,t){return new pn(n,t)}const ee=n=>n===!1?!1:n.map(t=>t.serialize()),Vo=n=>n===!1?!1:n.serialize(),Jo=n=>n===!1?!1:n.map(t=>({tile:t.tile.toString(),candidates:t.candidates.map(e=>e.toString()),shanten:t.shanten})),ze=n=>JSON.parse(JSON.stringify(n)),ne=n=>n===!1?!1:ze(n),je=n=>Zo({id:"Untitled",initial:"distribute",context:{currentWind:E.E,oneShotMap:$(!1),missingMap:$(!1),controller:n,genEventID:ks()},states:{distribute:{on:{NEXT:{target:"drawn"}},entry:{type:"notify_distribution"}},drawn:{entry:{type:"notify_draw"},on:{NEXT:{target:"waiting_user_event_after_drawn",actions:{type:"notify_choice_after_drawn"},description:`可能なアクションとその詳細を通知\\
|
|
16
16
|
DISCARD の場合は捨てられる牌の一覧`}}},waiting_user_event_after_drawn:{description:"ツモった1ユーザからのレスポンス待ち",on:{TSUMO:{target:"tsumo",guard:"canWin"},REACH:{target:"waiting_reach_acceptance",actions:[{type:"notify_reach"},{type:"notify_choice_for_reach_acceptance"}],guard:{type:"canReach"}},SHO_KAN:{target:"an_sho_kaned"},AN_KAN:{target:"an_sho_kaned"},DISCARD:{target:"discarded",description:"入力に牌が必須",actions:{type:"disable_one_shot_for_me"}},DRAWN_GAME_BY_NINE_ORPHANS:{target:"drawn_game"}}},discarded:{entry:{type:"notify_discard"},on:{NEXT:{target:"waiting_user_event_after_discarded",actions:{type:"notify_choice_after_discarded"},description:`可能なアクションとその詳細を通知\\
|
|
17
17
|
CHI/PON の場合は鳴ける組み合わせの一覧`}}},tsumo:{exit:[{type:"notify_tsumo"},{type:"notify_end"}],type:"final"},waiting_reach_acceptance:{on:{REACH_ACCEPT:{target:"reached"},RON:{target:"roned",guard:{type:"canWin"}}},description:"リーチに対するアクションは RON か ACCEPT のみである"},waiting_user_event_after_discarded:{description:`最大 4人から choice に対するレスポンスを待つ\\
|
|
18
18
|
ユーザからではなく、controller が優先順位を考慮して遷移させる必要がある\\
|
|
19
|
-
通知する choice がない場合、controller が\\*で遷移させる`,on:{RON:{target:"roned",guard:"canWin"},PON:{target:"poned",guard:"canPon"},CHI:{target:"chied",guard:"canChi"},DAI_KAN:{target:"dai_kaned"},"*":{target:"wildcard_after_discarded"}}},reached:{on:{NEXT:{target:"waiting_user_event_after_discarded",actions:{type:"notify_choice_after_discarded"}}},entry:{type:"notify_reach_accepted"}},roned:{exit:[{type:"notify_ron"},{type:"notify_end"}],type:"final"},poned:{on:{NEXT:{target:"waiting_discard_event",actions:{type:"notify_choice_after_called"}}},entry:[{type:"notify_call"},{type:"disable_none_shot"}]},chied:{on:{NEXT:{target:"waiting_discard_event",actions:{type:"notify_choice_after_called",params:{action:"chi"}}}},entry:[{type:"notify_call"},{type:"disable_one_shot"}]},wildcard_after_discarded:{exit:[],always:[{target:"drawn_game",guard:"cannotContinue"},{target:"drawn",actions:[{type:"updateNextWind"}]}]},waiting_discard_event:{description:"鳴いたユーザからの DISCARD イベントを待つ",on:{DISCARD:{target:"discarded"}}},dai_kaned:{on:{NEXT:{target:"waiting_user_event_after_drawn",actions:[{type:"notify_draw",params:{action:"kan"}},{type:"notify_choice_after_drawn",params:{replacementWin:!0}}]}},entry:[{type:"notify_call"},{type:"disable_one_shot"}]},an_sho_kaned:{always:{target:"waiting_chankan_event"},entry:[{type:"notify_call"},{type:"disable_one_shot"},{type:"notify_new_dora_if_needed"},{type:"notify_choice_for_chankan"}]},waiting_chankan_event:{description:"チャンカンを待つ",on:{"*":{target:"waiting_user_event_after_drawn",actions:[{type:"notify_draw",params:{action:"kan"}},{type:"notify_choice_after_drawn",params:{replacementWin:!0}}]},RON:{target:"roned",guard:{type:"canWin"}}}},drawn_game:{exit:{type:"notify_end",params:{}},type:"final"}},types:{events:{},context:{}}},{actions:{updateNextWind:({context:t,event:e})=>{const s=t.currentWind;t.currentWind=gt(s)},notify_distribution:({context:t,event:e})=>{const s=t.genEventID(),r=t.controller.initialHands();for(const i of Object.values(E)){const o=$("_____________");o[i]=r[i].toString();const a={id:s,type:"DISTRIBUTE",hands:o,wind:i,doraMarker:t.controller.wall.doraMarkers[0].toString(),sticks:t.controller.placeManager.sticks,round:t.controller.placeManager.round,players:t.controller.playerIDs,places:t.controller.placeManager.playerMap,scores:t.controller.scoreManager.summary};t.controller.emit(a)}t.controller.next()},notify_choice_after_drawn:({context:t,event:e},s)=>{const r=t.currentWind,i=t.controller.hand(r).drawn,o=t.genEventID(),a={id:o,type:"CHOICE_AFTER_DRAWN",wind:r,drawerInfo:{wind:r,tile:i.toString()},choices:{TSUMO:ne(t.controller.doWin(r,i,{oneShot:t.oneShotMap[r],replacementWin:s==null?void 0:s.replacementWin})),REACH:Jo(t.controller.doReach(r)),AN_KAN:ee(t.controller.doAnKan(r)),SHO_KAN:ee(t.controller.doShoKan(r)),DISCARD:t.controller.doDiscard(r).map(c=>c.toString()),DRAWN_GAME_BY_NINE_ORPHANS:t.controller.canDrawnGame(r)}};t.controller.emit(a),t.controller.pollReplies(o,[r])},notify_choice_after_discarded:({context:t,event:e})=>{const s=t.genEventID(),r=t.controller.river.lastTile,i=r.t.clone({add:y.HORIZONTAL});for(const o of Object.values(E)){const a={id:s,type:"CHOICE_AFTER_DISCARDED",wind:o,discarterInfo:{wind:r.w,tile:r.t.toString()},choices:{RON:ne(t.controller.doWin(o,i,{discardedBy:r.w,oneShot:t.oneShotMap[o],missingRon:t.missingMap[o]})),PON:ee(t.controller.doPon(o,r.w,i)),CHI:ee(t.controller.doChi(o,r.w,i)),DAI_KAN:Vo(t.controller.doDaiKan(o,r.w,i))}};a.choices.RON&&(t.missingMap[o]=!0),t.controller.emit(a)}t.controller.pollReplies(s,Object.values(E))},notify_choice_after_called:({context:t,event:e},s)=>{const r=t.genEventID(),i=t.currentWind;let o=t.controller.doDiscard(i);const a=t.controller.hand(t.currentWind).called.at(-1);(a instanceof Z||a instanceof V)&&(o=t.controller.doDiscard(i,a));const c={id:r,type:"CHOICE_AFTER_CALLED",wind:i,choices:{DISCARD:o.map(l=>l.toString())}};t.controller.emit(c),t.controller.pollReplies(r,[i])},notify_choice_for_reach_acceptance:({context:t,event:e})=>{const s=t.genEventID(),r=t.controller.river.lastTile,i=r.t.clone({add:y.HORIZONTAL});for(const o of Object.values(E)){const a={id:s,type:"CHOICE_FOR_REACH_ACCEPTANCE",wind:o,reacherInfo:{wind:r.w,tile:i.toString()},choices:{RON:ne(t.controller.doWin(o,i,{discardedBy:r.w,oneShot:t.oneShotMap[o],missingRon:t.missingMap[o]}))}};t.controller.emit(a)}t.controller.pollReplies(s,Object.values(E))},notify_choice_for_chankan:({context:t,event:e})=>{N(e.type=="SHO_KAN"||e.type=="AN_KAN",`unexpected event ${e.type}`);const s=t.genEventID(),r=e.block.tiles[0].clone({remove:y.HORIZONTAL});for(const i of Object.values(E)){const o=t.controller.doWin(i,e.block.tiles[0].clone({remove:y.HORIZONTAL}),{discardedBy:e.iam,quadWin:!0,oneShot:t.oneShotMap[i],missingRon:t.missingMap[e.iam]}),a={id:s,type:"CHOICE_FOR_CHAN_KAN",wind:i,callerInfo:{wind:e.iam,tile:r.toString()},choices:{RON:e.type=="SHO_KAN"?ne(o):!1}};a.choices.RON&&(t.missingMap[i]=!0),t.controller.emit(a)}t.controller.pollReplies(s,Object.values(E))},notify_call:({context:t,event:e})=>{N(e.type=="CHI"||e.type=="PON"||e.type=="DAI_KAN"||e.type=="AN_KAN"||e.type=="SHO_KAN",`unexpected event ${e.type}`);const s=t.genEventID(),r=e.iam;t.currentWind=r;for(const i of Object.values(E)){const o={id:s,type:e.type,iam:r,wind:i,block:e.block.serialize()};t.controller.emit(o)}t.controller.next()},notify_discard:({context:t,event:e})=>{N(e.type=="DISCARD",`unexpected event ${e.type}`);const s=t.genEventID(),r=t.currentWind,i=e.tile;for(const o of Object.values(E)){const a={id:s,type:"DISCARD",iam:r,wind:o,tile:i.toString()};t.controller.emit(a)}t.controller.next()},notify_draw:({context:t,event:e},s)=>{const r=t.genEventID(),i=s==null?void 0:s.action;let o;i=="kan"?o=t.controller.wall.kan():o=t.controller.wall.draw();const a=t.currentWind;t.controller.hand(a).reached||(t.missingMap[a]=!1);for(const c of Object.values(E)){let l=new w(p.BACK,0,[y.TSUMO]);c==a&&(l=o);const u={id:r,type:"DRAW",subType:i,iam:a,wind:c,tile:l.toString()};t.controller.emit(u)}t.controller.next()},notify_ron:({context:t,event:e})=>{N(e.type=="RON");const s=t.genEventID(),r=e.iam;for(const i of Object.values(E)){const o={id:s,type:e.type,iam:r,wind:i,victimInfo:{wind:e.targetInfo.wind,tile:e.targetInfo.tile.toString()},ret:ze(e.ret)};t.controller.emit(o)}},notify_tsumo:({context:t,event:e})=>{N(e.type=="TSUMO",`unexpected event ${e.type}`);const s=t.genEventID(),r=t.currentWind;for(const i of Object.values(E)){const o={id:s,type:e.type,iam:r,wind:i,lastTile:t.controller.hand(r).drawn.toString(),ret:ze(e.ret)};t.controller.emit(o)}},notify_reach:({context:t,event:e})=>{N(e.type=="REACH",`unexpected event ${e.type}`);const s=t.genEventID(),r=e.iam,i=e.tile.clone({add:y.HORIZONTAL});t.oneShotMap[r]=!0;for(const o of Object.values(E)){const a={id:s,type:e.type,iam:r,wind:o,tile:i.toString()};t.controller.emit(a)}},notify_reach_accepted:({context:t,event:e})=>{N(e.type=="REACH_ACCEPT");const s=t.genEventID();for(const r of Object.values(E)){const i={id:s,type:"REACH_ACCEPTED",reacherInfo:{wind:e.reacherInfo.wind,tile:e.reacherInfo.tile.toString()},wind:r};t.controller.emit(i)}t.controller.next()},notify_new_dora_if_needed:({context:t,event:e})=>{const s=t.genEventID();if(e.type=="AN_KAN"){const r=t.controller.wall.openDoraMarker();for(const i of Object.values(E)){const o={id:s,type:"NEW_DORA",wind:i,doraMarker:r.toString()};t.controller.emit(o)}}e.type=="SHO_KAN"},disable_one_shot:({context:t,event:e})=>{for(const s of Object.values(E))t.oneShotMap[s]=!1},disable_one_shot_for_me:({context:t,event:e})=>{t.oneShotMap[t.currentWind]=!1},notify_end:({context:t,event:e})=>{const s=t.genEventID(),r=$("");if(e.type=="DRAWN_GAME_BY_NINE_ORPHANS"){r[e.iam]=t.controller.hand(e.iam).toString();for(const i of Object.values(E)){const o={id:s,type:"END_GAME",subType:"NINE_TILES",wind:i,shouldContinue:!0,sticks:t.controller.placeManager.sticks,scores:t.controller.scoreManager.summary,deltas:$(0),hands:r};t.controller.emit(o)}}else if(e.type=="RON"||e.type=="TSUMO"){const i=e.iam==E.E,o=t.controller.finalResult(e.ret,e.iam);for(const a of Object.values(E)){r[e.iam]=t.controller.hand(e.iam).toString();const c={id:s,type:"END_GAME",subType:"WIN_GAME",wind:a,shouldContinue:i,sticks:{reach:0,dead:0},scores:t.controller.scoreManager.summary,deltas:o.deltas,hands:r};t.controller.emit(c)}}else if(!t.controller.wall.canKan||t.controller.river.cannotContinue()){const i=t.controller.wall.canKan?"FOUR_WIND":"FOUR_KAN";for(const o of Object.values(E)){const a={id:s,type:"END_GAME",subType:i,wind:o,shouldContinue:!0,sticks:t.controller.placeManager.sticks,scores:t.controller.scoreManager.summary,deltas:$(0),hands:$("")};t.controller.emit(a)}}else{if(t.controller.wall.canDraw)throw new Error(`unexpected event ${e.type}`);{const i=[];for(const l of Object.values(E)){const u=t.controller.hand(l);new Xt(u).calc()==0&&(i.push(l),r[l]=u.toString())}const o=i.length==0||i.length==4,a=$(0);for(const l of Object.values(E))i.includes(l)?a[l]+=o?0:3e3/i.length:a[l]-=o?0:3e3/(4-i.length);const c=i.length==4||a[E.E]>0;for(const l of Object.values(E)){const u={id:s,type:"END_GAME",subType:"DRAWN_GAME",wind:l,shouldContinue:c,sticks:t.controller.placeManager.sticks,scores:t.controller.scoreManager.summary,deltas:a,hands:r};t.controller.emit(u)}}}}},actors:{},guards:{canChi:({context:t,event:e},s)=>e.type=="CHI"?!!t.controller.doChi(e.iam,t.controller.river.lastTile.w,t.controller.river.lastTile.t):(console.error(`guards.canChi receive ${e.type}`),!1),canPon:({context:t,event:e},s)=>e.type=="PON"?!!t.controller.doPon(e.iam,t.controller.river.lastTile.w,t.controller.river.lastTile.t):(console.error(`guards.canPon receive ${e.type}`),!1),canWin:({context:t,event:e},s)=>e.type=="TSUMO"||e.type=="RON"?!0:(console.error(`guards.canWin receive ${e.type}`),!1),canReach:({context:t,event:e},s)=>e.type=="REACH"?!!t.controller.doReach(e.iam):(console.error(`guards.canReach receive ${e.type}`),!1),cannotContinue:({context:t,event:e},s)=>!t.controller.wall.canDraw||!t.controller.wall.canKan||t.controller.river.cannotContinue()},delays:{}});function ks(n=0){let t=n;return()=>(t++).toString()}class mt{constructor(t){_(this,"walls",{replacement:[],dead:[],doraMarkers:[],blindDoraMarkers:[],drawable:[]});_(this,"backup");_(this,"openedDoraCount",1);this.init(t),this.backup=mt.clone(this.walls)}kan(){if(this.walls.replacement.length==0)throw new Error("exceeded maximum kan");const t=this.walls.replacement.pop();return this.walls.drawable.pop(),w.from(t)}draw(){if(!this.walls.drawable)throw new Error("cannot draw any more");return w.from(this.walls.drawable.pop())}openDoraMarker(){if(this.openedDoraCount>=4)throw new Error("exceeded maximum open dora");return this.openedDoraCount++,w.from(this.walls.doraMarkers[this.openedDoraCount-1])}get doraMarkers(){return this.walls.doraMarkers.slice(0,this.openedDoraCount).map(w.from)}get blindDoraMarkers(){return this.walls.blindDoraMarkers.slice(0,this.openedDoraCount).map(w.from)}get canKan(){return this.walls.replacement.length>0}get canDraw(){return this.walls.drawable.length>0}initialHands(){const t=$("");for(let e=0;e<3;e++)for(const s of Object.values(E))for(let r=0;r<4;r++)t[s]+=this.draw().toString();for(const e of Object.values(E))t[e]+=this.draw().toString();return t}init(t){if(t!=null){this.walls=mt.clone(t);return}else{for(let e of Object.values(p)){if(e==p.BACK)continue;const s=e==p.Z?[1,2,3,4,5,6,7]:[1,2,3,4,5,6,7,8,9];for(let r=0;r<4;r++)for(let i of s){let o=new w(e,i);e!=p.Z&&r==3&&i==5&&(o=o.clone({add:y.RED})),this.walls.drawable.push(o.toString())}}nn(this.walls.drawable)}for(let e=0;e<14;e++)this.walls.dead.push(this.walls.drawable.pop());for(let e=0;e<4;e++)this.walls.blindDoraMarkers.push(this.walls.dead.pop());for(let e=0;e<4;e++)this.walls.doraMarkers.push(this.walls.dead.pop());for(let e=0;e<4;e++)this.walls.replacement.push(this.walls.dead.pop())}export(){return this.backup}static clone(t){return{drawable:t.drawable.concat(),dead:t.dead.concat(),doraMarkers:t.doraMarkers.concat(),blindDoraMarkers:t.blindDoraMarkers.concat(),replacement:t.replacement.concat()}}}class qt{constructor(t,e){_(this,"wall",new mt);_(this,"playerIDs");_(this,"actor",Pt(je(this),{}));_(this,"observer");_(this,"handlers",{});_(this,"mailBox",{});_(this,"histories",[]);_(this,"debugMode");this.debugMode=(e==null?void 0:e.debug)??!1,this.handlers=t.reduce((o,a)=>(o[a.id]=a.handler,o),{}),this.playerIDs=t.map(o=>o.id),t.forEach(o=>o.handler.on(a=>this.enqueue(a)));const s=cs();this.observer=new Cs(s),this.observer.eventHandler.on(o=>this.observer.handleEvent(o));const r=Object.fromEntries(this.playerIDs.map(o=>[o,25e3]));this.observer.scoreManager=new Gt(r);const i=(e==null?void 0:e.shuffle)==!1?this.playerIDs:nn([...this.playerIDs]);this.observer.placeManager=new Zt({[i[0]]:E.E,[i[1]]:E.S,[i[2]]:E.W,[i[3]]:E.N})}boardParams(t){let s=this.hand(t).reached?1:void 0;if(s){const r=this.river.discards(t);s=r.length==0||r.length==1&&r[0].t.has(y.HORIZONTAL)?2:1}return{doraMarkers:this.observer.doraMarkers,round:this.placeManager.round,myWind:t,sticks:this.observer.placeManager.sticks,reached:s}}hand(t){return this.observer.hand(t)}get placeManager(){return this.observer.placeManager}get scoreManager(){return this.observer.scoreManager}get river(){return this.observer.river}next(t){(!this.debugMode||t)&&this.actor.send({type:"NEXT"})}emit(t){const e=this.observer.placeManager.playerID(t.wind);this.handlers[e].emit(t);const s=t.iam;t.wind==s?this.observer.eventHandler.emit(t):s==null&&(!this.observer.applied[t.id]||t.type=="DISTRIBUTE")&&(this.observer.eventHandler.emit(t),this.observer.applied[t.id]=!0)}enqueue(t){this.mailBox[t.id]==null&&(this.mailBox[t.id]=[]),this.mailBox[t.id].push(t)}pollReplies(t,e){const s=this.mailBox[t];if(s==null)throw new Error(`not enqueued ${t} at ${this.actor.getSnapshot().value}`);if(s.length!=e.length)throw new Error(`${t}: num of event: got: ${e.length}, want: ${s.length}`);if(e.length==0){console.warn("no events to handle");return}const r=s[0];if(r.type=="CHOICE_AFTER_DISCARDED"){const i=rs(s);if(i.events.length==0){this.actor.send({type:""});return}const o=i.events[0];switch(i.type){case"RON":N(o.choices.RON,"ron choice is none"),this.actor.send({type:i.type,iam:o.wind,ret:zt(o.choices.RON),targetInfo:{wind:o.discarterInfo.wind,tile:w.from(o.discarterInfo.tile)}});break;case"DAI_KAN":N(o.choices.DAI_KAN,"daikan choice is none"),this.actor.send({type:i.type,iam:o.wind,block:Y.from(o.choices.DAI_KAN.tiles)});break;case"CHI":case"PON":const a=o.choices[i.type];N(a,`${i.type} choice is none`),N(i.events.length==1,`found more than one selected: ${JSON.stringify(i,null,2)}`);const c=V.deserialize(a[0]);this.actor.send({type:i.type,iam:o.wind,block:c})}}else if(r.type=="CHOICE_AFTER_DRAWN"){const i=is(s);N(i.events.length==1,`found more than one selected: ${JSON.stringify(i,null,2)}`);const o=i.events[0],a=o.wind;switch(i.type){case"TSUMO":N(o.choices.TSUMO,"tsumo choice is none"),this.actor.send({type:i.type,ret:zt(o.choices.TSUMO),lastTile:w.from(o.drawerInfo.tile),iam:a});break;case"REACH":const c=o.choices[i.type];N(c,`${i.type} candidates is none`),this.actor.send({type:"REACH",tile:w.from(c[0].tile),iam:a});break;case"DISCARD":const l=o.choices[i.type];N(l,`${i.type} choice is none`),this.actor.send({type:i.type,tile:w.from(l[0]).clone({remove:y.TSUMO}),iam:a});break;case"AN_KAN":{const u=o.choices[i.type];N(u,`${i.type} choice is none`),this.actor.send({type:i.type,block:R.from(u[0].tiles),iam:a});break}case"SHO_KAN":{const u=o.choices[i.type];N(u,`${i.type} choice is none`),this.actor.send({type:i.type,block:D.from(u[0].tiles),iam:a});break}case"DRAWN_GAME_BY_NINE_ORPHANS":this.actor.send({type:"DRAWN_GAME_BY_NINE_ORPHANS",iam:a});break}}else if(r.type=="CHOICE_AFTER_CALLED"){N(r.choices.DISCARD,`discard candidate tile is none: ${JSON.stringify(r,null,2)} ${this.hand(r.wind).toString()}`);const i=r.wind,o=w.from(r.choices.DISCARD[0]);this.actor.send({type:"DISCARD",tile:o,iam:i})}else if(r.type=="CHOICE_FOR_REACH_ACCEPTANCE"){const i=s.filter(a=>(N(a.type=="CHOICE_FOR_REACH_ACCEPTANCE"),a.choices.RON!==!1));if(i.length==0){this.actor.send({type:"REACH_ACCEPT",reacherInfo:{tile:w.from(r.reacherInfo.tile),wind:r.reacherInfo.wind}});return}const o=i[0];this.actor.send({type:"RON",iam:o.wind,ret:zt(o.choices.RON),targetInfo:{wind:o.reacherInfo.wind,tile:w.from(o.reacherInfo.tile)}});return}else if(r.type=="CHOICE_FOR_CHAN_KAN"){const i=s.filter(a=>a.choices.RON!==!1);if(i.length==0){this.actor.send({type:""});return}const o=i[0];N(o.choices.RON,"ron choice is none"),this.actor.send({type:"RON",iam:o.wind,ret:zt(o.choices.RON),quadWin:!0,targetInfo:{wind:o.callerInfo.wind,tile:w.from(o.callerInfo.tile)}});return}else console.warn(`controller found unexpected event: ${r.type}`)}export(){return this.histories.concat()}static load(t){const e=t.choiceEvents,s=Object.keys(t.players),r={emit:a=>{},on:a=>{}},i=s.map(a=>({id:a,handler:r})),o=new qt(i);return o.playerIDs=s,o.mailBox=e,o.observer.placeManager=new Zt(t.players,{round:t.round,sticks:structuredClone(t.sticks)}),o.observer.scoreManager=new Gt(t.scores),o.wall=new mt(t.wall),o}start(){this.actor.subscribe(s=>{console.debug("State:",s.value)});const t={scores:this.scoreManager.summary,round:this.placeManager.round,players:this.placeManager.playerMap,wall:this.wall.export(),choiceEvents:this.mailBox,sticks:this.placeManager.sticks};this.actor.start(),this.histories.push(t);const e=this.actor.getSnapshot().status;if(e!="done")throw new Error(`unexpected state ${this.actor.getSnapshot().value}(${e})`)}startGame(){for(;console.debug(`start========${this.placeManager.round}=============`),this.start(),this.wall=new mt,this.observer.applied={},this.mailBox={},this.actor=Pt(je(this)),!this.placeManager.is(k.W1););}finalResult(t,e){const s=this.hand(e),r=s.reached?this.wall.blindDoraMarkers:void 0,i=new $e(s,{...t.boardContext,sticks:this.placeManager.sticks,blindDoraMarkers:r}).calc(t.hand);return N(i),i}doWin(t,e,s){if(e==null)return!1;let r=this.hand(t);const i=this.boardParams(t);if(r.drawn==null){if(s==null)throw new Error("should ron but params == null");if(s.discardedBy==t||s.missingRon)return!1;r=r.clone(),i.ronWind=s.discardedBy,i.finalDiscardWin=!this.wall.canDraw,i.quadWin=s.quadWin,r.inc([e])}else i.finalWallWin=!this.wall.canDraw,i.replacementWin=s==null?void 0:s.replacementWin;i.oneShotWin=s==null?void 0:s.oneShot;const o=new ns(r),a=new $e(r,i),c=o.calc(e),l=a.calc(...c);if(!l||l.points.length==0)return!1;if(r.draw==null){const u=$t.candidateTiles(this.hand(t)).candidates;if(this.river.discards(t).some(h=>u.some(d=>d.equals(h.t))))return!1}return l}doPon(t,e,s){if(s==null||t==e)return!1;const r=this.hand(t);if(r.reached||r.hands.length<3||r.get(s.t,s.n)<2)return!1;const i=s.clone({removeAll:!0}),o=Ie(t,e,b.PON),a=[],c=new V([i,i,i]).clone({replace:{idx:o,tile:s.clone({add:y.HORIZONTAL})}});let l=c;C(s)&&s.has(y.RED)&&(l=c.clone({replace:{idx:o,tile:i.clone({add:[y.RED,y.HORIZONTAL]})}}));const u=o%2+1;if(C(s)&&r.get(s.t,0)>0&&(l=c.clone({replace:{idx:u,tile:i.clone({add:y.RED})}})),a.push(l),C(i)&&r.get(i.t,5)==3){const h=c.clone({replace:{idx:u,tile:i}});a.push(h)}return a}doChi(t,e,s){if(s==null||!s.isNum()||gt(e)!=t)return!1;const r=this.hand(t);if(r.reached||r.hands.length<3)return!1;const i=s.clone({remove:y.TSUMO,add:[y.HORIZONTAL]}),o=[];i.n-2>=1&&r.get(s.t,i.n-2)>0&&r.get(s.t,i.n-1)>0&&o.push(new Z([i,new w(s.t,i.n-1),new w(s.t,i.n-2)])),i.n+2<=9&&r.get(s.t,i.n+1)>0&&r.get(s.t,i.n+2)>0&&o.push(new Z([i,new w(s.t,i.n+1),new w(s.t,i.n+2)])),i.n-1>=1&&i.n+1<=9&&r.get(s.t,i.n-1)>0&&r.get(s.t,i.n+1)>0&&o.push(new Z([i,new w(s.t,i.n-1),new w(s.t,i.n+1)]));for(let d=0;d<o.length;d++){const g=o[d],f=this.cannotDiscardTile(g),m=[];for(const O of f){const M=r.get(O.t,O.n);for(let Et=0;Et<M;Et++)m.push(O.clone({remove:y.RED}))}const A=r.dec([...m,g.tiles[1],g.tiles[2]]),S=r.hands.length==0;r.inc(A),S&&o.splice(d,1)}if(o.length==0)return!1;const h=r.get(s.t,0)>0?this.redPattern(o):[];return h.length>0&&r.get(s.t,5)==1?h:[...o,...h]}redPattern(t){return t.length==0?[]:t.filter(s=>C(s.tiles[1])||C(s.tiles[2])).map(s=>{if(C(s.tiles[1])){const r=s.tiles[1].clone({add:y.RED});return s.clone({replace:{idx:1,tile:r}})}else if(C(s.tiles[2])){const r=s.tiles[2].clone({add:y.RED});return s.clone({replace:{idx:2,tile:r}})}}).filter(s=>s!=null)}doReach(t){const e=this.hand(t);return e.reached||!e.menzen||new Xt(e).calc()>0?!1:$t.calcCandidates(e,e.hands)}doDiscard(t,e){if(this.hand(t).reached)return[this.hand(t).drawn];const s=this.hand(t).hands;if(e==null)return s;if(e instanceof V)return s.filter(o=>!o.equals(e.tiles[0]));const r=this.cannotDiscardTile(e),i=s.filter(o=>!r.some(a=>o.equals(a)));return N(i.length>0,`no tiles to discard. hand: ${this.hand(t)}, suji: ${r}, block-chi: ${e}`),i}cannotDiscardTile(t){const e=t.tiles[0],s=t.tiles[1].n;return s!=1&&e.n-2==s?[new w(e.t,e.n-3),e]:s!=8&&e.n+1==s?[new w(e.t,e.n+3),e]:[e]}doAnKan(t){const e=this.hand(t),s=[];if(e.reached)return!1;for(const[r,i]of L())if(e.get(r,i)==4){const o=new w(r,i),a=[o,o,o,o];C(o)&&(a[1]=o.clone({add:y.RED})),s.push(new R(a))}if(s.length==0)return!1;for(const r of s)N(r.tiles.filter(i=>i.has(y.HORIZONTAL)).length==0,`h op ${r.toString()}`);return s}doShoKan(t){const e=this.hand(t);if(e.reached)return!1;const s=e.called.filter(i=>i instanceof V);if(s.length==0)return!1;const r=[];for(const i of s){const o=i.tiles[0].clone({removeAll:!0,add:y.HORIZONTAL});if(e.get(o.t,o.n)==1){const a=C(o)&&e.get(o.t,0)>0?o.clone({add:y.RED}):o;r.push(new D([...i.tiles,a]))}}if(r.length==0)return!1;for(const i of r)N(i.tiles.filter(o=>o.has(y.HORIZONTAL)).length==2,`h op ${i.toString()}`);return r}doDaiKan(t,e,s){const r=this.hand(t);if(r.reached||t==e)return!1;const i=s.clone({removeAll:!0});if(r.get(i.t,i.n)!=3)return!1;const o=Ie(t,e,b.DAI_KAN);let a=new Y([i,i,i,i]).clone({replace:{idx:o,tile:i.clone({add:y.HORIZONTAL})}});if(C(s)&&s.has(y.RED))a=a.clone({replace:{idx:o,tile:i.clone({add:[y.HORIZONTAL,y.RED]})}});else if(C(s)&&!s.has(y.RED)){N(r.get(s.t,0)>0,`hand does not have red tile: ${r.toString()}`);const c=o%3+1;a=a.clone({replace:{idx:c,tile:i.clone({add:y.RED})}})}return N(a.tiles.filter(c=>c.has(y.HORIZONTAL)).length==1,`h op ${a.toString()}`),a}canDrawnGame(t){if(this.river.discards(t).length!=0)return!1;const e=this.hand(t);let s=0;for(const r of Object.values(p)){if(r==p.BACK)continue;const i=r==p.Z?xt:G;for(const o of i)e.get(r,o)>0&&s++}return s>=9}initialHands(){return this.wall.initialHands()}}class bt extends ye{isBackHand(){for(const t of Object.values(p))if(t!=p.BACK&&this.sum(t)>0)return!1;return this.sum(p.BACK)>0}clone(){const t=new bt(this.toString());return t.data.reached=this.data.reached,t}dec(t){return this.isBackHand()?(super.dec(t.map(()=>new w(p.BACK,0))),[...t]):super.dec(t)}}class gn{constructor(t,e){_(this,"id");_(this,"river",new sn);_(this,"placeManager",new Zt({}));_(this,"scoreManager",new Gt({}));_(this,"hands",$(new bt("")));_(this,"counter",new ls);_(this,"doraMarkers",[]);_(this,"eventHandler");this.id=t,this.eventHandler=e}hand(t){return this.hands[t]}handleEvent(t){switch(t.type){case"CHOICE_AFTER_CALLED":case"CHOICE_AFTER_DISCARDED":case"CHOICE_AFTER_DRAWN":case"CHOICE_FOR_CHAN_KAN":case"CHOICE_FOR_REACH_ACCEPTANCE":break;case"DISTRIBUTE":this.counter.reset();const e=w.from(t.doraMarker);this.setHands(t),this.placeManager=new Zt(structuredClone(t.places),{round:t.round,sticks:structuredClone(t.sticks)}),this.scoreManager=new Gt(structuredClone(t.scores)),this.doraMarkers=[e],this.counter.dec(e);for(const r of Object.values(E))r==t.wind&&this.counter.dec(...this.hand(r).hands);break;case"DRAW":{const r=w.from(t.tile);this.hands[t.iam].draw(r),this.counter.dec(r);break}case"DISCARD":{const r=w.from(t.tile);if(this.river.discard(r,t.iam),this.hands[t.iam].discard(r),t.iam!=t.wind){this.counter.dec(r),this.counter.addTileToSafeMap(r,t.iam);for(const i of Object.values(E))this.hand(i).reached&&this.counter.addTileToSafeMap(r,i)}break}case"PON":case"CHI":case"DAI_KAN":{const r=v.deserialize(t.block);this.hands[t.iam].call(r),this.river.markCalled(),t.iam!=t.wind&&this.counter.dec(...r.tiles.filter(i=>!i.has(y.HORIZONTAL)));break}case"SHO_KAN":{const r=D.from(t.block.tiles);this.hands[t.iam].kan(r),t.iam!=t.wind&&this.counter.dec(r.tiles.filter(i=>i.has(y.HORIZONTAL))[0]);break}case"AN_KAN":{const r=R.from(t.block.tiles);this.hands[t.iam].kan(r),t.iam!=t.wind&&this.counter.dec(...r.tiles.filter(i=>!i.has(y.HORIZONTAL)));break}case"REACH":{this.hands[t.iam].reach();const r=w.from(t.tile);if(this.river.discard(r,t.iam),this.hands[t.iam].discard(r),t.iam!=t.wind){this.counter.dec(r),this.counter.addTileToSafeMap(r,t.iam);for(const i of Object.values(E))this.hand(i).reached&&this.counter.addTileToSafeMap(r,i)}break}case"REACH_ACCEPTED":const s=this.placeManager.playerID(t.reacherInfo.wind);this.scoreManager.reach(s),this.placeManager.incrementReachStick();break;case"NEW_DORA":{const r=w.from(t.doraMarker);this.doraMarkers.push(r),this.counter.dec(r);break}case"TSUMO":break;case"RON":break;case"END_GAME":switch(t.subType){case"NINE_TILES":case"FOUR_KAN":case"FOUR_WIND":this.placeManager.incrementDeadStick();break;case"DRAWN_GAME":{const r=this.placeManager.playerMap;this.scoreManager.update(t.deltas,r),this.placeManager.incrementDeadStick(),t.shouldContinue||this.placeManager.nextRound();break}case"WIN_GAME":{const r=this.placeManager.playerMap;this.scoreManager.update(t.deltas,r),t.shouldContinue?this.placeManager.incrementDeadStick():(this.placeManager.nextRound(),this.placeManager.resetDeadStick()),this.placeManager.resetReachStick();break}}break;default:throw new Error(`unexpected event ${JSON.stringify(t,null,2)}`)}}}class Cs extends gn{constructor(e){super("observer",e);_(this,"applied",{});this.counter.disable=!0,this.hands=$(new bt("_____________"))}setHands(e){this.hands[e.wind]=new bt(e.hands[e.wind])}handleEvent(e){switch(super.handleEvent(e),e.type){case"DISTRIBUTE":let s=!0;for(const r of Object.values(E))s&&(s=this.hand(r).get(p.BACK,0)==0);if(!s)break;console.debug("DISTRIBUTE:",`round: ${this.placeManager.round}`,`scores: ${JSON.stringify(this.scoreManager.summary,null,2)}`,`map: ${JSON.stringify(this.placeManager.playerMap,null,2)}`,`sticks: ${JSON.stringify(this.placeManager.sticks,null,2)}`);for(const r of Object.values(E))console.debug(`${this.placeManager.playerID(r)}(${r})`,`init hand: ${this.hand(r).toString()}`);break;case"DRAW":console.debug(`${this.placeManager.playerID(e.iam)}(${e.iam})`,`draw: ${this.hand(e.iam).drawn}`,`hand: ${this.hand(e.iam).toString()}`);break;case"DISCARD":console.debug(`${this.placeManager.playerID(e.iam)}(${e.iam})`,`discard: ${e.tile.toString()}`,`hand: ${this.hand(e.iam).toString()}`);break;case"CHI":case"PON":case"DAI_KAN":case"AN_KAN":case"SHO_KAN":console.debug(`${this.placeManager.playerID(e.iam)}(${e.iam})`,`call: ${e.block.tiles}`,`hand: ${this.hand(e.iam).toString()}`);break;case"REACH":console.debug(`${this.placeManager.playerID(e.iam)}(${e.iam})`,`reach: ${e.tile}`,`hand: ${this.hand(e.iam).toString()}`);break;case"TSUMO":case"RON":console.debug(`${this.placeManager.playerID(e.iam)}(${e.iam})`,`ron/tsumo: ${JSON.stringify(e.ret,null,2)}`,`hand: ${this.hand(e.iam).toString()}`);break;case"END_GAME":for(const r of Object.values(E))console.debug(`${this.placeManager.playerID(r)}(${fe(r)})`,`end hand: ${this.hand(r).toString()}`);console.debug("END_GAME",e.subType,"scores",JSON.stringify(this.scoreManager.summary,null,2),`sticks: ${JSON.stringify(this.placeManager.sticks,null,2)}`)}}}class Ut extends gn{constructor(e,s){super(e,s);_(this,"river",new sn);_(this,"doras",[]);this.eventHandler.on(r=>this.handleEvent(r))}get myWind(){return this.placeManager.wind(this.id)}setHands(e){for(const s of Object.values(E))this.hands[s]=new bt(e.hands[s])}handleDiscard(e){const s=Object.values(E).filter(u=>u==this.myWind?!1:this.hand(u).reached),r=new Xt(this.hand(this.myWind)).calc();if(s.length>0&&r>=2)return Ot.selectTile(this.counter,s,e);const i=$t.calcCandidates(this.hand(this.myWind),e),a=Vt.calcPlayerCandidates(this.counter,i).sort((u,h)=>h.sum-u.sum),c=a.filter(u=>u.sum==a[0].sum);return Vt.selectMinPriority(this.counter,c,this.doras).tile}handleEvent(e){switch(e.type){case"CHOICE_AFTER_DISCARDED":e.choices.CHI=!1,e.choices.DAI_KAN=!1,e.choices.PON=!1,this.eventHandler.emit(e);break;case"CHOICE_AFTER_CALLED":case"CHOICE_AFTER_DRAWN":if(e.choices.DISCARD){const s=this.handleDiscard(e.choices.DISCARD.map(w.from));e.choices.DISCARD=[s.toString()]}this.eventHandler.emit(e);break;case"CHOICE_FOR_REACH_ACCEPTANCE":this.eventHandler.emit(e);break;case"CHOICE_FOR_CHAN_KAN":this.eventHandler.emit(e);break;default:super.handleEvent(e)}}}class Xo{constructor(t){_(this,"index",0);_(this,"histories",[]);this.histories=JSON.parse(t)}next(){N(this.index<this.histories.length),this.index++}prev(){this.index--,N(this.index<0)}start(){qt.load(this.histories[this.index]).start()}auto(){for(;this.index<this.histories.length;this.next())this.start()}}const Yo=n=>{const[t,e]=jt(),[s,r]=jt(),[i,o]=jt(),[a,c]=jt(),l=["player-1","player-2","player-3","player-4"],u=n==null?void 0:n.playerInjection,h=(u==null?void 0:u.p1)??Ut,d=(u==null?void 0:u.p2)??Ut,g=(u==null?void 0:u.p3)??Ut,f=(u==null?void 0:u.p4)??Ut,m=new h(l[0],e),A=new d(l[1],r),S=new g(l[2],o),O=new f(l[3],c),M=[{handler:t,id:l[0]},{handler:s,id:l[1]},{handler:i,id:l[2]},{handler:a,id:l[3]}];return{c:new qt(M,{debug:n==null?void 0:n.debug,shuffle:n==null?void 0:n.shuffle}),p1:m,p2:A,p3:S,p4:O}},ut=(n,t)=>{let s=1;for(let r of t)r.equals(n)&&(s*=2);return s};class Vt{static calcPlayerCandidates(t,e){let s=[];for(let r of e){let i=0,o=[];for(let a of r.candidates)o.push({tile:a.clone(),n:t.get(a)}),i+=t.get(a);s.push({sum:i,tile:r.tile,candidates:o,shanten:r.shanten})}return s}static selectMinPriority(t,e,s){N(e.length>0);let r=0,i=0;for(let o=0;o<e.length;o++){const a=Vt.calcPriority(t,e[o],s);a<r&&(r=a,i=o)}return e[i]}static calcPriority(t,e,s){const r=e.tile;let i=0;if(r.t==p.Z)return i=t.get(r),(r.n==5||r.n==6||r.n==7)&&(i*=2),i*ut(r,s);{const o=t.get(r);i+=o*ut(r,s);const a=t.get(new w(r.t,r.n+1)),c=t.get(new w(r.t,r.n+2)),l=t.get(new w(r.t,r.n-1)),u=t.get(new w(r.t,r.n-2)),h=r.n-2>0?Math.min(l,u):0,d=r.n+2<=9?Math.min(a,c):0,g=r.n-1>=1&&r.n+1<=9?Math.min(a,l):0,f=Math.max(h,g),m=Math.max(g,d);return i+=o*ut(r,s),i+=h*ut(new w(r.t,r.n-2),s),i+=d*ut(new w(r.t,r.n+2),s),i+=f*ut(new w(r.t,r.n-1),s),i+=m*ut(new w(r.t,r.n+1),s),r.n==0,i}}}class Ot{static selectTile(t,e,s){N(e.length>0&&s.length>0);let r=s[0],i=Number.POSITIVE_INFINITY;for(let o of s){const a=Ot.rank(t,e,o);a<i&&(r=o,i=a)}return r}static rank(t,e,s){let r=0;const i=s.isNum()?Ot.rankN:Ot.rankZ;for(let o of e){const a=i(t,o,s);r<a&&(r=a)}return r}static rankZ(t,e,s){if(s.t!=p.Z)throw new Error(`expected TYPE.Z but ${s.toString()}`);if(t.isSafeTile(s.t,s.n,e))return 0;const r=t.get(s);return Math.min(r,3)}static rankN(t,e,s){if(!s.isNum())throw new Error(`expected TYPE.NUMBER but ${s.toString()}`);const r=s.n,i=s.t;if(t.isSafeTile(i,r,e))return 0;if(r==1)return t.isSafeTile(i,4,e)?3:6;if(r==9)return t.isSafeTile(i,6,e)?3:6;if(r==2||r==8)return t.isSafeTile(i,5,e)?4:8;if(r==3)return t.isSafeTile(i,6,e)?5:8;if(r==7)return t.isSafeTile(i,4,e)?5:8;const o=t.isSafeTile(i,r-3,e),a=t.isSafeTile(i,r+3,e);return o&&a?4:o||a?8:12}}exports.ActorHand=bt;exports.BLOCK=b;exports.BaseActor=gn;exports.Block=v;exports.BlockAnKan=R;exports.BlockCalculator=ns;exports.BlockChi=Z;exports.BlockDaiKan=Y;exports.BlockHand=kt;exports.BlockIsolated=Ze;exports.BlockOther=Ve;exports.BlockPair=H;exports.BlockPon=V;exports.BlockRun=Q;exports.BlockShoKan=D;exports.BlockThree=z;exports.Controller=qt;exports.Counter=ls;exports.DoubleCalculator=$e;exports.Efficiency=$t;exports.FONT_FAMILY=Ue;exports.G=T;exports.Hand=ye;exports.INPUT_SEPARATOR=q;exports.Image=qe;exports.ImageHelper=en;exports.Mark=ot;exports.MeasureText=Bs;exports.MyG=oi;exports.MyImage=ai;exports.MyRect=li;exports.MySVG=ii;exports.MyText=ui;exports.MyUse=ci;exports.N19=G;exports.NZ=xt;exports.OP=y;exports.Observer=Cs;exports.Parser=W;exports.PlaceManager=Zt;exports.Player=Ut;exports.PlayerEfficiency=Vt;exports.ROUND=k;exports.ROUND_MAP=Fe;exports.Rect=Qe;exports.Replayer=Xo;exports.RiskRank=Ot;exports.River=sn;exports.STICK_CONTEXT=ve;exports.SVG=Zn;exports.ScoreManager=Gt;exports.ShantenCalculator=Xt;exports.Svg=Gn;exports.Symbol=tn;exports.TABLE_CONTEXT=Wn;exports.TILE_CONTEXT=nt;exports.TYPE=p;exports.Text=yt;exports.Tile=w;exports.Use=ge;exports.WIND=E;exports.WIND_MAP=de;exports.Wall=mt;exports.callBlockIndex=Ie;exports.convertInput=es;exports.createControllerMachine=je;exports.createEventEmitter=cs;exports.createEventPipe=jt;exports.createHand=vt;exports.createLocalGame=Yo;exports.createTable=Xn;exports.createWindMap=$;exports.deserializeWinResult=zt;exports.drawBlocks=mi;exports.drawTable=vi;exports.forHand=L;exports.incrementalIDGenerator=ks;exports.isNum5=C;exports.nextRound=Ft;exports.nextWind=gt;exports.optimizeSVG=bi;exports.parse=Qn;exports.parseTableInput=ts;exports.prevRound=Fs;exports.prevWind=fe;exports.prioritizeDiscardedEvents=rs;exports.prioritizeDrawnEvents=is;exports.shuffle=nn;exports.sortCalledTiles=Bn;exports.tileSortFunc=Jt;
|
|
19
|
+
通知する choice がない場合、controller が\\*で遷移させる`,on:{RON:{target:"roned",guard:"canWin"},PON:{target:"poned",guard:"canPon"},CHI:{target:"chied",guard:"canChi"},DAI_KAN:{target:"dai_kaned"},"*":{target:"wildcard_after_discarded"}}},reached:{on:{NEXT:{target:"waiting_user_event_after_discarded",actions:{type:"notify_choice_after_discarded"}}},entry:{type:"notify_reach_accepted"}},roned:{exit:[{type:"notify_ron"},{type:"notify_end"}],type:"final"},poned:{on:{NEXT:{target:"waiting_discard_event",actions:{type:"notify_choice_after_called"}}},entry:[{type:"notify_call"},{type:"disable_none_shot"}]},chied:{on:{NEXT:{target:"waiting_discard_event",actions:{type:"notify_choice_after_called",params:{action:"chi"}}}},entry:[{type:"notify_call"},{type:"disable_one_shot"}]},wildcard_after_discarded:{exit:[],always:[{target:"drawn_game",guard:"cannotContinue"},{target:"drawn",actions:[{type:"updateNextWind"}]}]},waiting_discard_event:{description:"鳴いたユーザからの DISCARD イベントを待つ",on:{DISCARD:{target:"discarded"}}},dai_kaned:{on:{NEXT:{target:"waiting_user_event_after_drawn",actions:[{type:"notify_draw",params:{action:"kan"}},{type:"notify_choice_after_drawn",params:{replacementWin:!0}}]}},entry:[{type:"notify_call"},{type:"disable_one_shot"}]},an_sho_kaned:{always:{target:"waiting_chankan_event"},entry:[{type:"notify_call"},{type:"disable_one_shot"},{type:"notify_new_dora_if_needed"},{type:"notify_choice_for_chankan"}]},waiting_chankan_event:{description:"チャンカンを待つ",on:{"*":{target:"waiting_user_event_after_drawn",actions:[{type:"notify_draw",params:{action:"kan"}},{type:"notify_choice_after_drawn",params:{replacementWin:!0}}]},RON:{target:"roned",guard:{type:"canWin"}}}},drawn_game:{exit:{type:"notify_end",params:{}},type:"final"}},types:{events:{},context:{}}},{actions:{updateNextWind:({context:t,event:e})=>{const s=t.currentWind;t.currentWind=gt(s)},notify_distribution:({context:t,event:e})=>{const s=t.genEventID(),r=t.controller.initialHands();for(const i of Object.values(E)){const o=$("_____________");o[i]=r[i].toString();const a={id:s,type:"DISTRIBUTE",hands:o,wind:i,doraMarker:t.controller.wall.doraMarkers[0].toString(),sticks:t.controller.placeManager.sticks,round:t.controller.placeManager.round,players:t.controller.playerIDs,places:t.controller.placeManager.playerMap,scores:t.controller.scoreManager.summary};t.controller.emit(a)}t.controller.next()},notify_choice_after_drawn:({context:t,event:e},s)=>{const r=t.currentWind,i=t.controller.hand(r).drawn,o=t.genEventID(),a={id:o,type:"CHOICE_AFTER_DRAWN",wind:r,drawerInfo:{wind:r,tile:i.toString()},choices:{TSUMO:ne(t.controller.doWin(r,i,{oneShot:t.oneShotMap[r],replacementWin:s==null?void 0:s.replacementWin})),REACH:Jo(t.controller.doReach(r)),AN_KAN:ee(t.controller.doAnKan(r)),SHO_KAN:ee(t.controller.doShoKan(r)),DISCARD:t.controller.doDiscard(r).map(c=>c.toString()),DRAWN_GAME_BY_NINE_ORPHANS:t.controller.canDrawnGame(r)}};t.controller.emit(a),t.controller.pollReplies(o,[r])},notify_choice_after_discarded:({context:t,event:e})=>{const s=t.genEventID(),r=t.controller.river.lastTile,i=r.t.clone({add:g.HORIZONTAL});for(const o of Object.values(E)){const a={id:s,type:"CHOICE_AFTER_DISCARDED",wind:o,discarterInfo:{wind:r.w,tile:r.t.toString()},choices:{RON:ne(t.controller.doWin(o,i,{discardedBy:r.w,oneShot:t.oneShotMap[o],missingRon:t.missingMap[o]})),PON:ee(t.controller.doPon(o,r.w,i)),CHI:ee(t.controller.doChi(o,r.w,i)),DAI_KAN:Vo(t.controller.doDaiKan(o,r.w,i))}};a.choices.RON&&(t.missingMap[o]=!0),t.controller.emit(a)}t.controller.pollReplies(s,Object.values(E))},notify_choice_after_called:({context:t,event:e},s)=>{const r=t.genEventID(),i=t.currentWind;let o=t.controller.doDiscard(i);const a=t.controller.hand(t.currentWind).called.at(-1);(a instanceof Z||a instanceof V)&&(o=t.controller.doDiscard(i,a));const c={id:r,type:"CHOICE_AFTER_CALLED",wind:i,choices:{DISCARD:o.map(l=>l.toString())}};t.controller.emit(c),t.controller.pollReplies(r,[i])},notify_choice_for_reach_acceptance:({context:t,event:e})=>{const s=t.genEventID(),r=t.controller.river.lastTile,i=r.t.clone({add:g.HORIZONTAL});for(const o of Object.values(E)){const a={id:s,type:"CHOICE_FOR_REACH_ACCEPTANCE",wind:o,reacherInfo:{wind:r.w,tile:i.toString()},choices:{RON:ne(t.controller.doWin(o,i,{discardedBy:r.w,oneShot:t.oneShotMap[o],missingRon:t.missingMap[o]}))}};t.controller.emit(a)}t.controller.pollReplies(s,Object.values(E))},notify_choice_for_chankan:({context:t,event:e})=>{N(e.type=="SHO_KAN"||e.type=="AN_KAN",`unexpected event ${e.type}`);const s=t.genEventID(),r=e.block.tiles[0].clone({remove:g.HORIZONTAL});for(const i of Object.values(E)){const o=t.controller.doWin(i,e.block.tiles[0].clone({remove:g.HORIZONTAL}),{discardedBy:e.iam,quadWin:!0,oneShot:t.oneShotMap[i],missingRon:t.missingMap[e.iam]}),a={id:s,type:"CHOICE_FOR_CHAN_KAN",wind:i,callerInfo:{wind:e.iam,tile:r.toString()},choices:{RON:e.type=="SHO_KAN"?ne(o):!1}};a.choices.RON&&(t.missingMap[i]=!0),t.controller.emit(a)}t.controller.pollReplies(s,Object.values(E))},notify_call:({context:t,event:e})=>{N(e.type=="CHI"||e.type=="PON"||e.type=="DAI_KAN"||e.type=="AN_KAN"||e.type=="SHO_KAN",`unexpected event ${e.type}`);const s=t.genEventID(),r=e.iam;t.currentWind=r;for(const i of Object.values(E)){const o={id:s,type:e.type,iam:r,wind:i,block:e.block.serialize()};t.controller.emit(o)}t.controller.next()},notify_discard:({context:t,event:e})=>{N(e.type=="DISCARD",`unexpected event ${e.type}`);const s=t.genEventID(),r=t.currentWind,i=e.tile;for(const o of Object.values(E)){const a={id:s,type:"DISCARD",iam:r,wind:o,tile:i.toString()};t.controller.emit(a)}t.controller.next()},notify_draw:({context:t,event:e},s)=>{const r=t.genEventID(),i=s==null?void 0:s.action;let o;i=="kan"?o=t.controller.wall.kan():o=t.controller.wall.draw();const a=t.currentWind;t.controller.hand(a).reached||(t.missingMap[a]=!1);for(const c of Object.values(E)){let l=new w(p.BACK,0,[g.TSUMO]);c==a&&(l=o);const u={id:r,type:"DRAW",subType:i,iam:a,wind:c,tile:l.toString()};t.controller.emit(u)}t.controller.next()},notify_ron:({context:t,event:e})=>{N(e.type=="RON");const s=t.genEventID(),r=e.iam;for(const i of Object.values(E)){const o={id:s,type:e.type,iam:r,wind:i,victimInfo:{wind:e.targetInfo.wind,tile:e.targetInfo.tile.toString()},ret:ze(e.ret)};t.controller.emit(o)}},notify_tsumo:({context:t,event:e})=>{N(e.type=="TSUMO",`unexpected event ${e.type}`);const s=t.genEventID(),r=t.currentWind;for(const i of Object.values(E)){const o={id:s,type:e.type,iam:r,wind:i,lastTile:t.controller.hand(r).drawn.toString(),ret:ze(e.ret)};t.controller.emit(o)}},notify_reach:({context:t,event:e})=>{N(e.type=="REACH",`unexpected event ${e.type}`);const s=t.genEventID(),r=e.iam,i=e.tile.clone({add:g.HORIZONTAL});t.oneShotMap[r]=!0;for(const o of Object.values(E)){const a={id:s,type:e.type,iam:r,wind:o,tile:i.toString()};t.controller.emit(a)}},notify_reach_accepted:({context:t,event:e})=>{N(e.type=="REACH_ACCEPT");const s=t.genEventID();for(const r of Object.values(E)){const i={id:s,type:"REACH_ACCEPTED",reacherInfo:{wind:e.reacherInfo.wind,tile:e.reacherInfo.tile.toString()},wind:r};t.controller.emit(i)}t.controller.next()},notify_new_dora_if_needed:({context:t,event:e})=>{const s=t.genEventID();if(e.type=="AN_KAN"){const r=t.controller.wall.openDoraMarker();for(const i of Object.values(E)){const o={id:s,type:"NEW_DORA",wind:i,doraMarker:r.toString()};t.controller.emit(o)}}e.type=="SHO_KAN"},disable_one_shot:({context:t,event:e})=>{for(const s of Object.values(E))t.oneShotMap[s]=!1},disable_one_shot_for_me:({context:t,event:e})=>{t.oneShotMap[t.currentWind]=!1},notify_end:({context:t,event:e})=>{const s=t.genEventID(),r=$("");if(e.type=="DRAWN_GAME_BY_NINE_ORPHANS"){r[e.iam]=t.controller.hand(e.iam).toString();for(const i of Object.values(E)){const o={id:s,type:"END_GAME",subType:"NINE_TILES",wind:i,shouldContinue:!0,sticks:t.controller.placeManager.sticks,scores:t.controller.scoreManager.summary,deltas:$(0),hands:r};t.controller.emit(o)}}else if(e.type=="RON"||e.type=="TSUMO"){const i=e.iam==E.E,o=t.controller.finalResult(e.ret,e.iam);for(const a of Object.values(E)){r[e.iam]=t.controller.hand(e.iam).toString();const c={id:s,type:"END_GAME",subType:"WIN_GAME",wind:a,shouldContinue:i,sticks:{reach:0,dead:0},scores:t.controller.scoreManager.summary,deltas:o.deltas,hands:r};t.controller.emit(c)}}else if(!t.controller.wall.canKan||t.controller.river.cannotContinue()){const i=t.controller.wall.canKan?"FOUR_WIND":"FOUR_KAN";for(const o of Object.values(E)){const a={id:s,type:"END_GAME",subType:i,wind:o,shouldContinue:!0,sticks:t.controller.placeManager.sticks,scores:t.controller.scoreManager.summary,deltas:$(0),hands:$("")};t.controller.emit(a)}}else{if(t.controller.wall.canDraw)throw new Error(`unexpected event ${e.type}`);{const i=[];for(const l of Object.values(E)){const u=t.controller.hand(l);new Xt(u).calc()==0&&(i.push(l),r[l]=u.toString())}const o=i.length==0||i.length==4,a=$(0);for(const l of Object.values(E))i.includes(l)?a[l]+=o?0:3e3/i.length:a[l]-=o?0:3e3/(4-i.length);const c=i.length==4||a[E.E]>0;for(const l of Object.values(E)){const u={id:s,type:"END_GAME",subType:"DRAWN_GAME",wind:l,shouldContinue:c,sticks:t.controller.placeManager.sticks,scores:t.controller.scoreManager.summary,deltas:a,hands:r};t.controller.emit(u)}}}}},actors:{},guards:{canChi:({context:t,event:e},s)=>e.type=="CHI"?!!t.controller.doChi(e.iam,t.controller.river.lastTile.w,t.controller.river.lastTile.t):(console.error(`guards.canChi receive ${e.type}`),!1),canPon:({context:t,event:e},s)=>e.type=="PON"?!!t.controller.doPon(e.iam,t.controller.river.lastTile.w,t.controller.river.lastTile.t):(console.error(`guards.canPon receive ${e.type}`),!1),canWin:({context:t,event:e},s)=>e.type=="TSUMO"||e.type=="RON"?!0:(console.error(`guards.canWin receive ${e.type}`),!1),canReach:({context:t,event:e},s)=>e.type=="REACH"?!!t.controller.doReach(e.iam):(console.error(`guards.canReach receive ${e.type}`),!1),cannotContinue:({context:t,event:e},s)=>!t.controller.wall.canDraw||!t.controller.wall.canKan||t.controller.river.cannotContinue()},delays:{}});function ks(n=0){let t=n;return()=>(t++).toString()}class mt{constructor(t){_(this,"walls",{replacement:[],dead:[],doraMarkers:[],blindDoraMarkers:[],drawable:[]});_(this,"backup");_(this,"openedDoraCount",1);this.init(t),this.backup=mt.clone(this.walls)}kan(){if(this.walls.replacement.length==0)throw new Error("exceeded maximum kan");const t=this.walls.replacement.pop();return this.walls.drawable.pop(),w.from(t)}draw(){if(!this.walls.drawable)throw new Error("cannot draw any more");return w.from(this.walls.drawable.pop())}openDoraMarker(){if(this.openedDoraCount>=4)throw new Error("exceeded maximum open dora");return this.openedDoraCount++,w.from(this.walls.doraMarkers[this.openedDoraCount-1])}get doraMarkers(){return this.walls.doraMarkers.slice(0,this.openedDoraCount).map(w.from)}get blindDoraMarkers(){return this.walls.blindDoraMarkers.slice(0,this.openedDoraCount).map(w.from)}get canKan(){return this.walls.replacement.length>0}get canDraw(){return this.walls.drawable.length>0}initialHands(){const t=$("");for(let e=0;e<3;e++)for(const s of Object.values(E))for(let r=0;r<4;r++)t[s]+=this.draw().toString();for(const e of Object.values(E))t[e]+=this.draw().toString();return t}init(t){if(t!=null){this.walls=mt.clone(t);return}else{for(let e of Object.values(p)){if(e==p.BACK)continue;const s=e==p.Z?[1,2,3,4,5,6,7]:[1,2,3,4,5,6,7,8,9];for(let r=0;r<4;r++)for(let i of s){let o=new w(e,i);e!=p.Z&&r==3&&i==5&&(o=o.clone({add:g.RED})),this.walls.drawable.push(o.toString())}}nn(this.walls.drawable)}for(let e=0;e<14;e++)this.walls.dead.push(this.walls.drawable.pop());for(let e=0;e<4;e++)this.walls.blindDoraMarkers.push(this.walls.dead.pop());for(let e=0;e<4;e++)this.walls.doraMarkers.push(this.walls.dead.pop());for(let e=0;e<4;e++)this.walls.replacement.push(this.walls.dead.pop())}export(){return this.backup}static clone(t){return{drawable:t.drawable.concat(),dead:t.dead.concat(),doraMarkers:t.doraMarkers.concat(),blindDoraMarkers:t.blindDoraMarkers.concat(),replacement:t.replacement.concat()}}}class qt{constructor(t,e){_(this,"wall",new mt);_(this,"playerIDs");_(this,"actor",Pt(je(this),{}));_(this,"observer");_(this,"handlers",{});_(this,"mailBox",{});_(this,"histories",[]);_(this,"debugMode");this.debugMode=(e==null?void 0:e.debug)??!1,this.handlers=t.reduce((o,a)=>(o[a.id]=a.handler,o),{}),this.playerIDs=t.map(o=>o.id),t.forEach(o=>o.handler.on(a=>this.enqueue(a)));const s=cs();this.observer=new Cs(s),this.observer.eventHandler.on(o=>this.observer.handleEvent(o));const r=Object.fromEntries(this.playerIDs.map(o=>[o,25e3]));this.observer.scoreManager=new Gt(r);const i=(e==null?void 0:e.shuffle)==!1?this.playerIDs:nn([...this.playerIDs]);this.observer.placeManager=new Zt({[i[0]]:E.E,[i[1]]:E.S,[i[2]]:E.W,[i[3]]:E.N})}boardParams(t){let s=this.hand(t).reached?1:void 0;if(s){const r=this.river.discards(t);s=r.length==0||r.length==1&&r[0].t.has(g.HORIZONTAL)?2:1}return{doraMarkers:this.observer.doraMarkers,round:this.placeManager.round,myWind:t,sticks:this.observer.placeManager.sticks,reached:s}}hand(t){return this.observer.hand(t)}get placeManager(){return this.observer.placeManager}get scoreManager(){return this.observer.scoreManager}get river(){return this.observer.river}next(t){(!this.debugMode||t)&&this.actor.send({type:"NEXT"})}emit(t){const e=this.observer.placeManager.playerID(t.wind);this.handlers[e].emit(t);const s=t.iam;t.wind==s?this.observer.eventHandler.emit(t):s==null&&(!this.observer.applied[t.id]||t.type=="DISTRIBUTE")&&(this.observer.eventHandler.emit(t),this.observer.applied[t.id]=!0)}enqueue(t){this.mailBox[t.id]==null&&(this.mailBox[t.id]=[]),this.mailBox[t.id].push(t)}pollReplies(t,e){const s=this.mailBox[t];if(s==null)throw new Error(`not enqueued ${t} at ${this.actor.getSnapshot().value}`);if(s.length!=e.length)throw new Error(`${t}: num of event: got: ${e.length}, want: ${s.length}`);if(e.length==0){console.warn("no events to handle");return}const r=s[0];if(r.type=="CHOICE_AFTER_DISCARDED"){const i=rs(s);if(i.events.length==0){this.actor.send({type:""});return}const o=i.events[0];switch(i.type){case"RON":N(o.choices.RON,"ron choice is none"),this.actor.send({type:i.type,iam:o.wind,ret:zt(o.choices.RON),targetInfo:{wind:o.discarterInfo.wind,tile:w.from(o.discarterInfo.tile)}});break;case"DAI_KAN":N(o.choices.DAI_KAN,"daikan choice is none"),this.actor.send({type:i.type,iam:o.wind,block:Y.from(o.choices.DAI_KAN.tiles)});break;case"CHI":case"PON":const a=o.choices[i.type];N(a,`${i.type} choice is none`),N(i.events.length==1,`found more than one selected: ${JSON.stringify(i,null,2)}`);const c=V.deserialize(a[0]);this.actor.send({type:i.type,iam:o.wind,block:c})}}else if(r.type=="CHOICE_AFTER_DRAWN"){const i=is(s);N(i.events.length==1,`found more than one selected: ${JSON.stringify(i,null,2)}`);const o=i.events[0],a=o.wind;switch(i.type){case"TSUMO":N(o.choices.TSUMO,"tsumo choice is none"),this.actor.send({type:i.type,ret:zt(o.choices.TSUMO),lastTile:w.from(o.drawerInfo.tile),iam:a});break;case"REACH":const c=o.choices[i.type];N(c,`${i.type} candidates is none`),this.actor.send({type:"REACH",tile:w.from(c[0].tile),iam:a});break;case"DISCARD":const l=o.choices[i.type];N(l,`${i.type} choice is none`),this.actor.send({type:i.type,tile:w.from(l[0]).clone({remove:g.TSUMO}),iam:a});break;case"AN_KAN":{const u=o.choices[i.type];N(u,`${i.type} choice is none`),this.actor.send({type:i.type,block:R.from(u[0].tiles),iam:a});break}case"SHO_KAN":{const u=o.choices[i.type];N(u,`${i.type} choice is none`),this.actor.send({type:i.type,block:D.from(u[0].tiles),iam:a});break}case"DRAWN_GAME_BY_NINE_ORPHANS":this.actor.send({type:"DRAWN_GAME_BY_NINE_ORPHANS",iam:a});break}}else if(r.type=="CHOICE_AFTER_CALLED"){N(r.choices.DISCARD,`discard candidate tile is none: ${JSON.stringify(r,null,2)} ${this.hand(r.wind).toString()}`);const i=r.wind,o=w.from(r.choices.DISCARD[0]);this.actor.send({type:"DISCARD",tile:o,iam:i})}else if(r.type=="CHOICE_FOR_REACH_ACCEPTANCE"){const i=s.filter(a=>(N(a.type=="CHOICE_FOR_REACH_ACCEPTANCE"),a.choices.RON!==!1));if(i.length==0){this.actor.send({type:"REACH_ACCEPT",reacherInfo:{tile:w.from(r.reacherInfo.tile),wind:r.reacherInfo.wind}});return}const o=i[0];this.actor.send({type:"RON",iam:o.wind,ret:zt(o.choices.RON),targetInfo:{wind:o.reacherInfo.wind,tile:w.from(o.reacherInfo.tile)}});return}else if(r.type=="CHOICE_FOR_CHAN_KAN"){const i=s.filter(a=>a.choices.RON!==!1);if(i.length==0){this.actor.send({type:""});return}const o=i[0];N(o.choices.RON,"ron choice is none"),this.actor.send({type:"RON",iam:o.wind,ret:zt(o.choices.RON),quadWin:!0,targetInfo:{wind:o.callerInfo.wind,tile:w.from(o.callerInfo.tile)}});return}else console.warn(`controller found unexpected event: ${r.type}`)}export(){return this.histories.concat()}static load(t){const e=t.choiceEvents,s=Object.keys(t.players),r={emit:a=>{},on:a=>{}},i=s.map(a=>({id:a,handler:r})),o=new qt(i);return o.playerIDs=s,o.mailBox=e,o.observer.placeManager=new Zt(t.players,{round:t.round,sticks:structuredClone(t.sticks)}),o.observer.scoreManager=new Gt(t.scores),o.wall=new mt(t.wall),o}start(){this.actor.subscribe(s=>{console.debug("State:",s.value)});const t={scores:this.scoreManager.summary,round:this.placeManager.round,players:this.placeManager.playerMap,wall:this.wall.export(),choiceEvents:this.mailBox,sticks:this.placeManager.sticks};this.actor.start(),this.histories.push(t);const e=this.actor.getSnapshot().status;if(e!="done")throw new Error(`unexpected state ${this.actor.getSnapshot().value}(${e})`)}startGame(){for(;console.debug(`start========${this.placeManager.round}=============`),this.start(),this.wall=new mt,this.observer.applied={},this.mailBox={},this.actor=Pt(je(this)),!this.placeManager.is(k.W1););}finalResult(t,e){const s=this.hand(e),r=s.reached?this.wall.blindDoraMarkers:void 0,i=new $e(s,{...t.boardContext,sticks:this.placeManager.sticks,blindDoraMarkers:r}).calc(t.hand);return N(i),i}doWin(t,e,s){if(e==null)return!1;let r=this.hand(t);const i=this.boardParams(t);if(r.drawn==null){if(s==null)throw new Error("should ron but params == null");if(s.discardedBy==t||s.missingRon)return!1;r=r.clone(),i.ronWind=s.discardedBy,i.finalDiscardWin=!this.wall.canDraw,i.quadWin=s.quadWin,r.inc([e])}else i.finalWallWin=!this.wall.canDraw,i.replacementWin=s==null?void 0:s.replacementWin;i.oneShotWin=s==null?void 0:s.oneShot;const o=new ns(r),a=new $e(r,i),c=o.calc(e),l=a.calc(...c);if(!l||l.points.length==0)return!1;if(r.draw==null){const u=$t.candidateTiles(this.hand(t)).candidates;if(this.river.discards(t).some(h=>u.some(d=>d.equals(h.t))))return!1}return l}doPon(t,e,s){if(s==null||t==e)return!1;const r=this.hand(t);if(r.reached||r.hands.length<3||r.get(s.t,s.n)<2)return!1;const i=s.clone({removeAll:!0}),o=Ie(t,e,b.PON),a=[],c=new V([i,i,i]).clone({replace:{idx:o,tile:s.clone({add:g.HORIZONTAL})}});let l=c;C(s)&&s.has(g.RED)&&(l=c.clone({replace:{idx:o,tile:i.clone({add:[g.RED,g.HORIZONTAL]})}}));const u=o%2+1;if(C(s)&&r.get(s.t,0)>0&&(l=c.clone({replace:{idx:u,tile:i.clone({add:g.RED})}})),a.push(l),C(i)&&r.get(i.t,5)==3){const h=c.clone({replace:{idx:u,tile:i}});a.push(h)}return a}doChi(t,e,s){if(s==null||!s.isNum()||gt(e)!=t)return!1;const r=this.hand(t);if(r.reached||r.hands.length<3)return!1;const i=s.clone({remove:g.TSUMO,add:[g.HORIZONTAL]}),o=[];i.n-2>=1&&r.get(s.t,i.n-2)>0&&r.get(s.t,i.n-1)>0&&o.push(new Z([i,new w(s.t,i.n-1),new w(s.t,i.n-2)])),i.n+2<=9&&r.get(s.t,i.n+1)>0&&r.get(s.t,i.n+2)>0&&o.push(new Z([i,new w(s.t,i.n+1),new w(s.t,i.n+2)])),i.n-1>=1&&i.n+1<=9&&r.get(s.t,i.n-1)>0&&r.get(s.t,i.n+1)>0&&o.push(new Z([i,new w(s.t,i.n-1),new w(s.t,i.n+1)]));for(let d=0;d<o.length;d++){const y=o[d],f=this.cannotDiscardTile(y),m=[];for(const O of f){const M=r.get(O.t,O.n);for(let Et=0;Et<M;Et++)m.push(O.clone({remove:g.RED}))}const A=r.dec([...m,y.tiles[1],y.tiles[2]]),S=r.hands.length==0;r.inc(A),S&&o.splice(d,1)}if(o.length==0)return!1;const h=r.get(s.t,0)>0?this.redPattern(o):[];return h.length>0&&r.get(s.t,5)==1?h:[...o,...h]}redPattern(t){return t.length==0?[]:t.filter(s=>C(s.tiles[1])||C(s.tiles[2])).map(s=>{if(C(s.tiles[1])){const r=s.tiles[1].clone({add:g.RED});return s.clone({replace:{idx:1,tile:r}})}else if(C(s.tiles[2])){const r=s.tiles[2].clone({add:g.RED});return s.clone({replace:{idx:2,tile:r}})}}).filter(s=>s!=null)}doReach(t){const e=this.hand(t);return e.reached||!e.menzen||new Xt(e).calc()>0?!1:$t.calcCandidates(e,e.hands)}doDiscard(t,e){if(this.hand(t).reached)return[this.hand(t).drawn];const s=this.hand(t).hands;if(e==null)return s;if(e instanceof V)return s.filter(o=>!o.equals(e.tiles[0]));const r=this.cannotDiscardTile(e),i=s.filter(o=>!r.some(a=>o.equals(a)));return N(i.length>0,`no tiles to discard. hand: ${this.hand(t)}, suji: ${r}, block-chi: ${e}`),i}cannotDiscardTile(t){const e=t.tiles[0],s=t.tiles[1].n;return s!=1&&e.n-2==s?[new w(e.t,e.n-3),e]:s!=8&&e.n+1==s?[new w(e.t,e.n+3),e]:[e]}doAnKan(t){const e=this.hand(t),s=[];if(e.reached)return!1;for(const[r,i]of L())if(e.get(r,i)==4){const o=new w(r,i),a=[o,o,o,o];C(o)&&(a[1]=o.clone({add:g.RED})),s.push(new R(a))}if(s.length==0)return!1;for(const r of s)N(r.tiles.filter(i=>i.has(g.HORIZONTAL)).length==0,`h op ${r.toString()}`);return s}doShoKan(t){const e=this.hand(t);if(e.reached)return!1;const s=e.called.filter(i=>i instanceof V);if(s.length==0)return!1;const r=[];for(const i of s){const o=i.tiles[0].clone({removeAll:!0,add:g.HORIZONTAL});if(e.get(o.t,o.n)==1){const a=C(o)&&e.get(o.t,0)>0?o.clone({add:g.RED}):o;r.push(new D([...i.tiles,a]))}}if(r.length==0)return!1;for(const i of r)N(i.tiles.filter(o=>o.has(g.HORIZONTAL)).length==2,`h op ${i.toString()}`);return r}doDaiKan(t,e,s){const r=this.hand(t);if(r.reached||t==e)return!1;const i=s.clone({removeAll:!0});if(r.get(i.t,i.n)!=3)return!1;const o=Ie(t,e,b.DAI_KAN);let a=new Y([i,i,i,i]).clone({replace:{idx:o,tile:i.clone({add:g.HORIZONTAL})}});if(C(s)&&s.has(g.RED))a=a.clone({replace:{idx:o,tile:i.clone({add:[g.HORIZONTAL,g.RED]})}});else if(C(s)&&!s.has(g.RED)){N(r.get(s.t,0)>0,`hand does not have red tile: ${r.toString()}`);const c=o%3+1;a=a.clone({replace:{idx:c,tile:i.clone({add:g.RED})}})}return N(a.tiles.filter(c=>c.has(g.HORIZONTAL)).length==1,`h op ${a.toString()}`),a}canDrawnGame(t){if(this.river.discards(t).length!=0)return!1;const e=this.hand(t);let s=0;for(const r of Object.values(p)){if(r==p.BACK)continue;const i=r==p.Z?xt:G;for(const o of i)e.get(r,o)>0&&s++}return s>=9}initialHands(){return this.wall.initialHands()}}class bt extends ye{isBackHand(){for(const t of Object.values(p))if(t!=p.BACK&&this.sum(t)>0)return!1;return this.sum(p.BACK)>0}clone(){const t=new bt(this.toString());return t.data.reached=this.data.reached,t}dec(t){return this.isBackHand()?(super.dec(t.map(()=>new w(p.BACK,0))),[...t]):super.dec(t)}}class gn{constructor(t,e){_(this,"id");_(this,"river",new sn);_(this,"placeManager",new Zt({}));_(this,"scoreManager",new Gt({}));_(this,"hands",$(new bt("")));_(this,"counter",new ls);_(this,"doraMarkers",[]);_(this,"eventHandler");this.id=t,this.eventHandler=e}hand(t){return this.hands[t]}handleEvent(t){switch(t.type){case"CHOICE_AFTER_CALLED":case"CHOICE_AFTER_DISCARDED":case"CHOICE_AFTER_DRAWN":case"CHOICE_FOR_CHAN_KAN":case"CHOICE_FOR_REACH_ACCEPTANCE":break;case"DISTRIBUTE":this.counter.reset();const e=w.from(t.doraMarker);this.setHands(t),this.placeManager=new Zt(structuredClone(t.places),{round:t.round,sticks:structuredClone(t.sticks)}),this.scoreManager=new Gt(structuredClone(t.scores)),this.doraMarkers=[e],this.counter.dec(e);for(const r of Object.values(E))r==t.wind&&this.counter.dec(...this.hand(r).hands);break;case"DRAW":{const r=w.from(t.tile);this.hands[t.iam].draw(r),this.counter.dec(r);break}case"DISCARD":{const r=w.from(t.tile);if(this.river.discard(r,t.iam),this.hands[t.iam].discard(r),t.iam!=t.wind){this.counter.dec(r),this.counter.addTileToSafeMap(r,t.iam);for(const i of Object.values(E))this.hand(i).reached&&this.counter.addTileToSafeMap(r,i)}break}case"PON":case"CHI":case"DAI_KAN":{const r=v.deserialize(t.block);this.hands[t.iam].call(r),this.river.markCalled(),t.iam!=t.wind&&this.counter.dec(...r.tiles.filter(i=>!i.has(g.HORIZONTAL)));break}case"SHO_KAN":{const r=D.from(t.block.tiles);this.hands[t.iam].kan(r),t.iam!=t.wind&&this.counter.dec(r.tiles.filter(i=>i.has(g.HORIZONTAL))[0]);break}case"AN_KAN":{const r=R.from(t.block.tiles);this.hands[t.iam].kan(r),t.iam!=t.wind&&this.counter.dec(...r.tiles.filter(i=>!i.has(g.HORIZONTAL)));break}case"REACH":{this.hands[t.iam].reach();const r=w.from(t.tile);if(this.river.discard(r,t.iam),this.hands[t.iam].discard(r),t.iam!=t.wind){this.counter.dec(r),this.counter.addTileToSafeMap(r,t.iam);for(const i of Object.values(E))this.hand(i).reached&&this.counter.addTileToSafeMap(r,i)}break}case"REACH_ACCEPTED":const s=this.placeManager.playerID(t.reacherInfo.wind);this.scoreManager.reach(s),this.placeManager.incrementReachStick();break;case"NEW_DORA":{const r=w.from(t.doraMarker);this.doraMarkers.push(r),this.counter.dec(r);break}case"TSUMO":break;case"RON":break;case"END_GAME":switch(t.subType){case"NINE_TILES":case"FOUR_KAN":case"FOUR_WIND":this.placeManager.incrementDeadStick();break;case"DRAWN_GAME":{const r=this.placeManager.playerMap;this.scoreManager.update(t.deltas,r),this.placeManager.incrementDeadStick(),t.shouldContinue||this.placeManager.nextRound();break}case"WIN_GAME":{const r=this.placeManager.playerMap;this.scoreManager.update(t.deltas,r),t.shouldContinue?this.placeManager.incrementDeadStick():(this.placeManager.nextRound(),this.placeManager.resetDeadStick()),this.placeManager.resetReachStick();break}}break;default:throw new Error(`unexpected event ${JSON.stringify(t,null,2)}`)}}}class Cs extends gn{constructor(e){super("observer",e);_(this,"applied",{});this.counter.disable=!0,this.hands=$(new bt("_____________"))}setHands(e){this.hands[e.wind]=new bt(e.hands[e.wind])}handleEvent(e){switch(super.handleEvent(e),e.type){case"DISTRIBUTE":let s=!0;for(const r of Object.values(E))s&&(s=this.hand(r).get(p.BACK,0)==0);if(!s)break;console.debug("DISTRIBUTE:",`round: ${this.placeManager.round}`,`scores: ${JSON.stringify(this.scoreManager.summary,null,2)}`,`map: ${JSON.stringify(this.placeManager.playerMap,null,2)}`,`sticks: ${JSON.stringify(this.placeManager.sticks,null,2)}`);for(const r of Object.values(E))console.debug(`${this.placeManager.playerID(r)}(${r})`,`init hand: ${this.hand(r).toString()}`);break;case"DRAW":console.debug(`${this.placeManager.playerID(e.iam)}(${e.iam})`,`draw: ${this.hand(e.iam).drawn}`,`hand: ${this.hand(e.iam).toString()}`);break;case"DISCARD":console.debug(`${this.placeManager.playerID(e.iam)}(${e.iam})`,`discard: ${e.tile.toString()}`,`hand: ${this.hand(e.iam).toString()}`);break;case"CHI":case"PON":case"DAI_KAN":case"AN_KAN":case"SHO_KAN":console.debug(`${this.placeManager.playerID(e.iam)}(${e.iam})`,`call: ${e.block.tiles}`,`hand: ${this.hand(e.iam).toString()}`);break;case"REACH":console.debug(`${this.placeManager.playerID(e.iam)}(${e.iam})`,`reach: ${e.tile}`,`hand: ${this.hand(e.iam).toString()}`);break;case"TSUMO":case"RON":console.debug(`${this.placeManager.playerID(e.iam)}(${e.iam})`,`ron/tsumo: ${JSON.stringify(e.ret,null,2)}`,`hand: ${this.hand(e.iam).toString()}`);break;case"END_GAME":for(const r of Object.values(E))console.debug(`${this.placeManager.playerID(r)}(${fe(r)})`,`end hand: ${this.hand(r).toString()}`);console.debug("END_GAME",e.subType,"scores",JSON.stringify(this.scoreManager.summary,null,2),`sticks: ${JSON.stringify(this.placeManager.sticks,null,2)}`)}}}class Ut extends gn{constructor(e,s){super(e,s);_(this,"river",new sn);_(this,"doras",[]);this.eventHandler.on(r=>this.handleEvent(r))}get myWind(){return this.placeManager.wind(this.id)}setHands(e){for(const s of Object.values(E))this.hands[s]=new bt(e.hands[s])}handleDiscard(e){const s=Object.values(E).filter(u=>u==this.myWind?!1:this.hand(u).reached),r=new Xt(this.hand(this.myWind)).calc();if(s.length>0&&r>=2)return Ot.selectTile(this.counter,s,e);const i=$t.calcCandidates(this.hand(this.myWind),e),a=Vt.calcPlayerCandidates(this.counter,i).sort((u,h)=>h.sum-u.sum),c=a.filter(u=>u.sum==a[0].sum);return Vt.selectMinPriority(this.counter,c,this.doras).tile}handleEvent(e){switch(e.type){case"CHOICE_AFTER_DISCARDED":e.choices.CHI=!1,e.choices.DAI_KAN=!1,e.choices.PON=!1,this.eventHandler.emit(e);break;case"CHOICE_AFTER_CALLED":case"CHOICE_AFTER_DRAWN":if(e.choices.DISCARD){const s=this.handleDiscard(e.choices.DISCARD.map(w.from));e.choices.DISCARD=[s.toString()]}this.eventHandler.emit(e);break;case"CHOICE_FOR_REACH_ACCEPTANCE":this.eventHandler.emit(e);break;case"CHOICE_FOR_CHAN_KAN":this.eventHandler.emit(e);break;default:super.handleEvent(e)}}}class Xo{constructor(t){_(this,"index",0);_(this,"histories",[]);this.histories=JSON.parse(t)}next(){N(this.index<this.histories.length),this.index++}prev(){this.index--,N(this.index<0)}start(){qt.load(this.histories[this.index]).start()}auto(){for(;this.index<this.histories.length;this.next())this.start()}}const Yo=n=>{const[t,e]=jt(),[s,r]=jt(),[i,o]=jt(),[a,c]=jt(),l=["player-1","player-2","player-3","player-4"],u=n==null?void 0:n.playerInjection,h=(u==null?void 0:u.p1)??Ut,d=(u==null?void 0:u.p2)??Ut,y=(u==null?void 0:u.p3)??Ut,f=(u==null?void 0:u.p4)??Ut,m=new h(l[0],e),A=new d(l[1],r),S=new y(l[2],o),O=new f(l[3],c),M=[{handler:t,id:l[0]},{handler:s,id:l[1]},{handler:i,id:l[2]},{handler:a,id:l[3]}];return{c:new qt(M,{debug:n==null?void 0:n.debug,shuffle:n==null?void 0:n.shuffle}),p1:m,p2:A,p3:S,p4:O}},ut=(n,t)=>{let s=1;for(let r of t)r.equals(n)&&(s*=2);return s};class Vt{static calcPlayerCandidates(t,e){let s=[];for(let r of e){let i=0,o=[];for(let a of r.candidates)o.push({tile:a.clone(),n:t.get(a)}),i+=t.get(a);s.push({sum:i,tile:r.tile,candidates:o,shanten:r.shanten})}return s}static selectMinPriority(t,e,s){N(e.length>0);let r=0,i=0;for(let o=0;o<e.length;o++){const a=Vt.calcPriority(t,e[o],s);a<r&&(r=a,i=o)}return e[i]}static calcPriority(t,e,s){const r=e.tile;let i=0;if(r.t==p.Z)return i=t.get(r),(r.n==5||r.n==6||r.n==7)&&(i*=2),i*ut(r,s);{const o=t.get(r);i+=o*ut(r,s);const a=t.get(new w(r.t,r.n+1)),c=t.get(new w(r.t,r.n+2)),l=t.get(new w(r.t,r.n-1)),u=t.get(new w(r.t,r.n-2)),h=r.n-2>0?Math.min(l,u):0,d=r.n+2<=9?Math.min(a,c):0,y=r.n-1>=1&&r.n+1<=9?Math.min(a,l):0,f=Math.max(h,y),m=Math.max(y,d);return i+=o*ut(r,s),i+=h*ut(new w(r.t,r.n-2),s),i+=d*ut(new w(r.t,r.n+2),s),i+=f*ut(new w(r.t,r.n-1),s),i+=m*ut(new w(r.t,r.n+1),s),r.n==0,i}}}class Ot{static selectTile(t,e,s){N(e.length>0&&s.length>0);let r=s[0],i=Number.POSITIVE_INFINITY;for(let o of s){const a=Ot.rank(t,e,o);a<i&&(r=o,i=a)}return r}static rank(t,e,s){let r=0;const i=s.isNum()?Ot.rankN:Ot.rankZ;for(let o of e){const a=i(t,o,s);r<a&&(r=a)}return r}static rankZ(t,e,s){if(s.t!=p.Z)throw new Error(`expected TYPE.Z but ${s.toString()}`);if(t.isSafeTile(s.t,s.n,e))return 0;const r=t.get(s);return Math.min(r,3)}static rankN(t,e,s){if(!s.isNum())throw new Error(`expected TYPE.NUMBER but ${s.toString()}`);const r=s.n,i=s.t;if(t.isSafeTile(i,r,e))return 0;if(r==1)return t.isSafeTile(i,4,e)?3:6;if(r==9)return t.isSafeTile(i,6,e)?3:6;if(r==2||r==8)return t.isSafeTile(i,5,e)?4:8;if(r==3)return t.isSafeTile(i,6,e)?5:8;if(r==7)return t.isSafeTile(i,4,e)?5:8;const o=t.isSafeTile(i,r-3,e),a=t.isSafeTile(i,r+3,e);return o&&a?4:o||a?8:12}}exports.ActorHand=bt;exports.BLOCK=b;exports.BaseActor=gn;exports.Block=v;exports.BlockAnKan=R;exports.BlockCalculator=ns;exports.BlockChi=Z;exports.BlockDaiKan=Y;exports.BlockHand=kt;exports.BlockIsolated=Ze;exports.BlockOther=Ve;exports.BlockPair=H;exports.BlockPon=V;exports.BlockRun=Q;exports.BlockShoKan=D;exports.BlockThree=z;exports.Controller=qt;exports.Counter=ls;exports.DoubleCalculator=$e;exports.Efficiency=$t;exports.FONT_FAMILY=Ue;exports.G=T;exports.Hand=ye;exports.INPUT_SEPARATOR=q;exports.Image=qe;exports.ImageHelper=en;exports.Mark=ot;exports.MeasureText=Bs;exports.MyG=oi;exports.MyImage=ai;exports.MyRect=li;exports.MySVG=ii;exports.MyText=ui;exports.MyUse=ci;exports.N19=G;exports.NZ=xt;exports.OP=g;exports.Observer=Cs;exports.Parser=W;exports.PlaceManager=Zt;exports.Player=Ut;exports.PlayerEfficiency=Vt;exports.ROUND=k;exports.ROUND_MAP=Fe;exports.Rect=Qe;exports.Replayer=Xo;exports.RiskRank=Ot;exports.River=sn;exports.STICK_CONTEXT=ve;exports.SVG=Zn;exports.ScoreManager=Gt;exports.ShantenCalculator=Xt;exports.Svg=Gn;exports.Symbol=tn;exports.TABLE_CONTEXT=Wn;exports.TILE_CONTEXT=nt;exports.TYPE=p;exports.Text=yt;exports.Tile=w;exports.Use=ge;exports.WIND=E;exports.WIND_MAP=de;exports.Wall=mt;exports.callBlockIndex=Ie;exports.convertInput=es;exports.createControllerMachine=je;exports.createEventEmitter=cs;exports.createEventPipe=jt;exports.createHand=vt;exports.createLocalGame=Yo;exports.createTable=Xn;exports.createWindMap=$;exports.deserializeWinResult=zt;exports.drawBlocks=mi;exports.drawTable=vi;exports.forHand=L;exports.incrementalIDGenerator=ks;exports.isNum5=C;exports.nextRound=Ft;exports.nextWind=gt;exports.optimizeSVG=bi;exports.parse=Qn;exports.parseTableInput=ts;exports.prevRound=Fs;exports.prevWind=fe;exports.prioritizeDiscardedEvents=rs;exports.prioritizeDrawnEvents=is;exports.shuffle=nn;exports.sortCalledTiles=Bn;exports.tileSortFunc=Jt;
|