Plugin Directory

Changeset 1949051


Ignore:
Timestamp:
09/29/2018 12:44:36 PM (8 years ago)
Author:
gtanyware
Message:

Version 1.5

Location:
easycoder/trunk
Files:
4 edited

Legend:

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

    r1885298 r1949051  
    22$jscomp.initSymbol=function(){$jscomp.initSymbol=function(){};$jscomp.global.Symbol||($jscomp.global.Symbol=$jscomp.Symbol)};$jscomp.Symbol=function(){var e=0;return function(k){return $jscomp.SYMBOL_PREFIX+(k||"")+e++}}();
    33$jscomp.initSymbolIterator=function(){$jscomp.initSymbol();var e=$jscomp.global.Symbol.iterator;e||(e=$jscomp.global.Symbol.iterator=$jscomp.global.Symbol("iterator"));"function"!=typeof Array.prototype[e]&&$jscomp.defineProperty(Array.prototype,e,{configurable:!0,writable:!0,value:function(){return $jscomp.arrayIterator(this)}});$jscomp.initSymbolIterator=function(){}};$jscomp.arrayIterator=function(e){var k=0;return $jscomp.iteratorPrototype(function(){return k<e.length?{done:!1,value:e[k++]}:{done:!0}})};
    4 $jscomp.iteratorPrototype=function(e){$jscomp.initSymbolIterator();e={next:e};e[$jscomp.global.Symbol.iterator]=function(){return this};return e};$jscomp.makeIterator=function(e){$jscomp.initSymbolIterator();var k=e[Symbol.iterator];return k?k.call(e):$jscomp.arrayIterator(e)};
     4$jscomp.iteratorPrototype=function(e){$jscomp.initSymbolIterator();e={next:e};e[$jscomp.global.Symbol.iterator]=function(){return this};return e};$jscomp.makeIterator=function(e){$jscomp.initSymbolIterator();$jscomp.initSymbol();$jscomp.initSymbolIterator();var k=e[Symbol.iterator];return k?k.call(e):$jscomp.arrayIterator(e)};
    55$jscomp.polyfill=function(e,k,h,g){if(k){h=$jscomp.global;e=e.split(".");for(g=0;g<e.length-1;g++){var a=e[g];a in h||(h[a]={});h=h[a]}e=e[e.length-1];g=h[e];k=k(g);k!=g&&null!=k&&$jscomp.defineProperty(h,e,{configurable:!0,writable:!0,value:k})}};$jscomp.polyfill("Math.trunc",function(e){return e?e:function(e){e=Number(e);if(isNaN(e)||Infinity===e||-Infinity===e||0===e)return e;var k=Math.floor(Math.abs(e));return 0>e?-k:k}},"es6","es3");
    66$jscomp.polyfill("Object.is",function(e){return e?e:function(e,h){return e===h?0!==e||1/e===1/h:e!==e&&h!==h}},"es6","es3");$jscomp.polyfill("Array.prototype.includes",function(e){return e?e:function(e,h){var g=this;g instanceof String&&(g=String(g));var a=g.length;h=h||0;for(0>h&&(h=Math.max(h+a,0));h<a;h++){var b=g[h];if(b===e||Object.is(b,e))return!0}return!1}},"es7","es3");
     
    1010$jscomp.polyfill("String.prototype.endsWith",function(e){return e?e:function(e,h){var g=$jscomp.checkStringArgs(this,e,"endsWith");e+="";void 0===h&&(h=g.length);h=Math.max(0,Math.min(h|0,g.length));for(var a=e.length;0<a&&0<h;)if(g[--h]!=e[--a])return!1;return 0>=a}},"es6","es3");$jscomp.polyfill("Number.isFinite",function(e){return e?e:function(e){return"number"!==typeof e?!1:!isNaN(e)&&Infinity!==e&&-Infinity!==e}},"es6","es3");
    1111$jscomp.polyfill("Number.isInteger",function(e){return e?e:function(e){return Number.isFinite(e)?e===Math.floor(e):!1}},"es6","es3");
    12 (function(){function e(k,h,g){function a(c,f){if(!h[c]){if(!k[c]){var d="function"==typeof require&&require;if(!f&&d)return d(c,!0);if(b)return b(c,!0);f=Error("Cannot find module '"+c+"'");throw f.code="MODULE_NOT_FOUND",f;}f=h[c]={exports:{}};k[c][0].call(f.exports,function(b){return a(k[c][1][b]||b)},f,f.exports,e,k,h,g)}return h[c].exports}for(var b="function"==typeof require&&require,c=0;c<g.length;c++)a(g[c]);return a}return e})()({1:[function(e,k,h){var g=this,a=e("./easycoder/Tokenise"),b=
    13 e("./easycoder/Compile"),c=e("./easycoder/Run"),d=e("./easycoder/Value"),f=e("./easycoder/Condition"),l=e("./easycoder/Compare");k=e("./domain/Basic");h=e("./domain/Browser");var n=e("./domain/Json");e=e("./domain/Svg");var m={domain:{basic:k,browser:h,json:n,svg:e},compileError:{dontUnderstandError:function(b){throw Error("I don't understand '"+b+"'");},duplicateSymbolError:function(b){throw Error("Symbol '"+b+"' is a duplicate");},inappropriateTypeError:function(b){throw Error("Inappropriate type '"+
    14 b+"'");},inappropriateVariableTypeError:function(b){throw Error("Inappropriate variable type '"+b+"'");},noSuchVariableError:function(b){throw Error("No such variable: "+b);},notAnIntegerError:function(b){throw Error("Value is not an integer: "+b);},undefinedValueError:function(b){throw Error("Undefined value: "+b);},unknownTypeError:function(b){throw Error("Unknown type: "+b);},unknownVariableError:function(b){throw Error("Unknown variable: "+b);},unrecognisedValueError:function(b){throw Error("I don't understand this value: "+
    15 b);},variableDoesNotHoldAValueError:function(b){throw Error("Variable '"+b+"' does not hold a value");}},runtimeError:{arrayIndexOutOfRangeError:function(b){throw Error("Array index out of range for "+b);},cantDecodeValueError:function(){throw Error("Can't decode value");},dataTypeMismatchError:function(){throw Error("Data type mismatch");},nonNumericValueError:function(){throw Error("Non-numeric value");},noSuchElementError:function(b){throw Error("No such element: "+b);},runtimeError:function(b){throw Error(b);
    16 },undefinedValueError:function(b,a){g.errorPc=a;throw Error("Undefined value: "+b);},variableDoesNotHoldAValueError:function(b){throw Error("Variable '"+b+"' does not hold a value");}},setupTracer:function(){var b=document.getElementById("easycoder-tracer");b&&(b.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>',
    17 b.style.display="none")},reportError:function(a,c){var d=b.getProgram(),f=a.tokens;a=a.scriptLines;f=g.compiling?f[b.getIndex()].lino:d.pc.lino;d="";var l=f-5;for(l=0>l?0:l;l<f;l++){for(var e=""+l;4>e.length;)e=" "+e;d+=e+" "+a[l].line+"\n"}d+=c.message+"\n";c=b.getWarnings();if(c.length)for(d+="Warnings:\n",c=$jscomp.makeIterator(c),a=c.next();!a.done;a=c.next())d+=a.value+"\n";console.log(d);alert(d)},getSymbolRecord:function(b,a){a=b[b.symbols[a].pc];return a.alias?b[b.symbols[a.alias].pc]:a},
    18 compileScript:function(a){var e=a.tokens;try{g.compiling=!0;var h=Date.now();b.value=d;b.condition=f;b.domain=m.domain;b.error=m.compileError;var n=b.compile(e),k=Date.now();console.log("Compiled "+e.length+" tokens in "+(k-h)+"ms");g.compiling=!1;n.source=a;n.run=c;n.value=d;n.condition=f;n.compare=l;n.domain=m.domain;n.getSymbolRecord=m.getSymbolRecord;n.error=m.runtimeError;n.reportError=m.reportError;n.symbols=b.getSymbols();n.encoding="none";n.popups=[];n.stack=[];n.queue=[0];m.setupTracer();
    19 console.log("Run the script");n.run(n,0)}catch(u){m.reportError(a,u)}},start:function(b){try{var c=Date.now(),d=a.tokenise(b),f=Date.now();console.log("Tokenised "+d.scriptLines.length+" lines in "+(f-c)+"ms");m.compileScript(d)}catch(r){console.log(r)}}};console.log("Starting EasyCoder...");window.onload=function(){var b=document.getElementById("easycoder-script");b&&(b.style.display="none",m.start(b.innerText))}},{"./domain/Basic":2,"./domain/Browser":3,"./domain/Json":4,"./domain/Svg":5,"./easycoder/Compare":6,
    20 "./easycoder/Compile":7,"./easycoder/Condition":8,"./easycoder/Run":9,"./easycoder/Tokenise":10,"./easycoder/Value":11}],2:[function(e,k,h){var g=this,a={Add:{compile:function(b){var a=b.getLino();b.next();var d=b.getValue();if(b.tokenIs("to"))if(b.next(),b.getToken(),b.isSymbol()){var f=b.getSymbol();if(b.getCommandAt(f.pc).isValueHolder){if("giving"===b.peek()){f=b.getValue();b.next();var l=b.getToken();b.next();b.addCommand({domain:"basic",keyword:"add",lino:a,value1:d,value2:f,target:l})}else f=
    21 b.getToken(),b.next(),b.addCommand({domain:"basic",keyword:"add",lino:a,value1:d,target:f});return!0}b.warning("basic "+g.name+"': Expected value holder")}else{f=b.getValue();if(b.tokenIs("giving"))return b.next(),l=b.getToken(),b.next(),b.addCommand({domain:"basic",keyword:"add",lino:a,value1:d,value2:f,target:l}),!0;b.warning("basic "+g.name+'\': Expected "giving"')}return!1},run:function(b){var a=b[b.pc],d=a.value1,f=a.value2,l=b.getSymbolRecord(b,a.target);if(l.isValueHolder){var e=l.value[l.index];
    22 f?(b=b.value.evaluate(b,f).content+b.value.evaluate(b,d).content,l.value[l.index]={type:"constant",numeric:!0,content:b}):(e.numeric||b.error.nonNumericValueError(),b=e.content+b.value.evaluate(b,d).content,l.value[l.index]={type:"constant",numeric:!0,content:b})}else b.error.VariableDoesNotHoldAValueError(l.name);return a.pc+1}},Alias:{compile:function(b){var a=b.getLino();b.next();if(b.isSymbol()){var d=b.getToken();b.next();if(b.tokenIs("to")&&(b.next(),b.isSymbol())){var f=b.getToken();b.next();
    23 b.addCommand({domain:"basic",keyword:"alias",lino:a,alias:d,symbol:f});return!0}}return!1},run:function(b){var a=b[b.pc],d=b.symbols[a.alias].pc,f=b[d],l=b.getSymbolRecord(b,a.symbol);b[d]={pc:f.pc,domain:l.domain,keyword:l.keyword,lino:f.lino,name:f.name,alias:a.symbol};return a.pc+1}},Begin:{compile:function(b){b.next();b.compileFromHere(["end"]);return!0},run:function(b){return b[b.pc].pc+1}},Clear:{compile:function(b){var a=b.getLino();b.next();if(b.isSymbol()){var d=b.getToken();b.next();b.addCommand({domain:"basic",
    24 keyword:"clear",lino:a,symbol:d});return!0}return!1},run:function(b){var a=b[b.pc],d=b.getSymbolRecord(b,a.symbol);d.isValueHolder?(b.domain[d.domain].value.put(d,{type:"boolean",content:!1}),a.numeric=!1):b.error.VariableDoesNotHoldAValueError(d.name);return a.pc+1}},Debug:{compile:function(b){var a=b.getLino();b.next();if(b.tokenIs("program")){b.next();if(b.tokenIs("item")||b.tokenIs("pc")){b.next();var d=b.getValue();b.addCommand({domain:"basic",keyword:"debug",lino:a,item:d});return!0}b.addCommand({domain:"basic",
    25 keyword:"debug",lino:a,item:-1});return!0}if(b.tokenIs("symbols"))return b.next(),b.addCommand({domain:"basic",keyword:"debug",lino:a,item:"symbols"}),!0;if(b.tokenIs("symbol"))return b.next(),d=b.getToken(),b.next(),b.addCommand({domain:"basic",keyword:"debug",lino:a,item:"symbol",name:d}),!0;program.error.NoSuchVariableError(b.getToken())},run:function(b){var a=b[b.pc],d=a.item;switch(d){case "symbols":console.log("Symbols: "+JSON.stringify(b.symbols,null,2));break;case "symbol":console.log("Symbol: "+
    26 JSON.stringify(b.getSymbolRecord(b,a.name),null,2));break;default:0<=d.content?console.log("Debug item "+d.content+": "+JSON.stringify(b[d.content],null,2)):console.log("Debug program: "+JSON.stringify(b,null,2))}return a.pc+1}},Divide:{compile:function(b){var a=b.getLino();b.next();b.getToken();if(b.isSymbol()){var d=b.getSymbol();var f=b.getCommandAt(d.pc).name}d=b.getValue();b.tokenIs("by")&&b.next();var l=b.getValue();if(b.tokenIs("giving")){b.next();if(b.isSymbol())return f=b.getSymbol(),f=b.getCommandAt(f.pc).name,
    27 b.next(),b.addCommand({domain:"basic",keyword:"divide",lino:a,value1:d,value2:l,target:f}),!0;b.warning("basic "+g.name+"': Expected value holder")}else return void 0===f&&b.warning("basic "+g.name+"': No target variable given"),b.addCommand({domain:"basic",keyword:"divide",lino:a,value2:l,target:f}),!0;return!1},run:function(b){var a=b[b.pc],d=a.value1,f=a.value2,l=b.getSymbolRecord(b,a.target);if(l.isValueHolder){var e=l.value[l.index];d?(b=b.value.evaluate(b,d).content/b.value.evaluate(b,f).content,
    28 l.value[l.index]={type:"constant",numeric:!0,content:Math.trunc(b)}):(e.numeric||b.error.nonNumericValueError(),b=e.content/b.value.evaluate(b,f).content,l.value[l.index]={type:"constant",numeric:!0,content:Math.trunc(b)})}else b.error.VariableDoesNotHoldAValueError(l.name);return a.pc+1}},End:{compile:function(b){b.next();return!0},run:function(){return 0}},Extend:{compile:function(b){var a=b.getLino();b.next();var d=b.getValue(),f=b.getValue();b.addCommand({domain:"basic",keyword:"extend",lino:a,
    29 request:d,data:f});return!0},run:function(b){var a=b[b.pc];try{if("function"===typeof EasyCoder_extension){var d=b.value.evaluate(b,a.request).content,f=b.value.evaluate(b,a.data).content;EasyCoder_extension(b,d,f)}else b.error.runtimeError("No extension found")}catch(l){b.error.runtimeError(l.message)}return a.pc+1}},Fork:{compile:function(b){var a=b.getLino();b.next();b.tokenIs("to")&&b.next();var d=b.getToken();b.next();b.addCommand({domain:"basic",keyword:"fork",lino:a,label:d});return!0},run:function(b){var a=
    30 b[b.pc];try{b.run(b,b.symbols[a.label].pc)}catch(d){console.log(d.message),alert(d.message)}return a.pc+1}},Go:{compile:function(b){var a=b.getLino();b.next();b.tokenIs("to")&&b.next();var d=b.getToken();b.next();b.addCommand({domain:"basic",keyword:"goto",lino:a,label:d});return!0},run:function(b){return b[b.pc].pc+1}},Gosub:{compile:function(b){var a=b.getLino();b.next();b.tokenIs("to")&&b.next();var d=b.getToken();b.next();b.addCommand({domain:"basic",keyword:"gosub",lino:a,label:d});return!0},
    31 run:function(b){var a=b[b.pc];b.stack.push(b.pc+1);return b.symbols[a.label].pc}},Goto:{compile:function(b){var a=b.getLino();b.next();var d=b.getToken();b.next();b.addCommand({domain:"basic",keyword:"goto",lino:a,label:d});return!0},run:function(a){var b=a[a.pc];return b.label?a.symbols[b.label].pc:b.goto}},If:{compile:function(a){var b=a.getLino();a.next();var d=a.condition.compile(a),f=a.getPc();a.addCommand({domain:"basic",keyword:"if",lino:b,condition:d});a.compileOne();if(!a.getToken())return a.getCommandAt(f).else=
    32 a.getPc(),!0;a.tokenIs("else")?(b=a.getPc(),a.addCommand({domain:"basic",keyword:"goto",goto:0}),a.getCommandAt(f).else=a.getPc(),a.next(),a.compileOne(!0),a.getCommandAt(b).goto=a.getPc()):a.getCommandAt(f).else=a.getPc();return!0},run:function(a){var b=a[a.pc];return a.condition.test(a,b.condition)?b.pc+1:b.else}},Index:{compile:function(a){var b=a.getLino();a.getTokens();a.next();if(a.isSymbol()){var d=a.getToken();a.next();if(a.tokenIs("to")){a.next();var f=a.getValue();a.addCommand({domain:"basic",
    33 keyword:"index",lino:b,symbol:d,value:f});return!0}}return!1},run:function(a){var b=a[a.pc],d=a.getSymbolRecord(a,b.symbol);d.index=a.value.evaluate(a,b.value).content;d.index>=d.elements&&a.error.arrayIndexOutOfRangeError(d.name);return b.pc+1}},Multiply:{compile:function(a){var b=a.getLino();a.next();a.getToken();if(a.isSymbol()){var d=a.getSymbol();var f=a.getCommandAt(d.pc).name}d=a.getValue();a.tokenIs("by")&&a.next();var e=a.getValue();if(a.tokenIs("giving")){a.next();if(a.isSymbol())return f=
    34 a.getSymbol(),f=a.getCommandAt(f.pc).name,a.next(),a.addCommand({domain:"basic",keyword:"multiply",lino:b,value1:d,value2:e,target:f}),!0;a.warning("basic multiply': Expected value holder")}else return void 0===f&&a.warning("basic multiply': No target variable given"),a.addCommand({domain:"basic",keyword:"multiply",lino:b,value2:e,target:f}),!0;return!1},run:function(a){var b=a[a.pc],d=b.value1,f=b.value2,e=a.getSymbolRecord(a,b.target);if(e.isValueHolder){var g=e.value[e.index];d?(a=a.value.evaluate(a,
    35 d).content*a.value.evaluate(a,f).content,e.value[e.index]={type:"constant",numeric:!0,content:a}):(g.numeric||a.error.nonNumericValueError(),a=g.content*a.value.evaluate(a,f).content,e.value[e.index]={type:"constant",numeric:!0,content:a})}else a.error.VariableDoesNotHoldAValueError(e.name);return b.pc+1}},Negate:{compile:function(a){var b=a.getLino();a.getTokens();a.next();if(a.isSymbol()){var d=a.getToken();a.next();a.addCommand({domain:"basic",keyword:"negate",lino:b,symbol:d});return!0}return!1},
    36 run:function(a){var b=a[a.pc],d=a.getSymbolRecord(a,b.symbol);d.isValueHolder?d.value[d.index]={type:"constant",numeric:!0,content:-d.value[d.index].content}:a.error.VariableDoesNotHoldAValueError(d.name);return b.pc+1}},Print:{compile:function(a){var b=a.getLino();a.next();var d=a.getValue();a.addCommand({domain:"basic",keyword:"print",lino:b,value:d});return!0},run:function(a){var b=a.value.evaluate(a,a[a.pc].value).content;console.log("-> "+b);return a[a.pc].pc+1}},Put:{compile:function(a){var b=
    37 a.getLino();a.next();var d=a.getValue();if(a.tokenIs("into")){a.next();if(a.isSymbol()){var f=a.getToken();a.next();a.addCommand({domain:"basic",keyword:"put",lino:b,value:d,target:f});return!0}a.error.noSuchVariableError(a.getToken())}return!1},run:function(a){var b=a[a.pc],d=b.value,f=a.getSymbolRecord(a,b.target);f.isValueHolder||a.error.variableDoesNotHoldAValueError(f.name);f.value[f.index]=a.value.evaluate(a,d);return b.pc+1}},Return:{compile:function(a){var b=a.getLino();a.next();a.addCommand({domain:"basic",
    38 keyword:"return",lino:b});return!0},run:function(a){return a.stack.pop()}},Set:{compile:function(a){var b=a.getLino();a.next();if(a.isSymbol()){var d=a.getSymbolRecord();if(!d.isValueHolder)return!1;a.next();if(a.tokenIs("to")){a.next();for(var f=[];;){a.mark();try{f.push(a.getValue())}catch(l){a.rewind();break}}a.addCommand({domain:"basic",keyword:"set",lino:b,type:"setArray",target:d.name,value:f});return!0}a.addCommand({domain:"basic",keyword:"set",lino:b,type:"setBoolean",target:d.name});return!0}a.tokenIs("the")&&
    39 a.next();return a.tokenIs("elements")&&(a.next(),a.tokenIs("of")&&(a.next(),a.getTarget(),a.isSymbol()||a.error.unknownVariableError(a.getToken()),d=a.getToken(),a.next(),a.tokenIs("to")))?(a.next(),f=a.getValue(),a.addCommand({domain:"basic",keyword:"set",lino:b,type:"setElements",symbol:d,value:f}),!0):!1},run:function(a){var b=a[a.pc];switch(b.type){case "setBoolean":var d=a.getSymbolRecord(a,b.target);d.isValueHolder?(d.value[d.index]={type:"boolean",content:!0},b.numeric=!1):a.error.VariableDoesNotHoldAValueError(d.name);
    40 break;case "setElements":d=a.getSymbolRecord(a,b.symbol);d.elements=a.value.evaluate(a,b.value).content;d.index=0;d.value=[];for(a=0;a<d.elements;a++)d.value.push({});break;case "setArray":a=a.getSymbolRecord(a,b.target),a.elements=b.value.length,a.value=b.value}return b.pc+1}},Stop:{compile:function(a){var b=a.getLino();a.next();a.addCommand({domain:"basic",keyword:"stop",lino:b,next:0});return!0},run:function(){return 0}},Take:{compile:function(a){var b=a.getLino();a.next();var d=a.getValue();if(a.tokenIs("from"))if(a.next(),
    41 a.getToken(),a.isSymbol()){var f=a.getSymbol();if(a.getCommandAt(f.pc).isValueHolder){if("giving"===a.peek()){f=a.getValue();a.next();var e=a.getToken();a.next();a.addCommand({domain:"basic",keyword:"take",lino:b,value1:d,value2:f,target:e})}else f=a.getToken(),a.next(),a.addCommand({domain:"basic",keyword:"take",lino:b,value1:d,target:f});return!0}a.warning("basic "+g.name+"': Expected value holder")}else{f=a.getValue();if(a.tokenIs("giving"))return a.next(),e=a.getToken(),a.next(),a.addCommand({domain:"basic",
    42 keyword:"take",lino:b,value1:d,value2:f,target:e}),!0;a.warning("basic "+g.name+'\': Expected "giving"')}return!1},run:function(a){var b=a[a.pc],d=b.value1,f=b.value2,e=a.getSymbolRecord(a,b.target);if(e.isValueHolder){var g=e.value[e.index];f?(a=a.value.evaluate(a,f).content-a.value.evaluate(a,d).content,e.value[e.index]={type:"constant",numeric:!0,content:a}):(g.numeric||a.error.nonNumericValueError(),a=a.value.evaluate(a,g).content-a.value.evaluate(a,d).content,e.value[e.index]={type:"constant",
    43 numeric:!0,content:a})}else a.error.VariableDoesNotHoldAValueError(e.name);return b.pc+1}},Toggle:{compile:function(a){var b=a.getLino();a.getTokens();a.next();if(a.isSymbol()){var d=a.getSymbolPc();a.next();a.addCommand({domain:"basic",keyword:"toggle",lino:b,symbol:d});return!0}return!1},run:function(a){var b=a[a.pc],d=a[b.symbol];if(d.isValueHolder){var f=a.domain[d.domain];a=f.value.get(a,d.value[d.index]).content;f.value.put(d,{type:"boolean",content:!a})}else a.error.VariableDoesNotHoldAValueError(d.name);
    44 return b.pc+1}},Variable:{compile:function(a){a.compileVariable("basic","variable",!0);return!0},run:function(a){return a[a.pc].pc+1}},Wait:{compile:function(a){var b=a.getLino();a.next();var d=a.getValue(a),f=1E3;switch(a.getToken()){case "milli":case "millis":a.next();f=1;break;case "tick":case "ticks":a.next();f=10;break;case "second":case "seconds":a.next();f=1E3;break;case "minute":case "minutes":a.next(),f=6E4}a.addCommand({domain:"basic",keyword:"wait",lino:b,value:d,multiplier:f});return!0},
    45 run:function(a){var b=a[a.pc],d=a.value.evaluate(a,b.value).content;setTimeout(function(){a.run(a,b.pc+1)},d*b.multiplier);return 0}},While:{compile:function(a){var b=a.getLino();a.next();var d=a.condition.compile(a),f=a.getPc();a.addCommand({domain:"basic",keyword:"while",lino:b,condition:d});b=a.getPc();a.addCommand({domain:"basic",keyword:"goto",goto:0});a.compileOne();a.addCommand({domain:"basic",keyword:"goto",goto:f});a.getCommandAt(b).goto=a.getPc();return!0},run:function(a){return a.condition.test(a,
    46 a[a.pc].condition)?a.pc+2:a.pc+1}},getHandler:function(b){switch(b){case "add":return a.Add;case "alias":return a.Alias;case "begin":return a.Begin;case "clear":return a.Clear;case "debug":return a.Debug;case "divide":return a.Divide;case "end":return a.End;case "extend":return a.Extend;case "fork":return a.Fork;case "go":return a.Go;case "gosub":return a.Gosub;case "goto":return a.Goto;case "if":return a.If;case "index":return a.Index;case "multiply":return a.Multiply;case "negate":return a.Negate;
    47 case "print":return a.Print;case "put":return a.Put;case "return":return a.Return;case "set":return a.Set;case "stop":return a.Stop;case "take":return a.Take;case "toggle":return a.Toggle;case "variable":return a.Variable;case "wait":return a.Wait;case "while":return a.While;default:return!1}},run:function(b){var c=b[b.pc],d=a.getHandler(c.keyword);d||b.error.runtimeError("Unknown keyword '"+c.keyword+"' in 'basic' package");return d.run(b)},isNegate:function(a){return"not"===a.getToken()?(a.next(),
    48 !0):!1},value:{compile:function(a){if(a.isSymbol()){var b=a.getToken();a.next();return a.tokenIs("modulo")?(a.next(),a=a.getValue(),{domain:"basic",type:"modulo",name:b,value:a}):{domain:"basic",type:"symbol",name:b}}b=a.getToken();if("true"===b)return a.next(),{domain:"basic",type:"boolean",content:!0};if("false"===b)return a.next(),{domain:"basic",type:"boolean",content:!1};if("random"===b)return a.next(),{domain:"basic",type:"random",range:a.getValue()};if("empty"===b)return a.next(),{domain:"basic",
    49 type:"empty"};a.tokenIs("the")&&a.next();b=a.getToken();if("index"===b){if(a.next(),a.tokenIs("of")&&(a.next(),a.isSymbol()))return b=a.getToken(),a.next(),{domain:"basic",type:"index",name:b}}else if("value"===b&&(a.next(),a.tokenIs("of")))return a.next(),{domain:"basic",type:"valueOf",value:a.getValue()};return null},get:function(a,c){switch(c.type){case "boolean":return{type:"boolean",numeric:!1,content:c.content};case "index":return{type:"constant",numeric:!0,content:a.getSymbolRecord(a,c.name).index};
    50 case "random":var b=a.value.evaluate(a,c.range);return{type:"constant",numeric:!0,content:Math.floor(Math.random()*b.content)};case "valueOf":return b=a.value.evaluate(a,c.value),{type:"constant",numeric:!0,content:parseInt(b.content)};case "modulo":return b=a.getSymbolRecord(a,c.name),a=a.value.evaluate(a,c.value),{type:"constant",numeric:!0,content:b.value[b.index].content%a.content};case "empty":return{type:"constant",numeric:!1,content:""}}return null},put:function(a,c){a.value[a.index]=c}},condition:{compile:function(b){if(b.tokenIs("not"))return b.next(),
    51 {domain:"basic",type:"not",value:b.getValue()};try{var c=b.getValue();if("is"===b.getToken()){b.next();var d=a.isNegate(b);if(b.tokenIs("greater")){b.next();if(b.tokenIs("than")){b.next();var f=b.getValue();return{domain:"basic",type:"greater",value1:c,value2:f,negate:d}}return null}if(b.tokenIs("less")){b.next();if(b.tokenIs("than")){b.next();var e=b.getValue();return{domain:"basic",type:"less",value1:c,value2:e,negate:d}}return null}var g=b.getValue();return{domain:"basic",type:"is",value1:c,value2:g,
    52 negate:d}}if(c)return{domain:"basic",type:"boolean",value:c}}catch(m){console.log(m)}return null},test:function(a,c){switch(c.type){case "boolean":return a.value.evaluate(a,c.value).content;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.value.evaluate(a,c.value).content}}}};k.exports=a},{}],3:[function(e,k,h){var g=
    53 {A:{compile:function(a){a.compileVariable("browser","a",!1,"dom");return!0},run:function(a){return a[a.pc].pc+1}},Alert:{compile:function(a){var b=a.getLino();a.next();var c=a.getValue();a.addCommand({domain:"browser",keyword:"alert",lino:b,value:c});return!0},run:function(a){var b=a.value.evaluate(a,a[a.pc].value).content;alert(b);return a[a.pc].pc+1}},Attach:{compile:function(a){var b=a.getLino();a.getTokens();a.next();if(a.isSymbol()){var c=a.getProgram()[a.getSymbol().pc];switch(c.keyword){case "button":case "div":case "header":case "p":case "a":case "img":case "input":case "ul":case "li":case "select":case "span":case "popup":a.next();
    54 if(a.tokenIs("to")){a.next();var d=a.getValue();a.addCommand({domain:"browser",keyword:"attach",lino:b,type:c.keyword,symbol:c.name,cssId:d});return!0}break;default:return a.addWarning("type '"+c.keyword+"' not recognized in browser 'attach'"),!1}}a.addWarning("Unrecognised syntax in 'attach'");return!1},run:function(a){var b=a[a.pc],c=a.value.evaluate(a,b.cssId).content,d=document.getElementById(c);d||a.error.noSuchElementError(c);var f=a.getSymbolRecord(a,b.symbol);f.value[f.index]={type:"constant",
    55 numeric:"false",content:c};"popup"===b.type&&(a.popups.push(d.id),window.onclick=function(b){a.popups.includes(b.target.id)&&(b.target.style.display="none")});return b.pc+1}},Audioclip:{compile:function(a){a.compileVariable("browser","audioclip");return!0},run:function(a){return a[a.pc].pc+1}},BUTTON:{compile:function(a){a.compileVariable("browser","button",!1,"dom");return!0},run:function(a){return a[a.pc].pc+1}},Create:{compile:function(a){var b=a.getLino();a.next();if(a.isSymbol()){var c=a.getSymbolRecord(),
    56 d=c.name;a.next();if("audioclip"===c.keyword)return a.tokenIs("from")&&a.next(),c=a.getValue(),a.addCommand({domain:"browser",keyword:"create",lino:b,target:d,value:c}),!0}return!1},run:function(a){var b=a[a.pc],c=a.getSymbolRecord(a,b.target);c.value[c.index]=b.value;return a[a.pc].pc+1}},DIV:{compile:function(a){a.compileVariable("browser","div",!1,"dom");return!0},run:function(a){return a[a.pc].pc+1}},Header:{compile:function(a){a.compileVariable("browser","header",!1,"dom");return!0},run:function(a){return a[a.pc].pc+
    57 1}},Hide:{compile:function(a){var b=a.getLino();a.getTokens();a.next();if(a.isSymbol()){var c=a.getToken();a.next();a.addCommand({domain:"browser",keyword:"hide",lino:b,symbol:c});return!0}a.addWarning("Unrecognised syntax in 'hide'");return!1},run:function(a){var b=a[a.pc];a=a.getSymbolRecord(a,b.symbol);document.getElementById(a.value[a.index].content).style.visibility="hidden";return b.pc+1}},IMG:{compile:function(a){a.compileVariable("browser","img",!1,"dom");return!0},run:function(a){return a[a.pc].pc+
     12(function(){function e(k,h,g){function a(c,f){if(!h[c]){if(!k[c]){var d="function"==typeof require&&require;if(!f&&d)return d(c,!0);if(b)return b(c,!0);f=Error("Cannot find module '"+c+"'");throw f.code="MODULE_NOT_FOUND",f;}f=h[c]={exports:{}};k[c][0].call(f.exports,function(b){return a(k[c][1][b]||b)},f,f.exports,e,k,h,g)}return h[c].exports}for(var b="function"==typeof require&&require,c=0;c<g.length;c++)a(g[c]);return a}return e})()({1:[function(e,k,h){var g=e("./easycoder/Main");console.log("Starting up EasyCoder...");
     13window.onload=function(){var a=document.getElementById("easycoder-script");a&&(a.style.display="none",g.start(a.innerText))}},{"./easycoder/Main":9}],2:[function(e,k,h){var g=this,a={Add:{compile:function(b){var a=b.getLino();b.next();var d=b.getValue();if(b.tokenIs("to"))if(b.next(),b.getToken(),b.isSymbol()){var f=b.getSymbol();if(b.getCommandAt(f.pc).isValueHolder){if("giving"===b.peek()){f=b.getValue();b.next();var l=b.getToken();b.next();b.addCommand({domain:"basic",keyword:"add",lino:a,value1:d,
     14value2:f,target:l})}else f=b.getToken(),b.next(),b.addCommand({domain:"basic",keyword:"add",lino:a,value1:d,target:f});return!0}b.warning("basic "+g.name+"': Expected value holder")}else{f=b.getValue();if(b.tokenIs("giving"))return b.next(),l=b.getToken(),b.next(),b.addCommand({domain:"basic",keyword:"add",lino:a,value1:d,value2:f,target:l}),!0;b.warning("basic "+g.name+'\': Expected "giving"')}return!1},run:function(b){var a=b[b.pc],d=a.value1,f=a.value2,l=b.getSymbolRecord(a.target);if(l.isValueHolder){var e=
     15l.value[l.index];f?(b=b.getValue(f)+b.getValue(d),l.value[l.index]={type:"constant",numeric:!0,content:b}):(e.numeric||b.error.nonNumericValueError(),b=e.content+b.getValue(d),l.value[l.index]={type:"constant",numeric:!0,content:b})}else b.error.VariableDoesNotHoldAValueError(l.name);return a.pc+1}},Alias:{compile:function(b){var a=b.getLino();b.next();if(b.isSymbol()){var d=b.getToken();b.next();if(b.tokenIs("to")&&(b.next(),b.isSymbol())){var f=b.getToken();b.next();b.addCommand({domain:"basic",
     16keyword:"alias",lino:a,alias:d,symbol:f});return!0}}return!1},run:function(b){var a=b[b.pc],d=b.symbols[a.alias].pc,f=b[d],l=b.getSymbolRecord(a.symbol);b[d]={pc:f.pc,domain:l.domain,keyword:l.keyword,lino:f.lino,name:f.name,alias:a.symbol};return a.pc+1}},Begin:{compile:function(b){b.next();b.compileFromHere(["end"]);return!0},run:function(b){return b[b.pc].pc+1}},Clear:{compile:function(b){var a=b.getLino();b.next();if(b.isSymbol()){var d=b.getToken();b.next();b.addCommand({domain:"basic",keyword:"clear",
     17lino:a,symbol:d});return!0}return!1},run:function(b){var a=b[b.pc],d=b.getSymbolRecord(a.symbol);d.isValueHolder?(b.domain[d.domain].value.put(d,{type:"boolean",content:!1}),a.numeric=!1):b.error.VariableDoesNotHoldAValueError(d.name);return a.pc+1}},Debug:{compile:function(b){var a=b.getLino();b.next();if(b.tokenIs("program")){b.next();if(b.tokenIs("item")||b.tokenIs("pc")){b.next();var d=b.getValue();b.addCommand({domain:"basic",keyword:"debug",lino:a,item:d});return!0}b.addCommand({domain:"basic",
     18keyword:"debug",lino:a,item:-1});return!0}if(b.tokenIs("symbols"))return b.next(),b.addCommand({domain:"basic",keyword:"debug",lino:a,item:"symbols"}),!0;if(b.tokenIs("symbol"))return b.next(),d=b.getToken(),b.next(),b.addCommand({domain:"basic",keyword:"debug",lino:a,item:"symbol",name:d}),!0;b.error.NoSuchVariableError(b.getToken())},run:function(b){var a=b[b.pc],d=a.item;switch(d){case "symbols":console.log("Symbols: "+JSON.stringify(b.symbols,null,2));break;case "symbol":console.log("Symbol: "+
     19JSON.stringify(b.getSymbolRecord(a.name),null,2));break;default:0<=d.content?console.log("Debug item "+d.content+": "+JSON.stringify(b[d.content],null,2)):console.log("Debug program: "+JSON.stringify(b,null,2))}return a.pc+1}},Divide:{compile:function(b){var a=b.getLino();b.next();b.getToken();if(b.isSymbol()){var d=b.getSymbol();var f=b.getCommandAt(d.pc).name}d=b.getValue();b.tokenIs("by")&&b.next();var l=b.getValue();if(b.tokenIs("giving")){b.next();if(b.isSymbol())return f=b.getSymbol(),f=b.getCommandAt(f.pc).name,
     20b.next(),b.addCommand({domain:"basic",keyword:"divide",lino:a,value1:d,value2:l,target:f}),!0;b.warning("basic "+g.name+"': Expected value holder")}else return void 0===f&&b.warning("basic "+g.name+"': No target variable given"),b.addCommand({domain:"basic",keyword:"divide",lino:a,value2:l,target:f}),!0;return!1},run:function(b){var a=b[b.pc],d=a.value1,f=a.value2,l=b.getSymbolRecord(a.target);if(l.isValueHolder){var e=l.value[l.index];d?(b=b.getValue(d)/b.getValue(f),l.value[l.index]={type:"constant",
     21numeric:!0,content:Math.trunc(b)}):(e.numeric||b.error.nonNumericValueError(),b=e.content/b.getValue(f),l.value[l.index]={type:"constant",numeric:!0,content:Math.trunc(b)})}else b.error.VariableDoesNotHoldAValueError(l.name);return a.pc+1}},End:{compile:function(a){a.next();return!0},run:function(){return 0}},Extend:{compile:function(a){var b=a.getLino();a.next();var d=a.getValue(),f=a.getValue();a.addCommand({domain:"basic",keyword:"extend",lino:b,request:d,data:f});return!0},run:function(a){var b=
     22a[a.pc];try{if("function"===typeof EasyCoder_extension){var d=a.getValue(b.request),f=a.getValue(b.data);EasyCoder_extension(a,d,f)}else a.error.runtimeError("No extension found")}catch(l){a.error.runtimeError(l.message)}return b.pc+1}},Fork:{compile:function(a){var b=a.getLino();a.next();a.tokenIs("to")&&a.next();var d=a.getToken();a.next();a.addCommand({domain:"basic",keyword:"fork",lino:b,label:d});return!0},run:function(a){var b=a[a.pc];try{a.run(a,a.symbols[b.label].pc)}catch(d){console.log(d.message),
     23alert(d.message)}return b.pc+1}},Go:{compile:function(a){var b=a.getLino();a.next();a.tokenIs("to")&&a.next();var d=a.getToken();a.next();a.addCommand({domain:"basic",keyword:"goto",lino:b,label:d});return!0},run:function(a){return a[a.pc].pc+1}},Gosub:{compile:function(a){var b=a.getLino();a.next();a.tokenIs("to")&&a.next();var d=a.getToken();a.next();a.addCommand({domain:"basic",keyword:"gosub",lino:b,label:d});return!0},run:function(a){var b=a[a.pc];a.stack.push(a.pc+1);return a.symbols[b.label].pc}},
     24Goto:{compile:function(a){var b=a.getLino();a.next();var d=a.getToken();a.next();a.addCommand({domain:"basic",keyword:"goto",lino:b,label:d});return!0},run:function(a){var b=a[a.pc];return b.label?a.symbols[b.label].pc:b.goto}},If:{compile:function(a){var b=a.getLino();a.next();var d=a.condition.compile(a),f=a.getPc();a.addCommand({domain:"basic",keyword:"if",lino:b,condition:d});a.compileOne();if(!a.getToken())return a.getCommandAt(f).else=a.getPc(),!0;a.tokenIs("else")?(b=a.getPc(),a.addCommand({domain:"basic",
     25keyword:"goto",goto:0}),a.getCommandAt(f).else=a.getPc(),a.next(),a.compileOne(!0),a.getCommandAt(b).goto=a.getPc()):a.getCommandAt(f).else=a.getPc();return!0},run:function(a){var b=a[a.pc];return a.condition.test(a,b.condition)?b.pc+1:b.else}},Index:{compile:function(a){var b=a.getLino();a.getTokens();a.next();if(a.isSymbol()){var d=a.getToken();a.next();if(a.tokenIs("to")){a.next();var f=a.getValue();a.addCommand({domain:"basic",keyword:"index",lino:b,symbol:d,value:f});return!0}}return!1},run:function(a){var b=
     26a[a.pc],d=a.getSymbolRecord(b.symbol);d.index=a.getValue(b.value);d.index>=d.elements&&a.error.arrayIndexOutOfRangeError(d.name);return b.pc+1}},Multiply:{compile:function(a){var b=a.getLino();a.next();a.getToken();if(a.isSymbol()){var d=a.getSymbol();var f=a.getCommandAt(d.pc).name}d=a.getValue();a.tokenIs("by")&&a.next();var l=a.getValue();if(a.tokenIs("giving")){a.next();if(a.isSymbol())return f=a.getSymbol(),f=a.getCommandAt(f.pc).name,a.next(),a.addCommand({domain:"basic",keyword:"multiply",
     27lino:b,value1:d,value2:l,target:f}),!0;a.warning("basic multiply': Expected value holder")}else return void 0===f&&a.warning("basic multiply': No target variable given"),a.addCommand({domain:"basic",keyword:"multiply",lino:b,value2:l,target:f}),!0;return!1},run:function(a){var b=a[a.pc],d=b.value1,f=b.value2,l=a.getSymbolRecord(b.target);if(l.isValueHolder){var e=l.value[l.index];d?(a=a.getValue(d)*a.getValue(f),l.value[l.index]={type:"constant",numeric:!0,content:a}):(e.numeric||a.error.nonNumericValueError(),
     28a=e.content*a.getValue(f),l.value[l.index]={type:"constant",numeric:!0,content:a})}else a.error.VariableDoesNotHoldAValueError(l.name);return b.pc+1}},Negate:{compile:function(a){var b=a.getLino();a.getTokens();a.next();if(a.isSymbol()){var d=a.getToken();a.next();a.addCommand({domain:"basic",keyword:"negate",lino:b,symbol:d});return!0}return!1},run:function(a){var b=a[a.pc],d=a.getSymbolRecord(b.symbol);d.isValueHolder?d.value[d.index]={type:"constant",numeric:!0,content:-d.value[d.index].content}:
     29a.error.VariableDoesNotHoldAValueError(d.name);return b.pc+1}},Print:{compile:function(a){var b=a.getLino();a.next();var d=a.getValue();a.addCommand({domain:"basic",keyword:"print",lino:b,value:d});return!0},run:function(a){var b=a[a.pc];a=a.getValue(b.value);console.log("-> "+a);return b.pc+1}},Put:{compile:function(a){var b=a.getLino();a.next();var d=a.getValue();if(a.tokenIs("into")){a.next();if(a.isSymbol()){var f=a.getToken();a.next();a.addCommand({domain:"basic",keyword:"put",lino:b,value:d,
     30target:f});return!0}a.error.noSuchVariableError(a.getToken())}return!1},run:function(a){var b=a[a.pc],d=b.value,f=a.getSymbolRecord(b.target);f.isValueHolder||a.error.variableDoesNotHoldAValueError(f.name);f.value[f.index]=a.evaluate(d);return b.pc+1}},Return:{compile:function(a){var b=a.getLino();a.next();a.addCommand({domain:"basic",keyword:"return",lino:b});return!0},run:function(a){return a.stack.pop()}},Set:{compile:function(a){var b=a.getLino();a.next();if(a.isSymbol()){var d=a.getSymbolRecord();
     31if(!d.isValueHolder)return!1;a.next();if(a.tokenIs("to")){a.next();for(var f=[];;){a.mark();try{f.push(a.getValue())}catch(l){a.rewind();break}}a.addCommand({domain:"basic",keyword:"set",lino:b,type:"setArray",target:d.name,value:f});return!0}a.addCommand({domain:"basic",keyword:"set",lino:b,type:"setBoolean",target:d.name});return!0}a.tokenIs("the")&&a.next();return a.tokenIs("elements")&&(a.next(),a.tokenIs("of")&&(a.next(),a.getTarget(),a.isSymbol()||a.error.unknownVariableError(a.getToken()),
     32d=a.getToken(),a.next(),a.tokenIs("to")))?(a.next(),f=a.getValue(),a.addCommand({domain:"basic",keyword:"set",lino:b,type:"setElements",symbol:d,value:f}),!0):!1},run:function(a){var b=a[a.pc];switch(b.type){case "setBoolean":var d=a.getSymbolRecord(b.target);d.isValueHolder?(d.value[d.index]={type:"boolean",content:!0},b.numeric=!1):a.error.VariableDoesNotHoldAValueError(d.name);break;case "setElements":d=a.getSymbolRecord(b.symbol);d.elements=a.getValue(b.value);d.index=0;d.value=[];for(a=0;a<d.elements;a++)d.value.push({});
     33break;case "setArray":a=a.getSymbolRecord(b.target),a.elements=b.value.length,a.value=b.value}return b.pc+1}},Stop:{compile:function(a){var b=a.getLino();a.next();a.addCommand({domain:"basic",keyword:"stop",lino:b,next:0});return!0},run:function(){return 0}},Take:{compile:function(a){var b=a.getLino();a.next();var d=a.getValue();if(a.tokenIs("from"))if(a.next(),a.getToken(),a.isSymbol()){var f=a.getSymbol();if(a.getCommandAt(f.pc).isValueHolder){if("giving"===a.peek()){f=a.getValue();a.next();var e=
     34a.getToken();a.next();a.addCommand({domain:"basic",keyword:"take",lino:b,value1:d,value2:f,target:e})}else f=a.getToken(),a.next(),a.addCommand({domain:"basic",keyword:"take",lino:b,value1:d,target:f});return!0}a.warning("basic "+g.name+"': Expected value holder")}else{f=a.getValue();if(a.tokenIs("giving"))return a.next(),e=a.getToken(),a.next(),a.addCommand({domain:"basic",keyword:"take",lino:b,value1:d,value2:f,target:e}),!0;a.warning("basic "+g.name+'\': Expected "giving"')}return!1},run:function(a){var b=
     35a[a.pc],d=b.value1,f=b.value2,e=a.getSymbolRecord(b.target);if(e.isValueHolder){var g=e.value[e.index];f?(a=a.getValue(f)-a.getValue(d),e.value[e.index]={type:"constant",numeric:!0,content:a}):(g.numeric||a.error.nonNumericValueError(),a=a.getValue(g)-a.getValue(d),e.value[e.index]={type:"constant",numeric:!0,content:a})}else a.error.VariableDoesNotHoldAValueError(e.name);return b.pc+1}},Toggle:{compile:function(a){var b=a.getLino();a.getTokens();a.next();if(a.isSymbol()){var d=a.getSymbolPc();a.next();
     36a.addCommand({domain:"basic",keyword:"toggle",lino:b,symbol:d});return!0}return!1},run:function(a){var b=a[a.pc],d=a[b.symbol];if(d.isValueHolder){var f=a.domain[d.domain];a=f.value.get(a,d.value[d.index]).content;f.value.put(d,{type:"boolean",content:!a})}else a.error.VariableDoesNotHoldAValueError(d.name);return b.pc+1}},Variable:{compile:function(a){a.compileVariable("basic","variable",!0);return!0},run:function(a){return a[a.pc].pc+1}},Wait:{compile:function(a){var b=a.getLino();a.next();var d=
     37a.getValue(a),f=1E3;switch(a.getToken()){case "milli":case "millis":a.next();f=1;break;case "tick":case "ticks":a.next();f=10;break;case "second":case "seconds":a.next();f=1E3;break;case "minute":case "minutes":a.next(),f=6E4}a.addCommand({domain:"basic",keyword:"wait",lino:b,value:d,multiplier:f});return!0},run:function(a){var b=a[a.pc],d=a.getValue(b.value);setTimeout(function(){a.run(a,b.pc+1)},d*b.multiplier);return 0}},While:{compile:function(a){var b=a.getLino();a.next();var d=a.getCondition(),
     38f=a.getPc();a.addCommand({domain:"basic",keyword:"while",lino:b,condition:d});b=a.getPc();a.addCommand({domain:"basic",keyword:"goto",goto:0});a.compileOne();a.addCommand({domain:"basic",keyword:"goto",goto:f});a.getCommandAt(b).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(b){switch(b){case "add":return a.Add;case "alias":return a.Alias;case "begin":return a.Begin;case "clear":return a.Clear;case "debug":return a.Debug;case "divide":return a.Divide;
     39case "end":return a.End;case "extend":return a.Extend;case "fork":return a.Fork;case "go":return a.Go;case "gosub":return a.Gosub;case "goto":return a.Goto;case "if":return a.If;case "index":return a.Index;case "multiply":return a.Multiply;case "negate":return a.Negate;case "print":return a.Print;case "put":return a.Put;case "return":return a.Return;case "set":return a.Set;case "stop":return a.Stop;case "take":return a.Take;case "toggle":return a.Toggle;case "variable":return a.Variable;case "wait":return a.Wait;
     40case "while":return a.While;default:return!1}},run:function(b){var c=b[b.pc],d=a.getHandler(c.keyword);d||b.error.runtimeError("Unknown keyword '"+c.keyword+"' in 'basic' package");return d.run(b)},isNegate:function(a){return"not"===a.getToken()?(a.next(),!0):!1},value:{compile:function(a){if(a.isSymbol()){var b=a.getToken();a.next();return a.tokenIs("modulo")?(a.next(),a=a.getValue(),{domain:"basic",type:"modulo",name:b,value:a}):{domain:"basic",type:"symbol",name:b}}b=a.getToken();if("true"===b)return a.next(),
     41{domain:"basic",type:"boolean",content:!0};if("false"===b)return a.next(),{domain:"basic",type:"boolean",content:!1};if("random"===b)return a.next(),{domain:"basic",type:"random",range:a.getValue()};if("cos"===b)return a.next(),b=a.getValue(),a.skip("radius"),a=a.getValue(),{domain:"basic",type:"cos",angle_c:b,radius_c:a};if("sin"===b)return a.next(),b=a.getValue(),a.skip("radius"),a=a.getValue(),{domain:"basic",type:"sin",angle_s:b,radius_s:a};if("tan"===b)return a.next(),b=a.getValue(),a.skip("radius"),
     42a=a.getValue(),{domain:"basic",type:"tan",angle_t:b,radius_t:a};if("empty"===b)return a.next(),{domain:"basic",type:"empty"};a.tokenIs("the")&&a.next();switch(a.getToken()){case "index":a.next();if(a.tokenIs("of")&&(a.next(),a.isSymbol()))return b=a.getToken(),a.next(),{domain:"basic",type:"index",name:b};break;case "value":a.next();if(a.tokenIs("of"))return a.next(),{domain:"basic",type:"valueOf",value:a.getValue()};break;case "length":a.next();if(a.tokenIs("of"))return a.next(),{domain:"basic",
     43type:"lengthOf",value:a.getValue()};break;case "left":a.next();b=a.getValue();if(a.tokenIs("of"))return a.next(),a=a.getValue(),{domain:"basic",type:"left",count:b,value:a};break;case "right":if(a.next(),b=a.getValue(),a.tokenIs("of"))return a.next(),a=a.getValue(),{domain:"basic",type:"right",count:b,value:a}}return null},get:function(a,c){switch(c.type){case "boolean":return{type:"boolean",numeric:!1,content:c.content};case "index":return{type:"constant",numeric:!0,content:a.getSymbolRecord(c.name).index};
     44case "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))*a,10)};case "tan":return b=a.getValue(c.angle_t),a=a.getValue(c.radius_t),{type:"constant",
     45numeric:!0,content:parseInt(Math.tan(.01745329*parseFloat(b))*a,10)};case "valueOf":return{type:"constant",numeric:!0,content:a.getValue(c.value)};case "lengthOf":return{type:"constant",numeric:!0,content:a.getValue(c.value).length};case "left":return a.getValue(c.value),{type:"constant",numeric:!1,content:a.getValue(c.value).substr(0,a.getValue(c.count))};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};
     46case "empty":return{type:"constant",numeric:!1,content:""}}return null},put:function(a,c){a.value[a.index]=c}},condition:{compile:function(b){if(b.tokenIs("not"))return b.next(),{domain:"basic",type:"not",value:b.getValue()};try{var c=b.getValue();if("is"===b.getToken()){b.next();var d=a.isNegate(b);if(b.tokenIs("greater")){b.next();if(b.tokenIs("than")){b.next();var f=b.getValue();return{domain:"basic",type:"greater",value1:c,value2:f,negate:d}}return null}if(b.tokenIs("less")){b.next();if(b.tokenIs("than")){b.next();
     47var e=b.getValue();return{domain:"basic",type:"less",value1:c,value2:e,negate:d}}return null}var g=b.getValue();return{domain:"basic",type:"is",value1:c,value2:g,negate:d}}if(c)return{domain:"basic",type:"boolean",value:c}}catch(n){console.log(n)}return null},test:function(a,c){switch(c.type){case "boolean":return a.getValue(c.value);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=
     48a.compare(a,c.value1,c.value2),c.negate?0<=a:0>a;case "not":return!a.getValue(c.value)}}}};k.exports=a},{}],3:[function(e,k,h){var g={A:{compile:function(a){a.compileVariable("browser","a",!1,"dom");return!0},run:function(a){return a[a.pc].pc+1}},Alert:{compile:function(a){var b=a.getLino();a.next();var c=a.getValue();a.addCommand({domain:"browser",keyword:"alert",lino:b,value:c});return!0},run:function(a){var b=a.value.evaluate(a,a[a.pc].value).content;alert(b);return a[a.pc].pc+1}},Attach:{compile:function(a){var b=
     49a.getLino();a.getTokens();a.next();if(a.isSymbol()){var c=a.getProgram()[a.getSymbol().pc];switch(c.keyword){case "button":case "div":case "header":case "p":case "a":case "img":case "input":case "ul":case "li":case "select":case "span":case "pre":case "popup":a.next();if(a.tokenIs("to")){a.next();var d=a.getValue();a.addCommand({domain:"browser",keyword:"attach",lino:b,type:c.keyword,symbol:c.name,cssId:d});return!0}break;default:return a.addWarning("type '"+c.keyword+"' not recognized in browser 'attach'"),
     50!1}}a.addWarning("Unrecognised syntax in 'attach'");return!1},run:function(a){var b=a[a.pc],c=a.value.evaluate(a,b.cssId).content,d=document.getElementById(c);d||a.error.noSuchElementError(c);var f=a.getSymbolRecord(b.symbol);f.value[f.index]={type:"constant",numeric:"false",content:c};"popup"===b.type&&(a.popups.push(d.id),window.onclick=function(b){a.popups.includes(b.target.id)&&(b.target.style.display="none")});return b.pc+1}},Audioclip:{compile:function(a){a.compileVariable("browser","audioclip");
     51return!0},run:function(a){return a[a.pc].pc+1}},BUTTON:{compile:function(a){a.compileVariable("browser","button",!1,"dom");return!0},run:function(a){return a[a.pc].pc+1}},Create:{compile:function(a){var b=a.getLino();a.next();if(a.isSymbol()){var c=a.getSymbolRecord(),d=c.name;a.next();switch(c.keyword){case "audioclip":a.tokenIs("from")&&a.next();var f=a.getValue();a.addCommand({domain:"browser",keyword:"create",type:"audioclip",name:c.name,lino:b,target:d,value:f});return!0;case "div":case "p":case "h1":case "h2":case "h3":case "h4":case "h5":case "h6":case "span":case "button":case "input":case "pre":if(d=
     52"","input"===c.keyword&&(a.tokenIs("type")?(a.next(),d=a.getToken(),a.next()):a.error.missingInputTypeError()),a.tokenIs("in")&&(a.next(),a.isSymbol())){f=a.getSymbolRecord();"dom"!==f.extra&&a.error.inappropriateTypeError(f.keyword);a.next();for(var e="",g="",h="",k=!0;k;){var p=a.getToken();if(!p)break;a.next();switch(p){case "class":e=a.getValue();break;case "style":g=a.getValue();break;case "text":h=a.getValue();break;default:a.prev(),k=!1}}a.addCommand({domain:"browser",keyword:"create",lino:b,
     53type:c.keyword,name:c.name,inputType:d,className:e,style:g,text:h,parent:f.name});return!0}}}return!1},run:function(a){var b=a[a.pc],c=a.getSymbolRecord(b.name);switch(b.type){case "audioclip":c.value[c.index]=b.value;break;default:var d=a.getSymbolRecord(b.parent),f=document.getElementById(d.value[d.index].content);d=document.createElement(b.type);d.id="easycoder-"+c.name+"-"+c.index;c.value[c.index]={type:"constant",numeric:!1,content:d.id};f.appendChild(d);b.inputType&&d.setAttribute("type",b.inputType);
     54b.className&&(d.className=b.className);c=a.value.evaluate(a,b.style).content;c=$jscomp.makeIterator(c.split(";"));for(f=c.next();!f.done;f=c.next())f=f.value.split(":"),d.style[f[0]]=f[1];b.text&&(d.textContent=a.value.evaluate(a,b.text).content)}return a[a.pc].pc+1}},DIV:{compile:function(a){a.compileVariable("browser","div",!1,"dom");return!0},run:function(a){return a[a.pc].pc+1}},Header:{compile:function(a){a.compileVariable("browser","header",!1,"dom");return!0},run:function(a){return a[a.pc].pc+
     551}},Hide:{compile:function(a){var b=a.getLino();a.getTokens();a.next();if(a.isSymbol()){var c=a.getToken();a.next();a.addCommand({domain:"browser",keyword:"hide",lino:b,symbol:c});return!0}a.addWarning("Unrecognised syntax in 'hide'");return!1},run:function(a){var b=a[a.pc];a=a.getSymbolRecord(b.symbol);document.getElementById(a.value[a.index].content).style.visibility="hidden";return b.pc+1}},IMG:{compile:function(a){a.compileVariable("browser","img",!1,"dom");return!0},run:function(a){return a[a.pc].pc+
    58561}},INPUT:{compile:function(a){a.compileVariable("browser","input",!1,"dom");return!0},run:function(a){return a[a.pc].pc+1}},LI:{compile:function(a){a.compileVariable("browser","li",!1,"dom");return!0},run:function(a){return a[a.pc].pc+1}},Location:{compile:function(a){var b=a.getLino();a.getTokens();a.next();var c=a.getValue();a.addCommand({domain:"browser",keyword:"location",lino:b,location:c});return!0},run:function(a){a=a[a.pc];window.location=a.location.content;return a.pc+1}},On:{compile:function(a){var b=
    59 a.getLino();a.next();var c=a.getToken();switch(c){case "change":case "click":if(a.next(),a.isSymbol()){var d=a.getSymbolRecord();a.next();if("dom"!==d.extra)return!1;a.addCommand({domain:"browser",keyword:"on",lino:b,action:c,symbol:d.name});b=a.getPc();a.addCommand({domain:"basic",keyword:"goto",goto:0});a.compileOne();a.getCommandAt(b).goto=a.getPc();return!0}}a.addWarning("Unrecognised syntax in 'on'");return!1},run:function(a){var b=a[a.pc],c=a.getSymbolRecord(a,b.symbol);switch(b.action){case "change":if("select"===
    60 c.keyword){var d=c.value[c.index].content;if(d){var f=document.getElementById(d);f.targetPc=b.pc+2;f.addEventListener("change",function(){try{a.run(a,f.targetPc)}catch(l){console.log(l.message),alert(l.message)}return!1})}}break;case "click":c.value.forEach(function(d,f){if(d=d.content)d=document.getElementById(d),d.targetPc=b.pc+2,d.targetIndex=f,d.onclick=function(b){b.target.blur();c.index=b.target.targetIndex;try{a.run(a,b.target.targetPc)}catch(p){console.log(p.message),alert(p.message)}return!1}})}return b.pc+
    61 1}},P:{compile:function(a){a.compileVariable("browser","p",!1,"dom");return!0},run:function(a){return a[a.pc].pc+1}},Play:{compile:function(a){var b=a.getLino();a.next();if(a.isSymbol()){var c=a.getSymbolRecord();"audioclip"===c.keyword&&(a.next(),a.addCommand({domain:"browser",keyword:"play",lino:b,target:c.name}))}return!0},run:function(a){var b=a.getSymbolRecord(a,a[a.pc].target);b=a.value.evaluate(a,b.value[b.index]).content;(new Audio(b)).play();return a[a.pc].pc+1}},Popup:{compile:function(a){a.compileVariable("browser",
    62 "popup");return!0},run:function(a){return a[a.pc].pc+1}},Remove:{compile:function(a){var b=a.getLino();a.getTokens();a.next();if(a.isSymbol()){var c=a.getToken();a.next();a.addCommand({domain:"browser",keyword:"remove",lino:b,symbol:c});return!0}a.unrecognisedSymbol(a.getToken());return!1},run:function(a){var b=a[a.pc];a=a.getSymbolRecord(a,b.symbol);document.getElementById(a.value[a.index].content).style.display="none";return b.pc+1}},SELECT:{compile:function(a){a.compileVariable("browser","select",
    63 !1,"dom");return!0},run:function(a){return a[a.pc].pc+1}},Set:{compile:function(a){var b=a.getLino();a.next();if(a.isSymbol()){var c=a.getToken();a.next();if(a.tokenIs("from")&&(a.next(),a.isSymbol())){var d=a.getToken();a.next();a.addCommand({domain:"browser",keyword:"set",lino:b,type:"setContentVar",source:d,target:c});return!0}}else if(c=a.getToken(),"the"===c&&(a.next(),c=a.getToken()),"content"===c){if(a.next(),a.tokenIs("of")&&(a.next(),a.isSymbol())){c=a.getToken();a.next();if(a.tokenIs("from")&&
    64 (a.next(),a.isSymbol()))return d=a.getToken(),a.next(),a.addCommand({domain:"browser",keyword:"set",lino:b,type:"setContentVar",source:d,target:c}),!0;if(a.tokenIs("to"))return a.next(),d=a.getValue(),a.addCommand({domain:"browser",keyword:"set",lino:b,type:"setContent",value:d,target:c}),!0}}else if("text"===c){if(a.next(),a.tokenIs("of")&&(a.next(),a.isSymbol()))switch(c=a.getSymbolRecord(),c.keyword){case "button":case "input":if(a.next(),a.tokenIs("to"))return a.next(),d=a.getValue(),a.addCommand({domain:"browser",
    65 keyword:"set",lino:b,type:"setText",symbolName:c.name,value:d}),!0}}else if("attribute"===c){if(a.next(),c=a.getValue(),a.tokenIs("of")&&(a.next(),a.isSymbol()&&(d=a.getToken(),a.next(),a.tokenIs("to")))){a.next();var f=a.getValue();a.addCommand({domain:"browser",keyword:"set",lino:b,type:"setAttribute",symbolName:d,attributeName:c,attributeValue:f});return!0}}else if("style"===c&&(a.next(),c=a.getValue(),a.tokenIs("of")&&(a.next(),a.isSymbol()&&(d=a.getToken(),a.next(),a.tokenIs("to")&&(a.next(),
    66 f=a.getValue())))))return a.addCommand({domain:"browser",keyword:"set",lino:b,type:"setStyle",symbolName:d,styleName:c,styleValue:f}),!0;a.addWarning("Unrecognised syntax in 'set'");return!1},run:function(a){var b=a[a.pc];switch(b.type){case "setContentVar":var c=a.getSymbolRecord(a,b.source);a=a.getSymbolRecord(a,b.target);c=document.getElementById(c.value[c.index].content);var d=document.getElementById(a.value[a.index].content);d.innerHTML=c.innerHTML;break;case "setContent":c=a.value.evaluate(a,
    67 b.value);var f=c.content;c.numeric&&(f=""+f);a=a.getSymbolRecord(a,b.target);a=a.value[a.index].content;d=document.getElementById(a);d.innerHTML=f;break;case "setText":c=a.getSymbolRecord(a,b.symbolName);d=document.getElementById(c.value[c.index].content);f=a.value.evaluate(a,b.value).content;switch(c.keyword){case "button":d.innerHTML=f;break;case "input":d.value=f}break;case "setAttribute":c=a.getSymbolRecord(a,b.symbolName);switch(b.attributeValue.type){case "constant":f=b.attributeValue.content;
    68 break;case "symbol":a=a.getSymbolRecord(a,b.attributeValue.name),f=a.value[a.index].content}a=c.value[c.index].content;d=document.getElementById(a);d.setAttribute(b.attributeName.content,f);break;case "setStyle":c=a.getSymbolRecord(a,b.symbolName),f=a.value.evaluate(a,b.styleValue),c.value[c.index]||a.error.runtimeError("Variable '"+c.name+"' has not been assigned."),a=c.value[c.index].content,a=document.getElementById(a),c={},c[b.styleName.content]=f.content,Object.assign(a.style,c)}return b.pc+
    69 1}},Show:{compile:function(a){var b=a.getLino();a.getTokens();a.next();if(a.isSymbol()){var c=a.getToken();a.next();a.addCommand({domain:"browser",keyword:"show",lino:b,symbol:c});return!0}a.addWarning("Unrecognised syntax in 'show'");return!1},run:function(a){var b=a[a.pc];a=a.getSymbolRecord(a,b.symbol);var c=document.getElementById(a.value[a.index].content);switch(a.type){case "span":c.style.display="inline";break;default:c.style.display="block"}c.style.visibility="visible";return b.pc+1}},SPAN:{compile:function(a){a.compileVariable("browser",
    70 "span",!1,"dom");return!0},run:function(a){return a[a.pc].pc+1}},Trace:{compile:function(a){var b=a.getLino();a.next();var c=[];if(a.isSymbol()){for(;a.isSymbol();)c.push(a.getToken()),a.next();var d="horizontal";if(a.tokenIs("horizontal")||a.tokenIs("vertical"))d=a.getToken(),a.next();a.addCommand({domain:"browser",keyword:"trace",variant:"setup",lino:b,variables:c,alignment:d});return!0}a.addCommand({domain:"browser",keyword:"trace",variant:"run",lino:b});return!0},run:function(a){var b=a[a.pc];
    71 switch(b.variant){case "setup":console.log("Set up tracer");a.tracer={variables:b.variables,alignment:b.alignment};break;case "run":console.log("Run tracer"),a.tracer||(a.tracer={variables:[],alignment:"horizontal"}),a.tracing=!0,a.stop=!1}return a.pc+1}},UL:{compile:function(a){a.compileVariable("browser","ul",!1,"dom");return!0},run:function(a){return a[a.pc].pc+1}},getHandler:function(a){switch(a){case "a":return g.A;case "alert":return g.Alert;case "attach":return g.Attach;case "audioclip":return g.Audioclip;
    72 case "button":return g.BUTTON;case "create":return g.Create;case "div":return g.DIV;case "header":case "h1":case "h2":case "h3":case "h4":case "h5":case "h6":return g.Header;case "hide":return g.Hide;case "img":return g.IMG;case "input":return g.INPUT;case "li":return g.LI;case "location":return g.Location;case "on":return g.On;case "p":return g.P;case "play":return g.Play;case "popup":return g.Popup;case "remove":return g.Remove;case "select":return g.SELECT;case "set":return g.Set;case "show":return g.Show;
    73 case "span":return g.SPAN;case "trace":return g.Trace;case "ul":return g.UL;default:return!1}},run:function(a){var b=a[a.pc],c=g.getHandler(b.keyword);c||a.error.runtimeError("Unknown keyword '"+b.keyword+"' in 'browser' package");return c.run(a)},value:{compile:function(a){var b=a.getToken();if("property"===b){a.next();b=a.getValue();if(a.tokenIs("of")&&(a.next(),a.isSymbol())){var c=a.getSymbolRecord();a.next();switch(c.keyword){case "select":case "variable":return{domain:"browser",type:"property",
    74 property:b,symbol:c.name}}}return null}if("mobile"===b)return a.next(),{domain:"browser",type:"mobile"};if("br"===b)return a.next(),{domain:"browser",type:"br"};if("color"===b)return a.next(),{domain:"browser",type:"color",value:a.getValue()};a.tokenIs("the")&&a.next();b=a.getToken();return"content"===b?(a.next(),a.tokenIs("of")&&(a.next(),a.isSymbol())?(b=a.getSymbolRecord(),a.next(),{domain:"browser",type:"contentOf",pc:b.pc}):null):["width","height"].includes(b)&&(a.next(),a.tokenIs("of")&&(a.next(),
    75 a.isSymbol()&&(c=a.getSymbolRecord(),a.next(),"dom"===c.extra)))?{domain:"browser",type:"width"===b?"widthOf":"heightOf",symbol:c.name}:null},get:function(a,b){switch(b.type){case "symbol":b=a.getSymbolRecord(a,b.name);a=b.value[b.index].content;switch(b.keyword){case "input":case "select":return a=document.getElementById(a),{type:"constant",numeric:!1,content:a.value}}break;case "property":var c=a.value.evaluate(a,b.property).content;b=a.getSymbolRecord(a,b.symbol);content=a.value.evaluate(a,b.value[b.index]).content;
    76 content=JSON.parse(content);content=a.value.decode(content[c],a.encoding);switch(b.keyword){case "select":document.getElementById(content);break;case "variable":return{type:"constant",numeric:!1,content:content}}break;case "mobile":return{domain:"browser",type:"boolean",content:"undefined"!==typeof window.orientation||-1!==navigator.userAgent.indexOf("IEMobile")};case "br":return{type:"constant",numeric:!1,content:"<br />"};case "widthOf":return b=a.getSymbolRecord(a,b.symbol),a=b.value[b.index].content,
    77 a=document.getElementById(a),{type:"constant",numeric:!0,content:a.offsetWidth};case "heightOf":return b=a.getSymbolRecord(a,b.symbol),a=b.value[b.index].content,a=document.getElementById(a),{type:"constant",numeric:!0,content:a.offsetHeight};case "color":for(a=a.value.evaluate(a,b.value).content.toString(16);6>a.length;)a="00"+a;return{type:"constant",numeric:!1,content:"#"+a}}}},condition:{compile:function(a){},test:function(a,b){}},setStyles:function(a,b){a=document.getElementById(a);b=b.split(";");
    78 b=$jscomp.makeIterator(b);for(var c=b.next();!c.done;c=b.next())c=c.value.split(":"),a.setAttribute(c[0],c[1])}};k.exports=g},{}],4:[function(e,k,h){var g={Json:{compile:function(a){var b=a.getLino();a.getTokens();a.next();switch(a.getToken()){case "get":a.next();if(a.isSymbol()){var c=a.getSymbolRecord();if("variable"===c.keyword){a.next();if(a.tokenIs("from")){a.next();var d=a.getValue();a.addCommand({domain:"json",keyword:"json",lino:b,request:"get",target:c.name,value:d});return!0}if(a.tokenIs("as")&&
    79 (a.next(),a.tokenIs("item"))){a.next();d=a.getValue();if(a.tokenIs("of")&&(a.next(),a.isSymbol())){var f=a.getToken();a.next();a.addCommand({domain:"json",keyword:"json",lino:b,request:"getItem",target:c.name,item:d,source:f})}return!0}}}break;case "set":a.next();if(a.tokenIs("encoding")){a.next();if(a.tokenIs("to"))return a.next(),c=a.getValue(),a.addCommand({domain:"json",keyword:"json",lino:b,request:"encoding",encoding:c}),!0;a.addWarning("Unknown encoding option");return!1}if(a.isSymbol()&&(c=
    80 a.getSymbolRecord(),"select"===c.keyword&&(a.next(),a.tokenIs("from")&&(a.next(),a.isSymbol()&&(d=a.getSymbolRecord(),"variable"===d.keyword)))))return a.next(),f=null,a.tokenIs("as")&&(a.next(),f=a.getValue()),a.addCommand({domain:"json",keyword:"json",lino:b,request:"setList",target:c.name,source:d.name,display:f}),!0}a.addWarning("Unrecognised syntax in 'json'");return!1},run:function(a){var b=a[a.pc];switch(b.request){case "get":a.ajaxCommand=b;var c=new XMLHttpRequest;c.onreadystatechange=function(){if(4===
    81 this.readyState&&200===this.status){var b=a.ajaxCommand,c=a.getSymbolRecord(a,b.target);c.value[c.index]={type:"constant",numeric:!1,content:this.responseText};a.run(a,b.pc+1)}};b=a.value.evaluate(a,b.value);c.open("GET",b.content,!0);c.send();return 0;case "getItem":var d=a.getSymbolRecord(a,b.source);d=JSON.parse(d.value[d.index].content)[b.item.content];c=a.getSymbolRecord(a,b.target);c.value[c.index]={type:"constant",numeric:!1,content:d};break;case "setList":d=a.getSymbolRecord(a,b.source);c=
    82 a.getSymbolRecord(a,b.target);var f=document.getElementById(c.value[c.index].content);f.options.length=0;var e=b.display?a.value.evaluate(a,b.display).content:null;JSON.parse(d.value[d.index].content).forEach(function(b){var c=document.createElement("option");c.value=e?JSON.stringify(b):b;c.innerHTML=e?a.value.decode(b[e],a.encoding):b;f.appendChild(c)});f.selectedIndex=-1;break;case "encoding":a.encoding=a.value.evaluate(a,b.encoding).content}return b.pc+1}},getHandler:function(a){switch(a){case "json":return g.Json;
    83 default:return!1}},run:function(a){var b=a[a.pc],c=g.getHandler(b.keyword);c||a.error.runtimeError("Unknown keyword '"+b.keyword+"' in 'json' package");return c.run(a)},value:{compile:function(a){},get:function(a,b){}},condition:{compile:function(a){},test:function(a,b){}}};k.exports=g},{}],5:[function(e,k,h){var g={Attach:{compile:function(a){var b=a.getLino();a.getTokens();a.next();if(a.isSymbol()){var c=a.getProgram()[a.getSymbol().pc];switch(c.keyword){case "shape":case "svg":a.next();if(a.tokenIs("to")){a.next();
    84 var d=a.getValue();a.addCommand({domain:"svg",keyword:"attach",lino:b,type:c.keyword,symbol:c.name,cssId:d});return!0}break;default:compile.error.InappropriateVariableTypeError(c.keyword)}}a.addWarning("Unrecognised syntax in 'attach'");return!1},run:function(a){var b=a[a.pc],c=a.value.evaluate(a,b.cssId).content;document.getElementById(c)||a.error.noSuchElementError(c);a=a.getSymbolRecord(a,b.symbol);a.value[a.index]={type:"constant",numeric:"false",content:c};return b.pc+1}},Circle:{compile:function(a){a.compileVariable("svg",
    85 "circle",!1,"dom");return!0},run:function(a){return a[a.pc].pc+1}},Create:{compile:function(a){var b=a.getLino();a.next();if(a.isSymbol()){var c=a.getSymbolRecord();a.next();switch(c.keyword){case "svg":if(a.tokenIs("in")&&(a.next(),a.isSymbol())){var d=a.getToken();a.next();for(var f=null,e=!0;e;){var g=a.getToken();a.next();switch(g){case "style":f=a.getValue();break;default:a.prev(),e=!1}}f||(f={type:"constant",numeric:!1,content:"width:100%;height:100%"});a.addCommand({domain:"svg",keyword:"create",
    86 lino:b,type:"svg",name:c.name,style:f,parent:d});return!0}break;case "group":if(a.tokenIs("in")&&(a.next(),a.isSymbol()))return f=a.getSymbolRecord(),["svg","group"].includes(f.keyword)||a.error.inappropriateTypeError(f.keyword),a.next(),a.addCommand({domain:"svg",keyword:"create",lino:b,type:"group",name:c.name,parent:f.name}),!0;break;case "circle":case "ellipse":case "line":case "rect":case "text":if(a.tokenIs("in")&&(a.next(),a.isSymbol())){d=a.getSymbolRecord();["svg","group"].includes(d.keyword)||
    87 a.error.inappropriateTypeError(d.keyword);a.next();for(e=!0;e;){var h=a.getToken();a.next();switch(h){case "style":f=a.getValue();break;case "text":g=a.getValue();break;default:a.prev(),e=!1}}a.addCommand({domain:"svg",keyword:"create",lino:b,type:c.keyword,name:c.name,style:f,text:g,parent:d.name});return!0}}}return!1},run:function(a){var b=a[a.pc],c=a.getSymbolRecord(a,b.parent),d=a.getSymbolRecord(a,b.name);if("group"===b.type)d.parent=b.parent,d.x=0,d.y=0;else{if("group"===c.keyword){var f=c;
    88 var e=f.value[f.index];e.content||(e.content=[]);for(e.content.push({name:d.name,index:d.index});"group"===c.keyword;)c=a.getSymbolRecord(a,c.parent)}e=document.getElementById(c.value[c.index].content);c=document.createElementNS("http://www.w3.org/2000/svg",b.type);e.appendChild(c);e="ec-"+d.name+"-"+d.index;c.setAttribute("id",e);"text"===d.keyword&&(c.textContent=a.value.evaluate(a,b.text).content);d.value[d.index]={type:"constant",numeric:!1,content:e};if(b.style){b=a.value.evaluate(a,b.style).content;
    89 a.domain.browser.setStyles(e,b);b=d.value[d.index];switch(d.keyword){case "circle":case "ellipse":b.x=c.getAttribute("cx");b.y=c.getAttribute("cy");break;case "line":b.x=c.getAttribute("x1");b.y=c.getAttribute("y1");b.x2=c.getAttribute("x2");b.y2=c.getAttribute("y2");break;case "rect":case "text":b.x=c.getAttribute("x"),b.y=c.getAttribute("y")}f&&(b.groupName=f.name,b.groupIndex=f.index)}}return a[a.pc].pc+1}},Ellipse:{compile:function(a){a.compileVariable("svg","ellipse",!1,"dom");return!0},run:function(a){return a[a.pc].pc+
    90 1}},Group:{compile:function(a){a.compileVariable("svg","group");return!0},run:function(a){return a[a.pc].pc+1}},Line:{compile:function(a){a.compileVariable("svg","line",!1,"dom");return!0},run:function(a){return a[a.pc].pc+1}},Move:{compile:function(a){var b=a.getLino();a.next();if(a.isSymbol()){var c=a.getSymbolRecord();a.next();if(a.tokenIs("to")){a.next();var d=a.getValue(),f=a.getValue();a.addCommand({domain:"svg",keyword:"move",lino:b,type:"moveTo",name:c.name,x:d,y:f});return!0}}return!1},run:function(a){var b=
    91 a[a.pc],c=a.value.evaluate(a,b.x).content,d=a.value.evaluate(a,b.y).content;b=a.getSymbolRecord(a,b.name);switch(b.keyword){case "group":for(var f=$jscomp.makeIterator(b.value[b.index].content),e=f.next();!e.done;e=f.next()){var g=e.value;e=a.getSymbolRecord(a,g.name);g=e.value[g.index];var h=document.getElementById(g.content),k=parseInt(g.x)+c,q=parseInt(g.y)+d;switch(e.keyword){case "circle":case "ellipse":h.setAttribute("cx",k);h.setAttribute("cy",q);break;case "line":h.setAttribute("x1",k);h.setAttribute("y1",
    92 q);h.setAttribute("x2",parseInt(g.x2)+c);h.setAttribute("y2",parseInt(g.y2)+d);break;case "rect":case "text":h.setAttribute("x",k),h.setAttribute("y",q)}}b.x=c;b.y=d;break;case "circle":case "ellipse":case "line":case "rect":case "text":e=f=0;g=b.value[b.index];g.groupName&&(e=a.getSymbolRecord(a,g.groupName),f=e.x,e=e.y);g=b.value[b.index];h=document.getElementById(b.value[b.index].content);switch(b.keyword){case "circle":case "ellipse":h.setAttribute("cx",f+c);h.setAttribute("cy",e+d);break;case "line":h.setAttribute("x1",
    93 f+c);h.setAttribute("y1",e+d);b=parseInt(g.x2)-parseInt(g.x1);k=parseInt(g.y2)-parseInt(g.y1);h.setAttribute("x2",f+b+c);h.setAttribute("y2",e+k+d);break;case "rect":case "text":h.setAttribute("x",f+c),h.setAttribute("y",e+d)}g.x=c;g.y=d}return a[a.pc].pc+1}},On:{compile:function(a){var b=a.getLino();a.next();var c=a.getToken();switch(c){case "click":if(a.next(),a.isSymbol()){var d=a.getSymbolRecord();a.next();if("group"!==d.keyword)return!1;a.addCommand({domain:"svg",keyword:"on",lino:b,action:c,
    94 symbol:d.name});b=a.getPc();a.addCommand({domain:"basic",keyword:"goto",goto:0});a.compileOne();a.getCommandAt(b).goto=a.getPc();return!0}}a.addWarning("Unrecognised syntax in 'on'");return!1},run:function(a){var b=a[a.pc],c=a.getSymbolRecord(a,b.symbol);switch(b.action){case "click":if("group"===c.keyword)for(var d=$jscomp.makeIterator(c.value),e=d.next();!e.done;e=d.next())if(e=e.value,e.content){e=$jscomp.makeIterator(e.content);for(var g=e.next();!g.done;g=e.next()){g=g.value;var h=a.getSymbolRecord(a,
    95 g.name),k=h.value[g.index];k.content&&(k=document.getElementById(k.content),k.targetPc=b.pc+2,k.contentItem=h,k.contentIndex=g.index,k.onclick=function(b){b.target.blur();var d=b.target.contentItem;d.index=b.target.contentIndex;d=d.value[d.index];if(d.groupName){c.index=d.groupIndex;d=$jscomp.makeIterator(c.value[c.index].content);for(var e=d.next();!e.done;e=d.next())e=e.value,a.getSymbolRecord(a,e.name).index=e.index}try{a.run(a,b.target.targetPc)}catch(t){a.reportError(a.source,t)}return!1})}}}return b.pc+
    96 1}},Rect:{compile:function(a){a.compileVariable("svg","rect",!1,"dom");return!0},run:function(a){return a[a.pc].pc+1}},Set:{compile:function(a){var b=a.getLino();a.next();var c=a.getToken();"the"===c&&(a.next(),c=a.getToken());if("text"===c&&(a.next(),a.tokenIs("of")&&(a.next(),a.isSymbol())))switch(c=a.getSymbolRecord(),c.keyword){case "text":if(a.next(),a.tokenIs("to")){a.next();var d=a.getValue();a.addCommand({domain:"svg",keyword:"set",lino:b,type:"setText",symbolName:c.name,value:d});return!0}}return!1},
    97 run:function(a){var b=a[a.pc];switch(b.type){case "setText":var c=a.getSymbolRecord(a,b.symbolName);var d=document.getElementById(c.value[c.index].content);a=a.value.evaluate(a,b.value).content;switch(c.keyword){case "text":d.innerHTML=a}}return b.pc+1}},SVG:{compile:function(a){a.compileVariable("svg","svg");return!0},run:function(a){return a[a.pc].pc+1}},Text:{compile:function(a){a.compileVariable("svg","text",!1,"dom");return!0},run:function(a){return a[a.pc].pc+1}},getHandler:function(a){switch(a){case "attach":return g.Attach;
    98 case "circle":return g.Circle;case "create":return g.Create;case "ellipse":return g.Ellipse;case "group":return g.Group;case "line":return g.Line;case "move":return g.Move;case "on":return g.On;case "rect":return g.Rect;case "set":return g.Set;case "svg":return g.SVG;case "text":return g.Text;default:return!1}},run:function(a){var b=a[a.pc],c=g.getHandler(b.keyword);c||a.error.runtimeError("Unknown keyword '"+b.keyword+"' in 'svg' package");return c.run(a)},value:{compile:function(a){a.tokenIs("the")&&
    99 a.next();if(a.tokenIs("text")&&(a.next(),a.tokenIs("of")&&(a.next(),a.isSymbol()))){var b=a.getSymbolRecord();a.next();if("text"===b.keyword)return{domain:"svg",type:"text",name:b.name}}return null},get:function(a,b){switch(b.type){case "text":return a=a.getSymbolRecord(a,b.name),{type:"constant",numeric:!1,content:document.getElementById(a.value[a.index].content).innerHTML}}}},condition:{compile:function(a){},test:function(a,b){}}};k.exports=g},{}],6:[function(e,k,h){k.exports=function(e,a,b){a=
    100 e.value.evaluate(e,a);b=e.value.evaluate(e,b);a.numeric!==b.numeric&&e.error.dataTypeMismatchError();e=a.content;b=b.content;return e>b?1:e<b?-1:0}},{}],7:[function(e,k,h){var g=Object.assign||function(a){for(var b=1;b<arguments.length;b++){var c=arguments[b],e;for(e in c)Object.prototype.hasOwnProperty.call(c,e)&&(a[e]=c[e])}return a},a=this,b={getTokens:function(){return a.tokens},addWarning:function(b){a.warnings.push(b)},warning:function(a){b.addWarning(a);throw Error();},unrecognisedSymbol:function(a){b.addWarning("Unrecognised symbol '"+
    101 a+"'")},getWarnings:function(){return a.warnings},getIndex:function(){return a.index},next:function(b){a.index+=void 0===b?1:b},peek:function(){return a.tokens[a.index+1].token},getToken:function(){return a.index>=a.tokens.length?null:a.tokens[a.index]?a.tokens[a.index].token:null},prev:function(){a.index--},getLino:function(){return a.index>=a.tokens.length?0:a.tokens[a.index].lino},tokenIs:function(b){return a.index>=a.tokens.length?!1:b===a.tokens[a.index].token},getTarget:function(b){b=void 0===
    102 b?a.index:b;return a.tokens[b].token},getTargetPc:function(c){c=void 0===c?a.index:c;return a.symbols[b.getTarget(c)].pc},getCommandAt:function(b){return a.program[b]},isSymbol:function(){return b.getTarget()in a.symbols},getSymbol:function(){return a.symbols[b.getToken()]},getSymbolPc:function(){return b.getSymbol().pc},getSymbolRecord:function(){return a.program[b.getSymbolPc()]},getSymbols:function(){return a.symbols},getProgram:function(){return a.program},getPc:function(){return a.program.length},
    103 getValue:function(){return b.value.compile(b)},addCommand:function(b){a.program.push(g({pc:a.program.length},b))},addSymbol:function(b,d){a.symbols[b]={pc:d}},mark:function(){a.savedMark=a.index},rewind:function(){a.index=a.savedMark},compileVariable:function(c,d,e,g){e=void 0===e?!1:e;g=void 0===g?null:g;b.next();var f=b.getLino(),h=b.getTokens()[b.getIndex()];a.symbols[h.token]&&b.error.duplicateSymbolError(h.token);var k=b.getPc();b.next();b.addSymbol(h.token,k);b.addCommand({domain:c,keyword:d,
    104 lino:f,isSymbol:!0,isValueHolder:e,name:h.token,elements:1,index:0,value:[{}],extra:g})},compileToken:function(){var a=b.getToken();if(a){var d=b.getIndex();b.mark();for(var e=$jscomp.makeIterator(Object.keys(b.domain)),g=e.next();!g.done;g=e.next()){if((g=b.domain[g.value].getHandler(a))&&g.compile(b))return;b.rewind()}b.error.dontUnderstandError(a,d)}},compileOne:function(){var c=b.getToken();if(c){a.warnings=[];var d=a.program.length;c.endsWith(":")?(a.symbols[c.substring(0,c.length-1)]={pc:d},
    105 a.index++):b.compileToken()}},compileFromHere:function(c){for(;a.index<a.tokens.length;){var d=a.tokens[a.index].token;if("else"===d)return a.program;b.compileOne();if(-1<c.indexOf(d))break}},compile:function(c){a.tokens=c;a.index=0;a.program=[];a.symbols={};a.warnings=[];b.compileFromHere([]);b.addCommand({domain:"basic",keyword:"stop",lino:b.getLino(),next:0});return a.program}};k.exports=b},{}],8:[function(e,k,h){var g=Object.assign||function(a){for(var b=1;b<arguments.length;b++){var c=arguments[b],
    106 d;for(d in c)Object.prototype.hasOwnProperty.call(c,d)&&(a[d]=c[d])}return a};k.exports={compile:function(a){a.mark();for(var b=$jscomp.makeIterator(Object.keys(a.domain)),c=b.next();!c.done;c=b.next()){if(c=a.domain[c.value].condition.compile(a))return g({domain:name},c);a.rewind()}},test:function(a,b){return a.domain[b.domain].condition.test(a,b)}}},{}],9:[function(e,k,h){var g=function(a,b){var c=function(a){var b=9999;a.forEach(function(a){a=a.line;for(var c=0;c<a.length&&" "===a[c];)c++;0<c&&
    107 c<b&&(b=c)});return b},d=[];if(d.length)d.push(b);else for(d.push(b);0<d.length;)for(a.pc=d.shift(),b={};;){a.pc=a.domain[a[a.pc].domain].run(a);if(!a.pc)break;if(a.stop){a.tracing=!1;return}if(a.tracing){var e=a[a.pc],h=a.source.scriptLines,k=c(h),m=document.getElementById("easycoder-tracer");if(m){m.style.display="block";m.style.visibility="visible";var p="";if(a.tracer){a.tracer.variables.forEach(function(b,c,d){var e=a.getSymbolRecord(a,b);p=(e=e.value[e.index])?p+(b+": "+e.content):p+(b+": undefined");
    108 switch(a.tracer.alignment){case "horizontal":c<d.length-1&&(p+=", ");break;case "vertical":p+="<br>"}});p+="<hr>";m="";for(var q=5;0<q;q--)e.lino&&(m+='<input type="text" name="'+q+'" value="'+h[e.lino-q].line.substr(k)+'"style=width:100%;border:none;enabled="false">'),m+="<br>";e=document.getElementById("easycoder-tracer-content");e.innerHTML=p+m;e.style.display="block";b.run=document.getElementById("easycoder-run-button");b.step=document.getElementById("easycoder-step-button");b.run.onclick=function(b){return function(c){b.run.blur();
    109 a.tracing=!1;document.getElementById("easycoder-tracer-content").style.display="none";try{g(a,a.resume)}catch(r){c="Error in run handler: "+r.message,console.log(c),alert(c)}}}(b);b.step.onclick=function(b){return function(c){console.log("step");b.step.blur();a.tracing=!0;document.getElementById("easycoder-tracer-content").style.display="block";try{g(a,a.resume)}catch(r){c="Error in step handler: "+r.message,console.log(c),alert(c)}}}(b);a.resume=a.pc;a.pc=0}}break}b={run:b.run,step:b.step}}};k.exports=
    110 g},{}],10:[function(e,k,h){var g={markComments:function(a){var b=a.list,c=void 0===a.index?0:a.index,d=void 0===a.inComment?!1:a.inComment,e=void 0===a.newList?[]:a.newList;if(c>=b.length)return e;var h=b[c];a=h.lino;h=h.token;var k={list:b,index:c+1,inComment:!1,newList:e.concat({lino:a,index:c,token:h})};e={list:b,index:c+1,inComment:!0,newList:e.concat({lino:a,index:c,comment:!0,token:h})};return d&&0<c&&a===b[c-1].lino?g.markComments(e):"!"===h.charAt(0)?g.markComments(e):g.markComments(k)},markSpacesInStrings:function(a){var b=
    111 a.line,c=void 0===a.inComment?!1:a.inComment;a=void 0===a.inQuote?!1:a.inQuote;var d=b.charAt(0);d=a&&" "===d?"\\s":d;if(1===b.length)return d;b=b.substring(1);return"!"!==d||a?"{"!==d||c?"}"===d&&a?d+g.markSpacesInStrings({line:b,inComment:c,inQuote:!1}):d+g.markSpacesInStrings({line:b,inComment:c,inQuote:a}):d+g.markSpacesInStrings({line:b,inComment:c,inQuote:!0}):d+g.markSpacesInStrings({line:b,inComment:!0,inQuote:!1})},tokenise:function(a){a=a.split("\n").map(function(a){return a.length?g.markSpacesInStrings({line:a}):
    112 ""}).map(function(a,b){return{lino:b+1,line:a}});var b=a.map(function(a){return a.line.trim().split(/\s+/).map(function(b,c){return{lino:a.lino,index:c,token:b}})});b=[].concat.apply([],b).filter(function(a){return a.token}).map(function(a){return{lino:a.lino,index:a.index,token:a.token.split("\\s").join(" ")}});b=g.markComments({list:b}).filter(function(a){return!a.comment});return{scriptLines:a,tokens:b}}};k.exports=g},{}],11:[function(e,k,h){var g={getItem:function(a){var b=a.getToken();if(!b)return null;
    113 if("{"===b.charAt(0))return a.next(),{type:"constant",numeric:!1,content:b.substring(1,b.length-1)};if(b[0].match(/[0-9\-]/)){var c=eval(b);if(Number.isInteger(c))return a.next(),{type:"constant",numeric:!0,content:c};a.error.notAnIntegerError(b)}a.mark();b=$jscomp.makeIterator(Object.keys(a.domain));for(c=b.next();!c.done;c=b.next())if(c=a.domain[c.value].value.compile(a))return c;return null},compile:function(a){var b=a.getToken(),c=a.value.getItem(a);c||a.error.undefinedValueError(b);if("cat"===
    114 a.getToken()){for(b={type:"cat",numeric:!1,parts:[c]};a.tokenIs("cat");)a.next(),b.parts.push(a.value.getItem(a));return b}return c},doValue:function(a,b){if("cat"===b.type)return{type:"constant",numeric:!1,content:b.parts.reduce(function(b,c){return b+g.doValue(a,c).content},"")};switch(b.type){case "constant":return b;case "symbol":var c=a.getSymbolRecord(a,b.name);return c.isValueHolder?c.value[c.index]?c.value[c.index]:null:a.domain[c.domain].value.get(a,b);case "boolean":return b}return a.domain[b.domain].value.get(a,
    115 b)},evaluate:function(a,b){if(b=g.doValue(a,b))return b;a.error.cantDecodeValueError()},decode:function(a,b){switch(b){case "url":return decodeURIComponent(a.replace(/\+/g," "));default:return a}}};k.exports=g},{}]},{},[1]);
     57a.getLino();a.next();var c=a.getToken();switch(c){case "change":case "click":if(a.next(),a.isSymbol()){var d=a.getSymbolRecord();a.next();if("dom"!==d.extra)return!1;a.addCommand({domain:"browser",keyword:"on",lino:b,action:c,symbol:d.name});c=a.getPc();a.addCommand({domain:"basic",keyword:"goto",goto:0});a.compileOne();a.addCommand({domain:"basic",keyword:"stop",lino:b,next:0});a.getCommandAt(c).goto=a.getPc();return!0}}a.addWarning("Unrecognised syntax in 'on'");return!1},run:function(a){var b=
     58a[a.pc],c=a.getSymbolRecord(b.symbol);switch(b.action){case "change":if("select"===c.keyword){var d=c.value[c.index].content;if(d){var f=document.getElementById(d);f.targetPc=b.pc+2;f.addEventListener("change",function(){try{a.run(a,f.targetPc)}catch(l){console.log(l.message),alert(l.message)}return!1})}}break;case "click":c.value.forEach(function(d,f){if(d=d.content)d=document.getElementById(d),d.targetPc=b.pc+2,d.targetIndex=f,d.onclick=function(b){b.target.blur();c.index=b.target.targetIndex;try{a.run(a,
     59b.target.targetPc)}catch(m){console.log(m.message),alert(m.message)}return!1}})}return b.pc+1}},P:{compile:function(a){a.compileVariable("browser","p",!1,"dom");return!0},run:function(a){return a[a.pc].pc+1}},Play:{compile:function(a){var b=a.getLino();a.next();if(a.isSymbol()){var c=a.getSymbolRecord();"audioclip"===c.keyword&&(a.next(),a.addCommand({domain:"browser",keyword:"play",lino:b,target:c.name}))}return!0},run:function(a){var b=a.getSymbolRecord(a[a.pc].target);b=a.value.evaluate(a,b.value[b.index]).content;
     60(new Audio(b)).play();return a[a.pc].pc+1}},Popup:{compile:function(a){a.compileVariable("browser","popup");return!0},run:function(a){return a[a.pc].pc+1}},PRE:{compile:function(a){a.compileVariable("browser","pre",!1,"dom");return!0},run:function(a){return a[a.pc].pc+1}},Remove:{compile:function(a){var b=a.getLino();a.getTokens();a.next();if(a.isSymbol()){var c=a.getToken();a.next();a.addCommand({domain:"browser",keyword:"remove",lino:b,symbol:c});return!0}a.unrecognisedSymbol(a.getToken());return!1},
     61run:function(a){var b=a[a.pc];a=a.getSymbolRecord(b.symbol);document.getElementById(a.value[a.index].content).style.display="none";return b.pc+1}},SELECT:{compile:function(a){a.compileVariable("browser","select",!1,"dom");return!0},run:function(a){return a[a.pc].pc+1}},Set:{compile:function(a){var b=a.getLino();a.next();if(a.isSymbol()){var c=a.getToken();a.next();if(a.tokenIs("from")&&(a.next(),a.isSymbol())){var d=a.getToken();a.next();a.addCommand({domain:"browser",keyword:"set",lino:b,type:"setContentVar",
     62source:d,target:c});return!0}}else if(c=a.getToken(),"the"===c&&(a.next(),c=a.getToken()),"content"===c){if(a.next(),a.tokenIs("of")&&(a.next(),a.isSymbol())){c=a.getToken();a.next();if(a.tokenIs("from")&&(a.next(),a.isSymbol()))return d=a.getToken(),a.next(),a.addCommand({domain:"browser",keyword:"set",lino:b,type:"setContentVar",source:d,target:c}),!0;if(a.tokenIs("to"))return a.next(),d=a.getValue(),a.addCommand({domain:"browser",keyword:"set",lino:b,type:"setContent",value:d,target:c}),!0}}else if("text"===
     63c){if(a.next(),a.tokenIs("of")&&(a.next(),a.isSymbol()))switch(c=a.getSymbolRecord(),c.keyword){case "button":case "input":if(a.next(),a.tokenIs("to"))return a.next(),d=a.getValue(),a.addCommand({domain:"browser",keyword:"set",lino:b,type:"setText",symbolName:c.name,value:d}),!0}}else if("attribute"===c){if(a.next(),c=a.getValue(),a.tokenIs("of")&&(a.next(),a.isSymbol()&&(d=a.getToken(),a.next(),a.tokenIs("to")))){a.next();var f=a.getValue();a.addCommand({domain:"browser",keyword:"set",lino:b,type:"setAttribute",
     64symbolName:d,attributeName:c,attributeValue:f});return!0}}else if("style"===c&&(a.next(),c=a.getValue(),a.tokenIs("of")&&(a.next(),a.isSymbol()&&(d=a.getToken(),a.next(),a.tokenIs("to")&&(a.next(),f=a.getValue())))))return a.addCommand({domain:"browser",keyword:"set",lino:b,type:"setStyle",symbolName:d,styleName:c,styleValue:f}),!0;a.addWarning("Unrecognised syntax in 'set'");return!1},run:function(a){var b=a[a.pc];switch(b.type){case "setContentVar":var c=a.getSymbolRecord(b.source);a=a.getSymbolRecord(b.target);
     65c=document.getElementById(c.value[c.index].content);var d=document.getElementById(a.value[a.index].content);d.innerHTML=c.innerHTML;break;case "setContent":c=a.value.evaluate(a,b.value);var f=c.content;c.numeric&&(f=""+f);a=a.getSymbolRecord(b.target);a=a.value[a.index].content;d=document.getElementById(a);d.innerHTML=f;break;case "setText":c=a.getSymbolRecord(b.symbolName);d=document.getElementById(c.value[c.index].content);f=a.value.evaluate(a,b.value).content;switch(c.keyword){case "button":d.innerHTML=
     66f;break;case "input":d.value=f}break;case "setAttribute":c=a.getSymbolRecord(b.symbolName);switch(b.attributeValue.type){case "constant":f=b.attributeValue.content;break;case "symbol":a=a.getSymbolRecord(b.attributeValue.name),f=a.value[a.index].content}a=c.value[c.index].content;d=document.getElementById(a);d.setAttribute(b.attributeName.content,f);break;case "setStyle":c=a.getSymbolRecord(b.symbolName),f=a.value.evaluate(a,b.styleValue),c.value[c.index]||a.error.runtimeError("Variable '"+c.name+
     67"' has not been assigned."),a=c.value[c.index].content,a=document.getElementById(a),c={},c[b.styleName.content]=f.content,Object.assign(a.style,c)}return b.pc+1}},Show:{compile:function(a){var b=a.getLino();a.getTokens();a.next();if(a.isSymbol()){var c=a.getToken();a.next();a.addCommand({domain:"browser",keyword:"show",lino:b,symbol:c});return!0}a.addWarning("Unrecognised syntax in 'show'");return!1},run:function(a){var b=a[a.pc];a=a.getSymbolRecord(b.symbol);var c=document.getElementById(a.value[a.index].content);
     68switch(a.type){case "span":c.style.display="inline";break;default:c.style.display="block"}c.style.visibility="visible";return b.pc+1}},SPAN:{compile:function(a){a.compileVariable("browser","span",!1,"dom");return!0},run:function(a){return a[a.pc].pc+1}},Trace:{compile:function(a){var b=a.getLino();a.next();var c=[];if(a.isSymbol()){for(;a.isSymbol();)c.push(a.getToken()),a.next();var d="horizontal";if(a.tokenIs("horizontal")||a.tokenIs("vertical"))d=a.getToken(),a.next();a.addCommand({domain:"browser",
     69keyword:"trace",variant:"setup",lino:b,variables:c,alignment:d});return!0}a.addCommand({domain:"browser",keyword:"trace",variant:"run",lino:b});return!0},run:function(a){var b=a[a.pc];switch(b.variant){case "setup":console.log("Set up tracer");a.tracer={variables:b.variables,alignment:b.alignment};break;case "run":console.log("Run tracer"),a.tracer||(a.tracer={variables:[],alignment:"horizontal"}),a.tracing=!0,a.stop=!1}return a.pc+1}},UL:{compile:function(a){a.compileVariable("browser","ul",!1,"dom");
     70return!0},run:function(a){return a[a.pc].pc+1}},getHandler:function(a){switch(a){case "a":return g.A;case "alert":return g.Alert;case "attach":return g.Attach;case "audioclip":return g.Audioclip;case "button":return g.BUTTON;case "create":return g.Create;case "div":return g.DIV;case "header":case "h1":case "h2":case "h3":case "h4":case "h5":case "h6":return g.Header;case "hide":return g.Hide;case "img":return g.IMG;case "input":return g.INPUT;case "li":return g.LI;case "location":return g.Location;
     71case "on":return g.On;case "p":return g.P;case "play":return g.Play;case "popup":return g.Popup;case "pre":return g.PRE;case "remove":return g.Remove;case "select":return g.SELECT;case "set":return g.Set;case "show":return g.Show;case "span":return g.SPAN;case "trace":return g.Trace;case "ul":return g.UL;default:return!1}},run:function(a){var b=a[a.pc],c=g.getHandler(b.keyword);c||a.error.runtimeError("Unknown keyword '"+b.keyword+"' in 'browser' package");return c.run(a)},value:{compile:function(a){var b=
     72a.getToken();if("property"===b){a.next();b=a.getValue();if(a.tokenIs("of")&&(a.next(),a.isSymbol())){var c=a.getSymbolRecord();a.next();switch(c.keyword){case "select":case "variable":return{domain:"browser",type:"property",property:b,symbol:c.name}}}return null}if("mobile"===b)return a.next(),{domain:"browser",type:"mobile"};if("br"===b)return a.next(),{domain:"browser",type:"br"};if("color"===b)return a.next(),{domain:"browser",type:"color",value:a.getValue()};a.tokenIs("the")&&a.next();b=a.getToken();
     73return"content"===b?(a.next(),a.tokenIs("of")&&(a.next(),a.isSymbol())?(b=a.getSymbolRecord(),a.next(),{domain:"browser",type:"contentOf",symbol:b.name}):null):["width","height"].includes(b)&&(a.next(),a.tokenIs("of")&&(a.next(),a.isSymbol()&&(c=a.getSymbolRecord(),a.next(),"dom"===c.extra)))?{domain:"browser",type:"width"===b?"widthOf":"heightOf",symbol:c.name}:null},get:function(a,b){switch(b.type){case "symbol":b=a.getSymbolRecord(b.name);a=b.value[b.index].content;switch(b.keyword){case "input":case "select":return a=
     74document.getElementById(a),{type:"constant",numeric:!1,content:a.value}}break;case "property":var c=a.value.evaluate(a,b.property).content;b=a.getSymbolRecord(b.symbol);content=a.value.evaluate(a,b.value[b.index]).content;content=JSON.parse(content);content=a.value.decode(content[c],a.encoding);switch(b.keyword){case "select":document.getElementById(content);break;case "variable":return{type:"constant",numeric:!1,content:content}}break;case "mobile":return{domain:"browser",type:"boolean",content:"undefined"!==
     75typeof window.orientation||-1!==navigator.userAgent.indexOf("IEMobile")};case "br":return{type:"constant",numeric:!1,content:"<br />"};case "contentOf":return b=a.getSymbolRecord(b.symbol),a=b.value[b.index].content,a=document.getElementById(a),{type:"constant",numeric:!1,content:a.textContent};case "widthOf":return b=a.getSymbolRecord(b.symbol),a=b.value[b.index].content,a=document.getElementById(a),{type:"constant",numeric:!0,content:a.offsetWidth};case "heightOf":return b=a.getSymbolRecord(b.symbol),
     76a=b.value[b.index].content,a=document.getElementById(a),{type:"constant",numeric:!0,content:a.offsetHeight};case "color":for(a=a.value.evaluate(a,b.value).content.toString(16);6>a.length;)a="00"+a;return{type:"constant",numeric:!1,content:"#"+a}}}},condition:{compile:function(a){},test:function(a,b){}},setStyles:function(a,b){a=document.getElementById(a);b=b.split(";");b=$jscomp.makeIterator(b);for(var c=b.next();!c.done;c=b.next())c=c.value.split(":"),a.setAttribute(c[0],c[1])}};k.exports=g},{}],
     774:[function(e,k,h){var g={Json:{compile:function(a){var b=a.getLino();a.getTokens();a.next();switch(a.getToken()){case "get":a.next();if(a.tokenIs("item")){a.next();var c=a.getValue();if(a.tokenIs("of")&&(a.next(),a.isSymbol())){var d=a.getToken();a.next();if(a.tokenIs("as")&&(a.next(),a.isSymbol())){var f=a.getSymbolRecord();if("variable"===f.keyword)return a.next(),a.addCommand({domain:"json",keyword:"json",lino:b,request:"getItem",target:f.name,item:c,source:d}),!0}}a.error.expectedError("of",
     78a.getToken())}else if(a.tokenIs("element")){a.next();c=a.getValue();if(a.tokenIs("of")&&(a.next(),a.isSymbol()&&(d=a.getToken(),a.next(),a.tokenIs("as")&&(a.next(),a.isSymbol()&&(f=a.getSymbolRecord(),"variable"===f.keyword)))))return a.next(),a.addCommand({domain:"json",keyword:"json",lino:b,request:"getElement",target:f.name,element:c,source:d}),!0;a.error.expectedError("of",a.getToken())}if(a.isSymbol()&&(c=a.getSymbolRecord(),"variable"===c.keyword&&(a.next(),a.tokenIs("from"))))return a.next(),
     79d=a.getValue(),a.addCommand({domain:"json",keyword:"json",lino:b,request:"get",target:c.name,value:d}),!0;break;case "set":a.next();if(a.tokenIs("encoding")){a.next();if(a.tokenIs("to"))return a.next(),c=a.getValue(),a.addCommand({domain:"json",keyword:"json",lino:b,request:"encoding",encoding:c}),!0;a.addWarning("Unknown encoding option");return!1}if(a.isSymbol()){c=a.getSymbolRecord();if("select"===c.keyword&&(a.next(),a.tokenIs("from")&&(a.next(),a.isSymbol()&&(d=a.getSymbolRecord(),"variable"===
     80d.keyword))))return a.next(),f=null,a.tokenIs("as")&&(a.next(),f=a.getValue()),a.addCommand({domain:"json",keyword:"json",lino:b,request:"setList",target:c.name,source:d.name,display:f}),!0;break}case "shuffle":return a.next(),a.isSymbol()&&(c=a.getSymbolRecord(),"variable"===c.keyword)?(a.next(),a.addCommand({domain:"json",keyword:"json",lino:b,request:"shuffle",target:c.name}),!0):!1}a.addWarning("Unrecognised syntax in 'json'");return!1},run:function(a){var b=a[a.pc];switch(b.request){case "get":a.ajaxCommand=
     81b;var c=new XMLHttpRequest;c.onreadystatechange=function(){if(4===this.readyState&&200===this.status){var b=a.ajaxCommand,c=a.getSymbolRecord(b.target);c.value[c.index]={type:"constant",numeric:!1,content:this.responseText};a.run(a,b.pc+1)}};b=a.value.evaluate(a,b.value);c.open("GET",b.content,!0);c.send();return 0;case "getItem":var d=a.getSymbolRecord(b.source);d=JSON.parse(d.value[d.index].content)[a.getValue(b.item)];c=a.getSymbolRecord(b.target);c.value[c.index]={type:"constant",numeric:!1,content:"object"===
     82typeof d?JSON.stringify(d):d};break;case "getElement":d=a.getSymbolRecord(b.source);d=JSON.parse(d.value[d.index].content)[a.getValue(b.element)];c=a.getSymbolRecord(b.target);c.value[c.index]={type:"constant",numeric:!1,content:"object"===typeof d?JSON.stringify(d):d};break;case "setList":d=a.getSymbolRecord(b.source);c=a.getSymbolRecord(b.target);var f=document.getElementById(c.value[c.index].content);f.options.length=0;var e=b.display?a.value.evaluate(a,b.display).content:null;JSON.parse(d.value[d.index].content).forEach(function(b){var c=
     83document.createElement("option");c.value=e?JSON.stringify(b):b;c.innerHTML=e?a.value.decode(b[e],a.encoding):b;f.appendChild(c)});f.selectedIndex=-1;break;case "encoding":a.encoding=a.getValue(b.encoding);break;case "shuffle":c=a.getSymbolRecord(b.target);d=JSON.parse(a.getValue(c.value[c.index]));for(var g=d.length-1;0<g;g--){var h=Math.floor(Math.random()*(g+1)),k=$jscomp.makeIterator([d[h],d[g]]);d[g]=k.next().value;d[h]=k.next().value}c.value[c.index]={type:"constant",numeric:!1,content:JSON.stringify(d)}}return b.pc+
     841}},getHandler:function(a){switch(a){case "json":return g.Json;default:return!1}},run:function(a){var b=a[a.pc],c=g.getHandler(b.keyword);c||a.error.runtimeError("Unknown keyword '"+b.keyword+"' in 'json' package");return c.run(a)},value:{compile:function(a){},get:function(a,b){}},condition:{compile:function(a){},test:function(a,b){}}};k.exports=g},{}],5:[function(e,k,h){var g={Attach:{compile:function(a){var b=a.getLino();a.getTokens();a.next();if(a.isSymbol()){var c=a.getProgram()[a.getSymbol().pc];
     85switch(c.keyword){case "shape":case "svg":a.next();if(a.tokenIs("to")){a.next();var d=a.getValue();a.addCommand({domain:"svg",keyword:"attach",lino:b,type:c.keyword,symbol:c.name,cssId:d});return!0}break;default:compile.error.InappropriateVariableTypeError(c.keyword)}}a.addWarning("Unrecognised syntax in 'attach'");return!1},run:function(a){var b=a[a.pc],c=a.value.evaluate(a,b.cssId).content;document.getElementById(c)||a.error.noSuchElementError(c);a=a.getSymbolRecord(b.symbol);a.value[a.index]={type:"constant",
     86numeric:"false",content:c};return b.pc+1}},Circle:{compile:function(a){a.compileVariable("svg","circle",!1,"dom");return!0},run:function(a){return a[a.pc].pc+1}},Create:{compile:function(a){var b=a.getLino();a.next();if(a.isSymbol()){var c=a.getSymbolRecord();a.next();switch(c.keyword){case "svg":if(a.tokenIs("in")&&(a.next(),a.isSymbol())){var d=a.getToken();a.next();for(var f=null,e=!0;e;){var g=a.getToken();a.next();switch(g){case "style":f=a.getValue();break;default:a.prev(),e=!1}}f||(f={type:"constant",
     87numeric:!1,content:"width:100%;height:100%"});a.addCommand({domain:"svg",keyword:"create",lino:b,type:"svg",name:c.name,style:f,parent:d});return!0}break;case "group":if(a.tokenIs("in")&&(a.next(),a.isSymbol()))return f=a.getSymbolRecord(),["svg","group"].includes(f.keyword)||a.error.inappropriateTypeError(f.keyword),a.next(),a.addCommand({domain:"svg",keyword:"create",lino:b,type:"group",name:c.name,parent:f.name}),!0;break;case "circle":case "ellipse":case "line":case "rect":case "text":if(a.tokenIs("in")&&
     88(a.next(),a.isSymbol())){d=a.getSymbolRecord();["svg","group"].includes(d.keyword)||a.error.inappropriateTypeError(d.keyword);a.next();for(e=!0;e;){var h=a.getToken();a.next();switch(h){case "style":f=a.getValue();break;case "text":g=a.getValue();break;default:a.prev(),e=!1}}a.addCommand({domain:"svg",keyword:"create",lino:b,type:c.keyword,name:c.name,style:f,text:g,parent:d.name});return!0}}}return!1},run:function(a){var b=a[a.pc],c=a.getSymbolRecord(b.parent),d=a.getSymbolRecord(b.name);if("group"===
     89b.type)d.parent=b.parent,d.x=0,d.y=0;else{if("group"===c.keyword){var f=c;var e=f.value[f.index];e.content||(e.content=[]);for(e.content.push({name:d.name,index:d.index});"group"===c.keyword;)c=a.getSymbolRecord(c.parent)}e=document.getElementById(c.value[c.index].content);c=document.createElementNS("http://www.w3.org/2000/svg",b.type);e.appendChild(c);e="ec-"+d.name+"-"+d.index;c.setAttribute("id",e);"text"===d.keyword&&(c.textContent=a.value.evaluate(a,b.text).content);d.value[d.index]={type:"constant",
     90numeric:!1,content:e};if(b.style){b=a.value.evaluate(a,b.style).content;a.domain.browser.setStyles(e,b);b=d.value[d.index];switch(d.keyword){case "circle":case "ellipse":b.x=c.getAttribute("cx");b.y=c.getAttribute("cy");break;case "line":b.x=c.getAttribute("x1");b.y=c.getAttribute("y1");b.x2=c.getAttribute("x2");b.y2=c.getAttribute("y2");break;case "rect":case "text":b.x=c.getAttribute("x"),b.y=c.getAttribute("y")}f&&(b.groupName=f.name,b.groupIndex=f.index)}}return a[a.pc].pc+1}},Ellipse:{compile:function(a){a.compileVariable("svg",
     91"ellipse",!1,"dom");return!0},run:function(a){return a[a.pc].pc+1}},Group:{compile:function(a){a.compileVariable("svg","group");return!0},run:function(a){return a[a.pc].pc+1}},Line:{compile:function(a){a.compileVariable("svg","line",!1,"dom");return!0},run:function(a){return a[a.pc].pc+1}},Move:{compile:function(a){var b=a.getLino();a.next();if(a.isSymbol()){var c=a.getSymbolRecord();a.next();if(a.tokenIs("to")){a.next();var d=a.getValue(),f=a.getValue();a.addCommand({domain:"svg",keyword:"move",
     92lino:b,type:"moveTo",name:c.name,x:d,y:f});return!0}}return!1},run:function(a){var b=a[a.pc],c=a.value.evaluate(a,b.x).content,d=a.value.evaluate(a,b.y).content;b=a.getSymbolRecord(b.name);switch(b.keyword){case "group":for(var f=$jscomp.makeIterator(b.value[b.index].content),e=f.next();!e.done;e=f.next()){var g=e.value;e=a.getSymbolRecord(g.name);g=e.value[g.index];var h=document.getElementById(g.content),k=parseInt(g.x)+c,p=parseInt(g.y)+d;switch(e.keyword){case "circle":case "ellipse":h.setAttribute("cx",
     93k);h.setAttribute("cy",p);break;case "line":h.setAttribute("x1",k);h.setAttribute("y1",p);h.setAttribute("x2",parseInt(g.x2)+c);h.setAttribute("y2",parseInt(g.y2)+d);break;case "rect":case "text":h.setAttribute("x",k),h.setAttribute("y",p)}}b.x=c;b.y=d;break;case "circle":case "ellipse":case "line":case "rect":case "text":e=f=0;g=b.value[b.index];g.groupName&&(e=a.getSymbolRecord(g.groupName),f=e.x,e=e.y);g=b.value[b.index];h=document.getElementById(b.value[b.index].content);switch(b.keyword){case "circle":case "ellipse":h.setAttribute("cx",
     94f+c);h.setAttribute("cy",e+d);break;case "line":h.setAttribute("x1",f+c);h.setAttribute("y1",e+d);b=parseInt(g.x2)-parseInt(g.x1);k=parseInt(g.y2)-parseInt(g.y1);h.setAttribute("x2",f+b+c);h.setAttribute("y2",e+k+d);break;case "rect":case "text":h.setAttribute("x",f+c),h.setAttribute("y",e+d)}g.x=c;g.y=d}return a[a.pc].pc+1}},On:{compile:function(a){var b=a.getLino();a.next();var c=a.getToken();switch(c){case "click":if(a.next(),a.isSymbol()){var d=a.getSymbolRecord();a.next();if("group"!==d.keyword)return!1;
     95a.addCommand({domain:"svg",keyword:"on",lino:b,action:c,symbol:d.name});b=a.getPc();a.addCommand({domain:"basic",keyword:"goto",goto:0});a.compileOne();a.getCommandAt(b).goto=a.getPc();return!0}}a.addWarning("Unrecognised syntax in 'on'");return!1},run:function(a){var b=a[a.pc],c=a.getSymbolRecord(b.symbol);switch(b.action){case "click":if("group"===c.keyword)for(var d=$jscomp.makeIterator(c.value),f=d.next();!f.done;f=d.next())if(f=f.value,f.content){f=$jscomp.makeIterator(f.content);for(var e=f.next();!e.done;e=
     96f.next()){e=e.value;var g=a.getSymbolRecord(e.name),h=g.value[e.index];h.content&&(h=document.getElementById(h.content),h.targetPc=b.pc+2,h.contentItem=g,h.contentIndex=e.index,h.onclick=function(b){b.target.blur();var d=b.target.contentItem;d.index=b.target.contentIndex;d=d.value[d.index];if(d.groupName){c.index=d.groupIndex;d=$jscomp.makeIterator(c.value[c.index].content);for(var f=d.next();!f.done;f=d.next())f=f.value,a.getSymbolRecord(f.name).index=f.index}try{a.run(a,b.target.targetPc)}catch(u){a.reportError(a.source,
     97u)}return!1})}}}return b.pc+1}},Rect:{compile:function(a){a.compileVariable("svg","rect",!1,"dom");return!0},run:function(a){return a[a.pc].pc+1}},Set:{compile:function(a){var b=a.getLino();a.next();var c=a.getToken();"the"===c&&(a.next(),c=a.getToken());if("text"===c&&(a.next(),a.tokenIs("of")&&(a.next(),a.isSymbol())))switch(c=a.getSymbolRecord(),c.keyword){case "text":if(a.next(),a.tokenIs("to")){a.next();var d=a.getValue();a.addCommand({domain:"svg",keyword:"set",lino:b,type:"setText",symbolName:c.name,
     98value:d});return!0}}return!1},run:function(a){var b=a[a.pc];switch(b.type){case "setText":var c=a.getSymbolRecord(b.symbolName);var d=document.getElementById(c.value[c.index].content);a=a.value.evaluate(a,b.value).content;switch(c.keyword){case "text":d.innerHTML=a}}return b.pc+1}},SVG:{compile:function(a){a.compileVariable("svg","svg");return!0},run:function(a){return a[a.pc].pc+1}},Text:{compile:function(a){a.compileVariable("svg","text",!1,"dom");return!0},run:function(a){return a[a.pc].pc+1}},
     99getHandler:function(a){switch(a){case "attach":return g.Attach;case "circle":return g.Circle;case "create":return g.Create;case "ellipse":return g.Ellipse;case "group":return g.Group;case "line":return g.Line;case "move":return g.Move;case "on":return g.On;case "rect":return g.Rect;case "set":return g.Set;case "svg":return g.SVG;case "text":return g.Text;default:return!1}},run:function(a){var b=a[a.pc],c=g.getHandler(b.keyword);c||a.error.runtimeError("Unknown keyword '"+b.keyword+"' in 'svg' package");
     100return c.run(a)},value:{compile:function(a){a.tokenIs("the")&&a.next();if(a.tokenIs("text")&&(a.next(),a.tokenIs("of")&&(a.next(),a.isSymbol()))){var b=a.getSymbolRecord();a.next();if("text"===b.keyword)return{domain:"svg",type:"text",name:b.name}}return null},get:function(a,b){switch(b.type){case "text":return a=a.getSymbolRecord(b.name),{type:"constant",numeric:!1,content:document.getElementById(a.value[a.index].content).innerHTML}}}},condition:{compile:function(a){},test:function(a,b){}}};k.exports=
     101g},{}],6:[function(e,k,h){k.exports=function(e,a,b){a=e.value.evaluate(e,a);b=e.value.evaluate(e,b);a.numeric!==b.numeric&&e.error.dataTypeMismatchError();e=a.content;b=b.content;return e>b?1:e<b?-1:0}},{}],7:[function(e,k,h){var g=Object.assign||function(a){for(var b=1;b<arguments.length;b++){var c=arguments[b],e;for(e in c)Object.prototype.hasOwnProperty.call(c,e)&&(a[e]=c[e])}return a},a=this,b={getTokens:function(){return a.tokens},addWarning:function(b){a.warnings.push(b)},warning:function(a){b.addWarning(a);
     102throw Error();},unrecognisedSymbol:function(a){b.addWarning("Unrecognised symbol '"+a+"'")},getWarnings:function(){return a.warnings},getIndex:function(){return a.index},next:function(b){a.index+=void 0===b?1:b},peek:function(){return a.tokens[a.index+1].token},getToken:function(){return a.index>=a.tokens.length?null:a.tokens[a.index]?a.tokens[a.index].token:null},nextToken:function(){b.next();return b.getToken()},skip:function(c){if(a.index>=a.tokens.length)return null;b.next();b.tokenIs(c)&&b.next()},
     103prev:function(){a.index--},getLino:function(){return a.index>=a.tokens.length?0:a.tokens[a.index].lino},tokenIs:function(b){return a.index>=a.tokens.length?!1:b===a.tokens[a.index].token},getTarget:function(b){b=void 0===b?a.index:b;return a.tokens[b].token},getTargetPc:function(c){c=void 0===c?a.index:c;return a.symbols[b.getTarget(c)].pc},getCommandAt:function(b){return a.program[b]},isSymbol:function(){return b.getTarget()in a.symbols},getSymbol:function(){return a.symbols[b.getToken()]},getSymbolPc:function(){return b.getSymbol().pc},
     104getSymbolRecord:function(){return a.program[b.getSymbolPc()]},getSymbols:function(){return a.symbols},getProgram:function(){return a.program},getPc:function(){return a.program.length},getValue:function(){return b.value.compile(b)},getCondition:function(){return b.condition.compile(b)},constant:function(a){return b.value.constant(a)},addCommand:function(b){a.program.push(g({pc:a.program.length},b))},addSymbol:function(b,d){a.symbols[b]={pc:d}},mark:function(){a.savedMark=a.index},rewind:function(){a.index=
     105a.savedMark},compileVariable:function(c,d,e,g){e=void 0===e?!1:e;g=void 0===g?null:g;b.next();var f=b.getLino(),h=b.getTokens()[b.getIndex()];a.symbols[h.token]&&b.error.duplicateSymbolError(h.token);var k=b.getPc();b.next();b.addSymbol(h.token,k);b.addCommand({domain:c,keyword:d,lino:f,isSymbol:!0,isValueHolder:e,name:h.token,elements:1,index:0,value:[{}],extra:g})},compileToken:function(){var a=b.getToken();if(a){var d=b.getIndex();b.mark();for(var e=$jscomp.makeIterator(Object.keys(b.domain)),
     106g=e.next();!g.done;g=e.next()){if((g=b.domain[g.value])&&(g=g.getHandler(a))&&g.compile(b))return;b.rewind()}console.log("No handler found");b.error.dontUnderstandError(a,d)}},compileOne:function(){var c=b.getToken();if(c){a.warnings=[];var d=a.program.length;c.endsWith(":")?(a.symbols[c.substring(0,c.length-1)]={pc:d},a.index++):b.compileToken()}},compileFromHere:function(c){for(;a.index<a.tokens.length;){var d=a.tokens[a.index].token;if("else"===d)return a.program;b.compileOne();if(-1<c.indexOf(d))break}},
     107compile:function(c){a.tokens=c;a.index=0;a.program=[];a.symbols={};a.warnings=[];b.compileFromHere([]);b.addCommand({domain:"basic",keyword:"stop",lino:b.getLino(),next:0});return a.program}};k.exports=b},{}],8:[function(e,k,h){var g=Object.assign||function(a){for(var b=1;b<arguments.length;b++){var c=arguments[b],d;for(d in c)Object.prototype.hasOwnProperty.call(c,d)&&(a[d]=c[d])}return a};k.exports={compile:function(a){a.mark();for(var b=$jscomp.makeIterator(Object.keys(a.domain)),c=b.next();!c.done;c=
     108b.next()){if(c=a.domain[c.value].condition.compile(a))return g({domain:name},c);a.rewind()}},test:function(a,b){return a.domain[b.domain].condition.test(a,b)}}},{}],9:[function(e,k,h){var g=this,a=e("./Tokenise"),b=e("./Compile"),c=e("./Run"),d=e("./Value"),f=e("./Condition"),l=e("./Compare");h=e("../domain/Basic");var t=e("../domain/Browser"),n=e("../domain/Json");e=e("../domain/Svg");var m={domain:{basic:h,browser:t,json:n,svg:e},compileError:{dontUnderstandError:function(a){throw Error("I don't understand '"+
     109a+"'");},duplicateSymbolError:function(a){throw Error("Symbol '"+a+"' is a duplicate");},inappropriateTypeError:function(a){throw Error("Inappropriate type '"+a+"'");},inappropriateVariableTypeError:function(a){throw Error("Inappropriate variable type '"+a+"'");},missingInputTypeError:function(){throw Error("Missing input type");},noSuchVariableError:function(a){throw Error("No such variable: "+a);},notAnIntegerError:function(a){throw Error("Value is not an integer: "+a);},undefinedValueError:function(a){throw Error("Undefined value: "+
     110a);},unknownTypeError:function(a){throw Error("Unknown type: "+a);},unknownVariableError:function(a){throw Error("Unknown variable: "+a);},unrecognisedValueError:function(a){throw Error("I don't understand this value: "+a);},variableDoesNotHoldAValueError:function(a){throw Error("Variable '"+a+"' does not hold a value");},expectedError:function(a,b){throw Error("Expected '"+a+"' but saw '"+b+"'");}},runtimeError:{arrayIndexOutOfRangeError:function(a){throw Error("Array index out of range for "+a);
     111},cantDecodeValueError:function(){throw Error("Can't decode value");},dataTypeMismatchError:function(){throw Error("Data type mismatch");},nonNumericValueError:function(){throw Error("Non-numeric value");},noSuchElementError:function(a){throw Error("No such element: "+a);},runtimeError:function(a){throw Error(a);},undefinedValueError:function(a,b){g.errorPc=b;throw Error("Undefined value: "+a);},variableDoesNotHoldAValueError:function(a){throw Error("Variable '"+a+"' does not hold a value");}},setupTracer:function(){var a=
     112document.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")},reportError:function(a,c){var d=b.getProgram(),e=a.tokens;a=a.scriptLines;e=g.compiling?e[b.getIndex()].lino:d.pc.lino;d="";var f=e-5;for(f=0>f?0:f;f<e;f++){for(var h=""+f;4>h.length;)h=" "+
     113h;d+=h+" "+a[f].line+"\n"}d+=c.message+"\n";c=b.getWarnings();if(c.length)for(d+="Warnings:\n",c=$jscomp.makeIterator(c),a=c.next();!a.done;a=c.next())d+=a.value+"\n";console.log(d);alert(d)},getSymbolRecord:function(a){a=g.program[g.program.symbols[a].pc];return a.alias?g.program[g.program.symbols[a.alias].pc]:a},evaluate:function(a){return d.evaluate(g.program,a)},getValue:function(a){return d.getValue(g.program,a)},compileScript:function(a,e){m.domain.ext=e;e=a.tokens;try{g.compiling=!0;var h=
     114Date.now();b.value=d;b.condition=f;b.domain=m.domain;b.error=m.compileError;var k=b.compile(e);g.program=k;var v=Date.now();console.log("Compiled "+e.length+" tokens in "+(v-h)+"ms");g.compiling=!1;k.source=a;k.run=c;k.value=d;k.evaluate=m.evaluate;k.getValue=m.getValue;k.condition=f;k.compare=l;k.domain=m.domain;k.getSymbolRecord=m.getSymbolRecord;k.error=m.runtimeError;k.reportError=m.reportError;k.symbols=b.getSymbols();k.encoding="none";k.popups=[];k.stack=[];k.queue=[0];m.setupTracer();console.log("Run the script");
     115k.run(k,0)}catch(r){m.reportError(a,r)}},start:function(b,c){c=void 0===c?null:c;try{var d=Date.now(),e=a.tokenise(b),f=Date.now();console.log("Tokenised "+e.scriptLines.length+" lines in "+(f-d)+"ms");m.compileScript(e,c)}catch(r){console.log(r)}}};k.exports=m},{"../domain/Basic":2,"../domain/Browser":3,"../domain/Json":4,"../domain/Svg":5,"./Compare":6,"./Compile":7,"./Condition":8,"./Run":10,"./Tokenise":11,"./Value":12}],10:[function(e,k,h){var g=function(a,b){var c=function(a){var b=9999;a.forEach(function(a){a=
     116a.line;for(var c=0;c<a.length&&" "===a[c];)c++;0<c&&c<b&&(b=c)});return b},d=[];if(d.length)d.push(b);else for(d.push(b);0<d.length;)for(a.pc=d.shift(),b={};;){a.pc=a.domain[a[a.pc].domain].run(a);if(!a.pc)break;if(a.stop){a.tracing=!1;return}if(a.tracing){var e=a[a.pc],h=a.source.scriptLines,k=c(h),n=document.getElementById("easycoder-tracer");if(n){n.style.display="block";n.style.visibility="visible";var m="";if(a.tracer){a.tracer.variables.forEach(function(b,c,d){var e=a.getSymbolRecord(b);m=(e=
     117e.value[e.index])?m+(b+": "+e.content):m+(b+": undefined");switch(a.tracer.alignment){case "horizontal":c<d.length-1&&(m+=", ");break;case "vertical":m+="<br>"}});m+="<hr>";n="";for(var p=5;0<p;p--)e.lino&&(n+='<input type="text" name="'+p+'" value="'+h[e.lino-p].line.substr(k)+'"style=width:100%;border:none;enabled="false">'),n+="<br>";e=document.getElementById("easycoder-tracer-content");e.innerHTML=m+n;e.style.display="block";b.run=document.getElementById("easycoder-run-button");b.step=document.getElementById("easycoder-step-button");
     118b.run.onclick=function(b){return function(c){b.run.blur();a.tracing=!1;document.getElementById("easycoder-tracer-content").style.display="none";try{g(a,a.resume)}catch(q){c="Error in run handler: "+q.message,console.log(c),alert(c)}}}(b);b.step.onclick=function(b){return function(c){console.log("step");b.step.blur();a.tracing=!0;document.getElementById("easycoder-tracer-content").style.display="block";try{g(a,a.resume)}catch(q){c="Error in step handler: "+q.message,console.log(c),alert(c)}}}(b);a.resume=
     119a.pc;a.pc=0}}break}b={run:b.run,step:b.step}}};k.exports=g},{}],11:[function(e,k,h){var g={markComments:function(a){var b=a.list,c=void 0===a.index?0:a.index,d=void 0===a.inComment?!1:a.inComment,e=void 0===a.newList?[]:a.newList;if(c>=b.length)return e;var h=b[c];a=h.lino;h=h.token;var k={list:b,index:c+1,inComment:!1,newList:e.concat({lino:a,index:c,token:h})};e={list:b,index:c+1,inComment:!0,newList:e.concat({lino:a,index:c,comment:!0,token:h})};return d&&0<c&&a===b[c-1].lino?g.markComments(e):
     120"!"===h.charAt(0)?g.markComments(e):g.markComments(k)},markSpacesInStrings:function(a){var b=a.line,c=void 0===a.inComment?!1:a.inComment;a=void 0===a.inQuote?!1:a.inQuote;var d=b.charAt(0);d=a&&" "===d?"\\s":d;if(1===b.length)return d;b=b.substring(1);return"!"!==d||a?"{"!==d||c?"}"===d&&a?d+g.markSpacesInStrings({line:b,inComment:c,inQuote:!1}):d+g.markSpacesInStrings({line:b,inComment:c,inQuote:a}):d+g.markSpacesInStrings({line:b,inComment:c,inQuote:!0}):d+g.markSpacesInStrings({line:b,inComment:!0,
     121inQuote:!1})},tokenise:function(a){a=a.split("\n").map(function(a){return a.length?g.markSpacesInStrings({line:a}):""}).map(function(a,b){return{lino:b+1,line:a}});var b=a.map(function(a){return a.line.trim().split(/\s+/).map(function(b,c){return{lino:a.lino,index:c,token:b}})});b=[].concat.apply([],b).filter(function(a){return a.token}).map(function(a){return{lino:a.lino,index:a.index,token:a.token.split("\\s").join(" ")}});b=g.markComments({list:b}).filter(function(a){return!a.comment});return{scriptLines:a,
     122tokens:b}}};k.exports=g},{}],12:[function(e,k,h){var g={getItem:function(a){var b=a.getToken();if(!b)return null;if("{"===b.charAt(0))return a.next(),{type:"constant",numeric:!1,content:b.substring(1,b.length-1)};if(b[0].match(/[0-9\-]/)){var c=eval(b);if(Number.isInteger(c))return a.next(),{type:"constant",numeric:!0,content:c};a.error.notAnIntegerError(b)}a.mark();b=$jscomp.makeIterator(Object.keys(a.domain));for(c=b.next();!c.done;c=b.next())if(c=a.domain[c.value].value.compile(a))return c;return null},
     123compile:function(a){var b=a.getToken(),c=a.value.getItem(a);c||a.error.undefinedValueError(b);if("cat"===a.getToken()){for(b={type:"cat",numeric:!1,parts:[c]};a.tokenIs("cat");)a.next(),b.parts.push(a.value.getItem(a));return b}return c},doValue:function(a,b){if("cat"===b.type)return{type:"constant",numeric:!1,content:b.parts.reduce(function(b,c){return b+g.doValue(a,c).content},"")};switch(b.type){case "constant":return b;case "symbol":var c=a.getSymbolRecord(b.name);return c.isValueHolder?c.value[c.index]?
     124c.value[c.index]:null:a.domain[c.domain].value.get(a,b);case "boolean":return b}return a.domain[b.domain].value.get(a,b)},constant:function(a){return{type:"constant",numeric:"false",content:a}},evaluate:function(a,b){if(!b)return{type:"constant",numeric:!1,content:""};if(b=g.doValue(a,b))return b;a.error.cantDecodeValueError()},getValue:function(a,b){return g.evaluate(a,b).content},decode:function(a,b){switch(b){case "url":return decodeURIComponent(a.replace(/\+/g," "));default:return a}}};k.exports=
     125g},{}]},{},[1]);
  • easycoder/trunk/easycoder.js

    r1885298 r1949051  
    11(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){
    2 var _this = this;
    3 
    4 const EasyCoder_Tokenise = require('./easycoder/Tokenise');
    5 const EasyCoder_Compiler = require('./easycoder/Compile');
    6 const EasyCoder_Run = require('./easycoder/Run');
    7 const EasyCoder_Value = require('./easycoder/Value');
    8 const EasyCoder_Condition = require('./easycoder/Condition');
    9 const EasyCoder_Compare = require('./easycoder/Compare');
    10 const EasyCoder_Basic = require('./domain/Basic');
    11 const EasyCoder_Browser = require('./domain/Browser');
    12 const EasyCoder_Json = require('./domain/Json');
    13 const EasyCoder_Svg = require('./domain/Svg');
    14 
    15 const EasyCoder = {
    16 
    17   domain: {
    18     basic: EasyCoder_Basic,
    19     browser: EasyCoder_Browser,
    20     json: EasyCoder_Json,
    21     svg: EasyCoder_Svg
    22   },
    23 
    24   compileError: {
    25     dontUnderstandError: name => {
    26       throw Error('I don\'t understand \'' + name + '\'');
    27     },
    28     duplicateSymbolError: name => {
    29       throw Error('Symbol \'' + name + '\' is a duplicate');
    30     },
    31     inappropriateTypeError: name => {
    32       throw Error('Inappropriate type \'' + name + '\'');
    33     },
    34     inappropriateVariableTypeError: name => {
    35       throw Error('Inappropriate variable type \'' + name + '\'');
    36     },
    37     noSuchVariableError: name => {
    38       throw Error('No such variable: ' + name);
    39     },
    40     notAnIntegerError: name => {
    41       throw Error('Value is not an integer: ' + name);
    42     },
    43     undefinedValueError: name => {
    44       throw Error('Undefined value: ' + name);
    45     },
    46     unknownTypeError: name => {
    47       throw Error('Unknown type: ' + name);
    48     },
    49     unknownVariableError: name => {
    50       throw Error('Unknown variable: ' + name);
    51     },
    52     unrecognisedValueError: name => {
    53       throw Error('I don\'t understand this value: ' + name);
    54     },
    55     variableDoesNotHoldAValueError: name => {
    56       throw Error('Variable \'' + name + '\' does not hold a value');
    57     }
    58   },
    59 
    60   runtimeError: {
    61     arrayIndexOutOfRangeError: name => {
    62       throw Error('Array index out of range for ' + name);
    63     },
    64     cantDecodeValueError: () => {
    65       throw Error('Can\'t decode value');
    66     },
    67     dataTypeMismatchError: () => {
    68       throw Error('Data type mismatch');
    69     },
    70     nonNumericValueError: () => {
    71       throw Error('Non-numeric value');
    72     },
    73     noSuchElementError: name => {
    74       throw Error('No such element: ' + name);
    75     },
    76     runtimeError: message => {
    77       throw Error(message);
    78     },
    79     undefinedValueError: (name, pc) => {
    80       _this.errorPc = pc;
    81       throw Error('Undefined value: ' + name);
    82     },
    83     variableDoesNotHoldAValueError: name => {
    84       throw Error('Variable \'' + name + '\' does not hold a value');
    85     }
    86   },
    87 
    88   setupTracer: () => {
    89     const tracer = document.getElementById('easycoder-tracer');
    90     if (tracer) {
    91       tracer.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>';
    92       tracer.style.display = 'none';
    93       //    } else {
    94       //      console.log('No tracer element');
    95     }
    96   },
    97 
    98   reportError: (source, err) => {
    99     const compiler = EasyCoder_Compiler;
    100     const program = compiler.getProgram();
    101     const { tokens, scriptLines } = source;
    102     const lino = _this.compiling ? tokens[compiler.getIndex()].lino : program.pc.lino;
    103     var errString = '';
    104     let start = lino - 5;
    105     start = start < 0 ? 0 : start;
    106     for (var n = start; n < lino; n++) {
    107       let nn = '' + n;
    108       while (nn.length < 4) {
    109         nn = ' ' + nn;
    110       }
    111       errString += nn + ' ' + scriptLines[n].line + '\n';
    112     }
    113     errString += err.message + '\n';
    114     const warnings = EasyCoder_Compiler.getWarnings();
    115     if (warnings.length) {
    116       errString += 'Warnings:\n';
    117       for (const warning of warnings) {
    118         errString += warning + '\n';
    119       }
    120     }
    121     console.log(errString);
    122     alert(errString);
    123   },
    124 
    125   getSymbolRecord: (program, name) => {
    126     const target = program[program.symbols[name].pc];
    127     if (target.alias) {
    128       return program[program.symbols[target.alias].pc];
    129     }
    130     return target;
    131   },
    132 
    133   compileScript: source => {
    134     const { tokens } = source;
    135     try {
    136       //            console.log('Compile script: ');
    137       _this.compiling = true;
    138       const startCompile = Date.now();
    139       const compiler = EasyCoder_Compiler;
    140       compiler.value = EasyCoder_Value;
    141       compiler.condition = EasyCoder_Condition;
    142       compiler.domain = EasyCoder.domain;
    143       compiler.error = EasyCoder.compileError;
    144       const program = EasyCoder_Compiler.compile(tokens);
    145       const finishCompile = Date.now();
    146       console.log('Compiled ' + tokens.length + ' tokens in ' + (finishCompile - startCompile) + 'ms');
    147       //    console.log('Program: ' + JSON.stringify(program, null, 2));
    148       _this.compiling = false;
    149 
    150       program.source = source;
    151       program.run = EasyCoder_Run;
    152       program.value = EasyCoder_Value;
    153       program.condition = EasyCoder_Condition;
    154       program.compare = EasyCoder_Compare;
    155       program.domain = EasyCoder.domain;
    156       program.getSymbolRecord = EasyCoder.getSymbolRecord;
    157       program.error = EasyCoder.runtimeError;
    158       program.reportError = EasyCoder.reportError;
    159       program.symbols = compiler.getSymbols();
    160       program.encoding = 'none';
    161       program.popups = [];
    162       program.stack = [];
    163       program.queue = [0];
    164       EasyCoder.setupTracer();
    165       console.log('Run the script');
    166       program.run(program, 0);
    167       //  console.log('Program: '+ JSON.stringify(program, null, 2));
    168     } catch (err) {
    169       EasyCoder.reportError(source, err);
    170     }
    171   },
    172 
    173   start: script => {
    174     //  console.log('Tokenise script: ');
    175     try {
    176       const startTokenise = Date.now();
    177       const source = EasyCoder_Tokenise.tokenise(script);
    178       const finishTokenise = Date.now();
    179       console.log('Tokenised ' + source.scriptLines.length + ' lines in ' + (finishTokenise - startTokenise) + 'ms');
    180       //    console.log('Source: ' + JSON.stringify(source, null, 2));
    181       EasyCoder.compileScript(source);
    182     } catch (err) {
    183       console.log(err);
    184     }
    185   }
    186 };
    187 
    188 console.log('Starting EasyCoder...');
     2// WordPress version of EasyCoder
     3
     4const EasyCoder = require('./easycoder/Main');
     5
     6console.log('Starting up EasyCoder...');
    1897window.onload = function () {
    1908  //  console.log("Page is ready");
     
    19614  }
    19715};
    198 },{"./domain/Basic":2,"./domain/Browser":3,"./domain/Json":4,"./domain/Svg":5,"./easycoder/Compare":6,"./easycoder/Compile":7,"./easycoder/Condition":8,"./easycoder/Run":9,"./easycoder/Tokenise":10,"./easycoder/Value":11}],2:[function(require,module,exports){
     16},{"./easycoder/Main":9}],2:[function(require,module,exports){
    19917var _this = this;
    20018
     
    27492      const value1 = command.value1;
    27593      const value2 = command.value2;
    276       const target = program.getSymbolRecord(program, command.target);
     94      const target = program.getSymbolRecord(command.target);
    27795      if (target.isValueHolder) {
    27896        const value = target.value[target.index];
    27997        if (value2) {
    280           const result = program.value.evaluate(program, value2).content + program.value.evaluate(program, value1).content;
     98          const result = program.getValue(value2) + program.getValue(value1);
    28199          target.value[target.index] = {
    282100            type: 'constant',
     
    288106            program.error.nonNumericValueError();
    289107          }
    290           const result = value.content + program.value.evaluate(program, value1).content;
     108          const result = value.content + program.getValue(value1);
    291109          target.value[target.index] = {
    292110            type: 'constant',
     
    333151      const aliasPc = program.symbols[command.alias].pc;
    334152      const aliasRecord = program[aliasPc];
    335       const symbolRecord = program.getSymbolRecord(program, command.symbol);
     153      const symbolRecord = program.getSymbolRecord(command.symbol);
    336154      program[aliasPc] = {
    337155        pc: aliasRecord.pc,
     
    381199      const command = program[program.pc];
    382200      const value = command.value;
    383       const symbol = program.getSymbolRecord(program, command.symbol);
     201      const symbol = program.getSymbolRecord(command.symbol);
    384202      if (symbol.isValueHolder) {
    385203        const handler = program.domain[symbol.domain];
     
    443261        return true;
    444262      }
    445       program.error.NoSuchVariableError(compiler.getToken());
     263      compiler.error.NoSuchVariableError(compiler.getToken());
    446264    },
    447265
     
    454272          break;
    455273        case 'symbol':
    456           console.log('Symbol: ' + JSON.stringify(program.getSymbolRecord(program, command.name), null, 2));
     274          console.log('Symbol: ' + JSON.stringify(program.getSymbolRecord(command.name), null, 2));
    457275          break;
    458276        default:
     
    528346      const value1 = command.value1;
    529347      const value2 = command.value2;
    530       const target = program.getSymbolRecord(program, command.target);
     348      const target = program.getSymbolRecord(command.target);
    531349      if (target.isValueHolder) {
    532350        const value = target.value[target.index];
    533351        if (value1) {
    534           const result = program.value.evaluate(program, value1).content / program.value.evaluate(program, value2).content;
     352          const result = program.getValue(value1) / program.getValue(value2);
    535353          target.value[target.index] = {
    536354            type: 'constant',
     
    542360            program.error.nonNumericValueError();
    543361          }
    544           const result = value.content / program.value.evaluate(program, value2).content;
     362          const result = value.content / program.getValue(value2);
    545363          target.value[target.index] = {
    546364            type: 'constant',
     
    589407      try {
    590408        if (typeof EasyCoder_extension === 'function') {
    591           const request = program.value.evaluate(program, command.request).content;
    592           const data = program.value.evaluate(program, command.data).content;
     409          const request = program.getValue(command.request);
     410          const data = program.getValue(command.data);
    593411          EasyCoder_extension(program, request, data);
    594412        } else {
     
    790608    run: program => {
    791609      const command = program[program.pc];
    792       const symbol = program.getSymbolRecord(program, command.symbol);
    793       symbol.index = program.value.evaluate(program, command.value).content;
     610      const symbol = program.getSymbolRecord(command.symbol);
     611      symbol.index = program.getValue(command.value);
    794612      if (symbol.index >= symbol.elements) {
    795613        program.error.arrayIndexOutOfRangeError(symbol.name);
     
    859677      const value1 = command.value1;
    860678      const value2 = command.value2;
    861       const target = program.getSymbolRecord(program, command.target);
     679      const target = program.getSymbolRecord(command.target);
    862680      if (target.isValueHolder) {
    863681        const value = target.value[target.index];
    864682        if (value1) {
    865           const result = program.value.evaluate(program, value1).content * program.value.evaluate(program, value2).content;
     683          const result = program.getValue(value1) * program.getValue(value2);
    866684          target.value[target.index] = {
    867685            type: 'constant',
     
    873691            program.error.nonNumericValueError();
    874692          }
    875           const result = value.content * program.value.evaluate(program, value2).content;
     693          const result = value.content * program.getValue(value2);
    876694          target.value[target.index] = {
    877695            type: 'constant',
     
    910728      const command = program[program.pc];
    911729      const value = command.value;
    912       const symbol = program.getSymbolRecord(program, command.symbol);
     730      const symbol = program.getSymbolRecord(command.symbol);
    913731      if (symbol.isValueHolder) {
    914732        symbol.value[symbol.index] = {
     
    941759    run: program => {
    942760      const command = program[program.pc];
    943       const value = program.value.evaluate(program, command.value).content;
     761      const value = program.getValue(command.value);
    944762      console.log('-> ' + value);
    945       return program[program.pc].pc + 1;
     763      return command.pc + 1;
    946764    }
    947765  },
     
    978796      const command = program[program.pc];
    979797      const value = command.value;
    980       const target = program.getSymbolRecord(program, command.target);
     798      const target = program.getSymbolRecord(command.target);
    981799      if (!target.isValueHolder) {
    982800        program.error.variableDoesNotHoldAValueError(target.name);
    983801      }
    984       target.value[target.index] = program.value.evaluate(program, value);
     802      target.value[target.index] = program.evaluate(value);
    985803      return command.pc + 1;
    986804    }
     
    1086904      switch (command.type) {
    1087905        case 'setBoolean':
    1088           const target = program.getSymbolRecord(program, command.target);
     906          const target = program.getSymbolRecord(command.target);
    1089907          if (target.isValueHolder) {
    1090908            target.value[target.index] = {
     
    1098916          break;
    1099917        case 'setElements':
    1100           const symbol = program.getSymbolRecord(program, command.symbol);
    1101           symbol.elements = program.value.evaluate(program, command.value).content;
     918          const symbol = program.getSymbolRecord(command.symbol);
     919          symbol.elements = program.getValue(command.value);
    1102920          symbol.index = 0;
    1103921          symbol.value = [];
     
    1107925          break;
    1108926        case 'setArray':
    1109           const targetRecord = program.getSymbolRecord(program, command.target);
     927          const targetRecord = program.getSymbolRecord(command.target);
    1110928          targetRecord.elements = command.value.length;
    1111929          targetRecord.value = command.value;
     
    12101028      const value1 = command.value1;
    12111029      const value2 = command.value2;
    1212       const target = program.getSymbolRecord(program, command.target);
     1030      const target = program.getSymbolRecord(command.target);
    12131031      if (target.isValueHolder) {
    12141032        const value = target.value[target.index];
    12151033        if (value2) {
    1216           const result = program.value.evaluate(program, value2).content - program.value.evaluate(program, value1).content;
     1034          const result = program.getValue(value2) - program.getValue(value1);
    12171035          target.value[target.index] = {
    12181036            type: 'constant',
     
    12241042            program.error.nonNumericValueError();
    12251043          }
    1226           const result = program.value.evaluate(program, value).content - program.value.evaluate(program, value1).content;
     1044          const result = program.getValue(value) - program.getValue(value1);
    12271045          target.value[target.index] = {
    12281046            type: 'constant',
     
    13261144    run: program => {
    13271145      const command = program[program.pc];
    1328       const value = program.value.evaluate(program, command.value).content;
     1146      const value = program.getValue(command.value);
    13291147      setTimeout(function () {
    13301148        program.run(program, command.pc + 1);
     
    13391157      const lino = compiler.getLino();
    13401158      compiler.next();
    1341       const condition = compiler.condition.compile(compiler);
     1159      const condition = compiler.getCondition();
    13421160      const pc = compiler.getPc();
    13431161      compiler.addCommand({
     
    15061324        };
    15071325      }
     1326      if (token === 'cos') {
     1327        compiler.next();
     1328        const angle_c = compiler.getValue();
     1329        compiler.skip('radius');
     1330        const radius_c = compiler.getValue();
     1331        return {
     1332          domain: 'basic',
     1333          type: 'cos',
     1334          angle_c,
     1335          radius_c
     1336        };
     1337      }
     1338      if (token === 'sin') {
     1339        compiler.next();
     1340        const angle_s = compiler.getValue();
     1341        compiler.skip('radius');
     1342        const radius_s = compiler.getValue();
     1343        return {
     1344          domain: 'basic',
     1345          type: 'sin',
     1346          angle_s,
     1347          radius_s
     1348        };
     1349      }
     1350      if (token === 'tan') {
     1351        compiler.next();
     1352        const angle_t = compiler.getValue();
     1353        compiler.skip('radius');
     1354        const radius_t = compiler.getValue();
     1355        return {
     1356          domain: 'basic',
     1357          type: 'tan',
     1358          angle_t,
     1359          radius_t
     1360        };
     1361      }
    15081362      if (token === 'empty') {
    15091363        compiler.next();
     
    15161370        compiler.next();
    15171371      }
    1518       token = compiler.getToken();
    1519       if (token === 'index') {
    1520         compiler.next();
    1521         if (compiler.tokenIs('of')) {
     1372      switch (compiler.getToken()) {
     1373        case 'index':
    15221374          compiler.next();
    1523           if (compiler.isSymbol()) {
    1524             const name = compiler.getToken();
     1375          if (compiler.tokenIs('of')) {
    15251376            compiler.next();
     1377            if (compiler.isSymbol()) {
     1378              const name = compiler.getToken();
     1379              compiler.next();
     1380              return {
     1381                domain: 'basic',
     1382                type: 'index',
     1383                name
     1384              };
     1385            }
     1386          }
     1387          break;
     1388        case 'value':
     1389          compiler.next();
     1390          if (compiler.tokenIs('of')) {
     1391            compiler.next();
     1392            const value = compiler.getValue();
    15261393            return {
    15271394              domain: 'basic',
    1528               type: 'index',
    1529               name
     1395              type: 'valueOf',
     1396              value
    15301397            };
    15311398          }
    1532         }
    1533       } else if (token === 'value') {
    1534         compiler.next();
    1535         if (compiler.tokenIs('of')) {
     1399          break;
     1400        case 'length':
    15361401          compiler.next();
    1537           const value = compiler.getValue();
    1538           return {
    1539             domain: 'basic',
    1540             type: 'valueOf',
    1541             value
    1542           };
    1543         }
    1544       }
     1402          if (compiler.tokenIs('of')) {
     1403            compiler.next();
     1404            const value = compiler.getValue();
     1405            return {
     1406              domain: 'basic',
     1407              type: 'lengthOf',
     1408              value
     1409            };
     1410          }
     1411          break;
     1412        case 'left':
     1413          compiler.next();
     1414          const leftCount = compiler.getValue();
     1415          if (compiler.tokenIs("of")) {
     1416            compiler.next();
     1417            const leftValue = compiler.getValue();
     1418            return {
     1419              domain: 'basic',
     1420              type: 'left',
     1421              count: leftCount,
     1422              value: leftValue
     1423            };
     1424          }
     1425          break;
     1426        case 'right':
     1427          compiler.next();
     1428          const rightCount = compiler.getValue();
     1429          if (compiler.tokenIs("of")) {
     1430            compiler.next();
     1431            const rightValue = compiler.getValue();
     1432            return {
     1433              domain: 'basic',
     1434              type: 'right',
     1435              count: rightCount,
     1436              value: rightValue
     1437            };
     1438          }
     1439          break;
     1440      };
    15451441      return null;
    15461442    },
     
    15581454            type: 'constant',
    15591455            numeric: true,
    1560             content: program.getSymbolRecord(program, value.name).index
     1456            content: program.getSymbolRecord(value.name).index
    15611457          };
    15621458        case 'random':
    1563           const range = program.value.evaluate(program, value.range);
     1459          const range = program.evaluate(value.range);
    15641460          return {
    15651461            type: 'constant',
     
    15671463            content: Math.floor(Math.random() * range.content)
    15681464          };
    1569         case 'valueOf':
    1570           const parsed = program.value.evaluate(program, value.value);
     1465        case 'cos':
     1466          const angle_c = program.getValue(value.angle_c);
     1467          const radius_c = program.getValue(value.radius_c);
    15711468          return {
    15721469            type: 'constant',
    15731470            numeric: true,
    1574             content: parseInt(parsed.content)
     1471            content: parseInt(Math.cos(parseFloat(angle_c) * 0.01745329) * radius_c, 10)
     1472          };
     1473        case 'sin':
     1474          const angle_s = program.getValue(value.angle_s);
     1475          const radius_s = program.getValue(value.radius_s);
     1476          return {
     1477            type: 'constant',
     1478            numeric: true,
     1479            content: parseInt(Math.sin(parseFloat(angle_s) * 0.01745329) * radius_s, 10)
     1480          };
     1481        case 'tan':
     1482          const angle_t = program.getValue(value.angle_t);
     1483          const radius_t = program.getValue(value.radius_t);
     1484          return {
     1485            type: 'constant',
     1486            numeric: true,
     1487            content: parseInt(Math.tan(parseFloat(angle_t) * 0.01745329) * radius_t, 10)
     1488          };
     1489        case 'valueOf':
     1490          return {
     1491            type: 'constant',
     1492            numeric: true,
     1493            content: program.getValue(value.value)
     1494          };
     1495        case 'lengthOf':
     1496          return {
     1497            type: 'constant',
     1498            numeric: true,
     1499            content: program.getValue(value.value).length
     1500          };
     1501        case 'left':
     1502          const lv = program.getValue(value.value);
     1503          return {
     1504            type: 'constant',
     1505            numeric: false,
     1506            content: program.getValue(value.value).substr(0, program.getValue(value.count))
    15751507          };
    15761508        case 'modulo':
    1577           const symbolRecord = program.getSymbolRecord(program, value.name);
    1578           const modval = program.value.evaluate(program, value.value);
     1509          const symbolRecord = program.getSymbolRecord(value.name);
     1510          const modval = program.evaluate(value.value);
    15791511          return {
    15801512            type: 'constant',
     
    16711603      switch (condition.type) {
    16721604        case 'boolean':
    1673           return program.value.evaluate(program, condition.value).content;
     1605          return program.getValue(condition.value);
    16741606        case 'is':
    16751607          comparison = program.compare(program, condition.value1, condition.value2);
     
    16821614          return condition.negate ? comparison >= 0 : comparison < 0;
    16831615        case 'not':
    1684           return !program.value.evaluate(program, condition.value).content;
     1616          return !program.getValue(condition.value);
    16851617      }
    16861618      ;
     
    17481680          case 'select':
    17491681          case 'span':
     1682          case 'pre':
    17501683          case 'popup':
    17511684            compiler.next();
     
    17801713        program.error.noSuchElementError(cssId);
    17811714      }
    1782       const target = program.getSymbolRecord(program, command.symbol);
     1715      const target = program.getSymbolRecord(command.symbol);
    17831716      target.value[target.index] = {
    17841717        type: 'constant',
     
    18331766        const target = symbolRecord.name;
    18341767        compiler.next();
    1835         if (symbolRecord.keyword === 'audioclip') {
    1836           if (compiler.tokenIs('from')) {
    1837             compiler.next();
    1838           }
    1839           const value = compiler.getValue();
    1840           compiler.addCommand({
    1841             domain: 'browser',
    1842             keyword: 'create',
    1843             lino,
    1844             target,
    1845             value
    1846           });
    1847           return true;
     1768        switch (symbolRecord.keyword) {
     1769          case 'audioclip':
     1770            if (compiler.tokenIs('from')) {
     1771              compiler.next();
     1772            }
     1773            const value = compiler.getValue();
     1774            compiler.addCommand({
     1775              domain: 'browser',
     1776              keyword: 'create',
     1777              type: 'audioclip',
     1778              name: symbolRecord.name,
     1779              lino,
     1780              target,
     1781              value
     1782            });
     1783            return true;
     1784          case 'div':
     1785          case 'p':
     1786          case 'h1':
     1787          case 'h2':
     1788          case 'h3':
     1789          case 'h4':
     1790          case 'h5':
     1791          case 'h6':
     1792          case 'span':
     1793          case 'button':
     1794          case 'input':
     1795          case 'pre':
     1796            var inputType = '';
     1797            if (symbolRecord.keyword === 'input') {
     1798              if (compiler.tokenIs('type')) {
     1799                compiler.next();
     1800                inputType = compiler.getToken();
     1801                compiler.next();
     1802              } else {
     1803                compiler.error.missingInputTypeError();
     1804              }
     1805            }
     1806            if (compiler.tokenIs('in')) {
     1807              compiler.next();
     1808              if (compiler.isSymbol()) {
     1809                const parentRecord = compiler.getSymbolRecord();
     1810                if (parentRecord.extra !== 'dom') {
     1811                  compiler.error.inappropriateTypeError(parentRecord.keyword);
     1812                }
     1813                compiler.next();
     1814                var className = '';
     1815                var style = '';
     1816                var text = '';
     1817                var flag = true;
     1818                while (flag) {
     1819                  const token = compiler.getToken();
     1820                  if (!token) {
     1821                    break;
     1822                  }
     1823                  compiler.next();
     1824                  switch (token) {
     1825                    case 'class':
     1826                      className = compiler.getValue();
     1827                      break;
     1828                    case 'style':
     1829                      style = compiler.getValue();
     1830                      break;
     1831                    case 'text':
     1832                      text = compiler.getValue();
     1833                      break;
     1834                    default:
     1835                      compiler.prev();
     1836                      flag = false;
     1837                      break;
     1838                  }
     1839                }
     1840                compiler.addCommand({
     1841                  domain: 'browser',
     1842                  keyword: 'create',
     1843                  lino,
     1844                  type: symbolRecord.keyword,
     1845                  name: symbolRecord.name,
     1846                  inputType,
     1847                  className,
     1848                  style,
     1849                  text,
     1850                  parent: parentRecord.name
     1851                });
     1852                return true;
     1853              }
     1854            }
     1855            break;
    18481856        }
    18491857      }
     
    18531861    run: program => {
    18541862      const command = program[program.pc];
    1855       const targetRecord = program.getSymbolRecord(program, command.target);
    1856       targetRecord.value[targetRecord.index] = command.value;
     1863      const targetRecord = program.getSymbolRecord(command.name);
     1864      switch (command.type) {
     1865        case 'audioclip':
     1866          targetRecord.value[targetRecord.index] = command.value;
     1867          break;
     1868        default:
     1869          const parentRecord = program.getSymbolRecord(command.parent);
     1870          const container = document.getElementById(parentRecord.value[parentRecord.index].content);
     1871          const element = document.createElement(command.type);
     1872          element.id = "easycoder-" + targetRecord.name + "-" + targetRecord.index;
     1873          targetRecord.value[targetRecord.index] = {
     1874            type: 'constant',
     1875            numeric: false,
     1876            content: element.id
     1877          };
     1878          container.appendChild(element);
     1879          if (command.inputType) {
     1880            element.setAttribute('type', command.inputType);
     1881          }
     1882          if (command.className) {
     1883            element.className = command.className;
     1884          }
     1885          const styles = program.value.evaluate(program, command.style).content;
     1886          for (const item of styles.split(';')) {
     1887            const style = item.split(':');
     1888            element.style[style[0]] = style[1];
     1889          };
     1890          if (command.text) {
     1891            element.textContent = program.value.evaluate(program, command.text).content;
     1892          }
     1893          break;
     1894      }
    18571895      return program[program.pc].pc + 1;
    18581896    }
     
    19061944    run: program => {
    19071945      const command = program[program.pc];
    1908       const symbol = program.getSymbolRecord(program, command.symbol);
     1946      const symbol = program.getSymbolRecord(command.symbol);
    19091947      const target = document.getElementById(symbol.value[symbol.index].content);
    19101948      target.style.visibility = 'hidden';
     
    20042042            // Add the action
    20052043            compiler.compileOne();
     2044            // Add a 'stop'
     2045            compiler.addCommand({
     2046              domain: 'basic',
     2047              keyword: 'stop',
     2048              lino,
     2049              next: 0
     2050            });
    20062051            // Fixup the 'goto'
    20072052            compiler.getCommandAt(goto).goto = compiler.getPc();
     
    20152060    run: program => {
    20162061      const command = program[program.pc];
    2017       const targetItem = program.getSymbolRecord(program, command.symbol);
     2062      const targetItem = program.getSymbolRecord(command.symbol);
    20182063      switch (command.action) {
    20192064        case 'change':
     
    20982143    run: program => {
    20992144      const command = program[program.pc];
    2100       const targetRecord = program.getSymbolRecord(program, command.target);
     2145      const targetRecord = program.getSymbolRecord(command.target);
    21012146      const url = program.value.evaluate(program, targetRecord.value[targetRecord.index]).content;
    21022147      new Audio(url).play();
     
    21092154    compile: compiler => {
    21102155      const item = compiler.compileVariable('browser', 'popup');
     2156      return true;
     2157    },
     2158
     2159    run: program => {
     2160      return program[program.pc].pc + 1;
     2161    }
     2162  },
     2163
     2164  PRE: {
     2165
     2166    compile: compiler => {
     2167      const item = compiler.compileVariable('browser', 'pre', false, 'dom');
    21112168      return true;
    21122169    },
     
    21402197    run: program => {
    21412198      const command = program[program.pc];
    2142       const symbol = program.getSymbolRecord(program, command.symbol);
     2199      const symbol = program.getSymbolRecord(command.symbol);
    21432200      const target = document.getElementById(symbol.value[symbol.index].content);
    21442201      target.style.display = 'none';
     
    23232380      switch (command.type) {
    23242381        case 'setContentVar':
    2325           const sourceVar = program.getSymbolRecord(program, command.source);
    2326           targetVar = program.getSymbolRecord(program, command.target);
     2382          const sourceVar = program.getSymbolRecord(command.source);
     2383          targetVar = program.getSymbolRecord(command.target);
    23272384          const source = document.getElementById(sourceVar.value[sourceVar.index].content);
    23282385          target = document.getElementById(targetVar.value[targetVar.index].content);
     
    23352392            value = '' + value;
    23362393          }
    2337           targetVar = program.getSymbolRecord(program, command.target);
     2394          targetVar = program.getSymbolRecord(command.target);
    23382395          cssId = targetVar.value[targetVar.index].content;
    23392396          target = document.getElementById(cssId);
     
    23412398          break;
    23422399        case 'setText':
    2343           symbol = program.getSymbolRecord(program, command.symbolName);
     2400          symbol = program.getSymbolRecord(command.symbolName);
    23442401          target = document.getElementById(symbol.value[symbol.index].content);
    23452402          value = program.value.evaluate(program, command.value).content;
     
    23562413          break;
    23572414        case 'setAttribute':
    2358           symbol = program.getSymbolRecord(program, command.symbolName);
     2415          symbol = program.getSymbolRecord(command.symbolName);
    23592416          var attributeValue;
    23602417          switch (command.attributeValue.type) {
     
    23632420              break;
    23642421            case 'symbol':
    2365               const symbol = program.getSymbolRecord(program, command.attributeValue.name);
     2422              const symbol = program.getSymbolRecord(command.attributeValue.name);
    23662423              attributeValue = symbol.value[symbol.index].content;
    23672424              break;
     
    23722429          break;
    23732430        case 'setStyle':
    2374           symbol = program.getSymbolRecord(program, command.symbolName);
     2431          symbol = program.getSymbolRecord(command.symbolName);
    23752432          const styleValue = program.value.evaluate(program, command.styleValue);
    2376           //          switch (command.styleValue.type) {
    2377           //            case 'constant':
    2378           //              styleValue = command.styleValue.content;
    2379           //              break;
    2380           //            case 'symbol':
    2381           //              const symbol = program.getSymbolRecord(program, command.styleValue.name);
    2382           //              styleValue = symbol.value[symbol.index].content;
    2383           //              break;
    2384           //            case 'color':
    2385           //              switch (command.styleValue.value.type) {
    2386           //                case 'constant':
    2387           //                  styleValue = command.styleValue.value.content;
    2388           //                  break;
    2389           //                case 'symbol':
    2390           //                  const symbol = program.getSymbolRecord(program, command.styleValue.value.name);
    2391           //                  styleValue = symbol.value[symbol.index].content;
    2392           //                  break;
    2393           //              }
    2394           //              let hex = styleValue.toString(16);
    2395           //              while (hex.length < 6) {
    2396           //                hex = '00' + hex;
    2397           //              }
    2398           //              styleValue = '#' + hex;
    2399           //              break;
    2400           //          }
    24012433          if (!symbol.value[symbol.index]) {
    24022434            program.error.runtimeError('Variable \'' + symbol.name + '\' has not been assigned.');
     
    24382470    run: program => {
    24392471      const command = program[program.pc];
    2440       const symbol = program.getSymbolRecord(program, command.symbol);
     2472      const symbol = program.getSymbolRecord(command.symbol);
    24412473      const target = document.getElementById(symbol.value[symbol.index].content);
    24422474      switch (symbol.type) {
     
    25802612      case 'popup':
    25812613        return EasyCoder_Browser.Popup;
     2614      case 'pre':
     2615        return EasyCoder_Browser.PRE;
    25822616      case 'remove':
    25832617        return EasyCoder_Browser.Remove;
     
    26712705              domain: 'browser',
    26722706              type: 'contentOf',
    2673               pc: symbol.pc
     2707              symbol: symbol.name
    26742708            };
    26752709          }
     
    27032737      switch (value.type) {
    27042738        case 'symbol':
    2705           symbolRecord = program.getSymbolRecord(program, value.name);
     2739          symbolRecord = program.getSymbolRecord(value.name);
    27062740          element = symbolRecord.value[symbolRecord.index].content;
    27072741          switch (symbolRecord.keyword) {
     
    27202754        case 'property':
    27212755          const property = program.value.evaluate(program, value.property).content;
    2722           symbolRecord = program.getSymbolRecord(program, value.symbol);
     2756          symbolRecord = program.getSymbolRecord(value.symbol);
    27232757          content = program.value.evaluate(program, symbolRecord.value[symbolRecord.index]).content;
    27242758          content = JSON.parse(content);
     
    27492783          };
    27502784        case 'contentOf':
    2751           // Fetch the current value from the DOM.
     2785          symbolRecord = program.getSymbolRecord(value.symbol);
     2786          element = symbolRecord.value[symbolRecord.index].content;
     2787          target = document.getElementById(element);
     2788          return {
     2789            type: 'constant',
     2790            numeric: false,
     2791            content: target.textContent
     2792          };
    27522793          break;
    27532794        case 'widthOf':
    2754           symbolRecord = program.getSymbolRecord(program, value.symbol);
     2795          symbolRecord = program.getSymbolRecord(value.symbol);
    27552796          element = symbolRecord.value[symbolRecord.index].content;
    27562797          target = document.getElementById(element);
     
    27612802          };
    27622803        case 'heightOf':
    2763           symbolRecord = program.getSymbolRecord(program, value.symbol);
     2804          symbolRecord = program.getSymbolRecord(value.symbol);
    27642805          element = symbolRecord.value[symbolRecord.index].content;
    27652806          target = document.getElementById(element);
     
    28172858        case 'get':
    28182859          compiler.next();
     2860          if (compiler.tokenIs('item')) {
     2861            compiler.next();
     2862            const item = compiler.getValue();
     2863            if (compiler.tokenIs('of')) {
     2864              compiler.next();
     2865              if (compiler.isSymbol()) {
     2866                const source = compiler.getToken();
     2867                compiler.next();
     2868                if (compiler.tokenIs("as")) {
     2869                  compiler.next();
     2870                  if (compiler.isSymbol()) {
     2871                    const targetRecord = compiler.getSymbolRecord();
     2872                    if (targetRecord.keyword === 'variable') {
     2873                      compiler.next();
     2874                      compiler.addCommand({
     2875                        domain: 'json',
     2876                        keyword: 'json',
     2877                        lino,
     2878                        request: 'getItem',
     2879                        target: targetRecord.name,
     2880                        item,
     2881                        source
     2882                      });
     2883                      return true;
     2884                    }
     2885                  }
     2886                }
     2887              }
     2888            }
     2889            compiler.error.expectedError('of', compiler.getToken());
     2890          } else if (compiler.tokenIs('element')) {
     2891            compiler.next();
     2892            const element = compiler.getValue();
     2893            if (compiler.tokenIs('of')) {
     2894              compiler.next();
     2895              if (compiler.isSymbol()) {
     2896                const source = compiler.getToken();
     2897                compiler.next();
     2898                if (compiler.tokenIs("as")) {
     2899                  compiler.next();
     2900                  if (compiler.isSymbol()) {
     2901                    const targetRecord = compiler.getSymbolRecord();
     2902                    if (targetRecord.keyword === 'variable') {
     2903                      compiler.next();
     2904                      compiler.addCommand({
     2905                        domain: 'json',
     2906                        keyword: 'json',
     2907                        lino,
     2908                        request: 'getElement',
     2909                        target: targetRecord.name,
     2910                        element,
     2911                        source
     2912                      });
     2913                      return true;
     2914                    }
     2915                  }
     2916                }
     2917              }
     2918            }
     2919            compiler.error.expectedError('of', compiler.getToken());
     2920          }
    28192921          if (compiler.isSymbol()) {
    28202922            const targetRecord = compiler.getSymbolRecord();
     
    28332935                });
    28342936                return true;
    2835               } else if (compiler.tokenIs('as')) {
    2836                 compiler.next();
    2837                 if (compiler.tokenIs('item')) {
    2838                   compiler.next();
    2839                   const item = compiler.getValue();
    2840                   if (compiler.tokenIs('of')) {
    2841                     compiler.next();
    2842                     if (compiler.isSymbol()) {
    2843                       const source = compiler.getToken();
    2844                       compiler.next();
    2845                       compiler.addCommand({
    2846                         domain: 'json',
    2847                         keyword: 'json',
    2848                         lino,
    2849                         request: 'getItem',
    2850                         target: targetRecord.name,
    2851                         item,
    2852                         source
    2853                       });
    2854                     }
    2855                   }
    2856                   return true;
    2857                 }
    28582937              }
    28592938            }
     
    29102989            break;
    29112990          }
     2991        case 'shuffle':
     2992          compiler.next();
     2993          if (compiler.isSymbol()) {
     2994            const targetRecord = compiler.getSymbolRecord();
     2995            if (targetRecord.keyword === 'variable') {
     2996              compiler.next();
     2997              compiler.addCommand({
     2998                domain: 'json',
     2999                keyword: 'json',
     3000                lino,
     3001                request: 'shuffle',
     3002                target: targetRecord.name
     3003              });
     3004              return true;
     3005            }
     3006          }
     3007          return false;
    29123008      }
    29133009      compiler.addWarning('Unrecognised syntax in \'json\'');
     
    29263022            if (this.readyState === 4 && this.status === 200) {
    29273023              const command = program.ajaxCommand;
    2928               const targetRecord = program.getSymbolRecord(program, command.target);
     3024              const targetRecord = program.getSymbolRecord(command.target);
    29293025              targetRecord.value[targetRecord.index] = {
    29303026                type: 'constant',
     
    29403036          return 0;
    29413037        case 'getItem':
    2942           sourceRecord = program.getSymbolRecord(program, command.source);
    2943           const data = JSON.parse(sourceRecord.value[sourceRecord.index].content);
    2944           const item = data[command.item.content];
    2945           targetRecord = program.getSymbolRecord(program, command.target);
     3038          sourceRecord = program.getSymbolRecord(command.source);
     3039          const itemData = JSON.parse(sourceRecord.value[sourceRecord.index].content);
     3040          const itemContent = itemData[program.getValue(command.item)];
     3041          targetRecord = program.getSymbolRecord(command.target);
    29463042          targetRecord.value[targetRecord.index] = {
    29473043            type: 'constant',
    29483044            numeric: false,
    2949             content: item
     3045            content: typeof itemContent === "object" ? JSON.stringify(itemContent) : itemContent
     3046          };
     3047          break;
     3048        case 'getElement':
     3049          sourceRecord = program.getSymbolRecord(command.source);
     3050          const elementData = JSON.parse(sourceRecord.value[sourceRecord.index].content);
     3051          const elementContent = elementData[program.getValue(command.element)];
     3052          targetRecord = program.getSymbolRecord(command.target);
     3053          targetRecord.value[targetRecord.index] = {
     3054            type: 'constant',
     3055            numeric: false,
     3056            content: typeof elementContent === "object" ? JSON.stringify(elementContent) : elementContent
    29503057          };
    29513058          break;
    29523059        case 'setList':
    29533060          // we assume the source to be a JSON array
    2954           sourceRecord = program.getSymbolRecord(program, command.source);
    2955           targetRecord = program.getSymbolRecord(program, command.target);
     3061          sourceRecord = program.getSymbolRecord(command.source);
     3062          targetRecord = program.getSymbolRecord(command.target);
    29563063          const target = document.getElementById(targetRecord.value[targetRecord.index].content);
    29573064          target.options.length = 0;
     
    29673074          break;
    29683075        case 'encoding':
    2969           program.encoding = program.value.evaluate(program, command.encoding).content;
     3076          program.encoding = program.getValue(command.encoding);
    29703077          break;
     3078        case 'shuffle':
     3079          targetRecord = program.getSymbolRecord(command.target);
     3080          var a = JSON.parse(program.getValue(targetRecord.value[targetRecord.index]));
     3081          for (let i = a.length - 1; i > 0; i--) {
     3082            const j = Math.floor(Math.random() * (i + 1));
     3083            [a[i], a[j]] = [a[j], a[i]];
     3084          }
     3085          targetRecord.value[targetRecord.index] = {
     3086            type: 'constant',
     3087            numeric: false,
     3088            content: JSON.stringify(a)
     3089          };
    29713090      }
    29723091      return command.pc + 1;
     
    30533172        program.error.noSuchElementError(cssId);
    30543173      }
    3055       const target = program.getSymbolRecord(program, command.symbol);
     3174      const target = program.getSymbolRecord(command.symbol);
    30563175      target.value[target.index] = {
    30573176        type: 'constant',
     
    32003319      const ns = "http://www.w3.org/2000/svg";
    32013320      const command = program[program.pc];
    3202       var parentRecord = program.getSymbolRecord(program, command.parent);
     3321      var parentRecord = program.getSymbolRecord(command.parent);
    32033322      var group;
    3204       const symbolRecord = program.getSymbolRecord(program, command.name);
     3323      const symbolRecord = program.getSymbolRecord(command.name);
    32053324      if (command.type === 'group') {
    32063325        symbolRecord.parent = command.parent;
     
    32213340          // Find the real parent
    32223341          while (parentRecord.keyword === 'group') {
    3223             parentRecord = program.getSymbolRecord(program, parentRecord.parent);
     3342            parentRecord = program.getSymbolRecord(parentRecord.parent);
    32243343          }
    32253344        }
     
    33393458      const newX = program.value.evaluate(program, command.x).content;
    33403459      const newY = program.value.evaluate(program, command.y).content;
    3341       const symbolRecord = program.getSymbolRecord(program, command.name);
     3460      const symbolRecord = program.getSymbolRecord(command.name);
    33423461      switch (symbolRecord.keyword) {
    33433462        case 'group':
    33443463          for (const item of symbolRecord.value[symbolRecord.index].content) {
    3345             const itemRecord = program.getSymbolRecord(program, item.name);
     3464            const itemRecord = program.getSymbolRecord(item.name);
    33463465            const value = itemRecord.value[item.index];
    33473466            const element = document.getElementById(value.content);
     
    33793498          const symRec = symbolRecord.value[symbolRecord.index];
    33803499          if (symRec.groupName) {
    3381             const parentRecord = program.getSymbolRecord(program, symRec.groupName);
     3500            const parentRecord = program.getSymbolRecord(symRec.groupName);
    33823501            px = parentRecord.x;
    33833502            py = parentRecord.y;
     
    34553574    run: program => {
    34563575      const command = program[program.pc];
    3457       const targetItem = program.getSymbolRecord(program, command.symbol);
     3576      const targetItem = program.getSymbolRecord(command.symbol);
    34583577      switch (command.action) {
    34593578        case 'click':
     
    34633582              if (groupValue.content) {
    34643583                for (const value of groupValue.content) {
    3465                   const contentItem = program.getSymbolRecord(program, value.name);
     3584                  const contentItem = program.getSymbolRecord(value.name);
    34663585                  const contentValue = contentItem.value[value.index];
    34673586                  if (contentValue.content) {
     
    34803599                        const group = targetItem.value[targetItem.index];
    34813600                        for (const gc of group.content) {
    3482                           const gi = program.getSymbolRecord(program, gc.name);
     3601                          const gi = program.getSymbolRecord(gc.name);
    34833602                          gi.index = gc.index;
    34843603                          const groupItem = gi.value[gi.index];
     
    35703689      switch (command.type) {
    35713690        case 'setText':
    3572           symbol = program.getSymbolRecord(program, command.symbolName);
     3691          symbol = program.getSymbolRecord(command.symbolName);
    35733692          target = document.getElementById(symbol.value[symbol.index].content);
    35743693          value = program.value.evaluate(program, command.value).content;
     
    36813800      switch (value.type) {
    36823801        case 'text':
    3683           const symbolRecord = program.getSymbolRecord(program, value.name);
     3802          const symbolRecord = program.getSymbolRecord(value.name);
    36843803          //          console.log('symbolRecord: ' + JSON.stringify(symbolRecord.value[symbolRecord.index], null, 2));
    36853804          const element = document.getElementById(symbolRecord.value[symbolRecord.index].content);
     
    37703889  },
    37713890
     3891  nextToken: () => {
     3892    EasyCoder_Compiler.next();
     3893    return EasyCoder_Compiler.getToken();
     3894  },
     3895
     3896  skip: token => {
     3897    if (_this.index >= _this.tokens.length) {
     3898      return null;
     3899    }
     3900    EasyCoder_Compiler.next();
     3901    if (EasyCoder_Compiler.tokenIs(token)) {
     3902      EasyCoder_Compiler.next();
     3903    }
     3904  },
     3905
    37723906  prev: () => {
    37733907    _this.index--;
     
    38303964  getValue: () => {
    38313965    return EasyCoder_Compiler.value.compile(EasyCoder_Compiler);
     3966  },
     3967
     3968  getCondition: () => {
     3969    return EasyCoder_Compiler.condition.compile(EasyCoder_Compiler);
     3970  },
     3971
     3972  constant: content => {
     3973    return EasyCoder_Compiler.value.constant(content);
    38323974  },
    38333975
     
    38844026      //      console.log('Try domain ' + domainName + ' for token ' + token);
    38854027      const domain = EasyCoder_Compiler.domain[domainName];
    3886       const handler = domain.getHandler(token);
    3887       if (handler) {
    3888         if (handler.compile(EasyCoder_Compiler)) {
    3889           return;
     4028      if (domain) {
     4029        const handler = domain.getHandler(token);
     4030        if (handler) {
     4031          if (handler.compile(EasyCoder_Compiler)) {
     4032            return;
     4033          }
    38904034        }
    38914035      }
    38924036      EasyCoder_Compiler.rewind();
    38934037    }
     4038    console.log('No handler found');
    38944039    EasyCoder_Compiler.error.dontUnderstandError(token, index);
    38954040  },
     
    39754120module.exports = EasyCoder_Condition;
    39764121},{}],9:[function(require,module,exports){
     4122var _this = this;
     4123
     4124const EasyCoder_Tokenise = require('./Tokenise');
     4125const EasyCoder_Compiler = require('./Compile');
     4126const EasyCoder_Run = require('./Run');
     4127const EasyCoder_Value = require('./Value');
     4128const EasyCoder_Condition = require('./Condition');
     4129const EasyCoder_Compare = require('./Compare');
     4130const EasyCoder_Basic = require('../domain/Basic');
     4131const EasyCoder_Browser = require('../domain/Browser');
     4132const EasyCoder_Json = require('../domain/Json');
     4133const EasyCoder_Svg = require('../domain/Svg');
     4134
     4135const EasyCoder = {
     4136
     4137  domain: {
     4138    basic: EasyCoder_Basic,
     4139    browser: EasyCoder_Browser,
     4140    json: EasyCoder_Json,
     4141    svg: EasyCoder_Svg
     4142  },
     4143
     4144  compileError: {
     4145    dontUnderstandError: name => {
     4146      throw Error('I don\'t understand \'' + name + '\'');
     4147    },
     4148    duplicateSymbolError: name => {
     4149      throw Error('Symbol \'' + name + '\' is a duplicate');
     4150    },
     4151    inappropriateTypeError: name => {
     4152      throw Error('Inappropriate type \'' + name + '\'');
     4153    },
     4154    inappropriateVariableTypeError: name => {
     4155      throw Error('Inappropriate variable type \'' + name + '\'');
     4156    },
     4157    missingInputTypeError: () => {
     4158      throw Error('Missing input type');
     4159    },
     4160    noSuchVariableError: name => {
     4161      throw Error('No such variable: ' + name);
     4162    },
     4163    notAnIntegerError: name => {
     4164      throw Error('Value is not an integer: ' + name);
     4165    },
     4166    undefinedValueError: name => {
     4167      throw Error('Undefined value: ' + name);
     4168    },
     4169    unknownTypeError: name => {
     4170      throw Error('Unknown type: ' + name);
     4171    },
     4172    unknownVariableError: name => {
     4173      throw Error('Unknown variable: ' + name);
     4174    },
     4175    unrecognisedValueError: name => {
     4176      throw Error('I don\'t understand this value: ' + name);
     4177    },
     4178    variableDoesNotHoldAValueError: name => {
     4179      throw Error('Variable \'' + name + '\' does not hold a value');
     4180    },
     4181    expectedError: (expected, actual) => {
     4182      throw Error('Expected \'' + expected + '\' but saw \'' + actual + '\'');
     4183    }
     4184  },
     4185
     4186  runtimeError: {
     4187    arrayIndexOutOfRangeError: name => {
     4188      throw Error('Array index out of range for ' + name);
     4189    },
     4190    cantDecodeValueError: () => {
     4191      throw Error('Can\'t decode value');
     4192    },
     4193    dataTypeMismatchError: () => {
     4194      throw Error('Data type mismatch');
     4195    },
     4196    nonNumericValueError: () => {
     4197      throw Error('Non-numeric value');
     4198    },
     4199    noSuchElementError: name => {
     4200      throw Error('No such element: ' + name);
     4201    },
     4202    runtimeError: message => {
     4203      throw Error(message);
     4204    },
     4205    undefinedValueError: (name, pc) => {
     4206      _this.errorPc = pc;
     4207      throw Error('Undefined value: ' + name);
     4208    },
     4209    variableDoesNotHoldAValueError: name => {
     4210      throw Error('Variable \'' + name + '\' does not hold a value');
     4211    }
     4212  },
     4213
     4214  setupTracer: () => {
     4215    const tracer = document.getElementById('easycoder-tracer');
     4216    if (tracer) {
     4217      tracer.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>';
     4218      tracer.style.display = 'none';
     4219      //    } else {
     4220      //      console.log('No tracer element');
     4221    }
     4222  },
     4223
     4224  reportError: (source, err) => {
     4225    const compiler = EasyCoder_Compiler;
     4226    const program = compiler.getProgram();
     4227    const { tokens, scriptLines } = source;
     4228    const lino = _this.compiling ? tokens[compiler.getIndex()].lino : program.pc.lino;
     4229    var errString = '';
     4230    let start = lino - 5;
     4231    start = start < 0 ? 0 : start;
     4232    for (var n = start; n < lino; n++) {
     4233      let nn = '' + n;
     4234      while (nn.length < 4) {
     4235        nn = ' ' + nn;
     4236      }
     4237      errString += nn + ' ' + scriptLines[n].line + '\n';
     4238    }
     4239    errString += err.message + '\n';
     4240    const warnings = EasyCoder_Compiler.getWarnings();
     4241    if (warnings.length) {
     4242      errString += 'Warnings:\n';
     4243      for (const warning of warnings) {
     4244        errString += warning + '\n';
     4245      }
     4246    }
     4247    console.log(errString);
     4248    alert(errString);
     4249  },
     4250
     4251  getSymbolRecord: name => {
     4252    const target = _this.program[_this.program.symbols[name].pc];
     4253    if (target.alias) {
     4254      return _this.program[_this.program.symbols[target.alias].pc];
     4255    }
     4256    return target;
     4257  },
     4258
     4259  evaluate: value => {
     4260    return EasyCoder_Value.evaluate(_this.program, value);
     4261  },
     4262
     4263  getValue: value => {
     4264    return EasyCoder_Value.getValue(_this.program, value);
     4265  },
     4266
     4267  compileScript: (source, extension) => {
     4268    EasyCoder.domain.ext = extension;
     4269    const { tokens } = source;
     4270    try {
     4271      //            console.log('Compile script: ');
     4272      _this.compiling = true;
     4273      const startCompile = Date.now();
     4274      const compiler = EasyCoder_Compiler;
     4275      compiler.value = EasyCoder_Value;
     4276      compiler.condition = EasyCoder_Condition;
     4277      compiler.domain = EasyCoder.domain;
     4278      compiler.error = EasyCoder.compileError;
     4279      const program = EasyCoder_Compiler.compile(tokens);
     4280      _this.program = program;
     4281      const finishCompile = Date.now();
     4282      console.log('Compiled ' + tokens.length + ' tokens in ' + (finishCompile - startCompile) + 'ms');
     4283      //    console.log('Program: ' + JSON.stringify(program, null, 2));
     4284      _this.compiling = false;
     4285
     4286      program.source = source;
     4287      program.run = EasyCoder_Run;
     4288      program.value = EasyCoder_Value;
     4289      program.evaluate = EasyCoder.evaluate;
     4290      program.getValue = EasyCoder.getValue;
     4291      program.condition = EasyCoder_Condition;
     4292      program.compare = EasyCoder_Compare;
     4293      program.domain = EasyCoder.domain;
     4294      program.getSymbolRecord = EasyCoder.getSymbolRecord;
     4295      program.error = EasyCoder.runtimeError;
     4296      program.reportError = EasyCoder.reportError;
     4297      program.symbols = compiler.getSymbols();
     4298      program.encoding = 'none';
     4299      program.popups = [];
     4300      program.stack = [];
     4301      program.queue = [0];
     4302      EasyCoder.setupTracer();
     4303      console.log('Run the script');
     4304      program.run(program, 0);
     4305      //  console.log('Program: '+ JSON.stringify(program, null, 2));
     4306    } catch (err) {
     4307      EasyCoder.reportError(source, err);
     4308    }
     4309  },
     4310
     4311  start: (script, extension = null) => {
     4312    //  console.log('Tokenise script: ');
     4313    try {
     4314      const startTokenise = Date.now();
     4315      const source = EasyCoder_Tokenise.tokenise(script);
     4316      const finishTokenise = Date.now();
     4317      console.log('Tokenised ' + source.scriptLines.length + ' lines in ' + (finishTokenise - startTokenise) + 'ms');
     4318      //    console.log('Source: ' + JSON.stringify(source, null, 2));
     4319      EasyCoder.compileScript(source, extension);
     4320    } catch (err) {
     4321      console.log(err);
     4322    }
     4323  }
     4324};
     4325
     4326module.exports = EasyCoder;
     4327},{"../domain/Basic":2,"../domain/Browser":3,"../domain/Json":4,"../domain/Svg":5,"./Compare":6,"./Compile":7,"./Condition":8,"./Run":10,"./Tokenise":11,"./Value":12}],10:[function(require,module,exports){
    39774328const EasyCoder_Run = (program, pc) => {
    39784329
     
    40054356    program.pc = queue.shift();
    40064357    while (true) {
    4007       //            console.log('Run ' + program.pc + ' ' + program[program.pc].domain + ':' + program[program.pc].keyword);
    40084358      const domain = program[program.pc].domain;
     4359      //            console.log('Run ' + program.pc + ' ' + domain + ':' + program[program.pc].keyword);
    40094360      const handler = program.domain[domain];
    40104361      program.pc = handler.run(program);
     
    40274378          if (program.tracer) {
    40284379            program.tracer.variables.forEach(function (name, index, array) {
    4029               const symbol = program.getSymbolRecord(program, name);
     4380              const symbol = program.getSymbolRecord(name);
    40304381              const value = symbol.value[symbol.index];
    40314382              if (value) {
     
    40994450
    41004451module.exports = EasyCoder_Run;
    4101 },{}],10:[function(require,module,exports){
     4452},{}],11:[function(require,module,exports){
    41024453const EasyCoder_Tokenise = {
    41034454
     
    42194570
    42204571module.exports = EasyCoder_Tokenise;
    4221 },{}],11:[function(require,module,exports){
     4572},{}],12:[function(require,module,exports){
    42224573const EasyCoder_Value = {
    42234574
     
    43084659        return value;
    43094660      case 'symbol':
    4310         const symbol = program.getSymbolRecord(program, value.name);
     4661        const symbol = program.getSymbolRecord(value.name);
    43114662        if (symbol.isValueHolder) {
    43124663          const symbolValue = symbol.value[symbol.index];
     
    43314682  },
    43324683
     4684  constant: content => {
     4685    return {
     4686      type: 'constant',
     4687      numeric: 'false',
     4688      content
     4689    };
     4690  },
     4691
    43334692  // runtime
    43344693
    43354694  evaluate: (program, value) => {
     4695    if (!value) {
     4696      return {
     4697        type: 'constant',
     4698        numeric: false,
     4699        content: ''
     4700      };
     4701    }
    43364702    const result = EasyCoder_Value.doValue(program, value);
    43374703    if (result) {
     
    43394705    }
    43404706    program.error.cantDecodeValueError();
     4707  },
     4708
     4709  getValue: (program, value) => {
     4710    return EasyCoder_Value.evaluate(program, value).content;
    43414711  },
    43424712
  • easycoder/trunk/easycoder.php

    r1885298 r1949051  
    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: 1.4.0
     6   * Version: 1.5.0
    77   * Author: EasyCoder Software
    88   */
     
    1010   // The EasyCoder library
    1111   function easycoder_enqueue_script() {   
    12       wp_enqueue_script('easycoder_script', plugin_dir_url( __FILE__ ) . 'easycoder-min.js', array(), '1.4.0');
     12      wp_enqueue_script('easycoder_script', plugin_dir_url( __FILE__ ) . 'easycoder-min.js', array(), '1.5.0');
    1313   }
    1414
  • easycoder/trunk/readme.txt

    r1885298 r1949051  
    4545== Changelog ==
    4646
     47= 1.5.0 =
     48* Added sin, cos & tan trig functions; left and right substring operators; json shuffle.
     49
    4750= 1.4.0 =
    4851* Added alias variables.
Note: See TracChangeset for help on using the changeset viewer.