From a34f745e78fd3f7cf21f25933b506bf1dfed6b30 Mon Sep 17 00:00:00 2001 From: Peli de Halleux Date: Fri, 24 Apr 2015 15:32:17 -0700 Subject: [PATCH] updated docs --- generated/help.cache | 34 +++++++++++++++++----------------- tools/client.ts | 40 +++++++++++++++++++++++++++++----------- 2 files changed, 46 insertions(+), 28 deletions(-) diff --git a/generated/help.cache b/generated/help.cache index 5990b002..595c3703 100644 --- a/generated/help.cache +++ b/generated/help.cache @@ -6,7 +6,6 @@ "ckbk": "meta version \"v2.2,js,ctx,refs,localcloud,unicodemodel,allasync\";\nmeta name \"teach\";\nmeta rootId \"rfFWOBXKYWbKL3882OCwIeVx\";\nmeta hasIds \"yes\";\nmeta platform \"current\";\nmeta parentIds \"\";\n// Teaching with TouchDevelop. #docs #teach #education\n#sJti4PgyaJBMZl5Xa5UMimxW\naction main() {\n #K1y28DAXzlzjVqnx // {parentTopic:contents}\n #sYkQiq3Kz6SzmixV // {priority:100}\n #VE3zvfX2r4Slzd0O // TouchDevelop makes it fun to learn (and teach) programming skills. This section has lots of ideas for using TouchDevelop in the classroom.\n #A6eQBe2sSnp2lUqk // * **Are you a teacher? Join the [TouchDevelop Teachers group](#pub:sxlktprb)!**\n #xQ6nypfXFlgBD7VZ // ### resources for educators\n #iTqjubSk3ck5JnQE // * [Hour Of Code](https://www.touchdevelop.com/hoc) - all the information to run an **Hour Of Code** with TouchDevelop\n #bBTHXKtvHh3YgmNL // * [](/courses) — choose from different curriculum to teach about mobile app and game creation\n #xbbpj2AABJzoZacv // * [](/tutorials) — step by step tutorials to build games and apps\n #Hd33r1xwwgD7qsD7 // * [docs](/contents) — the built-in documentation\n #qQqt5pFCKhlqbNUX // * [](/book) — currently available for free online; systematic introduction to all basic concepts\n #OPjd1hyHfJ39XbW8 // ### environments\n #lLBw4hzsB8IpuVx9 // * The **TouchDevelop Web App** runs in [most modern browsers](https://www.touchdevelop.com/app/current.browsers).\n #Z4En3ihiQz4Dcdfi // * The [TouchDevelop Windows Phone app](http://www.windowsphone.com/s?appId=fe08ccec-a360-e011-81d2-78e7d1fa76f8) gives access to most sensors and data providers available on modern smartphones. [More resources for educators interested in using Windows Phone...](https://www.touchdevelop.com/teachwindowsphone)\n #uc4AzvPR1oVPRmCN // * The [TouchDevelop Android app](https://play.google.com/store/apps/details?id=com.microsoft.touchdevelop) gives access to notifications on Android\n #bAFkE6FP49vQmk4Q // Learn more about [platforms and supported features](https://www.touchdevelop.com/platforms).\n #T4CItQIBnMyWsjzq // ### create your own tutorials and docs\n #RLolkQMEUD0pU4i5 // In addition to creating fun and useful apps, you can use TouchDevelop to create custom interactive tutorials to augment your curriculum. You can also create your own documentation topics adding to the TouchDevelop documentation. This benefits not only your class, but the entire TouchDevelop community!\n #qc2MeCvS62HoY74P // * [creating interactive tutorials](/creatinginteractivetutorials)\n #Esv88v05v32k6UzH // * [add your own docs](/addyourowndocs)\n #cKhwOfsnzrr9c6Ri // ### manage your classroom\n #ZZ80VlTdiwMCWzcy // * You can create [](/groups) and manage your classrooms through them. Groups have a message board and allow to easily collect homework from your students.\n #xo43SANX5LZxfqRT // * Use a [label printer](/labelprinter) to easily get printed labels from student scripts\n #ow6CAnIoZDQOKOLP // ### follow your students\n #t6fGFzG0xF05rZyE // As a teacher, consider [subscribing](/subscriptions) to your students to see what they are publishing and if they are asking questions.\n #ueEDtziGGzDu30Yi // ### experience\n #x2P2jb0Ng0DiKokb // Visit the [TouchDevelop teaching page](http://research.microsoft.com/touchdevelop/teaching.aspx) at Microsoft Research for a list of how TouchDevelop has been used and is being used in classrooms.\n}\n", "cleva": "meta version \"v2.2,js,ctx,refs,localcloud,unicodemodel,allasync,upperplex\";\nmeta name \"blank web api\";\nmeta icon \"Stacks\";\nmeta color \"#ffffffff\";\nmeta rootId \"x4mibwzdISu8zLeLgg7b3IKt\";\nmeta iconArtId \"wyfreugv\";\nmeta isLibrary \"yes\";\nmeta allowExport \"yes\";\nmeta isCloud \"yes\";\nmeta hasIds \"yes\";\nmeta platform \"network,npm,shell\";\nmeta parentIds \"\";\n// An blank web api using Node.JS and Restify. #node #azure #restify\n#czWG9NcXY9uFZHMz\naction \\_init() {\n #rg6M5H46J1bK4x8c data→logger := app→create_logger(\"api\");\n #x2Y2gFv2oHeZKjaB code→init_restify;\n}\n#FrNAgtgAKnFVC43t\naction GET_\\u002fping() returns(#aM0QoLDaWxwAlfSy millis: Number) {\n #xzy3cNZXu2Lbz9f2 // Returns the number of milliseconds since epoch.\n #IYDlx4xcyWX5wD4m $millis := time→now→milliseconds_since_epoch;\n}\n#a4wL0Lb7xeWxhV4L meta import parallel {\n pub \"fncvb\"\n usage {\n type queue\n action `async` @for(count: Number, @action: Number_Action)\n action `async` for_batched(count: Number, batch_count: Number, item_action: Number_Action, batch_action: Action)\n action `sync` schedule(q: ♻ parallel → queue, task: Action)\n action `sync` create_queue(max_running: Number) returns(queue: ♻ parallel → queue)\n action `async` wait_for_empty(q: ♻ parallel → queue)\n action `async` for_json(js: Json_Object, @action: Json_Action)\n }\n}\n#CW3Wao3uu3Z2Fhe6\nvar logger : App_Logger {\n transient = true;\n}\n#rmfzWWMIFG8Ule9I\naction init_restify() {\n #GL26xBm2sW9gi51S $server := @\\u267b→restify→server;\n #eq0FvCwwbob1i3UD $server→use(@\\u267b→restify→authorization_parser);\n #Ee6qD4jb4Xr4TCYg $server→pre(@\\u267b→restify→sanitize_path);\n #xiHn2sJ7jyfBOFLf $throttle := @\\u267b→restify→throttle;\n #ZU1qf4WMSwf2ZZs8 where rate := 40;\n #S04R2349FF42Rb2O where burst := 100;\n #qa878gtstkVP7tTO where ip := true;\n #kld3kZpnFcZ4TVhB $server→use($throttle);\n #sptEZCs70xCB68CA $server→use(@\\u267b→restify→CORS);\n #mFFPDO74C64OWH8s $server→use(@\\u267b→restify→body_parser);\n #xSqpOmBEP6L2VCFi $server→use(@\\u267b→restify→gzip_response);\n #xR4QGtRsV3hGoSJQ $server→use(@\\u267b→restify→query_parser);\n #x9bNZzJ9tZk0l1Z4 $server→use(@\\u267b→restify→conditional_request);\n #buXcIfKig0apgL4x @\\u267b→restify_touchdevelop→autobind($server);\n #kj30VDMt3gkmKiZM code→init_routes();\n #UAx1DGb27XEqkYO5 $server→use(@\\u267b→restify_touchdevelop→errors_to_log(data→logger));\n meta private;\n}\n#Png4V3OlrtBkrIAa meta import restify {\n pub \"egzra\"\n usage {\n action `async` `type` Request_Handler(req: ♻ restify → Request, res: ♻ restify → Response)\n #xLPhdjOebDT8w77X\n table Throttle_Options {\n type = \"Object\";\n exported = true;\n persistent = false;\n fields {\n #xo6LfV0hyAQtz675 rate : Number\n #yZ2QZAfeW3W74JA1 burst : Number\n #JUlNvDq7Hm9cTUAG ip : Boolean\n #w2h4dcf4I5K5h7kn xff : Boolean\n #RO3Sx6iTt4WsVBm6 username : Boolean\n #VbsYnDvr3t4Xr4VA maxKeys : Number\n #w25h9R5LKJnWiBNu tokensTable : ♻ restify → Tokens_Table\n }\n }\n #xdeuBx505IsZ6eEI\n table Serve_Static_Options {\n type = \"Object\";\n exported = true;\n persistent = false;\n fields {\n #NfWLVJBBbHvtMqkl default : String\n #KvIMj1sEoAwQCf22 maxAge : Number\n }\n }\n #mqEMUbizkEp6naSD\n table CORS_Options {\n type = \"Object\";\n exported = true;\n persistent = false;\n fields {\n #xMYYV6C3eS7PWsfQ origins : String\n #z5HdpFdSi792e1OX credentials : Boolean\n #Fw1D0A9ZfeMCf5c3 headers : String\n }\n }\n #w2zTzWkfMf01yOko\n table Body_Parser_Options {\n type = \"Object\";\n exported = true;\n persistent = false;\n fields {\n #mhaHCLobgUgMrv72 maxBodySize : Number\n #xr4fKleNd4wHHP1l mapParams : Boolean\n #st0ir2vLTxbLTQWB mapFiles : Boolean\n #z5ah2mZWb8c5FmTM overrideParams : Boolean\n }\n }\n #xv4yZciZi2wFoqpM\n table Send_Options {\n type = \"Object\";\n exported = true;\n persistent = false;\n fields {\n #svWYln7UIackFIpB status : Number\n }\n }\n type Request\n type Response\n type Tokens_Table\n type Server\n type Middleware\n type Error\n action `sync` use(server: ♻ restify → Server, mid: ♻ restify → Middleware)\n action `sync` get(server: ♻ restify → Server, path: String, @then: ♻ restify → Request_Handler)\n action `sync` post(server: ♻ restify → Server, path: String, @then: ♻ restify → Request_Handler)\n action `sync` server() returns(server: ♻ restify → Server)\n action `sync` send(res: ♻ restify → Response, content: String, options\\u003f: ♻ restify → Send_Options)\n action `sync` status(res: ♻ restify → Response, status: Number)\n action `sync` is(req: ♻ restify → Request, type: String) returns(r: Boolean)\n action `sync` accepts(req: ♻ restify → Request, types: String) returns(type: String)\n action `sync` put(server: ♻ restify → Server, path: String, @then: ♻ restify → Request_Handler)\n action `sync` del(server: ♻ restify → Server, path: String, @then: ♻ restify → Request_Handler)\n action `sync` head(server: ♻ restify → Server, path: String, @then: ♻ restify → Request_Handler)\n action `sync` pre(server: ♻ restify → Server, mid: ♻ restify → Middleware)\n action `sync` CORS(options\\u003f: ♻ restify → CORS_Options) returns(mid: ♻ restify → Middleware)\n action `sync` conditional_request() returns(mid: ♻ restify → Middleware)\n action `sync` route(server: ♻ restify → Server, method: String, path: String, @then: ♻ restify → Request_Handler)\n action `sync` json(res: ♻ restify → Response, content: Json_Object, options\\u003f: ♻ restify → Send_Options)\n action `sync` next(res: ♻ restify → Response)\n action `sync` next_error(res: ♻ restify → Response, error: ♻ restify → Error)\n action `sync` address(server: ♻ restify → Server) returns(address: String)\n action `sync` gzip_response() returns(mid: ♻ restify → Middleware)\n action `sync` header(req: ♻ restify → Request, name: String) returns(value: String)\n action `sync` is_secure(req: ♻ restify → Request) returns(r: Boolean)\n action `sync` is_chunked(req: ♻ restify → Request) returns(r: Boolean)\n action `sync` is_keep_alive(req: ♻ restify → Request) returns(r: Boolean)\n action `sync` set_header(res: ♻ restify → Response, name: String, value: String)\n action `sync` body_parser(options\\u003f: ♻ restify → Body_Parser_Options) returns(mid: ♻ restify → Middleware)\n action `sync` throttle(options\\u003f: ♻ restify → Throttle_Options) returns(middleware: ♻ restify → Middleware)\n action `sync` date_parser(clock_skew: Number) returns(middleware: ♻ restify → Middleware)\n action `sync` serve_static(directory: String, options\\u003f: ♻ restify → Serve_Static_Options) returns(middleware: ♻ restify → Middleware)\n action `sync` query_parser() returns(middleware: ♻ restify → Middleware)\n action `sync` authorization_parser() returns(middleware: ♻ restify → Middleware)\n action `sync` jsonp() returns(middleware: ♻ restify → Middleware)\n action `sync` body_as_json(req: ♻ restify → Request) returns(body: Json_Object)\n action `sync` id(req: ♻ restify → Request) returns(id: String)\n action `sync` param(req: ♻ restify → Request, name: String) returns(value: String)\n action `sync` opts(server: ♻ restify → Server, path: String, @then: ♻ restify → Request_Handler)\n action `sync` patch(server: ♻ restify → Server, path: String, @then: ♻ restify → Request_Handler)\n action `sync` to_string(ser: ♻ restify → Server) returns(s: String)\n action `sync` sanitize_path() returns(middleware: ♻ restify → Middleware)\n action `sync` body(req: ♻ restify → Request) returns(body: String)\n action `sync` send_error(res: ♻ restify → Response, status: Number, message: String)\n action `sync` all(server: ♻ restify → Server, @then: ♻ restify → Request_Handler)\n action `sync` method(req: ♻ restify → Request) returns(method: String)\n action `sync` url(req: ♻ restify → Request) returns(url: String)\n action `sync` query(req: ♻ restify → Request) returns(query: Json_Object)\n action `sync` redirect(res: ♻ restify → Response, status_code: Number, url: String)\n action `sync` send_status(res: ♻ restify → Response, status_code: Number)\n action `sync` charset(res: ♻ restify → Response, encoding: String)\n action `sync` route_regex(server: ♻ restify → Server, method: String, path_regex: String, @then: ♻ restify → Request_Handler)\n action `async` read_body_as_buffer(req: ♻ restify → Request) returns(body: Buffer)\n action `sync` headers(req: ♻ restify → Request) returns(headers: Json_Object)\n action `sync` server_url(req: ♻ restify → Request) returns(url: String)\n action `sync` html(res: ♻ restify → Response, content: String, options\\u003f: ♻ restify → Send_Options)\n }\n}\n#MLbRHC7j0u4Bo4GQ meta import restify_touchdevelop {\n pub \"dvuhb\"\n usage {\n action `sync` autobind(server: ♻ restify → Server)\n action `sync` errors_to_log(logger: App_Logger) returns(middleware: ♻ restify → Middleware)\n }\n #OzaDw2jYXC1r4oMK resolve restify = ♻ restify with {\n }\n}\n#xcZnKOBpfz0lu8jD\naction init_routes() {\n #MxIs21VA5KpTC0F8 $server := @\\u267b→restify→server;\n #B2Ui2S2BrMhefyH4 $server→get(\"/echo\", $@then);\n #c58sWTLqXwkWaboA where @then(req: ♻ restify → Request, res: ♻ restify → Response) {\n #yXsNFxumA3UsfrbL $res→send($req→body);\n }\n meta private;\n}\n#XtmWYupkIPBJS394 meta import node_hash {\n pub \"ezbka\"\n usage {\n action `sync` sha256(value: String) returns(digest: String)\n action `sync` sha1(value: String) returns(digest: String)\n }\n #GWvhSP7JyKU8z6PI resolve node_crypto = ♻ node_crypto with {\n }\n}\n#el5rlGit0kOOkLrC meta import node_crypto {\n pub \"ujtrc\"\n usage {\n type credentials\n type hash\n type hmac\n type cipher\n type decipher\n type sign\n type verify\n type DiffieHellman\n action `sync` get_ciphers() returns(ciphers: Collection[String])\n action `sync` get_hashes() returns(hashes: Collection[String])\n action `sync` create_credentials(details: Json_Object) returns(credentials: ♻ node_crypto → credentials)\n action `sync` create_hash(algorithm: String) returns(hash: ♻ node_crypto → hash)\n action `sync` update_hash(hash: ♻ node_crypto → hash, hash_data: Buffer)\n action `sync` digest_hash(hash: ♻ node_crypto → hash) returns(digest: Buffer)\n action `sync` update_hmac(hmac: ♻ node_crypto → hmac, hmac_data: Buffer)\n action `sync` digest_hmac(hmac: ♻ node_crypto → hmac) returns(digest: Buffer)\n action `sync` create_cipher(algorithm: String, password: Buffer) returns(cipher: ♻ node_crypto → cipher)\n action `sync` create_cipher_iv(algorithm: String, key: Buffer, iv: Buffer) returns(iv_cipher: ♻ node_crypto → cipher)\n action `sync` update_cipher(cipher: ♻ node_crypto → cipher, _data: Buffer) returns(enciphered: Buffer)\n action `sync` final(cipher: ♻ node_crypto → cipher) returns(cipher_final: Buffer)\n action `sync` set_auto_padding(cipher: ♻ node_crypto → cipher)\n action `sync` create_decipher(algorithm: String, password: Buffer) returns(decipher: ♻ node_crypto → decipher)\n action `sync` create_decipher_iv(algorithm: String, key: Buffer, iv: Buffer) returns(iv_decipher: ♻ node_crypto → decipher)\n action `sync` update_decipher(decipher: ♻ node_crypto → decipher, _data: Buffer) returns(deciphered: Buffer)\n action `sync` final_(decipher: ♻ node_crypto → decipher) returns(decipher_final: Buffer)\n action `sync` set_auto_padding_(decipher: ♻ node_crypto → decipher)\n action `sync` create_sign(algorithm: String) returns(sign: ♻ node_crypto → sign)\n action `sync` update_sign(sign: ♻ node_crypto → sign, sign\\_data: Buffer)\n action `sync` sign_(sign: ♻ node_crypto → sign, private_key: String) returns(signature: Buffer)\n action `sync` create_verify(algorithm: String) returns(verify: ♻ node_crypto → verify)\n action `sync` update_verify(verify: ♻ node_crypto → verify, verify_data: Buffer)\n action `sync` verify_(verify: ♻ node_crypto → verify, object: String, signature: Buffer) returns(valid: Boolean)\n action `sync` create_DiffieHellman(prime_length: Number) returns(DiffieHellman: ♻ node_crypto → DiffieHellman)\n action `sync` generate_keys(DiffieHellman: ♻ node_crypto → DiffieHellman) returns(public_key: Buffer)\n action `sync` compute_secret(DiffieHellman: ♻ node_crypto → DiffieHellman, other_public_key: Buffer) returns(shared_secret: Buffer)\n action `sync` get_prime(DiffieHellman: ♻ node_crypto → DiffieHellman) returns(DH_prime: Buffer)\n action `sync` get_generator(DiffieHellman: ♻ node_crypto → DiffieHellman) returns(generator: Buffer)\n action `sync` get_public_key(DiffieHellman: ♻ node_crypto → DiffieHellman) returns(public_key: Buffer)\n action `sync` get_private_key(DiffieHellman: ♻ node_crypto → DiffieHellman) returns(private_key: Buffer)\n action `sync` set_public_key(DiffieHellman: ♻ node_crypto → DiffieHellman, public_key: Buffer)\n action `sync` set_private_key(DiffieHellman: ♻ node_crypto → DiffieHellman, private_key: Buffer)\n action `sync` get_DiffieHellman(group_name: String) returns(DiffieHellman: ♻ node_crypto → DiffieHellman)\n action `async` pbkdf2(password: String, salt: String, iterations: Number, keylen: Number) returns(derived_key: String)\n action `async` random_bytes(size: Number) returns(strong_data: Buffer)\n action `sync` DEFAULT\\_ENCODING() returns(default_encoding: String)\n action `sync` create_hmac(algorithm: String, key: String) returns(hmac: ♻ node_crypto → hmac)\n action `sync` create_DiffieHellmanWithPrime(prime: Buffer) returns(DiffieHellman: ♻ node_crypto → DiffieHellman)\n action `async` pseudo_random_bytes(size: Number) returns(non\\u002dstrong_data: Buffer)\n action `sync` update_hash_string(hash: ♻ node_crypto → hash, hash_data: String)\n }\n}\n", "cljk": "meta version \"v2.2,js,ctx,refs,localcloud,unicodemodel,allasync\";\nmeta name \"getting started\";\nmeta icon \"CoffeeCup\";\nmeta color \"#ff007fff\";\nmeta rootId \"jgxw4hrQ2FJpvMX5ioKe2B98\";\nmeta hasIds \"yes\";\nmeta platform \"current\";\nmeta parentIds \"\";\n// A few tips on getting started with TouchDevelop. #docs #gettingStarted\n#xIo02XpbLanjKZPs4Os6Y4LA\naction main() {\n #Oqq61gE3scTEvYZY // {parentTopic:contents}\n #zLfUy9LLj4LtaQx1 // {priority:15}\n #BtM6DR2J5yHB6sPI // TouchDevelop lets you **create apps** on all your devices. Let's get started!\n #xTc92pAlcVjk7NIM // ## interactive tutorials\n #UR4kehofIixy8ZqD // Interactive tutorials let you learn at your own pace. We recommend starting out with one or more of these:\n #BMpEHAl89GLjB6Tj // * {follow:first steps with turtle}\n #RyRvlr3i8Xt2QwpU // * {follow:jumping bird tutorial}\n #ZQgFR1AVUm6THyGs // * {follow:coding jetpack jumper}\n #zObCeEa9dPLp8ooa // * {follow:pixel art tutorial}\n #zxrf3iOVA2LWSucN // Try also\n #q9JFJmh12AXcgatn // * [build your first app](http://aka.ms/buildyourfirstapp)\n #Fi2zIopLiFb4rNH4 // * Run an [Hour Of Code](https://www.touchdevelop.com/hoc) with TouchDevelop!\n #yx3F7H4uaTmcHwkO // Browse many other [interactive tutorials](/tutorials) and [courses](/courses). Learn how to build your own games, social apps, and more! Also, check out the book [TouchDevelop - Programming on the Go](/book). It's available as a free download!\n #xJmv15REfU94PGim // ## if you have programming experience...\n #fl1IdthF70YHQxDf // ### Traditional Languages\n #ss44jvTWrjOMlUod // {pic:eclipse:12x5}\n #h4UEzbiXxngho4qF // If you have experience with a traditional programming language such as Java, JavaScript, Python, C#, or C++:\n #P2cb12dV12LdnGN4 // * Start with [hello world](/helloworld) and create a TouchDevelop version of the classic 'hello world' app.\n #Tk1HQSMDs4fk4SuF // * Go to the [dev boot camp](/devbootcamp) and get a quick overview of the TouchDevelop language and environment.\n #xqE7TP69LpivSkjp // * Try a [social app tutorial](/socialapptutorials).\n #xM8eoCxsFuNcZ6Lc // ### Block Programming Environments\n #A6h4niF5i1xLuOXm // {pic:scratch:11x4}\n #k1oezDF4jvXHgk3V // If you have experience with block programming environments such as **Scratch**, **AppInventor**, **Snap!** (BYOB), **code.org**, **Blockly**, or other tools, let us show you how to [transition from blocks to text](/fromblockstotext).\n #KY8dTaEdqs4sjpRG // ## inform and instruct\n #Retn7qEvVW1pvEQZ // In addition to creating fun and useful apps, you can use TouchDevelop to create custom interactive tutorials to show users how to perform specific tasks. You can also create your own documentation topics to expand the TouchDevelop documentation!\n #xCY1IPuWs8bC15Fj // * [creating interactive tutorials](/creatinginteractivetutorials)\n #HIy9PSdtPgJXRY8Z // * [add your own docs](/addyourowndocs)\n}\n#kZWqFwNpvbKrHfETZ2TSQKCA\nvar scratch : Picture {\n is\\_resource = true;\n url = \"https://az31353.vo.msecnd.net/pub/fpxfkwlk\";\n transient = true;\n}\n#b97YU9g2RQFdWzG22RPqgK2Y\nvar eclipse : Picture {\n is\\_resource = true;\n url = \"https://az31353.vo.msecnd.net/pub/srtrixfh\";\n transient = true;\n}\n#SxNnQzF2puTSD7MMUORJP2UN\nvar turtle : Picture {\n is\\_resource = true;\n url = \"https://az31353.vo.msecnd.net/pub/pskgnelo\";\n transient = true;\n}\n", -"cpebe": "meta version \"v2.2,js,ctx,refs,localcloud,unicodemodel,allasync,upperplex\";\nmeta name \"blank creeper\";\nmeta color \"#ffffffff\";\nmeta rootId \"nHs55hVQebfHsdRXLqdn6Z3u\";\nmeta iconArtId \"yapqobto\";\nmeta allowExport \"yes\";\nmeta hasIds \"yes\";\nmeta splitScreen \"yes\";\nmeta platform \"accelerometer,location,musicandsounds,network,orientation,shell\";\nmeta parentIds \"\";\n// Move the creeper to create cool structures! #minecraft #turtle\n#ew46jSsSq5jX27bx\naction main() {\n #C5Nw6Q63PHrMOwzg @\\u267b→creeper→change_block(\"tnt\");\n #GntZkP8LuGenbICm for 0 ≤ i < 50 do {\n #PP9GM4o5xyjrF9bc @\\u267b→creeper→move_forward(5);\n #x17oHSx7q2zlZQpM @\\u267b→creeper→turn_left(90);\n }\n}\n#xR6s6mYuzEJtyC5s meta import creeper {\n pub \"aworg\"\n usage {\n\n action `async` move_forward(blocks: Number)\n action `async` turn_left(angle: Number)\n action `async` turn_right(angle: Number)\n action `async` move_back(blocks: Number)\n action `async` change_block(name: String)\n action `async` fly_down(blocks: Number)\n action `async` fly_up(blocks: Number)\n action `async` position() returns(x: Number, z: Number)\n action `async` fly_mode()\n action `async` build_cube(sides: Number)\n action `async` build_tower(sides: Number, height: Number)\n action `async` wipe_out()\n action `async` mine(blocks: Number)\n action `async` ground_height() returns(y: Number)\n action `async` walk_mode()\n action `async` dig_mode()\n action `async` block() returns(kind: String)\n action `async` chat(msg: String)\n action `async` add_checkpoint(id: String)\n action `async` go_to_checkpoint(id: String)\n action `async` build_walls()\n action `async` change_wool(c: Color)\n }\n #KPY1Rfzw7rV7Izwk resolve turtle = ♻ turtle with {\n }\n #DJbj9C2UAZDCLBUO resolve minecraft_pi = ♻ minecraft_pi with {\n }\n #pPo0v92e4eOZlpfs resolve shell = ♻ shell with {\n }\n}\n#xuKTJPM232PU6f4b meta import turtle {\n pub \"wtmsc\"\n usage {\n type Maze\n\n action `async` pen_down()\n action `async` pen_up()\n action `async` move_to(x: Number, y: Number)\n action `async` forward(steps: Number)\n action `async` left_turn(angle: Number)\n action `async` set_pen_color(c: Color)\n action `async` xcor() returns(x: Number)\n action `async` ycor() returns(y: Number)\n action `async` heading() returns(a: Number)\n action `async` world_width() returns(w: Number)\n action `async` world_height() returns(h: Number)\n action `async` set_heading(angle: Number)\n action `async` set_pen_size(thickness: Number)\n action `async` right_turn(angle: Number)\n action `async` circle(radius: Number)\n action `async` world_board() returns(board: Board)\n action `async` turn_to(dx: Number, dy: Number)\n action `async` world_picture() returns(pic: Picture)\n action `async` set_speed(steps_per_second: Number)\n action `async` go_home()\n action `async` back(steps: Number)\n action `async` pen_size() returns(size: Number)\n action `async` clean()\n action `async` clear_screen()\n action `async` speed() returns(v: Number)\n action `async` set_xy(xcor: Number, ycor: Number)\n action `async` set_x(xcor: Number)\n action `async` set_y(ycor: Number)\n action `async` pen_color() returns(c: Color)\n action `async` color_under() returns(c: Color)\n action `async` save_picture()\n action `async` xy() returns(x: Number, y: Number)\n action `async` touch_xy() returns(tx: Number, ty: Number)\n action `async` show_grid()\n action `async` fast()\n action `async` stamp()\n action `async` set_turtle_picture(pic: Picture)\n action `async` set_turtle_opacity(opacity: Number)\n action `async` trail()\n action `async` add_obstacle(maze: ♻ turtle → Maze, x: Number, y: Number, width: Number, height: Number, c: Color)\n action `async` set_goal(maze: ♻ turtle → Maze, x: Number, y: Number, radius: Number, c: Color)\n action `async` maze() returns(maze: ♻ turtle → Maze)\n action `async` lock(maze: ♻ turtle → Maze)\n action `async` history() returns(commands: String)\n action `async` clear_history()\n action `sync` on_command(command: Text_Action)\n action `async` add_way_point(maze: ♻ turtle → Maze)\n action `async` on_collision(maze: ♻ turtle → Maze, collision: Action)\n action `async` interactive()\n action `async` on_move(@action: Action)\n action `async` set_raster(value: Boolean)\n }\n}\n#xb2a4PZe0qy0sQQ5 meta import minecraft_pi {\n pub \"wkaue\"\n usage {\n #BVGhpbmca\n table Block_Options {\n type = \"Object\";\n exported = true;\n persistent = false;\n fields {\n #xNQF2IfWS5kUTCuC state : Number\n // Specifies the color or the id of the whool\n #xUNtn4WzFNh0J275 wool : String\n }\n }\n #xIIDIryL3GdLzzFH\n table Connect_Options {\n type = \"Object\";\n exported = true;\n persistent = false;\n fields {\n #IhKVKMjdA949jNr3 host : String\n #PQgsvjixlAlu49Bw port : Number\n #nlMXsJlluWZB1fNN proxy : String\n }\n }\n type Entity\n #umgRs0Idq3y9jRyc\n table Block_Event {\n type = \"Object\";\n exported = true;\n persistent = false;\n fields {\n #SCV1txxxrjigP8XC kind : String\n #UIy6UFvY6WJWDDoA x : Number\n #wWASeEjKJDoiqrL2 y : Number\n #MkoIqcTcP3QiIoot z : Number\n #kYCW4sVB0Q5jQy0Q face : Number\n #EayHvTpmMjNF3Sfh entity : ♻ minecraft_pi → Entity\n }\n }\n #pqaWOjEWNqEkbxwJ\n table Position {\n type = \"Object\";\n exported = true;\n persistent = false;\n fields {\n #L4NO4JXo2Sev2b1J x : Number\n #x2UU2Lt4BiV8NNNz y : Number\n #gw4VDwinZ6yVcwzL z : Number\n }\n }\n #eVDb6TwJ7CKitS8g\n table Repeat_Options {\n type = \"Object\";\n exported = true;\n persistent = false;\n fields {\n // Delay in seconds between execution\n #VB0iDf9EazabCCQM delay : Number\n }\n }\n\n action `async` connect(options\\u003f: ♻ minecraft_pi → Connect_Options)\n action `async` set_block(x: Number, y: Number, z: Number, name: String, options\\u003f: ♻ minecraft_pi → Block_Options)\n action `async` set_many_blocks(x: Number, y: Number, z: Number, x2: Number, y2: Number, z2: Number, name: String, options\\u003f: ♻ minecraft_pi → Block_Options)\n action `async` block(x: Number, y: Number, z: Number) returns(name: String)\n action `async` height(x: Number, z: Number) returns(h: Number)\n action `async` chat(msg: String)\n action `async` position(entity: ♻ minecraft_pi → Entity) returns(pos: ♻ minecraft_pi → Position)\n action `async` set_position(entity: ♻ minecraft_pi → Entity, x: Number, y: Number, z: Number)\n action `sync` is_connected() returns(r: Boolean)\n action `async` player_() returns(p: ♻ minecraft_pi → Entity)\n action `async` direction(entity: ♻ minecraft_pi → Entity) returns(d: Number)\n action `async` rotation(entity: ♻ minecraft_pi → Entity) returns(d: Number)\n action `async` pitch(entity: ♻ minecraft_pi → Entity) returns(d: Number)\n action `async` player_by_name(name: String) returns(steve: ♻ minecraft_pi → Entity)\n action `sync` block_names() returns(names: Collection[String])\n action `async` forever(body: Action, options\\u003f: ♻ minecraft_pi → Repeat_Options) returns(t: Timer)\n action `sync` wool_colors() returns(cs: Collection[Color])\n action `sync` wool_color(c: Color) returns(name: String)\n action `async` spawn(kind: String, x: Number, y: Number, z: Number) returns(mob: ♻ minecraft_pi → Entity)\n action `async` test_spawn()\n }\n #eS6kNMq25aR51ZZF resolve shell = ♻ shell with {\n }\n}\n#xrf8yyBo7axaAgOD meta import shell {\n pub \"qmzn\"\n usage {\n #BdGhpbmca\n table Exec_Output {\n type = \"Object\";\n exported = true;\n persistent = false;\n fields {\n #YaaLgMz45N5ZuAeU success : Boolean\n #qrwQiGIhHhUhb8AF error : String\n #ijyQCE4KPQL2ziZD code : Number\n #wf4AkGfhLyWkyKhQ stdout : String\n #ZyLfqXXM99R1znCa stderr : String\n }\n }\n #ttC12C2SJrh1ODjl\n table Serial_Options {\n type = \"Object\";\n exported = true;\n persistent = false;\n fields {\n #wXa4BRcG6mdxKU25 delimiter : String\n }\n }\n type Command_Result\n type Shell_Socket\n\n action `async` write_file(path: String, content: String) returns(res: ♻ shell → Command_Result)\n action `sync` mkpath(folder: String, name: String) returns(path: String)\n action `async` mkdir(path: String) returns(res: ♻ shell → Command_Result)\n action `async` exec(cmd: String, cwd: String) returns(res: ♻ shell → Exec_Output)\n action `sync` logger() returns(logger: App_Logger)\n action `async` exec_file(cmd: String, args: Collection[String], cwd: String) returns(res: ♻ shell → Exec_Output)\n action `async` python_env() returns(res: ♻ shell → Command_Result)\n action `async` tcp_connect(host: String, port: Number) returns(sock: ♻ shell → Shell_Socket)\n action `async` receive(sock: ♻ shell → Shell_Socket) returns(netdata: String)\n action `async` send(sock: ♻ shell → Shell_Socket, netdata: String)\n action `async` close(sock: ♻ shell → Shell_Socket)\n action `async` serialport_connect(name: String, options\\u003f: ♻ shell → Serial_Options) returns(sock: ♻ shell → Shell_Socket)\n action `async` serial_list() returns(ports: Json_Object)\n }\n}\n", "cwgn": "meta version \"v2.2,js,ctx,refs,localcloud,unicodemodel,allasync\";\nmeta name \"layout\";\nmeta icon \"NineColumn\";\nmeta color \"#ff9955bb\";\nmeta rootId \"J2g52kon8pb1Qs9cRhmPGKZu\";\nmeta isLibrary \"yes\";\nmeta allowExport \"yes\";\nmeta platform \"current\";\n// A library to help with laying out boxes.\n#main\naction example() {\n // This library provides various helpers to simplify the layout of boxes.\n // * layout vertically or horizontally based on the page orientation\n do box {\n code→use_flexible_layout;\n // ...\n }\n // * stretch and center a box\n do box {\n code→stretch_and_center;\n // ...\n }\n meta private;\n meta test;\n}\n#fADj2RlGhi2LmT1rCUpyRpxM\naction stretch_and_center() {\n // Stretches horizontally and vertically the current box and aligns the content with the center.\n box→set_horizontal_stretch(1);\n box→set_horizontal_align(\"center\");\n box→set_vertical_stretch(1);\n box→set_vertical_align(\"center\");\n meta sync;\n}\n#QpiD4W44RMmIzOZmyI6706Ps\naction use_flexible_layout() {\n // Uses **horizontal layout** if the page is landscape; **vertical layout** if the page is portrait.\n if box→page_width > box→page_height then {\n box→use_horizontal_layout;\n }\n else {\n box→use_vertical_layout;\n }\n meta private;\n meta sync;\n}\n#gridofsquares\naction grid_of_squares(cell_content: Number_Action, count: Number, grid_width: Number, grid_height: Number) {\n // Draw a grid of at least (count) squares, of the specified total width and height.\n $numboxes := $count;\n $Area := $grid_width * $grid_height;\n $bsize := math→sqrt($Area / $numboxes);\n $cols := math→floor($grid_width / $bsize);\n $rows := math→ceiling($numboxes / $cols);\n while $rows * $bsize > $grid_height do {\n $alt1 := $grid_width / ($cols + 1) - .001;\n $alt2 := $grid_height / $rows - 0.001;\n $bsize := math→max($alt1, $alt2);\n $cols := math→floor($grid_width / $bsize);\n $rows := math→ceiling($numboxes / $cols);\n }\n $mgn := .03 * $bsize;\n if $mgn * box→pixels_per_em < 2 then {\n $mgn := 2 / box→pixels_per_em;\n }\n $bsize := $bsize - $mgn;\n do box {\n code→draw_grid($rows, $cols, $mgn, $bsize, $cell_content, 0);\n }\n}\n#drawgrid\naction draw_grid(rows: Number, cols: Number, margin: Number, bsize: Number, cell_content: Number_Action, offset: Number) {\n box→set_height($rows * $bsize + ($rows - 1) * $margin);\n box→use_vertical_layout;\n box→set_vertical_align(\"justify\");\n for 0 ≤ i < $rows do {\n do box {\n box→set_width($cols * $bsize + ($cols - 1) * $margin);\n box→use_horizontal_layout;\n box→set_horizontal_align(\"justify\");\n for 0 ≤ j < $cols do {\n do box {\n do box {\n box→set_width($bsize);\n box→set_height($bsize);\n $cell_content→run($offset + $i * $cols + $j);\n }\n }\n }\n }\n }\n meta private;\n}\n#horizontallyscrollin\naction horizontal_hub_of_squares(cell_content: Number_Action, count: Number, cell_size: Number, group_width: Number, total_height: Number) {\n // Draw a horizontally scrolling grid of at least (count) squares of the specified size, with the specified total height.\n $numboxes := $count;\n $mgn := .03 * $cell_size;\n if $mgn * box→pixels_per_em < 2 then {\n $mgn := 2 / box→pixels_per_em;\n }\n $bsize := $cell_size + $mgn;\n $cols := math→floor($group_width / $bsize);\n $rows := math→floor($total_height / $bsize);\n if $cols ≤ 0 then {\n $cols := $rows;\n }\n $groups := math→ceiling($numboxes / ($rows * $cols));\n box→use_horizontal_layout;\n for 0 ≤ i < $groups do {\n do box {\n if $i ≠ 0 then {\n box→set_margins(0, 0, 0, .2 * $bsize);\n }\n code→draw_grid($rows, $cols, $mgn, $cell_size, $cell_content, $i * ($rows * $cols));\n }\n }\n box→set_scrolling(true, false);\n}\n#verticallyscrollings\naction vertical_hub_of_squares(cell_content: Number_Action, count: Number, cell_size: Number, total_width: Number, group_height: Number) {\n // Draw a vertically scrolling grid of at least (count) squares of the specified size, with the specified total width.\n $numboxes := $count;\n $mgn := .03 * $cell_size;\n if $mgn * box→pixels_per_em < 2 then {\n $mgn := 2 / box→pixels_per_em;\n }\n $bsize := $cell_size + $mgn;\n $cols := math→floor($total_width / $bsize);\n $rows := math→floor($group_height / $bsize);\n if $rows ≤ 0 then {\n $rows := $cols;\n }\n $groups := math→ceiling($numboxes / ($rows * $cols));\n box→use_vertical_layout;\n for 0 ≤ i < $groups do {\n do box {\n if $i ≠ 0 then {\n box→set_margins(.2 * $bsize, 0, 0, 0);\n }\n code→draw_grid($rows, $cols, $mgn, $cell_size, $cell_content, $i * ($rows * $cols));\n }\n }\n box→set_scrolling(false, true);\n}\n", "djjlc": "meta version \"v2.2,js,ctx,refs,localcloud,unicodemodel,allasync\";\nmeta name \"blank game template\";\nmeta icon \"Controller\";\nmeta color \"#ff9955bb\";\nmeta rootId \"x0hukfGG4i3MRik2f8KmalqI\";\nmeta allowExport \"yes\";\nmeta hasIds \"yes\";\nmeta platform \"current\";\nmeta parentIds \"\";\n#Apxoi0VesSBXIz9PLx65FHFL\naction main() {\n #xSdbHt6IzwL2zF22 $board := @\\u267b→game→start;\n #tO3dDceW3bsm8w4D @\\u267b→game→bounce_on_sides;\n #d3NEpyQ23dEnVv0F $monster := @\\u267b→game→create_sprite(art→monster);\n #DXV4iMnEfxNiTp9x $monster→acceleration_y := 400;\n #casrRb7vrPB4Den3 @\\u267b→gamepad→on_button_pressed($@action);\n #UCgGiaTYNYB3k9mm where @action() {\n #nIR8WfYhh9EC5Qo1 $monster→speed_y := - 200;\n }\n}\n#QgTAJQKZ2nORRZRz meta import game {\n pub \"sduub\"\n usage {\n action `sync` set_score(value: Number)\n action `async` set_life(value: Number)\n action `sync` start_timer()\n action `sync` start_countdown_timer(seconds: Number)\n action `sync` life() returns(r: Number)\n action `sync` score() returns(r: Number)\n action `sync` current_time() returns(seconds: Number)\n action `sync` add_score(value: Number)\n action `async` add_life(value: Number)\n action `sync` clear_timer()\n action `async` remove_life(value: Number)\n action `async` end()\n action `async` start() returns(board: Board)\n action `sync` reset()\n action `async` start_with_fixed_size(width: Number, height: Number) returns(board: Board)\n action `async` start_with_background_picture(pic: Picture) returns(board: Board)\n action `sync` board() returns(board: Board)\n action `sync` on_end(@action: Action)\n action `async` splash_text(message: String, seconds: Number, foreground: Color, background: Color, done: Action)\n action `async` start_landscape() returns(board: Board)\n action `async` start_portrait() returns(board: Board)\n action `sync` set_hud_colors(life: Color, timer: Color, score: Color)\n action `sync` hud_sprites() returns(sprites: Sprite_Set)\n action `async` life_visible() returns(b: Boolean)\n action `async` set_life_visible(visible: Boolean)\n action `sync` sprites() returns(sprites: Sprite_Set)\n action `async` set_background_scene(direction: String, pic: Picture)\n action `sync` bounce_on_sides()\n action `sync` create_sprite(pic: Picture) returns(sprite: Sprite)\n }\n}\n#hMbw1hQ3jl9MfUNI meta import gamepad {\n pub \"krxlb\"\n usage {\n type Settings\n type Gamepad_Event_Binding\n action `sync` current() returns(p: Vector3)\n action `sync` set_keys(settings: ♻ gamepad → Settings, left: String, up: String, right: String, down: String, button: String)\n action `sync` set_use_accelerometer(settings: ♻ gamepad → Settings, enabled: Boolean)\n action `sync` use_accelerometer(settings: ♻ gamepad → Settings) returns(b: Boolean)\n action `sync` control_sprite(sprite: Sprite, max_speed_x: Number, max_speed_y: Number)\n action `sync` control_background_scene(max_speed_x: Number, max_speed_y: Number)\n action `sync` settings() returns(sets: ♻ gamepad → Settings)\n action `sync` set_accelerometer_factor(settings: ♻ gamepad → Settings, factor: Number)\n action `sync` set_keyboard_factor(settings: ♻ gamepad → Settings, factor: Number)\n action `sync` set_touch_factor(settings: ♻ gamepad → Settings, factor: Number)\n action `sync` accelerometer_factor(settings: ♻ gamepad → Settings) returns(factor: Number)\n action `sync` keyboard_factor(settings: ♻ gamepad → Settings) returns(factor: Number)\n action `sync` touch_factor(settings: ♻ gamepad → Settings) returns(factor: Number)\n action `sync` gamepad_factor(settings: ♻ gamepad → Settings) returns(factor: Number)\n action `sync` set_gamepad_factor(settings: ♻ gamepad → Settings, factor: Number)\n action `async` on_button_pressed(@action: Action) returns(binding: ♻ gamepad → Gamepad_Event_Binding)\n action `sync` delete(binding: ♻ gamepad → Gamepad_Event_Binding)\n }\n #zDeKtzLCNCj9mWEr resolve game = ♻ game with {\n }\n}\n#xSTcRyh4flfGg1AZ meta import game_animations {\n pub \"nehv\"\n usage {\n action `async` splatter(sprite: Sprite, splatter: Picture)\n action `sync` add_score(sprite: Sprite, score: Number)\n }\n #QG0x2FmWdJxIAUPl resolve game = ♻ game with {\n }\n}\n#ZY2qZ7leUTySclE6\nvar monster : Picture {\n is\\_resource = true;\n url = \"https://az31353.vo.msecnd.net/pub/mezojwug\";\n transient = true;\n}\n", "enyra": "meta version \"v2.2,js,ctx,refs,localcloud,unicodemodel,allasync\";\nmeta name \"blank scratch\";\nmeta icon \"Flag\";\nmeta color \"#ffffa500\";\nmeta rootId \"DW2rPXfOGG0eQFu92NcRb5TE\";\nmeta platform \"current\";\n// #scratch\n#mNUzNyy2wxUPIVGaxSd7qyIc\naction main() {\n skip;\n}\n#scratch meta import scratch {\n pub \"cagwa\"\n usage {\n type scratch_sprite\n action `sync` new_sprite(pic: Picture) returns(sprite: ♻ scratch → scratch_sprite)\n action `async` move(sprite: ♻ scratch → scratch_sprite, steps: Number)\n action `async` say_for(sprite: ♻ scratch → scratch_sprite, text: String, seconds: Number)\n action `sync` play_sound(sound: Sound)\n action `async` play_sound_until_done(sound: Sound)\n action `async` turn_left(sprite: ♻ scratch → scratch_sprite, degrees: Number)\n action `async` turn_right(sprite: ♻ scratch → scratch_sprite, degrees: Number)\n action `sync` x_position(sprite: ♻ scratch → scratch_sprite) returns(x: Number)\n action `sync` y_position(sprite: ♻ scratch → scratch_sprite) returns(y: Number)\n action `sync` grid()\n action `async` change_x_by(sprite: ♻ scratch → scratch_sprite, amount: Number)\n action `async` change_y_by(sprite: ♻ scratch → scratch_sprite, amount: Number)\n action `sync` set_y_to(sprite: ♻ scratch → scratch_sprite, y: Number)\n action `sync` set_x_to(sprite: ♻ scratch → scratch_sprite, x: Number)\n action `sync` direction(sprite: ♻ scratch → scratch_sprite) returns(d: Number)\n action `async` point_in_direction(sprite: ♻ scratch → scratch_sprite, degrees: Number)\n action `async` glide_to(sprite: ♻ scratch → scratch_sprite, duration: Number, x: Number, y: Number)\n action `async` go_to_x_y(sprite: ♻ scratch → scratch_sprite, x: Number, y: Number)\n action `async` show(sprite: ♻ scratch → scratch_sprite)\n action `async` hide(sprite: ♻ scratch → scratch_sprite)\n action `async` change_size_by(sprite: ♻ scratch → scratch_sprite, amount: Number)\n action `sync` size(sprite: ♻ scratch → scratch_sprite) returns(size: Number)\n action `async` wait(seconds: Number)\n action `sync` mouse_down\\u003f() returns(b: Boolean)\n action `sync` mouse_y() returns(x: Number)\n action `sync` mouse_x() returns(x: Number)\n action `sync` pick_random(start: Number, end: Number) returns(r: Number)\n action `sync` user_name() returns(name: String)\n action `sync` user_picture() returns(pic: Picture)\n action `sync` ask_and_wait(text: String) returns(answer: String)\n action `sync` go_to_front(sprite: ♻ scratch → scratch_sprite)\n action `sync` go_back(sprite: ♻ scratch → scratch_sprite, layers: Number)\n action `sync` if_on_edge\\u002c_bounce(sprite: ♻ scratch → scratch_sprite)\n action `sync` switch_backdrop_to(backdrop: Picture)\n action `sync` current_time() returns(now: DateTime)\n action `sync` when_clicked(sprite: ♻ scratch → scratch_sprite, clicked: Action)\n action `sync` distance_to(sprite: ♻ scratch → scratch_sprite, other: ♻ scratch → scratch_sprite) returns(d: Number)\n action `sync` point_towards(sprite: ♻ scratch → scratch_sprite, other: ♻ scratch → scratch_sprite)\n action `sync` mouse\\u002dpointer() returns(m: ♻ scratch → scratch_sprite)\n action `sync` timer() returns(t: Number)\n action `sync` reset_timer()\n action `sync` when_backdrop_clicked(clicked: Position_Action)\n action `async` go_to(sprite: ♻ scratch → scratch_sprite, other: ♻ scratch → scratch_sprite)\n action `async` next_costume(sprite: ♻ scratch → scratch_sprite)\n action `async` add_costume(sprite: ♻ scratch → scratch_sprite, pic: Picture)\n action `async` say(sprite: ♻ scratch → scratch_sprite, text: String)\n action `sync` when_flag_clicked(clicked: Action)\n action `sync` create_clone(sprite: ♻ scratch → scratch_sprite) returns(clone: ♻ scratch → scratch_sprite)\n action `sync` touching(sprite: ♻ scratch → scratch_sprite, other: ♻ scratch → scratch_sprite) returns(b: Boolean)\n action `sync` x_speed(sprite: ♻ scratch → scratch_sprite) returns(vx: Number)\n action `sync` y_speed(sprite: ♻ scratch → scratch_sprite) returns(y: Number)\n action `sync` change_speed_x_by(sprite: ♻ scratch → scratch_sprite, amount: Number)\n action `sync` change_speed_y_by(sprite: ♻ scratch → scratch_sprite, amount: Number)\n action `sync` x_acceleration(sprite: ♻ scratch → scratch_sprite) returns(ax: Number)\n action `sync` y_acceleration(sprite: ♻ scratch → scratch_sprite) returns(ay: Number)\n action `sync` change_x_acceleration_by(sprite: ♻ scratch → scratch_sprite, amount: Number)\n action `sync` change_y_acceleration_by(sprite: ♻ scratch → scratch_sprite, amount: Number)\n action `sync` set_x_speed_to(sprite: ♻ scratch → scratch_sprite, speed: Number)\n action `sync` set_y_speed_to(sprite: ♻ scratch → scratch_sprite, speed: Number)\n action `sync` set_x_acceleration_to(sprite: ♻ scratch → scratch_sprite, acceleration: Number)\n action `sync` set_y_acceleration_to(sprite: ♻ scratch → scratch_sprite, acceleration: Number)\n action `sync` forever(@action: Action)\n action `sync` friction(sprite: ♻ scratch → scratch_sprite) returns(f: Number)\n action `sync` set_friction_to(sprite: ♻ scratch → scratch_sprite, friction: Number)\n action `sync` when_swipped(sprite: ♻ scratch → scratch_sprite, swiped: Vector_Action)\n action `sync` when_backdrop_swiped(swiped: Vector_Action)\n action `sync` device_x_acceleration() returns(dev_ax: Number)\n action `sync` device_y_acceleration() returns(dev_ay: Number)\n action `sync` bounce_on_edges()\n action `async` set_size_to(sprite: ♻ scratch → scratch_sprite, percent: Number)\n action `async` clear()\n action `sync` pen_down(sprite: ♻ scratch → scratch_sprite)\n action `sync` pen_up(sprite: ♻ scratch → scratch_sprite)\n action `sync` set_pen_color_to(sprite: ♻ scratch → scratch_sprite, c: Color)\n action `sync` set_pen_color_to_wheel(sprite: ♻ scratch → scratch_sprite, c: Number)\n action `sync` change_pen_color_by(sprite: ♻ scratch → scratch_sprite, amount: Number)\n action `sync` set_pen_size_to(sprite: ♻ scratch → scratch_sprite, size: Number)\n action `sync` change_pen_size_by(sprite: ♻ scratch → scratch_sprite, amount: Number)\n action `sync` stamp(sprite: ♻ scratch → scratch_sprite)\n action `sync` join(left: String, right: String) returns(s: String)\n action `sync` letter_of(index: Number, s: String) returns(c: String)\n action `sync` length(s: String) returns(r: Number)\n action `sync` stop_all()\n action `async` new_rectangle_sprite(color: Color, width: Number, height: Number) returns(sprite: ♻ scratch → scratch_sprite)\n action `sync` key_pressed\\u003f(key: String) returns(b: Boolean)\n action `sync` when_key_pressed(key: String, @action: Action)\n }\n}\n", @@ -17,7 +16,6 @@ "gtfla": "meta version \"v2.2,js,ctx,refs,localcloud,unicodemodel,allasync\";\nmeta name \"blank cordova library\";\nmeta icon \"ApproveButton\";\nmeta color \"#ffe3256b\";\nmeta rootId \"yGFW3wy9mcuwDt2lxN2XzLPS\";\nmeta isLibrary \"yes\";\nmeta allowExport \"yes\";\nmeta hasIds \"yes\";\nmeta platform \"accelerometer,compass,gyroscope,location,musicandsounds,network,orientation,phone,cordova\";\nmeta parentIds \"\";\n// A library that wraps an Apache cordova plugin #cordova\n#xbyRT3U8tTYlJuX3\naction init(#qC2ALk0kurvg43d9 options\\u003f: * Options) {\n #MNkyanFCYYm1mj2c // Initializes the plugin. Call once.\n #X4G0I6zR3PXSOoW2 contract→requires(data→logger→is_invalid, \"plugin already initialized\");\n #t7IXp9pyue4DKV3r app→import(\"cordova\", \"TODO: cordoval plugin name here\", \"*\");\n #pAoVhCYiE8wIBNx2 data→logger := app→create_logger(\"mylib\");\n #x5295YzyzYEkwRz9 // TODO: use `app-> javasctipt` and `app->javascript async` to proxy with javascript.\n #NSEi48Fc3E82Gzhc // TODO: change the script description\n #xGNJXaGae2QQzC4o // TODO: write docs in `code-> example`\n}\n#SHXfYJBDaSY28xmP\nvar logger : App_Logger {\n transient = true;\n}\n#BdGhpbmca\ntable Options {\n type = \"Object\";\n exported = true;\n persistent = false;\n}\n#M64FUpLsIJLTUj44\naction example() {\n #HaX1MKDnbGBzPPnq // Document your library here!\n meta private;\n meta sync;\n}\n", "ibksb": "meta version \"v2.2,js,ctx,refs,localcloud,unicodemodel,allasync\";\nmeta name \"blank node library\";\nmeta icon \"ArrowStandardCircle\";\nmeta color \"#ff007fff\";\nmeta rootId \"yGFW3wy9mcuwDt2lxN2XzLPS\";\nmeta isLibrary \"yes\";\nmeta allowExport \"yes\";\nmeta hasIds \"yes\";\nmeta platform \"network,npm,shell\";\nmeta parentIds \"\";\n// A library that wraps a npm module #node #npm #azure\n#xbyRT3U8tTYlJuX3\naction init(#qC2ALk0kurvg43d9 options\\u003f: * Options) {\n #MNkyanFCYYm1mj2c // Initializes the library. Call this action from your ``_init`` function.\n #t7IXp9pyue4DKV3r app→import(\"npm\", \"TODO: npm package name here\", \"*\");\n #pAoVhCYiE8wIBNx2 data→logger := app→create_logger(\"TODO: mylib\");\n #PUrP48D9R04LP8ev // TODO: use `app-> server setting` to read environment variables or node command line arguments.\n #x5295YzyzYEkwRz9 // TODO: use `app-> javasctipt` and `app->javascript async` to proxy with javascript.\n #fNRnVruS6cg7D9H3 // TODO: write some unit tests!\n #xlb7m4Eyw0BWFbzP // TODO: change the script description\n #s4LqDBpWVhF4APDU // TODO: write the docs in `code-> example`\n}\n#SHXfYJBDaSY28xmP\nvar logger : App_Logger {\n transient = true;\n}\n#BdGhpbmca\ntable Options {\n type = \"Object\";\n exported = true;\n persistent = false;\n}\n#egka9cxvzrsZcSyc\naction example() {\n #xbnNQHjvSDNjeKCB // Document your library here!\n #CHb8jtuTrMd1PuMI // {imports}\n meta private;\n meta sync;\n}\n", "inzlg": "meta version \"v2.2,js,ctx,refs,localcloud,unicodemodel,allasync,upperplex\";\nmeta name \"advanced topics\";\nmeta icon \"Capitalize\";\nmeta color \"#ff66ff00\";\nmeta rootId \"npPeJGVIwzXSzviuRJx4QZdx\";\nmeta hasIds \"yes\";\nmeta platform \"current\";\nmeta parentIds \"\";\n// Documentation. #docs #content\n#dPls0VOqrjVgrd8l\naction main() {\n #xrsW4qaXYgfIbt3y // {parentTopic:contents}\n #d3Mt25zk5OtB7p1q // {priority:18}\n #n8nYubeSJAy44z3V // This section highlights advanced programming techniques with TouchDevelop, from testing and debugging to working with web services and cloud-based APIs.\n #A2gpx4JKDMpPreG2 // ## working with code\n #xKHgDuZA9CDWVRvz // * [coding guidelines](/codingguidelines)\n #mZ7vCfgMwseLMcU2 // * [](/debugging)\n #DxgnNlqjP2PmFJyy // * [](/testing)\n #mClTcZMKYR837I54 // * [](/profiling)\n #sKUw6xXGoNI93ext // * [](/coverage)\n #cg4SuHwjzmBSBiYV // * [](/refactorings)\n #BWzEufAUIGczyAse // * [](/plugins)\n #x8rcyx8d9Jojr6Rd // * [hosted apps](/hostedapps)\n #xEQPTaV6NZqozCt4 // ## exporting\n #pnSWGGicOCNMrbwm // * [exporting scripts to apps](/exporttoapp)\n}\n", -"iurla": "meta version \"v2.2,js,ctx,refs,localcloud,unicodemodel,allasync,upperplex\";\nmeta name \"what\\'s new?\";\nmeta rootId \"oGIahryiInwIpsu2H7pX84CQ\";\nmeta hasIds \"yes\";\nmeta platform \"current\";\nmeta parentIds \"\";\n// release notes #docs\n#gMH7AtpXfxA2FZuYuc70zvTg\naction main() {\n #KN6Hyh4R0VdJdW12 // {parentTopic:contents}\n #C4J9deHXvt4lAMtW // {priority:1}\n #xNGLl7UVKMsrfBtR // {hide}\n #hdiFhuPgtoIAxNMU $board := media→create_landscape_board(800, 480);\n #YFcbdAvVWgJIYuA2 $pic := media→create_picture(480, 800);\n #xHyoPiwr1eIqHsx8 $thing := records→thing_table→add_row;\n #KTDbHXA9o6IYn06Y // {/hide}\n #Gm1rJgBBb7mfxnas // * **Join the [TouchDevelop Updates group](#pub:evjjxsjs)** to be notified about upcoming features and releases.\n #q1OyHlYqW8XFO7uC // ## February\n #bLGyRe88cWcUwPM3 // * deprecated crowd source run and coverage maps collection.\n #NSnGZHMZvQDX4awK // ### January\n #v3L9m2jXHjGCLbDw // * switched the app generation to App Studio and Cordova\n #ZFUQ9GsEs5SSkbgs // * button plugins can load buttons in the editor\n #tS9RO2F48DYHv6bV // * set a wallpaper in the hub!\n #kiA1lM0tw2WGGYET // * set an **icon** and **splash** picture art resource on scripts. The icon is displayed on all searches.\n #Vlmnwr0jCxc0bCty // * support for Python **pip** in ``app->import``. TouchDevelop creates a Python virtual environment and install the required pip packages.\n #wZ2rVQ3FOGZWfEdD // ### December 2014\n #x5oG13lAF6NZyDli // * [group scripts](/groupscripts) allow multiple users to collaborate on a single script\n #PVabV6GQFdt4XBag // * `app->import` allows to import **Node.JS npm** or **Apache Cordova plugins**.\n #wiTYksRN9Hv2iVnq app→import(\"npm\", \"azure-storage\", \"*\");\n #HA4q6o3aE7Cyz6tE // * script [plugins](/plugins) can have button inserted in the script editor\n #qV0pfa992reHW5Hv // * new [arduino tutorials](/arduinotutorials)\n #xJUEp8q1O2PUK74X // {pic:arduino blink:4x4}\n #pZ3uWaouxVtg7RPO // ### November 2014\n #YjF6a4nYSKYHJSXX // * An awesome new tutorial with super-cool videos that explain every step!\n #jSFgLhHY5aFFw6e0 // {follow:Coding Jetpack Jumper!}\n #sLrTw2l2DAXtP4qI // * **beta only:** real time multi user editing of [group scripts](/group scripts)!!!\n #pVVkVwNlJE44ZhD2 // * **beta only:** different editor modes for different users: try the **block mode** and **pro mode**\n #KKYOD6Rx6EWIgrDZ // {pic:block mode:7x7}\n #VnMmHhxgba8g0XJc // {pic:pro mode:7x7}\n #xJCceQUmsB4YdCsp // * new api `app->restart` let's you easily restart your script\n #xmEi5ZOJuHyI5cmR // ### October 2014\n #xnkgZyJ68CUy3ob1 // * when publishing, **add a release note** from the publish dialog\n #OkKSuSF4FBBR0jIS // * fork scripts and **[send a pull request](/pullrequests)**\n #rg4flIOCfg42dcfV // * `[go to]` now works for [extension actions](/extension actions) and [](/libraries)\n #ozPvx4o6D0mIKCYG // * **drag and drop** of statements in editor (when applicable)\n #iGxwLE2IEBp0mtrf // {pic:draganddrop:17x11}\n #aVJIaCI47ed62nvp // * libraries are bound a main script which allows to edit a referenced library and still run the script without switching.\n #Pn0iqqaRpZMaCsIR // * script comments are automatically loaded for earlier versions\n #gzErp0wP0OfPBo4T // * documentation can be browsed outside the editor at [](https://www.touchdevelop.com/docs)\n #K3MUP9gl62nlCIvO // * tutorials and documentation topics are automatically translated using Bing translator based on the browser language\n #vulQJpxFQTfIWRer // * the crowd-sourced localization of TouchDevelop has started! Try it out at [](https://touchdeveloptranslator.azurewebsites.net/)\n #hdQ0ZCKjkKssc0CV // * `box->set font family` allows to specify the font on a box\n #FQYXdoSkXUc82Uyx // * when renaming a local variable to a name that already exists, the editor proposes to merge the two variables\n #pvDy7RQo6TFK3JQZ box→set_font_family(\"Georgia\");\n #VKS8E7BPD7acVcd9 // * new `Sprite->left`, `Sprite->right`, `Sprite->top`, `Sprite->bottom` action to get the coordinates of the bounding box of a sprite.\n #rxbculFeHF4gcwv3 // * new `Buffer->concat`, `Buffer->read number`, `Buffer->write number`, `DateTime->milliseconds since epoch`, `math->div`, `web->encode uri`, `web->decode uri`, `web->encode uri component`, `web->decode uri component`\n #btWsFTctkwUp73lj // ### September 2014\n #Zizy5aFD6EU16ku6 // * new bear and pixel art tutorials leveraging the ``{stvalidator:...}`` macros.\n #vN6499h5IP4Ufmvl // * easy access to `app->log` through new button.\n #cE2MQC4SVXlvLHas // * richer logging infrastructure throuugh `app->create logger`\n #xr0ympiTptzn4h9r $logger := app→create_logger(\"my logger\");\n #pLB29ibkA6YwZyiU $logger→debug(\"a debug message\");\n #DbLce24L1veQ4HhT $logger→info(\"an info message\");\n #Wi1rReEWmIl7rQNT $logger→info(\"an error message!\");\n #B4gUxU6KbPiTzprj // * `Sprite->fit text` wraps the sprite bounding box around the text. `Sprite->set text alignment` allows to control how the text aligns vertically.\n #xda3VWfBlQDkajcz // * new ``{pici:...}`` and ``{sthashtags:...}`` macros for tutorials.\n #n1V224nUV7Hx7Bp3 // ### August 2014\n #xqmwBEi2K2Mx5XB3 // * `[comment out]` now shows up as an option when `[select]`ing lines of code\n #KDBouGJ0yqwbuLSC // * `[uncomment]`, `[strip if/for/...]` are now options when editing block statements\n #xmpTPUNKKU1NP1Z4 // * when you `[edit library]` from a script (which is now also more easily available) it adds a temporary link from the library to the parent script, so it's easier to go back and you can **deploy** parent script from the library; shortly you'll be also able to **run** it\n #xvEm557GPTJvAkdd // * new APIs: `Buffer->concat`, `Buffer->write number`, `Buffer->read number`, `math->div` (integer division), `DateTime->milliseconds_since_epoch` (epoch is, of course, 1970-01-01)\n #xi1ICDInif6b0xd5 // * tutorials with `{stvalidator}` now have access to `app->editor`\n #ducKZaXdvSn1LLWU // * Windows Phone 8.1 Update 1 is now supported\n #dKHLgvcRUKWRB84x // ### merging scripts\n #x9vdf8GQj929RnyG // At the bottom of info pages about published scripts there is now a new `[merge]` button. It let's you pick a target script in your account. It will then merge the changes between the common parent of these two scripts.\n #FS4bg5kyR0AJXVb8 // This feature is **beta** only.\n #xT4nXwphk9EENGK3 // ### July 2014\n #ptCPf721OV3p0bSr // * immutable types (i.e., ones which once created never change) are now marked with a little diamond\n #x6lLNbQg7et2EZAk // * new API `Collection->map to`, `Collection->ordered by`, `Collection->ordered by string`, `Collection->sorted` - higher order programming is coming to TD! we now also have `Collection->take`, `Collection->slice` as well as `create->collection of->...` for creating collections of arbitrary types\n #nr9bjJXxESYCawUV // * new `->wait for update` API on tables and indices\n #uq2o327lpSaTRI2S // ### June 2014\n #wYV4JrgD5s6FWI7t // * support for `Gamepad`\n #tgVzFk67GzK95nT0 // {pic:Xbox 360 gamepad:11x11}\n #efC2PV6rDZ5wWJSF $gamepad := senses→gamepads→at(0);\n #xMvOhtOZkTPT54DT if $gamepad→is_button_pressed(\"x\") then {\n #Utu0GZArBP4Iprto // shoot!\n }\n #Yrlb4Ry3y8K2yqvh // * custom validator in tutorials\n #VMedROHjGmtTxM80 // * split screen view in editor\n #dguL9eRXAIzNSOXO // ### May 2014\n #QWm8SUaVFH9e3eY9 // * `Task` now has `Task->completed`, `Task->value`, and `Task->await at most` [more info] (/asyncActions)\n #o0nc5EVOVV2R9g2h // * Logs are enabled also for published scripts\n #fOnZlHemD3JokxwO // * wait for messages from the parent frame\n #eQjUBLmGkFbpkASK $js := web→wait_for_message_from_parent(\"https://www.touchdevelop.com\");\n #xBTaJtW0yjIFW8y8 // ### April 2014\n #M0PSSIvUWBJWmqhi // #### Export to Android\n #ctXEW1KYFYvdXlH0 // Take your favorite script and [turn it into an Android app](/exporttoandroid)!\n #amczWXR0V2J7DYl7 // #### Export to Windows 8.1\n #kyhYUwojXgNfMI32 // We've updated our template and the exported Windows apps are now targeting 8.1.\n #kTE9uNrD2RWoBT8C // #### post and receive messages\n #xFLQsORmFJjTxlq8 // For the adventurous, it is now possible to post and receive messages between a TouchDevelop web app and its parent window.\n #x27TCdxiSFnSSMb4 // * post a message\n #xbK2liAPKS6bwodb web→post_message_to_parent(\"https://www.touchdevelop.com\", web→json_object);\n #IPRrn0QlLOhB36OK // * listen to incoming messages\n #ejJR3FUPFfM2qqPs web→on_received_message_from_parent(\"http://yourhostdomainname.something\", $received);\n #vLKi4zZGzwnvOZKR where received(json: Json_Object) {\n #zfHUftNJW4BFsMnC skip;\n }\n #h4LDm62JHbaOimTo // #### background pictures on boxes\n #tmivmy8mhcNZh7Nr // You can efficiently set one or more pictures as the background of a `box` using `box->add background picture`. The API does not impact the size of the box.\n #ZoveBWBWaAMGSRPz box→add_background_picture($pic, \"center center\", \"cover\", \"no-repeat\", \"scroll\");\n #hw6nBaRo847s9iil // #### hiding the title bar on pages\n #cN1c17sI2xSC1udr // You can hide the title and subtitle bar on the pages.\n #xEdUS4FJiwZ9cu64 wall→show_title_bar(false);\n #j2tWdyNbps42FXSb // ### March 2014\n #xtgXEU8BB93WTtil // #### Reorganized tutorials section\n #xF2Nm2dJhzBnD6Ul // As the list of tutorials grew longer and longer, we've reorganized them into categories. Tell us what you think!\n #Abb9Odg3L9wtP6CC // * [check out the new tutorials](/tutorials)\n #SWZt9P29nFdqDPWN // #### OneDrive support\n #wK1vvSAAQuubRjSe // Upload pictures to OneNote easily. The resulting `Cloud Picture` can be stored in an table or index.\n #i6Edi5yctYksdwAs $onedrive_pic := cloud_storage→upload_picture($pic, \"public\", \"\");\n #eixE9tEciDf527YB $onedrive_pic→post_to_wall;\n #gnsNGxGAvLzW8iPj // A `Cloud Picture` can be stored in tables and indices which allows to share them!\n #xUEtu327qEiqNCH5 // #### OneNote support\n #MOfJQ69dhYEfGh4Q // Create new pages in your OneNote with text, pictures and more!\n #Z6AD6VuAj7wvRmC3 $form := web→create_form_builder;\n #PmtsdZrr1bPrr6Wh $form→add_string(\"Presentation\", \"Yay!\");\n #FPKHJtraWucSSGz4 cloud_storage→upload_note($form);\n #tWo2ES4E2W2AxF2n // #### Arduino Esplora support\n #zk7g7nfYGBsnW4xB // Build scripts for the Esplora board using TouchDevelop! Look for the `[blank esplora]` template to get started.\n #InttAI7LPAREaWHr // * try the [esplora level tutorial](/esploraleveltutorial)\n #OjhdxFirqdh0Qxia // ### February 2014\n #mNMXPx1B3mJNvoXz // #### new refactoring: move to library\n #UFVd0ZAosyc8yuKN // Is your script getting too large to manage? Think about using the [move to library](/movetolibrary) refactoring support to move related elements of your script into a library.\n #rQqJWd7kKhaagTp8 // #### parallax backgrounds\n #RnNVp2kbW5LCV1Gb // Create awesome scrolling effects with the [background scrolling](/parallaxbackgrounds) support.\n #LKhR34KG7Qp8929Y $scene := $board→background_scene;\n #sXpKhu2tm8bVC4AF $back_layer := $scene→create_layer(0, art→nature);\n #On3ZT1H5qzrbg2h4 // Take a look at [this demo](#pub:cprja) from David Renton!\n #Sc0DUKR92oVvpXz1 // #### keyboard support\n #qm6AHO0Ztm5fF7ah // You can listen to key pressed on the keyboard (if available). You can listen to event or simply query for keys.\n #ByDk09RpVj9Qy89I // * attach an event. It will repeat automatically if the user keeps pressing the key.\n #xY2tf5SdjS2w7NwX senses→on_key_pressed(\"space\", $handler2);\n #gHo1W85uQlQ7AQFc where handler2() {\n #qQzuB57IuP2pRDf5 // Do something when space is pressed\n }\n #PJsvNHxqXEV4DpwY // * query the status of a given key\n #damdUTIZtFzTPOJD $b := senses→is_key_pressed(\"space\");\n #xgwYHHUeAswJjL23 // ### January 2014\n #UdpXhKxqwusZzcM9 // #### page models\n #HN3PLMP1v9TfStnm // [Pages](/page) now comes with an associated object type to store the **data**. It is edited together with the page in the **data** section (see example below). Every time the page is pushed a new instance of the page data is created.\n #PIgKRS2bXzpgRdv9 // {decl:show}\n #xLuQ6yyrI49hxwgI // #### timers\n #EzPTlUMkQ8MeNGad // Using `time->run after` and `time->run every`, you can schedule a handler of code to run once or at regular intervals.\n #tbjUYrS0xPoq4EZ4 time→run_after(3, $perform);\n #vl74hr7B4Ynhz4gh where perform() {\n #d137srI0VHIgQ42p // this code will run after 3 seconds of delay\n #SIAlx8bJyftKzpL5 skip;\n }\n #xLTuQBp8wQxge4o0 // The action `time->on every frame` allows to register a handler in a built-in game loop timer.\n #xs2TIThvzy4VmxSj time→on_every_frame($perform2);\n #VHQKoOSby2fgVy0G where perform2() {\n #xc6AoudLjgxb3kb8 // runs this code many times a second\n }\n #vI0j1XSJu32BYFH2 // #### inline events\n #D0b8PPRagmEnMBPj // We've added inline events for various global events. This means that you can attach (and detach) handlers to the `shake` event by using `senses->on shake`:\n #rUuLSLcoSl3H2r4s senses→on_shake($handler);\n #xlCmu8p3fAnRtNPw where handler() {\n #xnzuKlrGp4X55CHj // this code runs when the device is shaken!\n }\n #y2CRR2t1v2YVmuLP // Also added: `senses->on phone face up`, `senses->on phone face down`, `senses->on phone landscape left`, `senses->on phone landscape right`, `senses->on phone portrait`, `player->on active song changed`, `player->on player state changed`.\n #BhRIcWMBNbJvSgFD // #### maps\n #tk8SkFGqsFVJgeO0 // You can manipulate map **pushpins** easily: you can move thenm and register code on their ``on tap`` event.\n #uF2SA7ZTUdQZfvuh $map := maps→create_map;\n #Hgqk1s1QruxOWPzZ $pushpin := $map→add_text(senses→current_location, \"Yay!\", colors→accent, colors→white);\n #GKU7C0T2YuGvC1Yo $pushpin→on_tap($tapped);\n #AMTeUqcKWnOCSyyT where tapped() {\n #jlU4tkiDOjtZYvkl // runs when the user taps the pushpin!\n }\n #pAUqAIkNXXJCb9q3 // #### sprite sheets and animations\n #gGSGqj4mRdbLbkCH // A [sprite sheet](/spritesheet) is a picture that packs multiple images of an animation. It is commonly used in 2D games to create animations and efficiently package pictures together.\n #VDMtLedYw41T9Xb1 $sheet := $board→create_sprite_sheet(art→sheet);\n #xSaZgZfCa7PCKjv9 $sprite_ := $sheet→create_sprite(\"monster\");\n #x1gRQzNt9OCfUVf6 // Sprite properties such as opacity can be animated using [sprite animations](/spriteanimation).\n #iRBePYa2iGsxxJay $anim := $sprite_→create_animation;\n #nfZxLBbjP8x8yaSy $anim→fade_in(1, \"expo\");\n #AUlcOKPa0sQ8ZrC2 $anim→fade_out(1, \"quadratic\");\n #tENQxAxwNH3izuvf // #### obstacles\n #Dk9mqBesyVrHn4tD // The `board->create obstacle` returns an [](/obstacle). You can change the color or attach to events on the obstacle.\n #gJC20L3zXnGWyWoQ $obstacle := $board→create_obstacle(0, 0, 100, 100, 1);\n #BVV3SlloJE5xdWGq // * play a sound when an object bounces\n #NJCf0QLA4nM6HWg7 $obstacle→on_collision($bounce);\n #DFui22yFHSa20lr3 where bounce(sprite: Sprite) {\n #x2M80w4jYg0s4dsH // runs when a sprite bounces on the obstacle...\n }\n #n84Ok32Cpn7N1xz8 // * remove obstacle\n #FD8f8ntRjTFOYgFd $obstacle→delete;\n #pIrlAfuEH2f27VXp // #### other stuff\n #Gsjj7aKcN41DVmqS // * `senses->record microphone` support through [WebRTC](http://www.webrtc.org/)\n #siRQjDie3HsLnHy3 // * improvements in [](/libraries) documentation authoring\n #tB4O84e4OIJ4dllC // * customizable zoom factor for text (look in Settings in the Hub)\n #KeUiAm45I2EcZQD6 // * you can now define your own [action types](/actiontypes)\n #sn41TNhNQH2h5mxJ // * control structures (like `for` or `while`) are now displayed with an `end` keyword at the end. This makes it easy to add stuff after them and makes the scoping clear.\n #Us2LVnhyUmzSftLG // ### Older release notes\n #iuHW7I32l31xjT77 // * [what's new? 2013](/whatsnew2013)\n}\n#xDaFBvTdimT9orVbFsfSFNFA\naction show(#nb8QcaSLy2sZRFD6 \\u2756: * show_page_data) {\n #q3zqAKeTpljUqtLP if box→is_init then {\n #LtNAF02isq7bKo49 $\\u2756→counter := 0;\n }\n #i34bAjBmEr64ak5s if true then {\n #ctaNyxHk2oPV2rkg $\\u2756→counter→post_to_wall;\n #EAhNogbWhLE2FLDo box→on_tapped($handler);\n #s5Bl3Y1Ot2Zppsix where handler() {\n #fgBm1IJ8ju4qa46h $\\u2756→counter := $\\u2756→counter + 1;\n }\n }\n meta page;\n meta sync;\n}\n#BICBuYW1lICAa\ntable show_page_data {\n type = \"Object\";\n persistent = false;\n fields {\n #xUj2CwS6PTK5ZjC6yGL8Y8E6 counter : Number\n }\n}\n#dys4Eewl2C5GN3fDN4Rz9Mnz\nvar sheet : Picture {\n is\\_resource = true;\n url = \"https://az31353.vo.msecnd.net/pub/lvxdmali\";\n transient = true;\n}\n#zHH1uV1wY4qUHQzfaBkZaooz\nvar nature : Picture {\n is\\_resource = true;\n url = \"https://az31353.vo.msecnd.net/pub/pxuumvdl\";\n transient = true;\n}\n#BdGhpbmcgdGFibGUa\ntable thing {\n type = \"Table\";\n persistent = true;\n fields {\n #d7R6BWVqibW7FAhFCsKVV2vM pic : Cloud_Picture\n }\n}\n#xQ2tUepQG3htXvNC9XJ9Blq1\nvar Xbox_360_gamepad : Picture {\n is\\_resource = true;\n url = \"https://az31353.vo.msecnd.net/pub/qmrebwzq\";\n transient = true;\n}\n#MaJHONlLZA7msNcK\nvar draganddrop : Picture {\n is\\_resource = true;\n url = \"https://az31353.vo.msecnd.net/pub/ugbrfmxk\";\n transient = true;\n}\n#M0DWrZa7ca1vfLan\nvar pro_mode : Picture {\n is\\_resource = true;\n url = \"https://az31353.vo.msecnd.net/pub/flnuktvd\";\n transient = true;\n}\n#wuUz5Ma8wz5BM24J\nvar block_mode : Picture {\n is\\_resource = true;\n url = \"https://az31353.vo.msecnd.net/pub/ujvglgks\";\n transient = true;\n}\n#u1V47sacOEL1Wdh4\nvar arduino_blink : Picture {\n is\\_resource = true;\n url = \"https://az31353.vo.msecnd.net/pub/ilohpnvs\";\n transient = true;\n}\n", "kkwd": "meta version 'v2.2';\nmeta name \"physics game starter\";\n// Tap the screen to creates bubbles!\n\naction main() {\n // The board is a 2D canvas with a physics engine. Gravity makes sprites fall and boundary makes them bounce.\n wall→set_background(colors→random);\n data→board := media→create_landscape_board(800, 480);\n data→board→set_gravity(0, 400);\n data→board→create_boundary(0);\n $info := data→board→create_text(100, 20, 24, 'tap to create bubbles');\n $info→set_friction(1);\n // Display the board. The game loop will start after leaving main.\n data→board→post_to_wall;\n}\nvar board : Board {\n}\n\nevent gameloop() {\n // Apply physics and redraw.\n data→board→evolve;\n data→board→update_on_wall;\n meta private;}\n\nevent tap_board\\u003a_board(x: Number, y: Number) {\n // When the board is tapped, create a circle sprite that falls down.\n $circle := data→board→create_ellipse(100, 100);\n $circle→set_pos($x, $y);\n $circle→set_color(colors→random);\n $circle→set_friction(0.005);\n}\n", "krvn": "meta version \"v2.2,js,ctx,refs,localcloud,unicodemodel,allasync,upperplex\";\nmeta name \"blank docs\";\nmeta icon \"GPS\";\nmeta color \"#ffa1caf1\";\nmeta rootId \"kPNw3L4aANMbOhHGjD3Zu2QI\";\nmeta allowExport \"yes\";\nmeta hasIds \"yes\";\nmeta platform \"current\";\nmeta parentIds \"\";\n// TODO: update the description. #docs\n#KuT2EaOAEn47T69Y\naction main() {\n #yiJrPOX5VkxgcJrp // You can use the [](/markdown) syntax to write **documentation**.\n #K1W8LqOgGHoaTE04 $x := 42;\n #velf3fNZzB4D7q65 // And interleave code as need or even insert snippets using the ``decl`` macro:\n #zrmo9BjVQdTGtzPL // {decl:main}\n}\n#xOiiduqfYBGjAp4X\nvar snd : Sound {\n is\\_resource = true;\n transient = true;\n}\n#LrnoHkgZHl46sgP8\naction test() {\n #aS25XlJHypSNPB32 skip;\n meta private;\n meta test;\n}\n", "krxlb": "meta version \"v2.2,js,ctx,refs,localcloud,unicodemodel,allasync\";\nmeta name \"gamepad\";\nmeta icon \"JoyStick\";\nmeta color \"#ff9955bb\";\nmeta rootId \"xCYAjTKR25pBB4IRmMK0nm4f\";\nmeta isLibrary \"yes\";\nmeta allowExport \"yes\";\nmeta hasIds \"yes\";\nmeta platform \"current\";\nmeta parentIds \"\";\n// A library that provides a virtual gamepad with keyboard, touch, accelerometer or physical gamepads.\n#main\naction example() {\n #iAAUNeoV3SRfYzb2 // The virtual gamepad that works for accelerometer, keyboard, touch, mouse or console gamepads.\n #Iq9tqh2gWM4rizSm // The library computes a vector that represents the orientation of a virtual joystick.\n #owlUjuL8ac2hBSAk // {hide}\n #FuQWVPr2FDIJMzYz $board := @\\u267b→game→start;\n #xgK3eb0xoxbkyneh $sprite := $board→create_ellipse(20, 20);\n #ZWPwsGsl9p64ZV3A // {/hide}\n #OmphHpb5CKI7uf6f // ### reading data\n #Vskl34wFNiYSQrbW // Use the `current` action to get the current angle of the joystick and the button status.\n #Xe4qJzFH1BMswBVG $p := code→current;\n #Govj2D79bADsyfG4 // The values ``x`` and ``y`` of ``p`` can be used to apply speed or acceleration to sprites. They are always between ``-1`` and ``1``.\n #xJS2TNmfJBQZzks4 $sprite→set_speed($p→x * 50, $p→y * 50);\n #xLS5Ne0GtAN3wBxc // The values of ``x`` and ``y`` ramp up from ``0`` to ``1`` or ``-1`` which allows to create smooth animations. They also ramp down.\n #gesKcthIr5iJV9Bf // ### handling button presses\n #LZHni02fBp8J2dYZ // The value ``z`` indicates if the button is pressed. ``z`` also ramps up from ``0`` to ``1``.\n #krIr922mSJTyUZQl $sprite→set_acceleration_y($p→z * 10);\n #xiCO9EoNc4Nerwbo // You can also register an action that will be raised when the button is first pressed. If the user uses a keyboard, this means that ``space`` is pressed, or it may be a mouse click or pressing a button on a gamepad.\n #qZu0cbj2DyIfzU52 $binding := code→on_button_pressed($@action);\n #imT7vW8zBSjB3Aop where @action() {\n #rVEC9zk3x0gC4OZb // flap the bird!\n }\n #GNOC4Ry9eimP29CM // Later on, you can use ``binding->delete`` to remove the action.\n #cfjCbfsrwwA0ZqyT $binding→delete;\n #gwgZhz1b4YvIekRt // ### controlling sprites\n #k2bfNyVWE76ny2I7 // The ``control sprite`` provides an easy way to control a sprite with the joystick.\n #jzhDiTAvPAg57yvr code→control_sprite($sprite, 50, 0);\n #xOJhGHYxDX6GHNuT // * where ``50`` is the maximum ``speed x`` so the sprite moves horizontally with the joystick\n #S908Ce7SKZnvE2Bg // * where ``0`` is the maximum ``speed y`` so the sprite does **not** move vertically with the joystick.\n #TxTHOrAKW201NNub // ### controlling the background scene\n #UHNq8hFA8hDCdhIg // Similarly to ``control sprite``, the action ``control backgroung scene`` will move the scene view position according to the ``current`` value.\n #SvPpf8Hshabf4Uvm code→control_background_scene(0, 10);\n #kRyIJdzWHDHzzqAe // ### accelerometer\n #x5sT7QqO3Ys47Gre // By default, the joystick uses the accelerometer if available. It can be disbales or enabled using ``settings->use accelerometer``.\n #H2L3DDUr5DSWJbOI code→settings→use_accelerometer := false;\n #AouqZGsi7N5U7ubU // When the accelerometer is used, touch is used solely to record button presses.\n #x2VFytPS2zWM4dlC // ### custom keys\n #jYpIpb7O5eCkMXG8 // By default, the keyboard uses the arrow keys and space. Use `set keys` to use a different set of keys.\n #gGG5PlUtox03FCmh code→settings→set_keys(\"a\", \"w\", \"d\", \"s\", \"space\");\n meta private;\n meta test;\n}\n#yPeu0IKvKxtuSD7c meta import game {\n pub \"sduub\"\n usage {\n action `sync` set_score(value: Number)\n action `async` set_life(value: Number)\n action `sync` start_timer()\n action `sync` start_countdown_timer(seconds: Number)\n action `sync` life() returns(r: Number)\n action `sync` score() returns(r: Number)\n action `sync` current_time() returns(seconds: Number)\n action `sync` add_score(value: Number)\n action `async` add_life(value: Number)\n action `sync` clear_timer()\n action `async` remove_life(value: Number)\n action `async` end()\n action `async` start() returns(board: Board)\n action `sync` reset()\n action `async` start_with_fixed_size(width: Number, height: Number) returns(board: Board)\n action `async` start_with_background_picture(pic: Picture) returns(board: Board)\n action `sync` board() returns(board: Board)\n action `sync` on_end(@action: Action)\n action `async` splash_text(message: String, seconds: Number, foreground: Color, background: Color, done: Action)\n action `async` start_landscape() returns(board: Board)\n action `async` start_portrait() returns(board: Board)\n action `sync` set_hud_colors(life: Color, timer: Color, score: Color)\n action `sync` hud_sprites() returns(sprites: Sprite_Set)\n action `async` life_visible() returns(b: Boolean)\n action `async` set_life_visible(visible: Boolean)\n action `sync` sprites() returns(sprites: Sprite_Set)\n action `async` set_background_scene(direction: String, pic: Picture)\n action `sync` bounce_on_sides()\n action `sync` create_sprite(pic: Picture) returns(sprite: Sprite)\n }\n}\n#qDcj96avRPrOW0HP9ddHIGDX\naction current() returns(#SPQYjzyoWvpeE5gt p: Vector3) {\n #ufnmt4tCZLjrO8Tw // Gets the current gamepad position. ``x``, ``y`` represent the angle, ``z`` represent the button. ``x`` is between ``-1`` (left) and ``1`` (right), ``y`` between ``-1`` (up) and ``1`` (down), ``z`` between ``0`` (released) and ``1`` (pressed).\n #K24bzS6d5dLCg70O code→initialize;\n #xAMQZhHolKwnH85G $now := time→now;\n #NKbyhJdf10449w1j $dt := code→check_last_current($now);\n #tvuqtvwZjf2WTFdV $vector := records→Vector→create;\n #SgjdVJE0JKpuCIDH $any_gamepad := false;\n #UCUZ4M8UBYsds6Bk foreach gamepad in senses→gamepads\n #PS1NasLc8vbJrVTF where $gamepad→is_connected\n do {\n #xlXsKI4PRPX0iBSR code→compute_gamepad($dt, $vector, $gamepad);\n #DyNM0jOUPeDyS6fX $any_gamepad := true;\n }\n #xBZ8zCuwMS8krcBu if `not` $any_gamepad then {\n #CyCCbKxg4vqTMewD code→compute_keyboard($dt, $vector);\n }\n #cwR4Eid54DDf549Z if data→\\_settings→\\_accelerometer then {\n #kp59r5CUOcmqTupl code→compute_accelerometer($dt, $vector);\n }\n else { #B9H3ZCbj5SQ03j7I if @\\u267b→game→board→touched then {\n #PGgITIMyD77HqtMV code→compute_touch($dt, $vector);\n }\n else { } } \n #jFEB3QBWrx0td7Uf data→\\_current := math→create_vector3($vector→x, $vector→y, $vector→z);\n #n6WZh7F4fYEQIvv1 data→\\_current_time := $now;\n #oDUWcYIBCj2AGWFI $p := data→\\_current;\n meta sync;\n}\n#LJp5GBFLELwUrK3r6yVHOfL1\nvar \\_current : Vector3 {\n transient = true;\n}\n#k7HatejkjqfIA242SSMpitAK\nvar \\_current_time : DateTime {\n transient = true;\n}\n#uYKZvu9VJlQJWlN4YZ8bPdOY\naction compute_touch(#EtnUI7jAfTxsnmC2 dt: Number, #lwWp15agk6qD4vdN vector: * Vector) {\n #Yc6Ljy2Kf77vAJE1 contract→assert( `not` data→\\_settings→\\_accelerometer, \"\");\n #aeff4ISwAiII2RYg $board := @\\u267b→game→board;\n #yo6SJ6XLPigLcePS $dist := $board→touch_current→subtract($board→touch_start);\n #nd4lO2qkviheKQQJ $r := math→min($board→width, $board→height) * 0.3;\n #xTZ3w0K2Vk4SDgG5 $m := math→max($r, math→max(math→abs($dist→x), math→abs($dist→y)));\n #x5FkjD7QKOi14bXx $p := $dist→scale(1 / $m * data→\\_settings→\\_keyboard_factor);\n #ar97E48abhnLItBH $vector→x := math→clamp( - 1, 1, $vector→x + $p→x);\n #xWe42O1gJ8jTOtYh $vector→y := math→clamp( - 1, 1, $vector→y + $p→y);\n meta private;\n meta sync;\n}\n#l4qZbEXuo0rCJ9p2l2546YMX\naction compute_keyboard(#agAE8QNlfT10TA8L seconds: Number, #QqtJbJ3bDDMJ6U1U vector: * Vector) {\n #xQvrhXDEZNLchRD1 $ramp := 0.4;\n #WqLlvN4eJaGlJC0G $deramp := 0.9;\n #GWAdBf4KVYtidymi $settings := data→\\_settings;\n #gOqhTN0E7f2RegEc $f := $settings→\\_keyboard_factor;\n #aAkuAGlBzQhKJw20 if `not` data→\\_current→is_invalid `and` $seconds > 0 then {\n #N0Bkg1ID2lRgdDtf $vector→x := data→\\_current→x;\n #lvUYGko8mZzeHc6V $vector→y := data→\\_current→y;\n #UQqL226sbMoeuKuS $vector→z := data→\\_current→z;\n }\n #j5LDrMTjvgNlPcNv if senses→is_key_pressed($settings→\\_left_key) then {\n #xn9Er5aq2bDVJi2I $vector→x := math→clamp( - 1, 0, ($vector→x - $seconds / $ramp) * $f);\n }\n else { #Kl0ql42NLDKUGvRF if senses→is_key_pressed($settings→\\_right_key) then {\n #Sqqq3YnIb2PBOqBS $vector→x := math→clamp(0, 1, ($vector→x + $seconds / $ramp) * $f);\n }\n else {\n #HayKmkb4wsCPhWA7 $vector→x := $vector→x * $deramp * $f;\n #pXLE351So9iM8EYM if math→abs($vector→x) < 0.05 then {\n #UKGenIUclEZAJnZ9 $vector→x := 0;\n }\n }\n } \n #xCOScmqJMBvGOFsF if senses→is_key_pressed($settings→\\_down_key) then {\n #mymWVgslyKEmFBDi $vector→y := math→clamp(0, 1, ($vector→y + $seconds / $ramp) * $f);\n }\n else { #ANgXb90ciinu1c08 if senses→is_key_pressed($settings→\\_up_key) then {\n #wzqzC3IBiGt83wCI $vector→y := math→clamp( - 1, 0, ($vector→y - $seconds / $ramp) * $f);\n }\n else {\n #H5PDO9dmid1b4OG6 $vector→y := $vector→y * $deramp * $f;\n #oVbCQ74UwHpbDU3m if math→abs($vector→y) < 0.05 then {\n #rdxiuAjRrQaBVDgJ $vector→y := 0;\n }\n }\n } \n #P7vuxXV4hIsABGid $click := data→\\_settings→\\_accelerometer `and` @\\u267b→game→board→touched;\n #NJia5AtUzVRAue2I if senses→is_key_pressed($settings→\\_button_key) `or` $click then {\n #jDP8eblTFKDgs0P4 $vector→z := math→clamp(0, 1, ($vector→z + $seconds / $ramp) * $f);\n }\n else {\n #bfu4Xe5wPIFVYSU0 $vector→z := $vector→z * $deramp * $f;\n #kctdFFz43brt9U5o if $vector→z < 0.05 then {\n #Y8kiexxwCtaTI1EQ $vector→z := 0;\n }\n }\n meta private;\n meta sync;\n}\n#AKyPSHgYSnMUTq5QWdoGYf4b\naction check_last_current(#xjgjVLBvL0WGZ6YX now: DateTime) returns(#Thizg9eKf28lICqA dt: Number) {\n #ObcOFDPPp9WxhSt2 $dt := 0;\n #Kb72ZpRTA3m4Kp8U if `not` data→\\_current→is_invalid then {\n #x8ik4sk6ewFwAcfS $dt := $now→subtract(data→\\_current_time);\n #Ew4zlsnuP3h4JSI9 if $dt > 1 then {\n #EXRHRdWwI0F4HPp8 data→\\_current := invalid→vector3;\n #SquuGsAcxSF7COR1 $dt := 0;\n }\n }\n meta private;\n meta sync;\n}\n#UJBkmukg7xj2SmmTAcdYmdmZ\naction test() {\n #jHqREyI9wOqOCUqc $board := @\\u267b→game→start;\n #inxjywJVM590S1zh $board→set_debug_mode(true);\n #xGbKRxfvo4Q93kKk $sprite := $board→create_ellipse(100, 100);\n #Ic9uUBobqM3degOG $board→add_on_every_frame($perform);\n #xqlRo4rJOJlPMyen where perform() {\n #xM22BN7aFmcIrgzt $p := code→current;\n #RP4MWoA4i0njhVTB time→log(\"current: \" ∥ $p);\n #sUHisiH35bEla3UR $sprite→set_speed($p→x * 150, $p→y * 150);\n #yuKJPVDFO1cFN4g1 $sprite→set_color(colors→wheel($p→z));\n }\n #d4220TFiigYosuSS code→on_button_pressed($@action);\n #K46EjvEbVdCKdBQ4 where @action() {\n #UkfR0OrhfR70BXgP $anim := $sprite→create_animation;\n #rlbsft24Zld2dOXf $anim→beat(1.5, 2, 1.2);\n }\n meta private;\n meta test;\n}\n#xLL5SIqze7BJH9jArgnxFL1w\naction set_keys(#F1fwvPuXyWqOAgyE settings: * Settings, #qCVhDclIfaTvxR48 left: String, #jItXnxypevC73xkO up: String, #phYJQlteKaNIY8Fy right: String, #Rhj5ziYa0g1IgTfO down: String, #fGxfwRyt0642IsC2 button: String) {\n #eF8U1KL4QoC09Dpz // Sets custom keys to control the joystick.\n #jdZihqWH7R4PPh2k // {hints:left:left,a}\n #timneyKMpZRrUy2P // {hints:right:right,d}\n #KlUDH8tXmhEvDhke // {hints:down:down,s}\n #mkQo4n8pPyFWS4CB // {hints:up:up,w}\n #x5gUEO14aZOvuWdZ // {hints:button:space,enter}\n #mA2kmO4mS2sB0gGU code→initialize;\n #QtLmAF0x3BKCuNN4 contract→requires( `not` $left→is_empty, \"missing key\");\n #APG86c6eW0q18zKm contract→requires( `not` $right→is_empty, \"missing key\");\n #XI8oeyxHEGG9pdE3 contract→requires( `not` $up→is_empty, \"missing key\");\n #xamto1IEQdzpF94F contract→requires( `not` $down→is_empty, \"missing key\");\n #u7zsrNBpl2YMnGxa contract→requires( `not` $button→is_empty, \"missing key\");\n #xX6kINu4smLfSU4V $settings→\\_left_key := $left;\n #xgvIJTVCRXCbzX0v $settings→\\_right_key := $right;\n #qBkkp8802szSl6Ku $settings→\\_up_key := $up;\n #xxqcuvdCnDlG2zXt $settings→\\_down_key := $down;\n #NNy2TBcsHPoSB5HX $settings→\\_button_key := $button;\n meta sync;\n}\n#hUUrbnz6QsXzbuBs4lLmaY67\naction set_use_accelerometer(#sMb8yT6LjTfyQf66 settings: * Settings, #ZWB7PFBsxcVwbmuO enabled: Boolean) {\n #MhCet6v5VrZkHYm5 // Sets a value to enable using the accelerometer to control the joystick, if available.\n #xJbQ5KBVWJ2ZC4wt $settings→\\_accelerometer := $enabled `and` senses→has_accelerometer;\n meta sync;\n}\n#NARYT4r1qcmrRmDNdAjtkOcD\naction compute_accelerometer(#x2GnG1i2JgFiTdyI dt: Number, #l0iot4LcZEAUCbBo vector: * Vector) {\n #CdB24VEl10I21wlN $p := senses→acceleration_quick;\n #JHkzPnuUlv7pCGrG $x := data→\\_settings→\\_accelerometer_factor;\n #YunhQWUn2P4CqgQO $vector→x := math→clamp( - 1, 1, $vector→x + $p→x * $x);\n #Eb4F6YvngxPCmqxQ $vector→y := math→clamp( - 1, 1, $vector→y + $p→y * $x);\n meta private;\n meta sync;\n}\n#BdGhpbmca\ntable Vector {\n type = \"Object\";\n persistent = false;\n fields {\n #PIhmB5a45eV2GwDOel4fNJzD x : Number\n #s4RJLddQmZAAL2fVNJZlofpI y : Number\n #z4sZT4jEURZzF4qvBK80374u z : Number\n }\n}\n#Pp43nHG2nxgTrXqtYtq2qQ3n\naction use_accelerometer(#x4AqNqJN2AV8FyNW settings: * Settings) returns(#ZuecI66sdYrN0fLg b: Boolean) {\n #xKiBqWGiPgb8OodJ // Gets a value indicating if the game pad is in accelerometer mode\n #iyQVQkZox7faFtMZ $b := $settings→\\_accelerometer;\n meta sync;\n}\n#Jr5PkqN8lT3CcCaI8FkcwY9i\naction control_sprite(#J4bQtf4dzt0JJv0o sprite: Sprite, #xITne2vAd7GGo71K max_speed_x: Number, #eh4guxKhGAkkT5zd max_speed_y: Number) {\n #pZFTfhm2KibBy4vb // Attaches code to a sprite so that it moves with the joystick. ``max speed x``, ``max speed y`` are the maximum speed in the horizontal and vertical directions. If the ``max speed`` is ``0``, the sprite does not move in that direction.\n #gqAAXsRX7ML6Xp6Q // {hints:max speed x:10}\n #XYUBw2I2PmJxsfQk // {hints:max speed y:10}\n #QJN5pdrnm402r4nc contract→requires($max_speed_x ≠ 0 `or` $max_speed_y ≠ 0, \"max speed x or max speed y must be positive\");\n #SdQfPla60i8KOB69 @\\u267b→game→board→add_on_every_frame($perform);\n #dzrdQXYVBuiYpCB3 where perform() {\n #kMPKcC4hlDnlAzNf $p := code→current;\n #m84DBIk76JwFXGtK if $max_speed_x ≠ 0 then {\n #AIc6bHmDGE5KEkub $sprite→set_speed_x($p→x * $max_speed_x);\n }\n #FlHS37vNSYlJzzK2 if $max_speed_y ≠ 0 then {\n #kcqg248K96z8hSvW $sprite→set_speed_y($p→y * $max_speed_y);\n }\n }\n meta sync;\n}\n#xOCxKZH5B5Fbbm2N2BgFeCjp\naction control_background_scene(#xexUUg8AFUV1pKss max_speed_x: Number, #husVqChs0aLNEthp max_speed_y: Number) {\n #xvNWw6U8MHjXt8Af // Attaches code to a sprite so that it moves with the joystick. ``max speed x``, ``max speed y`` are the maximum speed in the horizontal and vertical directions. If the ``max speed`` is ``0``, the sprite does not move in that direction.\n #YJZmMvKMLvYxEwDY // {hints:max speed x:5}\n #BVh2sKVCrb3m56WT // {hints:max speed y:5}\n #EmBN4lPPQPbBchh1 contract→requires($max_speed_x ≠ 0 `or` $max_speed_y ≠ 0, \"max speed x or max speed y must be positive\");\n #TZWQZIGfZ68yG9Uv $board := @\\u267b→game→board;\n #wPA2oQGbTH3FGzOZ $scene := $board→background_scene;\n #Js4Zpc34CRxt2GeX $board→add_on_every_frame($perform);\n #ZWthGFblITdJ5y2q where perform() {\n #xLolGpyPJ26Bf7gF $p := code→current;\n #NRgvlWpZblB5411Z if $max_speed_x * $p→x ≠ 0 then {\n #x9XySL1IghJ4eAkc $scene→view_x := $scene→view_x + $p→x * $max_speed_x;\n }\n #zAl92h1NWX6zV6YZ if $max_speed_y * $p→y ≠ 0 then {\n #v2doU4uETj8wdBU6 $scene→view_y := $scene→view_y + $p→y * $max_speed_y;\n }\n }\n meta sync;\n}\n#O5jlHid249RIgTQx4Il4dMsQ\naction initialize() {\n #BY1a8ZelCHXrWspS if data→\\_settings→is_invalid then {\n #xG5gN3ayZLIr97Kv data→\\_settings := records→Settings→create;\n #xg65D2HGMuN6YvRl data→\\_settings→\\_left_key := \"left\";\n #Qvua74YQy1S3NWOW data→\\_settings→\\_right_key := \"right\";\n #UtF8HSgpBFH4GOCh data→\\_settings→\\_up_key := \"up\";\n #x8LXxXent3EQ3HSb data→\\_settings→\\_down_key := \"down\";\n #eHrpy4kjLd3kKU7H data→\\_settings→\\_button_key := \"space\";\n #JrohHVSmIOHoTJfg data→\\_settings→\\_accelerometer := senses→has_accelerometer;\n #QLmAnO22zSclfJLh data→\\_settings→\\_accelerometer_factor := 2.5;\n #FoOj1D7azTBsWmAS data→\\_settings→\\_keyboard_factor := 1;\n #gE4FhHuKQInXChc6 data→\\_settings→\\_touch_factor := 1;\n #x4HLjy5jtRlZw5QK data→\\_settings→\\_gamepad_factor := 1;\n }\n meta private;\n meta sync;\n}\n#EBTBDXQl4wWAeztoI6v6uXr7\ntable Settings {\n type = \"Object\";\n persistent = false;\n fields {\n #xWrudrZ5NpJdyPTY \\_accelerometer : Boolean\n #haeXdtH8UXoKT2YiPEqLa2fY \\_accelerometer_factor : Number\n #xU41NwX1DW2EsOH1zEyKrBDI \\_keyboard_factor : Number\n #gs0C5qUDfkJQgVZNTRvcYXdg \\_touch_factor : Number\n #xye4E9Gkn75xPO9BypOVNnQl \\_gamepad_factor : Number\n #zJxyk6doic4epMgg \\_button_key : String\n #xTqBB94SCy85xBDo \\_left_key : String\n #xcK10crRhLYLIPRa \\_right_key : String\n #teqHhpmPMmsqCDDe \\_up_key : String\n #O8zLW0tiUKq2Iq6m \\_down_key : String\n }\n}\n#wzrHF0ZiaaIPCBlykVeDL7ZQ\nvar \\_settings : * Settings {\n transient = true;\n}\n#fZA6Z6A6AZBTzGzFKUi45Qkk\naction settings() returns(#x2440FgmL0FXNm2Y sets: * Settings) {\n #H4fuepz89B5nVk5c // Gets the settings\n #NYeQ8DS6Yk6rvaoH code→initialize;\n #J0zI5t9SBqZz2A3Y $sets := data→\\_settings;\n meta sync;\n}\n#JsMMnNP4PoTsmzcKQb03lxcd\naction set_accelerometer_factor(#hV904uzJQP4Ha1vL settings: * Settings, #UZL9DHRMGQZ1SjJc factor: Number) {\n #U2OMRDlAavZbU8QD // Sets the accelerometer factor which defines the sensitivity of the gamepad to acceleration.\n #KQOkRcPNYlYc4rfq $settings→\\_accelerometer_factor := $factor;\n meta sync;\n}\n#qHUjP3JxEIe6PglgPBd7XvGj\naction set_keyboard_factor(#xoDt4HwFM7Xtn50y settings: * Settings, #BXbMcZD3FCEFxd74 factor: Number) {\n #oEa4VV4P5Qcw4LxT // Sets the keyboard factor which defines the sensitivity of the gamepad to keystrokes.\n #I22dHuBIaCE4Wsfg $settings→\\_keyboard_factor := $factor;\n meta sync;\n}\n#ykOjMaqh0yuACa3eucm2crhX\naction set_touch_factor(#x9g9UuMQ0nWvsOOr settings: * Settings, #xB4ys583aKS4LhSA factor: Number) {\n #xxTdZjauXHuYGsze // Sets the keyboard factor which defines the sensitivity of the gamepad to touch position.\n #xDWukfE0Nb0J1SEB $settings→\\_touch_factor := $factor;\n meta sync;\n}\n#HkT5dDFCgut23pzIiUtT5449\naction accelerometer_factor(#x42Ymf1w793HBMrM settings: * Settings) returns(#J3b5CTzLR5bnRzDd factor: Number) {\n #x2ohapkwxTl4TJm2 // Gets the accelerometer factor which defines the sensitivity of the gamepad to acceleration.\n #ubiUm8C4Qa37zXl9 $factor := $settings→\\_accelerometer_factor;\n meta sync;\n}\n#ojPViw2hIEo2FhK11HwNyfHv\naction keyboard_factor(#xIAMPIUEzeeI4MSo settings: * Settings) returns(#qer1Gid3Ka1sYUlo factor: Number) {\n #DZ0tTbGBLf0zdvaN // Gets the factor which defines the sensitivity of the gamepad to keystrokes.\n #hQzKDt4MvV3eZ3y0 $factor := $settings→\\_keyboard_factor;\n meta sync;\n}\n#cmxAcycEZOsCpQnldHU6eNUe\naction touch_factor(#xi4zCqnOSG7a3FJ9 settings: * Settings) returns(#cWB3AVRhR2UxhY5M factor: Number) {\n #adW5EhfLFYOS1SN4 // Gets the factor which defines the sensitivity of the gamepad to touch.\n #xoHybh1K0DH2JE6U $factor := $settings→\\_touch_factor;\n meta sync;\n}\n#qDlKG3i3k2K4V8WDC0PeMN11\naction compute_gamepad(#sNZCyEA7PtuE1Ja2 seconds: Number, #oxn5BeCE5Z9fBJri vector: * Vector, #yC3saYaNHw0wr46w gp: Gamepad) {\n #J7ujsf4vd2ZdQS4j $ramp := 0.4;\n #aIps1tsTQVIXzE48 $deramp := 0.9;\n #Np91rQPyO6dT6h0r $f := data→\\_settings→\\_keyboard_factor;\n #SOG2l2YssSdmyfJ6 if `not` data→\\_current→is_invalid `and` $seconds > 0 then {\n #TYEiJepb5OzRK4Ue $vector→x := data→\\_current→x;\n #SrTapAnFDCPENlkk $vector→y := data→\\_current→y;\n #Q3jerK4ei022TcO4 $vector→z := data→\\_current→z;\n }\n #nm6km479Qkl8nmTz // digital commands\n #x41OxuSqcvPpFBvT $p := $gp→axes(\"left stick\");\n #af6ujQZDY57S69tr if math→abs($p→x) > 0.07 then {\n #NLqjhSODtwJdvmKn $vector→x := $p→x;\n }\n else { #xH41FZCtrksP73Im if $gp→is_button_pressed(\"left\") then {\n #ULPRruprvYXYBBBV $vector→x := math→clamp( - 1, 0, ($vector→x - $seconds / $ramp) * $f);\n }\n else { #kJfsCJRarGkYDJo5 if $gp→is_button_pressed(\"right\") then {\n #HPux3qopIyjD40mF $vector→x := math→clamp(0, 1, ($vector→x + $seconds / $ramp) * $f);\n }\n else {\n #jzdCQpkG1NhYRxJK $vector→x := $vector→x * $deramp * $f;\n #xfezCQnnAlipaL2h if math→abs($vector→x) < 0.05 then {\n #L2AiamuB1W6laju5 $vector→x := 0;\n }\n }\n } } \n #syDnE1OdmuOcz7JJ if math→abs($p→y) > 0.07 then {\n #BJOkzjS2t6qrFqOs $vector→y := $p→y;\n }\n else { #xvn3AVRyEYWu4vmX if $gp→is_button_pressed(\"down\") then {\n #EcM7LTmETJGKXq7k $vector→y := math→clamp(0, 1, ($vector→y + $seconds / $ramp) * $f);\n }\n else { #thLr6SB1G4GOz9KA if $gp→is_button_pressed(\"up\") then {\n #sfKxmyqJIrEyAIEI $vector→y := math→clamp( - 1, 0, ($vector→y - $seconds / $ramp) * $f);\n }\n else {\n #x0qsG75vhyV1OTI3 $vector→y := $vector→y * $deramp * $f;\n #xED8wNfNIawJhHlB if math→abs($vector→y) < 0.05 then {\n #ud5B1uYehyoXkvFL $vector→y := 0;\n }\n }\n } } \n #Gp6XE26xRnkZH1UF if $gp→is_button_pressed(\"x\") `or` $gp→is_button_pressed(\"a\") `or` $gp→is_button_pressed(\"left trigger\") `or` $gp→is_button_pressed(\"right trigger\") then {\n #xY1aCbyRrl4WRQzr $vector→z := math→clamp(0, 1, ($vector→z + $seconds / $ramp) * $f);\n }\n else {\n #rlwfZwqD5NQN3FYU $vector→z := $vector→z * $deramp * $f;\n #xqZ0ek76dg18mmKi if $vector→z < 0.05 then {\n #xM1wils39LR2R2r1 $vector→z := 0;\n }\n }\n meta private;\n meta sync;\n}\n#Q5iYM4d4RaKAHW0EBSJVw4Ax\naction gamepad_factor(#EzeyG4fwIy72v43H settings: * Settings) returns(#iQoR4aWzVHrOCNUa factor: Number) {\n #x4QTtaWY5KjaOBX6 // Gets the gamepad multiplaction factor\n #Da02a7PsI4JZXbHz $factor := $settings→\\_gamepad_factor;\n meta sync;\n}\n#BKrrtzJkT6r8eMJwqbQ4H4uv\naction set_gamepad_factor(#lCTVkfU4Lf2pn4WH settings: * Settings, #wYwRD3xQjAfRM1XF factor: Number) {\n #rWKLWdtv08NDnClQ // Sets the gamepad factor\n #kizmsK2S0IHazy2g $settings→\\_gamepad_factor := $factor;\n meta sync;\n}\n#WXa1HIFpjLPPuHwF\naction on_button_pressed(#f4HaMUK2POpX1XK2 @action: Action) returns(#bYZ65CfJ1xqucFvz binding: * Gamepad_Event_Binding) {\n #autpkZS0K0HiSnJ6 // Raised when the primary button is pressed. The button could be the keyboard ``space`` key, mouse click, touch tap or the ``A`` gamepad button. Auto-repeat is not supported.\n #Rk7sWmHqManf2FxK // {action:ignoreReturn}\n #kCNUrJ58ODLFjqSE $binding := records→Gamepad_Event_Binding→create;\n #ruht2urgD9P0Owdx $binding→bindings := create→collection_of→event_binding;\n #MVLlCR56fgCGJEwb $ev := senses→on_key_pressed(\"space\", $handler);\n #P3izRPTD4J4M0Utd where handler() {\n #ad3dhq1Q6xkQBaw3 $@action→run;\n }\n #IJCZAy2QOOIGsiph $binding→bindings→add($ev);\n #nQ0624TgT5d7Np4l $ev2 := @\\u267b→game→board→on_tap($tapped);\n #FI2pqcbqJr5B5nYd where tapped(x: Number, y: Number) {\n #wL3nosJAQfhAa9jG $@action→run;\n }\n #b4DyggOZsb42VJew $binding→bindings→add($ev2);\n #A0Kvs4Rx4Zez5CLb $state := records→Button_State→create;\n #gg0O0MVZAT1CAzK2 $btn_name := \"a\";\n #Z5xTM2xdjWs32GnQ $state→pressed := code→is_button_pressed_in_any_gamepad($btn_name);\n #ES84jGq7VtcYYzsk $ev3 := @\\u267b→game→board→add_on_every_frame($perform);\n #xkNjoDPruQAqd4Vy where perform() {\n #H1O6JVSByAsdB5gl $pressed := code→is_button_pressed_in_any_gamepad($btn_name);\n #XBao9npXj3jLj44Y if $pressed `and` `not` $state→pressed then {\n #zrfrKef5j3G6I87r `async` $@action→run;\n }\n #Qp92pguhEJ964LjX $state→pressed := $pressed;\n }\n #xjU7OfAyEY1t2Zlg $binding→bindings→add($ev3);\n}\n#PtpGyZJTdYtckhRv\ntable Button_State {\n type = \"Object\";\n persistent = false;\n fields {\n #SrkEX4XZd2hpMRGQ pressed : Boolean\n }\n}\n#MqSmFDsxMgTB4xkn\naction is_button_pressed_in_any_gamepad(#xU2rD4who6rykMde btn_name: String) returns(#x04nfMmco3aGZUlD pressed: Boolean) {\n #C7AW20Gvnp2I6cxZ $pressed := false;\n #AZmGfN4J5U6UVomG $gps := senses→gamepads;\n #YlD0rGhPyywGrYvr foreach gamepad in $gps\n #zi4HbWuQNS1TGoqd where `not` $pressed `and` $gamepad→is_connected `and` $gamepad→is_button_pressed($btn_name)\n do {\n #gzc7udJGZ2ZXqcDr $pressed := true;\n }\n meta private;\n meta sync;\n}\n#B5CwXDSpNzCP42Ri\ntable Gamepad_Event_Binding {\n type = \"Object\";\n persistent = false;\n fields {\n #ftimFuL4HLLtCtfV bindings : Collection[Event_Binding]\n }\n}\n#x3PpQGVlqDg5FKmt\naction delete(#xR9VnFvk412nTGrw binding: * Gamepad_Event_Binding) {\n #mzSlbL2z6dbP8sib // Deletes all the bindings\n #c0BBfqA8y3oFMZyX foreach ev in $binding→bindings\n do {\n #vth7W3m3aQtq02TK $ev→delete;\n }\n #JpIxBpOLfLjBVWZO $binding→bindings→clear;\n meta sync;\n}\n", @@ -27,7 +25,7 @@ "mfvka": "meta version \"v2.2,js,ctx,refs,localcloud,unicodemodel,allasync,upperplex\";\nmeta name \"touchdevelop local\";\nmeta icon \"GlobeEUA\";\nmeta color \"#ff007fff\";\nmeta rootId \"O6Rs2BjFB4g0ArT2oat8Gpfc\";\nmeta hasIds \"yes\";\nmeta platform \"current\";\nmeta parentIds \"\";\n// Explains how to export a script to the App Store. #docs\n#main\naction main() {\n #YKeb2CW4sOdvQyW9 // {parentTopic:contents}\n #xSh4e5kqwQHcBmkx // It is possible to run TouchDevelop from a local web server on your machine. This allow TouchDevelop to work completely offline, access services required for [app generation](/exporttocordova) or code with [Minecraft](/minecraftpisetup).\n #x35eEyKbLVKI0YGH // ## installation steps\n #juuuaj9Ro2J2Clco // * install [node.js] (http://nodejs.org/)\n #c72W0S2LKE5DVZEb // * create an empty folder for your projects\n #xFRR2AdHdpXNY6Tp // * open a command prompt in your fresh folder and install the **touchdevelop** npm package.\n #hxp4ucOoAsva9ecH // > ``npm install -g http://aka.ms/touchdevelop.tgz``\n #FDTBrovQEeBZm4YP // * launch TouchDevelop locally (make sure you're in your fresh folder)\n #VdVeyI6zCWRyKLoA // > ``touchdevelop``\n #jB3SWBY83Ya2hQve // This will start the TouchDevelop editor in your default browser.\n #GG0Wwd79o4DWGali // ### using non-default browser\n #c9GeLb0N1ocQTHV0 // If you want to use a different browser run ``touchdevelop --cli`` and then point your browser to the URL printed out, it will look **something like** this:\n #Zt9aw3IdHQhkjOAj // > ``Editor URL: http://localhost:4242/editor/beta#td_deployment_key=``\n #A85X0jwZQ7nxKmA7 // It is very important to copy&paste the deployment key at the end precisely.\n #oZCkpuvERU4pSBgP // ### caching of resources\n #HZg9zZ33hRQewElr // All [art resources](/art) or scripts that are loaded while using TouchDevelop local are automatically cached on disk, which allows for a better experience.\n #dOWKEqjA2EopKrAa // If you are planning to package TouchDevelop, make sure that you use at least once each required script or tutorial so that they get cached.\n #xJW2i0dpR9ECZHbH // ### packaging\n #xk9FWWSoKznWnmdy // If you plan to package and share your local touchdevelop, you need to perform the following step.\n #OWX4ZYDjngkiBEtL // * go to the **hub**,\n #gHhslghRyoF9m2FR // * tap on `[Settings]`\n #xpnUIIdzjeb32vYB // * tap on `[save offline caches]`\n #HBWc0AdjvaE1PBPq // Copy or zip the folder containing the TouchDevelop files.\n}\n#lRC7ZP4I3ytfLfcRhscBaKF6\nvar monster : Picture {\n is\\_resource = true;\n url = \"https://az31353.vo.msecnd.net/pub/ymggwtmn\";\n transient = true;\n}\n#xZA3MGCJ6sAJtfqSibDFTyzZ\nvar @1_Click_on_Title : Picture {\n is\\_resource = true;\n url = \"https://az31353.vo.msecnd.net/pub/syhbuwmb\";\n transient = true;\n}\n#x4oXuBrRP7peqBxOraPy0Ppu\nvar @2_Publish_Script : Picture {\n is\\_resource = true;\n url = \"https://az31353.vo.msecnd.net/pub/uegejzev\";\n transient = true;\n}\n#Pb7ZRhh1Le4Kwz16DOm6h95t\nvar @3_Click_Export_iOS : Picture {\n is\\_resource = true;\n url = \"https://az31353.vo.msecnd.net/pub/snnlubem\";\n transient = true;\n}\n#JiJThBxgjuQyZZagv84V67Cc\nvar @4_Export_to_App_Store : Picture {\n is\\_resource = true;\n url = \"https://az31353.vo.msecnd.net/pub/jhmzbank\";\n transient = true;\n}\n#u2byTeHW2wX14mnA374fzvSh\nvar @5_App_is_Ready : Picture {\n is\\_resource = true;\n url = \"https://az31353.vo.msecnd.net/pub/pnqogdug\";\n transient = true;\n}\n#XhCWNpaqagoeYlvuBl6OZOHa\nvar @6_Search_for_Xcode : Picture {\n is\\_resource = true;\n url = \"https://az31353.vo.msecnd.net/pub/ukwoekck\";\n transient = true;\n}\n#ZeXqju7M5bfqlm0Gx6CYvtRK\nvar @7_Open_Xcode : Picture {\n is\\_resource = true;\n url = \"https://az31353.vo.msecnd.net/pub/akluqtvy\";\n transient = true;\n}\n#xzO7Z4FWRmvE3GvB3nUQGdja\nvar @8_Open_Project_Folder : Picture {\n is\\_resource = true;\n url = \"https://az31353.vo.msecnd.net/pub/duqdaaut\";\n transient = true;\n}\n#JOEveTZ34fcQQBSty0Y64Edz\nvar @9_Run_on_Simulator : Picture {\n is\\_resource = true;\n url = \"https://az31353.vo.msecnd.net/pub/vxmsyaas\";\n transient = true;\n}\n#xiLx3rI7m5QO2Xo18r4e8IkZ\nvar @10_New_App : Picture {\n is\\_resource = true;\n url = \"https://az31353.vo.msecnd.net/pub/mpgptjat\";\n transient = true;\n}\n#xvxHs2DcS5TxtO3WUNGJU8SX\nvar @11_App_Info_1 : Picture {\n is\\_resource = true;\n url = \"https://az31353.vo.msecnd.net/pub/ogcsqjwj\";\n transient = true;\n}\n#ZrjNZAJFXA9xGxb5V6oiQ2fr\nvar @12_App_Info_2 : Picture {\n is\\_resource = true;\n url = \"https://az31353.vo.msecnd.net/pub/sqvolvpy\";\n transient = true;\n}\n#Y3AswkOZPm0qiy2UVZvlZkez\nvar @13_App_Info_3 : Picture {\n is\\_resource = true;\n url = \"https://az31353.vo.msecnd.net/pub/aisvqsqf\";\n transient = true;\n}\n#bBNxhIal86lYKIvamSdSIjaY\nvar @14_App_Info_4 : Picture {\n is\\_resource = true;\n url = \"https://az31353.vo.msecnd.net/pub/afpjiooj\";\n transient = true;\n}\n#NzF4EhVGG7woPhmPnliAixIE\nvar @15_Upload_Images : Picture {\n is\\_resource = true;\n url = \"https://az31353.vo.msecnd.net/pub/fxzfihkw\";\n transient = true;\n}\n#ncULKNvBE2KztzZPCeZpAkDY\nvar @16_Create_Certificate : Picture {\n is\\_resource = true;\n url = \"https://az31353.vo.msecnd.net/pub/uzxlvvev\";\n transient = true;\n}\n#HvyrGPpdCBgkgany57HRlfeD\nvar @17_iOS_Device : Picture {\n is\\_resource = true;\n url = \"https://az31353.vo.msecnd.net/pub/luyofzkt\";\n transient = true;\n}\n#jlzt0AP4sDglw23BWlpFGzmL\nvar @18_Product_Archive : Picture {\n is\\_resource = true;\n url = \"https://az31353.vo.msecnd.net/pub/mnuosfrx\";\n transient = true;\n}\n#ed23hfCPWk4e4wTEwn4QGZzq\nvar Provisioning_Profile : Picture {\n is\\_resource = true;\n url = \"https://az31353.vo.msecnd.net/pub/jdzxutxx\";\n transient = true;\n}\n#eXePACFUcwQUUlcmdK8BzBgP\nvar P_Validate : Picture {\n is\\_resource = true;\n url = \"https://az31353.vo.msecnd.net/pub/waeqjhwx\";\n transient = true;\n}\n#lPh2YgYpDFec75cVhrBPJBW7\nvar Distribute : Picture {\n is\\_resource = true;\n url = \"https://az31353.vo.msecnd.net/pub/evpvthnw\";\n transient = true;\n}\n#n7TK0c4AGeFXhyBY7vYRqXAx\nvar @3_Click_Export_iOS_2 : Picture {\n is\\_resource = true;\n url = \"https://az31353.vo.msecnd.net/pub/przbvosv\";\n transient = true;\n}\n", "mzmpa": "meta version \"v2.2,js,ctx,refs,localcloud,unicodemodel,allasync,upperplex\";\nmeta name \"blank event hubs\";\nmeta icon \"Stacks\";\nmeta color \"#ffffffff\";\nmeta rootId \"rTo1i2UE9ZqDVMIBTLAUqMYl\";\nmeta iconArtId \"wyfreugv\";\nmeta isLibrary \"yes\";\nmeta allowExport \"yes\";\nmeta isCloud \"yes\";\nmeta hasIds \"yes\";\nmeta platform \"network,npm,shell\";\nmeta parentIds \"\";\n// A node.js web site that sends events to Azure Event Hubs using AMQP. #node #azure #restify #rest #api\n#x6T4YCsBsZWtPUmF\naction \\_init() {\n #Zy8rc2YHRBIcmnOf // This template allows you to easily stream data to an Azure Event Hubs instance using the AMQP1.0 protocol.\n #LKpR3HLsnUt8zjTC // To setup this service, you will have to setup the following:\n #x0DCfAxIkDRE4kH5 // * An [Event Hub](http://azure.microsoft.com/en-us/services/event-hubs/) in Azure.\n #BPgmHhKMscVJieMa // * define the ``AZURE_SERVICEBUS_SAS_KEY_NAME`` environment variable with your SAS key name\n #R7tTfXVWqjfIjJuw // * define the ``AZURE_SERVICEBUS_SAS_KEY`` environment variable with the SAS key.\n #uHkwReQVwrICaHzH // * (optional) setup application insights instrumentation key by defining the ``APPINSIGHTS_INSTRUMENTATION_KEY`` environment variable.\n #JGUzkYMjc2rxbxQ2 // * `[Export]` this script to a node.js web site.\n #bMtNnag4oaUSbmG8 data→logger := app→create_logger(\"api\");\n #ggtkH2QPjkFSMATl code→init_restify;\n #xYi50zyUUbDrUiYA code→init_azure_services;\n #A3exv4u2E6ZcTY5F data→hub := @\\u267b→sbus_amqp10→create_event_hub_client(\"TODO: service hub namespace\", \"TODO: service hub name\");\n #rlP2tbcbetF1rUVe time→run_every(1, $perform);\n #OVfCshDzbjMrMcel where perform() {\n #wjsvsYZW73p1LRfD // this is where you read your sensor data\n #xViWmNVnfqeTVF3p $msg := records→Message→create;\n #hzLc4iJcGXm7Yk3P $msg→temp := math→random(1000);\n #T9qIzqSC0FK3USRu // and send it to the event hub...\n #NyGUOelE4aFv6HKY data→hub→send_json($msg→to_json);\n #kvai1NC9xIM98v0w where partition_key := data→deviceid;\n }\n}\n#yjW8JMhhkCVxVG9z meta import parallel {\n pub \"fncvb\"\n usage {\n type queue\n action `async` @for(count: Number, @action: Number_Action)\n action `async` for_batched(count: Number, batch_count: Number, item_action: Number_Action, batch_action: Action)\n action `sync` schedule(q: ♻ parallel → queue, task: Action)\n action `sync` create_queue(max_running: Number) returns(queue: ♻ parallel → queue)\n action `async` wait_for_empty(q: ♻ parallel → queue)\n action `async` for_json(js: Json_Object, @action: Json_Action)\n }\n}\n#kGiIbArLBJgrGrUh\nvar logger : App_Logger {\n transient = true;\n}\n#xht4tB8QBEGYhcxd\naction init_azure_services() {\n #zoRhW6H8Xjlu4Nfv @\\u267b→application_insights→init;\n #rIelx44MT4mxwsuP if data→deviceid→is_empty then {\n #lVuKP04Sv0BPFvTe data→deviceid := @\\u267b→node_crypto→random_bytes(16)→to_string(\"hex\");\n }\n #SqiRrk2SBmwfUygc data→logger→info(\"deviceid: \" ∥ data→deviceid);\n meta private;\n}\n#VJhyWCgHgpoXBxQe\naction init_restify() {\n #Rfk2zOUWd63utX0c $server := @\\u267b→restify→server;\n #xwHqz4BboMG6fFYA $server→use(@\\u267b→restify→authorization_parser);\n #CCiEC9MjVyBu1Alm $server→pre(@\\u267b→restify→sanitize_path);\n #QhDtswBtwpK4HWfj $throttle := @\\u267b→restify→throttle;\n #xnNL4UkM1HGz7bML where rate := 40;\n #pjHy3CkNNDrbTRdj where burst := 100;\n #u8A4y4yHMKc8lyUK where ip := true;\n #hivZ6Vt6ftjQnefM $server→use($throttle);\n #xHYwcSAiT7KduHhg $server→use(@\\u267b→restify→CORS);\n #uouNso31DPAdpy0R $server→use(@\\u267b→restify→body_parser);\n #PQsbPK8j0KxXP7BN $server→use(@\\u267b→restify→gzip_response);\n #krhauhLHNWLfS4Rr $server→use(@\\u267b→restify→query_parser);\n #OQV2aOnQMrFwfSMH $server→use(@\\u267b→restify→conditional_request);\n #dJCZRF6m52AEcGvh @\\u267b→restify_touchdevelop→autobind($server);\n #RheHhoSGEfw2gVg7 code→init_routes;\n #JCEJ0pDtVdSmeI23 $server→use(@\\u267b→restify_touchdevelop→errors_to_log(data→logger));\n meta private;\n}\n#FvkNJnD5CXb2RpH7 meta import restify {\n pub \"egzra\"\n usage {\n action `async` `type` Request_Handler(req: ♻ restify → Request, res: ♻ restify → Response)\n #xLPhdjOebDT8w77X\n table Throttle_Options {\n type = \"Object\";\n exported = true;\n persistent = false;\n fields {\n #xo6LfV0hyAQtz675 rate : Number\n #yZ2QZAfeW3W74JA1 burst : Number\n #JUlNvDq7Hm9cTUAG ip : Boolean\n #w2h4dcf4I5K5h7kn xff : Boolean\n #RO3Sx6iTt4WsVBm6 username : Boolean\n #VbsYnDvr3t4Xr4VA maxKeys : Number\n #w25h9R5LKJnWiBNu tokensTable : ♻ restify → Tokens_Table\n }\n }\n #xdeuBx505IsZ6eEI\n table Serve_Static_Options {\n type = \"Object\";\n exported = true;\n persistent = false;\n fields {\n #NfWLVJBBbHvtMqkl default : String\n #KvIMj1sEoAwQCf22 maxAge : Number\n }\n }\n #mqEMUbizkEp6naSD\n table CORS_Options {\n type = \"Object\";\n exported = true;\n persistent = false;\n fields {\n #xMYYV6C3eS7PWsfQ origins : String\n #z5HdpFdSi792e1OX credentials : Boolean\n #Fw1D0A9ZfeMCf5c3 headers : String\n }\n }\n #w2zTzWkfMf01yOko\n table Body_Parser_Options {\n type = \"Object\";\n exported = true;\n persistent = false;\n fields {\n #mhaHCLobgUgMrv72 maxBodySize : Number\n #xr4fKleNd4wHHP1l mapParams : Boolean\n #st0ir2vLTxbLTQWB mapFiles : Boolean\n #z5ah2mZWb8c5FmTM overrideParams : Boolean\n }\n }\n #xv4yZciZi2wFoqpM\n table Send_Options {\n type = \"Object\";\n exported = true;\n persistent = false;\n fields {\n #svWYln7UIackFIpB status : Number\n }\n }\n type Request\n type Response\n type Tokens_Table\n type Server\n type Middleware\n type Error\n action `sync` use(server: ♻ restify → Server, mid: ♻ restify → Middleware)\n action `sync` get(server: ♻ restify → Server, path: String, @then: ♻ restify → Request_Handler)\n action `sync` post(server: ♻ restify → Server, path: String, @then: ♻ restify → Request_Handler)\n action `sync` server() returns(server: ♻ restify → Server)\n action `sync` send(res: ♻ restify → Response, content: String, options\\u003f: ♻ restify → Send_Options)\n action `sync` status(res: ♻ restify → Response, status: Number)\n action `sync` is(req: ♻ restify → Request, type: String) returns(r: Boolean)\n action `sync` accepts(req: ♻ restify → Request, types: String) returns(type: String)\n action `sync` put(server: ♻ restify → Server, path: String, @then: ♻ restify → Request_Handler)\n action `sync` del(server: ♻ restify → Server, path: String, @then: ♻ restify → Request_Handler)\n action `sync` head(server: ♻ restify → Server, path: String, @then: ♻ restify → Request_Handler)\n action `sync` pre(server: ♻ restify → Server, mid: ♻ restify → Middleware)\n action `sync` CORS(options\\u003f: ♻ restify → CORS_Options) returns(mid: ♻ restify → Middleware)\n action `sync` conditional_request() returns(mid: ♻ restify → Middleware)\n action `sync` route(server: ♻ restify → Server, method: String, path: String, @then: ♻ restify → Request_Handler)\n action `sync` json(res: ♻ restify → Response, content: Json_Object, options\\u003f: ♻ restify → Send_Options)\n action `sync` next(res: ♻ restify → Response)\n action `sync` next_error(res: ♻ restify → Response, error: ♻ restify → Error)\n action `sync` address(server: ♻ restify → Server) returns(address: String)\n action `sync` gzip_response() returns(mid: ♻ restify → Middleware)\n action `sync` header(req: ♻ restify → Request, name: String) returns(value: String)\n action `sync` is_secure(req: ♻ restify → Request) returns(r: Boolean)\n action `sync` is_chunked(req: ♻ restify → Request) returns(r: Boolean)\n action `sync` is_keep_alive(req: ♻ restify → Request) returns(r: Boolean)\n action `sync` set_header(res: ♻ restify → Response, name: String, value: String)\n action `sync` body_parser(options\\u003f: ♻ restify → Body_Parser_Options) returns(mid: ♻ restify → Middleware)\n action `sync` throttle(options\\u003f: ♻ restify → Throttle_Options) returns(middleware: ♻ restify → Middleware)\n action `sync` date_parser(clock_skew: Number) returns(middleware: ♻ restify → Middleware)\n action `sync` serve_static(directory: String, options\\u003f: ♻ restify → Serve_Static_Options) returns(middleware: ♻ restify → Middleware)\n action `sync` query_parser() returns(middleware: ♻ restify → Middleware)\n action `sync` authorization_parser() returns(middleware: ♻ restify → Middleware)\n action `sync` jsonp() returns(middleware: ♻ restify → Middleware)\n action `sync` body_as_json(req: ♻ restify → Request) returns(body: Json_Object)\n action `sync` id(req: ♻ restify → Request) returns(id: String)\n action `sync` param(req: ♻ restify → Request, name: String) returns(value: String)\n action `sync` opts(server: ♻ restify → Server, path: String, @then: ♻ restify → Request_Handler)\n action `sync` patch(server: ♻ restify → Server, path: String, @then: ♻ restify → Request_Handler)\n action `sync` to_string(ser: ♻ restify → Server) returns(s: String)\n action `sync` sanitize_path() returns(middleware: ♻ restify → Middleware)\n action `sync` body(req: ♻ restify → Request) returns(body: String)\n action `sync` send_error(res: ♻ restify → Response, status: Number, message: String)\n action `sync` all(server: ♻ restify → Server, @then: ♻ restify → Request_Handler)\n action `sync` method(req: ♻ restify → Request) returns(method: String)\n action `sync` url(req: ♻ restify → Request) returns(url: String)\n action `sync` query(req: ♻ restify → Request) returns(query: Json_Object)\n action `sync` redirect(res: ♻ restify → Response, status_code: Number, url: String)\n action `sync` send_status(res: ♻ restify → Response, status_code: Number)\n action `sync` charset(res: ♻ restify → Response, encoding: String)\n action `sync` route_regex(server: ♻ restify → Server, method: String, path_regex: String, @then: ♻ restify → Request_Handler)\n action `async` read_body_as_buffer(req: ♻ restify → Request) returns(body: Buffer)\n action `sync` headers(req: ♻ restify → Request) returns(headers: Json_Object)\n action `sync` server_url(req: ♻ restify → Request) returns(url: String)\n action `sync` html(res: ♻ restify → Response, content: String, options\\u003f: ♻ restify → Send_Options)\n }\n}\n#A3d3ZvbSo4doxSON meta import restify_touchdevelop {\n pub \"dvuhb\"\n usage {\n action `sync` autobind(server: ♻ restify → Server)\n action `sync` errors_to_log(logger: App_Logger) returns(middleware: ♻ restify → Middleware)\n }\n #Ndi4Jc7GXTkHfWcQ resolve restify = ♻ restify with {\n }\n}\n#rMIDyd4TDaMKCuVx\naction init_routes() {\n #JtHQs8S4PNExhJqH skip;\n meta private;\n}\n#H3dQdzCat87hPU4B meta import node_crypto {\n pub \"ujtrc\"\n usage {\n type credentials\n type hash\n type hmac\n type cipher\n type decipher\n type sign\n type verify\n type DiffieHellman\n action `sync` get_ciphers() returns(ciphers: Collection[String])\n action `sync` get_hashes() returns(hashes: Collection[String])\n action `sync` create_credentials(details: Json_Object) returns(credentials: ♻ node_crypto → credentials)\n action `sync` create_hash(algorithm: String) returns(hash: ♻ node_crypto → hash)\n action `sync` update_hash(hash: ♻ node_crypto → hash, hash_data: Buffer)\n action `sync` digest_hash(hash: ♻ node_crypto → hash) returns(digest: Buffer)\n action `sync` update_hmac(hmac: ♻ node_crypto → hmac, hmac_data: Buffer)\n action `sync` digest_hmac(hmac: ♻ node_crypto → hmac) returns(digest: Buffer)\n action `sync` create_cipher(algorithm: String, password: Buffer) returns(cipher: ♻ node_crypto → cipher)\n action `sync` create_cipher_iv(algorithm: String, key: Buffer, iv: Buffer) returns(iv_cipher: ♻ node_crypto → cipher)\n action `sync` update_cipher(cipher: ♻ node_crypto → cipher, _data: Buffer) returns(enciphered: Buffer)\n action `sync` final(cipher: ♻ node_crypto → cipher) returns(cipher_final: Buffer)\n action `sync` set_auto_padding(cipher: ♻ node_crypto → cipher)\n action `sync` create_decipher(algorithm: String, password: Buffer) returns(decipher: ♻ node_crypto → decipher)\n action `sync` create_decipher_iv(algorithm: String, key: Buffer, iv: Buffer) returns(iv_decipher: ♻ node_crypto → decipher)\n action `sync` update_decipher(decipher: ♻ node_crypto → decipher, _data: Buffer) returns(deciphered: Buffer)\n action `sync` final_(decipher: ♻ node_crypto → decipher) returns(decipher_final: Buffer)\n action `sync` set_auto_padding_(decipher: ♻ node_crypto → decipher)\n action `sync` create_sign(algorithm: String) returns(sign: ♻ node_crypto → sign)\n action `sync` update_sign(sign: ♻ node_crypto → sign, sign\\_data: Buffer)\n action `sync` sign_(sign: ♻ node_crypto → sign, private_key: String) returns(signature: Buffer)\n action `sync` create_verify(algorithm: String) returns(verify: ♻ node_crypto → verify)\n action `sync` update_verify(verify: ♻ node_crypto → verify, verify_data: Buffer)\n action `sync` verify_(verify: ♻ node_crypto → verify, object: String, signature: Buffer) returns(valid: Boolean)\n action `sync` create_DiffieHellman(prime_length: Number) returns(DiffieHellman: ♻ node_crypto → DiffieHellman)\n action `sync` generate_keys(DiffieHellman: ♻ node_crypto → DiffieHellman) returns(public_key: Buffer)\n action `sync` compute_secret(DiffieHellman: ♻ node_crypto → DiffieHellman, other_public_key: Buffer) returns(shared_secret: Buffer)\n action `sync` get_prime(DiffieHellman: ♻ node_crypto → DiffieHellman) returns(DH_prime: Buffer)\n action `sync` get_generator(DiffieHellman: ♻ node_crypto → DiffieHellman) returns(generator: Buffer)\n action `sync` get_public_key(DiffieHellman: ♻ node_crypto → DiffieHellman) returns(public_key: Buffer)\n action `sync` get_private_key(DiffieHellman: ♻ node_crypto → DiffieHellman) returns(private_key: Buffer)\n action `sync` set_public_key(DiffieHellman: ♻ node_crypto → DiffieHellman, public_key: Buffer)\n action `sync` set_private_key(DiffieHellman: ♻ node_crypto → DiffieHellman, private_key: Buffer)\n action `sync` get_DiffieHellman(group_name: String) returns(DiffieHellman: ♻ node_crypto → DiffieHellman)\n action `async` pbkdf2(password: String, salt: String, iterations: Number, keylen: Number) returns(derived_key: String)\n action `async` random_bytes(size: Number) returns(strong_data: Buffer)\n action `sync` DEFAULT\\_ENCODING() returns(default_encoding: String)\n action `sync` create_hmac(algorithm: String, key: String) returns(hmac: ♻ node_crypto → hmac)\n action `sync` create_DiffieHellmanWithPrime(prime: Buffer) returns(DiffieHellman: ♻ node_crypto → DiffieHellman)\n action `async` pseudo_random_bytes(size: Number) returns(non\\u002dstrong_data: Buffer)\n action `sync` update_hash_string(hash: ♻ node_crypto → hash, hash_data: String)\n }\n}\n#lQzkFetSEgRfkoD1\nvar deviceid : String {\n}\n#BVGhpbmca\ntable Message {\n type = \"Object\";\n exported = true;\n persistent = false;\n fields {\n #wy6NESQzEaxcVB7P temp : Number\n }\n}\n#j113cC0ZjCAoNnDS meta import node_hash {\n pub \"ezbka\"\n usage {\n action `sync` sha256(value: String) returns(digest: String)\n action `sync` sha1(value: String) returns(digest: String)\n }\n #MBLWOTnilXzcOFAX resolve node_crypto = ♻ node_crypto with {\n }\n}\n#vxXBVxmP2RVFNpVe meta import application_insights {\n pub \"sjdha\"\n usage {\n #BVGhpbmca\n table Options {\n type = \"Object\";\n exported = true;\n persistent = false;\n fields {\n // Tracks all uncaught exceptions\n #xYM2DFyGKHO12BbR track_uncaught_exceptions : Boolean\n }\n }\n action `sync` init(options\\u003f: ♻ application_insights → Options) returns(active: Boolean)\n action `sync` track_trace(msg: String)\n action `sync` track_event(name: String)\n action `sync` track_metric(name: String, value: Number)\n action `sync` start_track_event(name: String)\n action `sync` stop_track_event(name: String)\n }\n}\n#xIOpvK4jXnRc4lQH meta import sbus_amqp10 {\n pub \"oygnc\"\n usage {\n #BVGhpbmca\n table Options {\n type = \"Object\";\n exported = true;\n persistent = false;\n fields {\n // Shared Access Signature key name\n #fRjSVYac45hTz1IK sas_key_name : String\n // Share Access Signature key\n #tg3cjIf6UbQfP4Qt sas_key : String\n }\n }\n #z4kRkBZXmitv6m0j\n table Send_Options {\n type = \"Object\";\n exported = true;\n persistent = false;\n fields {\n // The (optional) partition key is a string that gets set as the partition key for the message (delivered in the message annotations).\n #HKbiDU6YqpuFgNfB partition_key : String\n }\n }\n type Event_Hub_Client\n type Event_Processor\n action `sync` create_event_hub_client(service_hub: String, event_hub: String, options\\u003f: ♻ sbus_amqp10 → Options) returns(hub: ♻ sbus_amqp10 → Event_Hub_Client)\n action `async` send_json(hub: ♻ sbus_amqp10 → Event_Hub_Client, payload: Json_Object, options\\u003f: ♻ sbus_amqp10 → Send_Options)\n action `async` create_event_processor(hub: ♻ sbus_amqp10 → Event_Hub_Client, consumer_group: String) returns(processor: ♻ sbus_amqp10 → Event_Processor)\n action `sync` receive(processor: ♻ sbus_amqp10 → Event_Processor)\n action `async` teardown(processor: ♻ sbus_amqp10 → Event_Processor)\n action `async` send(hub: ♻ sbus_amqp10 → Event_Hub_Client, payload: String, options\\u003f: ♻ sbus_amqp10 → Send_Options)\n }\n}\n#AsaOG4tqpgiEWfI5\nvar hub : ♻ sbus_amqp10 → Event_Hub_Client {\n transient = true;\n}\n", "nehv": "meta version \"v2.2,js,ctx,refs,localcloud,unicodemodel,allasync\";\nmeta name \"game animations\";\nmeta icon \"Controller\";\nmeta color \"#ff9955bb\";\nmeta rootId \"x5GWly5akgFmjLrYRRLK4cEP\";\nmeta isLibrary \"yes\";\nmeta hasIds \"yes\";\nmeta platform \"current\";\nmeta parentIds \"\";\n// A suite of nifty game animations.\n#example\naction example() {\n #oQvXum6wlCxvA14x // This library provides a bunch of cool animation to be used with the `libs->game` library.\n #OrK2keevME4R7Ikt // {hide}\n #IBkRy8dLlysml6xn $pic := media→create_picture(480, 800);\n #LUD4QUQWDq3cZvhL $board := @\\u267b→game→start;\n #PcO7yRSD4Y6NqNK1 @\\u267b→game→bounce_on_sides;\n #uuxlVRt3Fj7zUX3d $sprite := $board→create_rectangle(100, 100);\n #WeOMvS436zFINcmB $sprite→set_color(colors→blue);\n #cd8qQ2IGGEG8LSik $sprite→set_acceleration_y(400);\n #ozsU7Yocpctcf8Kz $sprite→set_opacity(0.8);\n #OTQ8K19QPPnhEckE // {/hide}\n #EBms12UX1I3YptSc // ### splatter\n #o4uCUnbQ4qtH4xOe // Display a splatter under the sprite that goes away after a couple secs.\n #pQPunYKP94mwyJYM code→splatter($sprite, $pic);\n #ItG0lTW3p7NiLMvc // ### add score to a sprite\n #WTbMbwwzr2UNA7NT // Add a score that pops a little ``+score`` on the top right corner of the sprite.\n #Ejn7ZLQa7j8Earpj code→add_score($sprite, 100);\n meta private;\n meta test;\n}\n#MHC9cku1GTEdncGR meta import game {\n pub \"sduub\"\n usage {\n action `sync` set_score(value: Number)\n action `async` set_life(value: Number)\n action `sync` start_timer()\n action `sync` start_countdown_timer(seconds: Number)\n action `sync` life() returns(r: Number)\n action `sync` score() returns(r: Number)\n action `sync` current_time() returns(seconds: Number)\n action `sync` add_score(value: Number)\n action `async` add_life(value: Number)\n action `sync` clear_timer()\n action `async` remove_life(value: Number)\n action `async` end()\n action `async` start() returns(board: Board)\n action `sync` reset()\n action `async` start_with_fixed_size(width: Number, height: Number) returns(board: Board)\n action `async` start_with_background_picture(pic: Picture) returns(board: Board)\n action `sync` board() returns(board: Board)\n action `sync` on_end(@action: Action)\n action `async` splash_text(message: String, seconds: Number, foreground: Color, background: Color, done: Action)\n action `async` start_landscape() returns(board: Board)\n action `async` start_portrait() returns(board: Board)\n action `sync` set_hud_colors(life: Color, timer: Color, score: Color)\n action `sync` hud_sprites() returns(sprites: Sprite_Set)\n action `async` life_visible() returns(b: Boolean)\n action `async` set_life_visible(visible: Boolean)\n action `sync` sprites() returns(sprites: Sprite_Set)\n action `async` set_background_scene(direction: String, pic: Picture)\n action `sync` bounce_on_sides()\n action `sync` create_sprite(pic: Picture) returns(sprite: Sprite)\n }\n}\n#IgJeOaT4qD6XCDWM\naction splatter(#xSZvm6EeJuCvT4s4 sprite: Sprite, #MCvt1zYjYJcK4L44 splatter: Picture) {\n #X4OAdwxnO5wHxDZa // Splats the ``splatter`` picture under the ``sprite`` and fades it away.\n #X64Ps5YYS1av5MpI $sp := @\\u267b→game→board→create_picture($splatter);\n #ODXoYXN95HMQR2Cl $sp→set_pos($sprite→x, $sprite→y);\n #u9qh43UUwoK0FZl0 $sp→set_width($sprite→width);\n #x2LYMGKCfJ1oW8qz $sp→set_speed($sprite→speed_x / 5, $sprite→speed_y / 5);\n #uAJdLNuxiNbu2T4D $sp→friction := 0.05;\n #xkBOKjaSeL4oRcyl $sp→z_index := $sprite→z_index - 1;\n #F7VCHbHecTaVIjT4 $anim := $sp→create_animation;\n #IUYXcNBxhS2fVVRG $anim→puff_out(0.6, \"cubic\", 1.2);\n #bx6onFKBhqu1SI15 $anim→delete;\n}\n#v4ugzdtO8BJPkkj4\naction add_score(#wysUeGszNWAN7trp sprite: Sprite, #tEL2GDgDi86bI72e score: Number) {\n #VeUaeIa25nApnqQT // Shows a little score animation\n #NxnWqSc1zhnO54N9 $bonus := @\\u267b→game→board→create_text(100, 20, 15, $score→to_string);\n #DdGj3W3NCt2n0PVo if $score > 0 then {\n #jIysyn2MjoPyhGQY $bonus→set_text(\"+\" ∥ $bonus→text);\n #dyvGOVwl5E8c2rkE $bonus→set_color(colors→orange);\n }\n else {\n #FMAzDAxm7WBKyVi5 $bonus→set_color(colors→red);\n }\n #VyMLdyfovccmoVPZ $bonus→fit_text;\n #s9mf7tHP4hg6zQrA $bonus→set_pos($sprite→right, $sprite→@top + $bonus→height * 0.6);\n #lU46vyX425TKrBrI $bonus→set_color(colors→green);\n #wGW2fYDAlMw9MmgM @\\u267b→game→add_score($score);\n #trQhQdUjt6fA4cos $anim := $bonus→create_animation;\n #zz6SU1LbMkxhFiv2 $anim→fork→fade_out(1.5, \"linear\");\n #aQP47O58Ny55MN92 $anim→move_to(1.5, \"linear\", \"inout\", $bonus→x, $bonus→y - $sprite→height / 2);\n #IWdqhz1GYoeIezqg $anim→delete;\n meta sync;\n}\n#xkUbqdD2nTGw2md2\naction demo() {\n #nKfBY2pfuGzl6Lqa $pic := media→create_picture(480, 800);\n #umREhXlH6l4zWsW1 $pic→clear(colors→green);\n #c4OOPp4yjrTumwFn $board := @\\u267b→game→start;\n #xC9EjUCuAFD2OizM @\\u267b→game→bounce_on_sides;\n #HTWzkiDs2iFrpskf $sprite := $board→create_rectangle(100, 100);\n #bzn6oVDiFRefDYp2 $sprite→set_color(colors→blue);\n #xYGC7i8OXtlJa6Do $sprite→set_acceleration_y(400);\n #JLsA8cmWdwlhqyVQ $sprite→set_opacity(0.8);\n #r5ErvAs4SbRUQw7y $sprite→on_tap($tapped);\n #ReFgA1ac1h6CUcqH where tapped(x: Number, y: Number) {\n #V34hkhzTxtRXuf22 code→splatter($sprite, $pic);\n #xdmQ7YIokLC3Enu3 code→add_score($sprite, 100);\n }\n meta private;\n meta test;\n}\n", -"oghqc": "meta version \"v2.2,js,ctx,refs,localcloud,unicodemodel,allasync,upperplex\";\nmeta name \"blank minecraft pi\";\nmeta color \"#ffffffff\";\nmeta rootId \"UqtPMmqsRpLtBLICK3xNRKmo\";\nmeta iconArtId \"eopyzwpm\";\nmeta allowExport \"yes\";\nmeta hasIds \"yes\";\nmeta splitScreen \"yes\";\nmeta platform \"current\";\nmeta parentIds \"\";\n// A empty Minecraft Pi script #minecraft\n#ALKdKR1Vv5Af8ary\naction main() {\n #SR5dzqJdsXnD9Px1 @\\u267b→minecraft_pi→forever;\n #Xy4Nv7JZuntRGG5a where `implicit` \\_body\\_() {\n #EzGPnaeUNsf2lJo0 $p := @\\u267b→minecraft_pi→player_→position;\n #Hs2flgMuxizo1bcw @\\u267b→minecraft_pi→set_block($p→x, $p→y, $p→z, \"flower yellow\");\n }\n}\n#WyUE5BlKyY4CRZ4d meta import minecraft_pi {\n pub \"gjnja\"\n usage {\n #BVGhpbmca\n table Block_Options {\n type = \"Object\";\n exported = true;\n persistent = false;\n fields {\n #xNQF2IfWS5kUTCuC state : Number\n // Specifies the color or the id of the whool\n #xUNtn4WzFNh0J275 wool : String\n }\n }\n #xIIDIryL3GdLzzFH\n table Connect_Options {\n type = \"Object\";\n exported = true;\n persistent = false;\n fields {\n #IhKVKMjdA949jNr3 host : String\n #PQgsvjixlAlu49Bw port : Number\n #nlMXsJlluWZB1fNN proxy : String\n }\n }\n #umgRs0Idq3y9jRyc\n table Block_Event {\n type = \"Object\";\n exported = true;\n persistent = false;\n fields {\n #SCV1txxxrjigP8XC kind : String\n #UIy6UFvY6WJWDDoA x : Number\n #wWASeEjKJDoiqrL2 y : Number\n #MkoIqcTcP3QiIoot z : Number\n #kYCW4sVB0Q5jQy0Q face : Number\n #EayHvTpmMjNF3Sfh entity : ♻ minecraft_pi → Entity\n }\n }\n #pqaWOjEWNqEkbxwJ\n table Position {\n type = \"Object\";\n exported = true;\n persistent = false;\n fields {\n #L4NO4JXo2Sev2b1J x : Number\n #x2UU2Lt4BiV8NNNz y : Number\n #gw4VDwinZ6yVcwzL z : Number\n }\n }\n #eVDb6TwJ7CKitS8g\n table Repeat_Options {\n type = \"Object\";\n exported = true;\n persistent = false;\n fields {\n // Delay in seconds between execution\n #VB0iDf9EazabCCQM delay : Number\n }\n }\n type Entity\n action `async` connect(options\\u003f: ♻ minecraft_pi → Connect_Options)\n action `async` set_block(x: Number, y: Number, z: Number, name: String, options\\u003f: ♻ minecraft_pi → Block_Options)\n action `async` set_many_blocks(x: Number, y: Number, z: Number, x2: Number, y2: Number, z2: Number, name: String, options\\u003f: ♻ minecraft_pi → Block_Options)\n action `async` block(x: Number, y: Number, z: Number) returns(name: String)\n action `async` height(x: Number, z: Number) returns(h: Number)\n action `async` chat(msg: String)\n action `async` position(entity: ♻ minecraft_pi → Entity) returns(pos: ♻ minecraft_pi → Position)\n action `async` set_position(entity: ♻ minecraft_pi → Entity, x: Number, y: Number, z: Number)\n action `sync` is_connected() returns(r: Boolean)\n action `async` player_() returns(p: ♻ minecraft_pi → Entity)\n action `async` direction(entity: ♻ minecraft_pi → Entity) returns(d: Number)\n action `async` rotation(entity: ♻ minecraft_pi → Entity) returns(d: Number)\n action `async` pitch(entity: ♻ minecraft_pi → Entity) returns(d: Number)\n action `async` player_by_name(name: String) returns(steve: ♻ minecraft_pi → Entity)\n action `sync` block_names() returns(names: Collection[String])\n action `async` forever(body: Action, options\\u003f: ♻ minecraft_pi → Repeat_Options) returns(t: Timer)\n action `sync` wool_colors() returns(cs: Collection[Color])\n action `sync` wool_color(c: Color) returns(name: String)\n action `async` spawn(kind: String, x: Number, y: Number, z: Number) returns(mob: ♻ minecraft_pi → Entity)\n action `async` test_spawn()\n }\n #YNj3qExlZycGqQi3 resolve shell = ♻ shell with {\n }\n}\n#eM2G2nbehvbb7nDd meta import shell {\n pub \"qmzn\"\n usage {\n #BdGhpbmca\n table Exec_Output {\n type = \"Object\";\n exported = true;\n persistent = false;\n fields {\n #YaaLgMz45N5ZuAeU success : Boolean\n #qrwQiGIhHhUhb8AF error : String\n #ijyQCE4KPQL2ziZD code : Number\n #wf4AkGfhLyWkyKhQ stdout : String\n #ZyLfqXXM99R1znCa stderr : String\n }\n }\n #ttC12C2SJrh1ODjl\n table Serial_Options {\n type = \"Object\";\n exported = true;\n persistent = false;\n fields {\n #wXa4BRcG6mdxKU25 delimiter : String\n }\n }\n type Command_Result\n type Shell_Socket\n action `async` write_file(path: String, content: String) returns(res: ♻ shell → Command_Result)\n action `sync` mkpath(folder: String, name: String) returns(path: String)\n action `async` mkdir(path: String) returns(res: ♻ shell → Command_Result)\n action `async` exec(cmd: String, cwd: String) returns(res: ♻ shell → Exec_Output)\n action `sync` logger() returns(logger: App_Logger)\n action `async` exec_file(cmd: String, args: Collection[String], cwd: String) returns(res: ♻ shell → Exec_Output)\n action `async` python_env() returns(res: ♻ shell → Command_Result)\n action `async` tcp_connect(host: String, port: Number) returns(sock: ♻ shell → Shell_Socket)\n action `async` receive(sock: ♻ shell → Shell_Socket) returns(netdata: String)\n action `async` send(sock: ♻ shell → Shell_Socket, netdata: String)\n action `async` close(sock: ♻ shell → Shell_Socket)\n action `async` serialport_connect(name: String, options\\u003f: ♻ shell → Serial_Options) returns(sock: ♻ shell → Shell_Socket)\n action `async` serial_list() returns(ports: Json_Object)\n }\n}\n", +"oixlc": "meta version \"v2.2,js,ctx,refs,localcloud,unicodemodel,allasync,upperplex\";\nmeta name \"what\\'s new?\";\nmeta rootId \"oGIahryiInwIpsu2H7pX84CQ\";\nmeta hasIds \"yes\";\nmeta platform \"current\";\nmeta parentIds \"\";\n// release notes #docs\n#gMH7AtpXfxA2FZuYuc70zvTg\naction main() {\n #KN6Hyh4R0VdJdW12 // {parentTopic:contents}\n #C4J9deHXvt4lAMtW // {priority:1}\n #xNGLl7UVKMsrfBtR // {hide}\n #hdiFhuPgtoIAxNMU $board := media→create_landscape_board(800, 480);\n #YFcbdAvVWgJIYuA2 $pic := media→create_picture(480, 800);\n #xHyoPiwr1eIqHsx8 $thing := records→thing_table→add_row;\n #KTDbHXA9o6IYn06Y // {/hide}\n #Gm1rJgBBb7mfxnas // * **Join the [TouchDevelop Updates group](#pub:evjjxsjs)** to be notified about upcoming features and releases.\n #xgSLZR22im6IwCPD // ### March\n #xpr2Q4pO2LOkLFXr // * The BBC announces the [Micro-Bit project](http://www.bbc.co.uk/mediacentre/mediapacks/makeitdigital/micro-bit) project.\n #q1OyHlYqW8XFO7uC // ### February\n #GnTs3k25Lp92y1Fl // * **we're open source on github** at [](https://github.com/Microsoft/TouchDevelop)!\n #bLGyRe88cWcUwPM3 // * deprecated crowd source run and coverage maps collection.\n #NSnGZHMZvQDX4awK // ### January\n #v3L9m2jXHjGCLbDw // * switched the app generation to App Studio and Cordova\n #ZFUQ9GsEs5SSkbgs // * button plugins can load buttons in the editor\n #tS9RO2F48DYHv6bV // * set a wallpaper in the hub!\n #kiA1lM0tw2WGGYET // * set an **icon** and **splash** picture art resource on scripts. The icon is displayed on all searches.\n #Vlmnwr0jCxc0bCty // * support for Python **pip** in ``app->import``. TouchDevelop creates a Python virtual environment and install the required pip packages.\n #wZ2rVQ3FOGZWfEdD // ### December 2014\n #x5oG13lAF6NZyDli // * [group scripts](/groupscripts) allow multiple users to collaborate on a single script\n #PVabV6GQFdt4XBag // * `app->import` allows to import **Node.JS npm** or **Apache Cordova plugins**.\n #wiTYksRN9Hv2iVnq app→import(\"npm\", \"azure-storage\", \"*\");\n #HA4q6o3aE7Cyz6tE // * script [plugins](/plugins) can have button inserted in the script editor\n #qV0pfa992reHW5Hv // * new [arduino tutorials](/arduinotutorials)\n #xJUEp8q1O2PUK74X // {pic:arduino blink:4x4}\n #pZ3uWaouxVtg7RPO // ### November 2014\n #YjF6a4nYSKYHJSXX // * An awesome new tutorial with super-cool videos that explain every step!\n #jSFgLhHY5aFFw6e0 // {follow:Coding Jetpack Jumper!}\n #sLrTw2l2DAXtP4qI // * **beta only:** real time multi user editing of [group scripts](/group scripts)!!!\n #pVVkVwNlJE44ZhD2 // * **beta only:** different editor modes for different users: try the **block mode** and **pro mode**\n #KKYOD6Rx6EWIgrDZ // {pic:block mode:7x7}\n #VnMmHhxgba8g0XJc // {pic:pro mode:7x7}\n #xJCceQUmsB4YdCsp // * new api `app->restart` let's you easily restart your script\n #xmEi5ZOJuHyI5cmR // ### October 2014\n #xnkgZyJ68CUy3ob1 // * when publishing, **add a release note** from the publish dialog\n #OkKSuSF4FBBR0jIS // * fork scripts and **[send a pull request](/pullrequests)**\n #rg4flIOCfg42dcfV // * `[go to]` now works for [extension actions](/extension actions) and [](/libraries)\n #ozPvx4o6D0mIKCYG // * **drag and drop** of statements in editor (when applicable)\n #iGxwLE2IEBp0mtrf // {pic:draganddrop:17x11}\n #aVJIaCI47ed62nvp // * libraries are bound a main script which allows to edit a referenced library and still run the script without switching.\n #Pn0iqqaRpZMaCsIR // * script comments are automatically loaded for earlier versions\n #gzErp0wP0OfPBo4T // * documentation can be browsed outside the editor at [](https://www.touchdevelop.com/docs)\n #K3MUP9gl62nlCIvO // * tutorials and documentation topics are automatically translated using Bing translator based on the browser language\n #vulQJpxFQTfIWRer // * the crowd-sourced localization of TouchDevelop has started! Try it out at [](https://touchdeveloptranslator.azurewebsites.net/)\n #hdQ0ZCKjkKssc0CV // * `box->set font family` allows to specify the font on a box\n #FQYXdoSkXUc82Uyx // * when renaming a local variable to a name that already exists, the editor proposes to merge the two variables\n #pvDy7RQo6TFK3JQZ box→set_font_family(\"Georgia\");\n #VKS8E7BPD7acVcd9 // * new `Sprite->left`, `Sprite->right`, `Sprite->top`, `Sprite->bottom` action to get the coordinates of the bounding box of a sprite.\n #rxbculFeHF4gcwv3 // * new `Buffer->concat`, `Buffer->read number`, `Buffer->write number`, `DateTime->milliseconds since epoch`, `math->div`, `web->encode uri`, `web->decode uri`, `web->encode uri component`, `web->decode uri component`\n #btWsFTctkwUp73lj // ### September 2014\n #Zizy5aFD6EU16ku6 // * new bear and pixel art tutorials leveraging the ``{stvalidator:...}`` macros.\n #vN6499h5IP4Ufmvl // * easy access to `app->log` through new button.\n #cE2MQC4SVXlvLHas // * richer logging infrastructure throuugh `app->create logger`\n #xr0ympiTptzn4h9r $logger := app→create_logger(\"my logger\");\n #pLB29ibkA6YwZyiU $logger→debug(\"a debug message\");\n #DbLce24L1veQ4HhT $logger→info(\"an info message\");\n #Wi1rReEWmIl7rQNT $logger→info(\"an error message!\");\n #B4gUxU6KbPiTzprj // * `Sprite->fit text` wraps the sprite bounding box around the text. `Sprite->set text alignment` allows to control how the text aligns vertically.\n #xda3VWfBlQDkajcz // * new ``{pici:...}`` and ``{sthashtags:...}`` macros for tutorials.\n #n1V224nUV7Hx7Bp3 // ### August 2014\n #xqmwBEi2K2Mx5XB3 // * `[comment out]` now shows up as an option when `[select]`ing lines of code\n #KDBouGJ0yqwbuLSC // * `[uncomment]`, `[strip if/for/...]` are now options when editing block statements\n #xmpTPUNKKU1NP1Z4 // * when you `[edit library]` from a script (which is now also more easily available) it adds a temporary link from the library to the parent script, so it's easier to go back and you can **deploy** parent script from the library; shortly you'll be also able to **run** it\n #xvEm557GPTJvAkdd // * new APIs: `Buffer->concat`, `Buffer->write number`, `Buffer->read number`, `math->div` (integer division), `DateTime->milliseconds_since_epoch` (epoch is, of course, 1970-01-01)\n #xi1ICDInif6b0xd5 // * tutorials with `{stvalidator}` now have access to `app->editor`\n #ducKZaXdvSn1LLWU // * Windows Phone 8.1 Update 1 is now supported\n #dKHLgvcRUKWRB84x // ### merging scripts\n #x9vdf8GQj929RnyG // At the bottom of info pages about published scripts there is now a new `[merge]` button. It let's you pick a target script in your account. It will then merge the changes between the common parent of these two scripts.\n #FS4bg5kyR0AJXVb8 // This feature is **beta** only.\n #xT4nXwphk9EENGK3 // ### July 2014\n #ptCPf721OV3p0bSr // * immutable types (i.e., ones which once created never change) are now marked with a little diamond\n #x6lLNbQg7et2EZAk // * new API `Collection->map to`, `Collection->ordered by`, `Collection->ordered by string`, `Collection->sorted` - higher order programming is coming to TD! we now also have `Collection->take`, `Collection->slice` as well as `create->collection of->...` for creating collections of arbitrary types\n #nr9bjJXxESYCawUV // * new `->wait for update` API on tables and indices\n #uq2o327lpSaTRI2S // ### June 2014\n #wYV4JrgD5s6FWI7t // * support for `Gamepad`\n #tgVzFk67GzK95nT0 // {pic:Xbox 360 gamepad:11x11}\n #efC2PV6rDZ5wWJSF $gamepad := senses→gamepads→at(0);\n #xMvOhtOZkTPT54DT if $gamepad→is_button_pressed(\"x\") then {\n #Utu0GZArBP4Iprto // shoot!\n }\n #Yrlb4Ry3y8K2yqvh // * custom validator in tutorials\n #VMedROHjGmtTxM80 // * split screen view in editor\n #dguL9eRXAIzNSOXO // ### May 2014\n #QWm8SUaVFH9e3eY9 // * `Task` now has `Task->completed`, `Task->value`, and `Task->await at most` [more info] (/asyncActions)\n #o0nc5EVOVV2R9g2h // * Logs are enabled also for published scripts\n #fOnZlHemD3JokxwO // * wait for messages from the parent frame\n #eQjUBLmGkFbpkASK $js := web→wait_for_message_from_parent(\"https://www.touchdevelop.com\");\n #xBTaJtW0yjIFW8y8 // ### April 2014\n #M0PSSIvUWBJWmqhi // #### Export to Android\n #ctXEW1KYFYvdXlH0 // Take your favorite script and [turn it into an Android app](/exporttoandroid)!\n #amczWXR0V2J7DYl7 // #### Export to Windows 8.1\n #kyhYUwojXgNfMI32 // We've updated our template and the exported Windows apps are now targeting 8.1.\n #kTE9uNrD2RWoBT8C // #### post and receive messages\n #xFLQsORmFJjTxlq8 // For the adventurous, it is now possible to post and receive messages between a TouchDevelop web app and its parent window.\n #x27TCdxiSFnSSMb4 // * post a message\n #xbK2liAPKS6bwodb web→post_message_to_parent(\"https://www.touchdevelop.com\", web→json_object);\n #IPRrn0QlLOhB36OK // * listen to incoming messages\n #ejJR3FUPFfM2qqPs web→on_received_message_from_parent(\"http://yourhostdomainname.something\", $received);\n #vLKi4zZGzwnvOZKR where received(json: Json_Object) {\n #zfHUftNJW4BFsMnC skip;\n }\n #h4LDm62JHbaOimTo // #### background pictures on boxes\n #tmivmy8mhcNZh7Nr // You can efficiently set one or more pictures as the background of a `box` using `box->add background picture`. The API does not impact the size of the box.\n #ZoveBWBWaAMGSRPz box→add_background_picture($pic, \"center center\", \"cover\", \"no-repeat\", \"scroll\");\n #hw6nBaRo847s9iil // #### hiding the title bar on pages\n #cN1c17sI2xSC1udr // You can hide the title and subtitle bar on the pages.\n #xEdUS4FJiwZ9cu64 wall→show_title_bar(false);\n #j2tWdyNbps42FXSb // ### March 2014\n #xtgXEU8BB93WTtil // #### Reorganized tutorials section\n #xF2Nm2dJhzBnD6Ul // As the list of tutorials grew longer and longer, we've reorganized them into categories. Tell us what you think!\n #Abb9Odg3L9wtP6CC // * [check out the new tutorials](/tutorials)\n #SWZt9P29nFdqDPWN // #### OneDrive support\n #wK1vvSAAQuubRjSe // Upload pictures to OneNote easily. The resulting `Cloud Picture` can be stored in an table or index.\n #i6Edi5yctYksdwAs $onedrive_pic := cloud_storage→upload_picture($pic, \"public\", \"\");\n #eixE9tEciDf527YB $onedrive_pic→post_to_wall;\n #gnsNGxGAvLzW8iPj // A `Cloud Picture` can be stored in tables and indices which allows to share them!\n #xUEtu327qEiqNCH5 // #### OneNote support\n #MOfJQ69dhYEfGh4Q // Create new pages in your OneNote with text, pictures and more!\n #Z6AD6VuAj7wvRmC3 $form := web→create_form_builder;\n #PmtsdZrr1bPrr6Wh $form→add_string(\"Presentation\", \"Yay!\");\n #FPKHJtraWucSSGz4 cloud_storage→upload_note($form);\n #tWo2ES4E2W2AxF2n // #### Arduino Esplora support\n #zk7g7nfYGBsnW4xB // Build scripts for the Esplora board using TouchDevelop! Look for the `[blank esplora]` template to get started.\n #InttAI7LPAREaWHr // * try the [esplora level tutorial](/esploraleveltutorial)\n #OjhdxFirqdh0Qxia // ### February 2014\n #mNMXPx1B3mJNvoXz // #### new refactoring: move to library\n #UFVd0ZAosyc8yuKN // Is your script getting too large to manage? Think about using the [move to library](/movetolibrary) refactoring support to move related elements of your script into a library.\n #rQqJWd7kKhaagTp8 // #### parallax backgrounds\n #RnNVp2kbW5LCV1Gb // Create awesome scrolling effects with the [background scrolling](/parallaxbackgrounds) support.\n #LKhR34KG7Qp8929Y $scene := $board→background_scene;\n #sXpKhu2tm8bVC4AF $back_layer := $scene→create_layer(0, art→nature);\n #On3ZT1H5qzrbg2h4 // Take a look at [this demo](#pub:cprja) from David Renton!\n #Sc0DUKR92oVvpXz1 // #### keyboard support\n #qm6AHO0Ztm5fF7ah // You can listen to key pressed on the keyboard (if available). You can listen to event or simply query for keys.\n #ByDk09RpVj9Qy89I // * attach an event. It will repeat automatically if the user keeps pressing the key.\n #xY2tf5SdjS2w7NwX senses→on_key_pressed(\"space\", $handler2);\n #gHo1W85uQlQ7AQFc where handler2() {\n #qQzuB57IuP2pRDf5 // Do something when space is pressed\n }\n #PJsvNHxqXEV4DpwY // * query the status of a given key\n #damdUTIZtFzTPOJD $b := senses→is_key_pressed(\"space\");\n #xgwYHHUeAswJjL23 // ### January 2014\n #UdpXhKxqwusZzcM9 // #### page models\n #HN3PLMP1v9TfStnm // [Pages](/page) now comes with an associated object type to store the **data**. It is edited together with the page in the **data** section (see example below). Every time the page is pushed a new instance of the page data is created.\n #PIgKRS2bXzpgRdv9 // {decl:show}\n #xLuQ6yyrI49hxwgI // #### timers\n #EzPTlUMkQ8MeNGad // Using `time->run after` and `time->run every`, you can schedule a handler of code to run once or at regular intervals.\n #tbjUYrS0xPoq4EZ4 time→run_after(3, $perform);\n #vl74hr7B4Ynhz4gh where perform() {\n #d137srI0VHIgQ42p // this code will run after 3 seconds of delay\n #SIAlx8bJyftKzpL5 skip;\n }\n #xLTuQBp8wQxge4o0 // The action `time->on every frame` allows to register a handler in a built-in game loop timer.\n #xs2TIThvzy4VmxSj time→on_every_frame($perform2);\n #VHQKoOSby2fgVy0G where perform2() {\n #xc6AoudLjgxb3kb8 // runs this code many times a second\n }\n #vI0j1XSJu32BYFH2 // #### inline events\n #D0b8PPRagmEnMBPj // We've added inline events for various global events. This means that you can attach (and detach) handlers to the `shake` event by using `senses->on shake`:\n #rUuLSLcoSl3H2r4s senses→on_shake($handler);\n #xlCmu8p3fAnRtNPw where handler() {\n #xnzuKlrGp4X55CHj // this code runs when the device is shaken!\n }\n #y2CRR2t1v2YVmuLP // Also added: `senses->on phone face up`, `senses->on phone face down`, `senses->on phone landscape left`, `senses->on phone landscape right`, `senses->on phone portrait`, `player->on active song changed`, `player->on player state changed`.\n #BhRIcWMBNbJvSgFD // #### maps\n #tk8SkFGqsFVJgeO0 // You can manipulate map **pushpins** easily: you can move thenm and register code on their ``on tap`` event.\n #uF2SA7ZTUdQZfvuh $map := maps→create_map;\n #Hgqk1s1QruxOWPzZ $pushpin := $map→add_text(senses→current_location, \"Yay!\", colors→accent, colors→white);\n #GKU7C0T2YuGvC1Yo $pushpin→on_tap($tapped);\n #AMTeUqcKWnOCSyyT where tapped() {\n #jlU4tkiDOjtZYvkl // runs when the user taps the pushpin!\n }\n #pAUqAIkNXXJCb9q3 // #### sprite sheets and animations\n #gGSGqj4mRdbLbkCH // A [sprite sheet](/spritesheet) is a picture that packs multiple images of an animation. It is commonly used in 2D games to create animations and efficiently package pictures together.\n #VDMtLedYw41T9Xb1 $sheet := $board→create_sprite_sheet(art→sheet);\n #xSaZgZfCa7PCKjv9 $sprite_ := $sheet→create_sprite(\"monster\");\n #x1gRQzNt9OCfUVf6 // Sprite properties such as opacity can be animated using [sprite animations](/spriteanimation).\n #iRBePYa2iGsxxJay $anim := $sprite_→create_animation;\n #nfZxLBbjP8x8yaSy $anim→fade_in(1, \"expo\");\n #AUlcOKPa0sQ8ZrC2 $anim→fade_out(1, \"quadratic\");\n #tENQxAxwNH3izuvf // #### obstacles\n #Dk9mqBesyVrHn4tD // The `board->create obstacle` returns an [](/obstacle). You can change the color or attach to events on the obstacle.\n #gJC20L3zXnGWyWoQ $obstacle := $board→create_obstacle(0, 0, 100, 100, 1);\n #BVV3SlloJE5xdWGq // * play a sound when an object bounces\n #NJCf0QLA4nM6HWg7 $obstacle→on_collision($bounce);\n #DFui22yFHSa20lr3 where bounce(sprite: Sprite) {\n #x2M80w4jYg0s4dsH // runs when a sprite bounces on the obstacle...\n }\n #n84Ok32Cpn7N1xz8 // * remove obstacle\n #FD8f8ntRjTFOYgFd $obstacle→delete;\n #pIrlAfuEH2f27VXp // #### other stuff\n #Gsjj7aKcN41DVmqS // * `senses->record microphone` support through [WebRTC](http://www.webrtc.org/)\n #siRQjDie3HsLnHy3 // * improvements in [](/libraries) documentation authoring\n #tB4O84e4OIJ4dllC // * customizable zoom factor for text (look in Settings in the Hub)\n #KeUiAm45I2EcZQD6 // * you can now define your own [action types](/actiontypes)\n #sn41TNhNQH2h5mxJ // * control structures (like `for` or `while`) are now displayed with an `end` keyword at the end. This makes it easy to add stuff after them and makes the scoping clear.\n #Us2LVnhyUmzSftLG // ### Older release notes\n #iuHW7I32l31xjT77 // * [what's new? 2013](/whatsnew2013)\n}\n#xDaFBvTdimT9orVbFsfSFNFA\naction show(#nb8QcaSLy2sZRFD6 \\u2756: * show_page_data) {\n #q3zqAKeTpljUqtLP if box→is_init then {\n #LtNAF02isq7bKo49 $\\u2756→counter := 0;\n }\n #i34bAjBmEr64ak5s if true then {\n #ctaNyxHk2oPV2rkg $\\u2756→counter→post_to_wall;\n #EAhNogbWhLE2FLDo box→on_tapped($handler);\n #s5Bl3Y1Ot2Zppsix where handler() {\n #fgBm1IJ8ju4qa46h $\\u2756→counter := $\\u2756→counter + 1;\n }\n }\n meta page;\n meta sync;\n}\n#BICBuYW1lICAa\ntable show_page_data {\n type = \"Object\";\n persistent = false;\n fields {\n #xUj2CwS6PTK5ZjC6yGL8Y8E6 counter : Number\n }\n}\n#dys4Eewl2C5GN3fDN4Rz9Mnz\nvar sheet : Picture {\n is\\_resource = true;\n url = \"https://az31353.vo.msecnd.net/pub/lvxdmali\";\n transient = true;\n}\n#zHH1uV1wY4qUHQzfaBkZaooz\nvar nature : Picture {\n is\\_resource = true;\n url = \"https://az31353.vo.msecnd.net/pub/pxuumvdl\";\n transient = true;\n}\n#BdGhpbmcgdGFibGUa\ntable thing {\n type = \"Table\";\n persistent = true;\n fields {\n #d7R6BWVqibW7FAhFCsKVV2vM pic : Cloud_Picture\n }\n}\n#xQ2tUepQG3htXvNC9XJ9Blq1\nvar Xbox_360_gamepad : Picture {\n is\\_resource = true;\n url = \"https://az31353.vo.msecnd.net/pub/qmrebwzq\";\n transient = true;\n}\n#MaJHONlLZA7msNcK\nvar draganddrop : Picture {\n is\\_resource = true;\n url = \"https://az31353.vo.msecnd.net/pub/ugbrfmxk\";\n transient = true;\n}\n#M0DWrZa7ca1vfLan\nvar pro_mode : Picture {\n is\\_resource = true;\n url = \"https://az31353.vo.msecnd.net/pub/flnuktvd\";\n transient = true;\n}\n#wuUz5Ma8wz5BM24J\nvar block_mode : Picture {\n is\\_resource = true;\n url = \"https://az31353.vo.msecnd.net/pub/ujvglgks\";\n transient = true;\n}\n#u1V47sacOEL1Wdh4\nvar arduino_blink : Picture {\n is\\_resource = true;\n url = \"https://az31353.vo.msecnd.net/pub/ilohpnvs\";\n transient = true;\n}\n", "opqwc": "meta version \"v2.2,js,ctx,refs,localcloud,unicodemodel,allasync,upperplex\";\nmeta name \"blank azure web api\";\nmeta icon \"Stacks\";\nmeta color \"#ffffffff\";\nmeta rootId \"x4mibwzdISu8zLeLgg7b3IKt\";\nmeta iconArtId \"wyfreugv\";\nmeta isLibrary \"yes\";\nmeta allowExport \"yes\";\nmeta isCloud \"yes\";\nmeta hasIds \"yes\";\nmeta platform \"network,npm,shell\";\nmeta parentIds \"\";\n// An Azure web api using Restify. #node #azure #restify #rest #api\n#xSBmyyFcqCDRZi1l meta import azure_storage {\n pub \"fwer\"\n usage {\n type @table\n type table_query\n action `async` init()\n action `async` create_private_table_if_not_exists(name: String) returns(@table: ♻ azure_storage → @table)\n action `async` insert_entity(@table: ♻ azure_storage → @table, entity: Json_Object, when_present: String)\n action `async` update_entity(@table: ♻ azure_storage → @table, entity: Json_Object, mode: String)\n action `async` try_update_entity(@table: ♻ azure_storage → @table, entity: Json_Object, mode: String) returns(ok: Boolean)\n action `async` delete_entity(@table: ♻ azure_storage → @table, entity: Json_Object)\n action `sync` create_entity(PartitionKey: String, RowKey: String) returns(entity: Json_Builder)\n action `async` delete_table(@table: ♻ azure_storage → @table)\n action `sync` create_query(@table: ♻ azure_storage → @table) returns(query: ♻ azure_storage → table_query)\n action `sync` @top(query: ♻ azure_storage → table_query, count: Number) returns(res_query: ♻ azure_storage → table_query)\n action `sync` @where(query: ♻ azure_storage → table_query, expression: String, argument: String) returns(res_query: ♻ azure_storage → table_query)\n action `sync` partition_key_is(query: ♻ azure_storage → table_query, PartitionKey: String) returns(res_query: ♻ azure_storage → table_query)\n action `sync` @and(query: ♻ azure_storage → table_query, expression: String, argument: String) returns(res_query: ♻ azure_storage → table_query)\n action `sync` @or(query: ♻ azure_storage → table_query, expression: String, argument: String) returns(res_query: ♻ azure_storage → table_query)\n action `async` get_entity(@table: ♻ azure_storage → @table, PartitionKey: String, RowKey: String) returns(result: Json_Object)\n action `sync` page_size(query: ♻ azure_storage → table_query, count: Number) returns(res_query: ♻ azure_storage → table_query)\n action `async` execute(query: ♻ azure_storage → table_query) returns(entities: Json_Object)\n action `sync` create_log_id() returns(id: String)\n action `sync` create_random_id(size: Number) returns(id: String)\n }\n}\n#czWG9NcXY9uFZHMz\naction \\_init() {\n #bMLhngb94mCl87BE // This action runs when the web server starts up. To deploy this service, go to the script settings, then tap `[Azure]` under `[export to app]`.\n #rg6M5H46J1bK4x8c data→logger := app→create_logger(\"api\");\n #fmCQZR9L4MGzZxju code→init_azure_services;\n #x2Y2gFv2oHeZKjaB code→init_restify;\n}\n#FrNAgtgAKnFVC43t\naction GET_\\u002fping() returns(#aM0QoLDaWxwAlfSy millis: Number) {\n #xzy3cNZXu2Lbz9f2 // Returns the number of milliseconds since epoch.\n #IYDlx4xcyWX5wD4m $millis := time→now→milliseconds_since_epoch;\n}\n#xEtQAQTr2kEKR4Qd meta import azure_search {\n pub \"acqbc\"\n usage {\n type Index_Definition\n type Index\n type Batch_Update\n type Field_Definition\n type Scoring_Profile\n action `async` create_or_update(schema: ♻ azure_search → Index_Definition) returns(index: ♻ azure_search → Index)\n action `sync` create_batch_update(index: ♻ azure_search → Index) returns(update: ♻ azure_search → Batch_Update)\n action `sync` upload(update: ♻ azure_search → Batch_Update, key: String) returns(doc: Json_Builder)\n action `sync` merge(update: ♻ azure_search → Batch_Update, key: String) returns(doc: Json_Builder)\n action `sync` delete(update: ♻ azure_search → Batch_Update, key: String)\n action `async` send(update: ♻ azure_search → Batch_Update) returns(status_code: Number)\n action `async` init(service_name: String, api_key: String, api_version: String)\n action `async` delete_index(index: ♻ azure_search → Index) returns(deleted: Boolean)\n action `async` statistics(index: ♻ azure_search → Index) returns(document_count: Number, storage_size: Number)\n action `sync` action_count(update: ♻ azure_search → Batch_Update) returns(count: Number)\n action `sync` create_index_definition(index_name: String, key_name: String) returns(schema: ♻ azure_search → Index_Definition)\n action `sync` add_field(schema: ♻ azure_search → Index_Definition, name: String, type: String) returns(field: ♻ azure_search → Field_Definition)\n action `sync` set_searchable(field: ♻ azure_search → Field_Definition, value: Boolean)\n action `sync` set_filterable(field: ♻ azure_search → Field_Definition, value: Boolean)\n action `sync` set_sortable(field: ♻ azure_search → Field_Definition, value: Boolean)\n action `sync` set_facetable(field: ♻ azure_search → Field_Definition, value: Boolean)\n action `sync` set_suggestions(field: ♻ azure_search → Field_Definition, value: Boolean)\n action `sync` set_retrievable(field: ♻ azure_search → Field_Definition, value: Boolean)\n action `sync` index_builder(schema: ♻ azure_search → Index_Definition) returns(jsb: Json_Builder)\n action `sync` add_CORS_origin(schema: ♻ azure_search → Index_Definition, origin: String)\n action `sync` update_builder(update: ♻ azure_search → Batch_Update) returns(jsb: Json_Builder)\n action `async` index_definition(index_name: String) returns(schema: Json_Object)\n action `async` indexe_definitions() returns(schema: Json_Object)\n action `sync` add_scoring_profile(index: ♻ azure_search → Index_Definition, name: String) returns(profile: ♻ azure_search → Scoring_Profile)\n action `sync` set_weight(profile: ♻ azure_search → Scoring_Profile, field: ♻ azure_search → Field_Definition, weight: Number)\n action `sync` add_magnitude(profile: ♻ azure_search → Scoring_Profile, field: ♻ azure_search → Field_Definition, boost: Number, interpolation: String, boosting_range_start: Number, boosting_range_end: Number, constant_boost_beyond_range: Boolean)\n action `sync` set_function_aggregation(profile: ♻ azure_search → Scoring_Profile, type: String)\n action `sync` key_field(schema: ♻ azure_search → Index_Definition) returns(key: ♻ azure_search → Field_Definition)\n action `sync` reset(update: ♻ azure_search → Batch_Update)\n action `sync` get(schema: ♻ azure_search → Index_Definition) returns(index: ♻ azure_search → Index)\n }\n}\n#WZspI7jfXbkshSQN meta import azure_service_bus {\n pub \"wbgha\"\n usage {\n #BVGhpbmca\n table Shared_Access_Signature_Options {\n type = \"Object\";\n exported = true;\n persistent = false;\n fields {\n // Authorization rule name; if empty the ``RootManageSharedAccessKey`` is used\n #LZ3fT92mZud9ADXV key_name : String\n // The ``Primary Key`` associated to the Authorization rule. Leave empty for ``RootManageSharedAccessKey``.\n #Z5xeMrnQRfDYLF4h key : String\n // Expiration in seconds from the current time.\n #l9O44Lv51CRijsGx expires_in : Number\n }\n }\n type Topic\n type Queue\n type Queue_Message\n type Subscription\n action `async` init()\n action `async` create_topic_if_not_exists(name: String) returns(topic: ♻ azure_service_bus → Topic)\n action `async` create_queue_if_not_exists(name: String) returns(queue: ♻ azure_service_bus → Queue)\n action `async` send_message(queue: ♻ azure_service_bus → Queue, message: String)\n action `async` delete_queue(queue: ♻ azure_service_bus → Queue)\n action `async` receive_message(queue: ♻ azure_service_bus → Queue) returns(message: String)\n action `async` peek_message(queue: ♻ azure_service_bus → Queue) returns(message: ♻ azure_service_bus → Queue_Message)\n action `async` delete_message(message: ♻ azure_service_bus → Queue_Message)\n action `sync` content(message: ♻ azure_service_bus → Queue_Message) returns(content: String)\n action `async` delete_topic(topic: ♻ azure_service_bus → Topic)\n action `async` send_topic_message(topic: ♻ azure_service_bus → Topic, message: String)\n action `async` create_subscription(topic: ♻ azure_service_bus → Topic, name: String) returns(subscription: ♻ azure_service_bus → Subscription)\n action `async` delete_subscription(subscription: ♻ azure_service_bus → Subscription)\n action `async` receive_subscription_message(subscription: ♻ azure_service_bus → Subscription) returns(message: String)\n action `sync` create_sas_token(entity_path: String, options\\u003f: ♻ azure_service_bus → Shared_Access_Signature_Options) returns(token: String)\n }\n}\n#GtzZ3bQlwmMy9v5o meta import azure_blob_storage {\n pub \"gajza\"\n usage {\n #eQ9ksqF8mc5ykZ0k\n table Create_Options {\n type = \"Object\";\n exported = true;\n persistent = false;\n fields {\n #v2t1qjT74Nc5nEeS etag : String\n #zNv4AFwkrDTt7NE6 force_new : Boolean\n #JEQEgLG1XiOpoNTc just_try : Boolean\n #S4e80DX2Kc4HnE96 contentType : String\n #lqupeQTDrct300uA contentEncoding : String\n #xLEc1tc4MYZOowJi cacheControl : String\n #x7sLNi86uuIjZYsp contentDisposition : String\n }\n }\n type Blob_Service\n type Container\n type Blob_Info\n action `async` init()\n action `sync` create_random_id(size: Number) returns(id: String)\n action `sync` create_blob_service() returns(blob_service: ♻ azure_blob_storage → Blob_Service)\n action `async` create_container_if_not_exists(blob_service: ♻ azure_blob_storage → Blob_Service, container_name: String, permission: String) returns(container: ♻ azure_blob_storage → Container)\n action `async` create_block_blob_from_local_file(container: ♻ azure_blob_storage → Container, blob_name: String, file_path: String) returns(result: ♻ azure_blob_storage → Blob_Info)\n action `async` create_block_blob_from_text(container: ♻ azure_blob_storage → Container, blob_name: String, text: String, options\\u003f: ♻ azure_blob_storage → Create_Options) returns(result: ♻ azure_blob_storage → Blob_Info)\n action `async` get_blob_to_file(container: ♻ azure_blob_storage → Container, blob_name: String, file_path: String) returns(result: ♻ azure_blob_storage → Blob_Info)\n action `async` get_blob_to_text(container: ♻ azure_blob_storage → Container, blob_name: String) returns(info: ♻ azure_blob_storage → Blob_Info)\n action `async` delete_blob(container: ♻ azure_blob_storage → Container, blob_name: String)\n action `async` get_blob_to_buffer(container: ♻ azure_blob_storage → Container, blob_name: String) returns(result: ♻ azure_blob_storage → Blob_Info, buf: Buffer)\n action `async` create_block_blob_from_buffer(container: ♻ azure_blob_storage → Container, blob_name: String, buffer: Buffer, options\\u003f: ♻ azure_blob_storage → Create_Options) returns(result: ♻ azure_blob_storage → Blob_Info)\n action `async` set_service_properties(blob_service: ♻ azure_blob_storage → Blob_Service, properties: Json_Object) returns(result: Json_Object, response: Json_Object)\n action `async` set_cors_properties(blob_service: ♻ azure_blob_storage → Blob_Service, allowed_origins: String, allowed_methods: String, allowed_headers: String, exposed_headers: String, max_age_in_seconds: Number) returns(success: Boolean)\n action `async` service_properties(blob_service: ♻ azure_blob_storage → Blob_Service) returns(result: Json_Object, response: Json_Object)\n action `async` etag(inf: ♻ azure_blob_storage → Blob_Info) returns(etag: String)\n action `async` last_modified(inf: ♻ azure_blob_storage → Blob_Info) returns(lastmod: DateTime)\n action `async` content_md5(inf: ♻ azure_blob_storage → Blob_Info) returns(md5: Buffer)\n action `async` list_blobs(container: ♻ azure_blob_storage → Container, prefix: String) returns(blobs: Collection[ ♻ azure_blob_storage → Blob_Info])\n action `async` name(inf: ♻ azure_blob_storage → Blob_Info) returns(blob_name: String)\n action `sync` get_blob_url(container: ♻ azure_blob_storage → Container, blob_name: String, expires: Number) returns(blob_url: String)\n action `sync` generate_random_id(blob_service: ♻ azure_blob_storage → Blob_Service) returns(id: String)\n action `async` get_blob_properties(container: ♻ azure_blob_storage → Container, blob_name: String) returns(info: ♻ azure_blob_storage → Blob_Info)\n action `async` succeded(inf: ♻ azure_blob_storage → Blob_Info) returns(ok: Boolean)\n action `async` text(inf: ♻ azure_blob_storage → Blob_Info) returns(text: String)\n action `async` error(inf: ♻ azure_blob_storage → Blob_Info) returns(message: String)\n action `async` url(container: ♻ azure_blob_storage → Container) returns(url: String)\n action `async` create_block_blob_from_url(container: ♻ azure_blob_storage → Container, blob_name: String, url: String, options\\u003f: ♻ azure_blob_storage → Create_Options) returns(result: ♻ azure_blob_storage → Blob_Info)\n }\n}\n#a4wL0Lb7xeWxhV4L meta import parallel {\n pub \"fncvb\"\n usage {\n type queue\n action `async` @for(count: Number, @action: Number_Action)\n action `async` for_batched(count: Number, batch_count: Number, item_action: Number_Action, batch_action: Action)\n action `sync` schedule(q: ♻ parallel → queue, task: Action)\n action `sync` create_queue(max_running: Number) returns(queue: ♻ parallel → queue)\n action `async` wait_for_empty(q: ♻ parallel → queue)\n action `async` for_json(js: Json_Object, @action: Json_Action)\n }\n}\n#CW3Wao3uu3Z2Fhe6\nvar logger : App_Logger {\n transient = true;\n}\n#nqXVz0rfKvDDnRD4\naction init_azure_services() {\n #OBj6PIXBqnKUsTPb // Initializes Azure Storage, Azure Blob Storage and Azure Service Bus\n #r8um59444dareUX1 // TODO: setup Application Insights instrumentation key to collect statistics\n #lKXvUpBSfoDB4Fwn @\\u267b→application_insights→init;\n #SefRc2WV2N6j47d4 @\\u267b→azure_storage→init;\n #xEz0G2dzTJTWxcUJ @\\u267b→azure_blob_storage→init;\n #MvPpKEWTfR2lF47o @\\u267b→azure_service_bus→init;\n #x471VF7xAMk2DGHB @\\u267b→azure_event_hubs→init;\n #pNmq2bCUAPLYWZdS where sas_token := @\\u267b→azure_service_bus→create_sas_token(\"\");\n #zudlvXHTv0hhPwyW data→blobs := @\\u267b→azure_blob_storage→create_blob_service;\n meta private;\n}\n#iiySPFknzOIjtFIO\nvar blobs : ♻ azure_blob_storage → Blob_Service {\n transient = true;\n}\n#rmfzWWMIFG8Ule9I\naction init_restify() {\n #GL26xBm2sW9gi51S $server := @\\u267b→restify→server;\n #q44IvFRo4glW35y4 // plugins\n #eq0FvCwwbob1i3UD $server→use(@\\u267b→restify→authorization_parser);\n #Ee6qD4jb4Xr4TCYg $server→pre(@\\u267b→restify→sanitize_path);\n #xiHn2sJ7jyfBOFLf $throttle := @\\u267b→restify→throttle;\n #ZU1qf4WMSwf2ZZs8 where rate := 40;\n #S04R2349FF42Rb2O where burst := 100;\n #qa878gtstkVP7tTO where ip := true;\n #kld3kZpnFcZ4TVhB $server→use($throttle);\n #sptEZCs70xCB68CA $server→use(@\\u267b→restify→CORS);\n #mFFPDO74C64OWH8s $server→use(@\\u267b→restify→body_parser);\n #xSqpOmBEP6L2VCFi $server→use(@\\u267b→restify→gzip_response);\n #xR4QGtRsV3hGoSJQ $server→use(@\\u267b→restify→query_parser);\n #x9bNZzJ9tZk0l1Z4 $server→use(@\\u267b→restify→conditional_request);\n #buXcIfKig0apgL4x @\\u267b→restify_touchdevelop→autobind($server);\n #O8e4in6wAR7ZF8Ke code→init_routes;\n #UAx1DGb27XEqkYO5 $server→use(@\\u267b→restify_touchdevelop→errors_to_log(data→logger));\n meta private;\n}\n#KxDl0eU3LpNWTK07 meta import restify {\n pub \"egzra\"\n usage {\n action `async` `type` Request_Handler(req: ♻ restify → Request, res: ♻ restify → Response)\n #xLPhdjOebDT8w77X\n table Throttle_Options {\n type = \"Object\";\n exported = true;\n persistent = false;\n fields {\n #xo6LfV0hyAQtz675 rate : Number\n #yZ2QZAfeW3W74JA1 burst : Number\n #JUlNvDq7Hm9cTUAG ip : Boolean\n #w2h4dcf4I5K5h7kn xff : Boolean\n #RO3Sx6iTt4WsVBm6 username : Boolean\n #VbsYnDvr3t4Xr4VA maxKeys : Number\n #w25h9R5LKJnWiBNu tokensTable : ♻ restify → Tokens_Table\n }\n }\n #xdeuBx505IsZ6eEI\n table Serve_Static_Options {\n type = \"Object\";\n exported = true;\n persistent = false;\n fields {\n #NfWLVJBBbHvtMqkl default : String\n #KvIMj1sEoAwQCf22 maxAge : Number\n }\n }\n #mqEMUbizkEp6naSD\n table CORS_Options {\n type = \"Object\";\n exported = true;\n persistent = false;\n fields {\n #xMYYV6C3eS7PWsfQ origins : String\n #z5HdpFdSi792e1OX credentials : Boolean\n #Fw1D0A9ZfeMCf5c3 headers : String\n }\n }\n #w2zTzWkfMf01yOko\n table Body_Parser_Options {\n type = \"Object\";\n exported = true;\n persistent = false;\n fields {\n #mhaHCLobgUgMrv72 maxBodySize : Number\n #xr4fKleNd4wHHP1l mapParams : Boolean\n #st0ir2vLTxbLTQWB mapFiles : Boolean\n #z5ah2mZWb8c5FmTM overrideParams : Boolean\n }\n }\n #xv4yZciZi2wFoqpM\n table Send_Options {\n type = \"Object\";\n exported = true;\n persistent = false;\n fields {\n #svWYln7UIackFIpB status : Number\n }\n }\n type Request\n type Response\n type Tokens_Table\n type Server\n type Middleware\n type Error\n action `sync` use(server: ♻ restify → Server, mid: ♻ restify → Middleware)\n action `sync` get(server: ♻ restify → Server, path: String, @then: ♻ restify → Request_Handler)\n action `sync` post(server: ♻ restify → Server, path: String, @then: ♻ restify → Request_Handler)\n action `sync` server() returns(server: ♻ restify → Server)\n action `sync` send(res: ♻ restify → Response, content: String, options\\u003f: ♻ restify → Send_Options)\n action `sync` status(res: ♻ restify → Response, status: Number)\n action `sync` is(req: ♻ restify → Request, type: String) returns(r: Boolean)\n action `sync` accepts(req: ♻ restify → Request, types: String) returns(type: String)\n action `sync` put(server: ♻ restify → Server, path: String, @then: ♻ restify → Request_Handler)\n action `sync` del(server: ♻ restify → Server, path: String, @then: ♻ restify → Request_Handler)\n action `sync` head(server: ♻ restify → Server, path: String, @then: ♻ restify → Request_Handler)\n action `sync` pre(server: ♻ restify → Server, mid: ♻ restify → Middleware)\n action `sync` CORS(options\\u003f: ♻ restify → CORS_Options) returns(mid: ♻ restify → Middleware)\n action `sync` conditional_request() returns(mid: ♻ restify → Middleware)\n action `sync` route(server: ♻ restify → Server, method: String, path: String, @then: ♻ restify → Request_Handler)\n action `sync` json(res: ♻ restify → Response, content: Json_Object, options\\u003f: ♻ restify → Send_Options)\n action `sync` next(res: ♻ restify → Response)\n action `sync` next_error(res: ♻ restify → Response, error: ♻ restify → Error)\n action `sync` address(server: ♻ restify → Server) returns(address: String)\n action `sync` gzip_response() returns(mid: ♻ restify → Middleware)\n action `sync` header(req: ♻ restify → Request, name: String) returns(value: String)\n action `sync` is_secure(req: ♻ restify → Request) returns(r: Boolean)\n action `sync` is_chunked(req: ♻ restify → Request) returns(r: Boolean)\n action `sync` is_keep_alive(req: ♻ restify → Request) returns(r: Boolean)\n action `sync` set_header(res: ♻ restify → Response, name: String, value: String)\n action `sync` body_parser(options\\u003f: ♻ restify → Body_Parser_Options) returns(mid: ♻ restify → Middleware)\n action `sync` throttle(options\\u003f: ♻ restify → Throttle_Options) returns(middleware: ♻ restify → Middleware)\n action `sync` date_parser(clock_skew: Number) returns(middleware: ♻ restify → Middleware)\n action `sync` serve_static(directory: String, options\\u003f: ♻ restify → Serve_Static_Options) returns(middleware: ♻ restify → Middleware)\n action `sync` query_parser() returns(middleware: ♻ restify → Middleware)\n action `sync` authorization_parser() returns(middleware: ♻ restify → Middleware)\n action `sync` jsonp() returns(middleware: ♻ restify → Middleware)\n action `sync` body_as_json(req: ♻ restify → Request) returns(body: Json_Object)\n action `sync` id(req: ♻ restify → Request) returns(id: String)\n action `sync` param(req: ♻ restify → Request, name: String) returns(value: String)\n action `sync` opts(server: ♻ restify → Server, path: String, @then: ♻ restify → Request_Handler)\n action `sync` patch(server: ♻ restify → Server, path: String, @then: ♻ restify → Request_Handler)\n action `sync` to_string(ser: ♻ restify → Server) returns(s: String)\n action `sync` sanitize_path() returns(middleware: ♻ restify → Middleware)\n action `sync` body(req: ♻ restify → Request) returns(body: String)\n action `sync` send_error(res: ♻ restify → Response, status: Number, message: String)\n action `sync` all(server: ♻ restify → Server, @then: ♻ restify → Request_Handler)\n action `sync` method(req: ♻ restify → Request) returns(method: String)\n action `sync` url(req: ♻ restify → Request) returns(url: String)\n action `sync` query(req: ♻ restify → Request) returns(query: Json_Object)\n action `sync` redirect(res: ♻ restify → Response, status_code: Number, url: String)\n action `sync` send_status(res: ♻ restify → Response, status_code: Number)\n action `sync` charset(res: ♻ restify → Response, encoding: String)\n action `sync` route_regex(server: ♻ restify → Server, method: String, path_regex: String, @then: ♻ restify → Request_Handler)\n action `async` read_body_as_buffer(req: ♻ restify → Request) returns(body: Buffer)\n action `sync` headers(req: ♻ restify → Request) returns(headers: Json_Object)\n action `sync` server_url(req: ♻ restify → Request) returns(url: String)\n action `sync` html(res: ♻ restify → Response, content: String, options\\u003f: ♻ restify → Send_Options)\n }\n}\n#MLbRHC7j0u4Bo4GQ meta import restify_touchdevelop {\n pub \"dvuhb\"\n usage {\n action `sync` autobind(server: ♻ restify → Server)\n action `sync` errors_to_log(logger: App_Logger) returns(middleware: ♻ restify → Middleware)\n }\n #OzaDw2jYXC1r4oMK resolve restify = ♻ restify with {\n }\n}\n#xHPXd7nOkAZ4A4vr meta import azure_event_hubs {\n pub \"wvdr\"\n usage {\n #qy4yPchAE7AUedlB\n table Options {\n type = \"Object\";\n exported = true;\n persistent = false;\n fields {\n // Name of the event hub\n #BULIHveLGv3xhPGc hub_namespace : String\n // Shared Access Signature token; otherwise the server setting ``AZURE_SERVICEBUS_SAS_TOKEN`` is used.\n #xr7jIhKzmCpq0i5N sas_token : String\n }\n }\n #EyRHf2UILCkoocED\n table Event_Hub {\n type = \"Object\";\n exported = true;\n persistent = false;\n fields {\n #t4VjI1BVPLvcUl22 name : String\n }\n }\n action `sync` init(options\\u003f: ♻ azure_event_hubs → Options)\n action `async` send_message(hub: ♻ azure_event_hubs → Event_Hub, device_id: String, msg: String) returns(status: Number)\n action `async` create_event_hub_if_not_exists(name_: String) returns(hub: ♻ azure_event_hubs → Event_Hub)\n action `async` send_message_as_json(hub: ♻ azure_event_hubs → Event_Hub, device_id: String, msg: Json_Object) returns(status: Number)\n }\n}\n#xcDhCtrxPsQBOdut\naction init_routes() {\n #f2p7glhNykvLLVg0 // TODO: add custom routes here\n #xLyImlUfp28hk6Pb $server := @\\u267b→restify→server;\n #B2Ui2S2BrMhefyH4 $server→get(\"/echo\", $@then);\n #c58sWTLqXwkWaboA where @then(req: ♻ restify → Request, res: ♻ restify → Response) {\n #yXsNFxumA3UsfrbL $res→send($req→body);\n }\n meta private;\n}\n#xZ4HxLh7nvC9Ye4O meta import node_hash {\n pub \"ezbka\"\n usage {\n action `sync` sha256(value: String) returns(digest: String)\n action `sync` sha1(value: String) returns(digest: String)\n }\n #xLAq93oXbklxTC8e resolve node_crypto = ♻ node_crypto with {\n }\n}\n#nXJ5d37Qe8izPDXw meta import node_crypto {\n pub \"ujtrc\"\n usage {\n type credentials\n type hash\n type hmac\n type cipher\n type decipher\n type sign\n type verify\n type DiffieHellman\n action `sync` get_ciphers() returns(ciphers: Collection[String])\n action `sync` get_hashes() returns(hashes: Collection[String])\n action `sync` create_credentials(details: Json_Object) returns(credentials: ♻ node_crypto → credentials)\n action `sync` create_hash(algorithm: String) returns(hash: ♻ node_crypto → hash)\n action `sync` update_hash(hash: ♻ node_crypto → hash, hash_data: Buffer)\n action `sync` digest_hash(hash: ♻ node_crypto → hash) returns(digest: Buffer)\n action `sync` update_hmac(hmac: ♻ node_crypto → hmac, hmac_data: Buffer)\n action `sync` digest_hmac(hmac: ♻ node_crypto → hmac) returns(digest: Buffer)\n action `sync` create_cipher(algorithm: String, password: Buffer) returns(cipher: ♻ node_crypto → cipher)\n action `sync` create_cipher_iv(algorithm: String, key: Buffer, iv: Buffer) returns(iv_cipher: ♻ node_crypto → cipher)\n action `sync` update_cipher(cipher: ♻ node_crypto → cipher, _data: Buffer) returns(enciphered: Buffer)\n action `sync` final(cipher: ♻ node_crypto → cipher) returns(cipher_final: Buffer)\n action `sync` set_auto_padding(cipher: ♻ node_crypto → cipher)\n action `sync` create_decipher(algorithm: String, password: Buffer) returns(decipher: ♻ node_crypto → decipher)\n action `sync` create_decipher_iv(algorithm: String, key: Buffer, iv: Buffer) returns(iv_decipher: ♻ node_crypto → decipher)\n action `sync` update_decipher(decipher: ♻ node_crypto → decipher, _data: Buffer) returns(deciphered: Buffer)\n action `sync` final_(decipher: ♻ node_crypto → decipher) returns(decipher_final: Buffer)\n action `sync` set_auto_padding_(decipher: ♻ node_crypto → decipher)\n action `sync` create_sign(algorithm: String) returns(sign: ♻ node_crypto → sign)\n action `sync` update_sign(sign: ♻ node_crypto → sign, sign\\_data: Buffer)\n action `sync` sign_(sign: ♻ node_crypto → sign, private_key: String) returns(signature: Buffer)\n action `sync` create_verify(algorithm: String) returns(verify: ♻ node_crypto → verify)\n action `sync` update_verify(verify: ♻ node_crypto → verify, verify_data: Buffer)\n action `sync` verify_(verify: ♻ node_crypto → verify, object: String, signature: Buffer) returns(valid: Boolean)\n action `sync` create_DiffieHellman(prime_length: Number) returns(DiffieHellman: ♻ node_crypto → DiffieHellman)\n action `sync` generate_keys(DiffieHellman: ♻ node_crypto → DiffieHellman) returns(public_key: Buffer)\n action `sync` compute_secret(DiffieHellman: ♻ node_crypto → DiffieHellman, other_public_key: Buffer) returns(shared_secret: Buffer)\n action `sync` get_prime(DiffieHellman: ♻ node_crypto → DiffieHellman) returns(DH_prime: Buffer)\n action `sync` get_generator(DiffieHellman: ♻ node_crypto → DiffieHellman) returns(generator: Buffer)\n action `sync` get_public_key(DiffieHellman: ♻ node_crypto → DiffieHellman) returns(public_key: Buffer)\n action `sync` get_private_key(DiffieHellman: ♻ node_crypto → DiffieHellman) returns(private_key: Buffer)\n action `sync` set_public_key(DiffieHellman: ♻ node_crypto → DiffieHellman, public_key: Buffer)\n action `sync` set_private_key(DiffieHellman: ♻ node_crypto → DiffieHellman, private_key: Buffer)\n action `sync` get_DiffieHellman(group_name: String) returns(DiffieHellman: ♻ node_crypto → DiffieHellman)\n action `async` pbkdf2(password: String, salt: String, iterations: Number, keylen: Number) returns(derived_key: String)\n action `async` random_bytes(size: Number) returns(strong_data: Buffer)\n action `sync` DEFAULT\\_ENCODING() returns(default_encoding: String)\n action `sync` create_hmac(algorithm: String, key: String) returns(hmac: ♻ node_crypto → hmac)\n action `sync` create_DiffieHellmanWithPrime(prime: Buffer) returns(DiffieHellman: ♻ node_crypto → DiffieHellman)\n action `async` pseudo_random_bytes(size: Number) returns(non\\u002dstrong_data: Buffer)\n action `sync` update_hash_string(hash: ♻ node_crypto → hash, hash_data: String)\n }\n}\n#xxBeCJozPqG4dvGB meta import application_insights {\n pub \"sjdha\"\n usage {\n #BVGhpbmca\n table Options {\n type = \"Object\";\n exported = true;\n persistent = false;\n fields {\n // Tracks all uncaught exceptions\n #xYM2DFyGKHO12BbR track_uncaught_exceptions : Boolean\n }\n }\n action `sync` init(options\\u003f: ♻ application_insights → Options) returns(active: Boolean)\n action `sync` track_trace(msg: String)\n action `sync` track_event(name: String)\n action `sync` track_metric(name: String, value: Number)\n action `sync` start_track_event(name: String)\n action `sync` stop_track_event(name: String)\n }\n}\n", "oqsm": "meta version \"v2.2,js,ctx,refs,localcloud,unicodemodel,allasync\";\nmeta name \"tutorials\";\nmeta rootId \"xcFXL1vqQbVPFKk2Yc1gTRIF\";\nmeta hasIds \"yes\";\nmeta platform \"current\";\nmeta parentIds \"\";\n// A list of TouchDevelop tutorials. #docs #tutorials\n#main\naction main() {\n #LQQH7W4x4vOr6kcT // {parentTopic:contents}\n #LpknIXykLhvB5YLw // {priority:2}\n #x6WZ72Kym5u8aNuV // {docflags:nochrome}\n #JkpnXEMEJkFS4mnx // # featured\n #xPrDSkOmttZegncR // * {follow:Coding Jetpack Jumper!}\n #xAR2eREH5fGtTotx // * {follow:jumping bird tutorial}\n #yO4n3Tb0o3Or3L55 // * {follow:first steps with turtle}\n #fSp20aGSenwd4bH2 // * {follow:pixel art tutorial}\n #aM13Ksd59pPcP33j // # games\n #iUSpluk0DLK4NtiA // * {follow:monster slicer tutorial}\n #A8cfd633Th1P7kbJ // * {follow:bear quest tutorial}\n #VsZDHY1LOsv3l825 // * {follow:falling rocks tutorial}\n #x93wx6dPRfGXaxdE // * {follow:don't tap the tile tutorial}\n #XP2FMZ7hb7pCZzlE // * {follow:word hunt tutorial}\n #qOTdAJch2sHVC4Av // * {follow:love me not tutorial}\n #kFSt9am2yYoTHMsd // * {follow:sound board tutorial}\n #uWIA0tQivNtloAdi // * {topictile:game tutorials}\n #H7AzZmdb0qZkhNmB // # beginners\n #x5vHrVNhyrmyHfSS // * {follow:turtle ramp up tutorial}\n #avV0BXVrlq8tFqbJ // * {follow:pixels tutorial}\n #ltteGneoeMCOKyfD // * {follow:scratch cat tutorial}\n #IjY2cuHq10NmYN8Z // * {topictile:beginner tutorials}\n #lUIEFAjnBaFp0NYM // # social apps\n #zomIAaVZ03v4R1xB // * {follow:one pic social tutorial}\n #JZPcmj4bsQ6MphyN // * {follow:map of things tutorial}\n #CiNPuZfJcC2VnMKB // * {follow:square poll tutorial}\n #Bg5Sg2zvnzUsxWDD // * {topictile:social app tutorials}\n #mW19SQB7JzUYUDyp // # algorithms\n #wzF2w9H8stNcR8oB // * {follow:quadratic equation solver}\n #HqrHWbJyly22r9vo // * {follow:factorial tutorial}\n #QI6trn3hYBszuzKO // * {topictile:algorithm tutorials}\n #lhDXdp92VSAbLGDI // # code hunt\n #TQJbXgBtfLKPm4eZ // * {follow:code hunt sector 0}\n #UFYGFD7GvVf941uN // * {follow:code hunt sector 1}\n #uyUyccw3k3epD2WP // * {follow:code hunt sector 2}\n #pKVV2nqY2iWOrdrQ // * {topictile:code hunt tutorials}\n #xQcC1JyQ0SbywpYf // # arduino\n #ht2FBDTcOKDiMxuT // * {follow:arduino blink tutorial}\n #xVTW9pO53483xii4 // * {follow:arduino sos tutorial}\n #LB6wN2U8tYxM2xMd // * {topictile:arduino tutorials}\n #KqQQoH1lfiX7GGs9 // # hardware\n #xiePhqB81TDsXU4v // * {follow:makey makey beatbox tutorial}\n #xLaWWHNk2TcRzkXa // * {follow:esplora level tutorial}\n #xF73sSThDYR09wui // * {topictile:hardware tutorials}\n #x7K4ek6efU0P1hOd // **Want to write your own tutorials?** Learn how to [create interactive tutorials](/creatinginteractivetutorials).\n}\n", "owroa": "meta version \"v2.2,js,ctx,refs,localcloud,unicodemodel,allasync\";\nmeta name \"forms\";\nmeta icon \"AlignLeft\";\nmeta color \"#ff9955bb\";\nmeta rootId \"mMuT4ZcDiX4oeiP6z7DBQnLh\";\nmeta isLibrary \"yes\";\nmeta allowExport \"yes\";\nmeta platform \"current\";\n// Basic user interface elements (buttons, text input boxes, check boxes, drop-down menus) used for simple forms.\n#button\naction button(text: String, on_tapped: Action) {\n // Displays a button\n do box {\n box→set_margins(0.5, 0.5, 0.5, 0.5);\n box→set_padding(0.5, 1, 0.5, 1);\n box→set_border(colors→foreground, 0.1);\n box→set_font_size(1.2);\n box→on_tapped($handler);\n where handler() {\n $on_tapped→run;\n }\n do box {\n box→set_horizontal_align(\"center\");\n box→set_vertical_align(\"center\");\n $text→to_lower_case→post_to_wall;\n }\n }\n meta sync;\n}\n#checkbox\naction checkbox(text: String, checked: Ref[Boolean]) {\n // Displays a checkbox\n do box {\n box→use_horizontal_layout;\n box→set_horizontal_align(\"left\");\n box→set_horizontal_stretch(1);\n box→set_margins(0, 0.5, 0.5, 0.5);\n do box {\n box→use_overlay_layout;\n do box {\n box→set_margins(0, 0, 0, 0.2);\n box→set_font_size(2);\n if $checked→\\u25c8get then {\n box→set_foreground(colors→accent);\n }\n else {\n box→set_foreground(colors→transparent);\n }\n \"✓\" →post_to_wall;\n }\n do box {\n box→set_width(1.5);\n box→set_height(1.5);\n box→set_border(colors→foreground, 0.1);\n \"\" →post_to_wall;\n box→on_tapped($handler);\n where handler() {\n $checked→\\u25c8set( not $checked→\\u25c8get);\n }\n }\n }\n do box {\n box→set_margins(0, 0, 0, 0.3);\n $text→post_to_wall;\n }\n }\n meta sync;\n}\n#exampleboolean\nvar example_boolean : Boolean {\n // A variable used in the example page.\n transient = true;\n}\n#examplename\nvar example_name : String {\n // A variable used in the example page.\n transient = true;\n}\n#indentation\naction indentation() returns(x: Number) {\n // returns the default width of the left column\n if code→narrow_screen then {\n $x := 0;\n }\n else {\n $x := 10 + (box→page_width - 40) * .2;\n }\n meta private;\n meta sync;\n}\n#examplecomments\nvar example_comments : String {\n // A variable used in the example page.\n transient = true;\n}\n#exampleemails\nvar example_emails : String_Collection {\n // A variable used in the example page.\n transient = true;\n}\n#examplepassword\nvar example_password : String {\n // A variable used in the example page.\n transient = true;\n}\n#showexample\naction show_example() {\n if box→is_init then {\n if data→example_emails→is_invalid then {\n data→example_emails := collections→create_string_collection;\n }\n data→dropdownchoices := \"Car,Bus,Train,Airplane\" →split(\",\");\n data→example_number_string := data→example_number→to_string;\n }\n if true then {\n // input a string that stays on a single line\n code→input_text_line(\"Name\", data→example_name→\\u25c8ref);\n // input a string that can span multiple lines\n code→input_text_area(\"Comments\", data→example_comments→\\u25c8ref);\n // input a collection of strings (user can add/remove/edit entries)\n code→input_string_collection(\"email addresses\", data→example_emails);\n // input a number\n code→input_number(\"Number\", data→example_number_string→\\u25c8ref, $changehandler);\n where changehandler(x: Number) {\n data→example_number := $x;\n }\n // input a password (characters are hidden)\n code→input_password(\"Password\", data→example_password→\\u25c8ref);\n // input from a dropdown menu\n code→input_choice(\"Transportation\", data→dropdownchoices, data→example_choice→\\u25c8ref);\n // use the \"indented content\" call to achieve consistent indentation\n code→indented_content($content2);\n where content2() {\n // input a boolean, as a checkbox\n code→checkbox(\"send feedback\", data→example_boolean→\\u25c8ref);\n where on_value_change2(boolean: Boolean) {\n data→example_boolean := $boolean;\n }\n }\n // use the \"indented content\" call to achieve consistent indentation\n code→indented_content($content3);\n where content3() {\n // make a button\n code→button(\"Submit\", $tapped);\n where tapped() {\n wall→prompt(\"Submit Button Tapped\");\n }\n }\n }\n meta private;\n meta page;\n meta sync;\n}\n#inputstringcollectio\naction input_string_collection(label: String, strings: String_Collection) {\n code→labeled_content($label, $content);\n where content() {\n do box {\n box→set_margins(0, 0, 0.2, 0);\n if $strings→count > 0 then {\n for 0 ≤ i < $strings→count do {\n do box {\n box→use_horizontal_layout;\n do box {\n box→set_border(colors→black, 0.1);\n box→set_margins(0.2, 0, 0.2, 0);\n box→set_horizontal_stretch(1);\n box→edit(\"textline\", $strings→at($i), $changehandler);\n where changehandler(text: String) {\n $strings→set_at($i, $text);\n }\n }\n do box {\n code→small_button(.5, \"(remove)\", $@action);\n where @action() {\n $strings→remove_at($i);\n }\n }\n }\n }\n }\n do box {\n code→small_button(0, \"(add)\", $@action);\n where @action() {\n $strings→add(\"\");\n }\n }\n }\n }\n meta sync;\n}\n#inputtextline\naction input_text_line(label: String, text: Ref[String]) {\n code→labeled_content($label, $content);\n where content() {\n do box {\n box→set_border(colors→foreground, .1);\n box→edit(\"textline\", $text→\\u25c8get, $changehandler);\n where changehandler(t: String) {\n $text→\\u25c8set($t);\n }\n box→set_margins(0.2, 0.5, 0.2, 0);\n box→set_horizontal_stretch(1);\n }\n }\n meta sync;\n}\n#smallbutton\naction small_button(side_margins: Number, s: String, @action: Action) {\n do box {\n if $side_margins ≠ 0 then {\n box→set_vertical_align(\"top\");\n }\n box→set_horizontal_align(\"center\");\n box→set_margins(0.2, $side_margins, 0, $side_margins);\n box→set_padding(0.2, 0, 0.2, 0);\n box→on_tapped($@action);\n $s→post_to_wall;\n }\n meta private;\n meta sync;\n}\n#inputtextarea\naction input_text_area(label: String, text: Ref[String]) {\n code→labeled_content($label, $content);\n where content() {\n do box {\n box→set_border(colors→foreground, .1);\n box→edit(\"textarea\", $text→\\u25c8get, $changehandler);\n where changehandler(t: String) {\n $text→\\u25c8set($t);\n }\n box→set_margins(0.2, 0.5, 0.2, 0);\n box→set_height_range(3, math→\\u221e\\u208a);\n box→set_horizontal_stretch(1);\n }\n }\n meta sync;\n}\n#inputpassword\naction input_password(label: String, password: Ref[String]) {\n code→labeled_content($label, $content);\n where content() {\n do box {\n box→set_border(colors→foreground, .1);\n box→edit(\"password\", $password→\\u25c8get, $changehandler);\n where changehandler(text: String) {\n $password→\\u25c8set($text);\n }\n box→set_margins(0.2, 0.5, 0.2, 0);\n box→set_horizontal_stretch(1);\n }\n }\n meta sync;\n}\n#inputnumber\naction input_number(label: String, text: Ref[String], changehandler: Number_Action) {\n code→input_text_line_w\\u002f_validator($label, $text, $errorcheck, $changed);\n where errorcheck(s: String) returns (error: String) {\n $x := $s→to_number;\n if $x→is_invalid then {\n $error := \"please enter a valid number.\";\n }\n else {\n $error := \"\";\n }\n }\n where changed(t: String) {\n $changehandler→run($t→to_number);\n }\n meta sync;\n}\n#example\naction example() {\n // This library allows to create form elements such as buttons, text boxes, checkboxes, or drop-down menus.\n // * input a string in a text box (single line)\n code→input_text_line(\"Name\", data→example_name→\\u25c8ref);\n // * input a string in a text box (multiple lines)\n code→input_text_area(\"Comments\", data→example_comments→\\u25c8ref);\n // * input a collection of strings (user can add/remove/edit entries)\n code→input_string_collection(\"email addresses\", data→example_emails);\n // * input a password in a text box (characters are hidden)\n code→input_password(\"Password\", data→example_password→\\u25c8ref);\n // * input a boolean, as a checkbox\n code→checkbox(\"send feedback\", data→example_boolean→\\u25c8ref);\n // * make a button\n code→button(\"Submit\", $tapped);\n where tapped() {\n wall→prompt(\"Submit Button Tapped\");\n }\n // * choose from a dropdown menu\n code→input_choice(\"Transportation\", data→dropdownchoices, data→example_choice→\\u25c8ref);\n meta private;\n meta sync;\n}\n#narrowscreen\naction narrow_screen() returns(b: Boolean) {\n $b := box→page_width < 35;\n meta private;\n meta sync;\n}\n#labeledcontent\naction labeled_content(label: String, content: display_code) {\n // For displaying labeled content, with the same indentation as other form elements. If the label is the empty string, the item is displayed without indentation.\n if not $label→is_invalid and not $label→equals(\"\") then {\n do box {\n box→set_horizontal_stretch(1);\n box→set_horizontal_align(\"left\");\n if code→narrow_screen then {\n box→use_vertical_layout;\n box→set_margins(0.35, 0, 0, 0);\n }\n else {\n box→use_horizontal_layout;\n }\n $indent := code→indentation;\n do box {\n $label→post_to_wall;\n $pw := box→page_width;\n box→set_horizontal_stretch($indent / ($pw - .7));\n box→set_horizontal_align(\"right\");\n box→set_margins(0.2, 0, 0.2, 0.5);\n }\n do box {\n if box→page_width < 40 then {\n box→set_width_range(10, box→page_width - $indent);\n box→set_horizontal_stretch(1);\n }\n else {\n box→set_horizontal_stretch(0);\n box→set_width_range(20, box→page_width - $indent);\n }\n do box {\n box→set_padding(0, 0.5, 0, 0.5);\n $content→run;\n }\n }\n }\n }\n else {\n code→normal_content($content);\n }\n meta sync;\n}\n#indentedcontent\naction indented_content(content: display_code) {\n // Display content with the same indentation as other form elements.\n if code→narrow_screen then {\n code→normal_content($content);\n }\n else {\n code→labeled_content(\" \", $content);\n }\n meta sync;\n}\n#normalcontent\naction normal_content(content: display_code) {\n do box {\n if box→page_width < 40 then {\n box→set_width_range(10, box→page_width);\n box→set_horizontal_stretch(1);\n }\n else {\n box→set_horizontal_stretch(0);\n box→set_width_range(20, box→page_width);\n }\n do box {\n box→set_padding(0, 0.5, 0, 0.5);\n $content→run;\n }\n }\n meta private;\n meta sync;\n}\n#w4wvvOyYMGH8M1GFkNzq9U37\naction `type` display_code() {\n skip;\n meta sync;\n}\n#JFIbi283vQ4hKSeSDgSFD1mR\naction input_choice(label: String, choices: String_Collection, index: Ref[Number]) {\n // Input a choice from a dropdown menu.\n code→labeled_content($label, $content);\n where content() {\n $current := \"\";\n if not $index→\\u25c8get→is_invalid and $index→\\u25c8get ≥ 0 and $index→\\u25c8get < $choices→count then {\n $current := $choices→at($index→\\u25c8get);\n }\n if $current→is_invalid or $current→equals(\"\") then {\n $current := \" \";\n }\n do box {\n box→set_margins(0.2, 0.5, 0.2, 0.5);\n box→set_padding(0.3, 1, 0.3, 1);\n box→set_border(colors→foreground, 0.1);\n box→on_tapped($handler);\n where handler() {\n $x := wall→pick_string($label, \"\", $choices);\n if $x ≥ 0 then {\n $index→\\u25c8set($x);\n }\n }\n do box {\n box→set_horizontal_align(\"center\");\n $current→post_to_wall;\n }\n }\n }\n meta sync;\n}\n#Mb4wOugItC8WuhV4FzURCsdU\nvar dropdownchoices : String_Collection {\n transient = true;\n}\n#CwT0X1vsa9H4HZJxEErdw2z6\nvar example_choice : Number {\n transient = true;\n}\n#oWu4bWFVWgG65r4Hrh69VnB3\naction input_text_line_w\\u002f_validator(label: String, text: Ref[String], errorcheck: validator, changehandler: Text_Action) {\n code→labeled_content($label, $content);\n where content() {\n do box {\n $error := $errorcheck→run($text→\\u25c8get);\n do box {\n box→set_border(colors→foreground, .1);\n box→edit(\"textline\", $text→\\u25c8get, $changed);\n where changed(t: String) {\n $text→\\u25c8set($t);\n if $errorcheck→run($t)→is_empty then {\n $changehandler→run($t);\n }\n }\n box→set_margins(0.2, 0.5, 0.2, 0);\n box→set_horizontal_stretch(1);\n }\n if not $error→is_empty then {\n box→set_foreground(colors→red);\n (\"⇧ \" ∥ $error)→post_to_wall;\n }\n }\n }\n meta sync;\n}\n#XPzkmnAHw2YfZd8ERHYp0i1a\naction `type` validator(s: String) returns(error: String) {\n skip;\n meta sync;\n}\n#h9fnSKl9lC2Y2ipmhRWNzOhy\nvar example_number : Number {\n transient = true;\n}\n#obyaxW4FDptTluW9lt69d7Zg\nvar example_number_string : String {\n transient = true;\n}\n", @@ -39,7 +37,9 @@ "szzdc": "meta version \"v2.2,js,ctx,refs,localcloud,unicodemodel,allasync,upperplex\";\nmeta name \"blank arduino\";\nmeta icon \"ArrowStandardCircle\";\nmeta color \"#ff00cc99\";\nmeta rootId \"xkbt9ErH776FGA72sWuqxeOz\";\nmeta iconArtId \"kzajxznr\";\nmeta allowExport \"yes\";\nmeta hasIds \"yes\";\nmeta platform \"current\";\nmeta parentIds \"\";\n// An Arduino sketch. #arduino #arduinoSketch\n#KUJMn0ag6zrqQys9\naction setup() {\n #qWODTg5ZnR95PTeF @\\u267b→arduino→pin_mode(13, @\\u267b→arduino→OUTPUT);\n meta private;\n}\n#UzRPACG9RBTCLU2MkuwLAhpD\naction loop() {\n #x5bamvNg9UVXaFY7 @\\u267b→arduino→digital_write(13, @\\u267b→arduino→HIGH);\n #UybvnpQJqqrqtrnH @\\u267b→arduino→delay(200);\n #xqXPRRCVUKc8rCTO @\\u267b→arduino→digital_write(13, @\\u267b→arduino→LOW);\n #um2lxP36WxO2OgOk @\\u267b→arduino→delay(200);\n meta private;\n}\n#iHY2wlj4qcvFdTHc meta import arduino {\n pub \"cqfda\"\n usage {\n action `sync` digital_read(pin: Number) returns(bit: Number)\n action `sync` digital_write(pin: Number, value: Number)\n action `sync` analog_read(pin: Number) returns(bit: Number)\n action `sync` analog_write(pin: Number, value: Number)\n action `async` pin_mode(pin: Number, mode: Number)\n action `sync` HIGH() returns(v: Number)\n action `sync` LOW() returns(v: Number)\n action `sync` OUTPUT() returns(v: Number)\n action `sync` INPUT() returns(v: Number)\n action `async` delay(millis: Number)\n action `sync` sketch(source: String)\n action `sync` static_buffer(bytes: String) returns(buf: Buffer)\n action `sync` INPUT\\_PULLUP() returns(v: Number)\n action `sync` LED\\_BUILTIN() returns(r: Number)\n action `sync` mac(address: String)\n action `sync` analog_reference(type: Number)\n action `sync` DEFAULT() returns(r: Number)\n action `sync` EXTERNAL() returns(r: Number)\n action `sync` tone(pin: Number, frequency: Number, duration: Number)\n action `sync` no_tone(pin: Number)\n action `sync` millis() returns(millis: Number)\n action `sync` micros() returns(micros: Number)\n action `sync` pulse_in(pin: Number, value: Number, timeout: Number) returns(micros: Number)\n action `sync` board(name: String)\n action `sync` print_value(name: String, value: Number)\n action `sync` print(text: String)\n action `sync` println(text: String)\n action `sync` map(value: Number, from_low: Number, from_high: Number, to_low: Number, to_high: Number) returns(r: Number)\n action `sync` constrain(value: Number, a: Number, b: Number) returns(r: Number)\n action `async` delay_microseconds(micros: Number)\n }\n}\n#xJTsvVkdQIFOcF0fRDHFLPLk\naction variables() {\n #xaFPmIVW8ylv5b9P // Initializes your global variables here.\n meta private;\n}\n#CvN1nxjx0F41jAPT meta import serial {\n pub \"kzkua\"\n usage {\n action `sync` read() returns(byte: Number)\n action `sync` available() returns(bytes: Number)\n action `sync` peek() returns(byte: Number)\n action `sync` print(msg: String)\n action `sync` println(msg: String)\n action `sync` write(byte: Number)\n }\n #ojn444WfORgPYrSW resolve arduino = ♻ arduino with {\n }\n}\n", "tiwt": "meta version \"v2.2,js,ctx,refs,localcloud,unicodemodel,allasync\";\nmeta name \"blank script plugin\";\nmeta icon \"Brush\";\nmeta color \"#ffe3256b\";\nmeta rootId \"B1BBU2S1UsnHiEXWlTqkabme\";\nmeta allowExport \"yes\";\nmeta hasIds \"yes\";\nmeta platform \"current,editoronly\";\nmeta parentIds \"\";\n// A TouchDevelop plugin. #scriptPlugin #buttonPlugin\n#gYzBYlK5jAx3Qfv9\naction do_stuff(#fK8mH7TfckAPC9Ui editor: Editor) {\n #dFvzotTJtIW2DkOD code→init_log;\n #x1Y6B2xJRSkIezBw // TODO: this action gets called by the editor!\n}\n#YCEitfuBjl2PqD4f meta import ast {\n pub \"njle\"\n usage {\n action `async` `type` update_node(type: String, node: Json_Builder)\n action `async` update_nodes(ast: Json_Builder, update: ♻ ast → update_node)\n action `async` update_script(id: String, update: ♻ ast → update_node)\n action `async` test_plugin(plugin: Text_Action)\n action `sync` find_decl(@script: Json_Builder, name: String) returns(decl: Json_Builder)\n }\n}\n#xUKJA4AiahTHnwv2\nvar logger : App_Logger {\n transient = true;\n}\n#PNnxmlnhF0t47I8b\naction init_log() {\n #QliVR9SuYlA9GDox if data→logger→is_invalid then {\n #tE4d3cGdvoaUcNRY data→logger := app→create_logger(\"plugin\");\n }\n meta private;\n meta sync;\n}\n", "utqwa": "meta version \"v2.2,js,ctx,refs,localcloud,unicodemodel,allasync\";\nmeta name \"language\";\nmeta rootId \"xNNYZSbsMsmUVW3hCWRiTfLg\";\nmeta hasIds \"yes\";\nmeta platform \"current\";\nmeta parentIds \"\";\n// Language syntax. #docs #language\n#main\naction main() {\n #nb4CHA53bkLnp177 // {parentTopic:contents}\n #xksr0QSkw2CcGDsA // {priority:20}\n #QVGutM59qm90cWT6 // The language used in TouchDevelop is a scripty language designed for mobile touch screens.\n #YXtUjZDsrELBt0UG // ### script ingredients\n #xkVhY3xIAh4V7pBq // A script contains all the assets that define an app in TouchDevelop.\n #RHCVqjPUb8Np2MQZ // * [](/code)\n #ABeKPb4ps01sDihS // * [](/events)\n #ku9Q5d89i7hMMxjV // * [](/data)\n #ccme6EgMV4JFdwDu // * [](/art)\n #x7dsK3Fm8wLNpvmh // * [](/records)\n #mGh2QhODjHx8wo6O // * [](/pages)\n #T2tAFXdtdGiAZtYS // * [](/libraries)\n #rlZee7R2av4AuDNk // * [action types](/actiontypes)\n #ueq2d0Ob9YpPC4Z5 // * [cloud data](/cloudsessions)\n #D2UrRuXynuBZFwbG // * [persistent data](/persistentdata)\n #J9GaECB3TwEch6n0 // ### code\n #FYHRMyX72ne4FsHL // The following statements are supported by the TouchDevelop language.\n #xOY6HaDGj7R3a6xd // * basic data types: [](/Number), [](/Boolean), [](/String)\n #ki3gLv4ChlKWKuWe // * straight-line [](/commands)\n #x4fYnOsHU6cjdf46 // * [](/operators)\n #B8wZ8WdXi43jsRdU // * [](/var)\n #uw58aM4s0LGJnSd0 // * [](/if)\n #FBCHh8dHvVIKyB5a // * [](/for)\n #jxWMQRmr4K1bYrZ2 // * [for each](/foreach), [where](/where)\n #c9P484EQ4fAcG7ya // * [](/while)\n #DTktcH0EOqQfT0un // * [](/invalid)\n #KSF57iPUg4OyWhuz // * [](/comment)\n #xMdFaKmbfv7LXjuP // * [](/boxed)\n #RD9QKM4T7ODoMv1G // * [](/ref)\n #Gm4gR8MYoGfH2xl0 // * [async](/asyncactions)\n #Gm4gR8MYoGfH2xl0 // * [inline actions](/inlineactions)\n #Pw2hFORG6ljqw21n // * [extension actions](/extensionactions)\n #FhhCfW53SoBn2DFp // ### user interface\n #xHNe5HvYKNjmaLSh // Support to display values, get user input and sensor data, or create complex user interfaces.\n #sXtk9VktJMfBnvxB // * [user input](/userinput)\n #dyobbxJUUbaB7uMX // * [sensors and touch events](/sensorsanduserinput)\n #x6jX4IIXG2ZHO2fa // * [pages](/pages)\n #G2S1PHtM0JDBnDBf // * [](/wall)\n #xLsOhd7UY4k0i9m3 // * [game board](/gameboard)\n}\n", +"wkbbc": "meta version \"v2.2,js,ctx,refs,localcloud,unicodemodel,allasync,upperplex\";\nmeta name \"blank minecraft pi\";\nmeta color \"#ffffffff\";\nmeta rootId \"UqtPMmqsRpLtBLICK3xNRKmo\";\nmeta iconArtId \"eopyzwpm\";\nmeta allowExport \"yes\";\nmeta hasIds \"yes\";\nmeta splitScreen \"yes\";\nmeta platform \"current\";\nmeta parentIds \"\";\n// A empty Minecraft Pi script #minecraft\n#ALKdKR1Vv5Af8ary\naction main() {\n #SR5dzqJdsXnD9Px1 @\\u267b→minecraft_pi→forever;\n #Xy4Nv7JZuntRGG5a where `implicit` \\_body\\_() {\n #EzGPnaeUNsf2lJo0 $p := @\\u267b→minecraft_pi→player_→position;\n #Hs2flgMuxizo1bcw @\\u267b→minecraft_pi→set_block($p→x, $p→y, $p→z, \"flower yellow\");\n }\n}\n#RS84xqQ2A0m7aXh1 meta import minecraft_pi {\n pub \"wkyma\"\n usage {\n #BVGhpbmca\n table Block_Options {\n type = \"Object\";\n exported = true;\n persistent = false;\n fields {\n #xNQF2IfWS5kUTCuC state : Number\n // Specifies the color or the id of the whool\n #xUNtn4WzFNh0J275 wool : String\n }\n }\n #xIIDIryL3GdLzzFH\n table Connect_Options {\n type = \"Object\";\n exported = true;\n persistent = false;\n fields {\n #IhKVKMjdA949jNr3 host : String\n #PQgsvjixlAlu49Bw port : Number\n #nlMXsJlluWZB1fNN proxy : String\n }\n }\n #umgRs0Idq3y9jRyc\n table Block_Event {\n type = \"Object\";\n exported = true;\n persistent = false;\n fields {\n #SCV1txxxrjigP8XC kind : String\n #UIy6UFvY6WJWDDoA x : Number\n #wWASeEjKJDoiqrL2 y : Number\n #MkoIqcTcP3QiIoot z : Number\n #kYCW4sVB0Q5jQy0Q face : Number\n #EayHvTpmMjNF3Sfh entity : ♻ minecraft_pi → Entity\n }\n }\n #pqaWOjEWNqEkbxwJ\n table Position {\n type = \"Object\";\n exported = true;\n persistent = false;\n fields {\n #L4NO4JXo2Sev2b1J x : Number\n #x2UU2Lt4BiV8NNNz y : Number\n #gw4VDwinZ6yVcwzL z : Number\n }\n }\n #eVDb6TwJ7CKitS8g\n table Repeat_Options {\n type = \"Object\";\n exported = true;\n persistent = false;\n fields {\n // Delay in seconds between execution\n #VB0iDf9EazabCCQM delay : Number\n }\n }\n type Entity\n action `async` connect(options\\u003f: ♻ minecraft_pi → Connect_Options)\n action `async` set_block(x: Number, y: Number, z: Number, name: String, options\\u003f: ♻ minecraft_pi → Block_Options)\n action `async` set_many_blocks(x: Number, y: Number, z: Number, x2: Number, y2: Number, z2: Number, name: String, options\\u003f: ♻ minecraft_pi → Block_Options)\n action `async` block(x: Number, y: Number, z: Number) returns(name: String)\n action `async` height(x: Number, z: Number) returns(h: Number)\n action `async` chat(msg: String)\n action `async` position(entity: ♻ minecraft_pi → Entity) returns(pos: ♻ minecraft_pi → Position)\n action `async` set_position(entity: ♻ minecraft_pi → Entity, x: Number, y: Number, z: Number)\n action `sync` is_connected() returns(r: Boolean)\n action `async` player_() returns(p: ♻ minecraft_pi → Entity)\n action `async` direction(entity: ♻ minecraft_pi → Entity) returns(d: Number)\n action `async` rotation(entity: ♻ minecraft_pi → Entity) returns(d: Number)\n action `async` pitch(entity: ♻ minecraft_pi → Entity) returns(d: Number)\n action `async` player_by_name(name: String) returns(steve: ♻ minecraft_pi → Entity)\n action `sync` block_names() returns(names: Collection[String])\n action `async` forever(body: Action, options\\u003f: ♻ minecraft_pi → Repeat_Options) returns(t: Timer)\n action `sync` wool_colors() returns(cs: Collection[Color])\n action `sync` wool_color(c: Color) returns(name: String)\n action `async` spawn(kind: String, x: Number, y: Number, z: Number) returns(mob: ♻ minecraft_pi → Entity)\n action `async` test_spawn()\n }\n #JAyRPDtARRsry6w2 resolve shell = ♻ shell with {\n }\n}\n#eM2G2nbehvbb7nDd meta import shell {\n pub \"qmzn\"\n usage {\n #BdGhpbmca\n table Exec_Output {\n type = \"Object\";\n exported = true;\n persistent = false;\n fields {\n #YaaLgMz45N5ZuAeU success : Boolean\n #qrwQiGIhHhUhb8AF error : String\n #ijyQCE4KPQL2ziZD code : Number\n #wf4AkGfhLyWkyKhQ stdout : String\n #ZyLfqXXM99R1znCa stderr : String\n }\n }\n #ttC12C2SJrh1ODjl\n table Serial_Options {\n type = \"Object\";\n exported = true;\n persistent = false;\n fields {\n #wXa4BRcG6mdxKU25 delimiter : String\n }\n }\n type Command_Result\n type Shell_Socket\n action `async` write_file(path: String, content: String) returns(res: ♻ shell → Command_Result)\n action `sync` mkpath(folder: String, name: String) returns(path: String)\n action `async` mkdir(path: String) returns(res: ♻ shell → Command_Result)\n action `async` exec(cmd: String, cwd: String) returns(res: ♻ shell → Exec_Output)\n action `sync` logger() returns(logger: App_Logger)\n action `async` exec_file(cmd: String, args: Collection[String], cwd: String) returns(res: ♻ shell → Exec_Output)\n action `async` python_env() returns(res: ♻ shell → Command_Result)\n action `async` tcp_connect(host: String, port: Number) returns(sock: ♻ shell → Shell_Socket)\n action `async` receive(sock: ♻ shell → Shell_Socket) returns(netdata: String)\n action `async` send(sock: ♻ shell → Shell_Socket, netdata: String)\n action `async` close(sock: ♻ shell → Shell_Socket)\n action `async` serialport_connect(name: String, options\\u003f: ♻ shell → Serial_Options) returns(sock: ♻ shell → Shell_Socket)\n action `async` serial_list() returns(ports: Json_Object)\n }\n}\n", "wonx": "meta version \"v2.2,js,ctx,refs,localcloud,unicodemodel,allasync\";\nmeta name \"blank tutorial\";\nmeta icon \"Erase\";\nmeta rootId \"H4TKg7Y9ZIPwaE5mv9KlRcjO\";\nmeta allowExport \"yes\";\nmeta platform \"current\";\n// TODO: the description of the tutorial. #docs #tutorials #stepByStep\n#main\naction main() {\n // {template:empty}\n // {templatename:ADJ app}\n // TODO This is the initial screen of the tutorial. Change this description and the template name.\n}\n#wWW6zPLClAxV8Yi341qmQqil\naction \\u00230_main() {\n // This is a tutorial step description which should be followed by the code.\n // TODO change the steps to create your tutorial\n // Learn more about the [Markdown syntax](/markdown) and [interactive tutorials](/creatinginteractivetutorials).\n // {stcode}\n \"Hello\" →post_to_wall;\n // {stcmd:run:this is how you run the code}\n // You can add many steps\n // {stcode}\n for 0 ≤ i < 4 do {\n // The steps are split using a depth-first-search strategy.\n \"Hello Again\" →post_to_wall;\n // {stcmd:run:this is how you run the code}\n }\n}\n", +"wuym": "meta version \"v2.2,js,ctx,refs,localcloud,unicodemodel,allasync,upperplex\";\nmeta name \"blank creeper\";\nmeta color \"#ffffffff\";\nmeta rootId \"nHs55hVQebfHsdRXLqdn6Z3u\";\nmeta iconArtId \"yapqobto\";\nmeta allowExport \"yes\";\nmeta hasIds \"yes\";\nmeta splitScreen \"yes\";\nmeta platform \"accelerometer,location,musicandsounds,network,orientation,shell\";\nmeta parentIds \"\";\n// Move the creeper to create cool structures! #minecraft #turtle\n#ew46jSsSq5jX27bx\naction main() {\n #C5Nw6Q63PHrMOwzg @\\u267b→creeper→change_block(\"tnt\");\n #GntZkP8LuGenbICm for 0 ≤ i < 50 do {\n #PP9GM4o5xyjrF9bc @\\u267b→creeper→move_forward(5);\n #x17oHSx7q2zlZQpM @\\u267b→creeper→turn_left(90);\n }\n}\n#xR6s6mYuzEJtyC5s meta import creeper {\n pub \"mweic\"\n usage {\n\n action `async` move_forward(blocks: Number)\n action `async` turn_left(angle: Number)\n action `async` turn_right(angle: Number)\n action `async` move_back(blocks: Number)\n action `async` change_block(name: String)\n action `async` fly_down(blocks: Number)\n action `async` fly_up(blocks: Number)\n action `async` position() returns(x: Number, z: Number)\n action `async` fly_mode()\n action `async` build_cube(sides: Number)\n action `async` build_tower(sides: Number, height: Number)\n action `async` wipe_out()\n action `async` mine(blocks: Number)\n action `async` ground_height() returns(y: Number)\n action `async` walk_mode()\n action `async` dig_mode()\n action `async` block() returns(kind: String)\n action `async` chat(msg: String)\n action `async` add_checkpoint(id: String)\n action `async` go_to_checkpoint(id: String)\n action `async` build_walls()\n action `async` change_wool(c: Color)\n }\n #KPY1Rfzw7rV7Izwk resolve turtle = ♻ turtle with {\n }\n #DJbj9C2UAZDCLBUO resolve minecraft_pi = ♻ minecraft_pi with {\n }\n #pPo0v92e4eOZlpfs resolve shell = ♻ shell with {\n }\n}\n#xuKTJPM232PU6f4b meta import turtle {\n pub \"wtmsc\"\n usage {\n type Maze\n\n action `async` pen_down()\n action `async` pen_up()\n action `async` move_to(x: Number, y: Number)\n action `async` forward(steps: Number)\n action `async` left_turn(angle: Number)\n action `async` set_pen_color(c: Color)\n action `async` xcor() returns(x: Number)\n action `async` ycor() returns(y: Number)\n action `async` heading() returns(a: Number)\n action `async` world_width() returns(w: Number)\n action `async` world_height() returns(h: Number)\n action `async` set_heading(angle: Number)\n action `async` set_pen_size(thickness: Number)\n action `async` right_turn(angle: Number)\n action `async` circle(radius: Number)\n action `async` world_board() returns(board: Board)\n action `async` turn_to(dx: Number, dy: Number)\n action `async` world_picture() returns(pic: Picture)\n action `async` set_speed(steps_per_second: Number)\n action `async` go_home()\n action `async` back(steps: Number)\n action `async` pen_size() returns(size: Number)\n action `async` clean()\n action `async` clear_screen()\n action `async` speed() returns(v: Number)\n action `async` set_xy(xcor: Number, ycor: Number)\n action `async` set_x(xcor: Number)\n action `async` set_y(ycor: Number)\n action `async` pen_color() returns(c: Color)\n action `async` color_under() returns(c: Color)\n action `async` save_picture()\n action `async` xy() returns(x: Number, y: Number)\n action `async` touch_xy() returns(tx: Number, ty: Number)\n action `async` show_grid()\n action `async` fast()\n action `async` stamp()\n action `async` set_turtle_picture(pic: Picture)\n action `async` set_turtle_opacity(opacity: Number)\n action `async` trail()\n action `async` add_obstacle(maze: ♻ turtle → Maze, x: Number, y: Number, width: Number, height: Number, c: Color)\n action `async` set_goal(maze: ♻ turtle → Maze, x: Number, y: Number, radius: Number, c: Color)\n action `async` maze() returns(maze: ♻ turtle → Maze)\n action `async` lock(maze: ♻ turtle → Maze)\n action `async` history() returns(commands: String)\n action `async` clear_history()\n action `sync` on_command(command: Text_Action)\n action `async` add_way_point(maze: ♻ turtle → Maze)\n action `async` on_collision(maze: ♻ turtle → Maze, collision: Action)\n action `async` interactive()\n action `async` on_move(@action: Action)\n action `async` set_raster(value: Boolean)\n }\n}\n#pcCeBmMJD4iCAp7S meta import minecraft_pi {\n pub \"wkyma\"\n usage {\n #BVGhpbmca\n table Block_Options {\n type = \"Object\";\n exported = true;\n persistent = false;\n fields {\n #xNQF2IfWS5kUTCuC state : Number\n // Specifies the color or the id of the whool\n #xUNtn4WzFNh0J275 wool : String\n }\n }\n #xIIDIryL3GdLzzFH\n table Connect_Options {\n type = \"Object\";\n exported = true;\n persistent = false;\n fields {\n #IhKVKMjdA949jNr3 host : String\n #PQgsvjixlAlu49Bw port : Number\n #nlMXsJlluWZB1fNN proxy : String\n }\n }\n type Entity\n #umgRs0Idq3y9jRyc\n table Block_Event {\n type = \"Object\";\n exported = true;\n persistent = false;\n fields {\n #SCV1txxxrjigP8XC kind : String\n #UIy6UFvY6WJWDDoA x : Number\n #wWASeEjKJDoiqrL2 y : Number\n #MkoIqcTcP3QiIoot z : Number\n #kYCW4sVB0Q5jQy0Q face : Number\n #EayHvTpmMjNF3Sfh entity : ♻ minecraft_pi → Entity\n }\n }\n #pqaWOjEWNqEkbxwJ\n table Position {\n type = \"Object\";\n exported = true;\n persistent = false;\n fields {\n #L4NO4JXo2Sev2b1J x : Number\n #x2UU2Lt4BiV8NNNz y : Number\n #gw4VDwinZ6yVcwzL z : Number\n }\n }\n #eVDb6TwJ7CKitS8g\n table Repeat_Options {\n type = \"Object\";\n exported = true;\n persistent = false;\n fields {\n // Delay in seconds between execution\n #VB0iDf9EazabCCQM delay : Number\n }\n }\n\n action `async` connect(options\\u003f: ♻ minecraft_pi → Connect_Options)\n action `async` set_block(x: Number, y: Number, z: Number, name: String, options\\u003f: ♻ minecraft_pi → Block_Options)\n action `async` set_many_blocks(x: Number, y: Number, z: Number, x2: Number, y2: Number, z2: Number, name: String, options\\u003f: ♻ minecraft_pi → Block_Options)\n action `async` block(x: Number, y: Number, z: Number) returns(name: String)\n action `async` height(x: Number, z: Number) returns(h: Number)\n action `async` chat(msg: String)\n action `async` position(entity: ♻ minecraft_pi → Entity) returns(pos: ♻ minecraft_pi → Position)\n action `async` set_position(entity: ♻ minecraft_pi → Entity, x: Number, y: Number, z: Number)\n action `sync` is_connected() returns(r: Boolean)\n action `async` player_() returns(p: ♻ minecraft_pi → Entity)\n action `async` direction(entity: ♻ minecraft_pi → Entity) returns(d: Number)\n action `async` rotation(entity: ♻ minecraft_pi → Entity) returns(d: Number)\n action `async` pitch(entity: ♻ minecraft_pi → Entity) returns(d: Number)\n action `async` player_by_name(name: String) returns(steve: ♻ minecraft_pi → Entity)\n action `sync` block_names() returns(names: Collection[String])\n action `async` forever(body: Action, options\\u003f: ♻ minecraft_pi → Repeat_Options) returns(t: Timer)\n action `sync` wool_colors() returns(cs: Collection[Color])\n action `sync` wool_color(c: Color) returns(name: String)\n action `async` spawn(kind: String, x: Number, y: Number, z: Number) returns(mob: ♻ minecraft_pi → Entity)\n action `async` test_spawn()\n }\n #RzsDYSGMRUQyuUb1 resolve shell = ♻ shell with {\n }\n}\n#xrf8yyBo7axaAgOD meta import shell {\n pub \"qmzn\"\n usage {\n #BdGhpbmca\n table Exec_Output {\n type = \"Object\";\n exported = true;\n persistent = false;\n fields {\n #YaaLgMz45N5ZuAeU success : Boolean\n #qrwQiGIhHhUhb8AF error : String\n #ijyQCE4KPQL2ziZD code : Number\n #wf4AkGfhLyWkyKhQ stdout : String\n #ZyLfqXXM99R1znCa stderr : String\n }\n }\n #ttC12C2SJrh1ODjl\n table Serial_Options {\n type = \"Object\";\n exported = true;\n persistent = false;\n fields {\n #wXa4BRcG6mdxKU25 delimiter : String\n }\n }\n type Command_Result\n type Shell_Socket\n\n action `async` write_file(path: String, content: String) returns(res: ♻ shell → Command_Result)\n action `sync` mkpath(folder: String, name: String) returns(path: String)\n action `async` mkdir(path: String) returns(res: ♻ shell → Command_Result)\n action `async` exec(cmd: String, cwd: String) returns(res: ♻ shell → Exec_Output)\n action `sync` logger() returns(logger: App_Logger)\n action `async` exec_file(cmd: String, args: Collection[String], cwd: String) returns(res: ♻ shell → Exec_Output)\n action `async` python_env() returns(res: ♻ shell → Command_Result)\n action `async` tcp_connect(host: String, port: Number) returns(sock: ♻ shell → Shell_Socket)\n action `async` receive(sock: ♻ shell → Shell_Socket) returns(netdata: String)\n action `async` send(sock: ♻ shell → Shell_Socket, netdata: String)\n action `async` close(sock: ♻ shell → Shell_Socket)\n action `async` serialport_connect(name: String, options\\u003f: ♻ shell → Serial_Options) returns(sock: ♻ shell → Shell_Socket)\n action `async` serial_list() returns(ports: Json_Object)\n }\n}\n", "yuipc": "meta version \"v2.2,js,ctx,refs,localcloud,unicodemodel,allasync\";\nmeta name \"games\";\nmeta rootId \"E1ax9Kdm157CJfSoj2AswUkU\";\nmeta hasIds \"yes\";\nmeta platform \"current\";\nmeta parentIds \"\";\n// Resources on creating games. #docs #games\n#main\naction main() {\n #vpkj0TkCofaguObf // {parentTopic:contents}\n #eKKtA5noHZreltaN // TouchDevelop provides a simple and powerful environment to create engaging mobile games. In this section you can learn more about the game board engine, techniques for animating sprites, and more.\n #h0a0jh2pr6pw2VK0 // * [game board](/gameboard), a 2D game engine\n #MJmuIsFH4wopVnNA // * [sprite sheet](/spritesheet), manage sprite sheets and animations\n #taMaw2T4exuyggQm // * [sprite animation](/spriteanimation), fade in, fade out, scale, move using smooth transitions\n #jiq0SBl002XrFebR // * [parallax backgrounds](/parallaxbackgrounds), create depth effects with background scrolling\n #t0tKdQPBLcBVBH4G // * [](/leaderboards), online high scores\n #MLCuAd6azDerRM5A // * [gamepad](/gamepad), a library to control a game from keyboard, mouse, touch or actual gamepads.\n}\n" }, [ {"name":"App → javascript","id":"ryoka","rootid":"ryoka","userid":"jeiv","description":"#docs #AppJavascript","iconbackground":"#7D26CD","icon":"Document","iconArtId":null,"splashArtId":null,"time":1407457015,"priority":10000}, @@ -69,7 +69,7 @@ {"name":"Camera","id":"kdzf","rootid":"kdzf","userid":"jeiv","description":"#docs #Camera","iconbackground":"#7D26CD","icon":"Document","iconArtId":null,"splashArtId":null,"time":1395425046,"priority":10000,"platforms":["camera"]}, {"name":"Cloud Data","id":"lrfb","rootid":"lrfb","userid":"jeiv","description":"#docs #CloudData","iconbackground":"#7D26CD","icon":"Document","iconArtId":null,"splashArtId":null,"time":1377037638,"priority":10000}, {"name":"Cloud Session","id":"olkga","rootid":"olkga","userid":"jeiv","description":"#docs #CloudSession","iconbackground":"#7D26CD","icon":"Document","iconArtId":null,"splashArtId":null,"time":1377037634,"priority":10000}, -{"name":"Coding Jetpack Jumper!","id":"czzj","rootid":"asxkrtvt","userid":"lxxx","description":"Get introduced to coding by fixing a broken game, then share it with your friends! #docs #tutorials #HourOfCode #stepByStep","iconbackground":"#9955BB","icon":"Controller","iconArtId":null,"splashArtId":null,"time":1417650517,"priority":10000,"screenshot":"https://az31353.vo.msecnd.net/pub/jbdmnvvc"}, +{"name":"Coding Jetpack Jumper!","id":"yiqnc","rootid":"asxkrtvt","userid":"lxxx","description":"Get introduced to coding by fixing a broken game, then share it with your friends! #docs #tutorials #HourOfCode #stepByStep","iconbackground":"#9955BB","icon":"Controller","iconArtId":null,"splashArtId":null,"time":1429906379,"priority":10000,"screenshot":"https://az31353.vo.msecnd.net/pub/jbdmnvvc"}, {"name":"Customize Jetpack Jumper","id":"knmo","rootid":"vgke","userid":"lxxx","description":"#docs","iconbackground":"#9955BB","icon":"Controller","iconArtId":null,"splashArtId":null,"time":1417826233,"priority":10000}, {"name":"Gamepad","id":"vnapa","rootid":"sjbp","userid":"jeiv","description":"#docs #Gamepad","iconbackground":"#7D26CD","icon":"controller","iconArtId":null,"splashArtId":null,"time":1412688041,"priority":10000,"platforms":["accelerometer"],"parentTopic":"games"}, {"name":"Location","id":"ljhc","rootid":"tfiea","userid":"jeiv","description":"#docs #Location","iconbackground":"#7D26CD","icon":"Document","iconArtId":null,"splashArtId":null,"time":1395425058,"priority":10000,"platforms":["location","maps"]}, @@ -181,8 +181,8 @@ {"name":"crazy holiday football tutorial","id":"wnzk","rootid":"qnxj","userid":"jeiv","description":"Tap the screen to creates more pumpkins! #docs","iconbackground":"#FF91A4","icon":"Controller","iconArtId":null,"splashArtId":null,"time":1415066198,"priority":10000,"platforms":["musicandsounds"],"parentTopic":"gametutorials"}, {"name":"crazy pumpkins tutorial","id":"htsu","rootid":"qnxj","userid":"jeiv","description":"Tap the screen to creates more pumpkins! #docs","iconbackground":"#A1CAF1","icon":"Controller","iconArtId":null,"splashArtId":null,"time":1384585198,"priority":10000,"platforms":["musicandsounds"],"screenshot":"https://az31353.vo.msecnd.net/pub/lpjjsove"}, {"name":"creating interactive tutorials","id":"wrbni","rootid":"xniertjj","userid":"jeiv","description":"How to create 'tap here' tutorials. #docs","iconbackground":"#E3256B","icon":"GlobeSA","iconArtId":null,"splashArtId":null,"time":1428101566,"priority":10000,"platforms":["clouddata"],"parentTopic":"teach"}, -{"name":"creeper snowflake tutorial","id":"yxohe","rootid":"lfqv","userid":"jeiv","description":"Learn how to draw Koch snowflake fractals with the turtle. #docs #tutorials #turtle #stepbystep #minecraft #creeper","iconbackground":"#007FFF","icon":"Snowflake","iconArtId":null,"splashArtId":null,"time":1428467207,"priority":10000,"platforms":["editoronly"],"screenshot":"https://az31353.vo.msecnd.net/pub/ikidmsox"}, -{"name":"creeper triangle spiral tutorial","id":"izlve","rootid":"qkiw","userid":"jeiv","description":"A tutorial to learn to draw spirals with turtle. #docs #tutorials #stepbystep #minecraft #creeper","iconbackground":"#007FFF","icon":"snowflake","iconArtId":null,"splashArtId":null,"time":1428434153,"priority":10000,"platforms":["editoronly"],"screenshot":"https://az31353.vo.msecnd.net/pub/tngqslcx"}, +{"name":"creeper snowflake tutorial","id":"ubjwa","rootid":"lfqv","userid":"jeiv","description":"Learn how to draw Koch snowflake fractals with the turtle. #docs #tutorials #turtle #stepbystep #minecraft #creeper","iconbackground":"#007FFF","icon":"Snowflake","iconArtId":null,"splashArtId":null,"time":1429904750,"priority":10000,"platforms":["editoronly"],"screenshot":"https://az31353.vo.msecnd.net/pub/ikidmsox"}, +{"name":"creeper triangle spiral tutorial","id":"eunja","rootid":"qkiw","userid":"jeiv","description":"A tutorial to learn to draw spirals with turtle. #docs #tutorials #stepbystep #minecraft #creeper","iconbackground":"#007FFF","icon":"snowflake","iconArtId":null,"splashArtId":null,"time":1429904788,"priority":10000,"platforms":["editoronly"],"screenshot":"https://az31353.vo.msecnd.net/pub/tngqslcx"}, {"name":"cutest voting app tutorial","id":"ajhsb","rootid":"nrdhndao","userid":"jeiv","description":"A tutorial to create an voting app for the cutest cat or dog. #docs #tutorials #stepByStep.","iconbackground":"#FFA500","icon":"CheckCircleAlt","iconArtId":null,"splashArtId":null,"time":1415066416,"priority":10000,"platforms":["musicandsounds","clouddata"],"screenshot":"https://az31353.vo.msecnd.net/pub/akzvrrqu","parentTopic":"socialapptutorials"}, {"name":"data","id":"mhloa","rootid":"jswu","userid":"jeiv","description":"Global variables. #docs #data #language","iconbackground":"#9955BB","icon":"BulletList","iconArtId":null,"splashArtId":null,"time":1412665797,"priority":10000,"parentTopic":"language"}, {"name":"debugging","id":"lzcj","rootid":"aokhb","userid":"jeiv","description":"Debugging your script with the built-in debugger. #docs","iconbackground":"#FF0038","icon":"Settings","iconArtId":null,"splashArtId":null,"time":1412666436,"priority":10000,"parentTopic":"advancedtopics"}, @@ -203,7 +203,7 @@ {"name":"factorial tutorial","id":"joxi","rootid":"ivzrejdn","userid":"jeiv","description":"A step-by-step tutorial about the factorial function #docs #tutorials #stepByStep.","iconbackground":"#800080","icon":"Exclamation","iconArtId":null,"splashArtId":null,"time":1383627495,"priority":10000}, {"name":"falling rocks tutorial","id":"rfcea","rootid":"cxwjqvmo","userid":"jeiv","description":"A step-by-step tutorial on creating a game where you have to tilt your device to avoid falling rocks! #docs #tutorials #stepByStep #HourOfCode #tutorial","iconbackground":"#008000","icon":"Controller","iconArtId":null,"splashArtId":null,"time":1416508849,"priority":10000,"platforms":["accelerometer","musicandsounds"],"screenshot":"https://az31353.vo.msecnd.net/pub/czyykuaj"}, {"name":"faq","id":"fjsc","rootid":"gswd","userid":"jeiv","description":"Frequently asked questions. #docs #faq","iconbackground":"#B7410E","icon":"ArrowHead","iconArtId":null,"splashArtId":null,"time":1420746259,"priority":10000,"parentTopic":"contents"}, -{"name":"first steps with creeper","id":"oiina","rootid":"fezjznjm","userid":"jeiv","description":"Buid incredible structures in Minecraft with Creeper! #docs #tutorials #stepbystep #tutorial #minecraft #creeper","iconbackground":"#A1CAF1","icon":"Snowflake","iconArtId":"yapqobto","splashArtId":null,"time":1428559685,"priority":10000,"platforms":["editoronly"],"screenshot":"https://az31353.vo.msecnd.net/pub/ukuiwwpb"}, +{"name":"first steps with creeper","id":"aemoi","rootid":"fezjznjm","userid":"jeiv","description":"Buid incredible structures in Minecraft with Creeper! #docs #tutorials #stepbystep #tutorial #minecraft #creeper","iconbackground":"#A1CAF1","icon":"Snowflake","iconArtId":"yapqobto","splashArtId":null,"time":1429904981,"priority":10000,"platforms":["editoronly"],"screenshot":"https://az31353.vo.msecnd.net/pub/snkvcvwk"}, {"name":"first steps with drawing","id":"tkhvb","rootid":"alscwpqx","userid":"jeiv","description":"Use simple shapes to build amazing drawings! #docs #drawing #tutorials","iconbackground":"#A52A2A","icon":"Wand","iconArtId":null,"splashArtId":null,"time":1415066532,"priority":10000,"screenshot":"https://az31353.vo.msecnd.net/pub/rxvuaajw","parentTopic":"beginnertutorials"}, {"name":"first steps with steve","id":"eivga","rootid":"fezjznjm","userid":"jeiv","description":"Buid incredible structures in Minecraft with Steve! #docs #tutorials #stepbystep #tutorial #Minecraft #steve","iconbackground":"#FFFFFF","icon":"Snowflake","iconArtId":"zpybrwpw","splashArtId":null,"time":1426715174,"priority":10000,"platforms":["editoronly"],"screenshot":"https://az31353.vo.msecnd.net/pub/nqolyatf"}, {"name":"first steps with turtle","id":"mfmqc","rootid":"fezjznjm","userid":"jeiv","description":"Draw incredible drawings with the turtle! #docs #tutorials #stepbystep #HourOfCode #tutorial","iconbackground":"#007FFF","icon":"Snowflake","iconArtId":null,"splashArtId":null,"time":1426534070,"priority":10000,"screenshot":"https://az31353.vo.msecnd.net/pub/nqolyatf"}, @@ -251,14 +251,14 @@ {"name":"map of things tutorial","id":"zltx","rootid":"pljua","userid":"jeiv","description":"A tutorial to build a collaborative app that allows users to collect information about things in the world. #docs #tutorials #stepByStep.","iconbackground":"#FFA500","icon":"Map","iconArtId":null,"splashArtId":null,"time":1415066980,"priority":10000,"platforms":["location","maps","clouddata"],"screenshot":"https://az31353.vo.msecnd.net/pub/heknakcs"}, {"name":"markdown","id":"ubeic","rootid":"pbph","userid":"jeiv","description":"Syntax to create formatted text. #docs #markdown","iconbackground":"#800080","icon":"Shield","iconArtId":null,"splashArtId":null,"time":1426103896,"priority":10000,"parentTopic":"comment"}, {"name":"microphone","id":"hjjw","rootid":"hjjw","userid":"jeiv","description":"Access to the #microphone #docs","iconbackground":"#E3256B","icon":"AlignCenter","iconArtId":null,"splashArtId":null,"time":1395425064,"priority":10000,"platforms":["microphone","musicandsounds"]}, -{"name":"minecraft pi builder tutorial","id":"ohcea","rootid":"wuuvkimy","userid":"jeiv","description":"A Minecraft Pi tutorial to make the player jump really high. #docs #tutorials #stepByStep #tutorial #minecraft","iconbackground":"#008080","icon":"Erase","iconArtId":"kqezsjdm","splashArtId":null,"time":1428428639,"priority":10000,"platforms":["editoronly"],"screenshot":"https://az31353.vo.msecnd.net/pub/igsieoew"}, -{"name":"minecraft pi lava fountain tutorial","id":"aaick","rootid":"wuuvkimy","userid":"jeiv","description":"A Minecraft Pi tutorial to make the player jump really high. #docs #tutorials #stepByStep #minecraft","iconbackground":"#008000","icon":"Erase","iconArtId":"kqezsjdm","splashArtId":null,"time":1428428610,"priority":10000,"platforms":["editoronly"],"screenshot":"https://az31353.vo.msecnd.net/pub/guiwshyn"}, -{"name":"minecraft pi long legs tutorial","id":"ybyr","rootid":"wuuvkimy","userid":"jeiv","description":"A Minecraft PI tutorial to leave a trail of blocks. #docs #tutorials #stepByStep #tutorial #minecraft","iconbackground":"#007FFF","icon":"Erase","iconArtId":"kqezsjdm","splashArtId":null,"time":1428428595,"priority":10000,"platforms":["editoronly"],"screenshot":"https://az31353.vo.msecnd.net/pub/irvigyze"}, -{"name":"minecraft pi megajump tutorial","id":"wsioa","rootid":"wuuvkimy","userid":"jeiv","description":"A Minecraft Pi tutorial to make the player jump really high. #docs #tutorials #stepByStep #minecraft","iconbackground":"#00CC99","icon":"Erase","iconArtId":"kqezsjdm","splashArtId":null,"time":1428428581,"priority":10000,"platforms":["editoronly"],"screenshot":"https://az31353.vo.msecnd.net/pub/ewmpoahv"}, -{"name":"minecraft pi pitfall tutorial","id":"ctpfa","rootid":"wuuvkimy","userid":"jeiv","description":"A Minecraft Pi tutorial to make the player jump really high. #docs #tutorials #stepByStep #minecraft","iconbackground":"#DAA520","icon":"Erase","iconArtId":"kqezsjdm","splashArtId":null,"time":1428558407,"priority":10000,"platforms":["editoronly"],"screenshot":"https://az31353.vo.msecnd.net/pub/glyrqkrl"}, +{"name":"minecraft pi builder tutorial","id":"klqba","rootid":"wuuvkimy","userid":"jeiv","description":"A Minecraft Pi tutorial to make the player jump really high. #docs #tutorials #stepByStep #tutorial #minecraft","iconbackground":"#008080","icon":"Erase","iconArtId":"kqezsjdm","splashArtId":null,"time":1429904667,"priority":10000,"platforms":["editoronly"]}, +{"name":"minecraft pi lava fountain tutorial","id":"qvumc","rootid":"wuuvkimy","userid":"jeiv","description":"A Minecraft Pi tutorial to make the player jump really high. #docs #tutorials #stepByStep #minecraft","iconbackground":"#008000","icon":"Erase","iconArtId":"kqezsjdm","splashArtId":null,"time":1429905145,"priority":10000,"platforms":["editoronly"]}, +{"name":"minecraft pi long legs tutorial","id":"uykcc","rootid":"wuuvkimy","userid":"jeiv","description":"A Minecraft PI tutorial to leave a trail of blocks. #docs #tutorials #stepByStep #tutorial #minecraft","iconbackground":"#007FFF","icon":"Erase","iconArtId":"kqezsjdm","splashArtId":null,"time":1429905415,"priority":10000,"platforms":["editoronly"]}, +{"name":"minecraft pi megajump tutorial","id":"ghlva","rootid":"wuuvkimy","userid":"jeiv","description":"A Minecraft Pi tutorial to make the player jump really high. #docs #tutorials #stepByStep #minecraft","iconbackground":"#00CC99","icon":"Erase","iconArtId":"kqezsjdm","splashArtId":null,"time":1429904714,"priority":10000,"platforms":["editoronly"]}, +{"name":"minecraft pi pitfall tutorial","id":"wyjnc","rootid":"wuuvkimy","userid":"jeiv","description":"A Minecraft Pi tutorial to make the player jump really high. #docs #tutorials #stepByStep #minecraft","iconbackground":"#DAA520","icon":"Erase","iconArtId":"kqezsjdm","splashArtId":null,"time":1429904625,"priority":10000,"platforms":["editoronly"]}, {"name":"minecraft pi setup","id":"izzqa","rootid":"ypgksxfl","userid":"jeiv","description":"Explains how to setup TouchDevelop and Minecraft Pi. #docs #minecraft","iconbackground":"#E25822","icon":"Funnel","iconArtId":"kqezsjdm","splashArtId":null,"time":1429660256,"priority":10000}, -{"name":"minecraft pi super digger tutorial","id":"kqtdc","rootid":"wuuvkimy","userid":"jeiv","description":"A Minecraft PI tutorial to leave a trail of blocks. #docs #tutorials #stepByStep #tutorial #minecraft","iconbackground":"#E25822","icon":"Erase","iconArtId":"kqezsjdm","splashArtId":null,"time":1428467001,"priority":10000,"platforms":["editoronly"],"screenshot":"https://az31353.vo.msecnd.net/pub/kbqzgmfp"}, -{"name":"minecraft pi trail tutorial","id":"ghlv","rootid":"wuuvkimy","userid":"jeiv","description":"A Minecraft PI tutorial to leave a trail of blocks. #docs #tutorials #stepByStep #tutorial #minecraft","iconbackground":"#DAA520","icon":"Erase","iconArtId":"kqezsjdm","splashArtId":null,"time":1428428623,"priority":10000,"platforms":["editoronly"],"screenshot":"https://az31353.vo.msecnd.net/pub/czgoicgg"}, +{"name":"minecraft pi super digger tutorial","id":"kbyii","rootid":"wuuvkimy","userid":"jeiv","description":"A Minecraft PI tutorial to leave a trail of blocks. #docs #tutorials #stepByStep #tutorial #minecraft","iconbackground":"#E25822","icon":"Erase","iconArtId":"kqezsjdm","splashArtId":null,"time":1429904692,"priority":10000,"platforms":["editoronly"]}, +{"name":"minecraft pi trail tutorial","id":"ualda","rootid":"wuuvkimy","userid":"jeiv","description":"A Minecraft PI tutorial to leave a trail of blocks. #docs #tutorials #stepByStep #tutorial #minecraft","iconbackground":"#DAA520","icon":"Erase","iconArtId":"kqezsjdm","splashArtId":null,"time":1429904656,"priority":10000,"platforms":["editoronly"]}, {"name":"minecraft pi tutorials","id":"sygoa","rootid":"ggrw","userid":"jeiv","description":"A set of tutorials for Minecraft. #docs #minecraft","iconbackground":"#A1CAF1","icon":"GPS","iconArtId":"kqezsjdm","splashArtId":null,"time":1428074981,"priority":10000,"parentTopic":"tutorials"}, {"name":"monster slicer tutorial","id":"rebp","rootid":"cxwjqvmo","userid":"jeiv","description":"A step-by-step tutorial on creating a game with bouncing monsters #docs #tutorials #stepByStep #HourOfCode #tutorial","iconbackground":"#008000","icon":"Controller","iconArtId":null,"splashArtId":null,"time":1416508877,"priority":10000,"platforms":["musicandsounds"],"screenshot":"https://az31353.vo.msecnd.net/pub/dwhkdiwe","parentTopic":"gametutorials"}, {"name":"move to library","id":"uvthb","rootid":"igxk","userid":"jeiv","description":"Explains the move to library refactoring that allows you to easily identify and move a set of script elements to a library.\r\n#docs #refactorings","iconbackground":"#FDEE00","icon":"DocumentsAlt","iconArtId":null,"splashArtId":null,"time":1412701848,"priority":10000,"parentTopic":"refactorings"}, @@ -361,7 +361,7 @@ {"name":"videos","id":"jzpoa","rootid":"qmvx","userid":"jeiv","description":"Tutorials videos #docs #videos","iconbackground":"#00008B","icon":"Suitcase","iconArtId":null,"splashArtId":null,"time":1377556183,"priority":10000}, {"name":"voice commands","id":"jpue","rootid":"jpue","userid":"jeiv","description":"List of voice commands #docs #wp8","iconbackground":"#FF7518","icon":"AlignCenter","iconArtId":null,"splashArtId":null,"time":1370322986,"priority":10000}, {"name":"web requests","id":"qaeq","rootid":"ezdyb","userid":"jeiv","description":"Send HTTP requests and read HTTP responses. #docs #webRequests #web #apps","iconbackground":"#E3256B","icon":"Wifi","iconArtId":null,"splashArtId":null,"time":1384241473,"priority":10000}, -{"name":"what's new?","id":"iurla","rootid":"jiuk","userid":"jeiv","description":"release notes #docs","iconbackground":"#A52A2A","icon":"Share","iconArtId":null,"splashArtId":null,"time":1424824398,"priority":1,"platforms":["accelerometer","location","maps","cloudservices"],"parentTopic":"contents"}, +{"name":"what's new?","id":"oixlc","rootid":"jiuk","userid":"jeiv","description":"release notes #docs","iconbackground":"#A52A2A","icon":"Share","iconArtId":null,"splashArtId":null,"time":1429853648,"priority":1,"platforms":["accelerometer","location","maps","cloudservices"],"parentTopic":"contents"}, {"name":"what's new? 2013","id":"tmtj","rootid":"jiuk","userid":"jeiv","description":"release notes #docs","iconbackground":"#FF2800","icon":"ApproveButton","iconArtId":null,"splashArtId":null,"time":1422891003,"priority":10000,"parentTopic":"whatsnew"}, {"name":"where","id":"bmmha","rootid":"dzdh","userid":"jeiv","description":"Limit the scope of for each loop #docs #forEach #where #language","iconbackground":"#85BB65","icon":"Question","iconArtId":null,"splashArtId":null,"time":1412666005,"priority":10000,"parentTopic":"language"}, {"name":"while","id":"uuuya","rootid":"ykdm","userid":"jeiv","description":"Repeat code while a condition remains true. #docs #while #language","iconbackground":"#E25822","icon":"Cycle","iconArtId":null,"splashArtId":null,"time":1412688421,"priority":10000,"parentTopic":"language"}, @@ -373,8 +373,8 @@ {"title":"blank turtle","id":"blankturtle","icon":"Controller","name":"ADJ turtle","description":"An turtle app.","section":"beginners","scriptid":"parp","editorMode":1}, {"title":"blank scratch","id":"blankscratch","icon":"Controller","name":"ADJ app","description":"An empty app using the scratch library.","section":"beginners","scriptid":"enyra","editorMode":1}, {"title":"blank pixel art","id":"blankpixelart","icon":"NineColumn","name":"ADJ art","description":"A pixel art app.","section":"beginners","scriptid":"mdrw","editorMode":1}, -{"title":"blank minecraft pi","id":"blankminecraftpi","icon":"NineColumn","name":"ADJ craft","description":"A Minecraft Pi app.","section":"Minecraft","scriptid":"oghqc","editorMode":1}, -{"title":"blank creeper","id":"blankcreeper","icon":"NineColumn","name":"ADJ creeper","description":"A Minecraft creeper app.","section":"Minecraft","scriptid":"cpebe","editorMode":1}, +{"title":"blank minecraft pi","id":"blankminecraftpi","icon":"NineColumn","name":"ADJ craft","description":"A Minecraft Pi app.","section":"Minecraft","scriptid":"wkbbc","editorMode":1}, +{"title":"blank creeper","id":"blankcreeper","icon":"NineColumn","name":"ADJ creeper","description":"A Minecraft creeper app.","section":"Minecraft","scriptid":"wuym","editorMode":1}, {"title":"blank cordova library","id":"blankcordovalibrary","icon":"ApproveButton","name":"cordova ADJ plugin","description":"An wrapper around an Apache Cordova plugin.","section":"apps","scriptid":"gtfla","editorMode":3}, {"title":"blank web app","id":"blankwebapi","icon":"Stacks","name":"ADJ api","description":"A web app using Node.js and Restify.","section":"web apps","scriptid":"cleva","editorMode":3}, {"title":"blank azure web app","id":"blankazurewebapi","icon":"Stacks","name":"azure ADJ api","description":"A web app using Azure Services, Node.js and Restify.","section":"web apps","scriptid":"opqwc","editorMode":3}, diff --git a/tools/client.ts b/tools/client.ts index 602d4003..d692657a 100644 --- a/tools/client.ts +++ b/tools/client.ts @@ -27,7 +27,7 @@ var scriptsWithErrors = ["isrt", "bvxv", "cgcbb", "bkiza", "urde", ]; var additionalTopics = [ - "quyt" // Coding Jetpack Jumper! + "yiqnc" // Coding Jetpack Jumper! , "tjkjc" // Customize Jetpack Jumper! ] @@ -1700,8 +1700,11 @@ export function updatehelp(args:string[]) var usedIds = {} var visitedIds = {} var offlineScripts = {} + var todo = {}; - function oneDone() { + + function oneDone(id: string) { + delete todo[id]; --numScripts; if (numScripts == 0) { var s = ""; @@ -1765,6 +1768,7 @@ export function updatehelp(args:string[]) function getScript(id, f) { cachedScripts[id] = ""; + todo[id+'/text'] = 1; numScripts++; tdevGet(id + "/text?original=true", (text) => { if (!text) { @@ -1780,7 +1784,7 @@ export function updatehelp(args:string[]) }) } f(text); - oneDone(); + oneDone(id+'/text'); }) } @@ -1834,8 +1838,12 @@ export function updatehelp(args:string[]) } console.log("%s (%s, %d to go, %d bytes%s)", desc.name, desc.id, numScripts, JSON.stringify(text).length, isOffline ? " OFFLINE" : ""); + if (numScripts <= 5) { + console.log("remaining: %s", JSON.stringify(todo)); + } m = /\/\/\s*\{template:(\w+)\}/i.exec(text); if (m) { + todo[id + "/webast"] = 1; numScripts++; tdevGet(id + "/webast", dat => { var ast = JSON.parse(dat) @@ -1847,16 +1855,18 @@ export function updatehelp(args:string[]) if (img) desc.screenshot = img.url else if (scr.screenshotids && scr.screenshotids[0]) desc.screenshot = 'https://az31353.vo.msecnd.net/pub/' + scr.screenshotids[0]; - oneDone() + oneDone(id+"/webast") }) if (m[1] == "empty" || m[1] == "emptyapp") { } else { + var mid = m[1]; + todo[mid + '/empty'] = 1; numScripts++; - getScript(m[1], text => { + getScript(mid, text => { if (!text) throw new Error('error: in /' + id + ', template ' + m[1] + ' not found'); - oneDone() + oneDone(mid + '/empty') }) } } @@ -1864,33 +1874,38 @@ export function updatehelp(args:string[]) m = scr.rootid && scr.rootid != scr.id && /#blog/.exec(text); if (m) { console.log('fetching original time blog entry of /' + scr.id + ' from /' + scr.rootid); + todo[scr.rootid + '/blog'] = 1; numScripts++; tdevGet(scr.rootid, dat => { desc.time = JSON.parse(dat)["time"]; - oneDone() + oneDone(scr.rootid + '/blog') }); } } })); } - function getFrom(cont:string, path : string) { + function getFrom(cont: string, path: string) { + todo[path + cont + '/from'] = 1; numScripts++; tdevGet(path + cont, (text) => { var resp = JSON.parse(text); resp.items.forEach(processScript) if (resp.continuation) getFrom("&continuation=" + resp.continuation, path) - oneDone(); + oneDone(path + cont + '/from'); }) } additionalTopics.forEach(id => { + todo[id + '/add'] = 1; numScripts++ tdevGet(id, text => { var scr = JSON.parse(text) + delete todo[id + '/add']; + todo[scr.updateid + '/addupdate'] = 1; tdevGet(scr.updateid, text => { processScript(JSON.parse(text)) - oneDone() + oneDone(scr.updateid + '/addupdate') }) }) }) @@ -1899,6 +1914,7 @@ export function updatehelp(args:string[]) getFrom("", "scripts?q=" + encodeURIComponent(blogQuery) + "&applyupdates=true&count=100") templates.forEach((t) => { + todo[t.scriptid + '/template'] = 1; numScripts++; function processJscript(scr) { var ids = [scr.id].concat(scr.librarydependencyids); @@ -1908,14 +1924,16 @@ export function updatehelp(args:string[]) if (t.section == sectTemplates) offlineScripts[id] = 1 })) - oneDone(); + oneDone(t.scriptid + '/template'); } tdevGet(t.scriptid, (text) => { var jscript = JSON.parse(text) if (!jscript.updateid || jscript.updateid == jscript.id) processJscript(jscript) else { + delete todo[t.scriptid + '/template']; t.scriptid = jscript.updateid; + todo[jscript.updateid + '/template'] = 1; tdevGet(jscript.updateid, t => processJscript(JSON.parse(t))); } })