<snapdata remixID="9242506"><project name="Snap! Dev tools" app="Snap! 10.7.2, https://snap.berkeley.edu" version="2"><notes>If you use these blocks, read the warning below and credit me.&#xD;Warning: These blocks are experimental. Some may work properly, and some may not work properly. If any start with "WiP:", which means Work in Progress, I have found at least one problem, and they will likely not work. If you use these blocks and they break your Snap! session or corrupt your project, I am not liable. Do not use my "run function" or "call function" blocks to access the Snap!Cloud. I have adjusted some of my other blocks to detect attempted Snap!Cloud access.</notes><thumbnail>data:image/png;base64,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</thumbnail><scenes select="1"><scene name="Snap! Dev tools"><notes>If you use these blocks, read the warning below and credit me.&#xD;Warning: These blocks are experimental. Some may work properly, and some may not work properly. If any start with "WiP:", which means Work in Progress, I have found at least one problem, and they will likely not work. If you use these blocks and they break your Snap! session or corrupt your project, I am not liable. Do not use my "run function" or "call function" blocks to access the Snap!Cloud. I have adjusted some of my other blocks to detect attempted Snap!Cloud access.</notes><hidden></hidden><headers></headers><code><string>&lt;#1&gt;</string><delim></delim></code><blocks><block-definition s="run function ( %&apos;params&apos; ) { %&apos;body&apos; } with %&apos;inputs&apos;" type="command" category="control"><header></header><code></code><translations>es:ejecutar función ( _ ) { _ } con _&#xD;</translations><inputs><input type="%mult%s"></input><input type="%code"></input><input type="%mult%s"></input></inputs><script><custom-block s="&#126;SnapenilK"></custom-block><block s="doIfElse"><custom-block s="JavaScript extensions are enabled?"></custom-block><script><block s="doRun"><block s="reportJSFunction"><block var="params"/><block var="body"/></block><block var="inputs"/></block></script><script><block s="bubble"><l>JavaScript extensions are disabled. See inside, inspect all uses of "JavaScript function", "run function", and"call function". If you trust them, click the gear icon and select "JavaScript extensions".</l></block></script></block></script></block-definition><block-definition s="call function ( %&apos;params&apos; ) { %&apos;body&apos; } with %&apos;inputs&apos;" type="reporter" category="control"><header></header><code></code><translations>es:llamar función ( _ ) { _ } con _&#xD;</translations><inputs><input type="%mult%s"></input><input type="%code">return 0;</input><input type="%mult%s"></input></inputs><script><custom-block s="&#126;SnapenilK"></custom-block><block s="doReport"><block s="reportIfElse"><custom-block s="JavaScript extensions are enabled?"></custom-block><block s="evaluate"><block s="reportJSFunction"><block var="params"/><block var="body"/></block><block var="inputs"/></block><l>JavaScript extensions are disabled. See inside, inspect all uses of "JavaScript function", "run function", and"call function". If you trust them, click the gear icon and select "JavaScript extensions".</l></block></block></script></block-definition><block-definition s="switch to dev mode" type="command" category="other"><header></header><code></code><translations>es:cambiar a modo des&#xD;</translations><inputs></inputs><script><custom-block s="&#126;SnapenilK"></custom-block><custom-block s="run function ( %mult%s ) { %code } with %mult%s"><list><l>ide</l></list><l>ide.switchToDevMode();</l><list><custom-block s="ide"></custom-block></list></custom-block></script></block-definition><block-definition s="switch to user mode" type="command" category="other"><header></header><code></code><translations>es:cambiar a modo usuario&#xD;</translations><inputs></inputs><script><custom-block s="&#126;SnapenilK"></custom-block><custom-block s="run function ( %mult%s ) { %code } with %mult%s"><list><l>ide</l></list><l>ide.switchToUserMode();</l><list><custom-block s="ide"></custom-block></list></custom-block></script></block-definition><block-definition s="ide" type="reporter" category="sensing"><header></header><code></code><translations></translations><inputs></inputs><script><custom-block s="&#126;SnapenilK"></custom-block><block s="doReport"><custom-block s="call function ( %mult%s ) { %code } with %mult%s"><list></list><l>return this.parentThatIsA(IDE_Morph);</l><list></list></custom-block></block></script></block-definition><block-definition s="in dev mode?" type="predicate" category="other"><header></header><code></code><translations>es:¿en modo des?&#xD;</translations><inputs></inputs><script><custom-block s="&#126;SnapenilK"></custom-block><block s="doReport"><custom-block s="call function ( %mult%s ) { %code } with %mult%s"><list><l>world</l></list><l>return world.isDevMode;</l><list><custom-block s="world"></custom-block></list></custom-block></block></script></block-definition><block-definition s="inspect %&apos;obj&apos;" type="command" category="other"><header></header><code></code><translations>es:inspeccionar _&#xD;</translations><inputs><input type="%obj"></input></inputs><script><custom-block s="&#126;SnapenilK"></custom-block><block s="doIf"><block s="reportNot"><custom-block s="in dev mode?"></custom-block></block><script><custom-block s="switch to dev mode"></custom-block></script><list></list></block><custom-block s="run function ( %mult%s ) { %code } with %mult%s"><list><l>obj</l></list><l>this.inspect(obj);</l><list><block var="obj"/></list></custom-block></script></block-definition><block-definition s="save project" type="command" category="other"><header></header><code></code><translations>es:guadar proyecto&#xD;</translations><inputs></inputs><script><custom-block s="&#126;SnapenilK"></custom-block><custom-block s="run function ( %mult%s ) { %code } with %mult%s"><list><l>ide</l></list><l>ide.save();</l><list><custom-block s="ide"></custom-block></list></custom-block></script></block-definition><block-definition s="world" type="reporter" category="sensing"><header></header><code></code><translations>es:mundo&#xD;</translations><inputs></inputs><script><custom-block s="&#126;SnapenilK"></custom-block><block s="doReport"><custom-block s="call function ( %mult%s ) { %code } with %mult%s"><list><l>ide</l></list><l>return ide.world();</l><list><custom-block s="ide"></custom-block></list></custom-block></block></script></block-definition><block-definition s="this process" type="reporter" category="sensing"><header></header><code></code><translations>es:este proceso&#xD;</translations><inputs></inputs><script><custom-block s="&#126;SnapenilK"></custom-block><block s="doReport"><custom-block s="call function ( %mult%s ) { %code } with %mult%s"><list><l>proc</l></list><l>proc.toString = function() {return "a SnapProcess";};&#xD;return proc;</l><list></list></custom-block></block></script></block-definition><block-definition s="this script is clicked?" type="predicate" category="control"><header></header><code></code><translations>es:¿esta secuencia tiene clic?&#xD;</translations><inputs></inputs><script><custom-block s="&#126;SnapenilK"></custom-block><block s="doReport"><custom-block s="call function ( %mult%s ) { %code } with %mult%s"><list><l>proc</l></list><l>return proc.isClicked;</l><list><custom-block s="this process"></custom-block></list></custom-block></block></script></block-definition><block-definition s="warped?" type="predicate" category="control"><header></header><code></code><translations>es:¿atómica?&#xD;</translations><inputs></inputs><script><custom-block s="&#126;SnapenilK"></custom-block><block s="doReport"><custom-block s="call function ( %mult%s ) { %code } with %mult%s"><list><l>proc</l></list><l>return proc.isAtomic;</l><list><custom-block s="this process"></custom-block></list></custom-block></block></script></block-definition><block-definition s="%&apos;thing&apos; assert type(s) %&apos;typeString&apos;" type="command" category="operators"><comment x="0" y="0" w="306" collapsed="false">make sure &quot;thing&quot; is a particular type or any of a number of types&#xD;and raise an error if not&#xD;use responsibly wrt performance implications</comment><header></header><code></code><translations>es:_ aseverar tipo(s) _&#xD;</translations><inputs><input type="%s"></input><input type="%mult%txt"></input></inputs><script><custom-block s="&#126;SnapenilK"></custom-block><custom-block s="run function ( %mult%s ) { %code } with %mult%s"><list><l>proc</l><l>thing</l><l>typeString</l></list><l>proc.assertType(thing, typeString.asArray());</l><list><custom-block s="this process"></custom-block><block var="thing"/><block var="typeString"/></list></custom-block></script></block-definition><block-definition s="WiP: create/recolor category %&apos;name&apos; color %&apos;r&apos; %&apos;g&apos; %&apos;b&apos;" type="command" category="other"><comment x="0" y="0" w="201" collapsed="false">Blocks in custom categories are saved in their categories, but the categories themselves are not; running create category with the same name gets the block back in the palette, but it seems that blocks in the editor are obsolete.</comment><header></header><code></code><translations>es:TeP: crear/recolorear categoría _ color _ _ _&#xD;</translations><inputs><input type="%txt"></input><input type="%n"></input><input type="%n"></input><input type="%n"></input></inputs><script><custom-block s="&#126;SnapenilK"></custom-block><custom-block s="run function ( %mult%s ) { %code } with %mult%s"><list><l>SpMoPr</l><l>name</l><l>r</l><l>g</l><l>b</l><l>ide</l></list><l>if(name != "") {&#xD;const cats = SpMoPr.categories;&#xD;if(!cats.includes(name)) {cats.push(name);};&#xD;SpMoPr.blockColor[name] = new Color(r, g, b, 1);&#xD;ide.createCategories();&#xD;ide.reactToWorldResize(world.bounds.copy());&#xD;ide.flushBlocksCache();&#xD;ide.refreshPalette();&#xD;}</l><list><custom-block s="SpriteMorph.prototype"></custom-block><block var="name"/><block var="r"/><block var="g"/><block var="b"/><custom-block s="ide"></custom-block></list></custom-block></script></block-definition><block-definition s="%&apos;property&apos; of %&apos;object&apos;" type="reporter" category="operators"><header></header><code></code><translations>es:_ de _&#xD;</translations><inputs><input type="%s"></input><input type="%obj"></input></inputs><script><custom-block s="&#126;SnapenilK"></custom-block><block s="doReport"><custom-block s="call function ( %mult%s ) { %code } with %mult%s"><list><l>property</l><l>object</l><l>ide</l></list><l>if(property == "cloud" &amp;&amp; object == ide) {&#xD;  throw new Error("For security purposes, the Snap!Cloud cannot be accessed.\nJens has a forum post with more information.");&#xD;}&#xD;return object[property];</l><list><block var="property"/><block var="object"/><custom-block s="ide"></custom-block></list></custom-block></block></script></block-definition><block-definition s="SpriteMorph.prototype" type="reporter" category="sensing"><header></header><code></code><translations>es:SpriteMorph.prototipo&#xD;</translations><inputs></inputs><script><custom-block s="&#126;SnapenilK"></custom-block><block s="doReport"><custom-block s="call function ( %mult%s ) { %code } with %mult%s"><list></list><l>return SpriteMorph.prototype;</l><list></list></custom-block></block></script></block-definition><block-definition s="hello" type="command" category="other"><header></header><code></code><translations></translations><inputs></inputs></block-definition><block-definition s="that obsolete block should be this" type="command" category="other"><header></header><code></code><translations></translations><inputs></inputs></block-definition><block-definition s="test" type="command" category="other"><header></header><code></code><translations></translations><inputs></inputs></block-definition><block-definition s="testest %&apos;theInvisibleZebra&apos;" type="command" category="other"><header></header><code></code><translations></translations><inputs><input type="%cs"></input></inputs></block-definition><block-definition s="safely try %&apos;action&apos; then if %&apos;error&apos; %&apos;handler&apos;" type="command" category="other"><header></header><code></code><translations>es:intentar de forma segura _ luego si _ _&#xD;</translations><inputs><input type="%cs"></input><input type="%upvar"></input><input type="%cs"></input></inputs><script><block s="doDeclareVariables"><list><l>reset</l></list></block><block s="doSetVar"><l>reset</l><custom-block s="call function ( %mult%s ) { %code } with %mult%s"><list><l></l></list><l>var oldHandleError = proc.handleError,&#xD;    oldCatchingErrors = proc.isCatchingErrors;&#xD;&#xD;return function(){&#xD; proc.handleError = oldHandleError;&#xD; proc.isCatchingErrors = oldCatchingErrors;&#xD;}</l><list><l></l></list></custom-block></block><block s="doCallCC"><block s="reifyScript"><script><custom-block s="run function ( %mult%s ) { %code } with %mult%s"><list><l></l></list><l>proc.isCatchingErrors = true;&#xD;proc.handleError = function(error, element){&#xD; reset();&#xD; proc.context = handler;&#xD; proc.context.variables.setVar("error", error);&#xD;}&#xD;&#xD;try{&#xD; proc.evaluate(action, new List(), true);&#xD;}&#xD;catch(e){&#xD; proc.handleError(e, null);&#xD;}</l><list><l></l></list></custom-block></script><list><l>return</l></list></block></block></script></block-definition><block-definition s="error %&apos;msg&apos;" type="command" category="other"><header></header><code></code><translations></translations><inputs><input type="%s"></input></inputs><script><custom-block s="run function ( %mult%s ) { %code } with %mult%s"><list><l>msg</l></list><l>throw msg instanceof Error? msg : new Error(msg);</l><list><block var="msg"/></list></custom-block></script></block-definition><block-definition s="new Pinky Promise %&apos;cmnd&apos;" type="reporter" category="other"><header></header><code></code><translations>es:nuevo Promesa de Meñiques _&#xD;</translations><inputs><input type="%cmdRing"></input></inputs><script><block s="doDeclareVariables"><list><l>newProm</l><l>settle</l><l>fulfill</l><l>reject</l></list></block><block s="doSetVar"><l>newProm</l><block s="reportNewList"><list><l>Pinky Promise</l><l>pending</l></list></block></block><block s="doSetVar"><l>settle</l><block s="reportJSFunction"><list><l>newProm</l></list><l>newProm.becomeArray();&#xD;newProm.becomeLinked = () =&gt; {throw new Error("Settled Pinky Promises cannot become linked.");};&#xD;Object.freeze(newProm.contents);&#xD;Object.freeze(newProm);</l></block></block><block s="doSetVar"><l>fulfill</l><block s="reifyScript"><script><block s="doAddToList"><block var="value"/><block var="newProm"/></block><block s="doReplaceInList"><l>2</l><block var="newProm"/><l>fulfilled</l></block><block s="doRun"><block var="settle"/><list><block var="newProm"/></list></block></script><list><l>value</l></list></block></block><block s="doSetVar"><l>reject</l><block s="reifyScript"><script><block s="doAddToList"><block var="reason"/><block var="newProm"/></block><block s="doReplaceInList"><l>2</l><block var="newProm"/><l>rejected</l></block><block s="doRun"><block var="settle"/><list><block var="newProm"/></list></block></script><list><l>reason</l></list></block></block><block s="fork"><block s="reifyScript"><script><block s="errorObsolete"></block></script><list></list></block><list></list></block><block s="doReport"><block var="newProm"/></block></script><scripts><script x="448.9999999999998" y="495.19999999999897"><block s="doRun"><block var="reject"/><list><block var="error"/></list></block></script><script x="443.9999999999998" y="403.1999999999993"><block s="doRun"><block var="cmnd"/><list><block s="reifyScript"><script><block s="doRun"><block var="fulfill"/><list><l></l></list></block></script><list></list></block><block s="reifyScript"><script><block s="doRun"><block var="reject"/><list><l></l></list></block></script><list></list></block></list></block></script><comment x="484.6666666666665" y="307.3999999999988" w="165" collapsed="false">The obsolete block should be the safely try block that can be found in the Error Handling palette; the blocks below respectfully go in it</comment></scripts></block-definition><block-definition s="Battery Status API supported?" type="predicate" category="other"><header></header><code></code><translations>es:¿API de Estado de Batería compatible?&#xD;</translations><inputs></inputs><script><block s="doReport"><custom-block s="call function ( %mult%s ) { %code } with %mult%s"><list></list><l>if("getBattery" in navigator) {&#xD;  if(!("batteryAPI" in this)) {&#xD;    navigator.getBattery().then(b =&gt; {&#xD;      this.batteryAPI = b;&#xD;    });&#xD;  }&#xD;  return true;&#xD;} else {&#xD;  return false;&#xD;}</l><list></list></custom-block></block></script></block-definition><block-definition s="charging?" type="predicate" category="other"><header></header><code></code><translations>es:¿cargando?&#xD;</translations><inputs></inputs><script><block s="doReport"><block s="reportVariadicAnd"><list><custom-block s="Battery Status API supported?"></custom-block><custom-block s="call function ( %mult%s ) { %code } with %mult%s"><list><l></l></list><l>return this.batteryAPI.charging;</l><list><l></l></list></custom-block></list></block></block></script></block-definition><block-definition s="time until charged" type="reporter" category="other"><header></header><code></code><translations>es:tiempo hasta cargada&#xD;</translations><inputs></inputs><script><block s="doReport"><block s="reportIfElse"><custom-block s="Battery Status API supported?"></custom-block><custom-block s="call function ( %mult%s ) { %code } with %mult%s"><list></list><l>return this.batteryAPI.chargingTime;</l><list></list></custom-block><l>NaN</l></block></block></script></block-definition><block-definition s="time until dead" type="reporter" category="other"><header></header><code></code><translations>es:tiempo hasta muerta&#xD;</translations><inputs></inputs><script><block s="doReport"><block s="reportIfElse"><custom-block s="Battery Status API supported?"></custom-block><custom-block s="call function ( %mult%s ) { %code } with %mult%s"><list></list><l>return this.batteryAPI.dischargingTime;</l><list></list></custom-block><l>NaN</l></block></block></script></block-definition><block-definition s="level" type="reporter" category="other"><header></header><code></code><translations>es:nivel&#xD;</translations><inputs></inputs><script><block s="doReport"><block s="reportIfElse"><custom-block s="Battery Status API supported?"></custom-block><custom-block s="call function ( %mult%s ) { %code } with %mult%s"><list></list><l>return this.batteryAPI.level;</l><list></list></custom-block><l>NaN</l></block></block></script></block-definition><block-definition s="remove category %&apos;name&apos;" type="command" category="other"><header></header><code></code><translations>es:eliminar categoría _&#xD;</translations><inputs><input type="%txt"></input></inputs><script><custom-block s="&#126;SnapenilK"></custom-block><custom-block s="run function ( %mult%s ) { %code } with %mult%s"><list><l>name</l></list><l>const cats = SpMoPr.categories;&#xD;if(cats.includes(name)) {&#xD;cats.splice(cats.indexOf(name), 1);&#xD;ide.createCategories();&#xD;ide.reactToWorldResize(world.bounds.copy());&#xD;ide.flushBlocksCache();&#xD;ide.refreshPalette();&#xD;}</l><list><block var="name"/></list></custom-block></script></block-definition><block-definition s="generator function* ( %&apos;params&apos; ) { %&apos;body&apos; }" type="reporter" category="other"><header></header><code></code><translations></translations><inputs><input type="%mult%s"></input><input type="%code"></input></inputs><script><custom-block s="&#126;SnapenilK"></custom-block><block s="doReport"><custom-block s="call function ( %mult%s ) { %code } with %mult%s"><list><l>params</l><l>body</l></list><l>const GeneratorFunction = (function*(){}).constructor;&#xD;return GeneratorFunction(...params.asArray(), body);</l><list><block var="params"/><block var="body"/></list></custom-block></block></script></block-definition><block-definition s="next generator %&apos;g&apos; with %&apos;v&apos;" type="reporter" category="other"><header></header><code></code><translations></translations><inputs><input type="%obj"></input><input type="%s"></input></inputs><script><block s="doReport"><custom-block s="call function ( %mult%s ) { %code } with %mult%s"><list><l></l></list><l>return Object.defineProperty(g.next(v), "toString", function() {&#xD;return `done: ${this.done}&#xD;value: ${this.value}`;});</l><list><l></l></list></custom-block></block></script></block-definition><block-definition s="throw generator %&apos;g&apos; with %&apos;v&apos;" type="reporter" category="other"><header></header><code></code><translations></translations><inputs><input type="%obj"></input><input type="%s"></input></inputs><script><block s="doReport"><custom-block s="call function ( %mult%s ) { %code } with %mult%s"><list><l></l></list><l>return Object.defineProperty(g.throw(v), "toString", function() {&#xD;return `done: ${this.done}&#xD;value: ${this.value}`;});</l><list><l></l></list></custom-block></block></script></block-definition><block-definition s="return generator %&apos;g&apos; with %&apos;v&apos;" type="reporter" category="other"><header></header><code></code><translations></translations><inputs><input type="%obj"></input><input type="%s"></input></inputs><script><block s="doReport"><custom-block s="call function ( %mult%s ) { %code } with %mult%s"><list><l></l></list><l>return Object.defineProperty(g.return(v), "toString", function() {&#xD;return `done: ${this.done}&#xD;value: ${this.value}`;});</l><list><l></l></list></custom-block></block></script></block-definition><block-definition s="%&apos;list&apos; is linked?" type="predicate" category="lists"><header></header><code></code><translations>es:¿ _ está conectado?&#xD;</translations><inputs><input type="%l"></input></inputs><script><custom-block s="&#126;SnapenilK"></custom-block><custom-block s="%s assert type(s) %mult%txt"><block var="list"/><list><l>list</l></list></custom-block><block s="doReport"><custom-block s="%s of %obj"><l>isLinked</l><block var="list"/></custom-block></block></script></block-definition><block-definition s="%&apos;list&apos; become array" type="command" category="lists"><header></header><code></code><translations>es:_ convertirse matriz&#xD;</translations><inputs><input type="%l"></input></inputs><script><custom-block s="&#126;SnapenilK"></custom-block><block s="doIf"><custom-block s="%l is linked?"><block var="list"/></custom-block><script><custom-block s="run function ( %mult%s ) { %code } with %mult%s"><list><l>list</l></list><l>list.becomeArray();</l><list><block var="list"/></list></custom-block></script><list></list></block></script></block-definition><block-definition s="%&apos;list&apos; become linked" type="command" category="lists"><header></header><code></code><translations>es:_ convertirse conectado&#xD;</translations><inputs><input type="%l"></input></inputs><script><custom-block s="&#126;SnapenilK"></custom-block><block s="doIf"><block s="reportNot"><custom-block s="%l is linked?"><block var="list"/></custom-block></block><script><custom-block s="run function ( %mult%s ) { %code } with %mult%s"><list><l>list</l></list><l>list.becomeLinked();</l><list><block var="list"/></list></custom-block></script><list></list></block></script></block-definition><block-definition s="set %&apos;property&apos; of %&apos;object&apos; to %&apos;value&apos;" type="command" category="operators"><header></header><code></code><translations>es:asignar _ de _ el valor _&#xD;</translations><inputs><input type="%s"></input><input type="%obj"></input><input type="%s"></input></inputs><script><custom-block s="&#126;SnapenilK"></custom-block><custom-block s="run function ( %mult%s ) { %code } with %mult%s"><list><l>property</l><l>object</l><l>value</l><l>ide</l></list><l>if(property == "cloud" &amp;&amp; object == ide) {&#xD;  throw new Error("For security purposes, the Snap!Cloud cannot be accessed.\nJens has a forum post with more information.");&#xD;}&#xD;object[property] = value;</l><list><block var="property"/><block var="object"/><block var="value"/><custom-block s="ide"></custom-block></list></custom-block></script></block-definition><block-definition s="see %&apos;value&apos; // %&apos;comment&apos;" type="reporter" category="other"><header></header><code></code><translations>es:ver _ _&#xD;</translations><inputs><input type="%s"></input><input type="%mlt">Comment</input></inputs><script><custom-block s="&#126;SnapenilK"></custom-block><custom-block s="see %s %mlt"><block var="value"/><block var="comment"/></custom-block><block s="doReport"><block var="value"/></block></script></block-definition><block-definition s="%&apos;property&apos; is defined in %&apos;object&apos; ?" type="predicate" category="operators"><header></header><code></code><translations>es:¿ _ está definido en _ ?&#xD;</translations><inputs><input type="%s"></input><input type="%obj"></input></inputs><script><custom-block s="&#126;SnapenilK"></custom-block><block s="doReport"><custom-block s="call function ( %mult%s ) { %code } with %mult%s"><list><l>property</l><l>object</l><l>ide</l></list><l>if(property == "cloud" &amp;&amp; object == ide) {&#xD;  throw new Error("For security purposes, the Snap!Cloud cannot be accessed.\nJens has a forum post with more information.");&#xD;}&#xD;return object[property] !== undefined;</l><list><block var="property"/><block var="object"/><custom-block s="ide"></custom-block></list></custom-block></block></script></block-definition><block-definition s="property-value pairs of %&apos;obj&apos;" type="reporter" category="operators"><header></header><code></code><translations>es:pares de propiedad-valor de _&#xD;</translations><inputs><input type="%obj"></input></inputs><script><custom-block s="&#126;SnapenilK"></custom-block><block s="doReport"><block s="reportMap"><block s="reifyReporter"><autolambda><block s="reportIfElse"><custom-block s="%s is defined in %obj ?"><l></l><block var="obj"/></custom-block><block s="reportNewList"><list><l></l><custom-block s="%s of %obj"><l></l><block var="obj"/></custom-block></list></block><block s="reportNewList"><list><l></l></list></block></block></autolambda><list></list></block><custom-block s="call function ( %mult%s ) { %code } with %mult%s"><list><l>obj</l><l>ide</l></list><l>return new List(Object.getOwnPropertyNames(obj).filter(prop =&gt; !(obj == ide &amp;&amp; prop == "cloud")));</l><list><block var="obj"/><custom-block s="ide"></custom-block></list></custom-block></block></block></script></block-definition><block-definition s="username" type="reporter" category="sensing"><header></header><code></code><translations>es:nombre de usuario&#xD;</translations><inputs></inputs><script><custom-block s="&#126;SnapenilK"></custom-block><block s="doReport"><custom-block s="call function ( %mult%s ) { %code } with %mult%s"><list></list><l>if(!("usernameSnap" in window)) {&#xD;  window.usernameSnap = window.prompt("This project wants to access your username. If you consent, type your username in the box then click OK.");&#xD;}&#xD;return window.usernameSnap;</l><list></list></custom-block></block></script></block-definition><block-definition s="🔒 lock list %&apos;L&apos;" type="command" category="lists"><comment x="0" y="0" w="260" collapsed="false">This is permanent because it invokes Object.freeze().&#xD;This will cause add, insert, and delete to throw errors&#xD;with this list and replace to be a no-op with this list.</comment><header></header><code></code><translations>es:🔒 trabarse listo _&#xD;</translations><inputs><input type="%l"></input></inputs><script><custom-block s="&#126;SnapenilK"></custom-block><custom-block s="%l become array"><block var="L"/></custom-block><custom-block s="run function ( %mult%s ) { %code } with %mult%s"><list><l>L</l></list><l>Object.freeze(Object.freeze(L).contents);</l><list><block var="L"/></list></custom-block></script></block-definition><block-definition s="a dead clone of %&apos;sprite&apos;" type="reporter" category="control"><header></header><code></code><translations>es:un clon muerto de _&#xD;</translations><inputs><input type="%s" readonly="true">myself<options>§_objectsMenu</options></input></inputs><script><custom-block s="&#126;SnapenilK"></custom-block><block s="doDeclareVariables"><list><l>clone</l></list></block><block s="doSetVar"><l>clone</l><block s="newClone"><block var="sprite"/></block></block><block s="doTellTo"><block var="clone"/><block s="reifyScript"><script><block s="removeClone"></block></script><list></list></block><list></list></block><block s="doReport"><block var="clone"/></block></script></block-definition><block-definition s="%&apos;sprite&apos; is corpse?" type="predicate" category="sensing"><header></header><code></code><translations>es:¿ _ es cuerpo?&#xD;</translations><inputs><input type="%obj"></input></inputs><script><custom-block s="&#126;SnapenilK"></custom-block><custom-block s="%s assert type(s) %mult%txt"><block var="sprite"/><list><l>sprite</l></list></custom-block><block s="doReport"><custom-block s="call function ( %mult%s ) { %code } with %mult%s"><list><l>sprite</l></list><l>return sprite.isCorpse;</l><list><block var="sprite"/></list></custom-block></block></script></block-definition><block-definition s="revive %&apos;sprite&apos;" type="command" category="control"><comment x="0" y="0" w="155" collapsed="false">This does not fully revive the dead clone or sprite as it was; this sets its isCorpse flag to false, creates a humorous isZombie flag as true, and updates its version number</comment><header></header><code></code><translations>es:revivir _&#xD;</translations><inputs><input type="%obj"></input></inputs><script><custom-block s="&#126;SnapenilK"></custom-block><block s="doIf"><custom-block s="%obj is corpse?"><block var="sprite"/></custom-block><script><custom-block s="run function ( %mult%s ) { %code } with %mult%s"><list><l>sprite</l></list><l>sprite.isCorpse = false;&#xD;sprite.isZombie = true;&#xD;sprite.version = Date.now();</l><list><block var="sprite"/></list></custom-block></script><list></list></block></script></block-definition><block-definition s="revived %&apos;sprite&apos;" type="reporter" category="control"><header></header><code></code><translations>es:revivido _&#xD;</translations><inputs><input type="%obj"></input></inputs><script><custom-block s="&#126;SnapenilK"></custom-block><custom-block s="revive %obj"><block var="sprite"/></custom-block><block s="doReport"><block var="sprite"/></block></script></block-definition><block-definition s="get top comment %&apos;//&apos; %&apos;text&apos;" type="command" category="other"><header></header><code></code><translations>es:obtener comentario más alto _ _&#xD;</translations><inputs><input type="%upvar"></input><input type="%upvar"></input></inputs><script><custom-block s="&#126;SnapenilK"></custom-block><block s="doSetVar"><l>//</l><custom-block s="%s of %obj"><l>comment</l><custom-block s="%s of %obj"><l>topBlock</l><custom-block s="this process"></custom-block></custom-block></custom-block></block><block s="doSetVar"><l>text</l><block s="reportIfElse"><block var="//"/><custom-block s="%s of %obj"><l>text</l><custom-block s="%s of %obj"><l>contents</l><block var="//"/></custom-block></custom-block><l></l></block></block></script></block-definition><block-definition s="WiP: set top comment %&apos;text&apos;" type="command" category="other"><header></header><code></code><translations>es:TeP: poner comentario más alto _&#xD;</translations><inputs><input type="%s">text or TextMorph or CommentMorph</input></inputs><script><custom-block s="&#126;SnapenilK"></custom-block><custom-block s="run function ( %mult%s ) { %code } with %mult%s"><list><l>text</l><l>p</l></list><l>if(text instanceof CommentMorph) {&#xD;  p.topBlock.comment = text;&#xD;} else if(text instanceof TextMorph) {&#xD;  let cmt = p.topBlock.comment;&#xD;  if(cmt == null) {&#xD;    p.topBlock.comment = new CommentMorph();&#xD;  }&#xD;  p.topBlock.comment.contents = text;&#xD;} else {&#xD;  let cmt = p.topBlock.comment;&#xD;  if(cmt == null) {&#xD;    p.topBlock.comment = new CommentMorph();&#xD;  }&#xD;  p.topBlock.comment.contents.text = text;&#xD;}</l><list><block var="text"/><custom-block s="this process"></custom-block></list></custom-block></script></block-definition><block-definition s="WiP: assign: %&apos;x&apos; = %&apos;v&apos;" type="command" category="other"><header></header><code></code><translations>es:TeP: asignar: _ = _&#xD;</translations><inputs><input type="%anyUE"></input><input type="%s"></input></inputs><script><custom-block s="&#126;SnapenilK"></custom-block><block s="doIfElse"><custom-block s="%s is defined in %obj ?"><l>selector</l><custom-block s="%s of %obj"><l>expression</l><block var="x"/></custom-block></custom-block><script><block s="doIf"><block s="reportVariadicEquals"><list><custom-block s="%s of %obj"><l>selector</l><custom-block s="%s of %obj"><l>expression</l><block var="x"/></custom-block></custom-block><l>xPosition</l></list></block><script><block s="setXPosition"><block var="v"/></block></script><list></list></block><block s="doIf"><block s="reportVariadicEquals"><list><custom-block s="%s of %obj"><l>selector</l><custom-block s="%s of %obj"><l>expression</l><block var="x"/></custom-block></custom-block><l>yPosition</l></list></block><script><block s="setYPosition"><block var="v"/></block></script><list></list></block><block s="doIf"><block s="reportVariadicEquals"><list><custom-block s="%s of %obj"><l>selector</l><custom-block s="%s of %obj"><l>expression</l><block var="x"/></custom-block></custom-block><l>direction</l></list></block><script><block s="setHeading"><block var="v"/></block></script><list></list></block><block s="doIf"><block s="reportVariadicEquals"><list><custom-block s="%s of %obj"><l>selector</l><custom-block s="%s of %obj"><l>expression</l><block var="x"/></custom-block></custom-block><l>getCostumeIdx</l></list></block><script><block s="doSwitchToCostume"><block var="v"/></block></script><list></list></block><block s="doIf"><block s="reportVariadicEquals"><list><custom-block s="%s of %obj"><l>selector</l><custom-block s="%s of %obj"><l>expression</l><block var="x"/></custom-block></custom-block><l>reportGetImageAttribute</l></list></block><script><custom-block s="run function ( %mult%s ) { %code } with %mult%s"><list><l>x</l><l>v</l></list><l>alert("Work in Progress");</l><list><block var="x"/><block var="v"/></list></custom-block><custom-block s="inspect %obj"><block var="x"/></custom-block></script><list></list></block><block s="doIf"><block s="reportVariadicEquals"><list><custom-block s="%s of %obj"><l>selector</l><custom-block s="%s of %obj"><l>expression</l><block var="x"/></custom-block></custom-block><l>getEffect</l></list></block><script><custom-block s="run function ( %mult%s ) { %code } with %mult%s"><list><l>x</l><l>v</l></list><l>alert("Work in Progress");</l><list><block var="x"/><block var="v"/></list></custom-block><custom-block s="inspect %obj"><block var="x"/></custom-block></script><list></list></block><block s="doIf"><block s="reportVariadicEquals"><list><custom-block s="%s of %obj"><l>selector</l><custom-block s="%s of %obj"><l>expression</l><block var="x"/></custom-block></custom-block><l>getScale</l></list></block><script><block s="setScale"><block var="v"/></block></script><list></list></block><block s="doIf"><block s="reportVariadicEquals"><list><custom-block s="%s of %obj"><l>selector</l><custom-block s="%s of %obj"><l>expression</l><block var="x"/></custom-block></custom-block><l>reportShown</l></list></block><script><block s="doIfElse"><block var="v"/><script><block s="show"></block></script><script><block s="hide"></block></script></block></script><list></list></block><block s="doIf"><block s="reportVariadicEquals"><list><custom-block s="%s of %obj"><l>selector</l><custom-block s="%s of %obj"><l>expression</l><block var="x"/></custom-block></custom-block><l>reportGetSoundAttribute</l></list></block><script><custom-block s="run function ( %mult%s ) { %code } with %mult%s"><list><l>x</l><l>v</l></list><l>alert("Work in Progress");</l><list><block var="x"/><block var="v"/></list></custom-block><custom-block s="inspect %obj"><block var="x"/></custom-block></script><list></list></block><block s="doIf"><block s="reportVariadicEquals"><list><custom-block s="%s of %obj"><l>selector</l><custom-block s="%s of %obj"><l>expression</l><block var="x"/></custom-block></custom-block><l>getTempo</l></list></block><script><block s="doSetTempo"><block var="v"/></block></script><list></list></block><block s="doIf"><block s="reportVariadicEquals"><list><custom-block s="%s of %obj"><l>selector</l><custom-block s="%s of %obj"><l>expression</l><block var="x"/></custom-block></custom-block><l>getVolume</l></list></block><script><block s="setVolume"><block var="v"/></block></script><list></list></block><block s="doIf"><block s="reportVariadicEquals"><list><custom-block s="%s of %obj"><l>selector</l><custom-block s="%s of %obj"><l>expression</l><block var="x"/></custom-block></custom-block><l>getPan</l></list></block><script><block s="setPan"><block var="v"/></block></script><list></list></block><block s="doIf"><block s="reportVariadicEquals"><list><custom-block s="%s of %obj"><l>selector</l><custom-block s="%s of %obj"><l>expression</l><block var="x"/></custom-block></custom-block><l>getPenDown</l></list></block><script><block s="doIfElse"><block var="v"/><script><block s="down"></block></script><script><block s="up"></block></script></block></script><list></list></block><block s="doIf"><block s="reportVariadicEquals"><list><custom-block s="%s of %obj"><l>selector</l><custom-block s="%s of %obj"><l>expression</l><block var="x"/></custom-block></custom-block><l>getPenAttribute</l></list></block><script><custom-block s="run function ( %mult%s ) { %code } with %mult%s"><list><l>x</l><l>v</l></list><l>alert("Work in Progress");</l><list><block var="x"/><block var="v"/></list></custom-block><custom-block s="inspect %obj"><block var="x"/></custom-block></script><list></list></block><block s="doIf"><block s="reportVariadicEquals"><list><custom-block s="%s of %obj"><l>selector</l><custom-block s="%s of %obj"><l>expression</l><block var="x"/></custom-block></custom-block><l>reportAskFor</l></list></block><script><custom-block s="run function ( %mult%s ) { %code } with %mult%s"><list><l>x</l><l>v</l></list><l>alert("Work in Progress");&#xD;//Run recursively with tell to</l><list><block var="x"/><block var="v"/></list></custom-block><custom-block s="inspect %obj"><block var="x"/></custom-block></script><list></list></block><block s="doIf"><block s="reportVariadicEquals"><list><custom-block s="%s of %obj"><l>selector</l><custom-block s="%s of %obj"><l>expression</l><block var="x"/></custom-block></custom-block><l>getLastAnswer</l></list></block><script><block s="doAsk"><block var="v"/><comment w="126" collapsed="false">or should I do JS hacking?</comment></block></script><list></list></block><block s="doIf"><block s="reportVariadicEquals"><list><custom-block s="%s of %obj"><l>selector</l><custom-block s="%s of %obj"><l>expression</l><block var="x"/></custom-block></custom-block><l>reportRelationTo</l></list></block><script><custom-block s="run function ( %mult%s ) { %code } with %mult%s"><list><l>x</l><l>v</l></list><l>alert("Work in Progress");&#xD;//Change (move or rotate) me</l><list><block var="x"/><block var="v"/></list></custom-block><custom-block s="inspect %obj"><block var="x"/></custom-block></script><list></list></block><block s="doIf"><block s="reportVariadicEquals"><list><custom-block s="%s of %obj"><l>selector</l><custom-block s="%s of %obj"><l>expression</l><block var="x"/></custom-block></custom-block><l>reportGet</l></list></block><script><custom-block s="run function ( %mult%s ) { %code } with %mult%s"><list><l>x</l><l>v</l></list><l>alert("Work in Progress");&#xD;//Allow support for as many attrs as possible</l><list><block var="x"/><block var="v"/></list></custom-block><custom-block s="inspect %obj"><block var="x"/></custom-block><block s="doRun"><block s="reifyScript"><script><block s="doSetVar"><l></l><block var="v"/></block></script><list></list></block><list><block var="x"/></list></block></script><list></list></block><block s="doIf"><block s="reportVariadicEquals"><list><custom-block s="%s of %obj"><l>selector</l><custom-block s="%s of %obj"><l>expression</l><block var="x"/></custom-block></custom-block><l>reportGlobalFlag</l></list></block><script><custom-block s="run function ( %mult%s ) { %code } with %mult%s"><list><l>x</l><l>v</l></list><l>alert("Work in Progress");</l><list><block var="x"/><block var="v"/></list></custom-block><custom-block s="inspect %obj"><block var="x"/></custom-block></script><list></list></block><block s="doIf"><block s="reportVariadicEquals"><list><custom-block s="%s of %obj"><l>selector</l><custom-block s="%s of %obj"><l>expression</l><block var="x"/></custom-block></custom-block><l>reportGetVar</l></list></block><script><block s="doRun"><block s="reifyScript"><script><block s="doSetVar"><l></l><block var="v"/></block></script><list></list></block><list><block var="x"/></list></block></script><list></list></block><block s="doIf"><block s="reportVariadicEquals"><list><custom-block s="%s of %obj"><l>selector</l><custom-block s="%s of %obj"><l>expression</l><block var="x"/></custom-block></custom-block><l>reportListItem</l></list></block><script><custom-block s="run function ( %mult%s ) { %code } with %mult%s"><list><l>x</l><l>v</l></list><l>alert("Work in Progress");</l><list><block var="x"/><block var="v"/></list></custom-block><custom-block s="inspect %obj"><block var="x"/></custom-block></script><list></list></block><block s="doIf"><block s="reportVariadicEquals"><list><custom-block s="%s of %obj"><l>selector</l><custom-block s="%s of %obj"><l>expression</l><block var="x"/></custom-block></custom-block><l>reportMappedCode</l></list></block><script><custom-block s="run function ( %mult%s ) { %code } with %mult%s"><list><l>x</l><l>v</l></list><l>alert("Work in Progress");</l><list><block var="x"/><block var="v"/></list></custom-block><custom-block s="inspect %obj"><block var="x"/></custom-block></script><list></list></block><block s="doIf"><block s="reportVariadicEquals"><list><custom-block s="%s of %obj"><l>selector</l><custom-block s="%s of %obj"><l>expression</l><block var="x"/></custom-block></custom-block><l>evaluateCustomBlock</l></list></block><script><block s="doIf"><block s="reportVariadicEquals"><list><block s="reportJoinWords"><list><block var="x"/></list></block><block s="reportJoinWords"><list><block s="reifyReporter"><autolambda><custom-block s="username"></custom-block></autolambda><list></list></block></list></block></list></block><script><custom-block s="set %s of %obj to %s"><l>username</l><custom-block s="%s of %obj"><l>cloud</l><custom-block s="ide"></custom-block></custom-block><block var="v"/></custom-block></script><list></list></block><block s="doIf"><block s="reportVariadicEquals"><list><block s="reportJoinWords"><list><block var="x"/></list></block><block s="reportJoinWords"><list><block s="reifyPredicate"><autolambda><custom-block s="%obj is corpse?"><l/></custom-block></autolambda><list></list></block></list></block></list></block><script><custom-block s="run function ( %mult%s ) { %code } with %mult%s"><list><l>x</l><l>v</l></list><l>alert("Work in Progress");</l><list><block var="x"/><block var="v"/></list></custom-block><custom-block s="inspect %obj"><block var="x"/></custom-block></script><list></list></block><block s="doIf"><block s="reportVariadicEquals"><list><block s="reportJoinWords"><list><block var="x"/></list></block><block s="reportJoinWords"><list><block s="reifyReporter"><autolambda><custom-block s="%s of %obj"><l></l><l/></custom-block></autolambda><list></list></block></list></block></list></block><script><custom-block s="run function ( %mult%s ) { %code } with %mult%s"><list><l>x</l><l>v</l></list><l>alert("Work in Progress");</l><list><block var="x"/><block var="v"/></list></custom-block><custom-block s="inspect %obj"><block var="x"/></custom-block></script><list></list></block><block s="doIf"><block s="reportVariadicEquals"><list><block s="reportJoinWords"><list><block var="x"/></list></block><block s="reportJoinWords"><list><block s="reifyPredicate"><autolambda><custom-block s="in dev mode?"></custom-block></autolambda><list></list></block></list></block></list></block><script><block s="doIfElse"><block var="v"/><script><custom-block s="switch to dev mode"></custom-block></script><script><custom-block s="switch to user mode"></custom-block></script></block></script><list></list></block><block s="doIf"><block s="reportVariadicEquals"><list><block s="reportJoinWords"><list><block var="x"/></list></block><block s="reportJoinWords"><list><block s="reifyPredicate"><autolambda><custom-block s="%l is linked?"><l/></custom-block></autolambda><list></list></block></list></block></list></block><script><custom-block s="run function ( %mult%s ) { %code } with %mult%s"><list><l>x</l><l>v</l></list><l>alert("Work in Progress");</l><list><block var="x"/><block var="v"/></list></custom-block><custom-block s="inspect %obj"><block var="x"/></custom-block></script><list></list></block><block s="doIf"><block s="reportVariadicEquals"><list><block s="reportJoinWords"><list><block var="x"/></list></block><block s="reportJoinWords"><list><block s="reifyReporter"><autolambda><custom-block s="get strict-type variable %txt"><l>myVar</l></custom-block></autolambda><list></list></block></list></block></list></block><script><custom-block s="run function ( %mult%s ) { %code } with %mult%s"><list><l>x</l><l>v</l></list><l>alert("Work in Progress");</l><list><block var="x"/><block var="v"/></list></custom-block><custom-block s="inspect %obj"><block var="x"/></custom-block></script><list></list></block></script><list></list></block></script><script><custom-block s="run function ( %mult%s ) { %code } with %mult%s"><list></list><l>1 = 2;</l><list></list></custom-block></script></block></script></block-definition><block-definition s="WiP: redefine console with %&apos;list&apos; $nl run function ( %&apos;params&apos; ) { %&apos;body&apos; } with %&apos;args&apos;" type="command" category="control"><header></header><code></code><translations></translations><inputs><input type="%l"></input><input type="%mult%s"></input><input type="%code"></input><input type="%mult%s"></input></inputs><script><custom-block s="&#126;SnapenilK"></custom-block><block s="doDeclareVariables"><list><l>counts</l><l>previous groups</l></list></block><block s="doSetVar"><l>counts</l><block s="reportNewList"><list></list></block></block><block s="doSetVar"><l>previous groups</l><block s="reportNewList"><list></list></block></block><custom-block s="set %s of %obj to %s"><l>console</l><custom-block s="this process"></custom-block><custom-block s="call function ( %mult%s ) { %code } with %mult%s"><list><l>list</l></list><l>const arr = list.asArray;&#xD;function inv(i) {&#xD;  return function() {&#xD;    for(var j = 0; j &lt; arguments.length; j++) {&#xD;      if(j === undefined) {&#xD;        arguments[j] = "undefined";&#xD;      }&#xD;    }&#xD;    return invoke(arr[i], new List(arguments));&#xD;  };&#xD;}&#xD;return {&#xD;  assert: inv(0),&#xD;  clear: inv(1),&#xD;  count: inv(2),&#xD;  countReset: inv(3),&#xD;  debug: inv(4),&#xD;  dir: inv(5),&#xD;  dirxml: inv(6),&#xD;  error: inv(7),&#xD;  exception: this.error,&#xD;  group: inv(8),&#xD;  groupCollapsed: inv(9),&#xD;  groupEnd: inv(10),&#xD;  info: inv(11),&#xD;  log: inv(12),&#xD;  profile: inv(13),&#xD;  profileEnd: inv(14),&#xD;  table: inv(15),&#xD;  time: inv(16),&#xD;  timeEnd: inv(17),&#xD;  timeLog: inv(18),&#xD;  timeStamp: inv(19),&#xD;  trace: inv(20),&#xD;  warn: inv(21)&#xD;}</l><list><block s="reportNewList"><list><block s="reifyScript"><script><block s="doIf"><block s="reportNot"><block var="assertion"/></block><script><block s="doAddToList"><block s="reportNewList"><list><l>Assertion Fail:</l><block var="msg"/></list></block><block var="list"/></block></script><list></list></block></script><list><l>assertion</l><l>msg</l></list></block><block s="reifyScript"><script><block s="doDeleteFromList"><l><option>all</option></l><block var="list"/></block></script><list></list></block><block s="reifyScript"><script><block s="doIf"><block s="reportNot"><block s="reportFindFirst"><block s="reifyPredicate"><autolambda><block s="reportVariadicEquals"><list><block s="reportListItem"><l>1</l><l/></block><block var="label"/></list></block></autolambda><list></list></block><block var="counts"/></block></block><script><block s="doAddToList"><block s="reportNewList"><list><block var="label"/><l>0</l></list></block><block var="counts"/></block></script><list></list></block><block s="doDeclareVariables"><list><l>temp</l></list></block><block s="doSetVar"><l>temp</l><block s="reportFindFirst"><block s="reifyPredicate"><autolambda><block s="reportVariadicEquals"><list><block s="reportListItem"><l>1</l><l/></block><block var="label"/></list></block></autolambda><list></list></block><block var="counts"/></block></block><block s="doReplaceInList"><l>2</l><block var="temp"/><block s="reportVariadicSum"><list><block s="reportListItem"><l>2</l><block var="temp"/></block><l>1</l></list></block></block><block s="doAddToList"><block s="reportNewList"><list><block s="reportJoinWords"><list><l>Count: </l><block var="label"/></list></block><block s="reportListItem"><l>2</l><block var="temp"/></block></list></block><block var="list"/></block></script><list><l>label</l></list></block><block s="reifyScript"><script><block s="doDeclareVariables"><list><l>temp</l></list></block><block s="doSetVar"><l>temp</l><block s="reportFindFirst"><block s="reifyPredicate"><autolambda><block s="reportVariadicEquals"><list><block s="reportListItem"><l>1</l><l/></block><block var="label"/></list></block></autolambda><list></list></block><block var="counts"/></block></block><block s="doIf"><block var="temp"/><script><block s="doDeleteFromList"><block s="reportListIndex"><block var="temp"/><block var="counts"/></block><block var="counts"/></block></script><list></list></block></script><list><l>label</l></list></block><block s="reifyScript"><script><block s="doAddToList"><block s="reportNewList"><list><l>Debug:</l><block var="msg"/></list></block><block var="list"/></block></script><list><l>msg</l></list></block><block s="reifyScript"><script><block s="doAddToList"><block s="reportNewList"><list><l>Dir:</l><custom-block s="property-value pairs of %obj"><block var="object"/></custom-block></list></block><block var="list"/></block></script><list><l>object</l></list></block><block s="reifyScript"><script><block s="doAddToList"><block s="reportNewList"><list><l>XML Dir: Work in Progress</l><custom-block s="property-value pairs of %obj"><block var="object"/></custom-block></list></block><block var="list"/></block></script><list><l>object</l></list></block><block s="reifyScript"><script><block s="doAddToList"><block s="reportNewList"><list><l>Error:</l><block var="msg"/></list></block><block var="list"/></block></script><list><l>msg</l></list></block><block s="reifyScript"><script><block s="doAddToList"><block var="list"/><block var="previous groups"/></block><block s="doSetVar"><l>list</l><block s="reportNewList"><list></list></block></block><block s="doAddToList"><block s="reportNewList"><list><block s="reportJoinWords"><list><l>Group: </l><block var="label"/></list></block><block var="list"/></list></block><block s="reportListItem"><block s="reportListAttribute"><l><option>length</option></l><block var="previous groups"/></block><block var="previous groups"/></block></block></script><list><l>label</l></list></block><block s="reifyScript"><script><block s="doAddToList"><block var="list"/><block var="previous groups"/></block><block s="doSetVar"><l>list</l><block s="reportNewList"><list></list></block></block><block s="doAddToList"><block s="reportNewList"><list><block s="reportJoinWords"><list><l>Collapsed Group: Work in Progress </l><block var="label"/></list></block><block var="list"/></list></block><block s="reportListItem"><block s="reportListAttribute"><l><option>length</option></l><block var="previous groups"/></block><block var="previous groups"/></block></block></script><list><l>label</l></list></block><block s="reifyScript"><script><block s="doIf"><block s="reportVariadicGreaterThan"><list><block s="reportListAttribute"><l><option>length</option></l><block var="previous groups"/></block><l>0</l></list></block><script><block s="doSetVar"><l>list</l><block s="reportListItem"><block s="reportListAttribute"><l><option>length</option></l><block var="previous groups"/></block><block var="previous groups"/></block></block><block s="doDeleteFromList"><block s="reportListAttribute"><l><option>length</option></l><block var="previous groups"/></block><block var="previous groups"/></block></script><list></list></block></script><list></list></block><block s="reifyScript"><script><block s="doAddToList"><block s="reportNewList"><list><l>Info:</l><block var="msg"/></list></block><block var="list"/></block></script><list><l>msg</l></list></block><block s="reifyScript"><script><block s="doAddToList"><block s="reportNewList"><list><l>Log:</l><block var="msg"/></list></block><block var="list"/></block></script><list><l>msg</l></list></block><block s="reifyScript"><script><block s="doAddToList"><block s="reportJoinWords"><list><l>Profile: Work in Progress </l><block var="profileName"/></list></block><block var="list"/></block></script><list><l>profileName</l></list></block><block s="reifyScript"><script><block s="doAddToList"><block s="reportJoinWords"><list><l>End Profile: Work in Progress </l><block var="profileName"/></list></block><block var="list"/></block></script><list><l>profileName</l></list></block><block s="reifyScript"><script><block s="doAddToList"><block s="reportNewList"><list><l>Table: Work in Progress</l><custom-block s="property-value pairs of %obj"><block var="data"/></custom-block></list></block><block var="list"/></block></script><list><l>data</l></list></block></list></block></list></custom-block></custom-block><custom-block s="run function ( %mult%s ) { %code } with %mult%s"><block var="params"/><block s="reportJoinWords"><list><l>console = arguments[arguments.length - 1].console; </l><block var="body"/></list></block><block var="args"/></custom-block></script></block-definition><block-definition s="declare strict-type variable %&apos;type&apos; : %&apos;name&apos;" type="command" category="variables"><header></header><code></code><translations>es:declarar variable tipo-estricto _ : _&#xD;</translations><inputs><input type="%txt" readonly="true">text<options>number={&#xD;int&#xD;float&#xD;}&#xD;text&#xD;boolean&#xD;object={&#xD;list&#xD;sprite&#xD;costume&#xD;sound&#xD;}&#xD;lambda={&#xD;command&#xD;reporter&#xD;predicate&#xD;}&#xD;JavaScript={&#xD;array&#xD;function&#xD;morph&#xD;any Object&#xD;BigInt&#xD;symbol&#xD;}</options></input><input type="%txt">myVar</input></inputs><script><custom-block s="&#126;SnapenilK"></custom-block><block s="doIf"><block s="reportNot"><custom-block s="%s is defined in %obj ?"><l>strictTypeVariables</l><custom-block s="ide"></custom-block></custom-block></block><script><custom-block s="set %s of %obj to %s"><l>strictTypeVariables</l><custom-block s="ide"></custom-block><block s="reportNewList"><list></list></block></custom-block></script><list></list></block><block s="doIf"><block s="reportNot"><block s="reportIsA"><block s="reportFindFirst"><block s="reifyPredicate"><autolambda><block s="reportVariadicEquals"><list><block s="reportListItem"><l>1</l><l/></block><block var="name"/></list></block></autolambda><list></list></block><custom-block s="%s of %obj"><l>strictTypeVariables</l><custom-block s="ide"></custom-block></custom-block></block><l><option>list</option></l></block></block><script><block s="doAddToList"><block s="reportNewList"><list><block var="name"/><block var="type"/><block s="reportIfElse"><block s="reportVariadicEquals"><list><block var="type"/><l>int</l></list></block><l>0</l><block s="reportIfElse"><block s="reportVariadicEquals"><list><block var="type"/><l>float</l></list></block><l>0.0</l><block s="reportIfElse"><block s="reportVariadicEquals"><list><block var="type"/><l>text</l></list></block><block s="reportJoinWords"><list></list></block><block s="reportIfElse"><block s="reportVariadicEquals"><list><block var="type"/><l>boolean</l></list></block><block s="reportBoolean"><l><bool>false</bool></l></block><block s="reportIfElse"><block s="reportVariadicEquals"><list><block var="type"/><l>list</l></list></block><block s="reportNewList"><list></list></block><block s="reportIfElse"><block s="reportVariadicEquals"><list><block var="type"/><l>sprite</l></list></block><block s="reportObject"><l>Stage</l></block><block s="reportIfElse"><block s="reportVariadicEquals"><list><block var="type"/><l>costume</l></list></block><block s="reportNewCostume"><block s="reportNewList"><list></list></block><l>1</l><l>1</l></block><block s="reportIfElse"><block s="reportVariadicEquals"><list><block var="type"/><l>sound</l></list></block><block s="reportNewSoundFromSamples"><block s="reportNewList"><list><block s="reportNewList"><list></list></block></list></block><l>44100</l></block><block s="reportIfElse"><block s="reportVariadicEquals"><list><block var="type"/><l>command</l></list></block><block s="reifyScript"><script></script><list></list></block><block s="reportIfElse"><block s="reportVariadicEquals"><list><block var="type"/><l>reporter</l></list></block><block s="reifyReporter"><script></script><list></list></block><block s="reportIfElse"><block s="reportVariadicEquals"><list><block var="type"/><l>predicate</l></list></block><block s="reifyPredicate"><script></script><list></list></block><custom-block s="call function ( %mult%s ) { %code } with %mult%s"><list><l>type</l></list><l>switch(type) {&#xD;case "array": return [];&#xD;case "function": return function() {};&#xD;case "morph": return Morph.prototype;&#xD;case "any Object": return null;&#xD;case "BigInt": return 0n;&#xD;case "symbol": return Symbol();&#xD;default: throw new TypeError("Invalid type " + type);&#xD;}</l><list><block var="type"/></list></custom-block></block></block></block></block></block></block></block></block></block></block></block></list></block><custom-block s="%s of %obj"><l>strictTypeVariables</l><custom-block s="ide"></custom-block></custom-block></block></script><list></list></block></script></block-definition><block-definition s="set strict-type variable %&apos;name&apos; = %&apos;value&apos;" type="command" category="variables"><header></header><code></code><translations>es:asignar variable tipo-estricto _ = _&#xD;</translations><inputs><input type="%txt">myVar</input><input type="%s">Hello, world!</input></inputs><script><custom-block s="&#126;SnapenilK"></custom-block><block s="doIf"><block s="reportNot"><block s="reportVariadicAnd"><list><custom-block s="%s is defined in %obj ?"><l>strictTypeVariables</l><custom-block s="ide"></custom-block></custom-block><block s="reportIsA"><block s="reportFindFirst"><block s="reifyPredicate"><autolambda><block s="reportVariadicEquals"><list><block s="reportListItem"><l>1</l><l/></block><block var="name"/></list></block></autolambda><list></list></block><custom-block s="%s of %obj"><l>strictTypeVariables</l><custom-block s="ide"></custom-block></custom-block></block><l><option>list</option></l></block></list></block></block><script><custom-block s="%s assert type(s) %mult%txt"><custom-block s="ide"></custom-block><list><l>declared variable</l></list></custom-block></script><list></list></block><block s="doRun"><block s="reifyScript"><script><block s="doIf"><block s="reportVariadicOr"><list><block s="reportVariadicEquals"><list><block s="reportListItem"><l>2</l><block var="var"/></block><l>int</l></list></block><block s="reportVariadicEquals"><list><block s="reportListItem"><l>2</l><block var="var"/></block><l>float</l></list></block></list></block><script><custom-block s="%s assert type(s) %mult%txt"><block var="value"/><list><l>number</l></list></custom-block><block s="doReplaceInList"><l>3</l><block var="var"/><block s="reportIfElse"><block s="reportVariadicEquals"><list><block s="reportListItem"><l>2</l><block var="var"/></block><l>int</l></list></block><block s="reportIfElse"><block s="reportVariadicLessThan"><list><block var="value"/><l>0</l></list></block><block s="reportMonadic"><l><option>ceiling</option></l><block var="value"/></block><block s="reportMonadic"><l><option>floor</option></l><block var="value"/></block></block><block var="value"/></block></block><block s="doStopThis"><l><option>this block</option></l></block></script><list></list></block><block s="doIf"><block s="reportListContainsItem"><block s="reportNewList"><list><l>text</l><l>boolean</l><l>list</l><l>sprite</l><l>costume</l><l>sound</l><l>command</l><l>reporter</l><l>predicate</l></list></block><block s="reportListItem"><l>2</l><block var="var"/></block></block><script><custom-block s="%s assert type(s) %mult%txt"><block var="value"/><list><block s="reportIfElse"><block s="reportVariadicEquals"><list><block s="reportListItem"><l>2</l><block var="var"/></block><l>sprite</l></list></block><block s="reportNewList"><list><l>sprite</l><l>stage</l></list></block><block s="reportNewList"><list><block s="reportListItem"><l>2</l><block var="var"/></block></list></block></block></list></custom-block><block s="doReplaceInList"><l>3</l><block var="var"/><block var="value"/></block><block s="doStopThis"><l><option>this block</option></l></block></script><list></list></block><custom-block s="run function ( %mult%s ) { %code } with %mult%s"><list><l>type</l><l>value</l></list><l>switch(type) {&#xD;case "array":&#xD;if(!(value instanceof Array)) throw new TypeError("Expected array");&#xD;break;&#xD;case "function":&#xD;if(!(value instanceof Function)) throw new TypeError("Expected function");&#xD;break;&#xD;case "morph":&#xD;if(!(value instanceof Morph || (("isMorph" in value) &amp;&amp; value.isMorph))) throw new TypeError("Expected morph");&#xD;break;&#xD;case "any Object":&#xD;if(!(value instanceof Object || typeof value == "object")) throw new TypeError("Expected object; instead got " + typeof value);&#xD;break;&#xD;case "BigInt":&#xD;if(typeof value != "bigint") throw new TypeError("Expected bigint; instead got " + typeof value);&#xD;break;&#xD;case "symbol":&#xD;if(typeof value != "symbol") throw new TypeError("Exptected symbol; instead got " + typeof value);&#xD;break;&#xD;}</l><list><block s="reportListItem"><l>2</l><block var="var"/></block><block var="value"/></list></custom-block><block s="doReplaceInList"><l>3</l><block var="var"/><block var="value"/></block></script><list><l>var</l></list></block><list><block s="reportFindFirst"><block s="reifyPredicate"><autolambda><block s="reportVariadicEquals"><list><block s="reportListItem"><l>1</l><l/></block><block var="name"/></list></block></autolambda><list></list></block><custom-block s="%s of %obj"><l>strictTypeVariables</l><custom-block s="ide"></custom-block></custom-block></block></list></block></script></block-definition><block-definition s="get strict-type variable %&apos;name&apos;" type="reporter" category="variables"><header></header><code></code><translations>es:obtener variable tipo-estricto _&#xD;</translations><inputs><input type="%txt">myVar</input></inputs><script><custom-block s="&#126;SnapenilK"></custom-block><block s="doIf"><block s="reportNot"><block s="reportVariadicAnd"><list><custom-block s="%s is defined in %obj ?"><l>strictTypeVariables</l><custom-block s="ide"></custom-block></custom-block><block s="reportIsA"><block s="reportFindFirst"><block s="reifyPredicate"><autolambda><block s="reportVariadicEquals"><list><block s="reportListItem"><l>1</l><l/></block><block var="name"/></list></block></autolambda><list></list></block><custom-block s="%s of %obj"><l>strictTypeVariables</l><custom-block s="ide"></custom-block></custom-block></block><l><option>list</option></l></block></list></block></block><script><custom-block s="%s assert type(s) %mult%txt"><custom-block s="ide"></custom-block><list><l>declared variable</l></list></custom-block></script><list></list></block><block s="doReport"><block s="reportListItem"><l>3</l><block s="reportFindFirst"><block s="reifyPredicate"><autolambda><block s="reportVariadicEquals"><list><block s="reportListItem"><l>1</l><l/></block><block var="name"/></list></block></autolambda><list></list></block><custom-block s="%s of %obj"><l>strictTypeVariables</l><custom-block s="ide"></custom-block></custom-block></block></block></block></script></block-definition><block-definition s="&#126;SnapenilK" type="command" category="other"><comment x="0" y="0" w="128" collapsed="false">No-op definition signature</comment><header></header><code></code><translations></translations><inputs></inputs></block-definition><block-definition s="store key: %&apos;key&apos; value: %&apos;value&apos; in browser" type="command" category="other"><header></header><code></code><translations></translations><inputs><input type="%s"></input><input type="%s"></input></inputs><script><block s="doRun"><block s="reportJSFunction"><list><l>key</l><l>value</l><l>proc</l></list><l>proc.assertType(key, [&apos;text&apos;, &apos;number&apos;]);&#xD;proc.assertType(value, [&apos;text&apos;, &apos;number&apos;]);&#xD;window.localStorage.setItem(&apos;-snap-project-&apos; + key, &apos;&apos; + value);</l></block><list><block var="key"/><block var="value"/></list></block></script></block-definition><block-definition s="stored data in browser" type="reporter" category="other"><header></header><code></code><translations></translations><inputs></inputs><script><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list></list><l>var str = window.localStorage,&#xD;    len = str.length,&#xD;    result = [],&#xD;    key,&#xD;    i;&#xD;for (i = 0; i &lt; len; i += 1) {&#xD;  key = str.key(i);&#xD;  if (key.startsWith(&apos;-snap-project-&apos;)) {&#xD;    result.push(new List([key.slice(14), str.getItem(key)]));&#xD;  }&#xD;}&#xD;return new List(result);</l></block><list></list></block></block></script></block-definition><block-definition s="remove key: %&apos;key&apos; in browser" type="command" category="other"><header></header><code></code><translations></translations><inputs><input type="%s"></input></inputs><script><block s="doRun"><block s="reportJSFunction"><list><l>key</l><l>proc</l></list><l>proc.assertType(key, [&apos;text&apos;, &apos;number&apos;]);&#xD;window.localStorage.removeItem(&apos;-snap-project-&apos; + key);</l></block><list><block var="key"/></list></block></script></block-definition><block-definition s="clear data in browser" type="command" category="other"><header></header><code></code><translations></translations><inputs></inputs><script><block s="doWarp"><script><block s="doForEach"><l>item</l><custom-block s="stored data in browser"></custom-block><script><custom-block s="remove key: %s in browser"><block s="reportListItem"><l>1</l><block var="item"/></block></custom-block></script></block></script></block></script></block-definition><block-definition s="get value from key: %&apos;key&apos; in browser" type="reporter" category="other"><comment x="0" y="0" w="199.33333333333334" collapsed="false">Reports the value previously stored under&#xD;the input key in the browser&apos;s local storage.&#xD;Reports False if the key is not found.</comment><header></header><code></code><translations></translations><inputs><input type="%s"></input></inputs><script><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list><l>key</l></list><l>var str = window.localStorage,&#xD;    result = str.getItem(&apos;-snap-project-&apos;+key);&#xD;if (!result) {&#xD;   return false;&#xD;}&#xD;return result;</l></block><list><block var="key"/></list></block></block></script></block-definition><block-definition s="JavaScript extensions are enabled?" type="predicate" category="sensing"><header></header><code></code><translations></translations><inputs></inputs><script><custom-block s="&#126;SnapenilK"></custom-block><block s="doDeclareVariables"><list><l>a</l></list></block><block s="doSetVar"><l>a</l><block s="reportBoolean"><l><bool>false</bool></l></block></block><block s="fork"><block s="reifyScript"><script><block s="doWarp"><script><block s="doSetVar"><l>a</l><block s="evaluate"><block s="reportJSFunction"><list></list><l>return true;</l></block><list></list></block></block></script></block></script><list></list></block><list></list></block><block s="doRepeat"><l>1</l><script><block s="doWait"><l>0</l></block></script></block><block s="doReport"><block var="a"/></block></script></block-definition><block-definition s="get watcher for %&apos;var&apos;" type="reporter" category="variables"><header></header><code></code><translations></translations><inputs><input type="%s"><options>§_getVarNamesDict</options></input></inputs><script><block s="doReport"><custom-block s="call function ( %mult%s ) { %code } with %mult%s"><list><l>v</l></list><l>return this.findVariableWatcher(v);</l><list><block var="var"/></list></custom-block></block></script></block-definition><block-definition s="color %&apos;r&apos; %&apos;g&apos; %&apos;b&apos;" type="reporter" category="pen"><header></header><code></code><translations></translations><inputs><input type="%n"></input><input type="%n"></input><input type="%n"></input></inputs><script><block s="doReport"><custom-block s="call function ( %mult%s ) { %code } with %mult%s"><list><l>r</l><l>g</l><l>b</l></list><l>return new Color(r, g, b);</l><list><block var="r"/><block var="g"/><block var="b"/></list></custom-block></block></script></block-definition><block-definition s="switch ( %&apos;value&apos; ) { %&apos;cases&apos; }" type="command" category="control"><header></header><code></code><translations></translations><inputs><input type="%s"></input><input type="%mult%obj"></input></inputs><script><custom-block s="&#126;SnapenilK"></custom-block><block s="doForEach"><l>item</l><block var="cases"/><script><block s="doIfElse"><block s="reportIsA"><block var="item"/><l><option>list</option></l></block><script><block s="doIfElse"><block s="reportListContainsItem"><block s="reportNewList"><list><l>case</l><l>default</l><l>break</l></list></block><block s="reportListItem"><l>1</l><block var="item"/></block></block><script><block s="doIf"><block s="reportVariadicAnd"><list><block s="reportVariadicEquals"><list><block s="reportListItem"><l>1</l><block var="item"/></block><l>case</l></list></block><block s="reportNot"><block s="reportVariadicOr"><list><block s="reportIsA"><block s="reportListItem"><l>2</l><block var="item"/></block><l><option>command</option></l></block><block s="reportVariadicOr"><list><block s="reportIsA"><block s="reportListItem"><l>2</l><block var="item"/></block><l><option>reporter</option></l></block><block s="reportIsA"><block s="reportListItem"><l>2</l><block var="item"/></block><l><option>predicate</option></l></block></list></block></list></block></block></list></block><script><custom-block s="run function ( %mult%s ) { %code } with %mult%s"><list></list><l>throw new SyntaxError("Missing case value");</l><list></list></custom-block></script><list></list></block></script><script><custom-block s="run function ( %mult%s ) { %code } with %mult%s"><list><l>item</l></list><l>throw new SyntaxError("Unexpected token " + item);</l><list><block s="reportListItem"><l>1</l><block var="item"/></block></list></custom-block></script></block></script><script><custom-block s="run function ( %mult%s ) { %code } with %mult%s"><list><l>item</l></list><l>throw new SyntaxError("Exptected case, default, or break, but got " + item);</l><list><block var="item"/></list></custom-block></script></block></script><comment w="80" collapsed="false">Check syntax</comment></block><block s="doDeclareVariables"><list><l>i</l><l>found?</l></list></block><block s="doSetVar"><l>i</l><l>1</l></block><block s="doSetVar"><l>found?</l><block s="reportBoolean"><l><bool>false</bool></l></block></block><block s="doUntil"><block s="reportVariadicOr"><list><block var="found?"/><block s="reportVariadicGreaterThan"><list><block var="i"/><block s="reportListAttribute"><l><option>length</option></l><block var="cases"/></block></list></block></list></block><script><block s="doDeclareVariables"><list><l>item</l></list></block><block s="doSetVar"><l>item</l><block s="reportListItem"><block var="i"/><block var="cases"/></block></block><block s="doIfElse"><block s="reportVariadicAnd"><list><block s="reportVariadicEquals"><list><block s="reportListItem"><l>1</l><block var="item"/></block><l>case</l></list></block><block s="reportVariadicEquals"><list><block var="value"/><block s="evaluate"><block s="reportListItem"><l>2</l><block var="item"/></block><list></list></block></list></block></list></block><script><block s="doSetVar"><l>found?</l><block s="reportBoolean"><l><bool>true</bool></l></block></block></script><script><block s="doChangeVar"><l>i</l><l>1</l></block></script></block></script><comment w="90" collapsed="false">Find matching case</comment></block><block s="doIf"><block s="reportNot"><block var="found?"/></block><script><block s="doSetVar"><l>i</l><l>1</l></block><block s="doSetVar"><l>found?</l><block s="reportBoolean"><l><bool>false</bool></l></block></block><block s="doUntil"><block s="reportVariadicOr"><list><block var="found?"/><block s="reportVariadicGreaterThan"><list><block var="i"/><block s="reportListAttribute"><l><option>length</option></l><block var="cases"/></block></list></block></list></block><script><block s="doDeclareVariables"><list><l>item</l></list></block><block s="doSetVar"><l>item</l><block s="reportListItem"><block var="i"/><block var="cases"/></block></block><block s="doIfElse"><block s="reportVariadicEquals"><list><block s="reportListItem"><l>1</l><block var="item"/></block><l>default</l></list></block><script><block s="doSetVar"><l>found?</l><block s="reportBoolean"><l><bool>true</bool></l></block></block></script><script><block s="doChangeVar"><l>i</l><l>1</l></block></script></block></script><comment w="181" collapsed="false">Find default b/c no matching case found</comment></block></script><list></list></block><block s="doIf"><block var="found?"/><script><block s="doFor"><l>j</l><block var="i"/><block s="reportListAttribute"><l><option>length</option></l><block var="cases"/></block><script><block s="doDeclareVariables"><list><l>item</l></list></block><block s="doSetVar"><l>item</l><block s="reportListItem"><block var="j"/><block var="cases"/></block></block><block s="doIfElse"><block s="reportVariadicEquals"><list><block s="reportListItem"><l>1</l><block var="item"/></block><l>break</l></list></block><script><block s="doStopThis"><l><option>this block</option></l></block></script><script><block s="doRun"><block s="reportListItem"><block s="reportIfElse"><block s="reportVariadicEquals"><list><block s="reportListItem"><l>1</l><block var="item"/></block><l>default</l></list></block><l>2</l><l>3</l></block><block var="item"/></block><list></list></block></script></block></script><comment w="385.99999999999966" collapsed="false">Run actions from first found matching case or default, follow through until break or end</comment></block></script><list></list></block></script></block-definition><block-definition s="case %&apos;value&apos; : %&apos;action&apos;" type="reporter" category="control"><header></header><code></code><translations></translations><inputs><input type="%anyUE"></input><input type="%cs"></input></inputs><script><custom-block s="&#126;SnapenilK"></custom-block><block s="doReport"><block s="reportNewList"><list><l>case</l><block var="value"/><block var="action"/></list></block></block></script></block-definition><block-definition s="default : %&apos;action&apos;" type="reporter" category="control"><header></header><code></code><translations></translations><inputs><input type="%cs"></input></inputs><script><custom-block s="&#126;SnapenilK"></custom-block><block s="doReport"><block s="reportNewList"><list><l>default</l><block var="action"/></list></block></block></script></block-definition><block-definition s="break;" type="reporter" category="control"><header></header><code></code><translations></translations><inputs></inputs><script><custom-block s="&#126;SnapenilK"></custom-block><block s="doReport"><block s="reportNewList"><list><l>break</l></list></block></block></script></block-definition><block-definition s="see %&apos;value&apos; %&apos;comment&apos;" type="command" category="other"><header></header><code></code><translations></translations><inputs><input type="%s"></input><input type="%mlt">Comment</input></inputs><script><custom-block s="&#126;SnapenilK"></custom-block><custom-block s="run function ( %mult%s ) { %code } with %mult%s"><list><l>value</l><l>comment</l><l>SnapType</l></list><l>alert(`${value}&#xD;Snap! type: ${SnapType}&#xD;JavaScript type: ${typeof value}&#xD;${comment}`);</l><list><block var="value"/><block var="comment"/><block s="reportTypeOf"><block var="value"/></block></list></custom-block></script></block-definition></blocks><primitives></primitives><stage name="Stage" width="480" height="360" costume="0" color="255,255,255,1" tempo="60" threadsafe="false" penlog="false" volume="100" pan="0" lines="round" ternary="false" hyperops="true" codify="true" inheritance="true" sublistIDs="false" id="3092"><pentrails>data:image/png;base64,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</pentrails><costumes><list struct="atomic" id="3093"></list></costumes><sounds><list struct="atomic" id="3094"></list></sounds><variables></variables><blocks></blocks><scripts><script x="10" y="10"><custom-block s="WiP: create/recolor category %txt color %n %n %n"><l>Error Handling</l><l>255</l><l>0</l><l>0</l></custom-block><custom-block s="WiP: create/recolor category %txt color %n %n %n"><l>Pinky Promises</l><l>255</l><l>175</l><l>175</l><comment w="80" collapsed="true">https://snap.berkeley.edu/snap/snap.html#present:Username=snapenilk&amp;ProjectName=Pinky%20Promises&amp;editMode&amp;noRun</comment></custom-block></script><script x="10" y="69.99999999999997"><custom-block s="WiP: create/recolor category %txt color %n %n %n"><l>Battery</l><l>200</l><l>100</l><l>50</l><comment w="80" collapsed="true">https://snap.berkeley.edu/snap/snap.html#present:Username=snapenilk&amp;ProjectName=%5BBattery%7D</comment></custom-block></script><script x="10" y="108.99999999999997"><custom-block s="WiP: create/recolor category %txt color %n %n %n"><l>Generators</l><l>175</l><l>200</l><l>0</l><comment w="80" collapsed="true">https://snap.berkeley.edu/snap/snap.html#present:Username=snapenilk&amp;ProjectName=f</comment></custom-block></script></scripts><sprites select="1"><sprite name="Sprite" idx="1" x="-80" y="44.01554563973929" heading="90" scale="1" volume="100" pan="0" rotation="1" draggable="true" costume="0" color="80,80,80,1" pen="tip" id="3119"><costumes><list struct="atomic" id="3120"></list></costumes><sounds><list struct="atomic" id="3121"></list></sounds><blocks></blocks><variables></variables><scripts><comment x="19.666666666666657" y="10" w="722" collapsed="false">If you use these blocks, read the warning below and credit me.&#xD;Warning: These blocks are experimental. Some may work properly, and some may not work properly. If any start with &quot;WiP:&quot;, which means Work in Progress, I have found at least one problem, and they will likely not work. If you use these blocks and they break your Snap! session or corrupt your project, I am not liable. Do not use my &quot;run function&quot; or &quot;call function&quot; blocks to access the Snap!Cloud. I have adjusted some of my other blocks to detect attempted Snap!Cloud access.</comment><script x="19.666666666666657" y="100.00000000000003"><custom-block s="JavaScript extensions are enabled?"><comment w="275" collapsed="false">This is needed for most of the custom blocks in this project.</comment></custom-block></script><script x="19.666666666666657" y="157.0000000000001"><custom-block s="WiP: create/recolor category %txt color %n %n %n"><l>New Category</l><block s="reportRandom"><l>0</l><l>255</l></block><block s="reportRandom"><l>0</l><l>255</l></block><block s="reportRandom"><l>0</l><l>255</l></block></custom-block></script><comment x="19.666666666666657" y="218.00000000000034" w="289.0000000000001" collapsed="false">I ran into a problem: blocks of custom categories in the editor become Undefined! after saving and reloading the project.&#xD;I can do this better in Snap! 7.</comment><script x="19.666666666666657" y="296"><block s="errorObsolete"></block></script><script x="19.666666666666657" y="331.83333333333337"><custom-block s="save project"><comment w="367" collapsed="false">I made this block. It is quite similar to the one that Jens shared with EarthRulerr.</comment></custom-block></script><comment x="19.666666666666657" y="388.83333333333337" w="113" collapsed="false">Brian Harvey, try this:</comment><comment x="19.666666666666657" y="442.8333333333329" w="90" collapsed="false">Enable JS exts</comment><script x="19.666666666666657" y="496.8333333333329"><block s="doDeclareVariables"><list><l>a</l></list></block><block s="doSetVar"><l>a</l><block s="reportBoolean"><l><bool>false</bool></l></block></block><block s="fork"><block s="reifyScript"><script><block s="doWarp"><script><block s="doSetVar"><l>a</l><block s="evaluate"><block s="reportJSFunction"><list></list><l>return true;</l></block><list></list></block></block></script></block></script><list></list></block><list></list></block><block s="doRepeat"><l>1</l><script><block s="doWait"><l>0</l></block></script></block><block s="doReport"><block var="a"/></block></script><script x="19.666666666666657" y="719.1666666666667"><block s="doDeclareVariables"><list><l>a</l></list></block><block s="doSetVar"><l>a</l><block s="reportBoolean"><l><bool>false</bool></l></block></block><block s="fork"><block s="reifyScript"><script><block s="doWarp"><script><block s="doSetVar"><l>a</l><block s="evaluate"><block s="reportJSFunction"><list></list><l>return true;</l></block><list></list></block></block></script></block></script><list></list></block><list></list></block><block s="doWait"><l>0</l></block><block s="doReport"><block var="a"/></block></script><script x="198" y="493.3333333333329"><custom-block s="🔒 lock list %l"><l/></custom-block></script><script x="206" y="420.16666666666663"><block s="doSetVar"><l>test</l><block s="reportNumbers"><l>1</l><l>10</l></block></block></script><script x="412.9306640625" y="493.3333333333329"><custom-block s="%l is linked?"><l/></custom-block></script><script x="413" y="291.8333333333336"><block s="doAddToList"><l>thing</l><l/></block></script><script x="592" y="291.8333333333336"><block s="doDeleteFromList"><l>1</l><l/></block></script><script x="517" y="367.4999999999999"><block s="doInsertInList"><l>thing</l><l>1</l><l/></block></script><script x="514" y="440.4999999999999"><block s="doReplaceInList"><l>1</l><block var="test"/><l>thing</l></block></script><script x="213" y="642.3333333333335"><custom-block s="WiP: set top comment %s"><l>text or TextMorph or CommentMorph</l><comment w="90" collapsed="false">text or TextMorph or CommentMorph</comment></custom-block></script></scripts></sprite><watcher var="test" style="normal" x="16" y="11" color="243,118,29" extX="80" extY="70"/></sprites></stage><variables><variable name="test"><list struct="atomic" id="3246">1,2,3,4,5,6,7,8,9,10</list></variable></variables></scene></scenes></project><media name="Snap! Dev tools" app="Snap! 10.7.2, https://snap.berkeley.edu" version="2"></media></snapdata>