<snapdata remixID="10327507"><project name="fencing block" app="Snap! 6, https://snap.berkeley.edu" version="1"><notes></notes><thumbnail>data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAYAAAB1ovlvAAAK4klEQVR4Xu2ceVBV1x3Hv1fBhSou1CWKC3EDq6IGEBVBkdTWpolpq9jRZlw6duyoE9eKESuowQWpimkzHZXRJk6ZCqaZOtMMOwgiKIIssrhUQFGnRKVTcYnSOcd5VzGZnDrcg4+87/nn8R6/9zv3ft5nfvece8+9RlNTUxPYSOAVETAo4Csiz24lAQpIEV4pAQr4SvGzcyng+fPn0dDQgEGDBuH5IaFhGNrfX716Fa6urhgzZgx/DQckYBQWFjZ1794drSHbt8l9584deHt7O+BP4Ni7bGRkZDQNHDhQVrr9+/dj4sSJ2LRpEyIjI3HkyBF07doVtbW1WL58OWbPno2UlBRkZWVh8+bNuHLliklPfF9IbGsv+766uhqBgYGO/Ws44N4bly9flhNhIc+SJUvw4MEDhISEIDMzE4MHD8bp06eldELKgIAApKWlQQg7d+5cjBgxQkpo+35LXz08PBzwJ3DsXTYuXrxoN+cBhwwZ4ti/hgPuvVFVVWVWwL59++JG7VXU1VzVjuLundsYMdbPHHuKCjx06FDt/bID+yJgVFRUmBXw4/d8ERnUDemdJsM9ZCF6DvK0fGuLkv6GgKo/wrnpEdpvrkBNTY3Zx/Dhwy3vjwntm4BRXl5uVsDUlZPg7vMmRi/ablamDv/9EvHvBeL+Y2uP1MtnuKHLjmpUVFSYY0gxpmRzLAJGWVmZaVb66gD4rv0L3AZ7obGxEZ07d0bWPG/4f9/JcirpY3+JJZEf4cKFC2ZuLy8vy/thQvsmYJSWlpoVMGPNFPwwNg+dOnWSp19u3bqFS0vewIzUu6h8uydejyvFv49Eou/KP6F24yy8tu4g6nYuRufRk+EWulbGDEu8gWub55ifid0Xnw///EvcTfoE/8k4Bie313DkkQfWrVuHsrIyswKOHDnSvmlx6ywnYBQXFzfZTkJnrQtCyN5c2UmfPn1w8+ZNXP6ND/zDPsLN2BVwnRYK1+C5aEj9K5z7vS7jOnv6obE8D/WfRsFtXhgai7Offj56Mh5dv4yv6uvQNegXUrx75zOliA9rKhDz6XGsX78eJSUl5uF+1KhRlu8gE9o3ASmg7fydEDD4DznNtvhfS/3g0aW95XtxzH8NNmzYIAW09U8BLcds9wmNoqIicwyYvX4apu4+2Wyje/fuDTc3N8t3ZOvWrdi4cSPEdWhb4/VgyzHbfUJ5LdhWgXLCghEUndXsysbut9/AKi8XtHt2lc2SnUrwW4nw8HAUFRWZ/fFasCVo21QSo6CgwKyAuR+EIGBHurz0Vl5ejmXLlqF6+WQM7frNh2CXMYFyXCfGfmIMaGu2z4fGV+Ni6MCvAXHfchw7j6fJ68nnzp0z/z9u3Lg2BY8b23ICxtmzZ80KeHrjm5i8PQ1iZYpYlCBmqDdWBspJiHPvAXh0q0a+1oa/K6V7cRLSd+XHaEg5Kj8XYopJi20S0ljydHIimpjI7EhMRUREBAoKCswKOH78+JbvETO0KQJGfn6+WQHzN83AxA9T4OnpKU/FFBYW4uaqIMxIuYMbe377VJ5poXDxDsLd5E/Qxe/HqNv166enXOasQeU7bhiWUIdrEaFSQNGG/71exjaW5KAhLV6+v1eUgaiEFGzZsgVnzpwxgfn4+LQpeNzYlhMw8vLyzAp45vc/woStSWZFEukfbQhBjw4t7+jFDIdHL8W2bduQn59v9ufr62t9R8xo1wSM3Nxc8zxgQcRM+EZ+0SobnJCQgKioKLncy3YecsKECa3SNzuxHwLGqVOnzEPwucifwCfin5at7/u29YGJiYnYvn07cnOfnvgWzd/f337IcEtahYCRnZ0tK6BohVvewrhNJ+TfJ0+etGyZvljlIs4nPr/sX1TAXbt2IScnx1xJLSY+bI5FQApoq1RFW3+KseH/QLt27dC+fXuzEvr5+SEvL898//jxY7li+mWaWE39fEUUFTA6OloKaPt80qRJL5OSsd8BAkZWVpZ5CC7+8B2M+eBzODk54f79++buiXs1nhdOzJAzMjJeavfFsqtDhw7J7yxatAjdunVDTEyMrLS2JiRlcywCRmZmplkBS6JmYVTYZ5JAdvaz83YtRSIOwb169UJcXJxMtXDhQohD8J49e+QNTrYKOGXKlJZ2xe+3MQJGenq6WQHLdvwMI3+XiBMnTsgbk8QEISgoyPJdEvcCi/N/+/bta1ZJdfRl+cYzoaUEjLS0NLMCXtj5c3iuPYYePXrg8OHDUj5xqBRNTCBKS0shFo2+ePuluG2zsrISwcHB5v+uX78uT2TPnDnT/L6odGIJ/oABAyDGgLGxsUhPTzcr4NSpUy3dOSazfwJGSkqKeR6wIno2hq2Kh7g98ujRo3KsJq4J25pYvbxixQocOHAAoaGhskIKWW/fvi2vH4tDrZBLNCHavHnzmo0dr127hv79+0O85p9MQ+yf45CammrOjoXAbI5FwEhOTjYPwZW756BswLuovVUvZ6hhYWHyXmHbGE1UP7FMv2fPnhAVrq6uTj7OQzzWQyxgFTNasXSrvr5e3mTesWNHJCcny++L+H79+pmvA794HyOiS6W4tjZ9+nTHos+9hREXF9fk7u4uUVTFhOJXo7+Hgx1mwWvKW/Kzl33Cwf8Tn//ZQbzvmitvSkpKSpIVUBzGFyxYwJ/EwQjISYh4GoKQwDVnP35w79nyKKtZPGhyQkfjKzPtvdVn5DhRNFEtOQmxmrj955NPxxLn9C5duiTHZ63dxHhQPBGB8rU2efvoj88HtI/fwW62QhwNxQRy8eLFcjwvzlbobBRQJ902kltMEMX9OWIyKS6z2ppYLKL7YQEUsI1IYvVmVlVVYenSpfL+729q4gloe/futbrbr+WjgNoR23cHT548wfz58/Hw4cNm1U9sdXx8PDp00LAa+TkkFNC+/Wj1rRN3Ka5evRouLi5wdnaW1+x1Ngqoky5zKwlQQCUiBugkQAF10mVuJQEKqETEAJ0EKKBOusytJEABlYgYoJMABdRJl7mVBCigEhEDdBKggDrpMreSAAVUImKATgIUUCdd5lYSoIBKRAzQSYAC6qTL3EoCFFCJiAE6CVBAnXSZW0mAAioRMUAnAQqoky5zKwlQQCUiBugkQAF10mVuJQEKqETEAJ0EKKBOusytJEABlYgYoJMABdRJl7mVBCigEhEDdBKggDrpMreSAAVUImKATgIUUCdd5lYSoIBKRAzQSYAC6qTL3EoCFFCJiAE6CVBAnXSZW0mAAioRMUAnAQqoky5zKwlQQCUiBugkQAF10mVuJQEKqETEAJ0EKKBOusytJEABlYgYoJMABdRJl7mVBCigEhEDdBKggDrpMreSAAVUImKATgIUUCdd5lYSoIBKRAzQSYAC6qTL3EoCFFCJiAE6CVBAnXSZW0mAAioRMUAnAQqoky5zKwlQQCUiBugkQAF10mVuJQEKqETEAJ0EKKBOusytJEABlYgYoJMABdRJl7mVBCigEhEDdBKggDrpMreSAAVUImKATgIUUCdd5lYSoIBKRAzQSYAC6qTL3EoCFFCJiAE6CVBAnXSZW0mAAioRMUAnAQqoky5zKwlQQCUiBugkQAF10mVuJQEKqETEAJ0EKKBOusytJEABlYgYoJMABdRJl7mVBCigEhEDdBKggDrpMreSAAVUImKATgIUUCdd5lYSoIBKRAzQSYAC6qTL3EoCFFCJiAE6CVBAnXSZW0mAAioRMUAngf8BqHt55CxQckkAAAAASUVORK5CYII=</thumbnail><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="false" inheritance="true" sublistIDs="false" scheduled="false" id="1"><pentrails>data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAeAAAAFoCAYAAACPNyggAAAOhUlEQVR4Xu3VwQkAAAjEMN1/abewn7jAQRC64wgQIECAAIF3gX1fNEiAAAECBAiMAHsCAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQIHLFxAWmhEwHPAAAAAElFTkSuQmCC</pentrails><costumes><list struct="atomic" id="2"></list></costumes><sounds><list struct="atomic" id="3"></list></sounds><variables></variables><blocks></blocks><scripts></scripts><sprites><sprite name="Sprite" idx="1" x="140" y="67.1325068321031" heading="270" scale="1" volume="100" pan="0" rotation="1" draggable="true" costume="0" color="80,80,80,1" pen="tip" id="8"><costumes><list struct="atomic" id="9"></list></costumes><sounds><list struct="atomic" id="10"></list></sounds><blocks></blocks><variables></variables><scripts><script x="88.99999999999989" y="54.000000000000085"><block s="receiveInteraction"><l><option>clicked</option></l></block><custom-block s="file save prompt name: %s %br contents: %mlt extension: %s"><l>fencing blocks</l><l>&lt;blocks app="Snap! 6, https://snap.berkeley.edu" version="1"&gt;&lt;block-definition s="allow fencing" type="command" category="motion"&gt;&lt;comment w="90" collapsed="false"&gt;brings fencing from scratch to snap! (can glitch drop shadow)&lt;/comment&gt;&lt;header&gt;&lt;/header&gt;&lt;code&gt;&lt;/code&gt;&lt;translations&gt;&lt;/translations&gt;&lt;inputs&gt;&lt;/inputs&gt;&lt;script&gt;&lt;block s="fork"&gt;&lt;block s="reifyScript"&gt;&lt;script&gt;&lt;block s="doForever"&gt;&lt;script&gt;&lt;block s="doIf"&gt;&lt;block s="reportGreaterThan"&gt;&lt;block s="xPosition"&gt;&lt;/block&gt;&lt;l&gt;240&lt;/l&gt;&lt;/block&gt;&lt;script&gt;&lt;block s="setXPosition"&gt;&lt;l&gt;240&lt;/l&gt;&lt;/block&gt;&lt;/script&gt;&lt;/block&gt;&lt;block s="doIf"&gt;&lt;block s="reportLessThan"&gt;&lt;block s="xPosition"&gt;&lt;/block&gt;&lt;l&gt;-240&lt;/l&gt;&lt;/block&gt;&lt;script&gt;&lt;block s="setXPosition"&gt;&lt;l&gt;-240&lt;/l&gt;&lt;/block&gt;&lt;/script&gt;&lt;/block&gt;&lt;block s="doIf"&gt;&lt;block s="reportGreaterThan"&gt;&lt;block s="yPosition"&gt;&lt;/block&gt;&lt;l&gt;180&lt;/l&gt;&lt;/block&gt;&lt;script&gt;&lt;block s="setYPosition"&gt;&lt;l&gt;180&lt;/l&gt;&lt;/block&gt;&lt;/script&gt;&lt;/block&gt;&lt;block s="doIf"&gt;&lt;block s="reportLessThan"&gt;&lt;block s="yPosition"&gt;&lt;/block&gt;&lt;l&gt;-180&lt;/l&gt;&lt;/block&gt;&lt;script&gt;&lt;block s="setYPosition"&gt;&lt;l&gt;-180&lt;/l&gt;&lt;/block&gt;&lt;/script&gt;&lt;/block&gt;&lt;/script&gt;&lt;/block&gt;&lt;/script&gt;&lt;list&gt;&lt;/list&gt;&lt;/block&gt;&lt;list&gt;&lt;/list&gt;&lt;/block&gt;&lt;/script&gt;&lt;/block-definition&gt;&lt;/blocks&gt;</l><l>.xml</l></custom-block></script><script x="146" y="249.9999999999999"><block s="receiveGo"></block><block s="doIf"><block s="reportNot"><custom-block s="does var %s exist?"><l>console</l></custom-block></block><script><custom-block s="create %s var %mult%txt"><l>global</l><list><l>console</l></list></custom-block></script></block><custom-block s="set var %s to %s"><l>console</l><block s="reportNewList"><list></list></block></custom-block><custom-block s="move with arrow keys"></custom-block><custom-block s="allow fencing"></custom-block><block s="doSayFor"><l>use arrow keys to move around, click me to downlaod the block, there are other custom blocks around this project! there are some blocks made by another snapper</l><l>5</l></block></script></scripts></sprite><watcher var="console" style="normal" x="0" y="12" color="243,118,29" extX="80" extY="70"/></sprites></stage><hidden></hidden><headers></headers><code></code><blocks><block-definition s="allow fencing" type="command" category="motion"><comment w="90" collapsed="false">brings fencing from scratch to snap! (can glitch drop shadow)</comment><header></header><code></code><translations></translations><inputs></inputs><script><block s="doAddToList"><l>enabled fencing</l><block var="console"/></block><block s="fork"><block s="reifyScript"><script><block s="doForever"><script><block s="doIf"><block s="reportGreaterThan"><block s="xPosition"></block><l>240</l></block><script><block s="setXPosition"><l>240</l></block></script></block><block s="doIf"><block s="reportLessThan"><block s="xPosition"></block><l>-240</l></block><script><block s="setXPosition"><l>-240</l></block></script></block><block s="doIf"><block s="reportGreaterThan"><block s="yPosition"></block><l>180</l></block><script><block s="setYPosition"><l>180</l></block></script></block><block s="doIf"><block s="reportLessThan"><block s="yPosition"></block><l>-180</l></block><script><block s="setYPosition"><l>-180</l></block></script></block></script></block></script><list></list></block><list></list></block></script></block-definition><block-definition s="filled costume %&apos;width&apos; × %&apos;height&apos; colored %&apos;color&apos;" type="reporter" category="looks"><header></header><code></code><translations></translations><inputs><input type="%n">80</input><input type="%n">100</input><input type="%clr"></input></inputs><script><block s="doReport"><block s="reportNewCostumeStretched"><block s="reportNewCostume"><block s="reportNewList"><list><block s="evaluate"><block s="reportJSFunction"><list><l>color</l></list><l>return new List([&#xD; color.r,&#xD; color.g,&#xD; color.b,&#xD;     255]);</l></block><list><block var="color"/></list></block></list></block><l>1</l><l>1</l></block><block s="reportProduct"><block var="width"/><l>100</l></block><block s="reportProduct"><block var="height"/><l>100</l></block></block></block></script></block-definition><block-definition s="alter speed of sound %&apos;sound&apos; by %&apos;percent&apos; %" type="reporter" category="sound"><header></header><code></code><translations></translations><inputs><input type="%s" readonly="true"><options>§_soundsMenu</options></input><input type="%n">50</input></inputs><script><custom-block s="let %upvar be %s"><l>result</l><block s="reportNewSoundFromSamples"><block s="reportGetSoundAttribute"><l><option>samples</option></l><block var="sound"/></block><block s="reportProduct"><block s="reportGetSoundAttribute"><l><option>sample rate</option></l><block var="sound"/></block><block s="reportQuotient"><block s="reportRound"><block s="reportProduct"><block s="reportDifference"><block s="reportQuotient"><block s="reportSum"><block var="percent"/><l>100</l></block><l>100</l></block><l>1</l></block><block s="reportPower"><l>10</l><l>15</l></block></block></block><block s="reportPower"><l>10</l><l>15</l></block></block></block></block></custom-block><block s="doRun"><block s="reportJSFunction"><list><l>snd</l><l>name</l></list><l>snd.name = name;</l></block><list><block var="result"/><block s="reportGetSoundAttribute"><l><option>name</option></l><block var="sound"/></block></list></block><block s="doReport"><block var="result"/></block></script></block-definition><block-definition s="current os" type="reporter" category="sensing"><header></header><code></code><translations></translations><inputs></inputs><script><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list></list><l>var userAgent = navigator.userAgent,&#xD;      platform = navigator.platform,&#xD;      macosPlatforms = [&apos;Macintosh&apos;, &apos;MacIntel&apos;, &apos;MacPPC&apos;, &apos;Mac68K&apos;],&#xD;      windowsPlatforms = [&apos;Win32&apos;, &apos;Win64&apos;, &apos;Windows&apos;, &apos;WinCE&apos;],&#xD;      iosPlatforms = [&apos;iPhone&apos;, &apos;iPad&apos;, &apos;iPod&apos;],&#xD;      os = null;&#xD;&#xD;  if (macosPlatforms.indexOf(platform) !== -1) {&#xD;    os = &apos;Mac OS&apos;;&#xD;  } else if (iosPlatforms.indexOf(platform) !== -1) {&#xD;    os = &apos;iOS&apos;;&#xD;  } else if (windowsPlatforms.indexOf(platform) !== -1) {&#xD;    os = &apos;Windows&apos;;&#xD;  } else if (/Android/.test(userAgent)) {&#xD;    os = &apos;Android&apos;;&#xD;  } else if (!os &amp;&amp; /Linux/.test(platform)) {&#xD;    os = &apos;Linux&apos;;&#xD;  }&#xD;&#xD;  return os;</l></block><list></list></block></block></script></block-definition><block-definition s="%&apos;which&apos; %&apos;text&apos; with delay: %&apos;del&apos; $nl sound: %&apos;sound&apos; stop sounds? %&apos;dostopsounds&apos; $nl and wait %&apos;s&apos; secs" type="command" category="looks"><header></header><code></code><translations></translations><inputs><input type="%s" readonly="true">say<options>say&#xD;think</options></input><input type="%s">Hello!</input><input type="%n">0.04</input><input type="%s" readonly="true"><options>§_soundsMenu</options></input><input type="%b">true</input><input type="%n">2</input></inputs><script><custom-block s="ignore %s"><block s="reportCombine"><block s="reportTextSplit"><block var="text"/><l><option>letter</option></l></block><block s="reifyScript"><script><block s="doIf"><block s="reportNot"><block s="reportEquals"><block s="reportLetter"><l><option>last</option></l><block var="current"/></block><l> </l></block></block><script><block s="playSound"><block var="sound"/></block></script></block><block s="doIfElse"><block s="reportEquals"><block var="which"/><l>say</l></block><script><block s="doSayFor"><block var="current"/><block var="del"/></block></script><script><block s="doThinkFor"><block var="current"/><block var="del"/></block></script></block><block s="doIf"><block var="dostopsounds"/><script><block s="doStopAllSounds"></block></script></block><block s="doReport"><block s="reportJoinWords"><list><block var="current"/><block var="next"/></list></block></block></script><list><l>current</l><l>next</l></list></block></block></custom-block><block s="doIfElse"><block s="reportEquals"><block var="which"/><l>say</l></block><script><block s="doSayFor"><block var="text"/><block var="s"/></block></script><script><block s="doThinkFor"><block var="text"/><block var="s"/></block></script></block></script></block-definition><block-definition s="ask %&apos;text&apos; with delay: $nl %&apos;del&apos; sound: %&apos;sound&apos; stop sounds? $nl %&apos;dostopsounds&apos; until %&apos;pred&apos; and wait" type="command" category="sensing"><header></header><code></code><translations></translations><inputs><input type="%s">what&apos;s your name?</input><input type="%n">0.04</input><input type="%s" readonly="true"><options>§_soundsMenu</options></input><input type="%b">true</input><input type="%boolUE"></input></inputs><script><block s="doAsk"><block s="reportCombine"><block s="reportTextSplit"><block var="text"/><l><option>letter</option></l></block><block s="reifyScript"><script><block s="doIf"><block s="reportNot"><block s="reportListContainsItem"><block s="reportCONS"><l>&apos;</l><block s="reportUnicodeAsLetter"><block s="reportNumbers"><l>32</l><l>47</l></block></block></block><block s="reportLetter"><l><option>last</option></l><block var="current"/></block></block></block><script><block s="playSound"><block var="sound"/></block></script></block><block s="doSayFor"><block var="current"/><block var="del"/></block><block s="doIf"><block var="dostopsounds"/><script><block s="doStopAllSounds"></block></script></block><block s="doReport"><block s="reportJoinWords"><list><block var="current"/><block var="next"/></list></block></block></script><list><l>current</l><l>next</l></list></block></block></block><block s="doUntil"><block s="evaluate"><block var="pred"/><list></list></block><script><block s="doAsk"><block var="text"/></block></script></block></script></block-definition><block-definition s="right mouse down?" type="predicate" category="sensing"><header></header><code></code><translations></translations><inputs></inputs><script><block s="doReport"><block s="reportEquals"><custom-block s="mouse button"></custom-block><l>2</l><comment w="90" collapsed="false">You can modify this script to 1, 3, or 4 to detect different buttons.</comment></block></block></script></block-definition><block-definition s="mouse button" type="reporter" category="sensing"><comment x="0" y="0" w="274" collapsed="false">Reports the currently pressed mouse button&apos;s ID (i.e. middle click is 1, right-click is 2). If no buttons are currently being pressed, it will report -1. If multiple are pressed at once, it will report the ID of the button most recently pressed. This doesn&apos;t work for left clicks, however. For that you need to use &apos;mouse down?&apos;.</comment><header></header><code></code><translations></translations><inputs></inputs><script><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list></list><l>if (!window.buttonClicked){&#xD;window.buttonClicked = -1;&#xD;window.onmousedown = e =&gt; buttonClicked = e.button;&#xD;window.onmouseup = e =&gt; buttonClicked = -1;&#xD;}&#xD;return buttonClicked || -1;</l></block><list></list></block></block></script></block-definition><block-definition s="export costume %&apos;costume&apos; named %&apos;name&apos;" type="command" category="looks"><header></header><code></code><translations></translations><inputs><input type="%s" readonly="true"><options>§_costumesMenu</options></input><input type="%s">costume</input></inputs><script><block s="doRun"><block s="reportJSFunction"><list><l>costume</l></list><l>if (costume instanceof List) throw new Error(`Costume exporting does&#xD;not currently support lists`);&#xD;if (costume == &apos;&apos; || (!(costume instanceof Costume) &amp;&amp; !(this.costumes&#xD;.itemsArray().map(e =&gt; e.name).includes(costume)))) throw new Error("Not a Costume");</l></block><list><block var="costume"/></list></block><block s="doSetVar"><l>costume</l><block s="reportNewCostumeStretched"><block var="costume"/><l>100</l><l>100</l></block></block><block s="doRun"><block s="reportJSFunction"><list><l>costume, name</l></list><l>if (!(costume instanceof Costume)) throw new Error("Not a Costume");&#xD;&#xD;var data = costume.contents.toDataURL(),&#xD;    lnk = document.createElement("a");&#xD;lnk.download = name;&#xD;lnk.href = data;&#xD;lnk.click();</l></block><list><block var="costume"/><block var="name"/></list></block></script></block-definition><block-definition s="export sound %&apos;sound&apos; named %&apos;name&apos;" type="command" category="sound"><header></header><code></code><translations></translations><inputs><input type="%s" readonly="true"><options>§_soundsMenu</options></input><input type="%s">sound</input></inputs><script><block s="doRun"><block s="reportJSFunction"><list><l>sound, name</l></list><l>var lnk = document.createElement("a");&#xD;lnk.href = sound.audio.src;&#xD;lnk.download = name;&#xD;lnk.click();</l></block><list><block s="reportIfElse"><block s="reportIsA"><block var="sound"/><l><option>sound</option></l></block><block var="sound"/><block s="reportFindFirst"><block s="reifyPredicate"><autolambda><block s="reportEquals"><block s="reportGetSoundAttribute"><l><option>name</option></l><l></l></block><block var="sound"/></block></autolambda><list></list></block><block s="reportGet"><l><option>sounds</option></l></block></block></block><block var="name"/></list></block></script></block-definition><block-definition s="setting %&apos;which&apos;" type="reporter" category="sensing"><comment x="0" y="0" w="254.66666666666663" collapsed="false">Allows reading global settings programmatically.</comment><header></header><code></code><translations>pt:o valor da configuração _&#xD;</translations><inputs><input type="%s" readonly="true"><options>project notes&#xD;project name&#xD;user&#xD;presentation mode&#xD;language&#xD;zoom blocks&#xD;stage size&#xD;stage scale&#xD;retina display support&#xD;long form input dialog&#xD;plain prototype labels&#xD;input sliders&#xD;execute on slider change&#xD;clicking sound&#xD;turbo mode&#xD;flat design&#xD;keyboard editing&#xD;visible stepping&#xD;thread safe scripts&#xD;prefer smooth animations&#xD;flat line ends&#xD;codification support&#xD;inheritance support&#xD;hyper blocks support&#xD;visible palette</options></input></inputs><script><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list><l>which</l></list><l>var stage = this.parentThatIsA(StageMorph),&#xD;    ide = stage.parentThatIsA(IDE_Morph),&#xD;    world = stage.parentThatIsA(WorldMorph);&#xD;&#xD;switch (which) {&#xD;    case &apos;project notes&apos;:&#xD;        return ide.projectNotes;&#xD;    case &apos;project name&apos;:&#xD;        return ide.projectName;&#xD;    case &apos;user&apos;:&#xD;        return ide.cloud.username;&#xD;    case &apos;presentation mode&apos;:&#xD;        return ide.isAppMode;&#xD;    case &apos;language&apos;:&#xD;        return SnapTranslator.language;&#xD;    case &apos;zoom blocks&apos;:&#xD;        return SyntaxElementMorph.prototype.scale;&#xD;    case &apos;stage size&apos;:&#xD;        return new List([StageMorph.prototype.dimensions.x,&#xD;                                   StageMorph.prototype.dimensions.y]);&#xD;    case &apos;stage scale&apos;:&#xD;       return stage.scale;&#xD;    case &apos;retina display support&apos;:&#xD;        return isRetinaEnabled();&#xD;    case &apos;long form input dialog&apos;:&#xD;        return InputSlotDialogMorph.prototype.isLaunchingExpanded;&#xD;    case &apos;plain prototype labels&apos;:&#xD;        return BlockLabelPlaceHolderMorph.prototype.plainLabel;&#xD;    case &apos;input sliders&apos;:&#xD;        return MorphicPreferences.useSliderForInput;&#xD;    case &apos;execute on slider change&apos;:&#xD;        return ArgMorph.prototype.executeOnSliderEdit;&#xD;    case &apos;clicking sound&apos;:&#xD;        return !!BlockMorph.prototype.snapSound;&#xD;    case &apos;turbo mode&apos;:&#xD;        return stage.isFastTracked;&#xD;    case &apos;flat design&apos;:&#xD;        return MorphicPreferences.isFlat;&#xD;    case &apos;keyboard editing&apos;:&#xD;        return !!this.scripts.focus;&#xD;    case &apos;visible stepping&apos;:&#xD;        return Process.prototype.enableSingleStepping;&#xD;    case &apos;thread safe scripts&apos;:&#xD;        return stage.isThreadSafe;&#xD;    case &apos;prefer smooth animations&apos;:&#xD;        return StageMorph.prototype.frameRate &gt; 0;&#xD;    case &apos;flat line ends&apos;:&#xD;        return SpriteMorph.prototype.useFlatLineEnds;&#xD;    case &apos;codification support&apos;:&#xD;        return StageMorph.prototype.enableCodeMapping;&#xD;    case &apos;inheritance support&apos;:&#xD;        return StageMorph.prototype.enableInheritance;&#xD;    case &apos;hyper blocks support&apos;:&#xD;        return Process.prototype.enableHyperOps;&#xD;    default: return which;&#xD;    case &apos;visible palette&apos;:&#xD;        return ide.currentCategory;&#xD;}</l></block><list><block var="which"/></list></block></block></script></block-definition><block-definition s="set flag %&apos;which&apos; to %&apos;tf&apos;" type="command" category="sensing"><comment x="0" y="0" w="254.66666666666663" collapsed="false">Allows changing global settings programmatically.&#xD;This block is for Boolean settings; use &apos;set value&apos; for non-Boolean values.</comment><header></header><code></code><translations>pt:altera o valor da configuração _ para _&#xD;</translations><inputs><input type="%s" readonly="true"><options>presentation mode&#xD;retina display support&#xD;long form input dialog&#xD;plain prototype labels&#xD;input sliders&#xD;execute on slider change&#xD;clicking sound&#xD;turbo mode&#xD;flat design&#xD;keyboard editing&#xD;visible stepping&#xD;thread safe scripts&#xD;prefer smooth animations&#xD;flat line ends&#xD;codification support&#xD;inheritance support&#xD;hyper blocks support</options></input><input type="%b"></input></inputs><script><block s="doRun"><block s="reportJSFunction"><list><l>which</l><l>tf</l></list><l>var   stage = this.parentThatIsA(StageMorph),&#xD;        ide = stage.parentThatIsA(IDE_Morph),&#xD;        world = stage.parentThatIsA(WorldMorph),&#xD;        thisObj = this;&#xD;&#xD;if (tf != !!tf) return;&#xD;&#xD;try{&#xD;ide.savingPreferences = false;&#xD;&#xD;switch (which) {&#xD;    case &apos;presentation mode&apos;:&#xD;        if (tf != ide.isAppMode) ide.toggleAppMode();&#xD;        break;&#xD;    case &apos;retina display support&apos;:&#xD;        if (tf != isRetinaEnabled()) ide.toggleRetina();&#xD;        break;&#xD;    case &apos;long form input dialog&apos;:&#xD;        if (tf != InputSlotDialogMorph.prototype.isLaunchingExpanded)&#xD;            ide.toggleLongFormInputDialog();&#xD;        break;&#xD;    case &apos;plain prototype labels&apos;:&#xD;        if (tf != BlockLabelPlaceHolderMorph.prototype.plainLabel)&#xD;            ide.togglePlainPrototypeLabels();&#xD;        break;&#xD;    case &apos;input sliders&apos;:&#xD;        MorphicPreferences.useSliderForInput = tf;&#xD;        break;&#xD;    case &apos;execute on slider change&apos;:&#xD;        ArgMorph.prototype.executeOnSliderEdit = tf;&#xD;        break;&#xD;    case &apos;clicking sound&apos;:&#xD;        if (tf != !!BlockMorph.prototype.snapSound)&#xD;            BlockMorph.prototype.toggleSnapSound();&#xD;        break;&#xD;    case &apos;turbo mode&apos;:&#xD;        if (tf != stage.isFastTracked)&#xD;            ide.toggleFastTracking();&#xD;        break;&#xD;    case &apos;flat design&apos;:&#xD;        if (tf == MorphicPreferences.isFlat) break;&#xD;        if (tf)&#xD;            ide.flatDesign();&#xD;        else&#xD;            ide.defaultDesign();&#xD;        break;&#xD;    case &apos;keyboard editing&apos;:&#xD;        if (thisObj.scripts.focus &amp;&amp; !tf) {&#xD;            thisObj.scripts.focus.stopEditing();&#xD;        } else if (tf &amp;&amp; !thisObj.scripts.focus) {&#xD;            thisObj.scripts.toggleKeyboardEntry();&#xD;        };&#xD;        break;&#xD;    case &apos;visible stepping&apos;:&#xD;        if (tf != Process.prototype.enableSingleStepping)&#xD;            ide.toggleSingleStepping();&#xD;        break;&#xD;    case &apos;thread safe scripts&apos;:&#xD;        stage.isThreadSafe = tf;&#xD;        break;&#xD;    case &apos;prefer smooth animations&apos;:&#xD;        if (tf != (StageMorph.prototype.frameRate &gt; 0))&#xD;            ide.toggleVariableFrameRate();&#xD;        break;&#xD;    case &apos;flat line ends&apos;:&#xD;        SpriteMorph.prototype.useFlatLineEnds = tf;&#xD;        break;&#xD;    case &apos;codification support&apos;:&#xD;        if (tf != StageMorph.prototype.enableCodeMapping) {&#xD;            StageMorph.prototype.enableCodeMapping = tf;&#xD;            ide.currentSprite.blocksCache.variables = null;&#xD;            ide.currentSprite.paletteCache.variables = null;&#xD;            ide.refreshPalette();&#xD;        }&#xD;        break;&#xD;    case &apos;inheritance support&apos;:&#xD;        if (tf != StageMorph.prototype.enableInheritance) {&#xD;            StageMorph.prototype.enableInheritance = tf;&#xD;            ide.currentSprite.blocksCache.variables = null;&#xD;            ide.currentSprite.paletteCache.variables = null;&#xD;            ide.refreshPalette();&#xD;        }&#xD;        break;&#xD;    case &apos;hyper blocks support&apos;:&#xD;        Process.prototype.enableHyperOps = tf;&#xD;        break;&#xD;};&#xD;}&#xD;finally {&#xD;ide.savingPreferences = false;&#xD;};&#xD;</l></block><list><block var="which"/><block var="tf"/></list></block></script></block-definition><block-definition s="set value %&apos;which&apos; to %&apos;value&apos;" type="command" category="sensing"><comment x="0" y="0" w="254.66666666666663" collapsed="false">Allows changing global settings programmatically.&#xD;This block is for numeric or text settings; use&#xD;&apos;set flag&apos; for Boolean values.</comment><header></header><code></code><translations>pt:altera o valor da configuração _ para _&#xD;</translations><inputs><input type="%s" readonly="true"><options>project notes&#xD;project name&#xD;language&#xD;zoom blocks&#xD;stage size&#xD;stage scale&#xD;visible palette</options></input><input type="%s"></input></inputs><script><block s="doRun"><block s="reportJSFunction"><list><l>which</l><l>value</l></list><l>var   stage = this.parentThatIsA(StageMorph),&#xD;        ide = stage.parentThatIsA(IDE_Morph),&#xD;        world = stage.parentThatIsA(WorldMorph);&#xD;&#xD;try {&#xD;ide.savingPreferences = false;&#xD;&#xD;switch (which.split(&apos;&apos;)[0].toLocaleUpperCase()+which.slice(1)) {&#xD;    case &apos;Project notes&apos;:&#xD;        ide.projectNotes = value;&#xD;        break;&#xD;    case &apos;Project name&apos;:&#xD;        ide.setProjectName(value);&#xD;        break;&#xD;    case &apos;Language&apos;:&#xD;        ide.setLanguage(value);&#xD;        break;&#xD;    case &apos;Zoom blocks&apos;:&#xD;        if (!isNaN(value)) ide.setBlocksScale(Math.min(value, 12));&#xD;        break;&#xD;    case &apos;Stage size&apos;:&#xD;        if ((value instanceof List) &amp;&amp; value.length()==2&#xD;                       &amp;&amp; !isNaN(value.at(1)) &amp;&amp; !isNaN(value.at(2)))&#xD;            ide.setStageExtent(new Point(value.at(1), value.at(2)));&#xD;        break;&#xD;    case &apos;Stage scale&apos;:&#xD;        ide.toggleStageSize(value != 1, Math.max(0.1, value));&#xD;        break;&#xD;    case &apos;Visible palette&apos;:&#xD;        ide.currentCategory = value.toLowerCase();&#xD;        ide.categories.children.forEach(function (each) {&#xD;                each.refresh();&#xD;        });&#xD;        ide.refreshPalette(true);&#xD;        break;&#xD;};&#xD;}&#xD;finally {ide.savingPreferences = true;&#xD;};</l></block><list><block var="which"/><block var="value"/></list></block></script></block-definition><block-definition s="my scripts" type="reporter" category="sensing"><comment x="0" y="0" w="90" collapsed="false">Reports all the current sprite&apos;s scripts in a list.</comment><header></header><code></code><translations></translations><inputs></inputs><script><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list></list><l>return new List(this.scripts.children.map(&#xD;function (e) {if (e instanceof RingMorph){&#xD;return new Context(null,[e]);&#xD;} else {&#xD;return new Context(null,e.fullCopy());}&#xD;}).filter(function (e) {&#xD;return !(e.expression instanceof CommentMorph);}));</l></block><list></list></block></block></script></block-definition><block-definition s="restart all $flag-1.3-0-200-15" type="command" category="control"><header></header><code></code><translations></translations><inputs></inputs><script><block s="doStopThis"><l><option>all but this script</option></l></block><block s="doBroadcast"><l><option>__shout__go__</option></l></block><block s="doStopThis"><l><option>this script</option></l></block></script></block-definition><block-definition s="alter costume %&apos;costume&apos; r: %&apos;r&apos; g: %&apos;g&apos; b: %&apos;b&apos;" type="reporter" category="looks"><header></header><code></code><translations></translations><inputs><input type="%s" readonly="true"><options>§_costumesMenu</options></input><input type="%n"></input><input type="%n"></input><input type="%n"></input></inputs><script><block s="doDeclareVariables"><list><l>c</l></list></block><block s="doSetVar"><l>c</l><block s="reportIfElse"><block s="reportIsA"><block var="costume"/><l><option>list</option></l></block><block s="reportFindFirst"><block s="reifyPredicate"><autolambda><block s="reportEquals"><block s="reportGetImageAttribute"><l><option>pixels</option></l><l></l></block><block var="costume"/></block></autolambda><list></list></block><block s="reportGet"><l><option>costumes</option></l></block></block><block var="costume"/></block></block><block s="doReport"><block s="reportNewCostume"><block s="evaluate"><block s="reifyReporter"><autolambda><block s="reportProduct"><l></l><block s="reportQuotient"><block s="reportNewList"><list><block var="r"/><block var="g"/><block var="b"/><l>100</l></list></block><l>100</l></block></block></autolambda><list></list></block><list><block s="reportIfElse"><block s="reportIsA"><block var="costume"/><l><option>list</option></l></block><block var="costume"/><block s="reportGetImageAttribute"><l><option>pixels</option></l><block var="costume"/></block></block></list></block><block s="reportGetImageAttribute"><l><option>width</option></l><block var="c"/></block><block s="reportGetImageAttribute"><l><option>height</option></l><block var="c"/></block></block></block></script></block-definition><block-definition s="file save prompt name: %&apos;filename&apos; $nl contents: %&apos;body&apos; extension: %&apos;extension&apos;" type="command" category="other"><comment x="0" y="0" w="260.350692471591" collapsed="false">Downloads a file onto the user&apos;s computer.&#xD;URLs are supported, and required for PNG images and possibly other extensions.&#xD;&#xD;Update: Now supports backslashing of URLs to instead get a file with the URL as its binary contents. Not sure why you&apos;d want that though.</comment><header></header><code></code><translations></translations><inputs><input type="%s">filename</input><input type="%mlt">body</input><input type="%s">.txt<options>.txt&#xD;.xml&#xD;.html</options></input></inputs><script><block s="doRun"><block s="reportJSFunction"><list><l>contents</l><l>filename</l><l>ext</l></list><l>var pattern = new RegExp(&apos;^(https?:\\/\\/)?&apos;+ // protocol&#xD;    &apos;((([a-z\\d]([a-z\\d-]*[a-z\\d])*)\\.)+[a-z]{2,}|&apos;+ // domain name&#xD;    &apos;((\\d{1,3}\\.){3}\\d{1,3}))&apos;+ // OR ip (v4) address&#xD;    &apos;(\\:\\d+)?(\\/[-a-z\\d%_.&#126;+]*)*&apos;+ // port and path&#xD;    &apos;(\\?[;&amp;a-z\\d%_.&#126;+=-]*)?&apos;+ // query string&#xD;    &apos;(\\#[-a-z\\d_]*)?$&apos;,&apos;i&apos;); // fragment locator&#xD;if (ext[0] != &apos;.&apos;)&#xD;ext = &apos;.&apos;+ext;&#xD;var lnk = document.createElement(&apos;a&apos;),&#xD;    blob = new Blob([contents]);&#xD;if (pattern.test(contents) || (pattern.test(contents.slice(1)) &amp;&amp;&#xD;pattern[0] == &apos;\\&apos;)){&#xD;lnk.href = contents;&#xD;} else {&#xD;lnk.href = (window.URL||window.webkitURL).createObjectURL(blob);}&#xD;lnk.download = filename + ext;&#xD;lnk.click();</l></block><list><block var="body"/><block var="filename"/><block var="extension"/></list></block></script></block-definition><block-definition s="%&apos;w&apos; flip costume %&apos;cos&apos;" type="reporter" category="looks"><header></header><code></code><translations></translations><inputs><input type="%s" readonly="true">horizontal<options>horizontal&#xD;vertical</options></input><input type="%s" readonly="true">current<options>§_costumesMenu</options></input></inputs><script><block s="doDeclareVariables"><list><l>costume</l></list></block><block s="doSetVar"><l>costume</l><l></l></block><block s="doIf"><block s="reportEquals"><block var="w"/><l>horizontal</l></block><script><block s="doSetVar"><l>costume</l><block s="reportNewCostumeStretched"><block var="cos"/><l>-100</l><l>100</l></block></block></script></block><block s="doIf"><block s="reportEquals"><block var="w"/><l>vertical</l></block><script><block s="doSetVar"><l>costume</l><block s="reportNewCostumeStretched"><block var="cos"/><l>100</l><l>-100</l></block></block></script></block><block s="doRun"><block s="reportJSFunction"><list><l>cst</l><l>n</l></list><l>cst.name = n;</l></block><list><block var="costume"/><block s="reportGetImageAttribute"><l><option>name</option></l><block var="cos"/></block></list></block><block s="doReport"><block var="costume"/></block></script></block-definition><block-definition s="speech bubble contents" type="reporter" category="looks"><header></header><code></code><translations></translations><inputs></inputs><script><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list></list><l>if(this instanceof StageMorph){&#xD;throw new TypeError("Cannot read property \&#xD;&apos;apply&apos; of undefined");}&#xD;var contents = this.talkBubble();&#xD;if (!contents) return &apos;&apos;;&#xD;contents = contents.contentsMorph;&#xD;if (!(contents instanceof TextMorph))&#xD;return contents;&#xD;return contents.text;</l></block><list></list></block></block></script></block-definition><block-definition s="send notification $nl $- title: %&apos;title&apos; $nl $- text: %&apos;text&apos; $nl $- icon: %&apos;costume&apos; $nl $- image: %&apos;img&apos; $nl $- onclick: %&apos;code&apos;" type="command" category="sensing"><comment x="0" y="0" w="198" collapsed="false">Sends a notification to the user&apos;s device.&#xD;The icon/image parameters take a costume as input and the onclick parameter takes a JavaScript or Snap! function.</comment><header></header><code></code><translations></translations><inputs><input type="%s">Hi there!</input><input type="%txt">How are you today?</input><input type="%s" readonly="true">current<options>§_costumesMenu</options></input><input type="%s" readonly="true"><options>§_costumesMenu</options></input><input type="%cmdRing">this.close();</input></inputs><script><block s="doRun"><block s="reportJSFunction"><list><l>title</l><l>body</l><l>icon</l><l>img</l><l>onclick</l></list><l>if (!("Notification" in window)) console.error("\&#xD;Error", "The notification API is not supported on\n\&#xD;your browser!");&#xD;icon = icon.contents.toDataURL();&#xD;img = img.contents.toDataURL();&#xD;var noti = new Notification(title || "Hi there!",&#xD;{body: body || "How are you today?",&#xD;icon: icon || null,&#xD;image: img || null});&#xD;if (onclick instanceof Function){&#xD;noti.onclick = onclick;&#xD;} else {&#xD;noti.onclick = function () {&#xD;invoke(onclick, new List);&#xD;}}</l></block><list><block var="title"/><block var="text"/><block s="reportNewCostumeStretched"><block var="costume"/><l>100</l><l>100</l></block><block s="reportNewCostumeStretched"><block var="img"/><l>100</l><l>100</l></block><block var="code"/></list></block></script></block-definition><block-definition s="set cursor %&apos;which&apos;" type="command" category="other"><comment x="0" y="0" w="90" collapsed="false">Update: Now accepts URLs!</comment><header></header><code></code><translations></translations><inputs><input type="%s">pointer<options>auto&#xD;cell&#xD;copy&#xD;crosshair&#xD;default&#xD;grab&#xD;grabbing&#xD;help&#xD;move&#xD;not-allowed&#xD;pointer&#xD;progress&#xD;text&#xD;wait&#xD;n-resize&#xD;s-resize&#xD;e-resize&#xD;w-resize&#xD;ne-resize&#xD;se-resize&#xD;nw-resize&#xD;sw-resize</options></input></inputs><script><block s="doRun"><block s="reportJSFunction"><list><l>cur</l><l>proc</l></list><l>function setTo(val){&#xD;document.body.style.cursor = val;&#xD;top.window.document.body.style.cursor = val;&#xD;}&#xD;if (cur instanceof Costume || this.costumes.asArray().map(e=&gt;e.name).includes(cur) || cur===&apos;current&apos;){&#xD;alert("Sorry, costumes don&apos;t work very well for custom cursors at the moment.");&#xD;return;&#xD;let c = newCanvas(),ctx=c.getContext(&apos;2d&apos;);&#xD;cur=proc.reportNewCostumeStretched(cur, 100, 100);&#xD;c.width = cur.width();&#xD;c.height = cur.height();&#xD;ctx.drawImage(cur.contents, 0, 0);&#xD;setTo(&apos;url("&apos;+c.toDataURL()+&apos;"), auto&apos;);&#xD;} else if (`auto&#xD;cell&#xD;copy&#xD;crosshair&#xD;default&#xD;grab&#xD;grabbing&#xD;help&#xD;move&#xD;not-allowed&#xD;pointer&#xD;progress&#xD;text&#xD;wait&#xD;n-resize&#xD;s-resize&#xD;e-resize&#xD;w-resize&#xD;ne-resize&#xD;se-resize&#xD;nw-resize&#xD;sw-resize`.split(&apos;\n&apos;).includes(cur)){&#xD;setTo(cur);&#xD;}else{&#xD;setTo(&apos;url("&apos;+cur+&apos;"),auto&apos;);&#xD;}</l></block><list><block var="which"/></list></block></script></block-definition><block-definition s="# %&apos;comment&apos;" type="command" category="other"><header></header><code></code><translations></translations><inputs><input type="%mlt">comment...</input></inputs></block-definition><block-definition s="notifications allowed?" type="predicate" category="sensing"><header></header><code></code><translations></translations><inputs></inputs><script><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list></list><l>return [&apos;granted&apos;,&apos;prompt&apos;]&#xD;.includes(Notification.permission);</l></block><list></list></block></block></script></block-definition><block-definition s="root object" type="reporter" category="sensing"><header></header><code></code><translations></translations><inputs></inputs><script><block s="doReport"><block s="reportIfElse"><block s="reportNot"><custom-block s="am I a clone?"></custom-block></block><block s="reportObject"><l><option>myself</option></l></block><block s="reportAskFor"><block s="reportGet"><l><option>parent</option></l></block><block s="reifyReporter"><autolambda><custom-block s="root object"></custom-block></autolambda><list></list></block><list></list></block></block></block></script></block-definition><block-definition s="costume from url %&apos;url&apos;" type="reporter" category="looks"><comment x="0" y="0" w="96.36363636363625" collapsed="false">Credit to @programmer_user</comment><header></header><code></code><translations></translations><inputs><input type="%s">Costumes/alonzo.png<options>function () {&#xD;var obj = {};&#xD;world.children[0].getMediaList(&apos;Costumes&apos;).forEach(image =&gt; {&#xD;obj[image.name] = &apos;Costumes/&apos; + image.fileName;&#xD;})&#xD;return obj;&#xD;}</options></input></inputs><script><custom-block s="let %upvar be %s"><l>costume</l><block s="evaluate"><block s="reportJSFunction"><list><l>url</l></list><l>var img = new Image(),&#xD;    cst = null,&#xD;    canvas;&#xD;img.onload = function() {&#xD;    canvas = document.createElement(&apos;canvas&apos;);&#xD;    canvas.width = img.width;&#xD;    canvas.height = img.height;&#xD;    canvas.getContext(&apos;2d&apos;).drawImage(img, 0, 0);&#xD;    cst = new Costume(canvas);&#xD;}&#xD;img.crossOrigin = &apos;anonymous&apos;;&#xD;img.src = url;&#xD;return () =&gt; cst;</l></block><list><block var="url"/></list></block></custom-block><block s="doWaitUntil"><block s="evaluate"><block var="costume"/><list></list></block></block><block s="doReport"><block s="evaluate"><block var="costume"/><list></list></block></block></script></block-definition><block-definition s="window %&apos;which&apos;" type="reporter" category="sensing"><header></header><code></code><translations></translations><inputs><input type="%s" readonly="true">title<options>url=href&#xD;hash&#xD;title&#xD;origin</options></input></inputs><script><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list><l>which</l></list><l>if (which == &apos;title&apos;)&#xD;return document.title;&#xD;return location[which] || &apos;&apos;;</l></block><list><block var="which"/></list></block></block></script></block-definition><block-definition s="set window %&apos;which&apos; to %&apos;data&apos;" type="command" category="sensing"><header></header><code></code><translations></translations><inputs><input type="%s" readonly="true">title<options>title&#xD;location</options></input><input type="%s">Snap!</input></inputs><script><block s="doRun"><block s="reportJSFunction"><list><l>which</l><l>data</l></list><l>switch (which) {&#xD;case &apos;title&apos;:&#xD;document.title = data;&#xD;break;&#xD;case &apos;location&apos;:&#xD;location.href = data;&#xD;break;&#xD;}</l></block><list><block var="which"/><block var="data"/></list></block></script></block-definition><block-definition s="safely try %&apos;action&apos; then if %&apos;error&apos; %&apos;handler&apos;" type="command" category="control"><comment x="0" y="0" w="276" collapsed="false">Catch errors.&#xD;&#xD;Runs the first script.  If it succeeds, nothing else happens.&#xD;But if it has an error (something that would otherwise result&#xD;in a red halo around the block), then the second script is run,&#xD;with the text of the error message that would have been shown in the variable ERROR.</comment><header></header><code></code><translations>pt:tenta executar _ e, em caso de erro _ , executa _&#xD;</translations><inputs><input type="%cs"></input><input type="%upvar"></input><input type="%cs"></input></inputs><script><custom-block s="let %upvar be %s"><l>reset</l><block s="evaluate"><block s="reportJSFunction"><list><l>proc</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></block><list></list></block></custom-block><block s="doCallCC"><block s="reifyScript"><script><block s="doRun"><block s="reportJSFunction"><list><l>reset</l><l>action</l><l>handler</l><l>proc</l></list><l>proc.isCatchingErrors = true;&#xD;proc.handleError = function(error, element){&#xD; reset();&#xD; proc.context = handler;&#xD; proc.context.variables.setVar("error", &#xD; String(error));&#xD;}&#xD;&#xD;try{&#xD; proc.evaluate(action, new List(), true);&#xD;}&#xD;catch(e){&#xD; proc.handleError(e, null);&#xD;} </l></block><list><block var="reset"/><block var="action"/><block s="reifyScript"><script><block s="doRun"><block s="reifyScript"><script><block s="doRun"><block var="handler"/><list></list></block><block s="doRun"><block var="return"/><list></list></block></script><list></list></block><list></list></block></script><list></list></block></list></block></script><list><l>return</l></list></block></block><block s="doRun"><block var="reset"/><list></list></block></script></block-definition><block-definition s="inform %&apos;body&apos; titled %&apos;title&apos;" type="command" category="sensing"><comment x="0" y="0" w="90" collapsed="false">These blocks are obsolete, use the CUSTOM DIALOG block instead.</comment><header></header><code></code><translations></translations><inputs><input type="%s">This is some content!</input><input type="%s">!</input></inputs><script><custom-block s="let %upvar be %s"><l>test</l><block s="evaluate"><block s="reportJSFunction"><list><l>body</l><l>title</l></list><l>var dialog = new DialogBoxMorph(),&#xD;    isDone = false;&#xD;dialog.destroy = function() {&#xD;    isDone = true;&#xD;    var world = this.world();&#xD;    world.keyboardFocus = null;&#xD;    world.hand.destroyTemporaries();&#xD;    DialogBoxMorph.uber.destroy.call(this);&#xD;}&#xD;dialog.inform(title, body, this.world());&#xD;return () =&gt; (isDone);</l></block><list><block var="body"/><block var="title"/></list></block></custom-block><block s="doWaitUntil"><block s="evaluate"><block var="test"/><list></list></block></block></script></block-definition><block-definition s="send %&apos;data&apos; to clipboard" type="command" category="control"><header></header><code></code><translations></translations><inputs><input type="%s"></input></inputs><script><block s="doRun"><block s="reportJSFunction"><list><l>textInput</l></list><l>navigator.clipboard.writeText(textInput);</l></block><list><block var="data"/></list></block></script></block-definition><block-definition s="confirm %&apos;body&apos; titled %&apos;title&apos;" type="predicate" category="sensing"><comment x="0" y="0" w="90" collapsed="false">These blocks are obsolete, use the CUSTOM DIALOG block instead.</comment><header></header><code></code><translations></translations><inputs><input type="%s">Are you sure?</input><input type="%s">?</input></inputs><script><custom-block s="let %upvar be %s"><l>accessors</l><block s="evaluate"><block s="reportJSFunction"><list><l>body</l><l>title</l></list><l>var dialog = new DialogBoxMorph(),&#xD;    isDone = false,&#xD;    result = false;&#xD;dialog.destroy = function() {&#xD;    isDone = true;&#xD;    result = this.buttons.children[0].userState &#xD;    != &apos;normal&apos;;&#xD;    var world = this.world();&#xD;    world.keyboardFocus = null;&#xD;    world.hand.destroyTemporaries();&#xD;    DialogBoxMorph.uber.destroy.call(this);&#xD;}&#xD;dialog.askYesNo(title, body, this.world());&#xD;return new List([() =&gt; isDone, () =&gt; result]);</l></block><list><block var="body"/><block var="title"/></list></block></custom-block><block s="doWaitUntil"><block s="evaluate"><block s="reportListItem"><l>1</l><block var="accessors"/></block><list></list></block></block><block s="doReport"><block s="evaluate"><block s="reportListItem"><l>2</l><block var="accessors"/></block><list></list></block></block></script></block-definition><block-definition s="prompt %&apos;title&apos; default %&apos;default&apos;" type="reporter" category="sensing"><comment x="0" y="0" w="90" collapsed="false">These blocks are obsolete, use the EDIT BOX block instead.</comment><header></header><code></code><translations></translations><inputs><input type="%s">What&apos;s your name?</input><input type="%s">John Doe</input></inputs><script><custom-block s="let %upvar be %s"><l>accessors</l><block s="evaluate"><block s="reportJSFunction"><list><l>origin</l><l>title</l></list><l>var dialog = new DialogBoxMorph(),&#xD;    isDone = false,&#xD;    result = false;&#xD;dialog.destroy = function () {&#xD;    isDone = true;&#xD;    result = this.buttons.children[1].userState&#xD;    == &apos;highlight&apos;? false:this.getInput();&#xD;    var world = this.world();&#xD;    world.keyboardFocus = null;&#xD;    world.hand.destroyTemporaries();&#xD;    DialogBoxMorph.uber.destroy.call(this);&#xD;}&#xD;dialog.prompt(title, origin, this.world());&#xD;return new List([() =&gt; isDone, () =&gt; result]);</l></block><list><block var="default"/><block var="title"/></list></block></custom-block><block s="doWaitUntil"><block s="evaluate"><block s="reportListItem"><l>1</l><block var="accessors"/></block><list></list></block></block><block s="doReport"><block s="evaluate"><block s="reportListItem"><l>2</l><block var="accessors"/></block><list></list></block></block></script></block-definition><block-definition s="%&apos;which&apos; string %&apos;data&apos;" type="reporter" category="operators"><header></header><code></code><translations></translations><inputs><input type="%s" readonly="true">uppercase<options>uppercase&#xD;lowercase&#xD;capitalize&#xD;line capitalize&#xD;full capitalize</options></input><input type="%s">Pink girl</input></inputs><script><block s="doIf"><block s="reportIsA"><block var="data"/><l><option>list</option></l></block><script><block s="doReport"><block s="reportMap"><block s="reifyReporter"><autolambda><custom-block s="%s string %s"><block var="which"/><l></l></custom-block></autolambda><list></list></block><block var="data"/></block></block></script></block><block s="doIf"><block s="reportEquals"><block var="which"/><l>uppercase</l></block><script><custom-block s="let %upvar be %s"><l>upper</l><block s="reportUnicodeAsLetter"><block s="reportDifference"><block s="reportUnicode"><custom-block s="constant %s"><l>latin alphabet</l></custom-block></block><l>32</l></block></block></custom-block><block s="doReport"><block s="reportJoinWords"><list><block s="reportMap"><block s="reifyReporter"><autolambda><block s="reportIfElse"><block s="reportNot"><block s="reportListContainsItem"><custom-block s="constant %s"><l>latin alphabet</l></custom-block><l></l></block></block><l></l><block s="reportListItem"><block s="reportListIndex"><l></l><block var="upper"/></block><block var="upper"/></block></block></autolambda><list></list></block><block s="reportTextSplit"><block var="data"/><l><option>letter</option></l></block></block></list></block></block></script></block><block s="doIf"><block s="reportEquals"><block var="which"/><l>lowercase</l></block><script><block s="doReport"><block s="reportJoinWords"><list><block s="reportMap"><block s="reifyReporter"><autolambda><block s="reportIfElse"><block s="reportNot"><block s="reportListContainsItem"><custom-block s="constant %s"><l>latin alphabet</l></custom-block><l></l></block></block><l></l><block s="reportListItem"><block s="reportListIndex"><l></l><custom-block s="constant %s"><l>latin alphabet</l></custom-block></block><custom-block s="constant %s"><l>latin alphabet</l></custom-block></block></block></autolambda><list></list></block><block s="reportTextSplit"><block var="data"/><l><option>letter</option></l></block></block></list></block></block></script></block><block s="doIf"><block s="reportEquals"><block var="which"/><l>capitalize</l></block><script><block s="doReport"><block s="reportJoinWords"><list><custom-block s="%s string %s"><l>uppercase</l><block s="reportLetter"><l>1</l><block var="data"/></block></custom-block><custom-block s="all but %s %s of %s"><l>first</l><l>letter</l><block var="data"/></custom-block></list></block></block></script></block><block s="doIf"><block s="reportEquals"><block var="which"/><l>line capitalize</l></block><script><block s="doReport"><custom-block s="combine %l with delimiter %s"><block s="reportMap"><block s="reifyReporter"><autolambda><custom-block s="%s string %s"><l>capitalize</l><l></l></custom-block></autolambda><list></list></block><block s="reportTextSplit"><block var="data"/><l><option>line</option></l></block></block><block s="reportUnicodeAsLetter"><l>10</l></block></custom-block></block></script></block><block s="doIf"><block s="reportEquals"><block var="which"/><l>full capitalize</l></block><script><block s="doReport"><custom-block s="%s string %s"><l>line capitalize</l><custom-block s="combine %l with delimiter %s"><block s="reportMap"><block s="reifyReporter"><autolambda><custom-block s="%s string %s"><l>capitalize</l><l></l></custom-block></autolambda><list></list></block><block s="reportTextSplit"><block var="data"/><l> </l></block></block><l> </l></custom-block></custom-block></block></script></block><block s="doReport"><block var="data"/></block></script></block-definition><block-definition s="all but %&apos;fl&apos; %&apos;which&apos; of %&apos;data&apos;" type="reporter" category="operators"><header></header><code></code><translations></translations><inputs><input type="%s" readonly="true">first<options>first&#xD;last</options></input><input type="%s" readonly="true">letter<options>letter&#xD;word</options></input><input type="%s">world</input></inputs><script><block s="doIf"><block s="reportEquals"><block var="fl"/><l>first</l></block><script><block s="doIf"><block s="reportEquals"><block var="which"/><l>word</l></block><script><block s="doReport"><custom-block s="combine %l with delimiter %s"><block s="reportCDR"><block s="reportTextSplit"><block var="data"/><block var="which"/></block></block><l> </l></custom-block></block></script></block><block s="doReport"><block s="reportJoinWords"><list><block s="reportCDR"><block s="reportTextSplit"><block var="data"/><block var="which"/></block></block></list></block></block></script></block><block s="doIf"><block s="reportEquals"><block var="fl"/><l>last</l></block><script><block s="doDeclareVariables"><list><l>res</l></list></block><block s="doSetVar"><l>res</l><custom-block s="copy of %l"><block s="reportTextSplit"><block var="data"/><block var="which"/></block></custom-block></block><block s="doDeleteFromList"><l><option>last</option></l><block var="res"/></block><block s="doIf"><block s="reportEquals"><block var="which"/><l>word</l></block><script><block s="doReport"><custom-block s="combine %l with delimiter %s"><block var="res"/><l> </l></custom-block></block></script></block><block s="doReport"><block s="reportJoinWords"><list><block var="res"/></list></block></block></script></block><block s="doReport"><block var="data"/></block></script></block-definition><block-definition s="combine %&apos;data&apos; with delimiter %&apos;delim&apos;" type="reporter" category="operators"><header></header><code></code><translations></translations><inputs><input type="%l"></input><input type="%s">,</input></inputs><script><block s="doReport"><block s="reportCombine"><block var="data"/><block s="reifyReporter"><autolambda><block s="reportJoinWords"><list><l></l><block var="delim"/><l></l></list></block></autolambda><list></list></block></block></block></script></block-definition><block-definition s="is %&apos;string&apos; %&apos;which&apos; ?" type="predicate" category="operators"><header></header><code></code><translations></translations><inputs><input type="%s">PINK GIRL</input><input type="%s" readonly="true">uppercased<options>uppercased&#xD;lowercased&#xD;capitalized&#xD;line capitalized&#xD;full capitalized</options></input></inputs><script><block s="doReport"><block s="reportIsIdentical"><block var="string"/><custom-block s="%s string %s"><custom-block s="all but %s %s of %s"><l>last</l><l>letter</l><block var="which"/></custom-block><block var="string"/></custom-block></block></block></script></block-definition><block-definition s="copy of %&apos;data&apos;" type="reporter" category="lists"><header></header><code></code><translations></translations><inputs><input type="%l"></input></inputs><script><block s="doReport"><block s="reportMap"><block s="reifyReporter"><autolambda><block s="reportIfElse"><block s="reportIsA"><l></l><l><option>list</option></l></block><custom-block s="copy of %l"><l/></custom-block><l></l></block></autolambda><list></list></block><block var="data"/></block></block></script></block-definition><block-definition s="latin %&apos;latin&apos; as number" type="reporter" category="operators"><comment x="0" y="0" w="211" collapsed="false">Returns the roman number as actual number&#xD;e.g.&#xD;IV = 4&#xD;XL = 40&#xD;CD = 400&#xD;CLM = 1050&#xD;MMMM = 4000</comment><header></header><code></code><translations>el:λατίνα _ ως νούμερο&#xD;de:Latein _ als zahl&#xD;</translations><inputs><input type="%s">MDCLXVI</input></inputs><script><block s="doIf"><block s="reportAnd"><custom-block s="setting %s"><l>hyper blocks support</l></custom-block><block s="reportIsA"><block var="latin"/><l><option>list</option></l></block></block><script><block s="doReport"><block s="reportMap"><block s="reifyReporter"><autolambda><custom-block s="latin %s as number"><l></l></custom-block></autolambda><list></list></block><block var="latin"/></block></block></script></block><block s="doIf"><block s="reportListContainsItem"><block s="reportMap"><block s="reifyPredicate"><autolambda><block s="reportNot"><block s="reportListContainsItem"><block s="reportNewList"><list><l>I</l><l>V</l><l>X</l><l>L</l><l>C</l><l>D</l><l>M</l></list></block><l></l></block></block></autolambda><list></list></block><block s="reportTextSplit"><block var="latin"/><l><option>letter</option></l></block></block><block s="reportBoolean"><l><bool>true</bool></l></block></block><script><custom-block s="throw %s %s"><l>Error</l><block s="reportJoinWords"><list><l>Invalid latin symbol </l><block s="reportFindFirst"><block s="reifyPredicate"><autolambda><block s="reportNot"><block s="reportListContainsItem"><block s="reportNewList"><list><l>I</l><l>V</l><l>X</l><l>L</l><l>C</l><l>D</l><l>M</l></list></block><l></l></block></block></autolambda><list></list></block><block s="reportTextSplit"><block var="latin"/><l><option>letter</option></l></block></block></list></block></custom-block></script></block><block s="doReport"><block s="reportCombine"><block s="reportMap"><block s="reifyReporter"><autolambda><block s="reportListItem"><l>1</l><block s="reportCDR"><block s="reportFindFirst"><block s="reifyPredicate"><autolambda><block s="reportEquals"><block s="reportListItem"><l>1</l><block var="each pair"/></block><block var="each letter"/></block></autolambda><list><l>each pair</l></list></block><block s="reportNewList"><list><block s="reportNewList"><list><l>I</l><l>1</l></list></block><block s="reportNewList"><list><l>V</l><l>5</l></list></block><block s="reportNewList"><list><l>X</l><l>10</l></list></block><block s="reportNewList"><list><l>L</l><l>50</l></list></block><block s="reportNewList"><list><l>C</l><l>100</l></list></block><block s="reportNewList"><list><l>D</l><l>500</l></list></block><block s="reportNewList"><list><l>M</l><l>1000</l></list></block></list></block></block></block></block></autolambda><list><l>each letter</l></list></block><block s="reportTextSplit"><block var="latin"/><l><option>letter</option></l></block></block><block s="reifyReporter"><autolambda><block s="reportIfElse"><block s="reportLessThan"><block var="#1"/><block s="reportListItem"><block s="reportSum"><block var="index"/><l>1</l></block><block var="list"/></block></block><block s="reportSum"><block s="reportDifference"><block s="reportListItem"><block s="reportSum"><block var="index"/><l>1</l></block><block var="list"/></block><block var="#1"/></block><block s="reportDifference"><block var="#2"/><block s="reportListItem"><block s="reportSum"><block var="index"/><l>1</l></block><block var="list"/></block></block></block><block s="reportSum"><block var="#1"/><block var="#2"/></block></block></autolambda><list><l>#1</l><l>#2</l><l>index</l><l>list</l></list></block></block></block></script></block-definition><block-definition s="number %&apos;number&apos; as latin" type="reporter" category="operators"><comment x="0" y="0" w="318" collapsed="false">Returns the actual number as roman number, Can be slow for large operations.&#xD;e.g.&#xD;4 = IV&#xD;40 = XL&#xD;400 = CD&#xD;1050 = CLM&#xD;4000 = MMMM</comment><header></header><code></code><translations>el:νούμερο _ ως λατίνα&#xD;de:Zahl _ als Latein&#xD;</translations><inputs><input type="%n">1666</input></inputs><script><block s="doWarp"><script><block s="doIf"><block s="reportAnd"><custom-block s="setting %s"><l>hyper blocks support</l></custom-block><block s="reportIsA"><block var="number"/><l><option>list</option></l></block></block><script><block s="doReport"><block s="reportMap"><block s="reifyReporter"><autolambda><custom-block s="number %n as latin"><l></l></custom-block></autolambda><list></list></block><block var="number"/></block></block></script></block><block s="doIf"><block s="reportLessThan"><block var="number"/><l>0</l></block><script><custom-block s="throw %s %s"><l>Error</l><l>Cannot get latin for negative numbers</l></custom-block></script></block><block s="doDeclareVariables"><list><l>symbols</l><l>output</l></list></block><block s="doSetVar"><l>symbols</l><block s="reportNewList"><list><block s="reportNewList"><list><l>I</l><l>1</l></list></block><block s="reportNewList"><list><l>V</l><l>5</l></list></block><block s="reportNewList"><list><l>X</l><l>10</l></list></block><block s="reportNewList"><list><l>L</l><l>50</l></list></block><block s="reportNewList"><list><l>C</l><l>100</l></list></block><block s="reportNewList"><list><l>D</l><l>500</l></list></block><block s="reportNewList"><list><l>M</l><l>1000</l></list></block><block s="reportNewList"><list><l>M̅</l><l>1000000</l></list></block></list></block></block><block s="doSetVar"><l>output</l><l></l></block><block s="doUntil"><block s="reportEquals"><block var="number"/><l>0</l></block><script><block s="doDeclareVariables"><list><l>symbol</l><l>higher</l></list></block><block s="doSetVar"><l>symbol</l><block s="reportFindFirst"><block s="reifyPredicate"><autolambda><block s="reportOr"><block s="reportEquals"><block var="index"/><block s="reportListAttribute"><l><option>length</option></l><block var="symbols"/></block></block><block s="reportAnd"><block s="reportLessThanOrEquals"><block s="reportListItem"><l>2</l><block var="value"/></block><block var="number"/></block><block s="reportGreaterThan"><block s="reportListItem"><l>2</l><block s="reportListItem"><block s="reportSum"><block var="index"/><l>1</l></block><block var="symbols"/></block></block><block var="number"/></block></block></block></autolambda><list><l>value</l><l>index</l></list></block><block var="symbols"/></block></block><block s="doSetVar"><l>higher</l><block s="reportListItem"><block s="reportSum"><block s="reportListIndex"><block var="symbol"/><block var="symbols"/></block><l>1</l></block><block var="symbols"/></block></block><block s="doIf"><block var="higher"/><script><block s="doFor"><l>i</l><l>1</l><block s="reportListIndex"><block var="symbol"/><block var="symbols"/></block><script><block s="doIf"><block var="higher"/><script><block s="doDeclareVariables"><list><l>sn</l><l>hn</l></list></block><block s="doSetVar"><l>sn</l><block s="reportListItem"><l>2</l><block s="reportListItem"><block var="i"/><block var="symbols"/></block></block></block><block s="doSetVar"><l>hn</l><block s="reportListItem"><l>2</l><block var="higher"/></block></block><block s="doIf"><block s="reportAnd"><block s="reportNotEquals"><block s="reportDifference"><block var="hn"/><block var="sn"/></block><block var="sn"/></block><block s="reportEquals"><block s="reportDifference"><block var="hn"/><block var="sn"/></block><block s="reportProduct"><block s="reportMonadic"><l><option>floor</option></l><block s="reportQuotient"><block var="number"/><block var="sn"/></block></block><block var="sn"/></block></block></block><script><block s="doSetVar"><l>output</l><block s="reportJoinWords"><list><block var="output"/><block s="reportListItem"><l>1</l><block s="reportListItem"><block var="i"/><block var="symbols"/></block></block><block s="reportListItem"><l>1</l><block var="higher"/></block></list></block></block><block s="doChangeVar"><l>number</l><block s="reportDifference"><l></l><block s="reportProduct"><block s="reportMonadic"><l><option>floor</option></l><block s="reportQuotient"><block var="number"/><block var="sn"/></block></block><block var="sn"/></block></block></block><block s="doSetVar"><l>higher</l><block s="reportBoolean"><l><bool>false</bool></l></block></block><block s="doSetVar"><l>i</l><block s="reportSum"><block s="reportListAttribute"><l><option>length</option></l><block var="symbols"/></block><l>1</l></block></block></script></block></script></block></script></block></script></block><block s="doIf"><block s="reportNotEquals"><block var="higher"/><block s="reportBoolean"><l><bool>false</bool></l></block></block><script><block s="doSetVar"><l>output</l><block s="reportJoinWords"><list><block var="output"/><block s="reportListItem"><l>1</l><block var="symbol"/></block></list></block></block><block s="doChangeVar"><l>number</l><block s="reportDifference"><l></l><block s="reportListItem"><l>2</l><block var="symbol"/></block></block></block></script></block></script></block><block s="doReport"><block var="output"/></block></script></block></script></block-definition><block-definition s="throw %&apos;err&apos; %&apos;msg&apos;" type="command" category="control"><comment x="0" y="0" w="268.6666666666667" collapsed="false">Throw an error.&#xD;&#xD;Makes a red halo appear around the script that runs it,&#xD;with the input text shown in a speech balloon next to&#xD;the script, just like any Snap! error.&#xD;&#xD;This is useful to put in the second script of SAFELY TRY&#xD;after some other instructions to undo the partial work of&#xD;the first script.</comment><header></header><code></code><translations>pt:lança o erro _&#xD;el:σφάλμα _&#xD;de:Error _&#xD;</translations><inputs><input type="%s">Error</input><input type="%s"></input></inputs><script><block s="doRun"><block s="reportJSFunction"><list><l>msg</l><l>n</l></list><l>throw {name: n, message: msg};</l></block><list><block var="msg"/><block var="err"/></list></block></script></block-definition><block-definition s="%&apos;first&apos; $- %&apos;option&apos; $- %&apos;second&apos;" type="predicate" category="operators"><header></header><code></code><translations></translations><inputs><input type="%s">raincoat</input><input type="%s" readonly="true">contains<options>contains&#xD;starts with&#xD;ends with</options></input><input type="%s">coat</input></inputs><script><block s="doIf"><block s="reportEquals"><block var="option"/><l>contains</l></block><script><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list><l>a</l><l>b</l></list><l>return a.includes(b);</l></block><list><block var="first"/><block var="second"/></list></block></block></script></block><block s="doIf"><block s="reportEquals"><block var="option"/><l>starts with</l></block><script><block s="doReport"><block s="reportEquals"><custom-block s="letters %n - %n of %txt"><l>1</l><block s="reportStringSize"><block var="second"/></block><block var="first"/></custom-block><block var="second"/></block></block></script></block><block s="doIf"><block s="reportEquals"><block var="option"/><l>ends with</l></block><script><block s="doReport"><block s="reportEquals"><custom-block s="reverse string %s"><custom-block s="letters %n - %n of %txt"><block s="reportStringSize"><block var="first"/></block><block s="reportSum"><block s="reportDifference"><block s="reportStringSize"><block var="first"/></block><block s="reportStringSize"><block var="second"/></block></block><l>1</l></block><block var="first"/></custom-block></custom-block><block var="second"/></block></block></script></block><block s="doReport"><l></l></block></script><scripts><script x="85.46191406250003" y="72.66666666666666"><block var="which"/></script><script x="134.2822265625" y="166.16666666666669"><block var="which"/></script></scripts></block-definition><block-definition s="letters %&apos;a&apos; - %&apos;b&apos; of %&apos;text&apos;" type="reporter" category="operators"><header></header><code></code><translations></translations><inputs><input type="%n">1</input><input type="%n">3</input><input type="%txt">world</input></inputs><script><block s="doIf"><block s="reportAnd"><block s="reportIsA"><block var="text"/><l><option>list</option></l></block><custom-block s="setting %s"><l>hyper blocks support</l></custom-block></block><script><block s="doReport"><block s="reportMap"><block s="reifyReporter"><autolambda><custom-block s="letters %n - %n of %txt"><block var="a"/><block var="b"/><l></l></custom-block></autolambda><list></list></block><block var="text"/></block></block></script></block><block s="doReport"><block s="reportJoinWords"><list><block s="reportLetter"><block s="reportNumbers"><block var="a"/><block var="b"/></block><block var="text"/></block></list></block></block></script></block-definition><block-definition s="reverse string %&apos;string&apos;" type="reporter" category="operators"><header></header><code></code><translations></translations><inputs><input type="%s">world</input></inputs><script><block s="doReport"><block s="reportJoinWords"><list><block s="reportListAttribute"><l><option>reverse</option></l><block s="reportTextSplit"><block var="string"/><l><option>letter</option></l></block></block></list></block></block></script></block-definition><block-definition s="scramble string %&apos;str&apos;" type="reporter" category="operators"><header></header><code></code><translations></translations><inputs><input type="%s">world</input></inputs><script><block s="doReport"><block s="reportCombine"><block s="reportTextSplit"><block var="str"/><l><option>letter</option></l></block><block s="reifyReporter"><autolambda><block s="reportIfElse"><custom-block s="%n % chance true"><l>50</l></custom-block><block s="reportJoinWords"><list><block var="#2"/><block var="#1"/></list></block><block s="reportJoinWords"><list><block var="#1"/><block var="#2"/></list></block></block></autolambda><list><l>#1</l><l>#2</l></list></block></block></block></script></block-definition><block-definition s="%&apos;c&apos; % chance true" type="predicate" category="operators"><header></header><code></code><translations></translations><inputs><input type="%n">50</input></inputs><script><block s="doReport"><block s="reportLessThanOrEquals"><block s="reportRandom"><l>1</l><l>100</l></block><block var="c"/></block></block></script></block-definition><block-definition s="shuffle %&apos;data&apos;" type="reporter" category="lists"><header></header><code></code><translations></translations><inputs><input type="%l"></input></inputs><script><block s="doSetVar"><l>data</l><custom-block s="copy of %l"><block var="data"/></custom-block></block><block s="doWarp"><script><custom-block s="for %upvar %upvar in %l %ca"><l>index</l><l>value</l><block var="data"/><script><block s="doIf"><block s="reportAnd"><custom-block s="%n % chance true"><l>50</l></custom-block><block s="reportNot"><block s="reportEquals"><block var="index"/><block s="reportListAttribute"><l><option>length</option></l><block var="data"/></block></block></block></block><script><block s="doRun"><block s="reifyScript"><script><block s="doReplaceInList"><block var="index"/><block var="data"/><block s="reportListItem"><block s="reportSum"><block var="index"/><l>1</l></block><block var="data"/></block></block><block s="doReplaceInList"><block s="reportSum"><block var="index"/><l>1</l></block><block var="data"/><block var="x"/></block></script><list><l>x</l></list></block><list><block var="value"/></list></block></script></block></script></custom-block></script></block><block s="doReport"><block var="data"/></block></script></block-definition><block-definition s="write %&apos;txt&apos; size %&apos;size&apos; with wrapping" type="command" category="pen"><header></header><code></code><translations></translations><inputs><input type="%mlt">Hello!&#xD;How are you?&#xD;Are you okay?</input><input type="%n">12</input></inputs><script><block s="doWarp"><script><block s="doDeclareVariables"><list><l>origin</l><l>newline</l><l>sbl</l><l>offset</l><l>prev</l></list></block><block s="doSetVar"><l>origin</l><block s="reportNewList"><list><block s="reportNewList"><list><block s="xPosition"></block><block s="yPosition"></block></list></block><block s="direction"></block></list></block></block><block s="doSetVar"><l>newline</l><block s="reifyScript"><script><block s="doSetVar"><l>prev</l><block s="getPenDown"></block></block><block s="up"></block><block s="doGotoObject"><block s="reportListItem"><l>1</l><block var="origin"/></block></block><block s="turn"><l>90</l></block><block s="forward"><block s="reportProduct"><block var="x"/><block var="size"/></block></block><block s="turnLeft"><l>90</l></block><block s="doIfElse"><block var="prev"/><script><block s="down"></block></script><script><block s="up"></block></script></block></script><list><l>x</l></list></block></block><block s="doSetVar"><l>sbl</l><block s="reportTextSplit"><block var="txt"/><l><option>line</option></l></block></block><custom-block s="for %upvar %upvar in %l %ca"><l>index</l><l>line</l><block var="sbl"/><script><custom-block s="for %upvar %upvar in %l %ca"><l>idx</l><l>word</l><block s="reportTextSplit"><block var="line"/><l> </l></block><script><block s="doIf"><block s="reportGreaterThan"><block s="reportSum"><block s="xPosition"></block><block s="reportProduct"><block s="reportProduct"><block s="reportQuotient"><l>7</l><l>12</l></block><block var="size"/></block><block s="reportStringSize"><block var="word"/></block></block></block><block s="reportAttributeOf"><l><option>right</option></l><l>Stage</l></block></block><script><block s="doRun"><block var="newline"/><list><block s="reportSum"><block var="index"/><block var="offset"/></block></list></block><block s="doChangeVar"><l>offset</l><l>1</l></block></script></block><block s="write"><block var="word"/><block var="size"/></block><block s="doIf"><block s="reportNot"><block s="reportEquals"><block var="idx"/><block s="reportListAttribute"><l><option>length</option></l><block s="reportTextSplit"><block var="line"/><l> </l></block></block></block></block><script><block s="write"><l> </l><block var="size"/></block></script></block></script></custom-block><block s="doIf"><block s="reportNot"><block s="reportEquals"><block var="index"/><block s="reportListAttribute"><l><option>length</option></l><block var="sbl"/></block></block></block><script><block s="doRun"><block var="newline"/><list><block s="reportSum"><block var="index"/><block var="offset"/></block></list></block></script></block></script></custom-block><block s="setHeading"><block s="reportListItem"><l>2</l><block var="origin"/></block></block></script></block></script></block-definition><block-definition s="for %&apos;index&apos; %&apos;value&apos; in %&apos;data&apos; %&apos;function&apos;" type="command" category="lists"><header></header><code></code><translations></translations><inputs><input type="%upvar"></input><input type="%upvar"></input><input type="%l"></input><input type="%ca"></input></inputs><script><block s="doForEach"><l>item</l><block var="data"/><script><block s="doSetVar"><l>value</l><block var="item"/></block><block s="doChangeVar"><l>index</l><l>1</l></block><block s="doRun"><block var="function"/><list></list></block></script></block></script></block-definition><block-definition s="all %&apos;which&apos;" type="reporter" category="sensing"><comment x="0" y="0" w="227.9876302083336" collapsed="false">Sprites: All the sprites (not including the stage).&#xD;Clones: Every clone from every sprite.&#xD;Objects: Both sprites and clones.</comment><header></header><code></code><translations></translations><inputs><input type="%s" readonly="true">sprites<options>sprites&#xD;clones&#xD;objects</options></input></inputs><script><block s="doIf"><block s="reportEquals"><block var="which"/><l>sprites</l></block><script><block s="doIf"><block s="reportEquals"><block s="reportObject"><l><option>myself</option></l></block><block s="reportGet"><l><option>stage</option></l></block></block><script><block s="doReport"><block s="reportKeep"><block s="reifyPredicate"><autolambda><block s="reportNot"><block s="reportAskFor"><l></l><block s="reifyReporter"><autolambda><custom-block s="am I a clone?"></custom-block></autolambda><list></list></block><list></list></block></block></autolambda><list></list></block><block s="reportGet"><l><option>other sprites</option></l></block></block></block></script></block><block s="doReport"><block s="reportKeep"><block s="reifyPredicate"><autolambda><block s="reportNot"><block s="reportAskFor"><l></l><block s="reifyReporter"><autolambda><custom-block s="am I a clone?"></custom-block></autolambda><list></list></block><list></list></block></block></autolambda><list></list></block><block s="reportCONS"><block s="reportObject"><l><option>myself</option></l></block><block s="reportGet"><l><option>other sprites</option></l></block></block></block></block></script></block><block s="doIf"><block s="reportEquals"><block var="which"/><l>clones</l></block><script><block s="doReport"><block s="reportConcatenatedLists"><block s="reportMap"><block s="reifyReporter"><autolambda><block s="reportAskFor"><l></l><block s="reifyReporter"><autolambda><block s="reportGet"><l><option>clones</option></l></block></autolambda><list></list></block><list></list></block></autolambda><list></list></block><custom-block s="all %s"><l>sprites</l></custom-block></block></block></block></script></block><block s="doIf"><block s="reportEquals"><block var="which"/><l>objects</l></block><script><block s="doReport"><block s="reportConcatenatedLists"><list><custom-block s="all %s"><l>sprites</l></custom-block><custom-block s="all %s"><l>clones</l></custom-block></list></block></block></script></block><block s="doReport"><block s="reportNewList"><list></list></block></block></script></block-definition><block-definition s="am I a clone?" type="predicate" category="sensing"><header></header><code></code><translations></translations><inputs></inputs><script><block s="doReport"><block s="reportNot"><block s="reportEquals"><block s="reportGet"><l><option>parent</option></l></block><l></l></block></block></block></script></block-definition><block-definition s="pos %&apos;n&apos; in %&apos;small&apos; - %&apos;large&apos;" type="reporter" category="operators"><header></header><code></code><translations></translations><inputs><input type="%n">11</input><input type="%n">1</input><input type="%n">10</input></inputs><script><block s="doReport"><custom-block s="%s %s %s"><block var="small"/><l>max</l><custom-block s="%s %s %s"><block var="n"/><l>min</l><block var="large"/></custom-block></custom-block></block></script></block-definition><block-definition s="%&apos;a&apos; %&apos;which&apos; %&apos;b&apos;" type="reporter" category="operators"><header></header><code></code><translations></translations><inputs><input type="%s"></input><input type="%s" readonly="true">min<options>min&#xD;max</options></input><input type="%s"></input></inputs><script><block s="doReport"><block s="reportIfElse"><block s="reportEquals"><block var="which"/><l>max</l></block><block s="reportIfElse"><block s="reportGreaterThan"><block var="a"/><block var="b"/></block><block var="a"/><block var="b"/></block><block s="reportIfElse"><block s="reportLessThan"><block var="a"/><block var="b"/></block><block var="a"/><block var="b"/></block></block></block></script></block-definition><block-definition s="indices of %&apos;small&apos; in text %&apos;large&apos;" type="reporter" category="operators"><header></header><code></code><translations></translations><inputs><input type="%s">o</input><input type="%txt">hello world</input></inputs><script><block s="doDeclareVariables"><list><l>total</l></list></block><block s="doReport"><custom-block s="all but %n of %l"><l>last</l><block s="reportMap"><block s="reifyScript"><script><block s="doChangeVar"><l>total</l><block s="reportSum"><block s="reportStringSize"><block var="x"/></block><l>1</l></block></block><block s="doReport"><block var="total"/></block></script><list><l>x</l></list></block><block s="reportTextSplit"><block var="large"/><block var="small"/></block></block></custom-block></block></script></block-definition><block-definition s="all but %&apos;n&apos; of %&apos;data&apos;" type="reporter" category="lists"><header></header><code></code><translations></translations><inputs><input type="%n">1<options>1&#xD;last&#xD;random</options></input><input type="%l"></input></inputs><script><block s="doIf"><block s="reportEquals"><block var="n"/><l>random</l></block><script><block s="doSetVar"><l>n</l><block s="reportRandom"><l>1</l><block s="reportListAttribute"><l><option>length</option></l><block var="data"/></block></block></block></script></block><block s="doSetVar"><l>data</l><custom-block s="copy of %l"><block var="data"/></custom-block></block><block s="doDeleteFromList"><block var="n"/><block var="data"/></block><block s="doReport"><block var="data"/></block></script></block-definition><block-definition s="stage image" type="reporter" category="looks"><header></header><code></code><translations></translations><inputs></inputs><script><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list></list><l>return new Costume(world.children[0].stage.fullImage(), &apos;snapshot&apos;);</l></block><list></list></block></block></script></block-definition><block-definition s="pause %&apos;which&apos; $pause-1-255-220-0" type="command" category="control"><comment x="0" y="0" w="98" collapsed="false">Pause a selected range of processes.</comment><header></header><code></code><translations></translations><inputs><input type="%s" readonly="true">all<options>all&#xD;this script&#xD;all but this script</options></input></inputs><script><block s="doIfElse"><block s="reportEquals"><block var="which"/><l>this script</l></block><script><block s="doRun"><block s="reportJSFunction"><list><l>proc</l></list><l>proc.isPaused = true;</l></block><list></list></block></script><script><block s="doIfElse"><block s="reportEquals"><block var="which"/><l>all but this script</l></block><script><block s="doRun"><block s="reportJSFunction"><list><l>x</l></list><l>var procs = world.children[0].stage.threads.processes;&#xD;if (procs.length &lt; 1) return;&#xD;x.pauseShieldFlag = null;&#xD;procs.forEach(&#xD;function (proc) {&#xD;if (!("pauseShieldFlag" in proc)){&#xD;proc.pause();&#xD;}})&#xD;delete x.pauseShieldFlag;</l></block><list></list></block></script><script><block s="doPauseAll"></block></script></block></script></block></script></block-definition><block-definition s="unpause all $pointRight-1.1-255-220-0" type="command" category="control"><comment x="0" y="0" w="90" collapsed="false">Unpause each paused process.</comment><header></header><code></code><translations></translations><inputs></inputs><script><block s="doRun"><block s="reportJSFunction"><list></list><l>world.children[0].stage.threads.processes.forEach(&#xD;function (proc) {&#xD;proc.isPaused = false;&#xD;})</l></block><list></list></block></script></block-definition><block-definition s="$flash indices of %&apos;item&apos; in %&apos;data&apos;" type="reporter" category="lists"><header></header><code></code><translations></translations><inputs><input type="%s">thing</input><input type="%l"></input></inputs><script><block s="doReport"><block s="reportKeep"><block s="reifyPredicate"><autolambda><block s="reportNot"><block s="reportEquals"><l></l><block s="reportMonadic"><l><option>sqrt</option></l><l>577</l></block></block></block></autolambda><list></list></block><block s="reportMap"><block s="reifyReporter"><autolambda><block s="reportIfElse"><block s="reportEquals"><block var="x"/><block var="item"/></block><block var="y"/><block s="reportMonadic"><l><option>sqrt</option></l><l>577</l></block></block></autolambda><list><l>x</l><l>y</l></list></block><block var="data"/></block></block></block></script></block-definition><block-definition s="ignore %&apos;x&apos;" type="command" category="control"><header></header><code></code><translations></translations><inputs><input type="%s"></input></inputs></block-definition><block-definition s="my resolution" type="reporter" category="looks"><header></header><code></code><translations></translations><inputs></inputs><script><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list></list><l>function fix(n) {&#xD;return (Math.round((n * (10 ^ 15)))) / (10 ^ 15);&#xD;}&#xD;return new List([&#xD;      fix(this.bounds.width()),&#xD;           fix(this.bounds.height())&#xD;]);</l></block><list></list></block></block></script></block-definition><block-definition s="set cookie %&apos;key&apos; %&apos;value&apos; $nl $- expires in %&apos;exp&apos; days" type="command" category="sensing"><header></header><code></code><translations></translations><inputs><input type="%s">score</input><input type="%s"></input><input type="%n">365</input></inputs><script><block s="doRun"><block s="reportJSFunction"><list><l>cn</l><l>cv</l><l>ex</l><l>proc</l></list><l>var type = proc.reportTypeOf(cv);&#xD;if (!([&apos;text&apos;,&apos;number&apos;].includes(type)))&#xD;throw new Error(&apos;expecting text/number but getting &apos; + type);&#xD;var d = new Date();&#xD;d.setTime(d.getTime() + (ex*24*60*60*1000));&#xD;var expires = "expires="+ d.toUTCString();&#xD;document.cookie = cn + "=" + cv + ";" + expires + ";path=/";</l></block><list><block var="key"/><block var="value"/><block var="exp"/></list></block></script></block-definition><block-definition s="get cookie %&apos;name&apos;" type="reporter" category="sensing"><header></header><code></code><translations></translations><inputs><input type="%s">score</input></inputs><script><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list><l>cn</l></list><l>  var name = cn + "=";&#xD;  var decodedCookie = decodeURIComponent(document.cookie);&#xD;  var ca = decodedCookie.split(&apos;;&apos;);&#xD;  for(var i = 0; i &lt;ca.length; i++) {&#xD;    var c = ca[i];&#xD;    while (c.charAt(0) == &apos; &apos;) {&#xD;      c = c.substring(1);&#xD;    }&#xD;    if (c.indexOf(name) == 0) {&#xD;      return c.substring(name.length, c.length);&#xD;    }&#xD;  }&#xD;  return false;</l></block><list><block var="name"/></list></block></block></script></block-definition><block-definition s="cookie %&apos;name&apos; exists?" type="predicate" category="sensing"><header></header><code></code><translations></translations><inputs><input type="%s">score</input></inputs><script><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list><l>cn</l></list><l>    return document.cookie.split(&apos;;&apos;).some(c =&gt; {&#xD;        return c.trim().startsWith(cn + &apos;=&apos;)});</l></block><list><block var="name"/></list></block></block></script></block-definition><block-definition s="for %&apos;i&apos; = %&apos;start&apos; to %&apos;end&apos; step %&apos;step&apos; %&apos;action&apos;" type="command" category="control"><header></header><code></code><translations></translations><inputs><input type="%upvar"></input><input type="%n">1</input><input type="%n">10</input><input type="%n">2</input><input type="%ca"></input></inputs><script><block s="doSetVar"><l>i</l><block var="start"/></block><block s="doRepeat"><block s="reportQuotient"><block var="end"/><block var="step"/></block><script><block s="doChangeVar"><l>i</l><block var="step"/></block><block s="doRun"><block var="action"/><list></list></block></script></block></script></block-definition><block-definition s="delete cookie %&apos;name&apos;" type="command" category="sensing"><header></header><code></code><translations></translations><inputs><input type="%s">score</input></inputs><script><block s="doRun"><block s="reportJSFunction"><list><l>cn</l></list><l>document.cookie = cn +&apos;=; Path=/; Expires=Thu, 01 Jan 1970 00:00:01 GMT;&apos;;</l></block><list><block var="name"/></list></block></script></block-definition><block-definition s="index of %&apos;small&apos; in text %&apos;large&apos;" type="reporter" category="operators"><header></header><code></code><translations></translations><inputs><input type="%s">a</input><input type="%s">cat</input></inputs><script><block s="doReport"><block s="reportSum"><block s="reportStringSize"><block s="reportListItem"><l>1</l><block s="reportTextSplit"><block var="large"/><block var="small"/></block></block></block><l>1</l></block></block></script></block-definition><block-definition s="12-hour time" type="reporter" category="sensing"><header></header><code></code><translations></translations><inputs></inputs><script><block s="doReport"><block s="reportJoinWords"><list><block s="reportIfElse"><block s="reportGreaterThan"><block s="reportDate"><l><option>hour</option></l></block><l>12</l></block><block s="reportDifference"><block s="reportDate"><l><option>hour</option></l></block><l>12</l></block><block s="reportDate"><l><option>hour</option></l></block></block><l>:</l><block s="reportIfElse"><block s="reportLessThan"><block s="reportDate"><l><option>minute</option></l></block><l>10</l></block><block s="reportJoinWords"><list><l>0</l><block s="reportDate"><l><option>minute</option></l></block></list></block><block s="reportDate"><l><option>minute</option></l></block></block><l> </l><block s="reportIfElse"><block s="reportGreaterThan"><block s="reportDate"><l><option>hour</option></l></block><l>12</l></block><l>PM</l><l>AM</l></block></list></block></block></script></block-definition><block-definition s="directory item %&apos;indices&apos; of %&apos;array&apos;" type="reporter" category="lists"><header></header><code></code><translations></translations><inputs><input type="%l"></input><input type="%l"></input></inputs><script><block s="doIfElse"><block s="reportEquals"><block s="reportListAttribute"><l><option>length</option></l><block var="indices"/></block><l>1</l></block><script><block s="doReport"><block s="reportListItem"><block s="reportListItem"><l>1</l><block var="indices"/></block><block var="array"/></block></block></script><script><block s="doReport"><custom-block s="directory item %l of %l"><block s="reportCDR"><block var="indices"/></block><block s="reportListItem"><block s="reportListItem"><l>1</l><block var="indices"/></block><block var="array"/></block></custom-block></block></script></block></script></block-definition><block-definition s="constant %&apos;which&apos;" type="reporter" category="operators"><header></header><code></code><translations></translations><inputs><input type="%s" readonly="true">pi<options>e&#xD;pi&#xD;phi&#xD;weekdays&#xD;months&#xD;latin alphabet</options></input></inputs><script><block s="doReport"><block s="reportListItem"><block s="reportListIndex"><block var="which"/><block s="reportNewList"><list><l>pi</l><l>phi</l><l>e</l><l>weekdays</l><l>months</l><l>latin alphabet</l></list></block></block><block s="reportNewList"><list><l>3.14159265358</l><l>1.61803398875</l><l>2.71828182845</l><block s="reportNewList"><list><l>Sunday</l><l>Monday</l><l>Tuesday</l><l>Wednesday</l><l>Thursday</l><l>Friday</l><l>Saturday</l></list></block><block s="reportNewList"><list><l>January</l><l>February</l><l>March</l><l>April</l><l>May</l><l>June</l><l>July</l><l>August</l><l>September</l><l>October</l><l>November</l><l>December</l></list></block><block s="reportTextSplit"><l>abcdefghijklmnopqrstuvwxyz</l><l><option>letter</option></l></block></list></block></block></block></script></block-definition><block-definition s="noop" type="reporter" category="control"><header></header><code></code><translations></translations><inputs></inputs><script><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list></list><l>var stage = this.parentThatIsA(StageMorph);&#xD;if (!stage.counter){&#xD;stage.counter=0;&#xD;return 0;&#xD;} else {&#xD;return stage.counter;&#xD;}</l></block><list></list></block></block></script></block-definition><block-definition s="incr counter" type="command" category="control"><header></header><code></code><translations></translations><inputs></inputs><script><block s="doRun"><block s="reportJSFunction"><list></list><l>var stage = this.parentThatIsA(StageMorph);&#xD;if (stage.counter == undefined){&#xD;stage.counter = 1;&#xD;} else {&#xD;stage.counter++;&#xD;}</l></block><list></list></block></script></block-definition><block-definition s="return counter" type="command" category="control"><header></header><code></code><translations></translations><inputs></inputs><script><block s="doRun"><block s="reportJSFunction"><list></list><l>world.children[0].stage.counter = 0;</l></block><list></list></block></script></block-definition><block-definition s="$camera snap" type="reporter" category="sensing"><comment x="0" y="0" w="216" collapsed="false">takes a snapshot with the webcam and reports it as a new costume, or zero if the user cancels</comment><header></header><code></code><translations>pt:$camera a imagem actual do vídeo&#xD;</translations><inputs></inputs><script><block s="doDeclareVariables"><list><l>accessors</l></list></block><block s="doSetVar"><l>accessors</l><block s="evaluate"><block s="reportJSFunction"><list></list><l>var camDialog,&#xD;    result = false;&#xD;&#xD;camDialog = new CamSnapshotDialogMorph(&#xD;    this.parentThatIsA(IDE_Morph),&#xD;    this,&#xD;    function () {result = null; },&#xD;    function (costume) {&#xD;        result = costume;&#xD;        this.close();&#xD;    }&#xD;);&#xD;&#xD;camDialog.key = &apos;camera&apos;;&#xD;camDialog.popUp(this.world());&#xD;return new List([() =&gt; (!(result == false)), () =&gt; (result||0)]);</l></block><list></list></block></block><block s="doWaitUntil"><block s="evaluate"><block s="reportListItem"><l>1</l><block var="accessors"/></block><list></list></block></block><block s="doReport"><block s="evaluate"><block s="reportListItem"><l>2</l><block var="accessors"/></block><list></list></block></block></script></block-definition><block-definition s="$circleSolid-1-255-0-0 record" type="reporter" category="sensing"><comment x="0" y="0" w="192" collapsed="false">records an audio snippet and reports it as a new sound, or zero if the user cancels</comment><header></header><code></code><translations>pt:$circleSolid-1-255-0-0 uma nova gravação&#xD;</translations><inputs></inputs><script><block s="doDeclareVariables"><list><l>accessors</l></list></block><block s="doSetVar"><l>accessors</l><block s="evaluate"><block s="reportJSFunction"><list></list><l>var soundRecorder,&#xD;    result = false;&#xD;&#xD;soundRecorder = new SoundRecorderDialogMorph(&#xD;    function (audio) {&#xD;        if (audio) {&#xD;            result = new Sound(audio, &apos;recording&apos;);&#xD;        } else {&#xD;            result = null;&#xD;            this.destroy();&#xD;        }&#xD;    }&#xD;);&#xD;&#xD;soundRecorder.cancel = function () {&#xD;    result = null;&#xD;    this.destroy();&#xD;};&#xD;&#xD;soundRecorder.key = &apos;microphone&apos;;&#xD;soundRecorder.popUp(this.world());&#xD;return new List([() =&gt; (!(result == false)), () =&gt; (result||0)]);</l></block><list></list></block></block><block s="doWaitUntil"><block s="evaluate"><block s="reportListItem"><l>1</l><block var="accessors"/></block><list></list></block></block><block s="doReport"><block s="evaluate"><block s="reportListItem"><l>2</l><block var="accessors"/></block><list></list></block></block></script></block-definition><block-definition s="set pen to r: %&apos;r&apos; g: %&apos;g&apos; b: %&apos;b&apos; a: %&apos;a&apos;" type="command" category="pen"><header></header><code></code><translations></translations><inputs><input type="%n">255</input><input type="%n">220</input><input type="%n">0</input><input type="%n">255</input></inputs><script><block s="doRun"><block s="reportJSFunction"><list><l>r,g,b,a</l></list><l>this.color = new Color(&#xD;r, g, b, a);</l></block><list><block var="r"/><block var="g"/><block var="b"/><block var="a"/></list></block></script></block-definition><block-definition s="deep map %&apos;function&apos; over %&apos;data&apos;" type="reporter" category="lists"><header></header><code></code><translations></translations><inputs><input type="%repRing"></input><input type="%l"></input></inputs><script><block s="doReport"><block s="reportMap"><block s="reifyReporter"><autolambda><block s="reportIfElse"><block s="reportIsA"><l></l><l><option>list</option></l></block><custom-block s="deep map %repRing over %l"><block var="function"/><l/></custom-block><block s="evaluate"><block var="function"/><list><l></l></list></block></block></autolambda><list></list></block><block var="data"/></block></block></script></block-definition><block-definition s="all cookie names" type="reporter" category="sensing"><header></header><code></code><translations></translations><inputs></inputs><script><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list></list><l>var cookieArr = document.cookie.split(";");&#xD;var cookieObj = {};&#xD;for(var i = 0; i &lt; cookieArr.length; i++){&#xD;var cookieSeg = cookieArr[i].trim();&#xD;var firstEq = cookieSeg.indexOf("=");&#xD;var name = cookieSeg.substr(0,firstEq);&#xD;var value = cookieSeg.substr(firstEq+1);&#xD;cookieObj[name] = value; }&#xD;return new List(Object.keys(cookieObj));</l></block><list></list></block></block></script></block-definition><block-definition s="frames per second" type="reporter" category="sensing"><comment x="0" y="0" w="90" collapsed="false">Returns the current FPS the project is running at.</comment><header></header><code></code><translations></translations><inputs></inputs><script><custom-block s="let %upvar be %s"><l>before</l><block s="reportDate"><l><option>time in milliseconds</option></l></block></custom-block><block s="doWait"><l>0</l></block><block s="doReport"><block s="reportRound"><block s="reportQuotient"><l>1000</l><block s="reportDifference"><block s="reportDate"><l><option>time in milliseconds</option></l></block><block var="before"/></block></block></block></block></script></block-definition><block-definition s="glide %&apos;n&apos; secs to %&apos;object&apos;" type="command" category="motion"><header></header><code></code><translations></translations><inputs><input type="%n">1</input><input type="%s" readonly="true">mouse-pointer<options>function () {&#xD;var object = {&#xD;&quot;random position&quot; : &quot;random position&quot;,&#xD;&quot;mouse-pointer&quot; : &quot;mouse-pointer&quot;,&#xD;&quot;center&quot; : &quot;center&quot;,&#xD;&quot;&#126;&quot;: &quot;&#126;&quot;,&#xD;};&#xD;var spritesObj = {},&#xD;homeSprite = world.children[0].currentSprite || {name:null};&#xD;world.children[0].sprites.itemsArray().map(e=&gt;e.name).forEach(&#xD;function (spriteName){&#xD;if (spriteName != homeSprite.name){&#xD;spritesObj[spriteName] = spriteName;&#xD;}})&#xD;if (Object.keys(spritesObj).length &lt; 1){&#xD;delete object[&quot;&#126;&quot;];&#xD;}&#xD;return Object.assign(object, spritesObj);&#xD;}</options></input></inputs><script><block s="doIfElse"><block s="reportEquals"><block var="object"/><l>mouse-pointer</l></block><script><block s="doSetVar"><l>object</l><block s="reportNewList"><list><block s="reportMouseX"></block><block s="reportMouseY"></block></list></block></block></script><script><block s="doIfElse"><block s="reportEquals"><block var="object"/><l>random position</l></block><script><block s="doSetVar"><l>object</l><block s="reportNewList"><list><block s="reportRandom"><block s="reportAttributeOf"><l><option>left</option></l><l>Stage</l></block><block s="reportAttributeOf"><l><option>right</option></l><l>Stage</l></block></block><block s="reportRandom"><block s="reportAttributeOf"><l><option>bottom</option></l><l>Stage</l></block><block s="reportAttributeOf"><l><option>top</option></l><l>Stage</l></block></block></list></block></block></script><script><block s="doIfElse"><block s="reportEquals"><block var="object"/><l>center</l></block><script><block s="doSetVar"><l>object</l><block s="reportNewList"><list><l>0</l><l>0</l></list></block></block></script><script><block s="doIfElse"><block s="reportNot"><block s="reportListContainsItem"><block s="reportMap"><block s="reifyReporter"><autolambda><block s="reportAskFor"><l></l><block s="reifyReporter"><autolambda><block s="reportGet"><l><option>name</option></l></block></autolambda><list></list></block><list></list></block></autolambda><list></list></block><block s="reportCONS"><block s="reportObject"><l><option>myself</option></l></block><block s="reportGet"><l><option>other sprites</option></l></block></block></block><block var="object"/></block></block><script><block s="doSetVar"><l>object</l><custom-block s="my coordinates"></custom-block></block></script><script><block s="doSetVar"><l>object</l><block s="evaluate"><block s="reportAttributeOf"><block s="reifyReporter"><autolambda><custom-block s="my coordinates"></custom-block></autolambda><list></list></block><block var="object"/></block><list></list></block></block></script></block></script></block></script></block></script></block><block s="doGlide"><block var="n"/><block s="reportListItem"><l>1</l><block var="object"/></block><block s="reportListItem"><l>2</l><block var="object"/></block></block></script></block-definition><block-definition s="my coordinates" type="reporter" category="motion"><header></header><code></code><translations></translations><inputs></inputs><script><block s="doReport"><block s="reportNewList"><list><block s="xPosition"></block><block s="yPosition"></block></list></block></block></script></block-definition><block-definition s="replace %&apos;find&apos; in %&apos;text&apos; with %&apos;replace&apos;" type="reporter" category="operators"><header></header><code></code><translations></translations><inputs><input type="%s">apples</input><input type="%txt">I like apples</input><input type="%s">bananas</input></inputs><script><block s="doReport"><custom-block s="combine %l with delimiter %s"><block s="reportTextSplit"><block var="text"/><block var="find"/></block><block var="replace"/></custom-block></block></script></block-definition><block-definition s="remove all %&apos;thing&apos; in %&apos;text&apos;" type="reporter" category="operators"><header></header><code></code><translations></translations><inputs><input type="%s">a</input><input type="%s">steam</input></inputs><script><block s="doReport"><custom-block s="replace %s in %txt with %s"><block var="thing"/><block var="text"/><l></l></custom-block></block></script></block-definition><block-definition s="reverse sound %&apos;snd&apos;" type="reporter" category="sound"><header></header><code></code><translations></translations><inputs><input type="%s" readonly="true"><options>§_soundsMenu</options></input></inputs><script><block s="doReport"><block s="reportNewSoundFromSamples"><block s="evaluate"><block s="reifyReporter"><autolambda><block s="reportIfElse"><block s="reportIsA"><block s="reportListItem"><l>1</l><block var="s"/></block><l><option>list</option></l></block><block s="reportMap"><block s="reifyReporter"><autolambda><block s="reportListAttribute"><l><option>reverse</option></l><l/></block></autolambda><list></list></block><block var="s"/></block><block s="reportListAttribute"><l><option>reverse</option></l><block var="s"/></block></block></autolambda><list><l>s</l></list></block><list><block s="reportGetSoundAttribute"><l><option>samples</option></l><block var="snd"/></block></list></block><block s="reportGetSoundAttribute"><l><option>sample rate</option></l><block var="snd"/></block></block></block></script></block-definition><block-definition s="gradient costume %&apos;width&apos; × %&apos;height&apos; $nl with colors %&apos;colors&apos; meeting %&apos;which&apos;" type="reporter" category="looks"><header></header><code></code><translations></translations><inputs><input type="%n">256</input><input type="%n">256</input><input type="%mult%clr"></input><input type="%s" readonly="true">horizontally<options>horizontally&#xD;vertically</options></input></inputs><script><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list><l>w</l><l>h</l><l>c</l><l>v</l></list><l>var canvas = document.createElement(&apos;canvas&apos;),&#xD;    ctx = canvas.getContext(&apos;2d&apos;),&#xD;    grd = ctx.createLinearGradient(0, 0, v?0:w, v?h:0);&#xD;canvas.width = w;&#xD;canvas.height = h;&#xD;c = c.itemsArray();&#xD;if (c.length &gt; 0){&#xD;grd.addColorStop(0, c[0]);&#xD;c.shift();&#xD;c.forEach(function (clr, idx) {&#xD; grd.addColorStop((1/c.length*(idx+1)), clr);&#xD;})}&#xD;ctx.fillStyle = grd;&#xD;ctx.fillRect(0, 0, w, h);&#xD;return new Costume(canvas);</l></block><list><block var="width"/><block var="height"/><block var="colors"/><block s="reportEquals"><block var="which"/><l>vertically</l></block></list></block></block></script><scripts><script x="300.0076171874998" y="559.2"><block var="which"/></script><script x="249.0720703124998" y="559.2"><block var="colors"/></script><script x="196.21757812499976" y="591.1999999999999"><block var="height"/></script><script x="147.33281249999982" y="559.2"><block var="width"/></script></scripts></block-definition><block-definition s="sound from url %&apos;url&apos;" type="reporter" category="sound"><header></header><code></code><translations></translations><inputs><input type="%s">Sounds/Chord.wav<options>function () {&#xD;var obj = {};&#xD;world.children[0].getMediaList(&apos;Sounds&apos;).forEach(audio =&gt; {&#xD;obj[audio.name] = &apos;Sounds/&apos; + audio.fileName;&#xD;})&#xD;return obj;&#xD;}</options></input></inputs><script><custom-block s="let %upvar be %s"><l>sound</l><block s="evaluate"><block s="reportJSFunction"><list><l>src</l></list><l>var audio = new Audio(src),&#xD;    sound = null;&#xD;audio.addEventListener(&apos;loadeddata&apos;, () =&gt; {&#xD; sound = new Sound(audio);&#xD;})&#xD;return () =&gt; sound;</l></block><list><block var="url"/></list></block></custom-block><block s="doWaitUntil"><block s="evaluate"><block var="sound"/><list></list></block></block><block s="doReport"><block s="evaluate"><block var="sound"/><list></list></block></block></script></block-definition><block-definition s="let %&apos;var&apos; be %&apos;val&apos;" type="command" category="other"><comment x="0" y="0" w="183.33333333333334" collapsed="false">LET (FOO) BE (5)&#xD;is equivalent to&#xD;SCRIPT VARIABLES (FOO)&#xD;SET (FOO) TO (5)</comment><header></header><code></code><translations>pt:cria a variável de guião _ com valor _&#xD;</translations><inputs><input type="%upvar"></input><input type="%s"></input></inputs><script><block s="doSetVar"><l>var</l><block var="val"/></block></script></block-definition><block-definition s="question box contents" type="reporter" category="sensing"><comment x="0" y="0" w="90" collapsed="false">I cant think of a better name for this block lol, please suggest in the forum topic if you have any better ideas</comment><header></header><code></code><translations></translations><inputs></inputs><script><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list></list><l>const ide = world.children[0],&#xD;      pcs = ide.stage.threads.processes,&#xD;      answerbox = pcs.find(e =&gt; "prompter" in e).prompter;&#xD;if (answerbox) return answerbox.inputField.getValue();&#xD;return false;</l></block><list></list></block></block></script></block-definition><block-definition s="point resize costume %&apos;costume&apos; by factor %&apos;factor&apos;" type="reporter" category="looks"><header></header><code></code><translations></translations><inputs><input type="%s" readonly="true">current<options>§_costumesMenu</options></input><input type="%n">2</input></inputs><script><block s="doIf"><block s="reportOr"><block s="reportNot"><block s="reportEquals"><block s="reportMonadic"><l><option>floor</option></l><block var="factor"/></block><block var="factor"/></block></block><block s="reportOr"><block s="reportNot"><block s="reportEquals"><block s="reportMonadic"><l><option>abs</option></l><block var="factor"/></block><block var="factor"/></block></block><block s="reportEquals"><block var="factor"/><block s="reportQuotient"><l>1</l><l></l></block></block></block></block><script><custom-block s="throw %s %s"><l>Error</l><l>Factor must not be negative, decimal, or infinite.</l></custom-block></script></block><block s="doDeclareVariables"><list><l>height</l><l>width</l><l>old pixels</l></list></block><block s="doSetVar"><l>height</l><block s="reportGetImageAttribute"><l><option>height</option></l><block var="costume"/></block></block><block s="doSetVar"><l>width</l><block s="reportGetImageAttribute"><l><option>width</option></l><block var="costume"/></block></block><block s="doSetVar"><l>old pixels</l><block s="reportGetImageAttribute"><l><option>pixels</option></l><block var="costume"/></block></block><block s="doSetVar"><l>factor</l><block var="factor"/></block><block s="doReport"><block s="reportNewCostume"><block s="reportReshape"><block s="reportMap"><block s="reifyReporter"><autolambda><block s="reportReshape"><block s="reportMap"><block s="reifyReporter"><autolambda><block s="reportReshape"><block s="reportListItem"><block s="reportSum"><block s="reportProduct"><block var="h"/><block var="width"/></block><block var="w"/></block><block var="old pixels"/></block><list><block var="factor"/><l>4</l></list></block></autolambda><list><l>w</l></list></block><block s="reportNumbers"><l>1</l><block var="width"/></block></block><list><block s="reportProduct"><block s="reportProduct"><block var="width"/><block var="factor"/></block><block var="factor"/></block><l>4</l></list></block></autolambda><list><l>h</l></list></block><block s="reportNumbers"><l>0</l><block s="reportDifference"><block var="height"/><l>1</l></block></block></block><list><block s="reportProduct"><block s="reportProduct"><block var="height"/><block var="width"/></block><block s="reportProduct"><block var="factor"/><block var="factor"/></block></block><l>4</l></list></block><block s="reportProduct"><block var="factor"/><block var="width"/></block><block s="reportProduct"><block var="factor"/><block var="height"/></block></block></block></script></block-definition><block-definition s="matrix %&apos;rows&apos; × %&apos;cols&apos; with: %&apos;fill&apos;" type="reporter" category="lists"><header></header><code></code><translations></translations><inputs><input type="%n">4</input><input type="%n">3</input><input type="%n">0<options>function() {&#xD;return {&#xD;&quot;identity&quot;: [&quot;identity&quot;]&#xD;};&#xD;}</options></input></inputs><script><block s="doIf"><block s="reportEquals"><block s="reportJoinWords"><block var="fill"/></block><l>identity</l></block><script><block s="doReport"><block s="reportAtomicMap"><block s="reifyReporter"><autolambda><block s="reportMap"><block s="reifyPredicate"><autolambda><block s="reportSum"><l>0</l><block s="reportEquals"><block var="x"/><block var="y"/></block></block></autolambda><list><l>x</l></list></block><block s="reportNumbers"><l>1</l><block var="cols"/></block></block></autolambda><list><l>y</l></list></block><block s="reportNumbers"><l>1</l><block var="rows"/></block></block></block></script></block><block s="doReport"><block s="reportReshape"><block var="fill"/><list><block var="rows"/><block var="cols"/></list></block></block></script></block-definition><block-definition s="set font to %&apos;name&apos; $nl bold? %&apos;bold&apos; italic? %&apos;italic&apos;" type="command" category="pen"><header></header><code></code><translations></translations><inputs><input type="%s">monospace<options>arial&#xD;cursive&#xD;monospace</options></input><input type="%b">false</input><input type="%b">false</input></inputs><script><block s="doRun"><block s="reportJSFunction"><list><l>name</l><l>bold</l><l>italic</l></list><l>if (!("font" in this)){&#xD; this.font = &apos;monospace&apos;;&#xD; this.bold = "";&#xD; this.italic = "";&#xD; SpriteMorph.prototype.write = function (text, size) {&#xD;    // thanks to Michael Ball for contributing this code!&#xD;    if (typeof text !== &apos;string&apos; &amp;&amp; typeof text !== &apos;number&apos;) {&#xD;        throw new Error(&#xD;            &apos;LABEL can only draw text or numbers, not a &apos; +&#xD;            typeof text&#xD;        );&#xD;    }&#xD;&#xD;    var stage = this.parentThatIsA(StageMorph),&#xD;        context = stage.penTrails().getContext(&apos;2d&apos;),&#xD;        rotation = radians(this.direction() - 90),&#xD;        trans = new Point(&#xD;            this.rotationCenter().x - stage.left(),&#xD;            this.rotationCenter().y - stage.top()&#xD;        ),&#xD;        len,&#xD;        pos;&#xD;&#xD;    context.save();&#xD;    context.font = this.italic + "normal " + this.bold + size + &apos;px &apos; + this.font;&#xD;    context.textAlign = &apos;left&apos;;&#xD;    context.textBaseline = &apos;alphabetic&apos;;&#xD;    context.fillStyle = this.color.toString();&#xD;    len = context.measureText(text).width;&#xD;    trans = trans.multiplyBy(1 / stage.scale);&#xD;    context.translate(trans.x, trans.y);&#xD;    context.rotate(rotation);&#xD;    context.fillText(text, 0, 0);&#xD;    context.translate(-trans.x, -trans.y);&#xD;    context.restore();&#xD;    pos = new Point(&#xD;        len * Math.sin(radians(this.direction())),&#xD;        len * Math.cos(radians(this.direction()))&#xD;    );&#xD;    pos = pos.add(new Point(this.xPosition(), this.yPosition()));&#xD;    this.gotoXY(pos.x, pos.y, false);&#xD;    this.changed();&#xD;    stage.changed();&#xD;}}&#xD;this.font = name;&#xD;this.bold = bold? "bold ":"normal "&#xD;this.italic = italic? "italic ":"normal ";</l></block><list><block var="name"/><block var="bold"/><block var="italic"/></list></block></script></block-definition><block-definition s="font %&apos;which&apos;" type="reporter" category="pen"><header></header><code></code><translations></translations><inputs><input type="%s" readonly="true">name<options>name&#xD;bold?&#xD;italic?</options></input></inputs><script><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list><l>which</l></list><l>if (!("font" in this)){&#xD; this.font = &apos;monospace&apos;;&#xD; SpriteMorph.prototype.write = function (text, size) {&#xD;    // thanks to Michael Ball for contributing this code!&#xD;    if (typeof text !== &apos;string&apos; &amp;&amp; typeof text !== &apos;number&apos;) {&#xD;        throw new Error(&#xD;            &apos;LABEL can only draw text or numbers, not a &apos; +&#xD;            typeof text&#xD;        );&#xD;    }&#xD;&#xD;    var stage = this.parentThatIsA(StageMorph),&#xD;        context = stage.penTrails().getContext(&apos;2d&apos;),&#xD;        rotation = radians(this.direction() - 90),&#xD;        trans = new Point(&#xD;            this.rotationCenter().x - stage.left(),&#xD;            this.rotationCenter().y - stage.top()&#xD;        ),&#xD;        len,&#xD;        pos;&#xD;&#xD;    context.save();&#xD;    context.font = this.bold + this.italic + size + &apos;px &apos; + this.font;&#xD;    context.textAlign = &apos;left&apos;;&#xD;    context.textBaseline = &apos;alphabetic&apos;;&#xD;    context.fillStyle = this.color.toString();&#xD;    len = context.measureText(text).width;&#xD;    trans = trans.multiplyBy(1 / stage.scale);&#xD;    context.translate(trans.x, trans.y);&#xD;    context.rotate(rotation);&#xD;    context.fillText(text, 0, 0);&#xD;    context.translate(-trans.x, -trans.y);&#xD;    context.restore();&#xD;    pos = new Point(&#xD;        len * Math.sin(radians(this.direction())),&#xD;        len * Math.cos(radians(this.direction()))&#xD;    );&#xD;    pos = pos.add(new Point(this.xPosition(), this.yPosition()));&#xD;    this.gotoXY(pos.x, pos.y, false);&#xD;    this.changed();&#xD;    stage.changed();&#xD;}}&#xD;switch (which){&#xD; case "bold?":&#xD;  return this.bold === &apos;bold &apos;;&#xD; case "italic?":&#xD;  return this.italic === &apos;italic &apos;;&#xD; default:&#xD;  return this.font;&#xD;}</l></block><list><block var="which"/></list></block></block></script></block-definition><block-definition s="read clipboard %&apos;which&apos;" type="reporter" category="control"><header></header><code></code><translations></translations><inputs><input type="%s" readonly="true">text<options>text&#xD;costume</options></input></inputs><script><block s="doDeclareVariables"><list><l>clip</l></list></block><block s="doIfElse"><block s="reportEquals"><block var="which"/><l>costume</l></block><script><block s="doSetVar"><l>clip</l><block s="evaluate"><block s="reportJSFunction"><list></list><l>var item = null,&#xD;    thing = null;&#xD;&#xD;function error(txt){done = true; console.error(txt);}&#xD;&#xD;function loadImage(url){&#xD;  return new Promise((resolve, reject) =&gt; {&#xD;    var img = new Image();&#xD;    img.onload = () =&gt; resolve( img);&#xD;    img.onerror = reject;&#xD;    img.src = url;&#xD;  })&#xD;}&#xD;&#xD;(async () =&gt; {&#xD;  if("clipboard" in navigator) {&#xD;	try{	&#xD;        var clipData = await navigator.clipboard.read();&#xD;        console.log(clipData);&#xD;	&#xD;&#xD;		const item = clipData.find(v =&gt; v.types.includes("image/png"));&#xD;		if(!item)&#xD;   thing = true;&#xD;			error("No image data");&#xD;&#xD;		blob = await item.getType("image/png");&#xD;		var url = (window.URL || window.webkitURL).createObjectURL(blob);&#xD;		var img = await loadImage(url);&#xD;		canvas = newCanvas(new Point(img.width, img.height), true);&#xD;		canvas.getContext(&apos;2d&apos;).drawImage(img, 0, 0);&#xD;		thing = new Costume(canvas, "clipboard");&#xD;    }&#xD;    catch(err){thing=true;error("Can&apos;t get PNG data: "+err.message)};&#xD;  }&#xD; else {thing=true;error("Cannot access clipboard")}&#xD;})();&#xD;return () =&gt; thing;</l></block><list></list></block></block></script><script><block s="doSetVar"><l>clip</l><block s="evaluate"><block s="reportJSFunction"><list></list><l>var result = null;&#xD;navigator.clipboard.readText().then(e =&gt; result = e);&#xD;return () =&gt; result;</l></block><list></list></block></block></script></block><block s="doWaitUntil"><block s="evaluate"><block var="clip"/><list></list></block></block><block s="doIf"><block s="reportIsA"><block s="evaluate"><block var="clip"/><list></list></block><l><option>Boolean</option></l></block><script><block s="doReport"><l></l></block></script></block><block s="doReport"><block s="evaluate"><block var="clip"/><list></list></block></block></script></block-definition><block-definition s="custom dialog, title %&apos;title&apos; costume %&apos;cst&apos; body %&apos;body&apos; $nl button names %&apos;variadic&apos; on button clicks %&apos;cvariadic&apos;" type="command" category="other"><header></header><code></code><translations></translations><inputs><input type="%s"></input><input type="%s" readonly="true"><options>§_costumesMenu</options></input><input type="%mlt"></input><input type="%mult%txt"></input><input type="%mult%cmdRing"></input></inputs><script><block s="doRun"><block s="reportJSFunction"><list><l>title,body,names,actions,cst,proc</l></list><l>let _txt;&#xD;&#xD; function autoscroll(textString) {&#xD;   _txt = new TextMorph(&#xD;           textString&#xD;           ,box.fontSize&#xD;           ,box.fontStyle&#xD;           ,true&#xD;           ,false&#xD;           ,&apos;center&apos;&#xD;           ,null&#xD;           ,null&#xD;           ,MorphicPreferences.isFlat ? null : new Point(1, 1)&#xD;           ,WHITE&#xD;     )&#xD;     let maxHeight, scroller;&#xD;      &#xD;     maxHeight = Math.min( world.height() - box.titleFontSize * 30, _txt.height());&#xD;     _txt.enableLinks = true;&#xD;       &#xD;     scroller = new ScrollFrameMorph();&#xD;     scroller.acceptsDrops = false;&#xD;     scroller.contents.acceptsDrops = false;&#xD;     scroller.bounds.setWidth(_txt.width());&#xD;     scroller.bounds.setHeight(maxHeight);&#xD;     scroller.addContents( _txt);&#xD;     scroller.color = new Color(0, 0, 0, 0);&#xD;     return scroller;&#xD;    }&#xD;&#xD;names = names.asArray();&#xD;let scs = actions.asArray();&#xD;actions = actions.asArray().map(_=&gt;function doAction(){if(doAction.e==&apos;close&apos;){this.destroy();}else{invoke(doAction.e,new List());this.destroy()}});&#xD;actions.forEach((e,f)=&gt;{e.e=scs[f];e.f=proc})&#xD;var box = new DialogBoxMorph();&#xD;box.labelString = title;&#xD;box.createLabel();&#xD;box.label.isBold = true;&#xD;if(cst !== ""){&#xD;  box.setPicture(proc.reportNewCostumeStretched(cst,100,100).contents);&#xD;};&#xD;box.addBody(autoscroll( body));&#xD;box.body.fixLayout();&#xD;names.forEach((e, f) =&gt; {&#xD;box.addButton(actions[f], e);&#xD;})&#xD;box.fixLayout();&#xD;box.popUp(this.world());</l></block><list><block var="title"/><block var="body"/><block var="variadic"/><block var="cvariadic"/><block var="cst"/></list></block></script></block-definition><block-definition s="edit box title %&apos;title&apos; pic %&apos;cst&apos; $nl body %&apos;body&apos; desc %&apos;desc&apos;" type="reporter" category="other"><header></header><code></code><translations></translations><inputs><input type="%s"></input><input type="%s" readonly="true"><options>§_costumesMenu</options></input><input type="%mlt"></input><input type="%mlt"></input></inputs><script><block s="doDeclareVariables"><list><l>res</l><l>result</l></list></block><block s="doSetVar"><l>res</l><block s="evaluate"><block s="reportJSFunction"><list><l>title,cst,body,desc,proc</l></list><l>let res = false,&#xD;    cancel = false;&#xD;&#xD;var box = new DialogBoxMorph();&#xD;box.ok = body=&gt;{res = box.getInput(); box.destroy()};&#xD;box.cancel = body=&gt;{cancel = true; res = true; box.destroy()};&#xD;box.destroy = body=&gt;{if (!cancel) {res = box.getInput();}else{res=true;}&#xD;    (function() {&#xD;    var world = this.world();&#xD;    world.keyboardFocus = null;&#xD;    world.hand.destroyTemporaries();&#xD;    DialogBoxMorph.uber.destroy.call(this);&#xD;    }).call(box);}&#xD;box.promptCode(&#xD;    title,&#xD;    body,&#xD;    this.world(),&#xD;    (cst !== "")?&#xD;    proc.reportNewCostumeStretched(cst, 100, 100).contents&#xD;    :undefined,&#xD;    desc&#xD;);&#xD;&#xD;return () =&gt; res;</l></block><list><block var="title"/><block var="cst"/><block var="body"/><block var="desc"/></list></block></block><block s="doUntil"><block s="reportOr"><block var="result"/><block s="reportEquals"><block var="result"/><l></l></block></block><script><block s="doSetVar"><l>result</l><block s="evaluate"><block var="res"/><list></list></block></block></script></block><block s="doReport"><block s="reportIfElse"><block s="reportEquals"><block var="result"/><block s="reportBoolean"><l><bool>true</bool></l></block></block><block s="reportBoolean"><l><bool>false</bool></l></block><block var="result"/></block></block></script></block-definition><block-definition s="%&apos;prop&apos; of %&apos;list&apos;" type="reporter" category="lists"><header></header><code></code><translations></translations><inputs><input type="%s" readonly="true">length<options>length&#xD;rank&#xD;shape&#xD;size&#xD;&#126;1&#xD;flatten&#xD;transpose&#xD;reverse&#xD;shuffle&#xD;&#126;2&#xD;lines&#xD;csv&#xD;json</options></input><input type="%l"></input></inputs><script><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list><l>prop</l><l>list</l><l>proc</l></list><l>if (!(list instanceof List)){&#xD; throw new Error("expecting list but getting " +&#xD; ((list === 0)? "nothing":proc.reportTypeOf(list)));&#xD;}&#xD;switch (prop) {&#xD; case "reverse":&#xD;  return new List(list.itemsArray().reverse());&#xD; case "shuffle":&#xD;  return new List(list.itemsArray().sort((a, b) =&gt; (0.5 - Math.random())));&#xD; case "lines":&#xD;  if (list.rank() &lt; 2){&#xD;   return list.itemsArray().join(&apos;\n&apos;);&#xD;  } else {&#xD;   throw new Error("Unable to convert to lines");&#xD;  }&#xD; case "csv":&#xD;  if (list.canBeCSV()){&#xD;   return list.asCSV();&#xD;  } else {&#xD;   throw new Error("Unable to convert to CSV");&#xD;  }&#xD; case "json":&#xD;  if (list.canBeJSON()){&#xD;   return list.asJSON();&#xD;  } else {&#xD;   throw new Error("Unable to convert to JSON");&#xD;  }&#xD; default:&#xD;  return (list[prop] || function() {return ""}).call(list);&#xD;}</l></block><list><block var="prop"/><block var="list"/></list></block></block></script></block-definition><block-definition s="is %&apos;list&apos; %&apos;which&apos; ?" type="predicate" category="lists"><header></header><code></code><translations></translations><inputs><input type="%l"></input><input type="%s" readonly="true">empty<options>empty&#xD;flat&#xD;circular</options></input></inputs><script><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list><l>prop</l><l>list</l></list><l>switch (prop) {&#xD; case "empty":&#xD;  return list.isEmpty();&#xD; case "flat":&#xD;  try {&#xD;   return list.rank() &lt; 2;&#xD;  } catch (e) {&#xD;   return false;&#xD;  }&#xD; case "circular":&#xD;  return list.itemsArray().some(i =&gt; list === i);&#xD; default:&#xD;  return "";&#xD;}</l></block><list><block var="which"/><block var="list"/></list></block></block></script></block-definition><block-definition s="pen %&apos;which&apos;" type="reporter" category="pen"><header></header><code></code><translations></translations><inputs><input type="%s" readonly="true">hue<options>size&#xD;&#126;1&#xD;hue&#xD;saturation&#xD;brightness&#xD;transparency&#xD;&#126;2&#xD;red&#xD;green&#xD;blue&#xD;&#126;3&#xD;rgb&#xD;hsv&#xD;&#126;4&#xD;down?</options></input></inputs><script><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list><l>which</l></list><l>switch (which) {&#xD; case "size":&#xD;  return this.penSize();&#xD; case "hue":&#xD;  return this.color.hsv()[0];&#xD; case "saturation":&#xD;  return this.color.hsv()[1];&#xD; case "brightness":&#xD;  return this.color.hsv()[2];&#xD; case "red":&#xD;  return this.color.r;&#xD; case "green":&#xD;  return this.color.g;&#xD; case "blue":&#xD;  return this.color.b;&#xD; case "down?":&#xD;  return this.isDown;&#xD; case "hsv":&#xD;  return new List(this.color.hsv());&#xD; case "rgb":&#xD;  return new List([this.color.r, this.color.g, this.color.b]);&#xD; default:&#xD;  return "";&#xD;}</l></block><list><block var="which"/></list></block></block></script></block-definition><block-definition s="is %&apos;txt&apos; valid JSON?" type="predicate" category="operators"><header></header><code></code><translations></translations><inputs><input type="%mlt">{"foo":"bar"}</input></inputs><script><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list><l>txt</l></list><l>try {&#xD; let tmp = JSON.parse(txt);&#xD; return true;&#xD;} catch (e) {&#xD; return false;&#xD;}</l></block><list><block var="txt"/></list></block></block></script></block-definition><block-definition s="move with arrow keys" type="command" category="motion"><header></header><code></code><translations></translations><inputs></inputs><script><block s="doAddToList"><l>enabled move with arrow keys</l><block var="console"/></block><block s="fork"><block s="reifyScript"><script><block s="doForever"><script><block s="doIf"><block s="reportKeyPressed"><l><option>up arrow</option></l></block><script><block s="forward"><l>5</l></block></script></block><block s="doIf"><block s="reportKeyPressed"><l><option>down arrow</option></l></block><script><block s="forward"><l>-5</l></block></script></block><block s="doIf"><block s="reportKeyPressed"><l><option>right arrow</option></l></block><script><block s="turn"><l>5</l></block></script></block><block s="doIf"><block s="reportKeyPressed"><l><option>left arrow</option></l></block><script><block s="turnLeft"><l>5</l></block></script></block></script></block></script><list></list></block><list></list></block></script><scripts><script x="215.603515625" y="78.80000000000007"><block s="reifyScript"><script></script><list></list></block></script></scripts></block-definition><block-definition s="create %&apos;scope&apos; var %&apos;names&apos;" type="command" category="variables"><comment x="0" y="0" w="146" collapsed="false">This block creates  new variables on the selected scope: global (for all sprites), sprite (for this sprite only) or script (only for that blocks stack) with the names given (in &apos;names&apos; list).&#xD;&#xD;If there is already a variable with that name in that scope, it does nothing: no errors and no overwrites.</comment><header></header><code></code><translations>pt:cria as variáveis _ _&#xD;ca:crea les _ variables _&#xD;es:crear las _ variables _&#xD;de:erstellen _ var _&#xD;</translations><inputs><input type="%s" readonly="true">global<options>global&#xD;sprite&#xD;script</options></input><input type="%mult%txt"></input></inputs><script><block s="doIfElse"><block s="reportEquals"><block var="scope"/><l>script</l></block><script><block s="doForEach"><l>each item</l><block var="names"/><script><block s="doRun"><block s="reportJSFunction"><list><l>varName</l><l>proc</l></list><l>if ((typeof varName) != "string" || varName === "") {&#xD;    throw new Error("name isn&apos;t a string: " + varName);&#xD;}&#xD;if (!proc.homeContext.variables.vars[varName]) proc.homeContext.variables.addVar(varName);</l></block><list><block var="each item"/></list></block></script></block></script><script><block s="doDeclareVariables"><list><l>global</l></list></block><block s="doIfElse"><block s="reportEquals"><block var="scope"/><l>sprite</l></block><script><block s="doSetVar"><l>global</l><block s="reportBoolean"><l><bool>false</bool></l></block></block></script><script><block s="doSetVar"><l>global</l><block s="reportBoolean"><l><bool>true</bool></l></block></block></script></block><block s="doForEach"><l>each item</l><block var="names"/><script><block s="doRun"><block s="reportJSFunction"><list><l>varName</l><l>global</l><l>proc</l></list><l>if ((typeof varName) != "string" || varName === "") {&#xD;    throw new Error("name isn&apos;t a string: " + varName);&#xD;}&#xD;if (global &amp;&amp; !proc.homeContext.variables.parentFrame.parentFrame.vars[varName]) this.addVariable(varName, true);&#xD;if (!global &amp;&amp; !proc.homeContext.variables.parentFrame.vars[varName]) this.addVariable(varName, false);</l></block><list><block var="each item"/><block var="global"/></list></block></script></block><block s="doRun"><block s="reportJSFunction"><list></list><l>var ide = this.parentThatIsA(IDE_Morph);&#xD;ide.flushBlocksCache(&apos;variables&apos;); // b/c of inheritance&#xD;ide.refreshPalette();</l></block><list></list></block></script></block></script></block-definition><block-definition s="delete var %&apos;names&apos;" type="command" category="variables"><comment x="0" y="0" w="217" collapsed="false">This block deletes all the variables with the names given (inside input list).&#xD;&#xD;Each name will make only one variable deletion, and this will be the variable found following the scope order: &apos;script&apos; -&gt; &apos;sprite&apos; -&gt; &apos;global&apos;.&#xD;&#xD;If we have a &quot;testing&quot; sprite variable and also a &quot;testing&quot; global one, deleting &quot;testing&quot; will delete only the sprite one (Yes! we can also do &quot;delete var (testing, testing)&quot; to delete both.&#xD;&#xD;If one variable does not exists (in any scope) an error happens, stopping block action in that point. You can check it before with the &quot;does var (name) exists?&quot;block. </comment><header></header><code></code><translations>pt:remove as variáveis _&#xD;ca:esborra les variables _&#xD;es:borrar variables _&#xD;de:löschen var _&#xD;</translations><inputs><input type="%mult%txt"></input></inputs><script><block s="doForEach"><l>each item</l><block var="names"/><script><block s="doRun"><block s="reportJSFunction"><list><l>varName</l><l>proc</l></list><l>if ((typeof varName) != "string" || varName === "") {&#xD;    throw new Error("name isn&apos;t a string: " + varName);&#xD;}&#xD;if (typeof proc.homeContext.variables.vars[varName] !== &apos;undefined&apos;) {&#xD;    delete proc.homeContext.variables.vars[varName];&#xD;} else if (this.deletableVariableNames().indexOf(varName) != -1) {&#xD;    this.deleteVariable(varName);&#xD;} else {&#xD;    throw new Error("variable doesn&apos;t exist: " + varName);&#xD;}</l></block><list><block var="each item"/></list></block></script></block><block s="doRun"><block s="reportJSFunction"><list></list><l>var ide = this.parentThatIsA(IDE_Morph);&#xD;ide.flushBlocksCache(&apos;variables&apos;); // b/c of inheritance&#xD;ide.refreshPalette();</l></block><list></list></block></script></block-definition><block-definition s="set var %&apos;name&apos; to %&apos;value&apos;" type="command" category="variables"><comment x="0" y="0" w="240.4931640625" collapsed="false">This block sets the given value (last input) to the variable named with the name givent (var input).&#xD;&#xD;It looks for that variable following the scope order &apos;script&apos; -&gt; &apos;sprite&apos; -&gt; &apos;global&apos; (the first match it finds).&#xD;&#xD;If that variable does not exist (in any scope) an error happens, stopping their script. You can check it before using the &quot;does var (name) exists?&quot; block. </comment><header></header><code></code><translations>ca:assigna a _ el valor _&#xD;es:asignar a _ el valor _&#xD;pt:altera _ para _&#xD;de:setze var _ auf _&#xD;</translations><inputs><input type="%s"><options>§_getVarNamesDict</options></input><input type="%s"></input></inputs><script><block s="doRun"><block s="reportJSFunction"><list><l>varName</l><l>value</l><l>proc</l></list><l>if ((typeof varName) != "string") {&#xD;    throw new Error("name isn&apos;t a string: " + varName);&#xD;}&#xD;proc.homeContext.variables.setVar(varName, value);</l></block><list><block var="name"/><block var="value"/></list></block></script></block-definition><block-definition s="var %&apos;name&apos;" type="reporter" category="variables"><comment x="0" y="0" w="178.00000000000003" collapsed="false">This block reports the value of the variable with the name given.&#xD;&#xD;It looks for that variable following the scope order &apos;script&apos; -&gt; &apos;sprite&apos; -&gt; &apos;global&apos; (the first match it finds).&#xD;&#xD;If that variable does not exist (in any scope) an error happens, stopping their script. You can check it before using the &quot;does var (name) exists?&quot; block. </comment><header></header><code></code><translations>pt:o valor de _&#xD;</translations><inputs><input type="%s"><options>§_getVarNamesDict</options></input></inputs><script><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list><l>varName</l><l>proc</l></list><l>if ((typeof varName) != "string") {&#xD;    throw new Error("name isn&apos;t a string: " + varName);&#xD;}&#xD;return proc.homeContext.variables.getVar(varName);</l></block><list><block var="name"/></list></block></block></script></block-definition><block-definition s="does var %&apos;name&apos; exist?" type="predicate" category="variables"><comment x="0" y="0" w="146" collapsed="false">This block reports &quot;true&quot; if there is a variable with this given name (input slot) in that context.&#xD;&#xD;It can be a global, sprite or script variable.&#xD;&#xD;Otherwise it reports &quot;false&quot;.</comment><header></header><code></code><translations>pt:a variável _ existe&#xD;ca:existeix la variable _ ?&#xD;es:existe la variable _ ?&#xD;de:existiert var _ ?&#xD;</translations><inputs><input type="%s"></input></inputs><script><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list><l>varName</l><l>proc</l></list><l>if ((typeof varName) != "string" || varName === "") {&#xD;    throw new Error("name isn&apos;t a string: " + varName);&#xD;}&#xD;return proc.homeContext.variables.silentFind(varName)? true:false;</l></block><list><block var="name"/></list></block></block></script></block-definition><block-definition s="show var %&apos;name&apos;" type="command" category="variables"><comment x="0" y="0" w="181" collapsed="false">This block turns on (show) the watcher view on stage (if it was not already activated) of the variable with the given name (slot input).&#xD;&#xD;It can only access to the closest variable scope (if there different variables with the same name in different scopes) following the order &apos;script&apos; -&gt; &apos;sprite&apos; -&gt; &apos;global&apos;.&#xD;&#xD;No errors if that variable does not exist.</comment><header></header><code></code><translations>ca:mostra la variable _&#xD;es:mostrar variable _&#xD;pt:mostra a variável _&#xD;de:zeige var _&#xD;</translations><inputs><input type="%s"><options>§_getVarNamesDict</options></input></inputs><script><block s="doIf"><custom-block s="does var %s exist?"><block var="name"/></custom-block><script><block s="doRun"><block s="reportJSFunction"><list><l>varName</l><l>proc</l></list><l>    var varFrame = proc.homeContext.variables,&#xD;        stage,&#xD;        watcher,&#xD;        target,&#xD;        label,&#xD;        others,&#xD;        isGlobal,&#xD;        name = varName;&#xD;&#xD;    if (name instanceof Context) {&#xD;        if (name.expression.selector === &apos;reportGetVar&apos;) {&#xD;            name = name.expression.blockSpec;&#xD;        } else {&#xD;            proc.doChangePrimitiveVisibility(name.expression, false);&#xD;            return;&#xD;        }&#xD;    }&#xD;    if (proc.homeContext.receiver) {&#xD;        stage = proc.homeContext.receiver.parentThatIsA(StageMorph);&#xD;        if (stage) {&#xD;            target = varFrame.silentFind(name);&#xD;            if (!target) {return; }&#xD;            // first try to find an existing (hidden) watcher&#xD;            watcher = detect(&#xD;                stage.children,&#xD;                morph =&gt; morph instanceof WatcherMorph &amp;&amp;&#xD;                    morph.target === target &amp;&amp;&#xD;                        morph.getter === name&#xD;            );&#xD;            if (watcher !== null) {&#xD;                watcher.show();&#xD;                watcher.fixLayout(); // re-hide hidden parts&#xD;                return;&#xD;            }&#xD;            // if no watcher exists, create a new one&#xD;            isGlobal = contains(&#xD;                proc.homeContext.receiver.globalVariables().names(),&#xD;                varName&#xD;            );&#xD;            if (isGlobal || target.owner) {&#xD;                label = name;&#xD;            } else {&#xD;                label = name + &apos; &apos; + localize(&apos;(temporary)&apos;);&#xD;            }&#xD;            watcher = new WatcherMorph(&#xD;                label,&#xD;                SpriteMorph.prototype.blockColor.variables,&#xD;                target,&#xD;                name&#xD;            );&#xD;            watcher.setPosition(stage.position().add(10));&#xD;            others = stage.watchers(watcher.left());&#xD;            if (others.length &gt; 0) {&#xD;                watcher.setTop(others[others.length - 1].bottom());&#xD;            }&#xD;            stage.add(watcher);&#xD;            watcher.fixLayout();&#xD;        }&#xD;    }</l></block><list><block var="name"/></list></block></script></block></script></block-definition><block-definition s="hide var %&apos;name&apos;" type="command" category="variables"><comment x="0" y="0" w="181" collapsed="false">This block turns off (hide) the watcher view on stage (if it was not already activated) of the variable with the given name (slot input).&#xD;&#xD;It can only access to the closest variable scope (if there different variables with the same name in different scopes) following the order &apos;script&apos; -&gt; &apos;sprite&apos; -&gt; &apos;global&apos;.&#xD;&#xD;No errors if that variable does not exist.</comment><header></header><code></code><translations>ca:amaga la variable _&#xD;es:esconder variable _&#xD;pt:esconde a variável _&#xD;de:verstecke var _&#xD;</translations><inputs><input type="%s"><options>§_getVarNamesDict</options></input></inputs><script><block s="doIf"><custom-block s="does var %s exist?"><block var="name"/></custom-block><script><block s="doRun"><block s="reportJSFunction"><list><l>varName</l><l>proc</l></list><l>    // to delete all temporary watchers, use the primitive "hide" with no inputs&#xD;    var varFrame = proc.homeContext.variables,&#xD;        stage,&#xD;        watcher,&#xD;        target,&#xD;        name = varName;&#xD;&#xD;    if (name instanceof Context) {&#xD;        if (name.expression.selector === &apos;reportGetVar&apos;) {&#xD;            name = name.expression.blockSpec;&#xD;        } else {&#xD;            proc.doChangePrimitiveVisibility(name.expression, true);&#xD;            return;&#xD;        }&#xD;    }&#xD;    if (!name) {&#xD;        proc.doRemoveTemporaries();&#xD;        return;&#xD;    }&#xD;    if (proc.homeContext.receiver) {&#xD;        stage = proc.homeContext.receiver.parentThatIsA(StageMorph);&#xD;        if (stage) {&#xD;            target = varFrame.find(name);&#xD;            watcher = detect(&#xD;                stage.children,&#xD;                morph =&gt; morph instanceof WatcherMorph &amp;&amp;&#xD;                    morph.target === target &amp;&amp;&#xD;                        morph.getter === name&#xD;            );&#xD;            if (watcher !== null) {&#xD;                if (watcher.isTemporary()) {&#xD;                    watcher.destroy();&#xD;                } else {&#xD;                    watcher.hide();&#xD;                }&#xD;            }&#xD;        }&#xD;    }&#xD;</l></block><list><block var="name"/></list></block></script></block></script></block-definition></blocks><variables><variable name="console"><list struct="atomic" id="3965">enabled move with arrow keys,enabled fencing</list></variable></variables></project><media name="fencing block" app="Snap! 6, https://snap.berkeley.edu" version="1"></media></snapdata>