Skip to content

Instantly share code, notes, and snippets.

@zserge
Last active August 4, 2023 20:03
Show Gist options
  • Save zserge/6617cdbf328aac76913ff9ae85350c10 to your computer and use it in GitHub Desktop.
Save zserge/6617cdbf328aac76913ff9ae85350c10 to your computer and use it in GitHub Desktop.
Stockfish 16
"use strict";
/*! Copyright (c) 2013, Jeff Hlywa (jhlywa@gmail.com)
* Released under the BSD license
* https://github.com/jhlywa/chess.js/blob/master/LICENSE
*/
;var Chess=function(ao){var p="b";var k="w";var E=-1;var X="p";var S="n";var s="b";var H="r";var j="q";var ad="k";var f="pnbrqkPNBRQK";var an="rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1";var B=["1-0","0-1","1/2-1/2","*"];var u={b:[16,32,17,15],w:[-16,-32,-17,-15]};var J={n:[-18,-33,-31,-14,18,33,31,14],b:[-17,-15,17,15],r:[-16,1,16,-1],q:[-17,-16,-15,1,17,16,15,-1],k:[-17,-16,-15,1,17,16,15,-1]};var ac=[20,0,0,0,0,0,0,24,0,0,0,0,0,0,20,0,0,20,0,0,0,0,0,24,0,0,0,0,0,20,0,0,0,0,20,0,0,0,0,24,0,0,0,0,20,0,0,0,0,0,0,20,0,0,0,24,0,0,0,20,0,0,0,0,0,0,0,0,20,0,0,24,0,0,20,0,0,0,0,0,0,0,0,0,0,20,2,24,2,20,0,0,0,0,0,0,0,0,0,0,0,2,53,56,53,2,0,0,0,0,0,0,24,24,24,24,24,24,56,0,56,24,24,24,24,24,24,0,0,0,0,0,0,2,53,56,53,2,0,0,0,0,0,0,0,0,0,0,0,20,2,24,2,20,0,0,0,0,0,0,0,0,0,0,20,0,0,24,0,0,20,0,0,0,0,0,0,0,0,20,0,0,0,24,0,0,0,20,0,0,0,0,0,0,20,0,0,0,0,24,0,0,0,0,20,0,0,0,0,20,0,0,0,0,0,24,0,0,0,0,0,20,0,0,20,0,0,0,0,0,0,24,0,0,0,0,0,0,20];var o=[17,0,0,0,0,0,0,16,0,0,0,0,0,0,15,0,0,17,0,0,0,0,0,16,0,0,0,0,0,15,0,0,0,0,17,0,0,0,0,16,0,0,0,0,15,0,0,0,0,0,0,17,0,0,0,16,0,0,0,15,0,0,0,0,0,0,0,0,17,0,0,16,0,0,15,0,0,0,0,0,0,0,0,0,0,17,0,16,0,15,0,0,0,0,0,0,0,0,0,0,0,0,17,16,15,0,0,0,0,0,0,0,1,1,1,1,1,1,1,0,-1,-1,-1,-1,-1,-1,-1,0,0,0,0,0,0,0,-15,-16,-17,0,0,0,0,0,0,0,0,0,0,0,0,-15,0,-16,0,-17,0,0,0,0,0,0,0,0,0,0,-15,0,0,-16,0,0,-17,0,0,0,0,0,0,0,0,-15,0,0,0,-16,0,0,0,-17,0,0,0,0,0,0,-15,0,0,0,0,-16,0,0,0,0,-17,0,0,0,0,-15,0,0,0,0,0,-16,0,0,0,0,0,-17,0,0,-15,0,0,0,0,0,0,-16,0,0,0,0,0,0,-17];var av={p:0,n:1,b:2,r:3,q:4,k:5};var aj={NORMAL:"n",CAPTURE:"c",BIG_PAWN:"b",EP_CAPTURE:"e",PROMOTION:"p",KSIDE_CASTLE:"k",QSIDE_CASTLE:"q"};var D={NORMAL:1,CAPTURE:2,BIG_PAWN:4,EP_CAPTURE:8,PROMOTION:16,KSIDE_CASTLE:32,QSIDE_CASTLE:64};var W=7;var T=6;var Q=5;var P=4;var O=3;var N=2;var M=1;var K=0;var v={a8:0,b8:1,c8:2,d8:3,e8:4,f8:5,g8:6,h8:7,a7:16,b7:17,c7:18,d7:19,e7:20,f7:21,g7:22,h7:23,a6:32,b6:33,c6:34,d6:35,e6:36,f6:37,g6:38,h6:39,a5:48,b5:49,c5:50,d5:51,e5:52,f5:53,g5:54,h5:55,a4:64,b4:65,c4:66,d4:67,e4:68,f4:69,g4:70,h4:71,a3:80,b3:81,c3:82,d3:83,e3:84,f3:85,g3:86,h3:87,a2:96,b2:97,c2:98,d2:99,e2:100,f2:101,g2:102,h2:103,a1:112,b1:113,c1:114,d1:115,e1:116,f1:117,g1:118,h1:119};var V={w:[{square:v.a1,flag:D.QSIDE_CASTLE},{square:v.h1,flag:D.KSIDE_CASTLE}],b:[{square:v.a8,flag:D.QSIDE_CASTLE},{square:v.h8,flag:D.KSIDE_CASTLE}]};var C=new Array(128);var ak={w:E,b:E};var t=k;var d={w:0,b:0};var x=E;var n=0;var g=1;var Z=[];var ab={};if(typeof ao==="undefined"){h(an)}else{h(ao)}function ae(){C=new Array(128);ak={w:E,b:E};t=k;d={w:0,b:0};x=E;n=0;g=1;Z=[];ab={};q(z())}function Y(){h(an)}function h(ay){var aD=ay.split(/\s+/);var aw=aD[0];var aC=0;var aB=f+"12345678/";if(!aa(ay).valid){return false}ae();for(var az=0;az<aw.length;az++){var aA=aw.charAt(az);if(aA==="/"){aC+=8}else{if(r(aA)){aC+=parseInt(aA,10)}else{var ax=(aA<"a")?k:p;aq({type:aA.toLowerCase(),color:ax},m(aC));aC++}}}t=aD[1];if(aD[2].indexOf("K")>-1){d.w|=D.KSIDE_CASTLE}if(aD[2].indexOf("Q")>-1){d.w|=D.QSIDE_CASTLE}if(aD[2].indexOf("k")>-1){d.b|=D.KSIDE_CASTLE}if(aD[2].indexOf("q")>-1){d.b|=D.QSIDE_CASTLE}x=(aD[3]==="-")?E:v[aD[3]];n=parseInt(aD[4],10);g=parseInt(aD[5],10);q(z());return true}function aa(ay){var aD={0:"No errors.",1:"FEN string must contain six space-delimited fields.",2:"6th field (move number) must be a positive integer.",3:"5th field (half move counter) must be a non-negative integer.",4:"4th field (en-passant square) is invalid.",5:"3rd field (castling availability) is invalid.",6:"2nd field (side to move) is invalid.",7:"1st field (piece positions) does not contain 8 '/'-delimited rows.",8:"1st field (piece positions) is invalid [consecutive numbers].",9:"1st field (piece positions) is invalid [invalid piece].",10:"1st field (piece positions) is invalid [row too large]."};var aC=ay.split(/\s+/);if(aC.length!==6){return{valid:false,error_number:1,error:aD[1]}}if(isNaN(aC[5])||(parseInt(aC[5],10)<=0)){return{valid:false,error_number:2,error:aD[2]}}if(isNaN(aC[4])||(parseInt(aC[4],10)<0)){return{valid:false,error_number:3,error:aD[3]}}if(!/^(-|[abcdefgh][36])$/.test(aC[3])){return{valid:false,error_number:4,error:aD[4]}}if(!/^(KQ?k?q?|Qk?q?|kq?|q|-)$/.test(aC[2])){return{valid:false,error_number:5,error:aD[5]}}if(!/^(w|b)$/.test(aC[1])){return{valid:false,error_number:6,error:aD[6]}}var aB=aC[0].split("/");if(aB.length!==8){return{valid:false,error_number:7,error:aD[7]}}for(var az=0;az<aB.length;az++){var aw=0;var aA=false;for(var ax=0;ax<aB[az].length;ax++){if(!isNaN(aB[az][ax])){if(aA){return{valid:false,error_number:8,error:aD[8]}}aw+=parseInt(aB[az][ax],10);aA=true}else{if(!/^[prnbqkPRNBQK]$/.test(aB[az][ax])){return{valid:false,error_number:9,error:aD[9]}}aw+=1;aA=false}}if(aw!==8){return{valid:false,error_number:10,error:aD[10]}}}return{valid:true,error_number:0,error:aD[0]}}function z(){var aC=0;var ay="";for(var aA=v.a8;aA<=v.h1;aA++){if(C[aA]==null){aC++}else{if(aC>0){ay+=aC;aC=0}var ax=C[aA].color;var aB=C[aA].type;ay+=(ax===k)?aB.toUpperCase():aB.toLowerCase()}if((aA+1)&136){if(aC>0){ay+=aC}if(aA!==v.h1){ay+="/"}aC=0;aA+=8}}var az="";if(d[k]&D.KSIDE_CASTLE){az+="K"}if(d[k]&D.QSIDE_CASTLE){az+="Q"}if(d[p]&D.KSIDE_CASTLE){az+="k"}if(d[p]&D.QSIDE_CASTLE){az+="q"}az=az||"-";var aw=(x===E)?"-":m(x);return[ay,t,az,aw,n,g].join(" ")}function at(aw){for(var ax=0;ax<aw.length;ax+=2){if(typeof aw[ax]==="string"&&typeof aw[ax+1]==="string"){ab[aw[ax]]=aw[ax+1]}}return ab}function q(aw){if(Z.length>0){return}if(aw!==an){ab.SetUp=aw;ab.FEN="1"}else{delete ab.SetUp;delete ab.FEN}}function ag(ax){var aw=C[v[ax]];return(aw)?{type:aw.type,color:aw.color}:null}function aq(aw,ay){if(!("type" in aw&&"color" in aw)){return false}if(f.indexOf(aw.type.toLowerCase())===-1){return false}if(!(ay in v)){return false}var ax=v[ay];C[ax]={type:aw.type,color:aw.color};if(aw.type===ad){ak[aw.color]=ax}q(z());return true}function F(ax){var aw=ag(ax);C[v[ax]]=null;if(aw&&aw.type===ad){ak[aw.color]=E}q(z());return aw}function am(ay,aB,aA,ax,az){var aw={color:t,from:aB,to:aA,flags:ax,piece:ay[aB].type};if(az){aw.flags|=D.PROMOTION;aw.promotion=az}if(ay[aA]){aw.captured=ay[aA].type}else{if(ax&D.EP_CAPTURE){aw.captured=X}}return aw}function b(ay){function aN(aT,aR,aW,aV,aQ){if(aT[aW].type===X&&(U(aV)===K||U(aV)===W)){var aU=[j,H,s,S];for(var aS=0,aP=aU.length;aS<aP;aS++){aR.push(am(aT,aW,aV,aQ,aU[aS]))}}else{aR.push(am(aT,aW,aV,aQ))}}var aO=[];var aA=t;var aK=au(aA);var aL={b:M,w:T};var aF=v.a8;var aC=v.h1;var aD=false;var aB=(typeof ay!=="undefined"&&"legal" in ay)?ay.legal:true;if(typeof ay!=="undefined"&&"square" in ay){if(ay.square in v){aF=aC=v[ay.square];aD=true}else{return[]}}for(var aH=aF;aH<=aC;aH++){if(aH&136){aH+=7;continue}var ax=C[aH];if(ax==null||ax.color!==aA){continue}if(ax.type===X){var aE=aH+u[aA][0];if(C[aE]==null){aN(C,aO,aH,aE,D.NORMAL);var aE=aH+u[aA][1];if(aL[aA]===U(aH)&&C[aE]==null){aN(C,aO,aH,aE,D.BIG_PAWN)}}for(aG=2;aG<4;aG++){var aE=aH+u[aA][aG];if(aE&136){continue}if(C[aE]!=null&&C[aE].color===aK){aN(C,aO,aH,aE,D.CAPTURE)}else{if(aE===x){aN(C,aO,aH,x,D.EP_CAPTURE)}}}}else{for(var aG=0,aI=J[ax.type].length;aG<aI;aG++){var az=J[ax.type][aG];var aE=aH;while(true){aE+=az;if(aE&136){break}if(C[aE]==null){aN(C,aO,aH,aE,D.NORMAL)}else{if(C[aE].color===aA){break}aN(C,aO,aH,aE,D.CAPTURE);break}if(ax.type==="n"||ax.type==="k"){break}}}}}if((!aD)||aC===ak[aA]){if(d[aA]&D.KSIDE_CASTLE){var aM=ak[aA];var aJ=aM+2;if(C[aM+1]==null&&C[aJ]==null&&!af(aK,ak[aA])&&!af(aK,aM+1)&&!af(aK,aJ)){aN(C,aO,ak[aA],aJ,D.KSIDE_CASTLE)}}if(d[aA]&D.QSIDE_CASTLE){var aM=ak[aA];var aJ=aM-2;if(C[aM-1]==null&&C[aM-2]==null&&C[aM-3]==null&&!af(aK,ak[aA])&&!af(aK,aM-1)&&!af(aK,aJ)){aN(C,aO,ak[aA],aJ,D.QSIDE_CASTLE)}}}if(!aB){return aO}var aw=[];for(var aH=0,aI=aO.length;aH<aI;aH++){al(aO[aH]);if(!L(aA)){aw.push(aO[aH])}G()}return aw}function ar(ax){var ay="";if(ax.flags&D.KSIDE_CASTLE){ay="O-O"}else{if(ax.flags&D.QSIDE_CASTLE){ay="O-O-O"}else{var aw=c(ax);if(ax.piece!==X){ay+=ax.piece.toUpperCase()+aw}if(ax.flags&(D.CAPTURE|D.EP_CAPTURE)){if(ax.piece===X){ay+=m(ax.from)[0]}ay+="x"}ay+=m(ax.to);if(ax.flags&D.PROMOTION){ay+="="+ax.promotion.toUpperCase()}}}al(ax);if(R()){if(I()){ay+="#"}else{ay+="+"}}G();return ay}function af(ax,aD){for(var aA=v.a8;aA<=v.h1;aA++){if(aA&136){aA+=7;continue}if(C[aA]==null||C[aA].color!==ax){continue}var aE=C[aA];var aw=aA-aD;var aC=aw+119;if(ac[aC]&(1<<av[aE.type])){if(aE.type===X){if(aw>0){if(aE.color===k){return true}}else{if(aE.color===p){return true}}continue}if(aE.type==="n"||aE.type==="k"){return true}var ay=o[aC];var az=aA+ay;var aB=false;while(az!==aD){if(C[az]!=null){aB=true;break}az+=ay}if(!aB){return true}}}return false}function L(aw){return af(au(aw),ak[aw])}function R(){return L(t)}function I(){return R()&&b().length===0}function ah(){return !R()&&b().length===0}function A(){var aC={};var aB=[];var ax=0;var aD=0;for(var ay=v.a8;ay<=v.h1;ay++){aD=(aD+1)%2;if(ay&136){ay+=7;continue}var aA=C[ay];if(aA){aC[aA.type]=(aA.type in aC)?aC[aA.type]+1:1;if(aA.type===s){aB.push(aD)}ax++}}if(ax===2){return true}else{if(ax===3&&(aC[s]===1||aC[S]===1)){return true}else{if(ax===aC[s]+2){var az=0;var aw=aB.length;for(var ay=0;ay<aw;ay++){az+=aB[ay]}if(az===0||az===aw){return true}}}}return false}function i(){var ay=[];var ax={};var aA=false;while(true){var aw=G();if(!aw){break}ay.push(aw)}while(true){var az=z().split(" ").slice(0,4).join(" ");ax[az]=(az in ax)?ax[az]+1:1;if(ax[az]>=3){aA=true}if(!ay.length){break}al(ay.pop())}return aA}function e(aw){Z.push({move:aw,kings:{b:ak.b,w:ak.w},turn:t,castling:{b:d.b,w:d.w},ep_square:x,half_moves:n,move_number:g})}function al(ax){var aB=t;var aC=au(aB);e(ax);C[ax.to]=C[ax.from];C[ax.from]=null;if(ax.flags&D.EP_CAPTURE){if(t===p){C[ax.to-16]=null}else{C[ax.to+16]=null}}if(ax.flags&D.PROMOTION){C[ax.to]={type:ax.promotion,color:aB}}if(C[ax.to].type===ad){ak[C[ax.to].color]=ax.to;if(ax.flags&D.KSIDE_CASTLE){var az=ax.to-1;var aA=ax.to+1;C[az]=C[aA];C[aA]=null}else{if(ax.flags&D.QSIDE_CASTLE){var az=ax.to+1;var aA=ax.to-2;C[az]=C[aA];C[aA]=null}}d[aB]=""}if(d[aB]){for(var ay=0,aw=V[aB].length;ay<aw;ay++){if(ax.from===V[aB][ay].square&&d[aB]&V[aB][ay].flag){d[aB]^=V[aB][ay].flag;break}}}if(d[aC]){for(var ay=0,aw=V[aC].length;ay<aw;ay++){if(ax.to===V[aC][ay].square&&d[aC]&V[aC][ay].flag){d[aC]^=V[aC][ay].flag;break}}}if(ax.flags&D.BIG_PAWN){if(t==="b"){x=ax.to-16}else{x=ax.to+16}}else{x=E}if(ax.piece===X){n=0}else{if(ax.flags&(D.CAPTURE|D.EP_CAPTURE)){n=0}else{n++}}if(t===p){g++}t=au(t)}function G(){var ax=Z.pop();if(ax==null){return null}var aw=ax.move;ak=ax.kings;t=ax.turn;d=ax.castling;x=ax.ep_square;n=ax.half_moves;g=ax.move_number;var aB=t;var aC=au(t);C[aw.from]=C[aw.to];C[aw.from].type=aw.piece;C[aw.to]=null;if(aw.flags&D.CAPTURE){C[aw.to]={type:aw.captured,color:aC}}else{if(aw.flags&D.EP_CAPTURE){var ay;if(aB===p){ay=aw.to-16}else{ay=aw.to+16}C[ay]={type:X,color:aC}}}if(aw.flags&(D.KSIDE_CASTLE|D.QSIDE_CASTLE)){var az,aA;if(aw.flags&D.KSIDE_CASTLE){az=aw.to+1;aA=aw.to-1}else{if(aw.flags&D.QSIDE_CASTLE){az=aw.to-2;aA=aw.to+1}}C[az]=C[aA];C[aA]=null}return aw}function c(ax){var aw=b();var aE=ax.from;var aF=ax.to;var aI=ax.piece;var aH=0;var aD=0;var aB=0;for(var az=0,aC=aw.length;az<aC;az++){var aA=aw[az].from;var ay=aw[az].to;var aG=aw[az].piece;if(aI===aG&&aE!==aA&&aF===ay){aH++;if(U(aE)===U(aA)){aD++}if(y(aE)===y(aA)){aB++}}}if(aH>0){if(aD>0&&aB>0){return m(aE)}else{if(aB>0){return m(aE).charAt(1)}else{return m(aE).charAt(0)}}}return""}function a(){var az=" +------------------------+\n";for(var ax=v.a8;ax<=v.h1;ax++){if(y(ax)===0){az+=" 87654321"[U(ax)]+" |"}if(C[ax]==null){az+=" . "}else{var ay=C[ax].type;var aw=C[ax].color;var aA=(aw===k)?ay.toUpperCase():ay.toLowerCase();az+=" "+aA+" "}if((ax+1)&136){az+="|\n";ax+=8}}az+=" +------------------------+\n";az+=" a b c d e f g h\n";return az}function U(aw){return aw>>4}function y(aw){return aw&15}function m(aw){var ay=y(aw),ax=U(aw);return"abcdefgh".substring(ay,ay+1)+"87654321".substring(ax,ax+1)}function au(aw){return aw===k?p:k}function r(aw){return"0123456789".indexOf(aw)!==-1}function l(az){var ay=w(az);ay.san=ar(ay);ay.to=m(ay.to);ay.from=m(ay.from);var ax="";for(var aw in D){if(D[aw]&ay.flags){ax+=aj[aw]}}ay.flags=ax;return ay}function w(ay){var aw=(ay instanceof Array)?[]:{};for(var ax in ay){if(typeof ax==="object"){aw[ax]=w(ay[ax])}else{aw[ax]=ay[ax]}}return aw}function ap(aw){return aw.replace(/^\s+|\s+$/g,"")}function ai(aC){var ax=b({legal:false});var az=0;var ay=t;for(var aA=0,aw=ax.length;aA<aw;aA++){al(ax[aA]);if(!L(ay)){if(aC-1>0){var aB=ai(aC-1);az+=aB}else{az++}}G()}return az}return{WHITE:k,BLACK:p,PAWN:X,KNIGHT:S,BISHOP:s,ROOK:H,QUEEN:j,KING:ad,SQUARES:(function(){var ax=[];for(var aw=v.a8;aw<=v.h1;aw++){if(aw&136){aw+=7;continue}ax.push(m(aw))}return ax})(),FLAGS:aj,load:function(aw){return h(aw)},reset:function(){return Y()},moves:function(az){var ay=b(az);var ax=[];for(var aA=0,aw=ay.length;aA<aw;aA++){if(typeof az!=="undefined"&&"verbose" in az&&az.verbose){ax.push(l(ay[aA]))}else{ax.push(ar(ay[aA]))}}return ax},in_check:function(){return R()},in_checkmate:function(){return I()},in_stalemate:function(){return ah()},in_draw:function(){return n>=100||ah()||A()||i()},insufficient_material:function(){return A()},in_threefold_repetition:function(){return i()},game_over:function(){return n>=100||I()||ah()||A()||i()},validate_fen:function(aw){return aa(aw)},fen:function(){return z()},pgn:function(aG){var az=(typeof aG==="object"&&typeof aG.newline_char==="string")?aG.newline_char:"\n";var aF=(typeof aG==="object"&&typeof aG.max_width==="number")?aG.max_width:0;var aH=[];var aD=false;for(var aB in ab){aH.push("["+aB+' "'+ab[aB]+'"]'+az);aD=true}if(aD&&Z.length){aH.push(az)}var aE=[];while(Z.length>0){aE.push(G())}var ax=[];var ay="";var aw=1;while(aE.length>0){var aA=aE.pop();if(aw===1&&aA.color==="b"){ay="1. ...";aw++}else{if(aA.color==="w"){if(ay.length){ax.push(ay)}ay=aw+".";aw++}}ay=ay+" "+ar(aA);al(aA)}if(ay.length){ax.push(ay)}if(typeof ab.Result!=="undefined"){ax.push(ab.Result)}if(aF===0){return aH.join("")+ax.join(" ")}var aC=0;for(var aB=0;aB<ax.length;aB++){if(aC+ax[aB].length>aF&&aB!==0){if(aH[aH.length-1]===" "){aH.pop()}aH.push(az);aC=0}else{if(aB!==0){aH.push(" ");aC++}}aH.push(ax[aB]);aC+=ax[aB].length}return aH.join("")},load_pgn:function(aG,aK){function aL(aM){return aM.replace(/\n/g,"\\n").replace(/\r/g,"\\r")}function az(aO){var aV,aW,aN=D.NORMAL,aM;var aP=aO.match(/^([NBKRQ])?([abcdefgh12345678][12345678]?)?(x)?([abcdefgh][12345678])(=?[NBRQ])?/);if(aO.slice(0,5)==="O-O-O"){aW=ak[t];aV=aW-2;aN=D.QSIDE_CASTLE}else{if(aO.slice(0,3)==="O-O"){aW=ak[t];aV=aW+2;aN=D.KSIDE_CASTLE}else{if(aP&&aP[1]){var aY=aP[1].toLowerCase();if(aP[3]){aN=D.CAPTURE}aV=v[aP[4]];for(var aR=0,aS=J[aY].length;aR<aS;aR++){var aQ=J[aY][aR];var aX=aV;while(true){aX+=aQ;if(aX&136){break}var aU=C[aX];if(aU){if(aU.color===t&&aU.type===aY&&(!aP[2]||m(aX).indexOf(aP[2])>=0)){aW=aX}break}if(aY==="n"||aY==="k"){break}}}}else{if(aP){if(aP[3]){aV=v[aP[4]];for(var aR=2;aR<4;aR++){var aX=aV-u[t][aR];if(aX&136){continue}if(C[aX]!=null&&C[aX].color===t&&m(aX)[0]===aP[2]){aW=aX}}if(C[aV]){aN=D.CAPTURE}else{aN=D.EP_CAPTURE}}else{aV=v[aO.slice(0,2)];var aT=aV-u[t][0],aU=C[aT];if(aU&&aU.type===X&&aU.color===t){aW=aT}else{aT=aV-u[t][1];aU=C[aT];if(aU&&aU.type===X&&aU.color===t){aW=aT;aN=D.BIG_PAWN}}}if(aP[5]){if(typeof aP[5][1]=="undefined"){aM=aP[5][0].toLowerCase()}else{aM=aP[5][1].toLowerCase()}}}}}}if(aW>=0&&aV>=0&&aN){return am(C,aW,aV,aN,aM)}else{if(aO.length>0){}}}function aE(aM){return az(ap(aM))}function aw(aM){var aO=false;for(var aN in aM){aO=true}return aO}function aI(aT,aM){var aR=(typeof aM==="object"&&typeof aM.newline_char==="string")?aM.newline_char:"\r?\n";var aQ={};var aS=aT.split(aR);var aO="";var aP="";for(var aN=0;aN<aS.length;aN++){aO=aS[aN].replace(/^\[([A-Z][A-Za-z]*)\s.*\]$/,"$1");aP=aS[aN].replace(/^\[[A-Za-z]+\s"(.*)"\]$/,"$1");if(ap(aO).length>0){aQ[aO]=aP}}return aQ}var aB=(typeof aK==="object"&&typeof aK.newline_char==="string")?aK.newline_char:"\r?\n";var aH=new RegExp("^(\\[(.|"+aL(aB)+")*\\])("+aL(aB)+")*1.("+aL(aB)+"|.)*$","g");var aD=aG.replace(aH,"$1");if(aD[0]!=="["){aD=""}Y();var aA=aI(aD,aK);for(var aJ in aA){at([aJ,aA[aJ]])}var ay=aG.replace(aD,"").replace(new RegExp(aL(aB),"g")," ");ay=ay.replace(/(\{[^}]+\})+?/g,"");ay=ay.replace(/\d+\./g,"");var ax=ap(ay).split(new RegExp(/\s+/));ax=ax.join(",").replace(/,,+/g,",").split(",");var aC="";for(var aF=0;aF<ax.length-1;aF++){aC=aE(ax[aF]);if(aC==null){return false}else{al(aC)}}aC=ax[ax.length-1];if(B.indexOf(aC)>-1){if(aw(ab)&&typeof ab.Result==="undefined"){at(["Result",aC])}}else{aC=aE(aC);if(aC==null){return false}else{al(aC)}}return true},header:function(){return at(arguments)},ascii:function(){return a()},turn:function(){return t},move:function(aA){var az=null;var ay=b();if(typeof aA==="string"){for(var aB=0,ax=ay.length;aB<ax;aB++){if(aA===ar(ay[aB])){az=ay[aB];break}}}else{if(typeof aA==="object"){for(var aB=0,ax=ay.length;aB<ax;aB++){if(aA.from===m(ay[aB].from)&&aA.to===m(ay[aB].to)&&(!("promotion" in ay[aB])||aA.promotion===ay[aB].promotion)){az=ay[aB];break}}}}if(!az){return null}var aw=l(az);al(az);return aw},undo:function(){var aw=G();return(aw)?l(aw):null},clear:function(){return ae()},put:function(aw,ax){return aq(aw,ax)},get:function(aw){return ag(aw)},remove:function(aw){return F(aw)},perft:function(aw){return ai(aw)},square_color:function(ax){if(ax in v){var aw=v[ax];return((U(aw)+y(aw))%2===0)?"light":"dark"}return null},history:function(ay){var aA=[];var az=[];var ax=(typeof ay!=="undefined"&&"verbose" in ay&&ay.verbose);while(Z.length>0){aA.push(G())}while(aA.length>0){var aw=aA.pop();if(ax){az.push(l(aw))}else{az.push(ar(aw))}al(aw)}return az}}};if(typeof exports!=="undefined"){exports.Chess=Chess};
/*!
* Stockfish.js 16 (c) 2023, Chess.com, LLC
* https://github.com/nmrugg/stockfish.js
* License: GPLv3
*
* Based on stockfish.wasm (c)
* Niklas Fiekas <niklas.fiekas@backscattering.de>
* Hiroshi Ogawa <hi.ogawa.zz@gmail.com>
* https://github.com/niklasf/stockfish.wasm
* https://github.com/hi-ogawa/Stockfish
*
* Based on Stockfish (c) T. Romstad, M. Costalba, J. Kiiski, G. Linscott and other contributors.
* https://github.com/official-stockfish/Stockfish
*/
(function () {
var Stockfish;
var quickTimeout;
function INIT_ENGINE() {
var Stockfish = (function() {
var _scriptDir = typeof document !== 'undefined' && document.currentScript ? document.currentScript.src : undefined;
if (typeof __filename !== 'undefined') _scriptDir = _scriptDir || __filename;
return (
function(Stockfish) {
Stockfish = Stockfish || {};
null;
var Module = typeof Stockfish !== "undefined" ? Stockfish : {};
var readyPromiseResolve, readyPromiseReject;
Module["ready"] = new Promise(function(resolve, reject) {
readyPromiseResolve = resolve;
readyPromiseReject = reject;
});
if (typeof XMLHttpRequest === "undefined") {
global["XMLHttpRequest"] = function(a) {
var url;
var xhr = {
open: function(method, _url) {
url = _url;
},
send: function() {
require("fs").readFile(url, function(err, data) {
xhr.readyState = 4;
if (err) {
console.error(err);
xhr.status = 404;
xhr.onerror(err);
} else {
xhr.status = 200;
xhr.response = data;
xhr.onreadystatechange();
xhr.onload();
}
});
}
};
return xhr;
};
}
if (typeof global !== "undefined" && Object.prototype.toString.call(global.process) === "[object process]" && typeof fetch !== "undefined") {
fetch = null;
}
Module["postCustomMessage"] = function(data) {
if (typeof PThread !== "undefined") {
for (var worker of PThread.runningWorkers) {
worker.postMessage({
"cmd": "custom",
"userData": data
});
}
} else {
console.log('on custom message', data);
Module["onCustomMessage"](data);
}
};
function createQueue() {
var list = [];
var pending;
return {
get: async function() {
if (list.length > 0) {
return list.shift();
}
return await new Promise(function(resolve) {
return pending = resolve;
});
},
put: function(data) {
if (pending) {
pending(data);
pending = null;
} else {
list.push(data);
}
}
};
}
Module["queue"] = createQueue();
Module["onCustomMessage"] = function(data) {
if (!queuePaused) {
Module["queue"].put(data);
} else {
waitingQueue.push(data);
}
};
var queuePaused;
var waitingQueue = [];
Module["pauseQueue"] = function() {
queuePaused = true;
};
Module["unpauseQueue"] = function() {
var oldQueue = waitingQueue;
waitingQueue = [];
queuePaused = false;
oldQueue.forEach(function(data) {
Module["queue"].put(data);
});
};
Module["postMessage"] = Module["postCustomMessage"];
var listeners = [];
Module["addMessageListener"] = function(listener) {
listeners.push(listener);
};
Module["removeMessageListener"] = function(listener) {
var i = listeners.indexOf(listener);
if (i >= 0) {
listeners.splice(i, 1);
}
};
Module["print"] = Module["printErr"] = function(data) {
if (listeners.length === 0) {
return console.log(data);
}
for (var listener of listeners) {
listener(data);
}
};
Module["terminate"] = function() {
if (typeof PThread !== "undefined") {
PThread.terminateAllThreads();
}
};
Module["__IS_SINGLE_THREADED__"] = true;
Module["_origOnCustomMessage"] = Module["onCustomMessage"];
Module["onCustomMessage"] = function(data) {
if (data === "stop" || data === "quit") {
Module["_stop"]();
} else if (data === "ponderhit") {
Module["_ponderhit"]();
}
return Module["_origOnCustomMessage"](data);
};
var moduleOverrides = {};
var key;
for (key in Module) {
if (Module.hasOwnProperty(key)) {
moduleOverrides[key] = Module[key];
}
}
var arguments_ = [];
var thisProgram = "./this.program";
var quit_ = function(status, toThrow){if(status!==0)throw toThrow;
};
var ENVIRONMENT_IS_WEB = typeof window === "object";
var ENVIRONMENT_IS_WORKER = typeof importScripts === "function";
var ENVIRONMENT_IS_NODE = typeof process === "object" && typeof process.versions === "object" && typeof process.versions.node === "string";
var scriptDirectory = "";
function locateFile(path) {
if (Module["locateFile"]) {
return Module["locateFile"](path, scriptDirectory);
}
return scriptDirectory + path;
}
var read_, readAsync, readBinary, setWindowTitle;
var nodeFS;
var nodePath;
if (ENVIRONMENT_IS_NODE) {
if (ENVIRONMENT_IS_WORKER) {
scriptDirectory = require("path").dirname(scriptDirectory) + "/";
} else {
scriptDirectory = __dirname + "/";
}
read_ = function shell_read(filename, binary) {
if (!nodeFS) nodeFS = require("fs");
if (!nodePath) nodePath = require("path");
filename = nodePath["normalize"](filename);
return nodeFS["readFileSync"](filename, binary ? null : "utf8");
};
readBinary = function readBinary(filename) {
var ret = read_(filename, true);
if (!ret.buffer) {
ret = new Uint8Array(ret);
}
assert(ret.buffer);
return ret;
};
readAsync = function readAsync(filename, onload, onerror) {
if (!nodeFS) nodeFS = require("fs");
if (!nodePath) nodePath = require("path");
filename = nodePath["normalize"](filename);
nodeFS["readFile"](filename, function(err, data) {
if (err) onerror(err); else onload(data.buffer);
});
};
if (process["argv"].length > 1) {
thisProgram = process["argv"][1].replace(/\\/g, "/");
}
arguments_ = process["argv"].slice(2);
process["on"]("uncaughtException", function(ex) {
if (!(ex instanceof ExitStatus)) {
throw ex;
}
});
process["on"]("unhandledRejection", abort);
quit_ = function(status, toThrow) {
if (keepRuntimeAlive()) {
process["exitCode"] = status;
throw toThrow;
}
process["exit"](status);
};
Module["inspect"] = function() {
return "[Emscripten Module object]";
};
} else if (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) {
if (ENVIRONMENT_IS_WORKER) {
scriptDirectory = self.location.href;
} else if (typeof document !== "undefined" && document.currentScript) {
scriptDirectory = document.currentScript.src;
}
if (_scriptDir) {
scriptDirectory = _scriptDir;
}
if (scriptDirectory.indexOf("blob:") !== 0) {
scriptDirectory = scriptDirectory.substr(0, scriptDirectory.lastIndexOf("/") + 1);
} else {
scriptDirectory = "";
}
{
read_ = function(url) {
var xhr = new XMLHttpRequest();
xhr.open("GET", url, false);
xhr.send(null);
return xhr.responseText;
};
if (ENVIRONMENT_IS_WORKER) {
readBinary = function(url) {
var xhr = new XMLHttpRequest();
xhr.open("GET", url, false);
xhr.responseType = "arraybuffer";
xhr.send(null);
return new Uint8Array(xhr.response);
};
}
readAsync = function(url, onload, onerror) {
var xhr = new XMLHttpRequest();
xhr.open("GET", url, true);
xhr.responseType = "arraybuffer";
xhr.onload = function() {
if (xhr.status == 200 || xhr.status == 0 && xhr.response) {
onload(xhr.response);
return;
}
onerror();
};
xhr.onerror = onerror;
xhr.send(null);
};
}
setWindowTitle = function(title) {
document.title = title;
};
} else {}
var out = Module["print"] || console.log.bind(console);
var err = Module["printErr"] || console.warn.bind(console);
for (key in moduleOverrides) {
if (moduleOverrides.hasOwnProperty(key)) {
Module[key] = moduleOverrides[key];
}
}
moduleOverrides = null;
if (Module["arguments"]) arguments_ = Module["arguments"];
if (Module["thisProgram"]) thisProgram = Module["thisProgram"];
if (Module["quit"]) quit_ = Module["quit"];
var wasmBinary;
if (Module["wasmBinary"]) wasmBinary = Module["wasmBinary"];
var noExitRuntime = Module["noExitRuntime"] || true;
if (typeof WebAssembly !== "object") {
abort("no native wasm support detected");
}
var wasmMemory;
var ABORT = false;
var EXITSTATUS;
function assert(condition, text) {
if (!condition) {
abort("Assertion failed: " + text);
}
}
var UTF8Decoder = typeof TextDecoder !== "undefined" ? new TextDecoder("utf8") : undefined;
function UTF8ArrayToString(heap, idx, maxBytesToRead) {
var endIdx = idx + maxBytesToRead;
var endPtr = idx;
while (heap[endPtr] && !(endPtr >= endIdx)) ++endPtr;
if (endPtr - idx > 16 && heap.subarray && UTF8Decoder) {
return UTF8Decoder.decode(heap.subarray(idx, endPtr));
} else {
var str = "";
while (idx < endPtr) {
var u0 = heap[idx++];
if (!(u0 & 128)) {
str += String.fromCharCode(u0);
continue;
}
var u1 = heap[idx++] & 63;
if ((u0 & 224) == 192) {
str += String.fromCharCode((u0 & 31) << 6 | u1);
continue;
}
var u2 = heap[idx++] & 63;
if ((u0 & 240) == 224) {
u0 = (u0 & 15) << 12 | u1 << 6 | u2;
} else {
u0 = (u0 & 7) << 18 | u1 << 12 | u2 << 6 | heap[idx++] & 63;
}
if (u0 < 65536) {
str += String.fromCharCode(u0);
} else {
var ch = u0 - 65536;
str += String.fromCharCode(55296 | ch >> 10, 56320 | ch & 1023);
}
}
}
return str;
}
function UTF8ToString(ptr, maxBytesToRead) {
return ptr ? UTF8ArrayToString(HEAPU8, ptr, maxBytesToRead) : "";
}
function stringToUTF8Array(str, heap, outIdx, maxBytesToWrite) {
if (!(maxBytesToWrite > 0)) return 0;
var startIdx = outIdx;
var endIdx = outIdx + maxBytesToWrite - 1;
for (var i = 0; i < str.length; ++i) {
var u = str.charCodeAt(i);
if (u >= 55296 && u <= 57343) {
var u1 = str.charCodeAt(++i);
u = 65536 + ((u & 1023) << 10) | u1 & 1023;
}
if (u <= 127) {
if (outIdx >= endIdx) break;
heap[outIdx++] = u;
} else if (u <= 2047) {
if (outIdx + 1 >= endIdx) break;
heap[outIdx++] = 192 | u >> 6;
heap[outIdx++] = 128 | u & 63;
} else if (u <= 65535) {
if (outIdx + 2 >= endIdx) break;
heap[outIdx++] = 224 | u >> 12;
heap[outIdx++] = 128 | u >> 6 & 63;
heap[outIdx++] = 128 | u & 63;
} else {
if (outIdx + 3 >= endIdx) break;
heap[outIdx++] = 240 | u >> 18;
heap[outIdx++] = 128 | u >> 12 & 63;
heap[outIdx++] = 128 | u >> 6 & 63;
heap[outIdx++] = 128 | u & 63;
}
}
heap[outIdx] = 0;
return outIdx - startIdx;
}
function stringToUTF8(str, outPtr, maxBytesToWrite) {
return stringToUTF8Array(str, HEAPU8, outPtr, maxBytesToWrite);
}
function lengthBytesUTF8(str) {
var len = 0;
for (var i = 0; i < str.length; ++i) {
var u = str.charCodeAt(i);
if (u >= 55296 && u <= 57343) u = 65536 + ((u & 1023) << 10) | str.charCodeAt(++i) & 1023;
if (u <= 127) ++len; else if (u <= 2047) len += 2; else if (u <= 65535) len += 3; else len += 4;
}
return len;
}
function allocateUTF8OnStack(str) {
var size = lengthBytesUTF8(str) + 1;
var ret = stackAlloc(size);
stringToUTF8Array(str, HEAP8, ret, size);
return ret;
}
function writeArrayToMemory(array, buffer) {
HEAP8.set(array, buffer);
}
function writeAsciiToMemory(str, buffer, dontAddNull) {
for (var i = 0; i < str.length; ++i) {
HEAP8[buffer++ >> 0] = str.charCodeAt(i);
}
if (!dontAddNull) HEAP8[buffer >> 0] = 0;
}
var buffer, HEAP8, HEAPU8, HEAP16, HEAPU16, HEAP32, HEAPU32, HEAPF32, HEAPF64;
function updateGlobalBufferAndViews(buf) {
buffer = buf;
Module["HEAP8"] = HEAP8 = new Int8Array(buf);
Module["HEAP16"] = HEAP16 = new Int16Array(buf);
Module["HEAP32"] = HEAP32 = new Int32Array(buf);
Module["HEAPU8"] = HEAPU8 = new Uint8Array(buf);
Module["HEAPU16"] = HEAPU16 = new Uint16Array(buf);
Module["HEAPU32"] = HEAPU32 = new Uint32Array(buf);
Module["HEAPF32"] = HEAPF32 = new Float32Array(buf);
Module["HEAPF64"] = HEAPF64 = new Float64Array(buf);
}
var INITIAL_MEMORY = Module["INITIAL_MEMORY"] || 536870912;
var wasmTable;
var __ATPRERUN__ = [];
var __ATINIT__ = [];
var __ATMAIN__ = [];
var __ATPOSTRUN__ = [];
var runtimeInitialized = false;
var runtimeExited = false;
var runtimeKeepaliveCounter = 0;
function keepRuntimeAlive() {
return noExitRuntime || runtimeKeepaliveCounter > 0;
}
function preRun() {
if (Module["preRun"]) {
if (typeof Module["preRun"] == "function") Module["preRun"] = [ Module["preRun"] ];
while (Module["preRun"].length) {
addOnPreRun(Module["preRun"].shift());
}
}
callRuntimeCallbacks(__ATPRERUN__);
}
function initRuntime() {
runtimeInitialized = true;
callRuntimeCallbacks(__ATINIT__);
}
function preMain() {
callRuntimeCallbacks(__ATMAIN__);
}
function exitRuntime() {
runtimeExited = true;
}
function postRun() {
if (Module["postRun"]) {
if (typeof Module["postRun"] == "function") Module["postRun"] = [ Module["postRun"] ];
while (Module["postRun"].length) {
addOnPostRun(Module["postRun"].shift());
}
}
callRuntimeCallbacks(__ATPOSTRUN__);
}
function addOnPreRun(cb) {
__ATPRERUN__.unshift(cb);
}
function addOnInit(cb) {
__ATINIT__.unshift(cb);
}
function addOnPostRun(cb) {
__ATPOSTRUN__.unshift(cb);
}
var runDependencies = 0;
var runDependencyWatcher = null;
var dependenciesFulfilled = null;
function addRunDependency(id) {
runDependencies++;
if (Module["monitorRunDependencies"]) {
Module["monitorRunDependencies"](runDependencies);
}
}
function removeRunDependency(id) {
runDependencies--;
if (Module["monitorRunDependencies"]) {
Module["monitorRunDependencies"](runDependencies);
}
if (runDependencies == 0) {
if (runDependencyWatcher !== null) {
clearInterval(runDependencyWatcher);
runDependencyWatcher = null;
}
if (dependenciesFulfilled) {
var callback = dependenciesFulfilled;
dependenciesFulfilled = null;
callback();
}
}
}
Module["preloadedImages"] = {};
Module["preloadedAudios"] = {};
function abort(what) {
if (Module["onAbort"]) {
Module["onAbort"](what);
}
what += "";
err(what);
ABORT = true;
EXITSTATUS = 1;
what = "abort(" + what + "). Build with -s ASSERTIONS=1 for more info.";
var e = new WebAssembly.RuntimeError(what);
readyPromiseReject(e);
throw e;
}
var dataURIPrefix = "data:application/octet-stream;base64,";
function isDataURI(filename) {
return filename.startsWith(dataURIPrefix);
}
var wasmBinaryFile;
wasmBinaryFile = "stockfish.wasm";
if (!isDataURI(wasmBinaryFile)) {
wasmBinaryFile = locateFile(wasmBinaryFile);
}
function getBinary(file) {
try {
if (file == wasmBinaryFile && wasmBinary) {
return new Uint8Array(wasmBinary);
}
if (readBinary) {
return readBinary(file);
} else {
throw "both async and sync fetching of the wasm failed";
}
} catch (err) {
abort(err);
}
}
function getBinaryPromise() {
if (!wasmBinary && (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER)) {
if (typeof fetch === "function") {
return fetch(wasmBinaryFile, {
credentials: "same-origin"
}).then(function(response) {
if (!response["ok"]) {
throw "failed to load wasm binary file at '" + wasmBinaryFile + "'";
}
return response["arrayBuffer"]();
}).catch(function() {
return getBinary(wasmBinaryFile);
});
}
}
return Promise.resolve().then(function() {
return getBinary(wasmBinaryFile);
});
}
function createWasm() {
var info = {
"a": asmLibraryArg
};
function receiveInstance(instance, module) {
var exports = instance.exports;
exports = Asyncify.instrumentWasmExports(exports);
Module["asm"] = exports;
wasmMemory = Module["asm"]["w"];
updateGlobalBufferAndViews(wasmMemory.buffer);
wasmTable = Module["asm"]["F"];
addOnInit(Module["asm"]["x"]);
removeRunDependency("wasm-instantiate");
}
addRunDependency("wasm-instantiate");
function receiveInstantiationResult(result) {
receiveInstance(result["instance"]);
}
function instantiateArrayBuffer(receiver) {
return getBinaryPromise().then(function(binary) {
var result = WebAssembly.instantiate(binary, info);
return result;
}).then(receiver, function(reason) {
err("failed to asynchronously prepare wasm: " + reason);
abort(reason);
});
}
function instantiateAsync() {
if (!wasmBinary && typeof WebAssembly.instantiateStreaming === "function" && !isDataURI(wasmBinaryFile) && typeof fetch === "function") {
return fetch(wasmBinaryFile, {
credentials: "same-origin"
}).then(function(response) {
var result = WebAssembly.instantiateStreaming(response, info);
return result.then(receiveInstantiationResult, function(reason) {
err("wasm streaming compile failed: " + reason);
err("falling back to ArrayBuffer instantiation");
return instantiateArrayBuffer(receiveInstantiationResult);
});
});
} else {
return instantiateArrayBuffer(receiveInstantiationResult);
}
}
if (Module["instantiateWasm"]) {
try {
var exports = Module["instantiateWasm"](info, receiveInstance);
exports = Asyncify.instrumentWasmExports(exports);
return exports;
} catch (e) {
err("Module.instantiateWasm callback failed with error: " + e);
return false;
}
}
instantiateAsync().catch(readyPromiseReject);
return {};
}
function emscripten_utils_getline_impl() {
const toHeap = js_str => {
const num_bytes = lengthBytesUTF8(js_str) + 1;
const ptr = _malloc(num_bytes);
stringToUTF8(js_str, ptr, num_bytes);
return ptr;
};
return Asyncify.handleAsync(async () => {
const command = await Module["queue"].get();
return toHeap(command);
});
}
function pauseQueue() {
Module["pauseQueue"]();
}
function unpauseQueue() {
Module["unpauseQueue"]();
}
function callRuntimeCallbacks(callbacks) {
while (callbacks.length > 0) {
var callback = callbacks.shift();
if (typeof callback == "function") {
callback(Module);
continue;
}
var func = callback.func;
if (typeof func === "number") {
if (callback.arg === undefined) {
(function() {
dynCall_v.call(null, func);
})();
} else {
(function(a1) {
dynCall_vi.apply(null, [ func, a1 ]);
})(callback.arg);
}
} else {
func(callback.arg === undefined ? null : callback.arg);
}
}
}
function setErrNo(value) {
HEAP32[___errno_location() >> 2] = value;
return value;
}
var SYSCALLS = {
mappings: {},
buffers: [ null, [], [] ],
printChar: function(stream, curr) {
var buffer = SYSCALLS.buffers[stream];
if (curr === 0 || curr === 10) {
(stream === 1 ? out : err)(UTF8ArrayToString(buffer, 0));
buffer.length = 0;
} else {
buffer.push(curr);
}
},
varargs: undefined,
get: function() {
SYSCALLS.varargs += 4;
var ret = HEAP32[SYSCALLS.varargs - 4 >> 2];
return ret;
},
getStr: function(ptr) {
var ret = UTF8ToString(ptr);
return ret;
},
get64: function(low, high) {
return low;
}
};
function ___sys_fcntl64(fd, cmd, varargs) {
SYSCALLS.varargs = varargs;
return 0;
}
function ___sys_ioctl(fd, op, varargs) {
SYSCALLS.varargs = varargs;
return 0;
}
function ___sys_open(path, flags, varargs) {
SYSCALLS.varargs = varargs;
}
function __emscripten_fetch_free(id) {
delete Fetch.xhrs[id - 1];
}
function _abort() {
abort();
}
var _emscripten_get_now;
if (ENVIRONMENT_IS_NODE) {
_emscripten_get_now = function() {
var t = process["hrtime"]();
return t[0] * 1e3 + t[1] / 1e6;
};
} else _emscripten_get_now = function() {
return performance.now();
};
var _emscripten_get_now_is_monotonic = true;
function _clock_gettime(clk_id, tp) {
var now;
if (clk_id === 0) {
now = Date.now();
} else if ((clk_id === 1 || clk_id === 4) && _emscripten_get_now_is_monotonic) {
now = _emscripten_get_now();
} else {
setErrNo(28);
return -1;
}
HEAP32[tp >> 2] = now / 1e3 | 0;
HEAP32[tp + 4 >> 2] = now % 1e3 * 1e3 * 1e3 | 0;
return 0;
}
function _emscripten_is_main_browser_thread() {
return !ENVIRONMENT_IS_WORKER;
}
function _emscripten_memcpy_big(dest, src, num) {
HEAPU8.copyWithin(dest, src, src + num);
}
function abortOnCannotGrowMemory(requestedSize) {
abort("OOM");
}
function _emscripten_resize_heap(requestedSize) {
var oldSize = HEAPU8.length;
requestedSize = requestedSize >>> 0;
abortOnCannotGrowMemory(requestedSize);
}
function safeSetTimeout(func, timeout) {
return setTimeout(function() {
callUserCallback(func);
}, timeout);
}
function _emscripten_sleep(ms) {
Asyncify.handleSleep(function(wakeUp) {
safeSetTimeout(wakeUp, ms);
});
}
var Fetch = {
xhrs: [],
setu64: function(addr, val) {
HEAPU32[addr >> 2] = val;
HEAPU32[addr + 4 >> 2] = val / 4294967296 | 0;
},
openDatabase: function(dbname, dbversion, onsuccess, onerror) {
try {
var openRequest = indexedDB.open(dbname, dbversion);
} catch (e) {
return onerror(e);
}
openRequest.onupgradeneeded = function(event) {
var db = event.target.result;
if (db.objectStoreNames.contains("FILES")) {
db.deleteObjectStore("FILES");
}
db.createObjectStore("FILES");
};
openRequest.onsuccess = function(event) {
onsuccess(event.target.result);
};
openRequest.onerror = function(error) {
onerror(error);
};
},
staticInit: function() {
var isMainThread = true;
var onsuccess = function(db) {
Fetch.dbInstance = db;
if (isMainThread) {
removeRunDependency("library_fetch_init");
}
};
var onerror = function() {
Fetch.dbInstance = false;
if (isMainThread) {
removeRunDependency("library_fetch_init");
}
};
Fetch.openDatabase("emscripten_filesystem", 1, onsuccess, onerror);
if (typeof ENVIRONMENT_IS_FETCH_WORKER === "undefined" || !ENVIRONMENT_IS_FETCH_WORKER) addRunDependency("library_fetch_init");
}
};
function fetchXHR(fetch, onsuccess, onerror, onprogress, onreadystatechange) {
var url = HEAPU32[fetch + 8 >> 2];
if (!url) {
onerror(fetch, 0, "no url specified!");
return;
}
var url_ = UTF8ToString(url);
var fetch_attr = fetch + 112;
var requestMethod = UTF8ToString(fetch_attr);
if (!requestMethod) requestMethod = "GET";
var userData = HEAPU32[fetch + 4 >> 2];
var fetchAttributes = HEAPU32[fetch_attr + 52 >> 2];
var timeoutMsecs = HEAPU32[fetch_attr + 56 >> 2];
var withCredentials = !!HEAPU32[fetch_attr + 60 >> 2];
var destinationPath = HEAPU32[fetch_attr + 64 >> 2];
var userName = HEAPU32[fetch_attr + 68 >> 2];
var password = HEAPU32[fetch_attr + 72 >> 2];
var requestHeaders = HEAPU32[fetch_attr + 76 >> 2];
var overriddenMimeType = HEAPU32[fetch_attr + 80 >> 2];
var dataPtr = HEAPU32[fetch_attr + 84 >> 2];
var dataLength = HEAPU32[fetch_attr + 88 >> 2];
var fetchAttrLoadToMemory = !!(fetchAttributes & 1);
var fetchAttrStreamData = !!(fetchAttributes & 2);
var fetchAttrSynchronous = !!(fetchAttributes & 64);
var userNameStr = userName ? UTF8ToString(userName) : undefined;
var passwordStr = password ? UTF8ToString(password) : undefined;
var overriddenMimeTypeStr = overriddenMimeType ? UTF8ToString(overriddenMimeType) : undefined;
var xhr = new XMLHttpRequest();
xhr.withCredentials = withCredentials;
xhr.open(requestMethod, url_, !fetchAttrSynchronous, userNameStr, passwordStr);
if (!fetchAttrSynchronous) xhr.timeout = timeoutMsecs;
xhr.url_ = url_;
xhr.responseType = "arraybuffer";
if (overriddenMimeType) {
xhr.overrideMimeType(overriddenMimeTypeStr);
}
if (requestHeaders) {
for (;;) {
var key = HEAPU32[requestHeaders >> 2];
if (!key) break;
var value = HEAPU32[requestHeaders + 4 >> 2];
if (!value) break;
requestHeaders += 8;
var keyStr = UTF8ToString(key);
var valueStr = UTF8ToString(value);
xhr.setRequestHeader(keyStr, valueStr);
}
}
Fetch.xhrs.push(xhr);
var id = Fetch.xhrs.length;
HEAPU32[fetch + 0 >> 2] = id;
var data = dataPtr && dataLength ? HEAPU8.slice(dataPtr, dataPtr + dataLength) : null;
function saveResponse(condition) {
var ptr = 0;
var ptrLen = 0;
if (condition) {
ptrLen = xhr.response ? xhr.response.byteLength : 0;
ptr = _malloc(ptrLen);
HEAPU8.set(new Uint8Array(xhr.response), ptr);
}
HEAPU32[fetch + 12 >> 2] = ptr;
Fetch.setu64(fetch + 16, ptrLen);
}
xhr.onload = function(e) {
saveResponse(fetchAttrLoadToMemory && !fetchAttrStreamData);
var len = xhr.response ? xhr.response.byteLength : 0;
Fetch.setu64(fetch + 24, 0);
if (len) {
Fetch.setu64(fetch + 32, len);
}
HEAPU16[fetch + 40 >> 1] = xhr.readyState;
HEAPU16[fetch + 42 >> 1] = xhr.status;
if (xhr.statusText) stringToUTF8(xhr.statusText, fetch + 44, 64);
if (xhr.status >= 200 && xhr.status < 300) {
if (onsuccess) onsuccess(fetch, xhr, e);
} else {
if (onerror) onerror(fetch, xhr, e);
}
};
xhr.onerror = function(e) {
saveResponse(fetchAttrLoadToMemory);
var status = xhr.status;
Fetch.setu64(fetch + 24, 0);
Fetch.setu64(fetch + 32, xhr.response ? xhr.response.byteLength : 0);
HEAPU16[fetch + 40 >> 1] = xhr.readyState;
HEAPU16[fetch + 42 >> 1] = status;
if (onerror) onerror(fetch, xhr, e);
};
xhr.ontimeout = function(e) {
if (onerror) onerror(fetch, xhr, e);
};
xhr.onprogress = function(e) {
var ptrLen = fetchAttrLoadToMemory && fetchAttrStreamData && xhr.response ? xhr.response.byteLength : 0;
var ptr = 0;
if (fetchAttrLoadToMemory && fetchAttrStreamData) {
ptr = _malloc(ptrLen);
HEAPU8.set(new Uint8Array(xhr.response), ptr);
}
HEAPU32[fetch + 12 >> 2] = ptr;
Fetch.setu64(fetch + 16, ptrLen);
Fetch.setu64(fetch + 24, e.loaded - ptrLen);
Fetch.setu64(fetch + 32, e.total);
HEAPU16[fetch + 40 >> 1] = xhr.readyState;
if (xhr.readyState >= 3 && xhr.status === 0 && e.loaded > 0) xhr.status = 200;
HEAPU16[fetch + 42 >> 1] = xhr.status;
if (xhr.statusText) stringToUTF8(xhr.statusText, fetch + 44, 64);
if (onprogress) onprogress(fetch, xhr, e);
if (ptr) {
_free(ptr);
}
};
xhr.onreadystatechange = function(e) {
HEAPU16[fetch + 40 >> 1] = xhr.readyState;
if (xhr.readyState >= 2) {
HEAPU16[fetch + 42 >> 1] = xhr.status;
}
if (onreadystatechange) onreadystatechange(fetch, xhr, e);
};
try {
xhr.send(data);
} catch (e) {
if (onerror) onerror(fetch, xhr, e);
}
}
function callUserCallback(func, synchronous) {
if (ABORT) {
return;
}
if (synchronous) {
func();
return;
}
try {
func();
} catch (e) {
if (e instanceof ExitStatus) {
return;
} else if (e !== "unwind") {
if (e && typeof e === "object" && e.stack) err("exception thrown: " + [ e, e.stack ]);
throw e;
}
}
}
function fetchCacheData(db, fetch, data, onsuccess, onerror) {
if (!db) {
onerror(fetch, 0, "IndexedDB not available!");
return;
}
var fetch_attr = fetch + 112;
var destinationPath = HEAPU32[fetch_attr + 64 >> 2];
if (!destinationPath) destinationPath = HEAPU32[fetch + 8 >> 2];
var destinationPathStr = UTF8ToString(destinationPath);
try {
var transaction = db.transaction([ "FILES" ], "readwrite");
var packages = transaction.objectStore("FILES");
var putRequest = packages.put(data, destinationPathStr);
putRequest.onsuccess = function(event) {
HEAPU16[fetch + 40 >> 1] = 4;
HEAPU16[fetch + 42 >> 1] = 200;
stringToUTF8("OK", fetch + 44, 64);
onsuccess(fetch, 0, destinationPathStr);
};
putRequest.onerror = function(error) {
HEAPU16[fetch + 40 >> 1] = 4;
HEAPU16[fetch + 42 >> 1] = 413;
stringToUTF8("Payload Too Large", fetch + 44, 64);
onerror(fetch, 0, error);
};
} catch (e) {
onerror(fetch, 0, e);
}
}
function fetchLoadCachedData(db, fetch, onsuccess, onerror) {
if (!db) {
onerror(fetch, 0, "IndexedDB not available!");
return;
}
var fetch_attr = fetch + 112;
var path = HEAPU32[fetch_attr + 64 >> 2];
if (!path) path = HEAPU32[fetch + 8 >> 2];
var pathStr = UTF8ToString(path);
try {
var transaction = db.transaction([ "FILES" ], "readonly");
var packages = transaction.objectStore("FILES");
var getRequest = packages.get(pathStr);
getRequest.onsuccess = function(event) {
if (event.target.result) {
var value = event.target.result;
var len = value.byteLength || value.length;
var ptr = _malloc(len);
HEAPU8.set(new Uint8Array(value), ptr);
HEAPU32[fetch + 12 >> 2] = ptr;
Fetch.setu64(fetch + 16, len);
Fetch.setu64(fetch + 24, 0);
Fetch.setu64(fetch + 32, len);
HEAPU16[fetch + 40 >> 1] = 4;
HEAPU16[fetch + 42 >> 1] = 200;
stringToUTF8("OK", fetch + 44, 64);
onsuccess(fetch, 0, value);
} else {
HEAPU16[fetch + 40 >> 1] = 4;
HEAPU16[fetch + 42 >> 1] = 404;
stringToUTF8("Not Found", fetch + 44, 64);
onerror(fetch, 0, "no data");
}
};
getRequest.onerror = function(error) {
HEAPU16[fetch + 40 >> 1] = 4;
HEAPU16[fetch + 42 >> 1] = 404;
stringToUTF8("Not Found", fetch + 44, 64);
onerror(fetch, 0, error);
};
} catch (e) {
onerror(fetch, 0, e);
}
}
function fetchDeleteCachedData(db, fetch, onsuccess, onerror) {
if (!db) {
onerror(fetch, 0, "IndexedDB not available!");
return;
}
var fetch_attr = fetch + 112;
var path = HEAPU32[fetch_attr + 64 >> 2];
if (!path) path = HEAPU32[fetch + 8 >> 2];
var pathStr = UTF8ToString(path);
try {
var transaction = db.transaction([ "FILES" ], "readwrite");
var packages = transaction.objectStore("FILES");
var request = packages.delete(pathStr);
request.onsuccess = function(event) {
var value = event.target.result;
HEAPU32[fetch + 12 >> 2] = 0;
Fetch.setu64(fetch + 16, 0);
Fetch.setu64(fetch + 24, 0);
Fetch.setu64(fetch + 32, 0);
HEAPU16[fetch + 40 >> 1] = 4;
HEAPU16[fetch + 42 >> 1] = 200;
stringToUTF8("OK", fetch + 44, 64);
onsuccess(fetch, 0, value);
};
request.onerror = function(error) {
HEAPU16[fetch + 40 >> 1] = 4;
HEAPU16[fetch + 42 >> 1] = 404;
stringToUTF8("Not Found", fetch + 44, 64);
onerror(fetch, 0, error);
};
} catch (e) {
onerror(fetch, 0, e);
}
}
function _emscripten_start_fetch(fetch, successcb, errorcb, progresscb, readystatechangecb) {
var fetch_attr = fetch + 112;
var requestMethod = UTF8ToString(fetch_attr);
var onsuccess = HEAPU32[fetch_attr + 36 >> 2];
var onerror = HEAPU32[fetch_attr + 40 >> 2];
var onprogress = HEAPU32[fetch_attr + 44 >> 2];
var onreadystatechange = HEAPU32[fetch_attr + 48 >> 2];
var fetchAttributes = HEAPU32[fetch_attr + 52 >> 2];
var fetchAttrPersistFile = !!(fetchAttributes & 4);
var fetchAttrNoDownload = !!(fetchAttributes & 32);
var fetchAttrReplace = !!(fetchAttributes & 16);
var fetchAttrSynchronous = !!(fetchAttributes & 64);
var reportSuccess = function(fetch, xhr, e) {
callUserCallback(function() {
if (onsuccess) (function(a1) {
dynCall_vi.apply(null, [ onsuccess, a1 ]);
})(fetch); else if (successcb) successcb(fetch);
}, fetchAttrSynchronous);
};
var reportProgress = function(fetch, xhr, e) {
callUserCallback(function() {
if (onprogress) (function(a1) {
dynCall_vi.apply(null, [ onprogress, a1 ]);
})(fetch); else if (progresscb) progresscb(fetch);
}, fetchAttrSynchronous);
};
var reportError = function(fetch, xhr, e) {
callUserCallback(function() {
if (onerror) (function(a1) {
dynCall_vi.apply(null, [ onerror, a1 ]);
})(fetch); else if (errorcb) errorcb(fetch);
}, fetchAttrSynchronous);
};
var reportReadyStateChange = function(fetch, xhr, e) {
callUserCallback(function() {
if (onreadystatechange) (function(a1) {
dynCall_vi.apply(null, [ onreadystatechange, a1 ]);
})(fetch); else if (readystatechangecb) readystatechangecb(fetch);
}, fetchAttrSynchronous);
};
var performUncachedXhr = function(fetch, xhr, e) {
fetchXHR(fetch, reportSuccess, reportError, reportProgress, reportReadyStateChange);
};
var cacheResultAndReportSuccess = function(fetch, xhr, e) {
var storeSuccess = function(fetch, xhr, e) {
callUserCallback(function() {
if (onsuccess) (function(a1) {
dynCall_vi.apply(null, [ onsuccess, a1 ]);
})(fetch); else if (successcb) successcb(fetch);
}, fetchAttrSynchronous);
};
var storeError = function(fetch, xhr, e) {
callUserCallback(function() {
if (onsuccess) (function(a1) {
dynCall_vi.apply(null, [ onsuccess, a1 ]);
})(fetch); else if (successcb) successcb(fetch);
}, fetchAttrSynchronous);
};
fetchCacheData(Fetch.dbInstance, fetch, xhr.response, storeSuccess, storeError);
};
var performCachedXhr = function(fetch, xhr, e) {
fetchXHR(fetch, cacheResultAndReportSuccess, reportError, reportProgress, reportReadyStateChange);
};
if (requestMethod === "EM_IDB_STORE") {
var ptr = HEAPU32[fetch_attr + 84 >> 2];
fetchCacheData(Fetch.dbInstance, fetch, HEAPU8.slice(ptr, ptr + HEAPU32[fetch_attr + 88 >> 2]), reportSuccess, reportError);
} else if (requestMethod === "EM_IDB_DELETE") {
fetchDeleteCachedData(Fetch.dbInstance, fetch, reportSuccess, reportError);
} else if (!fetchAttrReplace) {
fetchLoadCachedData(Fetch.dbInstance, fetch, reportSuccess, fetchAttrNoDownload ? reportError : fetchAttrPersistFile ? performCachedXhr : performUncachedXhr);
} else if (!fetchAttrNoDownload) {
fetchXHR(fetch, fetchAttrPersistFile ? cacheResultAndReportSuccess : reportSuccess, reportError, reportProgress, reportReadyStateChange);
} else {
return 0;
}
return fetch;
}
var ENV = {};
function getExecutableName() {
return thisProgram || "./this.program";
}
function getEnvStrings() {
if (!getEnvStrings.strings) {
var lang = (typeof navigator === "object" && navigator.languages && navigator.languages[0] || "C").replace("-", "_") + ".UTF-8";
var env = {
"USER": "web_user",
"LOGNAME": "web_user",
"PATH": "/",
"PWD": "/",
"HOME": "/home/web_user",
"LANG": lang,
"_": getExecutableName()
};
for (var x in ENV) {
if (ENV[x] === undefined) delete env[x]; else env[x] = ENV[x];
}
var strings = [];
for (var x in env) {
strings.push(x + "=" + env[x]);
}
getEnvStrings.strings = strings;
}
return getEnvStrings.strings;
}
function _environ_get(__environ, environ_buf) {
var bufSize = 0;
getEnvStrings().forEach(function(string, i) {
var ptr = environ_buf + bufSize;
HEAP32[__environ + i * 4 >> 2] = ptr;
writeAsciiToMemory(string, ptr);
bufSize += string.length + 1;
});
return 0;
}
function _environ_sizes_get(penviron_count, penviron_buf_size) {
var strings = getEnvStrings();
HEAP32[penviron_count >> 2] = strings.length;
var bufSize = 0;
strings.forEach(function(string) {
bufSize += string.length + 1;
});
HEAP32[penviron_buf_size >> 2] = bufSize;
return 0;
}
function _exit(status) {
exit(status);
}
function _fd_close(fd) {
return 0;
}
function _fd_read(fd, iov, iovcnt, pnum) {
var stream = SYSCALLS.getStreamFromFD(fd);
var num = SYSCALLS.doReadv(stream, iov, iovcnt);
HEAP32[pnum >> 2] = num;
return 0;
}
function _fd_seek(fd, offset_low, offset_high, whence, newOffset) {}
function _fd_write(fd, iov, iovcnt, pnum) {
var num = 0;
for (var i = 0; i < iovcnt; i++) {
var ptr = HEAP32[iov + i * 8 >> 2];
var len = HEAP32[iov + (i * 8 + 4) >> 2];
for (var j = 0; j < len; j++) {
SYSCALLS.printChar(fd, HEAPU8[ptr + j]);
}
num += len;
}
HEAP32[pnum >> 2] = num;
return 0;
}
function __isLeapYear(year) {
return year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0);
}
function __arraySum(array, index) {
var sum = 0;
for (var i = 0; i <= index; sum += array[i++]) {}
return sum;
}
var __MONTH_DAYS_LEAP = [ 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ];
var __MONTH_DAYS_REGULAR = [ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ];
function __addDays(date, days) {
var newDate = new Date(date.getTime());
while (days > 0) {
var leap = __isLeapYear(newDate.getFullYear());
var currentMonth = newDate.getMonth();
var daysInCurrentMonth = (leap ? __MONTH_DAYS_LEAP : __MONTH_DAYS_REGULAR)[currentMonth];
if (days > daysInCurrentMonth - newDate.getDate()) {
days -= daysInCurrentMonth - newDate.getDate() + 1;
newDate.setDate(1);
if (currentMonth < 11) {
newDate.setMonth(currentMonth + 1);
} else {
newDate.setMonth(0);
newDate.setFullYear(newDate.getFullYear() + 1);
}
} else {
newDate.setDate(newDate.getDate() + days);
return newDate;
}
}
return newDate;
}
function _strftime(s, maxsize, format, tm) {
var tm_zone = HEAP32[tm + 40 >> 2];
var date = {
tm_sec: HEAP32[tm >> 2],
tm_min: HEAP32[tm + 4 >> 2],
tm_hour: HEAP32[tm + 8 >> 2],
tm_mday: HEAP32[tm + 12 >> 2],
tm_mon: HEAP32[tm + 16 >> 2],
tm_year: HEAP32[tm + 20 >> 2],
tm_wday: HEAP32[tm + 24 >> 2],
tm_yday: HEAP32[tm + 28 >> 2],
tm_isdst: HEAP32[tm + 32 >> 2],
tm_gmtoff: HEAP32[tm + 36 >> 2],
tm_zone: tm_zone ? UTF8ToString(tm_zone) : ""
};
var pattern = UTF8ToString(format);
var EXPANSION_RULES_1 = {
"%c": "%a %b %d %H:%M:%S %Y",
"%D": "%m/%d/%y",
"%F": "%Y-%m-%d",
"%h": "%b",
"%r": "%I:%M:%S %p",
"%R": "%H:%M",
"%T": "%H:%M:%S",
"%x": "%m/%d/%y",
"%X": "%H:%M:%S",
"%Ec": "%c",
"%EC": "%C",
"%Ex": "%m/%d/%y",
"%EX": "%H:%M:%S",
"%Ey": "%y",
"%EY": "%Y",
"%Od": "%d",
"%Oe": "%e",
"%OH": "%H",
"%OI": "%I",
"%Om": "%m",
"%OM": "%M",
"%OS": "%S",
"%Ou": "%u",
"%OU": "%U",
"%OV": "%V",
"%Ow": "%w",
"%OW": "%W",
"%Oy": "%y"
};
for (var rule in EXPANSION_RULES_1) {
pattern = pattern.replace(new RegExp(rule, "g"), EXPANSION_RULES_1[rule]);
}
var WEEKDAYS = [ "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" ];
var MONTHS = [ "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" ];
function leadingSomething(value, digits, character) {
var str = typeof value === "number" ? value.toString() : value || "";
while (str.length < digits) {
str = character[0] + str;
}
return str;
}
function leadingNulls(value, digits) {
return leadingSomething(value, digits, "0");
}
function compareByDay(date1, date2) {
function sgn(value) {
return value < 0 ? -1 : value > 0 ? 1 : 0;
}
var compare;
if ((compare = sgn(date1.getFullYear() - date2.getFullYear())) === 0) {
if ((compare = sgn(date1.getMonth() - date2.getMonth())) === 0) {
compare = sgn(date1.getDate() - date2.getDate());
}
}
return compare;
}
function getFirstWeekStartDate(janFourth) {
switch (janFourth.getDay()) {
case 0:
return new Date(janFourth.getFullYear() - 1, 11, 29);
case 1:
return janFourth;
case 2:
return new Date(janFourth.getFullYear(), 0, 3);
case 3:
return new Date(janFourth.getFullYear(), 0, 2);
case 4:
return new Date(janFourth.getFullYear(), 0, 1);
case 5:
return new Date(janFourth.getFullYear() - 1, 11, 31);
case 6:
return new Date(janFourth.getFullYear() - 1, 11, 30);
}
}
function getWeekBasedYear(date) {
var thisDate = __addDays(new Date(date.tm_year + 1900, 0, 1), date.tm_yday);
var janFourthThisYear = new Date(thisDate.getFullYear(), 0, 4);
var janFourthNextYear = new Date(thisDate.getFullYear() + 1, 0, 4);
var firstWeekStartThisYear = getFirstWeekStartDate(janFourthThisYear);
var firstWeekStartNextYear = getFirstWeekStartDate(janFourthNextYear);
if (compareByDay(firstWeekStartThisYear, thisDate) <= 0) {
if (compareByDay(firstWeekStartNextYear, thisDate) <= 0) {
return thisDate.getFullYear() + 1;
} else {
return thisDate.getFullYear();
}
} else {
return thisDate.getFullYear() - 1;
}
}
var EXPANSION_RULES_2 = {
"%a": function(date) {
return WEEKDAYS[date.tm_wday].substring(0, 3);
},
"%A": function(date) {
return WEEKDAYS[date.tm_wday];
},
"%b": function(date) {
return MONTHS[date.tm_mon].substring(0, 3);
},
"%B": function(date) {
return MONTHS[date.tm_mon];
},
"%C": function(date) {
var year = date.tm_year + 1900;
return leadingNulls(year / 100 | 0, 2);
},
"%d": function(date) {
return leadingNulls(date.tm_mday, 2);
},
"%e": function(date) {
return leadingSomething(date.tm_mday, 2, " ");
},
"%g": function(date) {
return getWeekBasedYear(date).toString().substring(2);
},
"%G": function(date) {
return getWeekBasedYear(date);
},
"%H": function(date) {
return leadingNulls(date.tm_hour, 2);
},
"%I": function(date) {
var twelveHour = date.tm_hour;
if (twelveHour == 0) twelveHour = 12; else if (twelveHour > 12) twelveHour -= 12;
return leadingNulls(twelveHour, 2);
},
"%j": function(date) {
return leadingNulls(date.tm_mday + __arraySum(__isLeapYear(date.tm_year + 1900) ? __MONTH_DAYS_LEAP : __MONTH_DAYS_REGULAR, date.tm_mon - 1), 3);
},
"%m": function(date) {
return leadingNulls(date.tm_mon + 1, 2);
},
"%M": function(date) {
return leadingNulls(date.tm_min, 2);
},
"%n": function() {
return "\n";
},
"%p": function(date) {
if (date.tm_hour >= 0 && date.tm_hour < 12) {
return "AM";
} else {
return "PM";
}
},
"%S": function(date) {
return leadingNulls(date.tm_sec, 2);
},
"%t": function() {
return "\t";
},
"%u": function(date) {
return date.tm_wday || 7;
},
"%U": function(date) {
var janFirst = new Date(date.tm_year + 1900, 0, 1);
var firstSunday = janFirst.getDay() === 0 ? janFirst : __addDays(janFirst, 7 - janFirst.getDay());
var endDate = new Date(date.tm_year + 1900, date.tm_mon, date.tm_mday);
if (compareByDay(firstSunday, endDate) < 0) {
var februaryFirstUntilEndMonth = __arraySum(__isLeapYear(endDate.getFullYear()) ? __MONTH_DAYS_LEAP : __MONTH_DAYS_REGULAR, endDate.getMonth() - 1) - 31;
var firstSundayUntilEndJanuary = 31 - firstSunday.getDate();
var days = firstSundayUntilEndJanuary + februaryFirstUntilEndMonth + endDate.getDate();
return leadingNulls(Math.ceil(days / 7), 2);
}
return compareByDay(firstSunday, janFirst) === 0 ? "01" : "00";
},
"%V": function(date) {
var janFourthThisYear = new Date(date.tm_year + 1900, 0, 4);
var janFourthNextYear = new Date(date.tm_year + 1901, 0, 4);
var firstWeekStartThisYear = getFirstWeekStartDate(janFourthThisYear);
var firstWeekStartNextYear = getFirstWeekStartDate(janFourthNextYear);
var endDate = __addDays(new Date(date.tm_year + 1900, 0, 1), date.tm_yday);
if (compareByDay(endDate, firstWeekStartThisYear) < 0) {
return "53";
}
if (compareByDay(firstWeekStartNextYear, endDate) <= 0) {
return "01";
}
var daysDifference;
if (firstWeekStartThisYear.getFullYear() < date.tm_year + 1900) {
daysDifference = date.tm_yday + 32 - firstWeekStartThisYear.getDate();
} else {
daysDifference = date.tm_yday + 1 - firstWeekStartThisYear.getDate();
}
return leadingNulls(Math.ceil(daysDifference / 7), 2);
},
"%w": function(date) {
return date.tm_wday;
},
"%W": function(date) {
var janFirst = new Date(date.tm_year, 0, 1);
var firstMonday = janFirst.getDay() === 1 ? janFirst : __addDays(janFirst, janFirst.getDay() === 0 ? 1 : 7 - janFirst.getDay() + 1);
var endDate = new Date(date.tm_year + 1900, date.tm_mon, date.tm_mday);
if (compareByDay(firstMonday, endDate) < 0) {
var februaryFirstUntilEndMonth = __arraySum(__isLeapYear(endDate.getFullYear()) ? __MONTH_DAYS_LEAP : __MONTH_DAYS_REGULAR, endDate.getMonth() - 1) - 31;
var firstMondayUntilEndJanuary = 31 - firstMonday.getDate();
var days = firstMondayUntilEndJanuary + februaryFirstUntilEndMonth + endDate.getDate();
return leadingNulls(Math.ceil(days / 7), 2);
}
return compareByDay(firstMonday, janFirst) === 0 ? "01" : "00";
},
"%y": function(date) {
return (date.tm_year + 1900).toString().substring(2);
},
"%Y": function(date) {
return date.tm_year + 1900;
},
"%z": function(date) {
var off = date.tm_gmtoff;
var ahead = off >= 0;
off = Math.abs(off) / 60;
off = off / 60 * 100 + off % 60;
return (ahead ? "+" : "-") + String("0000" + off).slice(-4);
},
"%Z": function(date) {
return date.tm_zone;
},
"%%": function() {
return "%";
}
};
for (var rule in EXPANSION_RULES_2) {
if (pattern.includes(rule)) {
pattern = pattern.replace(new RegExp(rule, "g"), EXPANSION_RULES_2[rule](date));
}
}
var bytes = intArrayFromString(pattern, false);
if (bytes.length > maxsize) {
return 0;
}
writeArrayToMemory(bytes, s);
return bytes.length - 1;
}
function _strftime_l(s, maxsize, format, tm) {
return _strftime(s, maxsize, format, tm);
}
function runAndAbortIfError(func) {
try {
return func();
} catch (e) {
abort(e);
}
}
var Asyncify = {
State: {
Normal: 0,
Unwinding: 1,
Rewinding: 2,
Disabled: 3
},
state: 0,
StackSize: 4096,
currData: null,
handleSleepReturnValue: 0,
exportCallStack: [],
callStackNameToId: {},
callStackIdToName: {},
callStackId: 0,
afterUnwind: null,
asyncFinalizers: [],
sleepCallbacks: [],
getCallStackId: function(funcName) {
var id = Asyncify.callStackNameToId[funcName];
if (id === undefined) {
id = Asyncify.callStackId++;
Asyncify.callStackNameToId[funcName] = id;
Asyncify.callStackIdToName[id] = funcName;
}
return id;
},
instrumentWasmExports: function(exports) {
var ret = {};
for (var x in exports) {
(function(x) {
var original = exports[x];
if (typeof original === "function") {
ret[x] = function() {
Asyncify.exportCallStack.push(x);
try {
return original.apply(null, arguments);
}catch(e){if(e.message.indexOf("unreachable")===-1)throw e}finally {
if (!ABORT) {
var y = Asyncify.exportCallStack.pop();
assert(y === x);
Asyncify.maybeStopUnwind();
}
}
};
} else {
ret[x] = original;
}
})(x);
}
return ret;
},
maybeStopUnwind: function() {
if (Asyncify.currData && Asyncify.state === Asyncify.State.Unwinding && Asyncify.exportCallStack.length === 0) {
Asyncify.state = Asyncify.State.Normal;
runAndAbortIfError(Module["_asyncify_stop_unwind"]);
if (typeof Fibers !== "undefined") {
Fibers.trampoline();
}
if (Asyncify.afterUnwind) {
Asyncify.afterUnwind();
Asyncify.afterUnwind = null;
}
}
},
whenDone: function() {
return new Promise(function(resolve) {
Asyncify.asyncFinalizers.push(resolve);
});
},
allocateData: function() {
var ptr = _malloc(12 + Asyncify.StackSize);
Asyncify.setDataHeader(ptr, ptr + 12, Asyncify.StackSize);
Asyncify.setDataRewindFunc(ptr);
return ptr;
},
setDataHeader: function(ptr, stack, stackSize) {
HEAP32[ptr >> 2] = stack;
HEAP32[ptr + 4 >> 2] = stack + stackSize;
},
setDataRewindFunc: function(ptr) {
var bottomOfCallStack = Asyncify.exportCallStack[0];
var rewindId = Asyncify.getCallStackId(bottomOfCallStack);
HEAP32[ptr + 8 >> 2] = rewindId;
},
getDataRewindFunc: function(ptr) {
var id = HEAP32[ptr + 8 >> 2];
var name = Asyncify.callStackIdToName[id];
var func = Module["asm"][name];
return func;
},
doRewind: function(ptr) {
var start = Asyncify.getDataRewindFunc(ptr);
return start();
},
handleSleep: function(startAsync) {
if (ABORT) return;
if (Asyncify.state === Asyncify.State.Normal) {
var reachedCallback = false;
var reachedAfterCallback = false;
startAsync(function(handleSleepReturnValue) {
if (ABORT) return;
Asyncify.handleSleepReturnValue = handleSleepReturnValue || 0;
reachedCallback = true;
if (!reachedAfterCallback) {
return;
}
Asyncify.state = Asyncify.State.Rewinding;
runAndAbortIfError(function() {
Module["_asyncify_start_rewind"](Asyncify.currData);
});
if (typeof Browser !== "undefined" && Browser.mainLoop.func) {
Browser.mainLoop.resume();
}
var asyncWasmReturnValue = Asyncify.doRewind(Asyncify.currData);
if (!Asyncify.currData) {
var asyncFinalizers = Asyncify.asyncFinalizers;
Asyncify.asyncFinalizers = [];
asyncFinalizers.forEach(function(func) {
func(asyncWasmReturnValue);
});
}
});
reachedAfterCallback = true;
if (!reachedCallback) {
Asyncify.state = Asyncify.State.Unwinding;
Asyncify.currData = Asyncify.allocateData();
runAndAbortIfError(function() {
Module["_asyncify_start_unwind"](Asyncify.currData);
});
if (typeof Browser !== "undefined" && Browser.mainLoop.func) {
Browser.mainLoop.pause();
}
}
} else if (Asyncify.state === Asyncify.State.Rewinding) {
Asyncify.state = Asyncify.State.Normal;
runAndAbortIfError(Module["_asyncify_stop_rewind"]);
_free(Asyncify.currData);
Asyncify.currData = null;
Asyncify.sleepCallbacks.forEach(function(func) {
callUserCallback(func);
});
} else {
abort("invalid state: " + Asyncify.state);
}
return Asyncify.handleSleepReturnValue;
},
handleAsync: function(startAsync) {
return Asyncify.handleSleep(function(wakeUp) {
startAsync().then(wakeUp);
});
}
};
Fetch.staticInit();
function intArrayFromString(stringy, dontAddNull, length) {
var len = length > 0 ? length : lengthBytesUTF8(stringy) + 1;
var u8array = new Array(len);
var numBytesWritten = stringToUTF8Array(stringy, u8array, 0, u8array.length);
if (dontAddNull) u8array.length = numBytesWritten;
return u8array;
}
var asmLibraryArg = {
"g": ___sys_fcntl64,
"s": ___sys_ioctl,
"t": ___sys_open,
"i": __emscripten_fetch_free,
"a": _abort,
"p": _clock_gettime,
"k": _emscripten_is_main_browser_thread,
"o": _emscripten_memcpy_big,
"d": _emscripten_resize_heap,
"b": _emscripten_sleep,
"j": _emscripten_start_fetch,
"l": emscripten_utils_getline_impl,
"v": _environ_get,
"h": _environ_sizes_get,
"c": _exit,
"f": _fd_close,
"r": _fd_read,
"n": _fd_seek,
"q": _fd_write,
"m": pauseQueue,
"u": _strftime_l,
"e": unpauseQueue
};
var asm = createWasm();
var ___wasm_call_ctors = Module["___wasm_call_ctors"] = function() {
return (___wasm_call_ctors = Module["___wasm_call_ctors"] = Module["asm"]["x"]).apply(null, arguments);
};
var _main = Module["_main"] = function() {
return (_main = Module["_main"] = Module["asm"]["y"]).apply(null, arguments);
};
var _free = Module["_free"] = function() {
return (_free = Module["_free"] = Module["asm"]["z"]).apply(null, arguments);
};
var _stop = Module["_stop"] = function() {
return (_stop = Module["_stop"] = Module["asm"]["A"]).apply(null, arguments);
};
var _ponderhit = Module["_ponderhit"] = function() {
return (_ponderhit = Module["_ponderhit"] = Module["asm"]["B"]).apply(null, arguments);
};
var _malloc = Module["_malloc"] = function() {
return (_malloc = Module["_malloc"] = Module["asm"]["C"]).apply(null, arguments);
};
var ___errno_location = Module["___errno_location"] = function() {
return (___errno_location = Module["___errno_location"] = Module["asm"]["D"]).apply(null, arguments);
};
var stackAlloc = Module["stackAlloc"] = function() {
return (stackAlloc = Module["stackAlloc"] = Module["asm"]["E"]).apply(null, arguments);
};
var dynCall_vi = Module["dynCall_vi"] = function() {
return (dynCall_vi = Module["dynCall_vi"] = Module["asm"]["G"]).apply(null, arguments);
};
var dynCall_v = Module["dynCall_v"] = function() {
return (dynCall_v = Module["dynCall_v"] = Module["asm"]["H"]).apply(null, arguments);
};
var _asyncify_start_unwind = Module["_asyncify_start_unwind"] = function() {
return (_asyncify_start_unwind = Module["_asyncify_start_unwind"] = Module["asm"]["I"]).apply(null, arguments);
};
var _asyncify_stop_unwind = Module["_asyncify_stop_unwind"] = function() {
return (_asyncify_stop_unwind = Module["_asyncify_stop_unwind"] = Module["asm"]["J"]).apply(null, arguments);
};
var _asyncify_start_rewind = Module["_asyncify_start_rewind"] = function() {
return (_asyncify_start_rewind = Module["_asyncify_start_rewind"] = Module["asm"]["K"]).apply(null, arguments);
};
var _asyncify_stop_rewind = Module["_asyncify_stop_rewind"] = function() {
return (_asyncify_stop_rewind = Module["_asyncify_stop_rewind"] = Module["asm"]["L"]).apply(null, arguments);
};
var calledRun;
function ExitStatus(status) {
this.name = "ExitStatus";
this.message = "Program terminated with exit(" + status + ")";
this.status = status;
}
var calledMain = false;
dependenciesFulfilled = function runCaller() {
if (!calledRun) run();
if (!calledRun) dependenciesFulfilled = runCaller;
};
function callMain(args) {
var entryFunction = Module["_main"];
args = args || [];
var argc = args.length + 1;
var argv = stackAlloc((argc + 1) * 4);
HEAP32[argv >> 2] = allocateUTF8OnStack(thisProgram);
for (var i = 1; i < argc; i++) {
HEAP32[(argv >> 2) + i] = allocateUTF8OnStack(args[i - 1]);
}
HEAP32[(argv >> 2) + argc] = 0;
try {
var ret = entryFunction(argc, argv);
exit(ret, true);
} catch (e) {
if (e instanceof ExitStatus || e == "unwind") {
return;
}
var toLog = e;
if (e && typeof e === "object" && e.stack) {
toLog = [ e, e.stack ];
}
err("exception thrown: " + toLog);
quit_(1, e);
} finally {
calledMain = true;
}
}
function run(args) {
args = args || arguments_;
if (runDependencies > 0) {
return;
}
preRun();
if (runDependencies > 0) {
return;
}
function doRun() {
if (calledRun) return;
calledRun = true;
Module["calledRun"] = true;
if (ABORT) return;
initRuntime();
preMain();
readyPromiseResolve(Module);
if (Module["onRuntimeInitialized"]) Module["onRuntimeInitialized"]();
if (shouldRunNow) callMain(args);
postRun();
}
if (Module["setStatus"]) {
Module["setStatus"]("Running...");
setTimeout(function() {
setTimeout(function() {
Module["setStatus"]("");
}, 1);
doRun();
}, 1);
} else {
doRun();
}
}
Module["run"] = run;
function exit(status, implicit) {
EXITSTATUS = status;
if (keepRuntimeAlive()) {} else {
exitRuntime();
}
procExit(status);
}
function procExit(code) {
EXITSTATUS = code;
if (!keepRuntimeAlive()) {
if (Module["onExit"]) Module["onExit"](code);
ABORT = true;
}
quit_(code, new ExitStatus(code));
}
if (Module["preInit"]) {
if (typeof Module["preInit"] == "function") Module["preInit"] = [ Module["preInit"] ];
while (Module["preInit"].length > 0) {
Module["preInit"].pop()();
}
}
var shouldRunNow = true;
if (Module["noInitialRun"]) shouldRunNow = false;
run();
Module["onSpecialMessage"] = Module["postCustomMessage"];
return Stockfish.ready
}
);
})();
if (typeof exports === 'object' && typeof module === 'object') {
module.exports = Stockfish;
} else if (typeof define === 'function' && define['amd']) {
define([], function() { return Stockfish; });
} else if (typeof exports === 'object') {
exports["Stockfish"] = Stockfish;
}
return Stockfish;
}
if (typeof self !== "undefined" && self.location.hash.split(",")[1] === "worker" || typeof global !== "undefined" && Object.prototype.toString.call(global.process) === "[object process]" && !require("worker_threads").isMainThread) {
(function() {
/// Insert worker here
})();
/// Is it a web worker?
} else if (typeof onmessage !== "undefined" && (typeof window === "undefined" || typeof window.document === "undefined") || typeof global !== "undefined" && Object.prototype.toString.call(global.process) === "[object process]") {
(function ()
{
var isNode = typeof global !== "undefined" && Object.prototype.toString.call(global.process) === "[object process]";
var mod;
var myEngine;
var queue = [];
var args;
var wasmPath;
function completer(line)
{
var completions = [
"compiler",
"d",
"eval",
"exit",
"flip",
"go ",
"isready ",
"ponderhit ",
"position fen ",
"position startpos",
"position startpos moves",
"quit",
"setoption name Clear Hash value true",
"setoption name Contempt value ",
"setoption name Hash value ",
"setoption name Minimum Thinking Time value ",
"setoption name Move Overhead value ",
"setoption name MultiPV value ",
"setoption name Ponder value ",
//"setoption name Skill Level Maximum Error value ",
//"setoption name Skill Level Probability value ",
"setoption name Skill Level value ",
"setoption name Slow Mover value ",
"setoption name Threads value ",
"setoption name UCI_Chess960 value false",
"setoption name UCI_Chess960 value true",
"setoption name UCI_AnalyseMode value true",
"setoption name UCI_AnalyseMode value false",
"setoption name UCI_LimitStrength value true",
"setoption name UCI_LimitStrength value false",
"setoption name UCI_Elo value ",
"setoption name UCI_ShowWDL value true",
"setoption name UCI_ShowWDL value false",
"setoption name Use NNUE value true",
"setoption name Use NNUE value false",
"setoption name nodestime value ",
"setoption name EvalFile value ",
"stop",
"uci",
"ucinewgame"
];
var completionsMid = [
"binc ",
"btime ",
"confidence ",
"depth ",
"infinite ",
"mate ",
"maxdepth ",
"maxtime ",
"mindepth ",
"mintime ",
"moves ", /// for position fen ... moves
"movestogo ",
"movetime ",
"ponder ",
"searchmoves ",
"shallow ",
"winc ",
"wtime "
];
function filter(c)
{
return c.indexOf(line) === 0;
}
/// This looks for completions starting at the very beginning of the line.
/// If the user has typed nothing, it will match everything.
var hits = completions.filter(filter);
if (!hits.length) {
/// Just get the last word.
line = line.replace(/^.*\s/, "");
if (line) {
/// Find completion mid line too.
hits = completionsMid.filter(filter);
} else {
/// If no word has been typed, show all options.
hits = completionsMid;
}
}
return [hits, line];
}
if (isNode) {
///NOTE: Node.js v14+ needs --experimental-wasm-threads --experimental-wasm-simd
/// Was it called directly?
if (require.main === module) {
wasmPath = require("path").join(__dirname, "stockfish-nnue-16-single.wasm");
mod = {
locateFile: function (path)
{
if (path.indexOf(".wasm") > -1) {
/// Set the path to the wasm binary.
return wasmPath;
} else {
/// Set path to worker (self + the worker hash)
return __filename;
}
},
};
Stockfish = INIT_ENGINE();
Stockfish(mod).then(function (sf)
{
myEngine = sf;
sf.addMessageListener(function (line)
{
console.log(line);
});
if (queue.length) {
queue.forEach(function (line)
{
sf.postMessage(line, true);
});
}
queue = null;
});
require("readline").createInterface({
input: process.stdin,
output: process.stdout,
completer: completer,
historySize: 100,
}).on("line", function online(line)
{
if (line) {
if (line === "quit" || line === "exit") {
process.exit();
}
if (myEngine) {
myEngine.postMessage(line, true);
} else {
queue.push(line);
}
}
}).on("close", function onend()
{
process.exit();
}).setPrompt("");
/// Is this a node module?
} else {
module.exports = INIT_ENGINE;
}
} else {
var postMessageToEngine = function (data)
{
if (myEngine.__IS_NON_NESTED__ || myEngine.__IS_SINGLE_THREADED__) {
myEngine.onCustomMessage(data);
} else {
myEngine.postMessage(data, true);
}
};
args = self.location.hash.substr(1).split(",");
wasmPath = decodeURIComponent(args[0] || "stockfish.wasm");
mod = {
locateFile: function (path)
{
if (path.indexOf(".wasm") > -1) {
/// Set the path to the wasm binary.
return wasmPath;
} else {
/// Set path to worker (self + the worker hash)
return self.location.origin + self.location.pathname + "#" + wasmPath + ",worker";
}
}
};
Stockfish = INIT_ENGINE();
Stockfish(mod).then(function onCreate(sf)
{
myEngine = sf;
sf.addMessageListener(function onMessage(line)
{
postMessage(line);
});
if (queue.length) {
queue.forEach(function (line)
{
postMessageToEngine(line);
});
}
queue = null;
}).catch(function (e)
{
/// Sadly, Web Workers will not trigger the error event when errors occur in promises, so we need to create a new context and throw an error there.
setTimeout(function throwError()
{
throw e;
}, 1);
});
/// Make sure that this is only added once.
if (!onmessage) {
onmessage = function (event)
{
if (myEngine) {
postMessageToEngine(event.data);
} else {
queue.push(event.data);
}
};
}
}
}());
} else {
///NOTE: If it's a normal browser, the client can use the engine without polluting the global scope.
if (typeof document === "object" && document.currentScript) {
document.currentScript._exports = window.Stockfish = INIT_ENGINE();
} else {
Stockfish = INIT_ENGINE();
}
}
(function (global, undefined) {
"use strict";
if (global.setImmediate) {
quickTimeout = setImmediate;
return;
}
var nextHandle = 1; // Spec says greater than zero
var tasksByHandle = {};
var currentlyRunningATask = false;
var doc = global.document;
var registerImmediate;
function setImmediate(callback) {
// Callback can either be a function or a string
if (typeof callback !== "function") {
callback = new Function("" + callback);
}
// Copy function arguments
var args = new Array(arguments.length - 1);
for (var i = 0; i < args.length; i++) {
args[i] = arguments[i + 1];
}
// Store and register the task
var task = { callback: callback, args: args };
tasksByHandle[nextHandle] = task;
registerImmediate(nextHandle);
return nextHandle++;
}
function clearImmediate(handle) {
delete tasksByHandle[handle];
}
function run(task) {
var callback = task.callback;
var args = task.args;
switch (args.length) {
case 0:
callback();
break;
case 1:
callback(args[0]);
break;
case 2:
callback(args[0], args[1]);
break;
case 3:
callback(args[0], args[1], args[2]);
break;
default:
callback.apply(undefined, args);
break;
}
}
function runIfPresent(handle) {
// From the spec: "Wait until any invocations of this algorithm started before this one have completed."
// So if we're currently running a task, we'll need to delay this invocation.
if (currentlyRunningATask) {
// Delay by doing a setTimeout. setImmediate was tried instead, but in Firefox 7 it generated a
// "too much recursion" error.
setTimeout(runIfPresent, 0, handle);
} else {
var task = tasksByHandle[handle];
if (task) {
currentlyRunningATask = true;
try {
run(task);
} finally {
clearImmediate(handle);
currentlyRunningATask = false;
}
}
}
}
function installNextTickImplementation() {
registerImmediate = function(handle) {
process.nextTick(function () { runIfPresent(handle); });
};
}
function canUsePostMessage() {
// The test against `importScripts` prevents this implementation from being installed inside a web worker,
// where `global.postMessage` means something completely different and can't be used for this purpose.
if (global.postMessage && !global.importScripts) {
var postMessageIsAsynchronous = true;
var oldOnMessage = global.onmessage;
global.onmessage = function() {
postMessageIsAsynchronous = false;
};
global.postMessage("", "*");
global.onmessage = oldOnMessage;
return postMessageIsAsynchronous;
}
}
function installPostMessageImplementation() {
// Installs an event handler on `global` for the `message` event: see
// * https://developer.mozilla.org/en/DOM/window.postMessage
// * http://www.whatwg.org/specs/web-apps/current-work/multipage/comms.html#crossDocumentMessages
var messagePrefix = "setImmediate$" + Math.random() + "$";
var onGlobalMessage = function(event) {
if (event.source === global &&
typeof event.data === "string" &&
event.data.indexOf(messagePrefix) === 0) {
runIfPresent(+event.data.slice(messagePrefix.length));
}
};
if (global.addEventListener) {
global.addEventListener("message", onGlobalMessage, false);
} else {
global.attachEvent("onmessage", onGlobalMessage);
}
registerImmediate = function(handle) {
global.postMessage(messagePrefix + handle, "*");
};
}
function installMessageChannelImplementation() {
var channel = new MessageChannel();
channel.port1.onmessage = function(event) {
var handle = event.data;
runIfPresent(handle);
};
registerImmediate = function(handle) {
channel.port2.postMessage(handle);
};
}
function installReadyStateChangeImplementation() {
var html = doc.documentElement;
registerImmediate = function(handle) {
// Create a <script> element; its readystatechange event will be fired asynchronously once it is inserted
// into the document. Do so, thus queuing up the task. Remember to clean up once it's been called.
var script = doc.createElement("script");
script.onreadystatechange = function () {
runIfPresent(handle);
script.onreadystatechange = null;
html.removeChild(script);
script = null;
};
html.appendChild(script);
};
}
function installSetTimeoutImplementation() {
registerImmediate = function(handle) {
setTimeout(runIfPresent, 0, handle);
};
}
// If supported, we should attach to the prototype of global, since that is where setTimeout et al. live.
//var attachTo = Object.getPrototypeOf && Object.getPrototypeOf(global);
//attachTo = attachTo && attachTo.setTimeout ? attachTo : global;
// Don't get fooled by e.g. browserify environments.
if ({}.toString.call(global.process) === "[object process]") {
// For Node.js before 0.9
installNextTickImplementation();
} else if (canUsePostMessage()) {
// For non-IE10 modern browsers
installPostMessageImplementation();
} else if (global.MessageChannel) {
// For web workers, where supported
installMessageChannelImplementation();
} else if (doc && "onreadystatechange" in doc.createElement("script")) {
// For IE 6–8
installReadyStateChangeImplementation();
} else {
// For older browsers
installSetTimeoutImplementation();
}
//attachTo.setImmediate = setImmediate;
//attachTo.clearImmediate = clearImmediate;
quickTimeout = setImmediate;
}(typeof self === "undefined" ? typeof global === "undefined" ? this : global : self));
}());
<!doctype html>
<html>
<head>
<script src="stockfish.js"></script>
<script src="chess.min.js"></script>
</head>
<body>
<script>
// Stockfish Evaluation
const CP_REGEX = /\bscore cp (-?\d+)\b/;
const MATE_REGEX = /\bscore mate (-?\d+)\b/;
const DEPTH_REGEX = /\bdepth (\d+)\b/;
const PV_REGEX = /\bpv (\w+)\b/;
class PositionEvaluator {
constructor() {
this.queue = [];
this.task = null;
this.waiting = 0;
}
async initStockfish() {
this.stockfish = await new Stockfish();
this.stockfish.onmessage = (event) => this.handleEvent(event);
}
handleEvent(event) {
var str = event.data ? event.data : event;
if (this.waiting > 0) {
if (str == "readyok") this.waiting--;
return;
}
if (this.task === null) {
this.next();
return;
}
const extractInt = (regex, defaultVal) => {
var m = str.match(regex);
return m ? parseInt(m[1]) : defaultVal;
};
var depth = extractInt(DEPTH_REGEX, -1);
var done = str.includes("bestmove");
if (done || depth > this.task.curDepth) {
//console.log(`reached depth ${depth}`)
this.task.onEval(this.task.curResult);
this.task.curResult = {};
this.task.curDepth = depth;
}
if (done) {
this.next();
return;
}
var cp = extractInt(CP_REGEX, null);
var mate = extractInt(MATE_REGEX, null);
var pv = str.match(PV_REGEX);
var move = pv ? pv[1] : "";
var score =
cp !== null
? { type: "cp", score: cp }
: mate !== null
? { type: "mate", score: mate }
: null;
if (!score) return;
score.depth = depth;
this.task.curResult[move] = score;
}
abort() {
this.stockfish.postMessage("stop");
this.stockfish.postMessage("quit");
this.stockfish.onmessage = (event) => null;
this.stockfish = STOCKFISH(STOCKFISH_WASM_URL);
this.queue = [];
this.task = null;
this.waiting = 0;
this.stockfish.onmessage = (event) => this.handleEvent(event);
}
next() {
console.log("-------------------------");
if (this.queue.length > 0) {
this.task = this.queue.shift();
} else {
this.task = null;
}
if (this.task !== null) {
if (this.task.cancelled) {
this.task = null;
this.next();
} else {
this.task.curDepth = 1;
this.task.curResult = {};
this.waiting++;
this.stockfish.postMessage(`ucinewgame`);
this.stockfish.postMessage(`isready`);
this.stockfish.postMessage(
`setoption name MultiPV value ${this.task.multiPV}`
);
this.stockfish.postMessage(
`position fen ${this.task.position.fen()}`
);
this.stockfish.postMessage(`go depth ${this.task.depth}`);
}
}
}
evaluate(task) {
this.queue.push(task);
if (this.task === null) this.next();
}
destroy() {
this.stockfish.onmessage = (event) => null;
this.stockfish = null;
}
}
(async () => {
var pe = new PositionEvaluator();
await pe.initStockfish();
var position = new Chess();
position.load(
"rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1"
);
function logEvaluations(evaluations) {
console.log(evaluations);
}
pe.evaluate({
position: position,
onEval: logEvaluations,
depth: 20,
multiPV: 10,
});
})();
</script>
</body>
</html>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment