Plugin Directory

Changeset 2076820


Ignore:
Timestamp:
04/29/2019 09:39:02 AM (7 years ago)
Author:
gtanyware
Message:

Version 2.2.3 - Detect portait and landscape

Location:
easycoder/trunk
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • easycoder/trunk/easycoder-min.js

    r2060989 r2076820  
    1616unrecognisedSymbol:function(c){a.addWarning("Unrecognised symbol '"+c+"'")},getWarnings:function(){return b.warnings},getIndex:function(){return b.index},next:function(a){b.index+=void 0===a?1:a},peek:function(){return b.tokens[b.index+1].token},getToken:function(){return b.index>=b.tokens.length?null:b.tokens[b.index]?b.tokens[b.index].token:null},nextToken:function(){a.next();return a.getToken()},tokenIs:function(a){return b.index>=b.tokens.length?!1:a===b.tokens[b.index].token},nextTokenIs:function(c){a.next();
    1717return a.tokenIs(c)},skip:function(c){if(b.index>=b.tokens.length)return null;a.next();a.tokenIs(c)&&a.next()},prev:function(){b.index--},getLino:function(){return b.index>=b.tokens.length?0:b.tokens[b.index].lino},getTarget:function(a){a=void 0===a?b.index:a;return b.tokens[a].token},getTargetPc:function(c){c=void 0===c?b.index:c;return b.symbols[a.getTarget(c)].pc},getCommandAt:function(a){return b.program[a]},isSymbol:function(c){c=void 0===c?!1:c;if(a.getTarget()in b.symbols)return!0;if(c)throw Error("Unknown symbol: '"+
    18 a.getTarget()+"'");return!1},nextIsSymbol:function(c){c=void 0===c?!1:c;a.next();return a.isSymbol(c)},getSymbol:function(){return b.symbols[a.getToken()]},getSymbolPc:function(){return a.getSymbol().pc},getSymbolRecord:function(){return b.program[a.getSymbolPc()]},getSymbols:function(){return b.symbols},getProgram:function(){return b.program},getPc:function(){return b.program.length},getValue:function(){return a.value.compile(a)},getNextValue:function(){a.next();return a.getValue()},getCondition:function(){return a.condition.compile(a)},
    19 constant:function(c,g){return a.value.constant(c,void 0===g?!1:g)},addCommand:function(a){b.program.push(e({pc:b.program.length},a))},addSymbol:function(a,g){b.symbols[a]={pc:g}},mark:function(){b.savedMark=b.index},rewind:function(){b.index=b.savedMark},rewindTo:function(a){b.index=a},completeHandler:function(){var c=a.getLino(),g=a.getPc();a.addCommand({domain:"core",keyword:"goto",lino:c,goto:0});a.compileOne();a.addCommand({domain:"core",keyword:"stop",lino:c,next:0});a.getCommandAt(g).goto=a.getPc();
    20 return!0},compileVariable:function(c,g,m,d){m=void 0===m?!1:m;d=void 0===d?null:d;a.next();var p=a.getLino(),l=a.getTokens()[a.getIndex()];if(b.symbols[l.token])throw Error("Duplicate variable name '"+l.token+"'");var n=a.getPc();a.next();a.addSymbol(l.token,n);c={domain:c,keyword:g,lino:p,isSymbol:!0,isValueHolder:m,name:l.token,elements:1,index:0,value:[{}],element:[],extra:d};"dom"===d&&(c.element=[]);a.addCommand(c);return c},compileToken:function(){var c=a.getToken();if(c){a.mark();for(var g=
    21 $jscomp.makeIterator(Object.keys(a.domain)),b=g.next();!b.done;b=g.next()){if((b=a.domain[b.value])&&(b=b.getHandler(c))&&b.compile(a))return;a.rewind()}console.log("No handler found");throw Error("I don't understand '"+c+"...'");}},compileOne:function(){var c=a.getToken();if(c){b.warnings=[];var g=b.program.length;if(c.endsWith(":")){c=c.substring(0,c.length-1);if(b.symbols[c])throw Error("Duplicate symbol: '"+c+"'");b.symbols[c]={pc:g};b.index++}else a.compileToken()}},compileFromHere:function(c){for(;b.index<
    22 b.tokens.length;){var g=b.tokens[b.index].token;if("else"===g)return b.program;a.compileOne();if(-1<c.indexOf(g))break}},compile:function(c){b.tokens=c;b.index=0;b.program=[];b.symbols={};b.warnings=[];a.compileFromHere([]);a.addCommand({domain:"core",keyword:"stop",lino:a.getLino(),next:0});return b.program}};h.exports=a},{}],4:[function(d,h,f){var e=Object.assign||function(b){for(var a=1;a<arguments.length;a++){var c=arguments[a],g;for(g in c)Object.prototype.hasOwnProperty.call(c,g)&&(b[g]=c[g])}return b};
    23 h.exports={compile:function(b){b.mark();for(var a=$jscomp.makeIterator(Object.keys(b.domain)),c=a.next();!c.done;c=a.next()){if(c=b.domain[c.value].condition.compile(b))return e({domain:name},c);b.rewind()}},test:function(b,a){return b.domain[a.domain].condition.test(b,a)}}},{}],5:[function(d,h,f){var e=this,b={Add:{compile:function(a){var c=a.getLino();a.next();var g=a.getValue();if(a.tokenIs("to"))if(a.next(),a.isSymbol()){var b=a.getSymbol();if(a.getCommandAt(b.pc).isValueHolder){if("giving"===
    24 a.peek()){b=a.getValue();a.next();var d=a.getToken();a.next();a.addCommand({domain:"core",keyword:"add",lino:c,value1:g,value2:b,target:d})}else b=a.getToken(),a.next(),a.addCommand({domain:"core",keyword:"add",lino:c,value1:g,target:b});return!0}a.warning("core "+e.name+": Expected value holder")}else{b=a.getValue();if(a.tokenIs("giving"))return a.next(),d=a.getToken(),a.next(),a.addCommand({domain:"core",keyword:"add",lino:c,value1:g,value2:b,target:d}),!0;a.warning("core "+e.name+': Expected "giving"')}return!1},
    25 run:function(a){var c=a[a.pc],g=c.value1,b=c.value2,d=a.getSymbolRecord(c.target);if(d.isValueHolder){var e=d.value[d.index];b?(a=a.getValue(b)+a.getValue(g),d.value[d.index]={type:"constant",numeric:!0,content:a}):(e.numeric||a.nonNumericValueError(c.lino),a=e.content+a.getValue(g),d.value[d.index]={type:"constant",numeric:!0,content:a})}else a.variableDoesNotHoldAValueError(c.lino,d.name);return c.pc+1}},Alias:{compile:function(a){var c=a.getLino();a.next();if(a.isSymbol()){var g=a.getToken();a.next();
    26 if(a.tokenIs("to")&&(a.next(),a.isSymbol())){var b=a.getToken();a.next();a.addCommand({domain:"core",keyword:"alias",lino:c,alias:g,symbol:b});return!0}}return!1},run:function(a){var c=a[a.pc],g=a.symbols[c.alias].pc,b=a[g],d=a.getSymbolRecord(c.symbol);a[g]={pc:b.pc,domain:d.domain,keyword:d.keyword,lino:b.lino,name:b.name,alias:c.symbol};return c.pc+1}},Begin:{compile:function(a){a.next();a.compileFromHere(["end"]);return!0},run:function(a){return a[a.pc].pc+1}},Callback:{compile:function(a){a.compileVariable("core",
    27 "callback");return!0},run:function(a){return a[a.pc].pc+1}},Clear:{compile:function(a){var c=a.getLino();a.next();if(a.isSymbol()){var g=a.getSymbolRecord();if(g.isValueHolder)return g=a.getToken(),a.next(),a.addCommand({domain:"core",keyword:"clear",lino:c,symbol:g}),!0;a.warning("'Variable '"+g.name+"' does not hold a value")}return!1},run:function(a){var c=a[a.pc],g=a.getSymbolRecord(c.symbol);g.isValueHolder?(a.domain[g.domain].value.put(g,{type:"boolean",content:!1}),c.numeric=!1):a.variableDoesNotHoldAValueError(c.lino,
    28 g.name);return c.pc+1}},Close:{compile:function(a){var c=a.getLino();if(a.nextIsSymbol()){var g=a.getSymbolRecord();if("module"===g.keyword)return a.next(),a.addCommand({domain:"core",keyword:"close",lino:c,module:g.name}),!0}return!1},run:function(a){var c=a[a.pc];a=a.getSymbolRecord(c.module).program;a.run(a.onClose);return c.pc+1}},Debug:{compile:function(a){var c=a.getLino();if(a.nextTokenIs("program")){a.next();if(["item","pc"].includes(a.getToken())){var g=a.getNextValue();a.addCommand({domain:"core",
    29 keyword:"debug",lino:c,item:g});return!0}a.addCommand({domain:"core",keyword:"debug",lino:c,item:-1});return!0}return a.tokenIs("symbols")?(a.next(),a.addCommand({domain:"core",keyword:"debug",lino:c,item:"symbols"}),!0):a.tokenIs("symbol")?(g=a.nextToken(),a.next(),a.addCommand({domain:"core",keyword:"debug",lino:c,item:"symbol",name:g}),!0):a.tokenIs("step")?(a.next(),a.addCommand({domain:"core",keyword:"debug",lino:c,item:"step"}),!0):!1},run:function(a){var c=a[a.pc],g=c.item;switch(g){case "symbols":console.log("Symbols: "+
    30 JSON.stringify(a.symbols,null,2));break;case "symbol":a=a.getSymbolRecord(c.name);g=a.exporter;delete a.exporter;console.log("Symbol: "+JSON.stringify(a,null,2));a.exporter=g;break;case "step":a.debugStep=!0;break;default:0<=g.content?console.log("Debug item "+g.content+": "+JSON.stringify(a[g.content],null,2)):console.log("Debug program: "+JSON.stringify(a,null,2))}return c.pc+1}},Decode:{compile:function(a){var c=a.getLino();if(a.nextIsSymbol()){var g=a.getToken();a.next();a.addCommand({domain:"core",
    31 keyword:"decode",lino:c,symbol:g});return!0}return!1},run:function(a){var c=a[a.pc],g=a.getSymbolRecord(c.symbol);if(g.isValueHolder){var b=a.getValue(g.value[g.index]);g.value[g.index]={type:"constant",numeric:!1,content:a.decode(b)};c.numeric=!1}else a.variableDoesNotHoldAValueError(c.lino,g.name);return c.pc+1}},Divide:{compile:function(a){var c=a.getLino();if(a.nextIsSymbol()){var g=a.getSymbol();var b=a.getCommandAt(g.pc).name}g=a.getValue();a.tokenIs("by")&&a.next();var d=a.getValue();if(a.tokenIs("giving")){a.next();
    32 if(a.isSymbol())return b=a.getSymbol(),b=a.getCommandAt(b.pc).name,a.next(),a.addCommand({domain:"core",keyword:"divide",lino:c,value1:g,value2:d,target:b}),!0;a.warning("core "+e.name+": Expected value holder")}else return"undefined"===typeof b&&a.warning("core "+e.name+": No target variable given"),a.addCommand({domain:"core",keyword:"divide",lino:c,value2:d,target:b}),!0;return!1},run:function(a){var c=a[a.pc],g=c.value1,b=c.value2,d=a.getSymbolRecord(c.target);if(d.isValueHolder){var e=d.value[d.index];
    33 g?(a=a.getValue(g)/a.getValue(b),d.value[d.index]={type:"constant",numeric:!0,content:Math.trunc(a)}):(e.numeric||a.nonNumericValueError(c,lino),a=e.content/a.getValue(b),d.value[d.index]={type:"constant",numeric:!0,content:Math.trunc(a)})}else a.variableDoesNotHoldAValueError(c.lino,d.name);return c.pc+1}},Encode:{compile:function(a){var c=a.getLino();a.next();if(a.isSymbol()){var b=a.getToken();a.next();a.addCommand({domain:"core",keyword:"encode",lino:c,symbol:b});return!0}return!1},run:function(a){var c=
    34 a[a.pc],b=a.getSymbolRecord(c.symbol);if(b.isValueHolder){var d=a.getValue(b.value[b.index]);b.value[b.index]={type:"constant",numeric:!1,content:a.encode(d)};c.numeric=!1}else a.variableDoesNotHoldAValueError(c.lino,b.name);return c.pc+1}},End:{compile:function(a){a.next();return!0},run:function(){return 0}},Fork:{compile:function(a){var c=a.getLino();a.next();a.nextTokenIs("to")&&a.next();var b=a.getToken();a.next();a.addCommand({domain:"core",keyword:"fork",lino:c,label:b});return!0},run:function(a){var c=
    35 a[a.pc];try{a.run(a.symbols[c.label].pc)}catch(g){console.log(g.message),alert(g.message)}return c.pc+1}},Go:{compile:function(a){var c=a.getLino();a.nextTokenIs("to")&&a.next();var b=a.getToken();a.next();a.addCommand({domain:"core",keyword:"go",lino:c,label:b});return!0},run:function(a){var c=a[a.pc];if(c.label){if(a.verifySymbol(c.label)){var b=a.symbols[c.label];if(b)return b.pc}a.runtimeError(c.lino,"Unknown symbol '"+c.label+"'");return 0}return c.goto}},Gosub:{compile:function(a){var c=a.getLino();
    36 a.nextTokenIs("to")&&a.next();var b=a.getToken();a.next();a.addCommand({domain:"core",keyword:"gosub",lino:c,label:b});return!0},run:function(a){var c=a[a.pc];if(a.verifySymbol(c.label))return a.stack.push(a.pc+1),a.symbols[c.label].pc;a.runtimeError(c.lino,"Unknown symbol '"+c.label+"'");return 0}},If:{compile:function(a){var c=a.getLino();a.next();var b=a.condition.compile(a),d=a.getPc();a.addCommand({domain:"core",keyword:"if",lino:c,condition:b});a.compileOne();if(!a.getToken())return a.getCommandAt(d).else=
    37 a.getPc(),!0;a.tokenIs("else")?(c=a.getPc(),a.addCommand({domain:"core",keyword:"goto",goto:0}),a.getCommandAt(d).else=a.getPc(),a.next(),a.compileOne(!0),a.getCommandAt(c).goto=a.getPc()):a.getCommandAt(d).else=a.getPc();return!0},run:function(a){var c=a[a.pc];return a.condition.test(a,c.condition)?c.pc+1:c.else}},Import:{compile:function(a){var c=a.imports,b=a.getProgram();c=$jscomp.makeIterator(c);for(var d=c.next();!d.done;d=c.next()){d=d.value;var e=a.nextToken(),f=d.keyword;if(e===f){if(e=a.compileVariable(d.domain,
    38 f,!0),e=b[a.getSymbols()[e.name].pc],e.element=d.element,e.exporter=d.exporter,e.exportedName=d.name,e.extra=d.extra,e.isValueHolder=d.isValueHolder,e.imported=!0,!a.tokenIs("and"))break}else throw Error("Mismatched import variable type for '"+d.name+"'");}if(a.tokenIs("and"))throw Error("Imports do not match exports");return!0},run:function(a){return a[a.pc].pc+1}},Index:{compile:function(a){var c=a.getLino();if(a.nextIsSymbol(!0)){var b=a.getToken();if(a.nextTokenIs("to")){var d=a.getNextValue();
    39 a.addCommand({domain:"core",keyword:"index",lino:c,symbol:b,value:d});return!0}}return!1},run:function(a){var c=a[a.pc],b=a.getSymbolRecord(c.symbol),d=a.getValue(c.value);d>=b.elements&&a.runtimeError(c.lino,"Array index "+d+" is out of range for '"+b.name+"'");b.index=d;b.imported&&(b.exporter.getSymbolRecord(b.exportedName).index=d);return c.pc+1}},Load:{compile:function(a){var c=a.getLino();switch(a.nextToken()){case "plugin":var b=a.getNextValue();a.addCommand({domain:"core",keyword:"load",lino:c,
    40 name:b});return!0}return!1},run:function(a){var c=a[a.pc],b=a.getValue(c.name);switch(c.keyword){case "load":if(a.checkPlugin(b))return c.pc+1;EasyCoder_Plugins.getLocalPlugin(a.getPluginsPath,b,a.getPlugin,a.addLocalPlugin,function(){a.run(c.pc+1)});return 0}}},Module:{compile:function(a){a.compileVariable("core","module");return!0},run:function(a){a=a[a.pc];a.program=null;return a.pc+1}},Multiply:{compile:function(a){var c=a.getLino();a.next();if(a.isSymbol()){var b=a.getSymbol();var d=a.getCommandAt(b.pc).name}b=
    41 a.getValue();a.tokenIs("by")&&a.next();var e=a.getValue();if(a.tokenIs("giving")){a.next();if(a.isSymbol())return d=a.getSymbol(),d=a.getCommandAt(d.pc).name,a.next(),a.addCommand({domain:"core",keyword:"multiply",lino:c,value1:b,value2:e,target:d}),!0;a.warning("core multiply: Expected value holder")}else return"undefined"===typeof d&&a.warning("core multiply: No target variable given"),a.addCommand({domain:"core",keyword:"multiply",lino:c,value2:e,target:d}),!0;return!1},run:function(a){var c=a[a.pc],
    42 b=c.value1,d=c.value2,e=a.getSymbolRecord(c.target);if(e.isValueHolder){var f=e.value[e.index];b?(a=a.getValue(b)*a.getValue(d),e.value[e.index]={type:"constant",numeric:!0,content:a}):(f.numeric||a.nonNumericValueError(c,lino),a=f.content*a.getValue(d),e.value[e.index]={type:"constant",numeric:!0,content:a})}else a.variableDoesNotHoldAValueError(c.lino,e.name);return c.pc+1}},Negate:{compile:function(a){var c=a.getLino();a.next();if(a.isSymbol()){var b=a.getToken();a.next();a.addCommand({domain:"core",
    43 keyword:"negate",lino:c,symbol:b});return!0}return!1},run:function(a){var c=a[a.pc],b=a.getSymbolRecord(c.symbol);b.isValueHolder?b.value[b.index]={type:"constant",numeric:!0,content:-b.value[b.index].content}:a.variableDoesNotHoldAValueError(c.lino,b.name);return c.pc+1}},On:{compile:function(a){var c=a.getLino(),b=a.nextToken();switch(b){case "trigger":case "close":case "restore":case "message":return a.next(),a.addCommand({domain:"core",keyword:"on",lino:c,action:b}),a.completeHandler()}return a.isSymbol()&&
    44 (b=a.getSymbolRecord(),"callback"===b.keyword)?(a.next(),a.addCommand({domain:"core",keyword:"on",lino:c,action:b.name}),a.completeHandler()):!1},run:function(a){var c=a[a.pc],b=c.pc+2;switch(c.action){case "trigger":a.onTrigger=b;break;case "close":a.onClose=b;break;case "restore":a.onRestore=b;break;case "message":a.onMessage=b;break;default:var d=a.getSymbolRecord(c.action);if(d)d.cb=b;else return a.runtimeError(c.lino,"Unknown action '"+c.action+"'"),0}return c.pc+1}},Print:{compile:function(a){var c=
    45 a.getLino();a.next();var b=a.getValue();a.addCommand({domain:"core",keyword:"print",lino:c,value:b});return!0},run:function(a){var c=a[a.pc];a=a.getFormattedValue(c.value);console.log("-> "+a);return c.pc+1}},Put:{compile:function(a){var c=a.getLino();a.next();var b=a.getValue();if(a.tokenIs("into")){a.next();if(a.isSymbol()){var d=a.getToken();a.next();a.addCommand({domain:"core",keyword:"put",lino:c,value:b,target:d});return!0}a.warning("core:put: No such variable: '"+a.getToken()+"'")}return!1},
    46 run:function(a){var c=a[a.pc],b=a.getSymbolRecord(c.target);b.isValueHolder||a.variableDoesNotHoldAValueError(c.lino,b.name);a=a.evaluate(c.value);b.value[b.index]=a;b.imported&&(b=b.exporter.getSymbolRecord(b.exportedName),b.value[b.index]=a);return c.pc+1}},Replace:{compile:function(a){var c=a.getLino(),b=a.getNextValue();if(a.tokenIs("with")){var d=a.getNextValue();if(a.tokenIs("in")&&a.nextIsSymbol()){var e=a.getSymbolRecord();a.next();if(e.isValueHolder)return a.addCommand({domain:"core",keyword:"replace",
    47 lino:c,original:b,replacement:d,target:e.name}),!0}}return!1},run:function(a){var c=a[a.pc],b=a.getValue(c.original),d=a.getValue(c.replacement),e=a.getSymbolRecord(c.target);a=a.getValue(e.value[e.index]).split(b).join(d);e.value[e.index]={type:"constant",numeric:!1,content:a};return c.pc+1}},Require:{compile:function(a){var c=a.getLino(),b=a.getNextValue();a.addCommand({domain:"core",keyword:"require",lino:c,url:b});return!0},run:function(a){var c=a[a.pc];a.require(a,a.getValue(c.url),function(){a.run(c.pc+
    48 1)});return 0}},Return:{compile:function(a){var c=a.getLino();a.next();a.addCommand({domain:"core",keyword:"return",lino:c});return!0},run:function(a){return a.stack.pop()}},Run:{compile:function(a){var c=a.getLino(),b=a.getNextValue(),d=[];if(a.tokenIs("with"))for(;;)if(a.nextIsSymbol(!0)){var e=a.getSymbolRecord();e.exporter=a.getProgram();d.push(e);a.next();if(!a.tokenIs("and"))break}if(a.tokenIs("as")&&a.nextIsSymbol(!0)){e=a.getSymbolRecord();a.next();if("module"!==e.keyword)throw Error("'"+
    49 e.name+"' is not a module");var f=e.name}a.addCommand({domain:"core",keyword:"run",lino:c,script:b,imports:d,module:f});return!0},run:function(a){a.nextPc=a.pc+1;a.runScript(a);return 0}},Sanitize:{compile:function(a){var c=a.getLino();if(a.nextIsSymbol()){var b=a.getToken();a.next();a.addCommand({domain:"core",keyword:"sanitize",lino:c,name:b});return!0}return!1},run:function(a){var c=a[a.pc];a=a.getSymbolRecord(c.name);a=a.value[a.index];a.content=JSON.stringify(JSON.parse(a.content));return c.pc+
    50 1}},Script:{compile:function(a){var c=a.getLino(),b=a.nextToken();a.next();a.addCommand({domain:"core",keyword:"script",lino:c,name:b});return!0},run:function(a){var c=a[a.pc];a.script=c.name;EasyCoder.scripts[c.name]=a;console.log(Date.now()-EasyCoder.timestamp+" ms: Script: "+c.name);return c.pc+1}},Send:{compile:function(a){var c=a.getLino(),b="";a.nextTokenIs("to")||(b=a.getValue());if(a.tokenIs("to")){if(a.nextTokenIs("parent"))var d="parent";else if(a.isSymbol){d=a.getSymbolRecord();if("module"!==
    51 d.keyword)throw Error("'"+d.name+"' is not a module");d=d.name}a.next();a.addCommand({domain:"core",keyword:"send",lino:c,message:b,recipient:d})}return!0},run:function(a){var c=a[a.pc],b=a.getValue(c.message);if("parent"===c.recipient){var d=a.parent;d&&a.parent.onMessage&&(d.message=b,d.run(d.onMessage))}else a=a.getSymbolRecord(c.recipient),a.program.message=b,a.program.run(a.program.onMessage);return c.pc+1}},Set:{compile:function(a){var c=a.getLino();if(a.nextIsSymbol()){var b=a.getSymbolRecord();
    52 if(!b.isValueHolder)return!1;if(a.nextTokenIs("to")){a.next();for(var d=[];;){a.mark();try{d.push(a.getValue())}catch(k){a.rewind();break}}a.addCommand({domain:"core",keyword:"set",lino:c,request:"setArray",target:b.name,value:d});return!0}a.addCommand({domain:"core",keyword:"set",lino:c,request:"setBoolean",target:b.name});return!0}if(a.tokenIs("ready"))return a.next(),a.addCommand({domain:"core",keyword:"set",lino:c,request:"setReady"}),!0;if(a.tokenIs("property")&&(b=a.getNextValue(),a.tokenIs("of")&&
    53 a.nextIsSymbol()&&(d=a.getSymbolRecord(),"variable"===d.keyword&&a.nextTokenIs("to")))){var e=a.getNextValue();a.addCommand({domain:"core",keyword:"set",lino:c,request:"setProperty",target:d.name,name:b,value:e});return!0}a.tokenIs("the")&&a.next();if(a.tokenIs("elements")&&(a.next(),a.tokenIs("of"))){a.next();if(!a.isSymbol())throw Error("Unknown variable '"+a.getToken()+"'");b=a.getToken();a.next();if(a.tokenIs("to"))return a.next(),d=a.getValue(),a.addCommand({domain:"core",keyword:"set",lino:c,
    54 request:"setElements",symbol:b,value:d}),!0}if(a.tokenIs("encoding")){if(a.nextTokenIs("to"))return b=a.getNextValue(),a.addCommand({domain:"core",keyword:"set",request:"encoding",lino:c,encoding:b}),!0;a.addWarning("Unknown encoding option");return!1}return a.tokenIs("payload")&&a.nextTokenIs("of")&&a.nextIsSymbol()&&(b=a.getSymbolRecord(),"callback"===b.keyword&&a.nextTokenIs("to"))?(d=a.getNextValue(),a.addCommand({domain:"core",keyword:"set",request:"setPayload",lino:c,callback:b.name,payload:d}),
    55 !0):!1},run:function(a){var c=a[a.pc];switch(c.request){case "setBoolean":var b=a.getSymbolRecord(c.target);b.isValueHolder?(b.value[b.index]={type:"boolean",content:!0},c.numeric=!1):a.variableDoesNotHoldAValueError(c.lino,b.name);break;case "setReady":a.parent.run(a.parent.nextPc);break;case "setElements":b=a.getSymbolRecord(c.symbol);b.elements=a.getValue(c.value);b.index=0;b.value=[];b.element=[];for(a=0;a<b.elements;a++)b.value.push({}),b.element.push({});break;case "setArray":b=a.getSymbolRecord(c.target);
    56 b.elements=c.value.length;b.value=c.value;break;case "encoding":a.encoding=a.getValue(c.encoding);break;case "setProperty":b=a.getSymbolRecord(c.target);var d=a.getValue(b.value[b.index]);d||(d="{}");var e="";try{e=JSON.parse(d)}catch(k){return a.runtimeError(c.lino,"Can't parse "+b.name),0}d=a.getValue(c.name);if(a=a.evaluate(c.value))e[d]="boolean"===a.type?a.content:a.numeric?a.content:'{"'===a.content.substr(0,2)?JSON.parse(a.content):a.content.split('"').join('\\"'),b.value[b.index]={type:"constant",
    57 numeric:!1,content:JSON.stringify(e)};break;case "setPayload":a.getSymbolRecord(c.callback).payload=a.getValue(c.payload)}return c.pc+1}},Stop:{compile:function(a){var c=a.getLino();a.next();a.addCommand({domain:"core",keyword:"stop",lino:c,next:0});return!0},run:function(){return 0}},Take:{compile:function(a){var c=a.getLino();a.next();var b=a.getValue();if(a.tokenIs("from"))if(a.next(),a.isSymbol()){var d=a.getSymbol();if(a.getCommandAt(d.pc).isValueHolder){if("giving"===a.peek()){d=a.getValue();
    58 a.next();var f=a.getToken();a.next();a.addCommand({domain:"core",keyword:"take",lino:c,value1:b,value2:d,target:f})}else d=a.getToken(),a.next(),a.addCommand({domain:"core",keyword:"take",lino:c,value1:b,target:d});return!0}a.warning("core "+e.name+": Expected value holder")}else{d=a.getValue();if(a.tokenIs("giving"))return a.next(),f=a.getToken(),a.next(),a.addCommand({domain:"core",keyword:"take",lino:c,value1:b,value2:d,target:f}),!0;a.warning("core "+e.name+': Expected "giving"')}return!1},run:function(a){var c=
    59 a[a.pc],b=c.value1,d=c.value2,e=a.getSymbolRecord(c.target);if(e.isValueHolder){var f=e.value[e.index];d?(a=a.getValue(d)-a.getValue(b),e.value[e.index]={type:"constant",numeric:!0,content:a}):(f.numeric||a.nonNumericValueError(c,lino),a=a.getValue(f)-a.getValue(b),e.value[e.index]={type:"constant",numeric:!0,content:a})}else a.variableDoesNotHoldAValueError(c.lino,e.name);return c.pc+1}},Toggle:{compile:function(a){var c=a.getLino();a.next();if(a.isSymbol()){var b=a.getSymbolPc();a.next();a.addCommand({domain:"core",
    60 keyword:"toggle",lino:c,symbol:b});return!0}return!1},run:function(a){var c=a[a.pc],b=a[c.symbol];if(b.isValueHolder){var d=a.domain[b.domain];a=d.value.get(a,b.value[b.index]).content;d.value.put(b,{type:"boolean",content:!a})}else a.variableDoesNotHoldAValueError(c.lino,b.name);return c.pc+1}},Variable:{compile:function(a){a.compileVariable("core","variable",!0);return!0},run:function(a){return a[a.pc].pc+1}},Wait:{compile:function(a){var c=a.getLino();a.next();var b=a.getValue(a),d=1E3;switch(a.getToken()){case "milli":case "millis":a.next();
    61 d=1;break;case "tick":case "ticks":a.next();d=10;break;case "second":case "seconds":a.next();d=1E3;break;case "minute":case "minutes":a.next(),d=6E4}a.addCommand({domain:"core",keyword:"wait",lino:c,value:b,multiplier:d});return!0},run:function(a){var c=a[a.pc],b=a.getValue(c.value);setTimeout(function(){a.run(c.pc+1)},b*c.multiplier);return 0}},While:{compile:function(a){var c=a.getLino();a.next();var b=a.getCondition(),d=a.getPc();a.addCommand({domain:"core",keyword:"while",lino:c,condition:b});
    62 c=a.getPc();a.addCommand({domain:"core",keyword:"goto",goto:0});a.compileOne();a.addCommand({domain:"core",keyword:"goto",goto:d});a.getCommandAt(c).goto=a.getPc();return!0},run:function(a){return a.condition.test(a,a[a.pc].condition)?a.pc+2:a.pc+1}},getHandler:function(a){switch(a){case "add":return b.Add;case "alias":return b.Alias;case "begin":return b.Begin;case "callback":return b.Callback;case "clear":return b.Clear;case "close":return b.Close;case "debug":return b.Debug;case "decode":return b.Decode;
    63 case "divide":return b.Divide;case "encode":return b.Encode;case "end":return b.End;case "fork":return b.Fork;case "go":case "goto":return b.Go;case "gosub":return b.Gosub;case "if":return b.If;case "import":return b.Import;case "index":return b.Index;case "load":return b.Load;case "module":return b.Module;case "multiply":return b.Multiply;case "negate":return b.Negate;case "on":return b.On;case "print":return b.Print;case "put":return b.Put;case "replace":return b.Replace;case "require":return b.Require;
    64 case "return":return b.Return;case "run":return b.Run;case "sanitize":return b.Sanitize;case "script":return b.Script;case "send":return b.Send;case "set":return b.Set;case "stop":return b.Stop;case "take":return b.Take;case "toggle":return b.Toggle;case "variable":return b.Variable;case "wait":return b.Wait;case "while":return b.While;default:return!1}},run:function(a){var c=a[a.pc],d=b.getHandler(c.keyword);d||a.runtimeError(c.lino,"Unknown keyword '"+c.keyword+"' in 'core' package");return d.run(a)},
    65 isNegate:function(a){return"not"===a.getToken()?(a.next(),!0):!1},value:{compile:function(a){if(a.isSymbol()){var c=a.getToken();switch(a.getSymbolRecord().keyword){case "module":return a.next(),{domain:"core",type:"module",name:c};case "variable":var b=a.nextToken();return["format","modulo"].includes(b)?(a=a.getNextValue(),{domain:"core",type:b,name:c,value:a}):{domain:"core",type:"symbol",name:c}}return null}c=a.getToken();if("true"===c)return a.next(),{domain:"core",type:"boolean",content:!0};
    66 if("false"===c)return a.next(),{domain:"core",type:"boolean",content:!1};if("random"===c)return a.next(),{domain:"core",type:"random",range:a.getValue()};if("cos"===c)return a.next(),c=a.getValue(),a.skip("radius"),a=a.getValue(),{domain:"core",type:"cos",angle_c:c,radius_c:a};if("sin"===c)return a.next(),c=a.getValue(),a.skip("radius"),a=a.getValue(),{domain:"core",type:"sin",angle_s:c,radius_s:a};if("tan"===c)return a.next(),c=a.getValue(),a.skip("radius"),a=a.getValue(),{domain:"core",type:"tan",
    67 angle_t:c,radius_t:a};if("empty"===c)return a.next(),{domain:"core",type:"empty"};if("now"===c)return a.next(),{domain:"core",type:"now"};if("newline"===c)return a.next(),{domain:"core",type:"newline"};if("break"===c)return a.next(),{domain:"core",type:"break"};if("encode"===c)return a.next(),{domain:"core",type:"encode",value:a.getValue()};if("decode"===c)return a.next(),{domain:"core",type:"decode",value:a.getValue()};if("lowercase"===c)return a.next(),{domain:"core",type:"lowercase",value:a.getValue()};
    68 if("element"===c)return c=a.getNextValue(),a.tokenIs("of")&&a.nextIsSymbol()&&(b=a.getSymbolRecord(),a.next(),"variable"===b.keyword)?{domain:"core",type:"element",element:c,symbol:b.name}:null;if("property"===c)return c=a.getNextValue(),a.tokenIs("of")&&a.nextIsSymbol()&&(b=a.getSymbolRecord(),a.next(),"variable"===b.keyword)?{domain:"core",type:"property",property:c,symbol:b.name}:null;a.tokenIs("the")&&a.next();c=a.getToken();switch(c){case "elements":case "index":if(a.nextTokenIs("of")&&a.nextIsSymbol())return b=
    69 a.getToken(),a.next(),{domain:"core",type:c,name:b};break;case "value":if(a.nextTokenIs("of"))return a.next(),{domain:"core",type:"valueOf",value:a.getValue()};break;case "length":if(a.nextTokenIs("of"))return a.next(),{domain:"core",type:"lengthOf",value:a.getValue()};break;case "left":case "right":b=a.getNextValue();if(a.tokenIs("of"))return a=a.getNextValue(),{domain:"core",type:c,count:b,value:a};break;case "from":b=a.getNextValue();var d=a.tokenIs("to")?a.getNextValue():null;if(a.tokenIs("of"))return a=
    70 a.getNextValue(),{domain:"core",type:c,from:b,to:d,value:a};break;case "position":if(a.nextTokenIs("of")&&(c=!1,a.nextTokenIs("the")&&a.nextTokenIs("last")&&(a.next(),c=!0),b=a.getValue(),a.tokenIs("in")))return a=a.getNextValue(),{domain:"core",type:"position",needle:b,haystack:a,last:c};break;case "payload":if(a.nextTokenIs("of")&&a.nextIsSymbol()&&(c=a.getSymbolRecord(),"callback"===c.keyword))return a.next(),{domain:"core",type:"payload",callback:c.name};break;case "message":case "error":return a.next(),
    71 {domain:"core",type:c}}return null},get:function(a,c){switch(c.type){case "boolean":return{type:"boolean",numeric:!1,content:c.content};case "elements":return{type:"constant",numeric:!0,content:a.getSymbolRecord(c.name).elements};case "index":return{type:"constant",numeric:!0,content:a.getSymbolRecord(c.name).index};case "random":return a=a.evaluate(c.range),{type:"constant",numeric:!0,content:Math.floor(Math.random()*a.content)};case "cos":var b=a.getValue(c.angle_c);a=a.getValue(c.radius_c);return{type:"constant",
    72 numeric:!0,content:parseInt(Math.cos(.01745329*parseFloat(b))*a,10)};case "sin":return b=a.getValue(c.angle_s),a=a.getValue(c.radius_s),{type:"constant",numeric:!0,content:parseInt(Math.sin(.01745329*parseFloat(b))*a,10)};case "tan":return b=a.getValue(c.angle_t),a=a.getValue(c.radius_t),{type:"constant",numeric:!0,content:parseInt(Math.tan(.01745329*parseFloat(b))*a,10)};case "valueOf":return a=parseInt(a.getValue(c.value)),{type:"constant",numeric:!0,content:a?a:0};case "lengthOf":return{type:"constant",
    73 numeric:!0,content:a.getValue(c.value).length};case "left":return{type:"constant",numeric:!1,content:a.getValue(c.value).substr(0,a.getValue(c.count))};case "right":return{type:"constant",numeric:!1,content:a.getValue(c.value).substr(rstr.length-a.getValue(c.count))};case "from":b=a.getValue(c.from);var d=c.to?a.getValue(c.to):null;a=a.getValue(c.value);return{type:"constant",numeric:!1,content:d?a.substr(b,d):a.substr(b)};case "position":return b=a.getValue(c.needle),a=a.getValue(c.haystack),{type:"constant",
    74 numeric:!0,content:c.last?a.lastIndexOf(b):a.indexOf(b)};case "payload":return{type:"constant",numeric:!1,content:a.getSymbolRecord(c.callback).payload};case "modulo":return b=a.getSymbolRecord(c.name),a=a.evaluate(c.value),{type:"constant",numeric:!0,content:b.value[b.index].content%a.content};case "format":d=a.getSymbolRecord(c.name);d=1E3*a.getValue(d.value[d.index]);try{switch(b=JSON.parse(a.getValue(c.value)),b.mode){case "date":return{type:"constant",numeric:!0,content:(new Date(d)).toLocaleDateString(b.locale,
    75 b.options)}}}catch(p){a.runtimeError(a[a.pc].lino,"Can't parse "+c.value)}break;case "empty":return{type:"constant",numeric:!1,content:""};case "now":return{type:"constant",numeric:!0,content:Date.now()/1E3};case "newline":return{type:"constant",numeric:!1,content:"\n"};case "break":return{type:"constant",numeric:!1,content:"<br />"};case "encode":return{type:"constant",numeric:!1,content:a.encode(a.getValue(c.value))};case "decode":return{type:"constant",numeric:!1,content:a.decode(a.getValue(c.value))};
    76 case "lowercase":return{type:"constant",numeric:!1,content:a.getValue(c.value).toLowerCase()};case "element":b=a.getValue(c.element);c=a.getSymbolRecord(c.symbol);d="";try{d=JSON.parse(a.getValue(c.value[c.index]))[b]}catch(p){a.runtimeError(command.lino,"Can't parse JSON");break}return{type:"constant",numeric:!1,content:"object"===typeof d?JSON.stringify(d):d};case "property":b=a.getValue(c.property);c=a.getSymbolRecord(c.symbol);a=a.getValue(c.value[c.index]);c="";if(b&&a)if("object"===typeof a)c=
    77 a[b];else if("{"===a.charAt(0))try{c=JSON.parse(a)[b]}catch(p){console.log("Can't parse '"+a+"': "+p.message)}return{type:"constant",numeric:Number.isInteger(c),content:"object"===typeof c?JSON.stringify(c):c};case "module":return{type:"boolean",numeric:!1,content:a.getSymbolRecord(c.name).program};case "message":return c=a.message,{type:"constant",numeric:!1,content:c};case "error":return c=a.errorMessage,{type:"constant",numeric:!1,content:c}}return null},put:function(a,c){a.value[a.index]=c}},
    78 condition:{compile:function(a){if(a.tokenIs("not"))return a.next(),{domain:"core",type:"not",value:a.getValue()};try{var c=a.getValue();if("is"===a.getToken()){a.next();var d=b.isNegate(a);switch(a.getToken()){case "numeric":return a.next(),{domain:"core",type:"numeric",value1:c};case "even":return a.next(),{domain:"core",type:"even",value1:c};case "odd":return a.next(),{domain:"core",type:"odd",value1:c};case "greater":a.next();if(a.tokenIs("than")){a.next();var e=a.getValue();return{domain:"core",
    79 type:"greater",value1:c,value2:e,negate:d}}break;case "less":a.next();if(a.tokenIs("than")){a.next();var f=a.getValue();return{domain:"core",type:"less",value1:c,value2:f,negate:d}}break;default:var h=a.getValue();return{domain:"core",type:"is",value1:c,value2:h,negate:d}}}else if(c)return{domain:"core",type:"boolean",value:c}}catch(l){return a.warning("Can't get a value"),0}return null},test:function(a,c){switch(c.type){case "boolean":return a.getValue(c.value);case "numeric":return Number.isInteger(a.getValue(c.value1));
    80 case "even":return 0===a.getValue(c.value1)%2;case "odd":return 1===a.getValue(c.value1)%2;case "is":return a=a.compare(a,c.value1,c.value2),c.negate?0!==a:0===a;case "greater":return a=a.compare(a,c.value1,c.value2),c.negate?0>=a:0<a;case "less":return a=a.compare(a,c.value1,c.value2),c.negate?0<=a:0>a;case "not":return!a.getValue(c.value)}return!1}}};h.exports=b},{}],6:[function(d,h,f){var e=this,b=d("./Tokenise"),a=d("./Compile"),c=d("./Run"),g=d("./Value"),m=d("./Condition"),p=d("./Compare"),
    81 k={domain:{core:d("./Core")},setupTracer:function(){var a=document.getElementById("easycoder-tracer");a&&(a.innerHTML='<div><input id="easycoder-run-button" type="button" value="Run" /><input id="easycoder-step-button" type="button" value="Step" /><div id="easycoder-tracer-content" style="border:1px solid black;padding:4px";width:100%></div>',a.style.display="none")},runtimeError:function(a,c){this.lino=a;this.reportError({message:"Line "+(0<=a?a:"")+": "+c},k.program)},nonNumericValueError:function(a){this.runtimeError(a,
    82 "Non-numeric value")},variableDoesNotHoldAValueError:function(a,c){this.runtimeError(a,"Variable '"+c+"' does not hold a value")},reportError:function(c,b,d){if(c.message)if(this.compiling||b){d=d?d:b.source;var e=d.tokens;d=d.scriptLines;e=this.compiling?e[a.getIndex()].lino:b[b.pc].lino;b=this.compiling?"Compile error":"Runtime error in '"+b.script+"'";b+=":\n";var g=e-5;for(g=0>g?0:g;g<e;g++){var l=(""+(g+1)).padStart(4," ");b+=l+" "+d[g].line.split("\\s").join(" ")+"\n"}b+=c.message+"\n";c=a.getWarnings();
    83 if(c.length)for(b+="Warnings:\n",c=$jscomp.makeIterator(c),d=c.next();!d.done;d=c.next())b+=d.value+"\n";console.log(b);alert(b);k.aborted=!0}else c="Error: "+c.message,alert(c),console.log(c);else console.log("An error occurred - origin was "+c.path[0])},getSymbolRecord:function(a){a=this[this.symbols[a].pc];return a.alias?this.getSymbolRecord(a.alias):a.exporter&&a.exporter!=this?a.exporter.getSymbolRecord(a.exportedName):a},verifySymbol:function(a){return this.symbols.hasOwnProperty(a)},encode:function(a){return g.encode(a,
    84 this.encoding)},decode:function(a){return g.decode(a,this.encoding)},evaluate:function(a){return g.evaluate(this,a)},getValue:function(a){return g.getValue(this,a)},getFormattedValue:function(a){a=g.evaluate(this,a);return a.numeric?a.content:'{"'===a.content.substr(0,2)||"["===a.content.charAt(0)?JSON.stringify(JSON.parse(a.content),null,2):a.content},getSimpleValue:function(a){return!0===a||!1===a?{type:"boolean",content:a}:{type:"constant",numeric:Number.isInteger(a),content:a}},run:function(a){a&&
    85 (k.program=this,c(this,a))},trigger:function(){this.onTrigger&&c(this,this.onTrigger)},register:function(a){k.program=a},require:function(a,c,b){a=document.createElement("script");a.type="text/javascript";a.src=c;a.onload=function(){console.log(Date.now()-k.timestamp+" ms: Library "+c+" loaded");b()};document.head.appendChild(a)},isUndefined:function(a){return"undefined"===typeof a},runScript:function(a){var c=a[a.pc],b=a.getValue(c.script),d=c.imports;a=c.module?a.getSymbolRecord(c.module):null;
    86 k.tokeniseScript(b.split("\n"),d,a,this)},close:function(){},compileScript:function(c,b,d,e){var f=c.tokens;this.compiling=!0;var h=Date.now();a.value=g;a.condition=m;a.domain=k.domain;a.imports=b;b=a.compile(f);var l=Date.now();console.log(l-k.timestamp+" ms: Compiled "+f.length+" tokens in "+(l-h+" ms"));this.compiling=!1;b.EasyCoder=k;b.value=g;b.condition=m;b.compare=p;b.source=c;b.run=this.run;b.runScript=this.runScript;b.evaluate=this.evaluate;b.getValue=this.getValue;b.getFormattedValue=this.getFormattedValue;
    87 b.getSimpleValue=this.getSimpleValue;b.encode=this.encode;b.decode=this.decode;b.domain=this.domain;b.trigger=this.trigger;b.require=this.require;b.isUndefined=this.isUndefined;b.checkPlugin=this.checkPlugin;b.getPlugin=this.getPlugin;b.addLocalPlugin=this.addLocalPlugin;b.getPluginsPath=this.getPluginsPath;b.getSymbolRecord=this.getSymbolRecord;b.verifySymbol=this.verifySymbol;b.runtimeError=this.runtimeError;b.nonNumericValueError=this.nonNumericValueError;b.variableDoesNotHoldAValueError=this.variableDoesNotHoldAValueError;
    88 b.reportError=this.reportError;b.register=this.register;b.symbols=a.getSymbols();b.encoding="ec";b.popups=[];b.stack=[];b.queue=[0];b.module=d;b.parent=e;d&&(d.program=b);return b},tokeniseScript:function(a,d,e,g){var f=null,h=Date.now();a=b.tokenise(a);var l=Date.now();console.log(l-k.timestamp+" ms: Tokenised "+a.scriptLines.length+" lines in "+(l-h+" ms"));try{f=k.compileScript(a,d,e,g)}catch(u){"stop"!==u.message&&this.reportError(u,k.program,a)}this.setupTracer();f&&c(f,0)},tokenize:function(a){var b=
    89 a.split("\n");if(!e.tokenising){try{k.tokeniseScript(b)}catch(q){k.reportError(q,null,a)}e.tokenising=!0}},setPluginCount:function(a){e.plugins=[];e.pluginCount=a},checkPlugin:function(a){return k.domain[a]},getPlugin:function(a,b,c){k.domain[a]?c():(a=document.createElement("script"),a.type="text/javascript",a.src=b,a.onload=function(){console.log(Date.now()-k.timestamp+" ms: Plugin "+b+" loaded");c()},document.head.appendChild(a))},addGlobalPlugin:function(a,b){e.plugins.push({name:a,handler:b});
    90 e.plugins.length===e.pluginCount&&(e.plugins.forEach(function(a){k.domain[a.name]=a.handler}),k.tokenize(e.source))},addLocalPlugin:function(a,b,c){k.domain[a]=b;c()},getPluginsPath:function(){return k.pluginsPath},loadPluginJs:function(a){console.log(Date.now()-k.timestamp+" ms: Load "+a+"/easycoder/plugins.js");var b=document.createElement("script");b.src=""+window.location.origin+a+"/easycoder/plugins.js";b.type="text/javascript";b.onload=function(){EasyCoder_Plugins.getGlobalPlugins(k.timestamp,
    91 a,k.setPluginCount,k.getPlugin,k.addGlobalPlugin)};b.onerror=function(){a?k.loadPluginJs(a.slice(0,a.lastIndexOf("/"))):k.reportError({message:"Can't load plugins.js"},k.program,e.source)};document.head.appendChild(b);k.pluginsPath=a},start:function(a){e.source=a;a=window.location.pathname;a.endsWith("/")&&(a=a.slice(0,-1));k.loadPluginJs(a)}};h.exports=k},{"./Compare":2,"./Compile":3,"./Condition":4,"./Core":5,"./Run":7,"./Tokenise":8,"./Value":9}],7:[function(d,h,f){var e=function(b,a){var c=[],
    92 d=function(a){var b=9999;a.forEach(function(a){a=a.line;for(var c=0;c<a.length&&" "===a[c];)c++;0<c&&c<b&&(b=c)});return 0};if(c.length)c.push(a);else for(b.register(b),c.push(a);0<c.length&&!EasyCoder.aborted;)for(b.pc=c.shift(),b.watchdog=0,a={};;){if(1E6<b.watchdog){b.lino=b[b.pc].lino;b.reportError(Error("Program runaway intercepted.\nHave you forgotten to increment a loop counter?",b),b);break}b.watchdog++;var f=b[b.pc].domain;b.debugStep&&console.log(b.script+" "+b.pc+" "+f+":"+b[b.pc].keyword);
    93 var h=b.domain[f];if(!h){b.runtimeError(b[b.pc].lino,"Unknown domain '"+f+"'");break}b.pc=h.run(b);if(!b.pc)break;if(b.stop){b.tracing=!1;return}if(b.tracing){f=b[b.pc];h=b.source.scriptLines;var k=d(h),l=document.getElementById("easycoder-tracer");if(!l){b.runtimeError(f.lino,"Element 'easycoder-tracer' was not found");return}l.style.display="block";l.style.visibility="visible";var n="";if(b.tracer){if(l=document.getElementById("easycoder-tracer-content")){b.tracer.variables.forEach(function(a,c,
    94 d){var e=b.getSymbolRecord(a);if(1<e.elements)for(n+=a+": "+e.index+"/"+e.elements+": ",a=0;a<e.elements;a++){var g=e.value[a];n=g?n+(g.content+" "):n+"undefined "}else n=(e=e.value[e.index])?n+(a+": "+e.content):n+(a+": undefined");switch(b.tracer.alignment){case "horizontal":c<d.length-1&&(n+=", ");break;case "vertical":n+="<br>"}});n+="<hr>";for(var q="",r=5;0<r;r--)f.lino&&(q+='<input type="text" name="'+r+'"'+('value="'+h[f.lino-r].line.substr(k)+'"')+'style="width:100%;border:none;enabled:false">'),
    95 q+="<br>";l.innerHTML=n+" "+q;l.style.display="block";a.run=document.getElementById("easycoder-run-button");a.step=document.getElementById("easycoder-step-button");a.run.onclick=function(a){return function(){a.run.blur();b.tracing=!1;document.getElementById("easycoder-tracer-content").style.display="none";try{e(b,b.resume)}catch(t){var c="Error in run handler: "+t.message;console.log(c);alert(c)}}}(a);a.step.onclick=function(a){return function(){console.log("step");a.step.blur();b.tracing=!0;document.getElementById("easycoder-tracer-content").style.display=
    96 "block";try{e(b,b.resume)}catch(t){var c="Error in step handler: "+t.message;console.log(c);alert(c)}}}(a)}b.resume=b.pc;b.pc=0}break}a={run:a.run,step:a.step}}};h.exports=e},{}],8:[function(d,h,f){var e={markComments:function(b){var a=b.list,c=void 0===b.index?0:b.index,d=void 0===b.inComment?!1:b.inComment,f=void 0===b.newList?[]:b.newList;if(c>=a.length)return f;var h=a[c];b=h.lino;h=h.token;var k={list:a,index:c+1,inComment:!1,newList:f.concat({lino:b,index:c,token:h})};f={list:a,index:c+1,inComment:!0,
    97 newList:f.concat({lino:b,index:c,comment:!0,token:h})};return d&&0<c&&b===a[c-1].lino?e.markComments(f):"!"===h.charAt(0)?e.markComments(f):e.markComments(k)},findStrings:function(b){var a=b.original,c=b.line,d=void 0===b.inComment?!1:b.inComment;b=void 0===b.inQuote?!1:b.inQuote;var f=c.charAt(0),h=b&&[" ","\\t"].includes(f)?"\\s":f;if(1===c.length)return h;c=c.substring(1);if("!"===f&&!b)return f+e.findStrings({original:a,line:c,inComment:!0,inQuote:!1});if("`"===f&&!d&&!b)return f+e.findStrings({original:a,
    98 line:c,inComment:d,inQuote:!0});if("`"===f&&b)return f+e.findStrings({original:a,line:c,inComment:d,inQuote:!1});if(!d&&!b&&!f.match(/[A-z0-9_\-+*/\- \t]/)){if(["'",'"'].includes(f))throw Error('Bad syntax in "'+a+'":\nStrings in EasyCoder must be enclosed in backticks.');throw Error('Unrecognised character "'+f+'" in\n"'+a+'".');}return h+e.findStrings({original:a,line:c,inComment:d,inQuote:b})},tokenise:function(b){b=b.map(function(a){var b=a.trim();return b.length?e.findStrings({original:a,line:b}):
    99 ""}).map(function(a,b){return{lino:b+1,line:a}});var a=b.map(function(a){return a.line.trim().split(/\s+/).map(function(b,c){return{lino:a.lino,index:c,token:b}})});a=[].concat.apply([],a).filter(function(a){return a.token}).map(function(a){return{lino:a.lino,index:a.index,token:a.token.split("\\s").join(" ")}});a=e.markComments({list:a}).filter(function(a){return!a.comment});return{scriptLines:b,tokens:a}}};h.exports=e},{}],9:[function(d,h,f){var e={getItem:function(b){var a=b.getToken();if(!a)return null;
    100 if("true"===a)return b.next(),{type:"boolean",content:!0};if("false"===a)return b.next(),{type:"boolean",content:!1};if("`"===a.charAt(0))return b.next(),{type:"constant",numeric:!1,content:a.substring(1,a.length-1)};if(a.charAt(0).match(/[0-9-]/)){var c=eval(a);if(Number.isInteger(c))return b.next(),{type:"constant",numeric:!0,content:c};throw Error("'"+a+"' is not an integer");}a=b.getIndex();c=$jscomp.makeIterator(Object.keys(b.domain));for(var d=c.next();!d.done;d=c.next())if(d=d.value,b.rewindTo(a),
    101 d=b.domain[d].value.compile(b))return d;return null},compile:function(b){var a=b.getToken(),c=e.getItem(b);if(!c)throw Error("Undefined value: '"+a+"'");if("cat"===b.getToken()){for(a={type:"cat",numeric:!1,parts:[c]};b.tokenIs("cat");)b.next(),a.parts.push(b.value.getItem(b));return a}return c},doValue:function(b,a){if("undefined"===typeof a.type)return b.runtimeError(b[b.pc].lino,"Undefined value (variable not initialized?)"),null;switch(a.type){case "cat":return{type:"constant",numeric:!1,content:a.parts.reduce(function(a,
    102 c){return a+e.doValue(b,c).content},"")};case "boolean":case "constant":return a;case "symbol":var c=b.getSymbolRecord(a.name);if(c.isValueHolder){if(a=c.value[c.index]){c=a.content;if(null===c||"undefined"===typeof c)a.content=a.numeric?0:"";return a}return null}return b.domain[c.domain].value.get(b,a)}return b.domain[a.domain].value.get(b,a)},constant:function(b,a){return{type:"constant",numeric:a,content:b}},evaluate:function(b,a){if(!a)return{type:"constant",numeric:!1,content:""};var c=e.doValue(b,
    103 a);if(c)return c;b.runtimeError(b[b.pc].lino,"Can't decode value: "+a)},getValue:function(b,a){return e.evaluate(b,a).content},encode:function(b,a){if(b)switch(a){case "ec":return b.replace(/'/g,"~sq~").replace(/"/g,"~dq~").replace(/\n/g,"%0a").replace(/\r/g,"%0d");case "url":return encodeURIComponent(b.replace(/\s/g,"+"));case "sanitize":return b.normalize("NFD").replace(/[\u0300-\u036f]/g,"")}return b},decode:function(b,a){if(b)switch(a){case "ec":return b.replace(/~dq~/g,'"').replace(/~sq~/g,"'").replace(/%0a/g,
    104 "\n").replace(/%0d/g,"\r");case "url":return decodeURIComponent(b).replace(/\+/g," ")}return b}};h.exports=e},{}]},{},[1]);
     18a.getTarget()+"'");return!1},nextIsSymbol:function(c){c=void 0===c?!1:c;a.next();return a.isSymbol(c)},getSymbol:function(){return b.symbols[a.getToken()]},getSymbolPc:function(){return a.getSymbol().pc},getSymbolRecord:function(){var c=b.program[a.getSymbolPc()];c.used=!0;return c},getSymbols:function(){return b.symbols},getProgram:function(){return b.program},getPc:function(){return b.program.length},getValue:function(){return a.value.compile(a)},getNextValue:function(){a.next();return a.getValue()},
     19getCondition:function(){return a.condition.compile(a)},constant:function(c,g){return a.value.constant(c,void 0===g?!1:g)},addCommand:function(a){b.program.push(e({pc:b.program.length},a))},addSymbol:function(a,g){b.symbols[a]={pc:g}},mark:function(){b.savedMark=b.index},rewind:function(){b.index=b.savedMark},rewindTo:function(a){b.index=a},completeHandler:function(){var c=a.getLino(),g=a.getPc();a.addCommand({domain:"core",keyword:"goto",lino:c,goto:0});a.compileOne();a.addCommand({domain:"core",
     20keyword:"stop",lino:c,next:0});a.getCommandAt(g).goto=a.getPc();return!0},compileVariable:function(c,g,m,d){m=void 0===m?!1:m;d=void 0===d?null:d;a.next();var p=a.getLino(),l=a.getTokens()[a.getIndex()];if(b.symbols[l.token])throw Error("Duplicate variable name '"+l.token+"'");var n=a.getPc();a.next();a.addSymbol(l.token,n);c={domain:c,keyword:g,lino:p,isSymbol:!0,used:!1,isValueHolder:m,name:l.token,elements:1,index:0,value:[{}],element:[],extra:d};"dom"===d&&(c.element=[]);a.addCommand(c);return c},
     21compileToken:function(){var c=a.getToken();if(c){a.mark();for(var g=$jscomp.makeIterator(Object.keys(a.domain)),b=g.next();!b.done;b=g.next()){if((b=a.domain[b.value])&&(b=b.getHandler(c))&&b.compile(a))return;a.rewind()}console.log("No handler found");throw Error("I don't understand '"+c+"...'");}},compileOne:function(){var c=a.getToken();if(c){b.warnings=[];var g=b.program.length;if(c.endsWith(":")){c=c.substring(0,c.length-1);if(b.symbols[c])throw Error("Duplicate symbol: '"+c+"'");b.symbols[c]=
     22{pc:g};b.index++}else a.compileToken()}},compileFromHere:function(c){for(;b.index<b.tokens.length;){var g=b.tokens[b.index].token;if("else"===g)return b.program;a.compileOne();if(-1<c.indexOf(g))break}},compile:function(c){b.tokens=c;b.index=0;b.program=[];b.symbols={};b.warnings=[];a.compileFromHere([]);a.addCommand({domain:"core",keyword:"stop",lino:a.getLino(),next:0});for(var g in b.symbols)c=b.program[b.symbols[g].pc],c.isSymbol&&!c.used&&console.log("Symbol '"+c.name+"' has not been used.");
     23return b.program}};h.exports=a},{}],4:[function(d,h,f){var e=Object.assign||function(b){for(var a=1;a<arguments.length;a++){var c=arguments[a],g;for(g in c)Object.prototype.hasOwnProperty.call(c,g)&&(b[g]=c[g])}return b};h.exports={compile:function(b){b.mark();for(var a=$jscomp.makeIterator(Object.keys(b.domain)),c=a.next();!c.done;c=a.next()){if(c=b.domain[c.value].condition.compile(b))return e({domain:name},c);b.rewind()}},test:function(b,a){return b.domain[a.domain].condition.test(b,a)}}},{}],
     245:[function(d,h,f){var e=this,b={Add:{compile:function(a){var c=a.getLino();a.next();var g=a.getValue();if(a.tokenIs("to"))if(a.next(),a.isSymbol()){var b=a.getSymbol();if(a.getCommandAt(b.pc).isValueHolder){if("giving"===a.peek()){b=a.getValue();a.next();var d=a.getToken();a.next();a.addCommand({domain:"core",keyword:"add",lino:c,value1:g,value2:b,target:d})}else b=a.getToken(),a.next(),a.addCommand({domain:"core",keyword:"add",lino:c,value1:g,target:b});return!0}a.warning("core "+e.name+": Expected value holder")}else{b=
     25a.getValue();if(a.tokenIs("giving"))return a.next(),d=a.getToken(),a.next(),a.addCommand({domain:"core",keyword:"add",lino:c,value1:g,value2:b,target:d}),!0;a.warning("core "+e.name+': Expected "giving"')}return!1},run:function(a){var c=a[a.pc],g=c.value1,b=c.value2,d=a.getSymbolRecord(c.target);if(d.isValueHolder){var e=d.value[d.index];b?(a=a.getValue(b)+a.getValue(g),d.value[d.index]={type:"constant",numeric:!0,content:a}):(e.numeric||a.nonNumericValueError(c.lino),a=e.content+a.getValue(g),d.value[d.index]=
     26{type:"constant",numeric:!0,content:a})}else a.variableDoesNotHoldAValueError(c.lino,d.name);return c.pc+1}},Alias:{compile:function(a){var c=a.getLino();a.next();if(a.isSymbol()){var g=a.getToken();a.next();if(a.tokenIs("to")&&(a.next(),a.isSymbol())){var b=a.getToken();a.next();a.addCommand({domain:"core",keyword:"alias",lino:c,alias:g,symbol:b});return!0}}return!1},run:function(a){var c=a[a.pc],g=a.symbols[c.alias].pc,b=a[g],d=a.getSymbolRecord(c.symbol);a[g]={pc:b.pc,domain:d.domain,keyword:d.keyword,
     27lino:b.lino,name:b.name,alias:c.symbol};return c.pc+1}},Begin:{compile:function(a){a.next();a.compileFromHere(["end"]);return!0},run:function(a){return a[a.pc].pc+1}},Callback:{compile:function(a){a.compileVariable("core","callback");return!0},run:function(a){return a[a.pc].pc+1}},Clear:{compile:function(a){var c=a.getLino();a.next();if(a.isSymbol()){var g=a.getSymbolRecord();if(g.isValueHolder)return g=a.getToken(),a.next(),a.addCommand({domain:"core",keyword:"clear",lino:c,symbol:g}),!0;a.warning("'Variable '"+
     28g.name+"' does not hold a value")}return!1},run:function(a){var c=a[a.pc],g=a.getSymbolRecord(c.symbol);g.isValueHolder?(a.domain[g.domain].value.put(g,{type:"boolean",content:!1}),c.numeric=!1):a.variableDoesNotHoldAValueError(c.lino,g.name);return c.pc+1}},Close:{compile:function(a){var c=a.getLino();if(a.nextIsSymbol()){var g=a.getSymbolRecord();if("module"===g.keyword)return a.next(),a.addCommand({domain:"core",keyword:"close",lino:c,module:g.name}),!0}return!1},run:function(a){var c=a[a.pc];
     29a=a.getSymbolRecord(c.module).program;a.run(a.onClose);return c.pc+1}},Debug:{compile:function(a){var c=a.getLino();if(a.nextTokenIs("program")){a.next();if(["item","pc"].includes(a.getToken())){var g=a.getNextValue();a.addCommand({domain:"core",keyword:"debug",lino:c,item:g});return!0}a.addCommand({domain:"core",keyword:"debug",lino:c,item:-1});return!0}return a.tokenIs("symbols")?(a.next(),a.addCommand({domain:"core",keyword:"debug",lino:c,item:"symbols"}),!0):a.tokenIs("symbol")?(g=a.nextToken(),
     30a.next(),a.addCommand({domain:"core",keyword:"debug",lino:c,item:"symbol",name:g}),!0):a.tokenIs("step")?(a.next(),a.addCommand({domain:"core",keyword:"debug",lino:c,item:"step"}),!0):!1},run:function(a){var c=a[a.pc],g=c.item;switch(g){case "symbols":console.log("Symbols: "+JSON.stringify(a.symbols,null,2));break;case "symbol":a=a.getSymbolRecord(c.name);g=a.exporter;delete a.exporter;console.log("Symbol: "+JSON.stringify(a,null,2));a.exporter=g;break;case "step":a.debugStep=!0;break;default:0<=
     31g.content?console.log("Debug item "+g.content+": "+JSON.stringify(a[g.content],null,2)):console.log("Debug program: "+JSON.stringify(a,null,2))}return c.pc+1}},Decode:{compile:function(a){var c=a.getLino();if(a.nextIsSymbol()){var g=a.getToken();a.next();a.addCommand({domain:"core",keyword:"decode",lino:c,symbol:g});return!0}return!1},run:function(a){var c=a[a.pc],g=a.getSymbolRecord(c.symbol);if(g.isValueHolder){var b=a.getValue(g.value[g.index]);g.value[g.index]={type:"constant",numeric:!1,content:a.decode(b)};
     32c.numeric=!1}else a.variableDoesNotHoldAValueError(c.lino,g.name);return c.pc+1}},Divide:{compile:function(a){var c=a.getLino();if(a.nextIsSymbol()){var g=a.getSymbol();var b=a.getCommandAt(g.pc).name}g=a.getValue();a.tokenIs("by")&&a.next();var d=a.getValue();if(a.tokenIs("giving")){a.next();if(a.isSymbol())return b=a.getSymbol(),b=a.getCommandAt(b.pc).name,a.next(),a.addCommand({domain:"core",keyword:"divide",lino:c,value1:g,value2:d,target:b}),!0;a.warning("core "+e.name+": Expected value holder")}else return"undefined"===
     33typeof b&&a.warning("core "+e.name+": No target variable given"),a.addCommand({domain:"core",keyword:"divide",lino:c,value2:d,target:b}),!0;return!1},run:function(a){var c=a[a.pc],g=c.value1,b=c.value2,d=a.getSymbolRecord(c.target);if(d.isValueHolder){var e=d.value[d.index];g?(a=a.getValue(g)/a.getValue(b),d.value[d.index]={type:"constant",numeric:!0,content:Math.trunc(a)}):(e.numeric||a.nonNumericValueError(c,lino),a=e.content/a.getValue(b),d.value[d.index]={type:"constant",numeric:!0,content:Math.trunc(a)})}else a.variableDoesNotHoldAValueError(c.lino,
     34d.name);return c.pc+1}},Encode:{compile:function(a){var c=a.getLino();a.next();if(a.isSymbol()){var b=a.getToken();a.next();a.addCommand({domain:"core",keyword:"encode",lino:c,symbol:b});return!0}return!1},run:function(a){var c=a[a.pc],b=a.getSymbolRecord(c.symbol);if(b.isValueHolder){var d=a.getValue(b.value[b.index]);b.value[b.index]={type:"constant",numeric:!1,content:a.encode(d)};c.numeric=!1}else a.variableDoesNotHoldAValueError(c.lino,b.name);return c.pc+1}},End:{compile:function(a){a.next();
     35return!0},run:function(){return 0}},Fork:{compile:function(a){var c=a.getLino();a.next();a.nextTokenIs("to")&&a.next();var b=a.getToken();a.next();a.addCommand({domain:"core",keyword:"fork",lino:c,label:b});return!0},run:function(a){var c=a[a.pc];try{a.run(a.symbols[c.label].pc)}catch(g){console.log(g.message),alert(g.message)}return c.pc+1}},Go:{compile:function(a){var c=a.getLino();a.nextTokenIs("to")&&a.next();var b=a.getToken();a.next();a.addCommand({domain:"core",keyword:"go",lino:c,label:b});
     36return!0},run:function(a){var c=a[a.pc];if(c.label){if(a.verifySymbol(c.label)){var b=a.symbols[c.label];if(b)return b.pc}a.runtimeError(c.lino,"Unknown symbol '"+c.label+"'");return 0}return c.goto}},Gosub:{compile:function(a){var c=a.getLino();a.nextTokenIs("to")&&a.next();var b=a.getToken();a.next();a.addCommand({domain:"core",keyword:"gosub",lino:c,label:b});return!0},run:function(a){var c=a[a.pc];if(a.verifySymbol(c.label))return a.stack.push(a.pc+1),a.symbols[c.label].pc;a.runtimeError(c.lino,
     37"Unknown symbol '"+c.label+"'");return 0}},If:{compile:function(a){var c=a.getLino();a.next();var b=a.condition.compile(a),d=a.getPc();a.addCommand({domain:"core",keyword:"if",lino:c,condition:b});a.compileOne();if(!a.getToken())return a.getCommandAt(d).else=a.getPc(),!0;a.tokenIs("else")?(c=a.getPc(),a.addCommand({domain:"core",keyword:"goto",goto:0}),a.getCommandAt(d).else=a.getPc(),a.next(),a.compileOne(!0),a.getCommandAt(c).goto=a.getPc()):a.getCommandAt(d).else=a.getPc();return!0},run:function(a){var c=
     38a[a.pc];return a.condition.test(a,c.condition)?c.pc+1:c.else}},Import:{compile:function(a){var c=a.imports,b=a.getProgram();c=$jscomp.makeIterator(c);for(var d=c.next();!d.done;d=c.next()){d=d.value;var e=a.nextToken(),f=d.keyword;if(e===f){if(e=a.compileVariable(d.domain,f,!0),e=b[a.getSymbols()[e.name].pc],e.element=d.element,e.exporter=d.exporter,e.exportedName=d.name,e.extra=d.extra,e.isValueHolder=d.isValueHolder,e.imported=!0,!a.tokenIs("and"))break}else throw Error("Mismatched import variable type for '"+
     39d.name+"'");}if(a.tokenIs("and"))throw Error("Imports do not match exports");return!0},run:function(a){return a[a.pc].pc+1}},Index:{compile:function(a){var c=a.getLino();if(a.nextIsSymbol(!0)){var b=a.getToken();if(a.nextTokenIs("to")){var d=a.getNextValue();a.addCommand({domain:"core",keyword:"index",lino:c,symbol:b,value:d});return!0}}return!1},run:function(a){var c=a[a.pc],b=a.getSymbolRecord(c.symbol),d=a.getValue(c.value);d>=b.elements&&a.runtimeError(c.lino,"Array index "+d+" is out of range for '"+
     40b.name+"'");b.index=d;b.imported&&(b.exporter.getSymbolRecord(b.exportedName).index=d);return c.pc+1}},Load:{compile:function(a){var c=a.getLino();switch(a.nextToken()){case "plugin":var b=a.getNextValue();a.addCommand({domain:"core",keyword:"load",lino:c,name:b});return!0}return!1},run:function(a){var c=a[a.pc],b=a.getValue(c.name);switch(c.keyword){case "load":if(a.checkPlugin(b))return c.pc+1;EasyCoder_Plugins.getLocalPlugin(a.getPluginsPath,b,a.getPlugin,a.addLocalPlugin,function(){a.run(c.pc+
     411)});return 0}}},Module:{compile:function(a){a.compileVariable("core","module");return!0},run:function(a){a=a[a.pc];a.program=null;return a.pc+1}},Multiply:{compile:function(a){var c=a.getLino();a.next();if(a.isSymbol()){var b=a.getSymbol();var d=a.getCommandAt(b.pc).name}b=a.getValue();a.tokenIs("by")&&a.next();var e=a.getValue();if(a.tokenIs("giving")){a.next();if(a.isSymbol())return d=a.getSymbol(),d=a.getCommandAt(d.pc).name,a.next(),a.addCommand({domain:"core",keyword:"multiply",lino:c,value1:b,
     42value2:e,target:d}),!0;a.warning("core multiply: Expected value holder")}else return"undefined"===typeof d&&a.warning("core multiply: No target variable given"),a.addCommand({domain:"core",keyword:"multiply",lino:c,value2:e,target:d}),!0;return!1},run:function(a){var c=a[a.pc],b=c.value1,d=c.value2,e=a.getSymbolRecord(c.target);if(e.isValueHolder){var f=e.value[e.index];b?(a=a.getValue(b)*a.getValue(d),e.value[e.index]={type:"constant",numeric:!0,content:a}):(f.numeric||a.nonNumericValueError(c,lino),
     43a=f.content*a.getValue(d),e.value[e.index]={type:"constant",numeric:!0,content:a})}else a.variableDoesNotHoldAValueError(c.lino,e.name);return c.pc+1}},Negate:{compile:function(a){var c=a.getLino();a.next();if(a.isSymbol()){var b=a.getToken();a.next();a.addCommand({domain:"core",keyword:"negate",lino:c,symbol:b});return!0}return!1},run:function(a){var c=a[a.pc],b=a.getSymbolRecord(c.symbol);b.isValueHolder?b.value[b.index]={type:"constant",numeric:!0,content:-b.value[b.index].content}:a.variableDoesNotHoldAValueError(c.lino,
     44b.name);return c.pc+1}},On:{compile:function(a){var c=a.getLino(),b=a.nextToken();switch(b){case "trigger":case "close":case "restore":case "message":return a.next(),a.addCommand({domain:"core",keyword:"on",lino:c,action:b}),a.completeHandler()}return a.isSymbol()&&(b=a.getSymbolRecord(),"callback"===b.keyword)?(a.next(),a.addCommand({domain:"core",keyword:"on",lino:c,action:b.name}),a.completeHandler()):!1},run:function(a){var c=a[a.pc],b=c.pc+2;switch(c.action){case "trigger":a.onTrigger=b;break;
     45case "close":a.onClose=b;break;case "restore":a.onRestore=b;break;case "message":a.onMessage=b;break;default:var d=a.getSymbolRecord(c.action);if(d)d.cb=b;else return a.runtimeError(c.lino,"Unknown action '"+c.action+"'"),0}return c.pc+1}},Print:{compile:function(a){var c=a.getLino();a.next();var b=a.getValue();a.addCommand({domain:"core",keyword:"print",lino:c,value:b});return!0},run:function(a){var c=a[a.pc];a=a.getFormattedValue(c.value);console.log("-> "+a);return c.pc+1}},Put:{compile:function(a){var c=
     46a.getLino();a.next();var b=a.getValue();if(a.tokenIs("into")){a.next();if(a.isSymbol()){var d=a.getToken();a.next();a.addCommand({domain:"core",keyword:"put",lino:c,value:b,target:d});return!0}a.warning("core:put: No such variable: '"+a.getToken()+"'")}return!1},run:function(a){var c=a[a.pc],b=a.getSymbolRecord(c.target);b.isValueHolder||a.variableDoesNotHoldAValueError(c.lino,b.name);a=a.evaluate(c.value);b.value[b.index]=a;b.imported&&(b=b.exporter.getSymbolRecord(b.exportedName),b.value[b.index]=
     47a);return c.pc+1}},Replace:{compile:function(a){var c=a.getLino(),b=a.getNextValue();if(a.tokenIs("with")){var d=a.getNextValue();if(a.tokenIs("in")&&a.nextIsSymbol()){var e=a.getSymbolRecord();a.next();if(e.isValueHolder)return a.addCommand({domain:"core",keyword:"replace",lino:c,original:b,replacement:d,target:e.name}),!0}}return!1},run:function(a){var c=a[a.pc],b=a.getValue(c.original),d=a.getValue(c.replacement),e=a.getSymbolRecord(c.target);a=a.getValue(e.value[e.index]).split(b).join(d);e.value[e.index]=
     48{type:"constant",numeric:!1,content:a};return c.pc+1}},Require:{compile:function(a){var c=a.getLino(),b=a.getNextValue();a.addCommand({domain:"core",keyword:"require",lino:c,url:b});return!0},run:function(a){var c=a[a.pc];a.require(a,a.getValue(c.url),function(){a.run(c.pc+1)});return 0}},Return:{compile:function(a){var c=a.getLino();a.next();a.addCommand({domain:"core",keyword:"return",lino:c});return!0},run:function(a){return a.stack.pop()}},Run:{compile:function(a){var c=a.getLino(),b=a.getNextValue(),
     49d=[];if(a.tokenIs("with"))for(;;)if(a.nextIsSymbol(!0)){var e=a.getSymbolRecord();e.exporter=a.getProgram();d.push(e);a.next();if(!a.tokenIs("and"))break}if(a.tokenIs("as")&&a.nextIsSymbol(!0)){e=a.getSymbolRecord();a.next();if("module"!==e.keyword)throw Error("'"+e.name+"' is not a module");var f=e.name}a.addCommand({domain:"core",keyword:"run",lino:c,script:b,imports:d,module:f});return!0},run:function(a){a.nextPc=a.pc+1;a.runScript(a);return 0}},Sanitize:{compile:function(a){var c=a.getLino();
     50if(a.nextIsSymbol()){var b=a.getToken();a.next();a.addCommand({domain:"core",keyword:"sanitize",lino:c,name:b});return!0}return!1},run:function(a){var c=a[a.pc];a=a.getSymbolRecord(c.name);a=a.value[a.index];a.content=JSON.stringify(JSON.parse(a.content));return c.pc+1}},Script:{compile:function(a){var c=a.getLino(),b=a.nextToken();a.next();a.addCommand({domain:"core",keyword:"script",lino:c,name:b});return!0},run:function(a){var c=a[a.pc];a.script=c.name;EasyCoder.scripts[c.name]=a;console.log(Date.now()-
     51EasyCoder.timestamp+" ms: Script: "+c.name);return c.pc+1}},Send:{compile:function(a){var c=a.getLino(),b="";a.nextTokenIs("to")||(b=a.getValue());if(a.tokenIs("to")){if(a.nextTokenIs("parent"))var d="parent";else if(a.isSymbol){d=a.getSymbolRecord();if("module"!==d.keyword)throw Error("'"+d.name+"' is not a module");d=d.name}a.next();a.addCommand({domain:"core",keyword:"send",lino:c,message:b,recipient:d})}return!0},run:function(a){var c=a[a.pc],b=a.getValue(c.message);if("parent"===c.recipient){var d=
     52a.parent;d&&a.parent.onMessage&&(d.message=b,d.run(d.onMessage))}else a=a.getSymbolRecord(c.recipient),a.program.message=b,a.program.run(a.program.onMessage);return c.pc+1}},Set:{compile:function(a){var c=a.getLino();if(a.nextIsSymbol()){var b=a.getSymbolRecord();if(!b.isValueHolder)return!1;if(a.nextTokenIs("to")){a.next();for(var d=[];;){a.mark();try{d.push(a.getValue())}catch(k){a.rewind();break}}a.addCommand({domain:"core",keyword:"set",lino:c,request:"setArray",target:b.name,value:d});return!0}a.addCommand({domain:"core",
     53keyword:"set",lino:c,request:"setBoolean",target:b.name});return!0}if(a.tokenIs("ready"))return a.next(),a.addCommand({domain:"core",keyword:"set",lino:c,request:"setReady"}),!0;if(a.tokenIs("property")&&(b=a.getNextValue(),a.tokenIs("of")&&a.nextIsSymbol()&&(d=a.getSymbolRecord(),"variable"===d.keyword&&a.nextTokenIs("to")))){var e=a.getNextValue();a.addCommand({domain:"core",keyword:"set",lino:c,request:"setProperty",target:d.name,name:b,value:e});return!0}a.tokenIs("the")&&a.next();if(a.tokenIs("elements")&&
     54(a.next(),a.tokenIs("of"))){a.next();if(!a.isSymbol())throw Error("Unknown variable '"+a.getToken()+"'");b=a.getToken();a.next();if(a.tokenIs("to"))return a.next(),d=a.getValue(),a.addCommand({domain:"core",keyword:"set",lino:c,request:"setElements",symbol:b,value:d}),!0}if(a.tokenIs("encoding")){if(a.nextTokenIs("to"))return b=a.getNextValue(),a.addCommand({domain:"core",keyword:"set",request:"encoding",lino:c,encoding:b}),!0;a.addWarning("Unknown encoding option");return!1}return a.tokenIs("payload")&&
     55a.nextTokenIs("of")&&a.nextIsSymbol()&&(b=a.getSymbolRecord(),"callback"===b.keyword&&a.nextTokenIs("to"))?(d=a.getNextValue(),a.addCommand({domain:"core",keyword:"set",request:"setPayload",lino:c,callback:b.name,payload:d}),!0):!1},run:function(a){var c=a[a.pc];switch(c.request){case "setBoolean":var b=a.getSymbolRecord(c.target);b.isValueHolder?(b.value[b.index]={type:"boolean",content:!0},c.numeric=!1):a.variableDoesNotHoldAValueError(c.lino,b.name);break;case "setReady":a.parent.run(a.parent.nextPc);
     56break;case "setElements":b=a.getSymbolRecord(c.symbol);b.elements=a.getValue(c.value);b.index=0;b.value=[];b.element=[];for(a=0;a<b.elements;a++)b.value.push({}),b.element.push({});break;case "setArray":b=a.getSymbolRecord(c.target);b.elements=c.value.length;b.value=c.value;break;case "encoding":a.encoding=a.getValue(c.encoding);break;case "setProperty":b=a.getSymbolRecord(c.target);var d=a.getValue(b.value[b.index]);d||(d="{}");var e="";try{e=JSON.parse(d)}catch(k){return a.runtimeError(c.lino,"Can't parse "+
     57b.name),0}d=a.getValue(c.name);if(a=a.evaluate(c.value))e[d]="boolean"===a.type?a.content:a.numeric?a.content:'{"'===a.content.substr(0,2)?JSON.parse(a.content):a.content.split('"').join('\\"'),b.value[b.index]={type:"constant",numeric:!1,content:JSON.stringify(e)};break;case "setPayload":a.getSymbolRecord(c.callback).payload=a.getValue(c.payload)}return c.pc+1}},Stop:{compile:function(a){var c=a.getLino();a.next();a.addCommand({domain:"core",keyword:"stop",lino:c,next:0});return!0},run:function(){return 0}},
     58Take:{compile:function(a){var c=a.getLino();a.next();var b=a.getValue();if(a.tokenIs("from"))if(a.next(),a.isSymbol()){var d=a.getSymbol();if(a.getCommandAt(d.pc).isValueHolder){if("giving"===a.peek()){d=a.getValue();a.next();var f=a.getToken();a.next();a.addCommand({domain:"core",keyword:"take",lino:c,value1:b,value2:d,target:f})}else d=a.getToken(),a.next(),a.addCommand({domain:"core",keyword:"take",lino:c,value1:b,target:d});return!0}a.warning("core "+e.name+": Expected value holder")}else{d=a.getValue();
     59if(a.tokenIs("giving"))return a.next(),f=a.getToken(),a.next(),a.addCommand({domain:"core",keyword:"take",lino:c,value1:b,value2:d,target:f}),!0;a.warning("core "+e.name+': Expected "giving"')}return!1},run:function(a){var c=a[a.pc],b=c.value1,d=c.value2,e=a.getSymbolRecord(c.target);if(e.isValueHolder){var f=e.value[e.index];d?(a=a.getValue(d)-a.getValue(b),e.value[e.index]={type:"constant",numeric:!0,content:a}):(f.numeric||a.nonNumericValueError(c,lino),a=a.getValue(f)-a.getValue(b),e.value[e.index]=
     60{type:"constant",numeric:!0,content:a})}else a.variableDoesNotHoldAValueError(c.lino,e.name);return c.pc+1}},Toggle:{compile:function(a){var c=a.getLino();a.next();if(a.isSymbol()){var b=a.getSymbolPc();a.next();a.addCommand({domain:"core",keyword:"toggle",lino:c,symbol:b});return!0}return!1},run:function(a){var c=a[a.pc],b=a[c.symbol];if(b.isValueHolder){var d=a.domain[b.domain];a=d.value.get(a,b.value[b.index]).content;d.value.put(b,{type:"boolean",content:!a})}else a.variableDoesNotHoldAValueError(c.lino,
     61b.name);return c.pc+1}},Variable:{compile:function(a){a.compileVariable("core","variable",!0);return!0},run:function(a){return a[a.pc].pc+1}},Wait:{compile:function(a){var c=a.getLino();a.next();var b=a.getValue(a),d=1E3;switch(a.getToken()){case "milli":case "millis":a.next();d=1;break;case "tick":case "ticks":a.next();d=10;break;case "second":case "seconds":a.next();d=1E3;break;case "minute":case "minutes":a.next(),d=6E4}a.addCommand({domain:"core",keyword:"wait",lino:c,value:b,multiplier:d});return!0},
     62run:function(a){var c=a[a.pc],b=a.getValue(c.value);setTimeout(function(){a.run(c.pc+1)},b*c.multiplier);return 0}},While:{compile:function(a){var c=a.getLino();a.next();var b=a.getCondition(),d=a.getPc();a.addCommand({domain:"core",keyword:"while",lino:c,condition:b});c=a.getPc();a.addCommand({domain:"core",keyword:"goto",goto:0});a.compileOne();a.addCommand({domain:"core",keyword:"goto",goto:d});a.getCommandAt(c).goto=a.getPc();return!0},run:function(a){return a.condition.test(a,a[a.pc].condition)?
     63a.pc+2:a.pc+1}},getHandler:function(a){switch(a){case "add":return b.Add;case "alias":return b.Alias;case "begin":return b.Begin;case "callback":return b.Callback;case "clear":return b.Clear;case "close":return b.Close;case "debug":return b.Debug;case "decode":return b.Decode;case "divide":return b.Divide;case "encode":return b.Encode;case "end":return b.End;case "fork":return b.Fork;case "go":case "goto":return b.Go;case "gosub":return b.Gosub;case "if":return b.If;case "import":return b.Import;
     64case "index":return b.Index;case "load":return b.Load;case "module":return b.Module;case "multiply":return b.Multiply;case "negate":return b.Negate;case "on":return b.On;case "print":return b.Print;case "put":return b.Put;case "replace":return b.Replace;case "require":return b.Require;case "return":return b.Return;case "run":return b.Run;case "sanitize":return b.Sanitize;case "script":return b.Script;case "send":return b.Send;case "set":return b.Set;case "stop":return b.Stop;case "take":return b.Take;
     65case "toggle":return b.Toggle;case "variable":return b.Variable;case "wait":return b.Wait;case "while":return b.While;default:return!1}},run:function(a){var c=a[a.pc],d=b.getHandler(c.keyword);d||a.runtimeError(c.lino,"Unknown keyword '"+c.keyword+"' in 'core' package");return d.run(a)},isNegate:function(a){return"not"===a.getToken()?(a.next(),!0):!1},value:{compile:function(a){if(a.isSymbol()){var c=a.getToken();switch(a.getSymbolRecord().keyword){case "module":return a.next(),{domain:"core",type:"module",
     66name:c};case "variable":var b=a.nextToken();return["format","modulo"].includes(b)?(a=a.getNextValue(),{domain:"core",type:b,name:c,value:a}):{domain:"core",type:"symbol",name:c}}return null}c=a.getToken();if("true"===c)return a.next(),{domain:"core",type:"boolean",content:!0};if("false"===c)return a.next(),{domain:"core",type:"boolean",content:!1};if("random"===c)return a.next(),{domain:"core",type:"random",range:a.getValue()};if("cos"===c)return a.next(),c=a.getValue(),a.skip("radius"),a=a.getValue(),
     67{domain:"core",type:"cos",angle_c:c,radius_c:a};if("sin"===c)return a.next(),c=a.getValue(),a.skip("radius"),a=a.getValue(),{domain:"core",type:"sin",angle_s:c,radius_s:a};if("tan"===c)return a.next(),c=a.getValue(),a.skip("radius"),a=a.getValue(),{domain:"core",type:"tan",angle_t:c,radius_t:a};if("empty"===c)return a.next(),{domain:"core",type:"empty"};if("now"===c)return a.next(),{domain:"core",type:"now"};if("newline"===c)return a.next(),{domain:"core",type:"newline"};if("break"===c)return a.next(),
     68{domain:"core",type:"break"};if("encode"===c)return a.next(),{domain:"core",type:"encode",value:a.getValue()};if("decode"===c)return a.next(),{domain:"core",type:"decode",value:a.getValue()};if("lowercase"===c)return a.next(),{domain:"core",type:"lowercase",value:a.getValue()};if("element"===c)return c=a.getNextValue(),a.tokenIs("of")&&a.nextIsSymbol()&&(b=a.getSymbolRecord(),a.next(),"variable"===b.keyword)?{domain:"core",type:"element",element:c,symbol:b.name}:null;if("property"===c)return c=a.getNextValue(),
     69a.tokenIs("of")&&a.nextIsSymbol()&&(b=a.getSymbolRecord(),a.next(),"variable"===b.keyword)?{domain:"core",type:"property",property:c,symbol:b.name}:null;a.tokenIs("the")&&a.next();c=a.getToken();switch(c){case "elements":case "index":if(a.nextTokenIs("of")&&a.nextIsSymbol())return b=a.getToken(),a.next(),{domain:"core",type:c,name:b};break;case "value":if(a.nextTokenIs("of"))return a.next(),{domain:"core",type:"valueOf",value:a.getValue()};break;case "length":if(a.nextTokenIs("of"))return a.next(),
     70{domain:"core",type:"lengthOf",value:a.getValue()};break;case "left":case "right":b=a.getNextValue();if(a.tokenIs("of"))return a=a.getNextValue(),{domain:"core",type:c,count:b,value:a};break;case "from":b=a.getNextValue();var d=a.tokenIs("to")?a.getNextValue():null;if(a.tokenIs("of"))return a=a.getNextValue(),{domain:"core",type:c,from:b,to:d,value:a};break;case "position":if(a.nextTokenIs("of")&&(c=!1,a.nextTokenIs("the")&&a.nextTokenIs("last")&&(a.next(),c=!0),b=a.getValue(),a.tokenIs("in")))return a=
     71a.getNextValue(),{domain:"core",type:"position",needle:b,haystack:a,last:c};break;case "payload":if(a.nextTokenIs("of")&&a.nextIsSymbol()&&(c=a.getSymbolRecord(),"callback"===c.keyword))return a.next(),{domain:"core",type:"payload",callback:c.name};break;case "message":case "error":return a.next(),{domain:"core",type:c}}return null},get:function(a,c){switch(c.type){case "boolean":return{type:"boolean",numeric:!1,content:c.content};case "elements":return{type:"constant",numeric:!0,content:a.getSymbolRecord(c.name).elements};
     72case "index":return{type:"constant",numeric:!0,content:a.getSymbolRecord(c.name).index};case "random":return a=a.evaluate(c.range),{type:"constant",numeric:!0,content:Math.floor(Math.random()*a.content)};case "cos":var b=a.getValue(c.angle_c);a=a.getValue(c.radius_c);return{type:"constant",numeric:!0,content:parseInt(Math.cos(.01745329*parseFloat(b))*a,10)};case "sin":return b=a.getValue(c.angle_s),a=a.getValue(c.radius_s),{type:"constant",numeric:!0,content:parseInt(Math.sin(.01745329*parseFloat(b))*
     73a,10)};case "tan":return b=a.getValue(c.angle_t),a=a.getValue(c.radius_t),{type:"constant",numeric:!0,content:parseInt(Math.tan(.01745329*parseFloat(b))*a,10)};case "valueOf":return a=parseInt(a.getValue(c.value)),{type:"constant",numeric:!0,content:a?a:0};case "lengthOf":return{type:"constant",numeric:!0,content:a.getValue(c.value).length};case "left":return{type:"constant",numeric:!1,content:a.getValue(c.value).substr(0,a.getValue(c.count))};case "right":return{type:"constant",numeric:!1,content:a.getValue(c.value).substr(rstr.length-
     74a.getValue(c.count))};case "from":b=a.getValue(c.from);var d=c.to?a.getValue(c.to):null;a=a.getValue(c.value);return{type:"constant",numeric:!1,content:d?a.substr(b,d):a.substr(b)};case "position":return b=a.getValue(c.needle),a=a.getValue(c.haystack),{type:"constant",numeric:!0,content:c.last?a.lastIndexOf(b):a.indexOf(b)};case "payload":return{type:"constant",numeric:!1,content:a.getSymbolRecord(c.callback).payload};case "modulo":return b=a.getSymbolRecord(c.name),a=a.evaluate(c.value),{type:"constant",
     75numeric:!0,content:b.value[b.index].content%a.content};case "format":d=a.getSymbolRecord(c.name);d=1E3*a.getValue(d.value[d.index]);try{switch(b=JSON.parse(a.getValue(c.value)),b.mode){case "date":return{type:"constant",numeric:!0,content:(new Date(d)).toLocaleDateString(b.locale,b.options)}}}catch(p){a.runtimeError(a[a.pc].lino,"Can't parse "+c.value)}break;case "empty":return{type:"constant",numeric:!1,content:""};case "now":return{type:"constant",numeric:!0,content:Date.now()/1E3};case "newline":return{type:"constant",
     76numeric:!1,content:"\n"};case "break":return{type:"constant",numeric:!1,content:"<br />"};case "encode":return{type:"constant",numeric:!1,content:a.encode(a.getValue(c.value))};case "decode":return{type:"constant",numeric:!1,content:a.decode(a.getValue(c.value))};case "lowercase":return{type:"constant",numeric:!1,content:a.getValue(c.value).toLowerCase()};case "element":b=a.getValue(c.element);c=a.getSymbolRecord(c.symbol);d="";try{d=JSON.parse(a.getValue(c.value[c.index]))[b]}catch(p){a.runtimeError(command.lino,
     77"Can't parse JSON");break}return{type:"constant",numeric:!1,content:"object"===typeof d?JSON.stringify(d):d};case "property":b=a.getValue(c.property);c=a.getSymbolRecord(c.symbol);a=a.getValue(c.value[c.index]);c="";if(b&&a)if("object"===typeof a)c=a[b];else if("{"===a.charAt(0))try{c=JSON.parse(a)[b]}catch(p){console.log("Can't parse '"+a+"': "+p.message)}return{type:"constant",numeric:Number.isInteger(c),content:"object"===typeof c?JSON.stringify(c):c};case "module":return{type:"boolean",numeric:!1,
     78content:a.getSymbolRecord(c.name).program};case "message":return c=a.message,{type:"constant",numeric:!1,content:c};case "error":return c=a.errorMessage,{type:"constant",numeric:!1,content:c}}return null},put:function(a,c){a.value[a.index]=c}},condition:{compile:function(a){if(a.tokenIs("not"))return a.next(),{domain:"core",type:"not",value:a.getValue()};try{var c=a.getValue();if("is"===a.getToken()){a.next();var d=b.isNegate(a);switch(a.getToken()){case "numeric":return a.next(),{domain:"core",type:"numeric",
     79value1:c};case "even":return a.next(),{domain:"core",type:"even",value1:c};case "odd":return a.next(),{domain:"core",type:"odd",value1:c};case "greater":a.next();if(a.tokenIs("than")){a.next();var e=a.getValue();return{domain:"core",type:"greater",value1:c,value2:e,negate:d}}break;case "less":a.next();if(a.tokenIs("than")){a.next();var f=a.getValue();return{domain:"core",type:"less",value1:c,value2:f,negate:d}}break;default:var h=a.getValue();return{domain:"core",type:"is",value1:c,value2:h,negate:d}}}else if(c)return{domain:"core",
     80type:"boolean",value:c}}catch(l){return a.warning("Can't get a value"),0}return null},test:function(a,c){switch(c.type){case "boolean":return a.getValue(c.value);case "numeric":return Number.isInteger(a.getValue(c.value1));case "even":return 0===a.getValue(c.value1)%2;case "odd":return 1===a.getValue(c.value1)%2;case "is":return a=a.compare(a,c.value1,c.value2),c.negate?0!==a:0===a;case "greater":return a=a.compare(a,c.value1,c.value2),c.negate?0>=a:0<a;case "less":return a=a.compare(a,c.value1,c.value2),
     81c.negate?0<=a:0>a;case "not":return!a.getValue(c.value)}return!1}}};h.exports=b},{}],6:[function(d,h,f){var e=this,b=d("./Tokenise"),a=d("./Compile"),c=d("./Run"),g=d("./Value"),m=d("./Condition"),p=d("./Compare"),k={domain:{core:d("./Core")},setupTracer:function(){var a=document.getElementById("easycoder-tracer");a&&(a.innerHTML='<div><input id="easycoder-run-button" type="button" value="Run" /><input id="easycoder-step-button" type="button" value="Step" /><div id="easycoder-tracer-content" style="border:1px solid black;padding:4px";width:100%></div>',
     82a.style.display="none")},runtimeError:function(a,c){this.lino=a;this.reportError({message:"Line "+(0<=a?a:"")+": "+c},k.program)},nonNumericValueError:function(a){this.runtimeError(a,"Non-numeric value")},variableDoesNotHoldAValueError:function(a,c){this.runtimeError(a,"Variable '"+c+"' does not hold a value")},reportError:function(c,b,d){if(c.message)if(this.compiling||b){d=d?d:b.source;var e=d.tokens;d=d.scriptLines;e=this.compiling?e[a.getIndex()].lino:b[b.pc].lino;b=this.compiling?"Compile error":
     83"Runtime error in '"+b.script+"'";b+=":\n";var g=e-5;for(g=0>g?0:g;g<e;g++){var l=(""+(g+1)).padStart(4," ");b+=l+" "+d[g].line.split("\\s").join(" ")+"\n"}b+=c.message+"\n";c=a.getWarnings();if(c.length)for(b+="Warnings:\n",c=$jscomp.makeIterator(c),d=c.next();!d.done;d=c.next())b+=d.value+"\n";console.log(b);alert(b);k.aborted=!0}else c="Error: "+c.message,alert(c),console.log(c);else console.log("An error occurred - origin was "+c.path[0])},getSymbolRecord:function(a){a=this[this.symbols[a].pc];
     84return a.alias?this.getSymbolRecord(a.alias):a.exporter&&a.exporter!=this?a.exporter.getSymbolRecord(a.exportedName):a},verifySymbol:function(a){return this.symbols.hasOwnProperty(a)},encode:function(a){return g.encode(a,this.encoding)},decode:function(a){return g.decode(a,this.encoding)},evaluate:function(a){return g.evaluate(this,a)},getValue:function(a){return g.getValue(this,a)},getFormattedValue:function(a){a=g.evaluate(this,a);return a.numeric?a.content:'{"'===a.content.substr(0,2)||"["===a.content.charAt(0)?
     85JSON.stringify(JSON.parse(a.content),null,2):a.content},getSimpleValue:function(a){return!0===a||!1===a?{type:"boolean",content:a}:{type:"constant",numeric:Number.isInteger(a),content:a}},run:function(a){a&&(k.program=this,c(this,a))},trigger:function(){this.onTrigger&&c(this,this.onTrigger)},register:function(a){k.program=a},require:function(a,c,b){a=document.createElement("script");a.type="text/javascript";a.src=c;a.onload=function(){console.log(Date.now()-k.timestamp+" ms: Library "+c+" loaded");
     86b()};document.head.appendChild(a)},isUndefined:function(a){return"undefined"===typeof a},runScript:function(a){var c=a[a.pc],b=a.getValue(c.script),d=c.imports;a=c.module?a.getSymbolRecord(c.module):null;k.tokeniseScript(b.split("\n"),d,a,this)},close:function(){},compileScript:function(c,b,d,e){var f=c.tokens;this.compiling=!0;var h=Date.now();a.value=g;a.condition=m;a.domain=k.domain;a.imports=b;b=a.compile(f);var l=Date.now();console.log(l-k.timestamp+" ms: Compiled "+f.length+" tokens in "+(l-
     87h+" ms"));this.compiling=!1;b.EasyCoder=k;b.value=g;b.condition=m;b.compare=p;b.source=c;b.run=this.run;b.runScript=this.runScript;b.evaluate=this.evaluate;b.getValue=this.getValue;b.getFormattedValue=this.getFormattedValue;b.getSimpleValue=this.getSimpleValue;b.encode=this.encode;b.decode=this.decode;b.domain=this.domain;b.trigger=this.trigger;b.require=this.require;b.isUndefined=this.isUndefined;b.checkPlugin=this.checkPlugin;b.getPlugin=this.getPlugin;b.addLocalPlugin=this.addLocalPlugin;b.getPluginsPath=
     88this.getPluginsPath;b.getSymbolRecord=this.getSymbolRecord;b.verifySymbol=this.verifySymbol;b.runtimeError=this.runtimeError;b.nonNumericValueError=this.nonNumericValueError;b.variableDoesNotHoldAValueError=this.variableDoesNotHoldAValueError;b.reportError=this.reportError;b.register=this.register;b.symbols=a.getSymbols();b.encoding="ec";b.popups=[];b.stack=[];b.queue=[0];b.module=d;b.parent=e;d&&(d.program=b);return b},tokeniseScript:function(a,d,e,g){var f=null,h=Date.now();a=b.tokenise(a);var l=
     89Date.now();console.log(l-k.timestamp+" ms: Tokenised "+a.scriptLines.length+" lines in "+(l-h+" ms"));try{f=k.compileScript(a,d,e,g)}catch(u){"stop"!==u.message&&this.reportError(u,k.program,a)}this.setupTracer();f&&c(f,0)},tokenize:function(a){var b=a.split("\n");if(!e.tokenising){try{k.tokeniseScript(b)}catch(q){k.reportError(q,null,a)}e.tokenising=!0}},setPluginCount:function(a){e.plugins=[];e.pluginCount=a},checkPlugin:function(a){return k.domain[a]},getPlugin:function(a,b,c){k.domain[a]?c():
     90(a=document.createElement("script"),a.type="text/javascript",a.src=b,a.onload=function(){console.log(Date.now()-k.timestamp+" ms: Plugin "+b+" loaded");c()},document.head.appendChild(a))},addGlobalPlugin:function(a,b){e.plugins.push({name:a,handler:b});e.plugins.length===e.pluginCount&&(e.plugins.forEach(function(a){k.domain[a.name]=a.handler}),k.tokenize(e.source))},addLocalPlugin:function(a,b,c){k.domain[a]=b;c()},getPluginsPath:function(){return k.pluginsPath},loadPluginJs:function(a){console.log(Date.now()-
     91k.timestamp+" ms: Load "+a+"/easycoder/plugins.js");var b=document.createElement("script");b.src=""+window.location.origin+a+"/easycoder/plugins.js";b.type="text/javascript";b.onload=function(){EasyCoder_Plugins.getGlobalPlugins(k.timestamp,a,k.setPluginCount,k.getPlugin,k.addGlobalPlugin)};b.onerror=function(){a?k.loadPluginJs(a.slice(0,a.lastIndexOf("/"))):k.reportError({message:"Can't load plugins.js"},k.program,e.source)};document.head.appendChild(b);k.pluginsPath=a},start:function(a){e.source=
     92a;a=window.location.pathname;a.endsWith("/")&&(a=a.slice(0,-1));k.loadPluginJs(a)}};h.exports=k},{"./Compare":2,"./Compile":3,"./Condition":4,"./Core":5,"./Run":7,"./Tokenise":8,"./Value":9}],7:[function(d,h,f){var e=function(b,a){var c=[],d=function(a){var b=9999;a.forEach(function(a){a=a.line;for(var c=0;c<a.length&&" "===a[c];)c++;0<c&&c<b&&(b=c)});return 0};if(c.length)c.push(a);else for(b.register(b),c.push(a);0<c.length&&!EasyCoder.aborted;)for(b.pc=c.shift(),b.watchdog=0,a={};;){if(1E6<b.watchdog){b.lino=
     93b[b.pc].lino;b.reportError(Error("Program runaway intercepted.\nHave you forgotten to increment a loop counter?",b),b);break}b.watchdog++;var f=b[b.pc].domain;b.debugStep&&console.log(b.script+" "+b.pc+" "+f+":"+b[b.pc].keyword);var h=b.domain[f];if(!h){b.runtimeError(b[b.pc].lino,"Unknown domain '"+f+"'");break}b.pc=h.run(b);if(!b.pc)break;if(b.stop){b.tracing=!1;return}if(b.tracing){f=b[b.pc];h=b.source.scriptLines;var k=d(h),l=document.getElementById("easycoder-tracer");if(!l){b.runtimeError(f.lino,
     94"Element 'easycoder-tracer' was not found");return}l.style.display="block";l.style.visibility="visible";var n="";if(b.tracer){if(l=document.getElementById("easycoder-tracer-content")){b.tracer.variables.forEach(function(a,c,d){var e=b.getSymbolRecord(a);if(1<e.elements)for(n+=a+": "+e.index+"/"+e.elements+": ",a=0;a<e.elements;a++){var g=e.value[a];n=g?n+(g.content+" "):n+"undefined "}else n=(e=e.value[e.index])?n+(a+": "+e.content):n+(a+": undefined");switch(b.tracer.alignment){case "horizontal":c<
     95d.length-1&&(n+=", ");break;case "vertical":n+="<br>"}});n+="<hr>";for(var q="",r=5;0<r;r--)f.lino&&(q+='<input type="text" name="'+r+'"'+('value="'+h[f.lino-r].line.substr(k)+'"')+'style="width:100%;border:none;enabled:false">'),q+="<br>";l.innerHTML=n+" "+q;l.style.display="block";a.run=document.getElementById("easycoder-run-button");a.step=document.getElementById("easycoder-step-button");a.run.onclick=function(a){return function(){a.run.blur();b.tracing=!1;document.getElementById("easycoder-tracer-content").style.display=
     96"none";try{e(b,b.resume)}catch(t){var c="Error in run handler: "+t.message;console.log(c);alert(c)}}}(a);a.step.onclick=function(a){return function(){console.log("step");a.step.blur();b.tracing=!0;document.getElementById("easycoder-tracer-content").style.display="block";try{e(b,b.resume)}catch(t){var c="Error in step handler: "+t.message;console.log(c);alert(c)}}}(a)}b.resume=b.pc;b.pc=0}break}a={run:a.run,step:a.step}}};h.exports=e},{}],8:[function(d,h,f){var e={markComments:function(b){var a=b.list,
     97c=void 0===b.index?0:b.index,d=void 0===b.inComment?!1:b.inComment,f=void 0===b.newList?[]:b.newList;if(c>=a.length)return f;var h=a[c];b=h.lino;h=h.token;var k={list:a,index:c+1,inComment:!1,newList:f.concat({lino:b,index:c,token:h})};f={list:a,index:c+1,inComment:!0,newList:f.concat({lino:b,index:c,comment:!0,token:h})};return d&&0<c&&b===a[c-1].lino?e.markComments(f):"!"===h.charAt(0)?e.markComments(f):e.markComments(k)},findStrings:function(b){var a=b.original,c=b.line,d=void 0===b.inComment?
     98!1:b.inComment;b=void 0===b.inQuote?!1:b.inQuote;var f=c.charAt(0),h=b&&[" ","\\t"].includes(f)?"\\s":f;if(1===c.length)return h;c=c.substring(1);if("!"===f&&!b)return f+e.findStrings({original:a,line:c,inComment:!0,inQuote:!1});if("`"===f&&!d&&!b)return f+e.findStrings({original:a,line:c,inComment:d,inQuote:!0});if("`"===f&&b)return f+e.findStrings({original:a,line:c,inComment:d,inQuote:!1});if(!d&&!b&&!f.match(/[A-z0-9_\-+*/\- \t]/)){if(["'",'"'].includes(f))throw Error('Bad syntax in "'+a+'":\nStrings in EasyCoder must be enclosed in backticks.');
     99throw Error('Unrecognised character "'+f+'" in\n"'+a+'".');}return h+e.findStrings({original:a,line:c,inComment:d,inQuote:b})},tokenise:function(b){b=b.map(function(a){var b=a.trim();return b.length?e.findStrings({original:a,line:b}):""}).map(function(a,b){return{lino:b+1,line:a}});var a=b.map(function(a){return a.line.trim().split(/\s+/).map(function(b,c){return{lino:a.lino,index:c,token:b}})});a=[].concat.apply([],a).filter(function(a){return a.token}).map(function(a){return{lino:a.lino,index:a.index,
     100token:a.token.split("\\s").join(" ")}});a=e.markComments({list:a}).filter(function(a){return!a.comment});return{scriptLines:b,tokens:a}}};h.exports=e},{}],9:[function(d,h,f){var e={getItem:function(b){var a=b.getToken();if(!a)return null;if("true"===a)return b.next(),{type:"boolean",content:!0};if("false"===a)return b.next(),{type:"boolean",content:!1};if("`"===a.charAt(0))return b.next(),{type:"constant",numeric:!1,content:a.substring(1,a.length-1)};if(a.charAt(0).match(/[0-9-]/)){var c=eval(a);
     101if(Number.isInteger(c))return b.next(),{type:"constant",numeric:!0,content:c};throw Error("'"+a+"' is not an integer");}a=b.getIndex();c=$jscomp.makeIterator(Object.keys(b.domain));for(var d=c.next();!d.done;d=c.next())if(d=d.value,b.rewindTo(a),d=b.domain[d].value.compile(b))return d;return null},compile:function(b){var a=b.getToken(),c=e.getItem(b);if(!c)throw Error("Undefined value: '"+a+"'");if("cat"===b.getToken()){for(a={type:"cat",numeric:!1,parts:[c]};b.tokenIs("cat");)b.next(),a.parts.push(b.value.getItem(b));
     102return a}return c},doValue:function(b,a){if("undefined"===typeof a.type)return b.runtimeError(b[b.pc].lino,"Undefined value (variable not initialized?)"),null;switch(a.type){case "cat":return{type:"constant",numeric:!1,content:a.parts.reduce(function(a,c){return a+e.doValue(b,c).content},"")};case "boolean":case "constant":return a;case "symbol":var c=b.getSymbolRecord(a.name);if(c.isValueHolder){if(a=c.value[c.index]){c=a.content;if(null===c||"undefined"===typeof c)a.content=a.numeric?0:"";return a}return null}return b.domain[c.domain].value.get(b,
     103a)}return b.domain[a.domain].value.get(b,a)},constant:function(b,a){return{type:"constant",numeric:a,content:b}},evaluate:function(b,a){if(!a)return{type:"constant",numeric:!1,content:""};var c=e.doValue(b,a);if(c)return c;b.runtimeError(b[b.pc].lino,"Can't decode value: "+a)},getValue:function(b,a){return e.evaluate(b,a).content},encode:function(b,a){if(b)switch(a){case "ec":return b.replace(/'/g,"~sq~").replace(/"/g,"~dq~").replace(/\n/g,"%0a").replace(/\r/g,"%0d");case "url":return encodeURIComponent(b.replace(/\s/g,
     104"+"));case "sanitize":return b.normalize("NFD").replace(/[\u0300-\u036f]/g,"")}return b},decode:function(b,a){if(b)switch(a){case "ec":return b.replace(/~dq~/g,'"').replace(/~sq~/g,"'").replace(/%0a/g,"\n").replace(/%0d/g,"\r");case "url":return decodeURIComponent(b).replace(/\+/g," ")}return b}};h.exports=e},{}]},{},[1]);
  • easycoder/trunk/easycoder.js

    r2060989 r2076820  
    171171
    172172    getSymbolRecord: () => {
    173         return _this.program[EasyCoder_Compiler.getSymbolPc()];
     173        const record = _this.program[EasyCoder_Compiler.getSymbolPc()];
     174        record.used = true;
     175        return record;
    174176    },
    175177
     
    267269            lino,
    268270            isSymbol: true,
     271            used: false,
    269272            isValueHolder,
    270273            name: item.token,
     
    357360        });
    358361        //    console.log('Symbols: ' + JSON.stringify(this.symbols, null, 2));
     362        for (const symbol in _this.symbols) {
     363            const record = _this.program[_this.symbols[symbol].pc];
     364            if (record.isSymbol && !record.used) {
     365                console.log(`Symbol '${record.name}' has not been used.`);
     366            }
     367        }
    359368        return _this.program;
    360369    }
  • easycoder/trunk/easycoder.php

    r2060989 r2076820  
    44  * Plugin URI: https://easycoder.software
    55  * Description: Control the appearance and behavior of your posts and pages by embedding simple English-like scripts, without the need to learn JavaScript.
    6   * Version: 2.2.2
     6  * Version: 2.2.3
    77  * Author: EasyCoder Software
    88  * Author URI: https://easycoder.software
     
    1717  function easycoder_enqueue_script() {   
    1818    wp_enqueue_script('easycoder_script', plugin_dir_url( __FILE__ )
    19             . 'easycoder-min.js', array(), '2.2.2');
     19            . 'easycoder-min.js', array(), '2.2.3');
    2020  }
    2121 
  • easycoder/trunk/plugins/browser.js

    r2052097 r2076820  
    4444                const symbol = compiler.getProgram()[compiler.getSymbol().pc];
    4545                switch (symbol.keyword) {
     46                case `blockquote`:
    4647                case `button`:
    4748                case `div`:
     
    6566                case `pre`:
    6667                case `popup`:
     68                case `table`:
     69                case `tr`:
     70                case `td`:
    6771                case `text`:
    6872                case `textarea`:
     
    123127        compile: (compiler) => {
    124128            compiler.compileVariable(`browser`, `audioclip`);
     129            return true;
     130        },
     131
     132        run: (program) => {
     133            return program[program.pc].pc + 1;
     134        }
     135    },
     136
     137    BLOCKQUOTE: {
     138
     139        compile: (compiler) => {
     140            compiler.compileVariable(`browser`, `blockquote`, false, `dom`);
    125141            return true;
    126142        },
     
    241257                }
    242258                if ([`a`,
     259                    `blockquote`,
    243260                    `button`,
    244261                    `div`,
     
    261278                    `select`,
    262279                    `span`,
     280                    `table`,
     281                    `tr`,
     282                    `td`,
    263283                    `text`,
    264284                    `textarea`,
     
    896916                    target.targetPc = command.pc + 2;
    897917                    target.onclick = function (event) {
     918                        event.stopPropagation();
    898919                        if (program.length > 0) {
    899920                            const eventTarget = event.target;
    900921                            eventTarget.blur();
    901                             eventTarget.targetRecord.index = eventTarget.targetIndex;
    902                             setTimeout(function () {
    903                                 EasyCoder.timestamp = Date.now();
    904                                 program.run(eventTarget.targetPc);
    905                             }, 1);
     922                            if (typeof eventTarget.targetRecord !== `undefined`) {
     923                                eventTarget.targetRecord.index = eventTarget.targetIndex;
     924                                setTimeout(function () {
     925                                    EasyCoder.timestamp = Date.now();
     926                                    program.run(eventTarget.targetPc);
     927                                }, 1);
     928                            }
    906929                        }
    907930                        return false;
     
    16501673        compile: (compiler) => {
    16511674            compiler.compileVariable(`browser`, `span`, false, `dom`);
     1675            return true;
     1676        },
     1677
     1678        run: (program) => {
     1679            return program[program.pc].pc + 1;
     1680        }
     1681    },
     1682
     1683    TABLE: {
     1684
     1685        compile: (compiler) => {
     1686            compiler.compileVariable(`browser`, `table`, false, `dom`);
     1687            return true;
     1688        },
     1689
     1690        run: (program) => {
     1691            return program[program.pc].pc + 1;
     1692        }
     1693    },
     1694
     1695    TR: {
     1696
     1697        compile: (compiler) => {
     1698            compiler.compileVariable(`browser`, `tr`, false, `dom`);
     1699            return true;
     1700        },
     1701
     1702        run: (program) => {
     1703            return program[program.pc].pc + 1;
     1704        }
     1705    },
     1706
     1707    TD: {
     1708
     1709        compile: (compiler) => {
     1710            compiler.compileVariable(`browser`, `td`, false, `dom`);
    16521711            return true;
    16531712        },
     
    18671926        case `audioclip`:
    18681927            return EasyCoder_Browser.Audioclip;
     1928        case `blockquote`:
     1929            return EasyCoder_Browser.BLOCKQUOTE;
    18691930        case `button`:
    18701931            return EasyCoder_Browser.BUTTON;
     
    19392000        case `span`:
    19402001            return EasyCoder_Browser.SPAN;
     2002        case `table`:
     2003            return EasyCoder_Browser.TABLE;
     2004        case `tr`:
     2005            return EasyCoder_Browser.TR;
     2006        case `td`:
     2007            return EasyCoder_Browser.TD;
    19412008        case `textarea`:
    19422009            return EasyCoder_Browser.TEXTAREA;
     
    19742041                            value: symbolRecord.name
    19752042                        };
    1976                     } 
     2043                    }
    19772044                    return null;
    19782045                }
     
    19912058            }
    19922059
    1993             let token = compiler.getToken();
    1994             if (token === `mobile`) {
     2060            if (compiler.tokenIs(`the`)) {
     2061                compiler.next();
     2062            }
     2063
     2064            let type = compiler.getToken();
     2065            if ([`mobile`, `portrait`, `landscape`, `br`, `location`, `key`].includes(type)) {
    19952066                compiler.next();
    19962067                return {
    19972068                    domain: `browser`,
    1998                     type: `mobile`
    1999                 };
    2000             }
    2001             if (token === `br`) {
    2002                 compiler.next();
    2003                 return {
    2004                     domain: `browser`,
    2005                     type: `br`
    2006                 };
    2007             }
    2008             if (token === `color`) {
     2069                    type
     2070                };
     2071            }
     2072            if (type === `color`) {
    20092073                compiler.next();
    20102074                const value = compiler.getValue();
    20112075                return {
    20122076                    domain: `browser`,
    2013                     type: `color`,
     2077                    type,
    20142078                    value
    20152079                };
    20162080            }
    2017             if (token === `attribute`) {
     2081            if (type === `attribute`) {
    20182082                const attribute = compiler.getNextValue();
    20192083                if (compiler.tokenIs(`of`)) {
     
    20342098                return null;
    20352099            }
    2036             if (token === `confirm`) {
     2100            if (type === `confirm`) {
    20372101                const text = compiler.getNextValue();
    20382102                return {
     
    20422106                };
    20432107            }
    2044             if (token === `prompt`) {
     2108            if (type === `prompt`) {
    20452109                const text = compiler.getNextValue();
    20462110                if (compiler.tokenIs(`with`)) {
     
    20552119                return null;
    20562120            }
    2057             if (compiler.tokenIs(`the`)) {
    2058                 compiler.next();
    2059             }
    2060             token = compiler.getToken();
    2061             if ([`content`, `text`].includes(token)) {
     2121            type = compiler.getToken();
     2122            if ([`content`, `text`].includes(type)) {
    20622123                if (compiler.nextTokenIs(`of`)) {
    20632124                    if (compiler.nextIsSymbol()) {
     
    20742135                return null;
    20752136            }
    2076             if (token === `selected`) {
     2137            if (type === `selected`) {
    20772138                if (compiler.nextTokenIs(`item`)) {
    20782139                    if (compiler.nextTokenIs(`in`)) {
     
    20922153                return null;
    20932154            }
    2094             if ([`width`, `height`].includes(token)) {
     2155            if ([`width`, `height`].includes(type)) {
    20952156                if (compiler.nextTokenIs(`of`)) {
    20962157                    if (compiler.nextIsSymbol()) {
     
    21002161                            return {
    21012162                                domain: `browser`,
    2102                                 type: token === `width` ? `widthOf` : `heightOf`,
     2163                                type: type === `width` ? `widthOf` : `heightOf`,
    21032164                                symbol: symbol.name
    21042165                            };
     
    21082169                return null;
    21092170            }
    2110             if ([`location`, `key`].includes(token)) {
    2111                 compiler.next();
    2112                 return {
    2113                     domain: `browser`,
    2114                     type: token
    2115                 };
    2116             }
    2117             switch (token) {
     2171            switch (type) {
    21182172            case `scroll`:
    21192173                if (compiler.nextTokenIs(`position`)) {
     
    21912245                    domain: `browser`,
    21922246                    type: `boolean`,
    2193                     content: (typeof window.orientation !== `undefined`) ||
    2194                             (navigator.userAgent.indexOf(`IEMobile`) !== -1)
     2247                    content: (typeof window.orientation !== `undefined`) || (navigator.userAgent.indexOf(`IEMobile`) !== -1)
     2248                };
     2249            case `portrait`:
     2250                return {
     2251                    domain: `browser`,
     2252                    type: `boolean`,
     2253                    content: document.documentElement.clientWidth < document.documentElement.clientHeight
     2254                };
     2255            case `landscape`:
     2256                return {
     2257                    domain: `browser`,
     2258                    type: `boolean`,
     2259                    content: document.documentElement.clientWidth >= document.documentElement.clientHeight
    21952260                };
    21962261            case `br`:
  • easycoder/trunk/plugins/json.js

    r2052097 r2076820  
    330330                break;
    331331            case `post`:
    332                 var value = null;
     332                let value = null;
    333333                if (compiler.nextTokenIs(`to`)) {
    334334                    compiler.next();
     
    342342                }
    343343                const url = compiler.getValue();
     344                let target = null;
     345                if (compiler.tokenIs(`giving`)) {
     346                    if (compiler.nextIsSymbol()) {
     347                        const targetRecord = compiler.getSymbolRecord();
     348                        if (targetRecord.isValueHolder) {
     349                            target = targetRecord.name;
     350                            compiler.next();
     351                        }
     352                        else {
     353                            throw new Error(`'${targetRecord.name}' cannot hold a value`);
     354                        }
     355                    }
     356                }
    344357                onError = null;
    345358                if (compiler.tokenIs(`or`)) {
     
    355368                    value,
    356369                    url,
     370                    target,
    357371                    onError
    358372                });
     
    364378        run: (program) => {
    365379            const command = program[program.pc];
    366             program.ajaxCommand = command;
    367380            const url = program.getValue(command.url);
    368381            const ajax = new XMLHttpRequest();
     382            ajax.command = command;
    369383            ajax.onreadystatechange = function () {
    370384                //        console.log(`readyState:${ajax.readyState}, status:${ajax.status}`);
    371385                if (ajax.readyState === 4) {
    372                     const command = program.ajaxCommand;
     386                    const command = ajax.command;
    373387                    switch (this.status) {
    374388                    case 200:
    375389                    case 201:
    376390                        const loaded = Date.now();
    377                         console.log(`${loaded - program.EasyCoder.timestamp} ms: Request completed`);
    378                         if (command.request === `get`) {
    379                             var content = this.responseText;
    380                             if (![`[`, `{`].includes(content.charAt(0))) {
    381                                 content = program.decode(content);
    382                             }
     391                        console.log(`${loaded - program.EasyCoder.timestamp} ms: Request completed.`);
     392                        var content = this.responseText;
     393                        if (content.length > 0 && ![`[`, `{`].includes(content.charAt(0))) {
     394                            content = program.decode(content);
     395                        }
     396                        if (command.target) {
    383397                            const targetRecord = program.getSymbolRecord(command.target);
    384398                            targetRecord.value[targetRecord.index] = {
  • easycoder/trunk/readme.txt

    r2060989 r2076820  
    5353
    5454== Changelog ==
     55
     56= 2.2.3 29-apr-2019 =
     57* Detect portrait and landscape
    5558
    5659= 2.2.2 1-apr-2019 =
Note: See TracChangeset for help on using the changeset viewer.