Servo, edge connector and button pair simulator support (#782)
* add common packages dep * inlining microservo * moving more sim * updated * bump pxt
This commit is contained in:
		@@ -1,6 +0,0 @@
 | 
			
		||||
/// <reference path="../node_modules/pxt-core/built/pxtlib.d.ts" />
 | 
			
		||||
 | 
			
		||||
import * as path from "path";
 | 
			
		||||
export let pxtCore = require("pxt-core");
 | 
			
		||||
// require.resolve() gives path to [pxt dir]/built/pxt.js, so move up twice to get pxt root dir
 | 
			
		||||
export let pxtCoreDir = path.resolve(require.resolve("pxt-core"), "..", "..");
 | 
			
		||||
@@ -1,14 +0,0 @@
 | 
			
		||||
{
 | 
			
		||||
    "compilerOptions": {
 | 
			
		||||
        "target": "es5",
 | 
			
		||||
        "noImplicitAny": true,
 | 
			
		||||
        "noImplicitReturns": true,
 | 
			
		||||
        "declaration": true,
 | 
			
		||||
        "outDir": "../built",
 | 
			
		||||
        "module": "commonjs",
 | 
			
		||||
        "rootDir": ".",
 | 
			
		||||
        "newLine": "LF",
 | 
			
		||||
        "sourceMap": false,
 | 
			
		||||
        "types": ["node"]
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										619
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										619
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							@@ -388,7 +388,6 @@
 | 
			
		||||
      "version": "2.0.6",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
 | 
			
		||||
      "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=",
 | 
			
		||||
      "dev": true,
 | 
			
		||||
      "optional": true
 | 
			
		||||
    },
 | 
			
		||||
    "asn1": {
 | 
			
		||||
@@ -575,67 +574,6 @@
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "browserify": {
 | 
			
		||||
      "version": "13.3.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/browserify/-/browserify-13.3.0.tgz",
 | 
			
		||||
      "integrity": "sha1-tanJAgJD8McORnW+yCI7xifkFc4=",
 | 
			
		||||
      "requires": {
 | 
			
		||||
        "JSONStream": "1.3.2",
 | 
			
		||||
        "assert": "1.4.1",
 | 
			
		||||
        "browser-pack": "6.1.0",
 | 
			
		||||
        "browser-resolve": "1.11.2",
 | 
			
		||||
        "browserify-zlib": "0.1.4",
 | 
			
		||||
        "buffer": "4.9.1",
 | 
			
		||||
        "cached-path-relative": "1.0.1",
 | 
			
		||||
        "concat-stream": "1.5.2",
 | 
			
		||||
        "console-browserify": "1.1.0",
 | 
			
		||||
        "constants-browserify": "1.0.0",
 | 
			
		||||
        "crypto-browserify": "3.12.0",
 | 
			
		||||
        "defined": "1.0.0",
 | 
			
		||||
        "deps-sort": "2.0.0",
 | 
			
		||||
        "domain-browser": "1.1.7",
 | 
			
		||||
        "duplexer2": "0.1.4",
 | 
			
		||||
        "events": "1.1.1",
 | 
			
		||||
        "glob": "7.1.2",
 | 
			
		||||
        "has": "1.0.1",
 | 
			
		||||
        "htmlescape": "1.1.1",
 | 
			
		||||
        "https-browserify": "0.0.1",
 | 
			
		||||
        "inherits": "2.0.3",
 | 
			
		||||
        "insert-module-globals": "7.0.6",
 | 
			
		||||
        "labeled-stream-splicer": "2.0.1",
 | 
			
		||||
        "module-deps": "4.1.1",
 | 
			
		||||
        "os-browserify": "0.1.2",
 | 
			
		||||
        "parents": "1.0.1",
 | 
			
		||||
        "path-browserify": "0.0.0",
 | 
			
		||||
        "process": "0.11.10",
 | 
			
		||||
        "punycode": "1.4.1",
 | 
			
		||||
        "querystring-es3": "0.2.1",
 | 
			
		||||
        "read-only-stream": "2.0.0",
 | 
			
		||||
        "readable-stream": "2.3.3",
 | 
			
		||||
        "resolve": "1.7.1",
 | 
			
		||||
        "shasum": "1.0.2",
 | 
			
		||||
        "shell-quote": "1.6.1",
 | 
			
		||||
        "stream-browserify": "2.0.1",
 | 
			
		||||
        "stream-http": "2.8.1",
 | 
			
		||||
        "string_decoder": "0.10.31",
 | 
			
		||||
        "subarg": "1.0.0",
 | 
			
		||||
        "syntax-error": "1.4.0",
 | 
			
		||||
        "through2": "2.0.3",
 | 
			
		||||
        "timers-browserify": "1.4.2",
 | 
			
		||||
        "tty-browserify": "0.0.1",
 | 
			
		||||
        "url": "0.11.0",
 | 
			
		||||
        "util": "0.10.3",
 | 
			
		||||
        "vm-browserify": "0.0.4",
 | 
			
		||||
        "xtend": "4.0.1"
 | 
			
		||||
      },
 | 
			
		||||
      "dependencies": {
 | 
			
		||||
        "string_decoder": {
 | 
			
		||||
          "version": "0.10.31",
 | 
			
		||||
          "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
 | 
			
		||||
          "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ="
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "browserify-aes": {
 | 
			
		||||
      "version": "1.2.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz",
 | 
			
		||||
@@ -692,14 +630,6 @@
 | 
			
		||||
        "parse-asn1": "5.1.1"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "browserify-zlib": {
 | 
			
		||||
      "version": "0.1.4",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.1.4.tgz",
 | 
			
		||||
      "integrity": "sha1-uzX4pRn2AOD6a4SFJByXnQFB+y0=",
 | 
			
		||||
      "requires": {
 | 
			
		||||
        "pako": "0.2.9"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "browserslist": {
 | 
			
		||||
      "version": "1.7.7",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz",
 | 
			
		||||
@@ -709,16 +639,6 @@
 | 
			
		||||
        "electron-to-chromium": "1.3.27"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "buffer": {
 | 
			
		||||
      "version": "4.9.1",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz",
 | 
			
		||||
      "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=",
 | 
			
		||||
      "requires": {
 | 
			
		||||
        "base64-js": "1.3.0",
 | 
			
		||||
        "ieee754": "1.1.11",
 | 
			
		||||
        "isarray": "1.0.0"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "buffer-from": {
 | 
			
		||||
      "version": "1.0.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.0.0.tgz",
 | 
			
		||||
@@ -808,7 +728,7 @@
 | 
			
		||||
    "clap": {
 | 
			
		||||
      "version": "1.2.3",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/clap/-/clap-1.2.3.tgz",
 | 
			
		||||
      "integrity": "sha512-4CoL/A3hf90V3VIEjeuhSvlGFEHKzOz+Wfc2IVZc+FaUgU0ZQafJTP49fvnULipOPcAfqhyI2duwQyns6xqjYA==",
 | 
			
		||||
      "integrity": "sha1-TzZ0WzIAhJJVf0ZBLWbVDLmbzlE=",
 | 
			
		||||
      "requires": {
 | 
			
		||||
        "chalk": "1.1.3"
 | 
			
		||||
      }
 | 
			
		||||
@@ -951,36 +871,6 @@
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
 | 
			
		||||
      "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
 | 
			
		||||
    },
 | 
			
		||||
    "concat-stream": {
 | 
			
		||||
      "version": "1.5.2",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.5.2.tgz",
 | 
			
		||||
      "integrity": "sha1-cIl4Yk2FavQaWnQd790mHadSwmY=",
 | 
			
		||||
      "requires": {
 | 
			
		||||
        "inherits": "2.0.3",
 | 
			
		||||
        "readable-stream": "2.0.6",
 | 
			
		||||
        "typedarray": "0.0.6"
 | 
			
		||||
      },
 | 
			
		||||
      "dependencies": {
 | 
			
		||||
        "readable-stream": {
 | 
			
		||||
          "version": "2.0.6",
 | 
			
		||||
          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz",
 | 
			
		||||
          "integrity": "sha1-j5A0HmilPMySh4jaz80Rs265t44=",
 | 
			
		||||
          "requires": {
 | 
			
		||||
            "core-util-is": "1.0.2",
 | 
			
		||||
            "inherits": "2.0.3",
 | 
			
		||||
            "isarray": "1.0.0",
 | 
			
		||||
            "process-nextick-args": "1.0.7",
 | 
			
		||||
            "string_decoder": "0.10.31",
 | 
			
		||||
            "util-deprecate": "1.0.2"
 | 
			
		||||
          }
 | 
			
		||||
        },
 | 
			
		||||
        "string_decoder": {
 | 
			
		||||
          "version": "0.10.31",
 | 
			
		||||
          "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
 | 
			
		||||
          "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ="
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "console-browserify": {
 | 
			
		||||
      "version": "1.1.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz",
 | 
			
		||||
@@ -1233,22 +1123,6 @@
 | 
			
		||||
      "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=",
 | 
			
		||||
      "optional": true
 | 
			
		||||
    },
 | 
			
		||||
    "detective": {
 | 
			
		||||
      "version": "4.7.1",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/detective/-/detective-4.7.1.tgz",
 | 
			
		||||
      "integrity": "sha512-H6PmeeUcZloWtdt4DAkFyzFL94arpHr3NOwwmVILFiy+9Qd4JTxxXrzfyGk/lmct2qVGBwTSwSXagqu2BxmWig==",
 | 
			
		||||
      "requires": {
 | 
			
		||||
        "acorn": "5.5.3",
 | 
			
		||||
        "defined": "1.0.0"
 | 
			
		||||
      },
 | 
			
		||||
      "dependencies": {
 | 
			
		||||
        "acorn": {
 | 
			
		||||
          "version": "5.5.3",
 | 
			
		||||
          "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.5.3.tgz",
 | 
			
		||||
          "integrity": "sha512-jd5MkIUlbbmb07nXH0DT3y7rDVtkzDi4XZOUVWAer8ajmF/DTSSbl5oNFyDOl/OXA33Bl79+ypHhl2pN20VeOQ=="
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "diffie-hellman": {
 | 
			
		||||
      "version": "5.0.3",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz",
 | 
			
		||||
@@ -1259,11 +1133,6 @@
 | 
			
		||||
        "randombytes": "2.0.6"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "domain-browser": {
 | 
			
		||||
      "version": "1.1.7",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.1.7.tgz",
 | 
			
		||||
      "integrity": "sha1-hnqksJP6oF8d4IwG9NeyH9+GmLw="
 | 
			
		||||
    },
 | 
			
		||||
    "duplexer2": {
 | 
			
		||||
      "version": "0.1.4",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz",
 | 
			
		||||
@@ -1312,7 +1181,6 @@
 | 
			
		||||
      "version": "0.1.4",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.4.tgz",
 | 
			
		||||
      "integrity": "sha1-uJbiOp5ei6M4cfyZar02NfyaHH0=",
 | 
			
		||||
      "dev": true,
 | 
			
		||||
      "optional": true,
 | 
			
		||||
      "requires": {
 | 
			
		||||
        "prr": "0.0.0"
 | 
			
		||||
@@ -1333,11 +1201,6 @@
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz",
 | 
			
		||||
      "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE="
 | 
			
		||||
    },
 | 
			
		||||
    "events": {
 | 
			
		||||
      "version": "1.1.1",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz",
 | 
			
		||||
      "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ="
 | 
			
		||||
    },
 | 
			
		||||
    "evp_bytestokey": {
 | 
			
		||||
      "version": "1.0.3",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz",
 | 
			
		||||
@@ -1448,11 +1311,6 @@
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
 | 
			
		||||
      "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
 | 
			
		||||
    },
 | 
			
		||||
    "fuse.js": {
 | 
			
		||||
      "version": "2.6.1",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/fuse.js/-/fuse.js-2.6.1.tgz",
 | 
			
		||||
      "integrity": "sha1-0RjgD5qFn3s1TtT3dAIUJJ4ypXo="
 | 
			
		||||
    },
 | 
			
		||||
    "gauge": {
 | 
			
		||||
      "version": "2.7.4",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz",
 | 
			
		||||
@@ -1486,7 +1344,7 @@
 | 
			
		||||
    "glob": {
 | 
			
		||||
      "version": "7.1.2",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
 | 
			
		||||
      "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
 | 
			
		||||
      "integrity": "sha1-wZyd+aAocC1nhhI4SmVSQExjbRU=",
 | 
			
		||||
      "requires": {
 | 
			
		||||
        "fs.realpath": "1.0.0",
 | 
			
		||||
        "inflight": "1.0.6",
 | 
			
		||||
@@ -1500,7 +1358,6 @@
 | 
			
		||||
      "version": "4.1.11",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
 | 
			
		||||
      "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=",
 | 
			
		||||
      "dev": true,
 | 
			
		||||
      "optional": true
 | 
			
		||||
    },
 | 
			
		||||
    "har-schema": {
 | 
			
		||||
@@ -1573,11 +1430,6 @@
 | 
			
		||||
        "sntp": "2.1.0"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "highlight.js": {
 | 
			
		||||
      "version": "9.12.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-9.12.0.tgz",
 | 
			
		||||
      "integrity": "sha1-5tnb5Xy+/mB1HwKvM2GVhwyQwB4="
 | 
			
		||||
    },
 | 
			
		||||
    "hmac-drbg": {
 | 
			
		||||
      "version": "1.0.1",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz",
 | 
			
		||||
@@ -1618,11 +1470,6 @@
 | 
			
		||||
        "sshpk": "1.13.1"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "https-browserify": {
 | 
			
		||||
      "version": "0.0.1",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-0.0.1.tgz",
 | 
			
		||||
      "integrity": "sha1-P5E2XKvmC3ftDruiS0VOPgnZWoI="
 | 
			
		||||
    },
 | 
			
		||||
    "ieee754": {
 | 
			
		||||
      "version": "1.1.11",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.11.tgz",
 | 
			
		||||
@@ -1632,7 +1479,6 @@
 | 
			
		||||
      "version": "0.5.5",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz",
 | 
			
		||||
      "integrity": "sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=",
 | 
			
		||||
      "dev": true,
 | 
			
		||||
      "optional": true
 | 
			
		||||
    },
 | 
			
		||||
    "indexes-of": {
 | 
			
		||||
@@ -1640,11 +1486,6 @@
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz",
 | 
			
		||||
      "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc="
 | 
			
		||||
    },
 | 
			
		||||
    "indexof": {
 | 
			
		||||
      "version": "0.0.1",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz",
 | 
			
		||||
      "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10="
 | 
			
		||||
    },
 | 
			
		||||
    "inflight": {
 | 
			
		||||
      "version": "1.0.6",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
 | 
			
		||||
@@ -1834,8 +1675,7 @@
 | 
			
		||||
    "jquery": {
 | 
			
		||||
      "version": "3.2.1",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.2.1.tgz",
 | 
			
		||||
      "integrity": "sha1-XE2d5lKvbNCncBVKYxu6ErAVx4c=",
 | 
			
		||||
      "dev": true
 | 
			
		||||
      "integrity": "sha1-XE2d5lKvbNCncBVKYxu6ErAVx4c="
 | 
			
		||||
    },
 | 
			
		||||
    "js-base64": {
 | 
			
		||||
      "version": "2.3.2",
 | 
			
		||||
@@ -1871,7 +1711,6 @@
 | 
			
		||||
      "version": "1.0.1",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz",
 | 
			
		||||
      "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=",
 | 
			
		||||
      "dev": true,
 | 
			
		||||
      "optional": true,
 | 
			
		||||
      "requires": {
 | 
			
		||||
        "jsonify": "0.0.0"
 | 
			
		||||
@@ -1955,7 +1794,6 @@
 | 
			
		||||
      "version": "2.7.3",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/less/-/less-2.7.3.tgz",
 | 
			
		||||
      "integrity": "sha512-KPdIJKWcEAb02TuJtaLrhue0krtRLoRoo7x6BNJIBelO00t/CCdJQUnHW5V34OnHMWzIktSalJxRO+FvytQlCQ==",
 | 
			
		||||
      "dev": true,
 | 
			
		||||
      "requires": {
 | 
			
		||||
        "errno": "0.1.4",
 | 
			
		||||
        "graceful-fs": "4.1.11",
 | 
			
		||||
@@ -1971,7 +1809,6 @@
 | 
			
		||||
          "version": "4.11.8",
 | 
			
		||||
          "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz",
 | 
			
		||||
          "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=",
 | 
			
		||||
          "dev": true,
 | 
			
		||||
          "optional": true,
 | 
			
		||||
          "requires": {
 | 
			
		||||
            "co": "4.6.0",
 | 
			
		||||
@@ -1982,21 +1819,18 @@
 | 
			
		||||
          "version": "0.2.0",
 | 
			
		||||
          "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz",
 | 
			
		||||
          "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=",
 | 
			
		||||
          "dev": true,
 | 
			
		||||
          "optional": true
 | 
			
		||||
        },
 | 
			
		||||
        "aws-sign2": {
 | 
			
		||||
          "version": "0.6.0",
 | 
			
		||||
          "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz",
 | 
			
		||||
          "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=",
 | 
			
		||||
          "dev": true,
 | 
			
		||||
          "optional": true
 | 
			
		||||
        },
 | 
			
		||||
        "boom": {
 | 
			
		||||
          "version": "2.10.1",
 | 
			
		||||
          "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz",
 | 
			
		||||
          "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=",
 | 
			
		||||
          "dev": true,
 | 
			
		||||
          "requires": {
 | 
			
		||||
            "hoek": "2.16.3"
 | 
			
		||||
          }
 | 
			
		||||
@@ -2005,7 +1839,6 @@
 | 
			
		||||
          "version": "2.0.5",
 | 
			
		||||
          "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz",
 | 
			
		||||
          "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=",
 | 
			
		||||
          "dev": true,
 | 
			
		||||
          "optional": true,
 | 
			
		||||
          "requires": {
 | 
			
		||||
            "boom": "2.10.1"
 | 
			
		||||
@@ -2015,7 +1848,6 @@
 | 
			
		||||
          "version": "2.1.4",
 | 
			
		||||
          "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz",
 | 
			
		||||
          "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=",
 | 
			
		||||
          "dev": true,
 | 
			
		||||
          "optional": true,
 | 
			
		||||
          "requires": {
 | 
			
		||||
            "asynckit": "0.4.0",
 | 
			
		||||
@@ -2027,14 +1859,12 @@
 | 
			
		||||
          "version": "1.0.5",
 | 
			
		||||
          "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-1.0.5.tgz",
 | 
			
		||||
          "integrity": "sha1-0mMTX0MwfALGAq/I/pWXDAFRNp4=",
 | 
			
		||||
          "dev": true,
 | 
			
		||||
          "optional": true
 | 
			
		||||
        },
 | 
			
		||||
        "har-validator": {
 | 
			
		||||
          "version": "4.2.1",
 | 
			
		||||
          "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz",
 | 
			
		||||
          "integrity": "sha1-M0gdDxu/9gDdID11gSpqX7oALio=",
 | 
			
		||||
          "dev": true,
 | 
			
		||||
          "optional": true,
 | 
			
		||||
          "requires": {
 | 
			
		||||
            "ajv": "4.11.8",
 | 
			
		||||
@@ -2045,7 +1875,6 @@
 | 
			
		||||
          "version": "3.1.3",
 | 
			
		||||
          "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz",
 | 
			
		||||
          "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=",
 | 
			
		||||
          "dev": true,
 | 
			
		||||
          "optional": true,
 | 
			
		||||
          "requires": {
 | 
			
		||||
            "boom": "2.10.1",
 | 
			
		||||
@@ -2057,14 +1886,12 @@
 | 
			
		||||
        "hoek": {
 | 
			
		||||
          "version": "2.16.3",
 | 
			
		||||
          "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz",
 | 
			
		||||
          "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=",
 | 
			
		||||
          "dev": true
 | 
			
		||||
          "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0="
 | 
			
		||||
        },
 | 
			
		||||
        "http-signature": {
 | 
			
		||||
          "version": "1.1.1",
 | 
			
		||||
          "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz",
 | 
			
		||||
          "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=",
 | 
			
		||||
          "dev": true,
 | 
			
		||||
          "optional": true,
 | 
			
		||||
          "requires": {
 | 
			
		||||
            "assert-plus": "0.2.0",
 | 
			
		||||
@@ -2076,21 +1903,18 @@
 | 
			
		||||
          "version": "0.2.0",
 | 
			
		||||
          "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz",
 | 
			
		||||
          "integrity": "sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU=",
 | 
			
		||||
          "dev": true,
 | 
			
		||||
          "optional": true
 | 
			
		||||
        },
 | 
			
		||||
        "qs": {
 | 
			
		||||
          "version": "6.4.0",
 | 
			
		||||
          "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz",
 | 
			
		||||
          "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=",
 | 
			
		||||
          "dev": true,
 | 
			
		||||
          "optional": true
 | 
			
		||||
        },
 | 
			
		||||
        "request": {
 | 
			
		||||
          "version": "2.81.0",
 | 
			
		||||
          "resolved": "https://registry.npmjs.org/request/-/request-2.81.0.tgz",
 | 
			
		||||
          "integrity": "sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA=",
 | 
			
		||||
          "dev": true,
 | 
			
		||||
          "optional": true,
 | 
			
		||||
          "requires": {
 | 
			
		||||
            "aws-sign2": "0.6.0",
 | 
			
		||||
@@ -2121,7 +1945,6 @@
 | 
			
		||||
          "version": "1.0.9",
 | 
			
		||||
          "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz",
 | 
			
		||||
          "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=",
 | 
			
		||||
          "dev": true,
 | 
			
		||||
          "optional": true,
 | 
			
		||||
          "requires": {
 | 
			
		||||
            "hoek": "2.16.3"
 | 
			
		||||
@@ -2189,11 +2012,6 @@
 | 
			
		||||
        "object-visit": "1.0.1"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "marked": {
 | 
			
		||||
      "version": "0.3.12",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/marked/-/marked-0.3.12.tgz",
 | 
			
		||||
      "integrity": "sha512-k4NaW+vS7ytQn6MgJn3fYpQt20/mOgYM5Ft9BYMfQJDz2QT6yEeS9XJ8k2Nw8JTeWK/znPPW2n3UJGzyYEiMoA=="
 | 
			
		||||
    },
 | 
			
		||||
    "math-expression-evaluator": {
 | 
			
		||||
      "version": "1.2.17",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/math-expression-evaluator/-/math-expression-evaluator-1.2.17.tgz",
 | 
			
		||||
@@ -2221,7 +2039,6 @@
 | 
			
		||||
      "version": "1.4.1",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz",
 | 
			
		||||
      "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==",
 | 
			
		||||
      "dev": true,
 | 
			
		||||
      "optional": true
 | 
			
		||||
    },
 | 
			
		||||
    "mime-db": {
 | 
			
		||||
@@ -2250,7 +2067,7 @@
 | 
			
		||||
    "minimatch": {
 | 
			
		||||
      "version": "3.0.4",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
 | 
			
		||||
      "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
 | 
			
		||||
      "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=",
 | 
			
		||||
      "requires": {
 | 
			
		||||
        "brace-expansion": "1.1.8"
 | 
			
		||||
      }
 | 
			
		||||
@@ -2284,28 +2101,6 @@
 | 
			
		||||
        "minimist": "0.0.8"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "module-deps": {
 | 
			
		||||
      "version": "4.1.1",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/module-deps/-/module-deps-4.1.1.tgz",
 | 
			
		||||
      "integrity": "sha1-IyFYM/HaE/1gbMuAh7RIUty4If0=",
 | 
			
		||||
      "requires": {
 | 
			
		||||
        "JSONStream": "1.3.2",
 | 
			
		||||
        "browser-resolve": "1.11.2",
 | 
			
		||||
        "cached-path-relative": "1.0.1",
 | 
			
		||||
        "concat-stream": "1.5.2",
 | 
			
		||||
        "defined": "1.0.0",
 | 
			
		||||
        "detective": "4.7.1",
 | 
			
		||||
        "duplexer2": "0.1.4",
 | 
			
		||||
        "inherits": "2.0.3",
 | 
			
		||||
        "parents": "1.0.1",
 | 
			
		||||
        "readable-stream": "2.3.3",
 | 
			
		||||
        "resolve": "1.7.1",
 | 
			
		||||
        "stream-combiner2": "1.1.1",
 | 
			
		||||
        "subarg": "1.0.0",
 | 
			
		||||
        "through2": "2.0.3",
 | 
			
		||||
        "xtend": "4.0.1"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "ms": {
 | 
			
		||||
      "version": "2.0.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
 | 
			
		||||
@@ -2375,7 +2170,7 @@
 | 
			
		||||
    "npmlog": {
 | 
			
		||||
      "version": "4.1.2",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz",
 | 
			
		||||
      "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==",
 | 
			
		||||
      "integrity": "sha1-CKfyqL9zRgR3mp76StXMcXq7lUs=",
 | 
			
		||||
      "optional": true,
 | 
			
		||||
      "requires": {
 | 
			
		||||
        "are-we-there-yet": "1.1.4",
 | 
			
		||||
@@ -2479,22 +2274,12 @@
 | 
			
		||||
        "wrappy": "1.0.2"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "os-browserify": {
 | 
			
		||||
      "version": "0.1.2",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.1.2.tgz",
 | 
			
		||||
      "integrity": "sha1-ScoCk+CxlZCl9d4Qx/JlphfY/lQ="
 | 
			
		||||
    },
 | 
			
		||||
    "os-homedir": {
 | 
			
		||||
      "version": "1.0.2",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
 | 
			
		||||
      "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=",
 | 
			
		||||
      "optional": true
 | 
			
		||||
    },
 | 
			
		||||
    "pako": {
 | 
			
		||||
      "version": "0.2.9",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz",
 | 
			
		||||
      "integrity": "sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU="
 | 
			
		||||
    },
 | 
			
		||||
    "parents": {
 | 
			
		||||
      "version": "1.0.1",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/parents/-/parents-1.0.1.tgz",
 | 
			
		||||
@@ -2606,65 +2391,12 @@
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
 | 
			
		||||
      "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns="
 | 
			
		||||
    },
 | 
			
		||||
    "pngjs": {
 | 
			
		||||
      "version": "3.3.3",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-3.3.3.tgz",
 | 
			
		||||
      "integrity": "sha512-1n3Z4p3IOxArEs1VRXnZ/RXdfEniAUS9jb68g58FIXMNkPJeZd+Qh4Uq7/e0LVxAQGos1eIUrqrt4FpjdnEd+Q=="
 | 
			
		||||
    },
 | 
			
		||||
    "pointer-symbol": {
 | 
			
		||||
      "version": "1.0.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/pointer-symbol/-/pointer-symbol-1.0.0.tgz",
 | 
			
		||||
      "integrity": "sha1-YPkRAgTqepKbYmRKITFVQ8uz1Ec=",
 | 
			
		||||
      "optional": true
 | 
			
		||||
    },
 | 
			
		||||
    "postcss": {
 | 
			
		||||
      "version": "6.0.13",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.13.tgz",
 | 
			
		||||
      "integrity": "sha512-nHsrD1PPTMSJDfU+osVsLtPkSP9YGeoOz4FDLN4r1DW4N5vqL1J+gACzTQHsfwIiWG/0/nV4yCzjTMo1zD8U1g==",
 | 
			
		||||
      "requires": {
 | 
			
		||||
        "chalk": "2.3.0",
 | 
			
		||||
        "source-map": "0.6.1",
 | 
			
		||||
        "supports-color": "4.5.0"
 | 
			
		||||
      },
 | 
			
		||||
      "dependencies": {
 | 
			
		||||
        "ansi-styles": {
 | 
			
		||||
          "version": "3.2.0",
 | 
			
		||||
          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz",
 | 
			
		||||
          "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==",
 | 
			
		||||
          "requires": {
 | 
			
		||||
            "color-convert": "1.9.0"
 | 
			
		||||
          }
 | 
			
		||||
        },
 | 
			
		||||
        "chalk": {
 | 
			
		||||
          "version": "2.3.0",
 | 
			
		||||
          "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz",
 | 
			
		||||
          "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==",
 | 
			
		||||
          "requires": {
 | 
			
		||||
            "ansi-styles": "3.2.0",
 | 
			
		||||
            "escape-string-regexp": "1.0.5",
 | 
			
		||||
            "supports-color": "4.5.0"
 | 
			
		||||
          }
 | 
			
		||||
        },
 | 
			
		||||
        "has-flag": {
 | 
			
		||||
          "version": "2.0.0",
 | 
			
		||||
          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz",
 | 
			
		||||
          "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE="
 | 
			
		||||
        },
 | 
			
		||||
        "source-map": {
 | 
			
		||||
          "version": "0.6.1",
 | 
			
		||||
          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
 | 
			
		||||
          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
 | 
			
		||||
        },
 | 
			
		||||
        "supports-color": {
 | 
			
		||||
          "version": "4.5.0",
 | 
			
		||||
          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz",
 | 
			
		||||
          "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=",
 | 
			
		||||
          "requires": {
 | 
			
		||||
            "has-flag": "2.0.0"
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "postcss-calc": {
 | 
			
		||||
      "version": "5.3.1",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-5.3.1.tgz",
 | 
			
		||||
@@ -3302,7 +3034,6 @@
 | 
			
		||||
      "version": "7.3.1",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz",
 | 
			
		||||
      "integrity": "sha1-BktyYCsY+Q8pGSuLG8QY/9Hr078=",
 | 
			
		||||
      "dev": true,
 | 
			
		||||
      "optional": true,
 | 
			
		||||
      "requires": {
 | 
			
		||||
        "asap": "2.0.6"
 | 
			
		||||
@@ -3469,7 +3200,6 @@
 | 
			
		||||
      "version": "0.0.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/prr/-/prr-0.0.0.tgz",
 | 
			
		||||
      "integrity": "sha1-GoS4WQgyVQFBGFPQCB7j+obikmo=",
 | 
			
		||||
      "dev": true,
 | 
			
		||||
      "optional": true
 | 
			
		||||
    },
 | 
			
		||||
    "public-encrypt": {
 | 
			
		||||
@@ -3499,27 +3229,284 @@
 | 
			
		||||
      "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4="
 | 
			
		||||
    },
 | 
			
		||||
    "pxt-core": {
 | 
			
		||||
      "version": "3.10.16",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/pxt-core/-/pxt-core-3.10.16.tgz",
 | 
			
		||||
      "integrity": "sha512-QsvI6Q68Pfn99/yoQDKpOLvG0/Ldb+f1MQoTpQ3JyNGC1vuqLI1WA8sbrxT2SGbtreEGV71DHL4Lws++QEdI1Q==",
 | 
			
		||||
      "version": "3.14.9",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/pxt-core/-/pxt-core-3.14.9.tgz",
 | 
			
		||||
      "integrity": "sha512-tjEmH8Rs5BkawzAx3DBaC0pU30iuAZ/91c7M/1vqNAjm/PZ8pu/PVKJN3b4giWJpFQFp6po8hWQ9bfHl9BDHcw==",
 | 
			
		||||
      "requires": {
 | 
			
		||||
        "bluebird": "3.5.1",
 | 
			
		||||
        "browserify": "13.3.0",
 | 
			
		||||
        "browserify": "16.2.0",
 | 
			
		||||
        "cssnano": "3.10.0",
 | 
			
		||||
        "faye-websocket": "0.11.1",
 | 
			
		||||
        "fuse.js": "2.6.1",
 | 
			
		||||
        "highlight.js": "9.12.0",
 | 
			
		||||
        "keytar": "4.2.1",
 | 
			
		||||
        "less": "2.7.3",
 | 
			
		||||
        "lzma": "2.3.2",
 | 
			
		||||
        "marked": "0.3.12",
 | 
			
		||||
        "marked": "0.3.19",
 | 
			
		||||
        "node-hid": "0.5.7",
 | 
			
		||||
        "pngjs": "3.3.3",
 | 
			
		||||
        "postcss": "6.0.13",
 | 
			
		||||
        "request": "2.83.0",
 | 
			
		||||
        "pngjs": "3.3.2",
 | 
			
		||||
        "postcss": "6.0.21",
 | 
			
		||||
        "request": "2.85.0",
 | 
			
		||||
        "rimraf": "2.5.4",
 | 
			
		||||
        "rtlcss": "2.2.0",
 | 
			
		||||
        "rtlcss": "2.2.1",
 | 
			
		||||
        "semantic-ui-less": "2.2.14",
 | 
			
		||||
        "serialport": "6.2.0",
 | 
			
		||||
        "uglify-js": "3.3.21"
 | 
			
		||||
      },
 | 
			
		||||
      "dependencies": {
 | 
			
		||||
        "ansi-styles": {
 | 
			
		||||
          "version": "3.2.1",
 | 
			
		||||
          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
 | 
			
		||||
          "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
 | 
			
		||||
          "requires": {
 | 
			
		||||
            "color-convert": "1.9.0"
 | 
			
		||||
          }
 | 
			
		||||
        },
 | 
			
		||||
        "browserify": {
 | 
			
		||||
          "version": "16.2.0",
 | 
			
		||||
          "resolved": "https://registry.npmjs.org/browserify/-/browserify-16.2.0.tgz",
 | 
			
		||||
          "integrity": "sha512-yotdAkp/ZbgDesHQBYU37zjc29JDH4iXT8hjzM1fdUVWogjARX0S1cKeX24Ci6zZ+jG+ADmCTRt6xvtmJnI+BQ==",
 | 
			
		||||
          "requires": {
 | 
			
		||||
            "JSONStream": "1.3.2",
 | 
			
		||||
            "assert": "1.4.1",
 | 
			
		||||
            "browser-pack": "6.1.0",
 | 
			
		||||
            "browser-resolve": "1.11.2",
 | 
			
		||||
            "browserify-zlib": "0.2.0",
 | 
			
		||||
            "buffer": "5.1.0",
 | 
			
		||||
            "cached-path-relative": "1.0.1",
 | 
			
		||||
            "concat-stream": "1.6.2",
 | 
			
		||||
            "console-browserify": "1.1.0",
 | 
			
		||||
            "constants-browserify": "1.0.0",
 | 
			
		||||
            "crypto-browserify": "3.12.0",
 | 
			
		||||
            "defined": "1.0.0",
 | 
			
		||||
            "deps-sort": "2.0.0",
 | 
			
		||||
            "domain-browser": "1.2.0",
 | 
			
		||||
            "duplexer2": "0.1.4",
 | 
			
		||||
            "events": "2.0.0",
 | 
			
		||||
            "glob": "7.1.2",
 | 
			
		||||
            "has": "1.0.1",
 | 
			
		||||
            "htmlescape": "1.1.1",
 | 
			
		||||
            "https-browserify": "1.0.0",
 | 
			
		||||
            "inherits": "2.0.3",
 | 
			
		||||
            "insert-module-globals": "7.0.6",
 | 
			
		||||
            "labeled-stream-splicer": "2.0.1",
 | 
			
		||||
            "mkdirp": "0.5.1",
 | 
			
		||||
            "module-deps": "6.1.0",
 | 
			
		||||
            "os-browserify": "0.3.0",
 | 
			
		||||
            "parents": "1.0.1",
 | 
			
		||||
            "path-browserify": "0.0.0",
 | 
			
		||||
            "process": "0.11.10",
 | 
			
		||||
            "punycode": "1.4.1",
 | 
			
		||||
            "querystring-es3": "0.2.1",
 | 
			
		||||
            "read-only-stream": "2.0.0",
 | 
			
		||||
            "readable-stream": "2.3.3",
 | 
			
		||||
            "resolve": "1.7.1",
 | 
			
		||||
            "shasum": "1.0.2",
 | 
			
		||||
            "shell-quote": "1.6.1",
 | 
			
		||||
            "stream-browserify": "2.0.1",
 | 
			
		||||
            "stream-http": "2.8.1",
 | 
			
		||||
            "string_decoder": "1.1.1",
 | 
			
		||||
            "subarg": "1.0.0",
 | 
			
		||||
            "syntax-error": "1.4.0",
 | 
			
		||||
            "through2": "2.0.3",
 | 
			
		||||
            "timers-browserify": "1.4.2",
 | 
			
		||||
            "tty-browserify": "0.0.1",
 | 
			
		||||
            "url": "0.11.0",
 | 
			
		||||
            "util": "0.10.3",
 | 
			
		||||
            "vm-browserify": "1.0.1",
 | 
			
		||||
            "xtend": "4.0.1"
 | 
			
		||||
          }
 | 
			
		||||
        },
 | 
			
		||||
        "browserify-zlib": {
 | 
			
		||||
          "version": "0.2.0",
 | 
			
		||||
          "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz",
 | 
			
		||||
          "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==",
 | 
			
		||||
          "requires": {
 | 
			
		||||
            "pako": "1.0.6"
 | 
			
		||||
          }
 | 
			
		||||
        },
 | 
			
		||||
        "buffer": {
 | 
			
		||||
          "version": "5.1.0",
 | 
			
		||||
          "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.1.0.tgz",
 | 
			
		||||
          "integrity": "sha512-YkIRgwsZwJWTnyQrsBTWefizHh+8GYj3kbL1BTiAQ/9pwpino0G7B2gp5tx/FUBqUlvtxV85KNR3mwfAtv15Yw==",
 | 
			
		||||
          "requires": {
 | 
			
		||||
            "base64-js": "1.3.0",
 | 
			
		||||
            "ieee754": "1.1.11"
 | 
			
		||||
          }
 | 
			
		||||
        },
 | 
			
		||||
        "chalk": {
 | 
			
		||||
          "version": "2.4.1",
 | 
			
		||||
          "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz",
 | 
			
		||||
          "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==",
 | 
			
		||||
          "requires": {
 | 
			
		||||
            "ansi-styles": "3.2.1",
 | 
			
		||||
            "escape-string-regexp": "1.0.5",
 | 
			
		||||
            "supports-color": "5.4.0"
 | 
			
		||||
          }
 | 
			
		||||
        },
 | 
			
		||||
        "concat-stream": {
 | 
			
		||||
          "version": "1.6.2",
 | 
			
		||||
          "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
 | 
			
		||||
          "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
 | 
			
		||||
          "requires": {
 | 
			
		||||
            "buffer-from": "1.0.0",
 | 
			
		||||
            "inherits": "2.0.3",
 | 
			
		||||
            "readable-stream": "2.3.3",
 | 
			
		||||
            "typedarray": "0.0.6"
 | 
			
		||||
          }
 | 
			
		||||
        },
 | 
			
		||||
        "detective": {
 | 
			
		||||
          "version": "5.1.0",
 | 
			
		||||
          "resolved": "https://registry.npmjs.org/detective/-/detective-5.1.0.tgz",
 | 
			
		||||
          "integrity": "sha512-TFHMqfOvxlgrfVzTEkNBSh9SvSNX/HfF4OFI2QFGCyPm02EsyILqnUeb5P6q7JZ3SFNTBL5t2sePRgrN4epUWQ==",
 | 
			
		||||
          "requires": {
 | 
			
		||||
            "acorn-node": "1.3.0",
 | 
			
		||||
            "defined": "1.0.0",
 | 
			
		||||
            "minimist": "1.2.0"
 | 
			
		||||
          }
 | 
			
		||||
        },
 | 
			
		||||
        "domain-browser": {
 | 
			
		||||
          "version": "1.2.0",
 | 
			
		||||
          "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz",
 | 
			
		||||
          "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA=="
 | 
			
		||||
        },
 | 
			
		||||
        "events": {
 | 
			
		||||
          "version": "2.0.0",
 | 
			
		||||
          "resolved": "https://registry.npmjs.org/events/-/events-2.0.0.tgz",
 | 
			
		||||
          "integrity": "sha512-r/M5YkNg9zwI8QbSf7tsDWWJvO3PGwZXyG7GpFAxtMASnHL2eblFd7iHiGPtyGKKFPZ59S63NeX10Ws6WqGDcg=="
 | 
			
		||||
        },
 | 
			
		||||
        "has-flag": {
 | 
			
		||||
          "version": "3.0.0",
 | 
			
		||||
          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
 | 
			
		||||
          "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0="
 | 
			
		||||
        },
 | 
			
		||||
        "https-browserify": {
 | 
			
		||||
          "version": "1.0.0",
 | 
			
		||||
          "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz",
 | 
			
		||||
          "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM="
 | 
			
		||||
        },
 | 
			
		||||
        "marked": {
 | 
			
		||||
          "version": "0.3.19",
 | 
			
		||||
          "resolved": "https://registry.npmjs.org/marked/-/marked-0.3.19.tgz",
 | 
			
		||||
          "integrity": "sha512-ea2eGWOqNxPcXv8dyERdSr/6FmzvWwzjMxpfGB/sbMccXoct+xY+YukPD+QTUZwyvK7BZwcr4m21WBOW41pAkg=="
 | 
			
		||||
        },
 | 
			
		||||
        "minimist": {
 | 
			
		||||
          "version": "1.2.0",
 | 
			
		||||
          "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
 | 
			
		||||
          "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ="
 | 
			
		||||
        },
 | 
			
		||||
        "module-deps": {
 | 
			
		||||
          "version": "6.1.0",
 | 
			
		||||
          "resolved": "https://registry.npmjs.org/module-deps/-/module-deps-6.1.0.tgz",
 | 
			
		||||
          "integrity": "sha512-NPs5N511VD1rrVJihSso/LiBShRbJALYBKzDW91uZYy7BpjnO4bGnZL3HjZ9yKcFdZUWwaYjDz9zxbuP7vKMuQ==",
 | 
			
		||||
          "requires": {
 | 
			
		||||
            "JSONStream": "1.3.2",
 | 
			
		||||
            "browser-resolve": "1.11.2",
 | 
			
		||||
            "cached-path-relative": "1.0.1",
 | 
			
		||||
            "concat-stream": "1.6.2",
 | 
			
		||||
            "defined": "1.0.0",
 | 
			
		||||
            "detective": "5.1.0",
 | 
			
		||||
            "duplexer2": "0.1.4",
 | 
			
		||||
            "inherits": "2.0.3",
 | 
			
		||||
            "parents": "1.0.1",
 | 
			
		||||
            "readable-stream": "2.3.3",
 | 
			
		||||
            "resolve": "1.7.1",
 | 
			
		||||
            "stream-combiner2": "1.1.1",
 | 
			
		||||
            "subarg": "1.0.0",
 | 
			
		||||
            "through2": "2.0.3",
 | 
			
		||||
            "xtend": "4.0.1"
 | 
			
		||||
          }
 | 
			
		||||
        },
 | 
			
		||||
        "os-browserify": {
 | 
			
		||||
          "version": "0.3.0",
 | 
			
		||||
          "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz",
 | 
			
		||||
          "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc="
 | 
			
		||||
        },
 | 
			
		||||
        "pako": {
 | 
			
		||||
          "version": "1.0.6",
 | 
			
		||||
          "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.6.tgz",
 | 
			
		||||
          "integrity": "sha512-lQe48YPsMJAig+yngZ87Lus+NF+3mtu7DVOBu6b/gHO1YpKwIj5AWjZ/TOS7i46HD/UixzWb1zeWDZfGZ3iYcg=="
 | 
			
		||||
        },
 | 
			
		||||
        "pngjs": {
 | 
			
		||||
          "version": "3.3.2",
 | 
			
		||||
          "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-3.3.2.tgz",
 | 
			
		||||
          "integrity": "sha512-bVNd3LMXRzdo6s4ehr4XW2wFMu9cb40nPgHEjSSppm8/++Xc+g0b2QQb+SeDesgfANXbjydOr1or9YQ+pcCZPQ=="
 | 
			
		||||
        },
 | 
			
		||||
        "postcss": {
 | 
			
		||||
          "version": "6.0.21",
 | 
			
		||||
          "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.21.tgz",
 | 
			
		||||
          "integrity": "sha512-y/bKfbQz2Nn/QBC08bwvYUxEFOVGfPIUOTsJ2CK5inzlXW9SdYR1x4pEsG9blRAF/PX+wRNdOah+gx/hv4q7dw==",
 | 
			
		||||
          "requires": {
 | 
			
		||||
            "chalk": "2.4.1",
 | 
			
		||||
            "source-map": "0.6.1",
 | 
			
		||||
            "supports-color": "5.4.0"
 | 
			
		||||
          }
 | 
			
		||||
        },
 | 
			
		||||
        "request": {
 | 
			
		||||
          "version": "2.85.0",
 | 
			
		||||
          "resolved": "https://registry.npmjs.org/request/-/request-2.85.0.tgz",
 | 
			
		||||
          "integrity": "sha512-8H7Ehijd4js+s6wuVPLjwORxD4zeuyjYugprdOXlPSqaApmL/QOy+EB/beICHVCHkGMKNh5rvihb5ov+IDw4mg==",
 | 
			
		||||
          "requires": {
 | 
			
		||||
            "aws-sign2": "0.7.0",
 | 
			
		||||
            "aws4": "1.6.0",
 | 
			
		||||
            "caseless": "0.12.0",
 | 
			
		||||
            "combined-stream": "1.0.5",
 | 
			
		||||
            "extend": "3.0.1",
 | 
			
		||||
            "forever-agent": "0.6.1",
 | 
			
		||||
            "form-data": "2.3.1",
 | 
			
		||||
            "har-validator": "5.0.3",
 | 
			
		||||
            "hawk": "6.0.2",
 | 
			
		||||
            "http-signature": "1.2.0",
 | 
			
		||||
            "is-typedarray": "1.0.0",
 | 
			
		||||
            "isstream": "0.1.2",
 | 
			
		||||
            "json-stringify-safe": "5.0.1",
 | 
			
		||||
            "mime-types": "2.1.17",
 | 
			
		||||
            "oauth-sign": "0.8.2",
 | 
			
		||||
            "performance-now": "2.1.0",
 | 
			
		||||
            "qs": "6.5.1",
 | 
			
		||||
            "safe-buffer": "5.1.1",
 | 
			
		||||
            "stringstream": "0.0.5",
 | 
			
		||||
            "tough-cookie": "2.3.3",
 | 
			
		||||
            "tunnel-agent": "0.6.0",
 | 
			
		||||
            "uuid": "3.1.0"
 | 
			
		||||
          }
 | 
			
		||||
        },
 | 
			
		||||
        "rtlcss": {
 | 
			
		||||
          "version": "2.2.1",
 | 
			
		||||
          "resolved": "https://registry.npmjs.org/rtlcss/-/rtlcss-2.2.1.tgz",
 | 
			
		||||
          "integrity": "sha512-JjQ5DlrmwiItAjlmhoxrJq5ihgZcE0wMFxt7S17bIrt4Lw0WwKKFk+viRhvodB/0falyG/5fiO043ZDh6/aqTw==",
 | 
			
		||||
          "requires": {
 | 
			
		||||
            "chalk": "2.4.1",
 | 
			
		||||
            "findup": "0.1.5",
 | 
			
		||||
            "mkdirp": "0.5.1",
 | 
			
		||||
            "postcss": "6.0.21",
 | 
			
		||||
            "strip-json-comments": "2.0.1"
 | 
			
		||||
          }
 | 
			
		||||
        },
 | 
			
		||||
        "source-map": {
 | 
			
		||||
          "version": "0.6.1",
 | 
			
		||||
          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
 | 
			
		||||
          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
 | 
			
		||||
        },
 | 
			
		||||
        "string_decoder": {
 | 
			
		||||
          "version": "1.1.1",
 | 
			
		||||
          "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
 | 
			
		||||
          "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
 | 
			
		||||
          "requires": {
 | 
			
		||||
            "safe-buffer": "5.1.1"
 | 
			
		||||
          }
 | 
			
		||||
        },
 | 
			
		||||
        "supports-color": {
 | 
			
		||||
          "version": "5.4.0",
 | 
			
		||||
          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz",
 | 
			
		||||
          "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==",
 | 
			
		||||
          "requires": {
 | 
			
		||||
            "has-flag": "3.0.0"
 | 
			
		||||
          }
 | 
			
		||||
        },
 | 
			
		||||
        "vm-browserify": {
 | 
			
		||||
          "version": "1.0.1",
 | 
			
		||||
          "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.0.1.tgz",
 | 
			
		||||
          "integrity": "sha512-EqzLchIMYLBjRPoqVsEkZOa/4Vr2RfOWbd58F+I/Gj79AYTrsseMunxbbSkbYfrqZaXSuPBBXNSOhtJgg0PpmA=="
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "q": {
 | 
			
		||||
@@ -3610,7 +3597,7 @@
 | 
			
		||||
    "readable-stream": {
 | 
			
		||||
      "version": "2.3.3",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz",
 | 
			
		||||
      "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==",
 | 
			
		||||
      "integrity": "sha1-No8lEtefnUb9/HE0mueHi7weuVw=",
 | 
			
		||||
      "requires": {
 | 
			
		||||
        "core-util-is": "1.0.2",
 | 
			
		||||
        "inherits": "2.0.3",
 | 
			
		||||
@@ -3700,35 +3687,6 @@
 | 
			
		||||
        "balanced-match": "0.4.2"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "request": {
 | 
			
		||||
      "version": "2.83.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/request/-/request-2.83.0.tgz",
 | 
			
		||||
      "integrity": "sha512-lR3gD69osqm6EYLk9wB/G1W/laGWjzH90t1vEa2xuxHD5KUrSzp9pUSfTm+YC5Nxt2T8nMPEvKlhbQayU7bgFw==",
 | 
			
		||||
      "requires": {
 | 
			
		||||
        "aws-sign2": "0.7.0",
 | 
			
		||||
        "aws4": "1.6.0",
 | 
			
		||||
        "caseless": "0.12.0",
 | 
			
		||||
        "combined-stream": "1.0.5",
 | 
			
		||||
        "extend": "3.0.1",
 | 
			
		||||
        "forever-agent": "0.6.1",
 | 
			
		||||
        "form-data": "2.3.1",
 | 
			
		||||
        "har-validator": "5.0.3",
 | 
			
		||||
        "hawk": "6.0.2",
 | 
			
		||||
        "http-signature": "1.2.0",
 | 
			
		||||
        "is-typedarray": "1.0.0",
 | 
			
		||||
        "isstream": "0.1.2",
 | 
			
		||||
        "json-stringify-safe": "5.0.1",
 | 
			
		||||
        "mime-types": "2.1.17",
 | 
			
		||||
        "oauth-sign": "0.8.2",
 | 
			
		||||
        "performance-now": "2.1.0",
 | 
			
		||||
        "qs": "6.5.1",
 | 
			
		||||
        "safe-buffer": "5.1.1",
 | 
			
		||||
        "stringstream": "0.0.5",
 | 
			
		||||
        "tough-cookie": "2.3.3",
 | 
			
		||||
        "tunnel-agent": "0.6.0",
 | 
			
		||||
        "uuid": "3.1.0"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "resolve": {
 | 
			
		||||
      "version": "1.7.1",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.7.1.tgz",
 | 
			
		||||
@@ -3754,18 +3712,6 @@
 | 
			
		||||
        "inherits": "2.0.3"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "rtlcss": {
 | 
			
		||||
      "version": "2.2.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/rtlcss/-/rtlcss-2.2.0.tgz",
 | 
			
		||||
      "integrity": "sha1-E0QVJU0MJrXEA+Lq0sG4v0/AAN0=",
 | 
			
		||||
      "requires": {
 | 
			
		||||
        "chalk": "1.1.3",
 | 
			
		||||
        "findup": "0.1.5",
 | 
			
		||||
        "mkdirp": "0.5.1",
 | 
			
		||||
        "postcss": "6.0.13",
 | 
			
		||||
        "strip-json-comments": "2.0.1"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "safe-buffer": {
 | 
			
		||||
      "version": "5.1.1",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz",
 | 
			
		||||
@@ -3774,13 +3720,12 @@
 | 
			
		||||
    "sax": {
 | 
			
		||||
      "version": "1.2.4",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
 | 
			
		||||
      "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw=="
 | 
			
		||||
      "integrity": "sha1-KBYjTiN4vdxOU1T6tcqold9xANk="
 | 
			
		||||
    },
 | 
			
		||||
    "semantic-ui-less": {
 | 
			
		||||
      "version": "2.2.14",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/semantic-ui-less/-/semantic-ui-less-2.2.14.tgz",
 | 
			
		||||
      "integrity": "sha512-JLkTqjOtct+OwM/JRv0SH76gCC0eE98xp5G4D29e9VbJ66QjWD3nB3waB7drpaMUFXo/YbKcyNOJBgMamcJI0Q==",
 | 
			
		||||
      "dev": true,
 | 
			
		||||
      "requires": {
 | 
			
		||||
        "jquery": "3.2.1"
 | 
			
		||||
      }
 | 
			
		||||
@@ -4141,7 +4086,7 @@
 | 
			
		||||
    "string_decoder": {
 | 
			
		||||
      "version": "1.0.3",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz",
 | 
			
		||||
      "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==",
 | 
			
		||||
      "integrity": "sha1-D8Z9fBQYJd6UKC3VNr7GubzoYKs=",
 | 
			
		||||
      "requires": {
 | 
			
		||||
        "safe-buffer": "5.1.1"
 | 
			
		||||
      }
 | 
			
		||||
@@ -4447,14 +4392,6 @@
 | 
			
		||||
        "extsprintf": "1.3.0"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "vm-browserify": {
 | 
			
		||||
      "version": "0.0.4",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz",
 | 
			
		||||
      "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=",
 | 
			
		||||
      "requires": {
 | 
			
		||||
        "indexof": "0.0.1"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "warning-symbol": {
 | 
			
		||||
      "version": "0.1.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/warning-symbol/-/warning-symbol-0.1.0.tgz",
 | 
			
		||||
@@ -4482,7 +4419,7 @@
 | 
			
		||||
    "wide-align": {
 | 
			
		||||
      "version": "1.1.2",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.2.tgz",
 | 
			
		||||
      "integrity": "sha512-ijDLlyQ7s6x1JgCLur53osjm/UXUYD9+0PbYKrBsYisYXzCxN+HC3mYDNy/dWdmf3AwqwU3CXwDCvsNgGK1S0w==",
 | 
			
		||||
      "integrity": "sha1-Vx4PGwYEY268DfwhsDObvjE0FxA=",
 | 
			
		||||
      "optional": true,
 | 
			
		||||
      "requires": {
 | 
			
		||||
        "string-width": "1.0.2"
 | 
			
		||||
 
 | 
			
		||||
@@ -31,8 +31,6 @@
 | 
			
		||||
    "docs/static/*.png",
 | 
			
		||||
    "docs/static/icons/favicon.ico"
 | 
			
		||||
  ],
 | 
			
		||||
  "main": "built/pxtrequire.js",
 | 
			
		||||
  "typings": "built/pxtrequire.d.ts",
 | 
			
		||||
  "devDependencies": {
 | 
			
		||||
    "typescript": "2.6.1",
 | 
			
		||||
    "less": "2.7.3",
 | 
			
		||||
@@ -43,6 +41,6 @@
 | 
			
		||||
    "@types/node": "8.0.53"
 | 
			
		||||
  },
 | 
			
		||||
  "dependencies": {
 | 
			
		||||
    "pxt-core": "3.14.9"
 | 
			
		||||
    "pxt-core": "3.15.1"
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,203 +0,0 @@
 | 
			
		||||
<!doctype html>
 | 
			
		||||
<html lang="en" data-framework="typescript">
 | 
			
		||||
 | 
			
		||||
<head>
 | 
			
		||||
    <meta charset="utf-8">
 | 
			
		||||
    <title>Assembly Instructions</title>
 | 
			
		||||
    <style>
 | 
			
		||||
        
 | 
			
		||||
        svg {
 | 
			
		||||
            max-width: 100%;
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
        .blocklyText, .ace_editor {
 | 
			
		||||
            font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', 'Consolas', 'source-code-pro', monospace !important;
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
        .blocklyText, .ace_editor {
 | 
			
		||||
            font-size: 1rem !important;
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
        .blocklyTreeLabel {
 | 
			
		||||
            font-size: 1.25rem !important;
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
        .blocklyCheckbox {
 | 
			
		||||
            fill: #ff3030 !important;
 | 
			
		||||
            text-shadow: 0px 0px 6px #f00;
 | 
			
		||||
            font-size: 17pt !important;
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
        .ui.card .blocklyPreview {
 | 
			
		||||
            position: absolute;
 | 
			
		||||
            top: 50%;
 | 
			
		||||
            left: 50%;
 | 
			
		||||
            transform: translate(-50%, -50%);
 | 
			
		||||
            width: calc(100% - 1em);
 | 
			
		||||
            max-height: calc(100% - 1em);
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
        code {
 | 
			
		||||
            white-space: pre-wrap;
 | 
			
		||||
        }
 | 
			
		||||
        code.lang-config, code.lang-package { display:none; }
 | 
			
		||||
 | 
			
		||||
        code.lang-blocks::before,
 | 
			
		||||
        code.lang-sig::before,
 | 
			
		||||
        code.lang-block::before,
 | 
			
		||||
        code.lang-shuffle::before,
 | 
			
		||||
        code.lang-sim::before,
 | 
			
		||||
        code.lang-cards::before,
 | 
			
		||||
        code.lang-namespaces::before,
 | 
			
		||||
        code.lang-codecard::before {
 | 
			
		||||
            content: "...";
 | 
			
		||||
            position: absolute;
 | 
			
		||||
            top: calc(50% - 0.5em);
 | 
			
		||||
            left: calc(50% - 5em);
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
        code.lang-blocks,
 | 
			
		||||
        code.lang-sig,
 | 
			
		||||
        code.lang-block,
 | 
			
		||||
        code.lang-shuffle,
 | 
			
		||||
        code.lang-sim,
 | 
			
		||||
        code.lang-cards,
 | 
			
		||||
        code.lang-namespaces,
 | 
			
		||||
        code.lang-codecard {
 | 
			
		||||
            color: transparent;
 | 
			
		||||
        }
 | 
			
		||||
    </style>
 | 
			
		||||
    <style type="text/css">
 | 
			
		||||
        @import "/cdn/semantic.css";
 | 
			
		||||
        @import "/cdn/icons.css";
 | 
			
		||||
    </style>
 | 
			
		||||
    <style>
 | 
			
		||||
        html {
 | 
			
		||||
            padding: 0;
 | 
			
		||||
            margin: 0;
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
        body {
 | 
			
		||||
            padding: 0;
 | 
			
		||||
            margin: 0;
 | 
			
		||||
            font-family: "Lucida Console", Monaco, monospace;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        div {
 | 
			
		||||
            /*undo semantic UI*/
 | 
			
		||||
            box-sizing: content-box;
 | 
			
		||||
            line-height: normal;
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
        img {
 | 
			
		||||
            border: 0;
 | 
			
		||||
        }
 | 
			
		||||
        /*TODO: Share CSS with main webpage*/
 | 
			
		||||
        
 | 
			
		||||
        .organization {
 | 
			
		||||
            position: absolute;
 | 
			
		||||
            bottom: 2rem;
 | 
			
		||||
            right: 2rem;
 | 
			
		||||
            height: 4rem;
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
        h1 {
 | 
			
		||||
            font-size: 2em;
 | 
			
		||||
            font-weight: normal;
 | 
			
		||||
            color: rgba(0, 0, 0, 0.87);
 | 
			
		||||
            font-family: 'Segoe UI', 'Helvetica Neue', Arial, Helvetica, sans-serif;
 | 
			
		||||
            display: block;
 | 
			
		||||
            text-align: center;
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
        #front-panel .board-svg {
 | 
			
		||||
            position: absolute;
 | 
			
		||||
            left: 2rem;
 | 
			
		||||
            width: 300px;
 | 
			
		||||
            top: 16rem;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        #proj-title {
 | 
			
		||||
            width: 100%;
 | 
			
		||||
            font-size: 70px;
 | 
			
		||||
            margin-top: 20px;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        #proj-code {
 | 
			
		||||
            width: 300px;
 | 
			
		||||
            height: 400px;
 | 
			
		||||
            position: absolute;
 | 
			
		||||
            right: 2rem;
 | 
			
		||||
            top: 16rem;
 | 
			
		||||
        }
 | 
			
		||||
        #proj-code-container {
 | 
			
		||||
            width: 100%;
 | 
			
		||||
            height: 100%;
 | 
			
		||||
            font-size: 4px;
 | 
			
		||||
            overflow: hidden;
 | 
			
		||||
            display: none;
 | 
			
		||||
        }
 | 
			
		||||
        #proj-code-spinner {
 | 
			
		||||
            width: 100%;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        .back-panel svg {
 | 
			
		||||
            position: relative;
 | 
			
		||||
            margin: 0 auto;
 | 
			
		||||
            left: inherit;
 | 
			
		||||
            bottom: -7px;
 | 
			
		||||
        }
 | 
			
		||||
    </style>
 | 
			
		||||
</head>
 | 
			
		||||
<body>
 | 
			
		||||
    <div id='loading' class="ui active inverted dimmer">
 | 
			
		||||
        <div class="ui large loader"></div>
 | 
			
		||||
    </div>
 | 
			
		||||
<!-- start Mixpanel --><script type="text/javascript">(function(e,b){if(!b.__SV){var a,f,i,g;window.mixpanel=b;b._i=[];b.init=function(a,e,d){function f(b,h){var a=h.split(".");2==a.length&&(b=b[a[0]],h=a[1]);b[h]=function(){b.push([h].concat(Array.prototype.slice.call(arguments,0)))}}var c=b;"undefined"!==typeof d?c=b[d]=[]:d="mixpanel";c.people=c.people||[];c.toString=function(b){var a="mixpanel";"mixpanel"!==d&&(a+="."+d);b||(a+=" (stub)");return a};c.people.toString=function(){return c.toString(1)+".people (stub)"};i="disable time_event track track_pageview track_links track_forms register register_once alias unregister identify name_tag set_config reset people.set people.set_once people.increment people.append people.union people.track_charge people.clear_charges people.delete_user".split(" ");
 | 
			
		||||
for(g=0;g<i.length;g++)f(c,i[g]);b._i.push([a,e,d])};b.__SV=1.2;a=e.createElement("script");a.type="text/javascript";a.async=!0;a.src="undefined"!==typeof MIXPANEL_CUSTOM_LIB_URL?MIXPANEL_CUSTOM_LIB_URL:"file:"===e.location.protocol&&"//cdn.mxpnl.com/libs/mixpanel-2-latest.min.js".match(/^\/\//)?"https://cdn.mxpnl.com/libs/mixpanel-2-latest.min.js":"//cdn.mxpnl.com/libs/mixpanel-2-latest.min.js";f=e.getElementsByTagName("script")[0];f.parentNode.insertBefore(a,f)}})(document,window.mixpanel||[]);
 | 
			
		||||
mixpanel.init("762fef19c053a0ea4cec43d2fecae76e");</script><!-- end Mixpanel -->    
 | 
			
		||||
    <script>
 | 
			
		||||
        // This line gets patched up by the cloud
 | 
			
		||||
        var pxtConfig = null;
 | 
			
		||||
    </script>
 | 
			
		||||
    <script type="text/javascript" src="/cdn/lzma/lzma_worker-min.js"></script>
 | 
			
		||||
    <script type="text/javascript" src="/cdn/marked/marked.min.js"></script>
 | 
			
		||||
    <script type="text/javascript" src="/cdn/jquery.js"></script>
 | 
			
		||||
    <script type="text/javascript" src="/cdn/typescript.js"></script>
 | 
			
		||||
    <script type="text/javascript" src="/cdn/blockly/blockly_compressed.js"></script>
 | 
			
		||||
    <script type="text/javascript" src="/cdn/blockly/blocks_compressed.js"></script>
 | 
			
		||||
    <script type="text/javascript" src="/cdn/blockly/msg/js/en.js"></script>
 | 
			
		||||
    <script type="text/javascript" src="/cdn/pxtlib.js"></script>
 | 
			
		||||
    <script type="text/javascript" src="/cdn/pxtblocks.js"></script>
 | 
			
		||||
    <script type="text/javascript" src="/cdn/pxtsim.js"></script>
 | 
			
		||||
    <script type="text/javascript" src="/cdn/pxtrunner.js"></script>
 | 
			
		||||
    <script type="text/javascript" src="/cdn/semantic.js"></script>
 | 
			
		||||
    <script type="text/javascript" src="/embed.js"></script>
 | 
			
		||||
    <script type="text/javascript" src="/sim/sim.js"></script>
 | 
			
		||||
    <script type="text/javascript">
 | 
			
		||||
        (function () {  
 | 
			
		||||
        ksRunnerReady(function() {
 | 
			
		||||
            var orgLogo = pxt.appTarget.appTheme.organizationLogo;            
 | 
			
		||||
            if (orgLogo)
 | 
			
		||||
                $('#front-panel').append(
 | 
			
		||||
                    $('<img/>').attr('class', 'organization').attr('src', orgLogo)
 | 
			
		||||
                );
 | 
			
		||||
            var loading = document.getElementById('loading'); 
 | 
			
		||||
            pxsim.instructions.drawInstructions();
 | 
			
		||||
            $(loading).hide();
 | 
			
		||||
        });
 | 
			
		||||
        })();
 | 
			
		||||
    </script>
 | 
			
		||||
 | 
			
		||||
    <div id="front-panel" class="instr-panel">
 | 
			
		||||
        <h1 id="proj-title"></h1>
 | 
			
		||||
 | 
			
		||||
        <!--TODO: extract real code snapshot from PXT -->
 | 
			
		||||
        <div id="proj-code">
 | 
			
		||||
            <i id="proj-code-spinner" class="spinner loading icon"></i>
 | 
			
		||||
            <div id="proj-code-container">
 | 
			
		||||
            </div>
 | 
			
		||||
        </div>
 | 
			
		||||
    </div>
 | 
			
		||||
</body>
 | 
			
		||||
</html>
 | 
			
		||||
							
								
								
									
										200
									
								
								sim/state/buttonpairsim.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										200
									
								
								sim/state/buttonpairsim.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,200 @@
 | 
			
		||||
namespace pxsim.visuals {
 | 
			
		||||
    export function mkBtnSvg(xy: Coord): SVGAndSize<SVGGElement> {
 | 
			
		||||
        let [innerCls, outerCls] = ["sim-button", "sim-button-outer"];
 | 
			
		||||
        const tabSize = PIN_DIST / 2.5;
 | 
			
		||||
        const pegR = PIN_DIST / 5;
 | 
			
		||||
        const btnR = PIN_DIST * .8;
 | 
			
		||||
        const pegMargin = PIN_DIST / 8;
 | 
			
		||||
        const plateR = PIN_DIST / 12;
 | 
			
		||||
 | 
			
		||||
        const pegOffset = pegMargin + pegR;
 | 
			
		||||
        let [x, y] = xy;
 | 
			
		||||
        const left = x - tabSize / 2;
 | 
			
		||||
        const top = y - tabSize / 2;
 | 
			
		||||
        const plateH = 3 * PIN_DIST - tabSize;
 | 
			
		||||
        const plateW = 2 * PIN_DIST + tabSize;
 | 
			
		||||
        const plateL = left;
 | 
			
		||||
        const plateT = top + tabSize;
 | 
			
		||||
        const btnCX = plateL + plateW / 2;
 | 
			
		||||
        const btnCY = plateT + plateH / 2;
 | 
			
		||||
 | 
			
		||||
        let btng = <SVGGElement>svg.elt("g");
 | 
			
		||||
        //tabs
 | 
			
		||||
        const mkTab = (x: number, y: number) => {
 | 
			
		||||
            svg.child(btng, "rect", { class: "sim-button-tab", x: x, y: y, width: tabSize, height: tabSize})
 | 
			
		||||
        }
 | 
			
		||||
        mkTab(left, top);
 | 
			
		||||
        mkTab(left + 2 * PIN_DIST, top);
 | 
			
		||||
        mkTab(left, top + 3 * PIN_DIST);
 | 
			
		||||
        mkTab(left + 2 * PIN_DIST, top + 3 * PIN_DIST);
 | 
			
		||||
 | 
			
		||||
        //plate
 | 
			
		||||
        svg.child(btng, "rect", { class: outerCls, x: plateL, y: plateT, rx: plateR, ry: plateR, width: plateW, height: plateH });
 | 
			
		||||
 | 
			
		||||
        //pegs
 | 
			
		||||
        const mkPeg = (x: number, y: number) => {
 | 
			
		||||
            svg.child(btng, "circle", { class: "sim-button-nut", cx: x, cy: y, r: pegR });
 | 
			
		||||
        }
 | 
			
		||||
        mkPeg(plateL + pegOffset, plateT + pegOffset)
 | 
			
		||||
        mkPeg(plateL + plateW - pegOffset, plateT + pegOffset)
 | 
			
		||||
        mkPeg(plateL + pegOffset, plateT + plateH - pegOffset)
 | 
			
		||||
        mkPeg(plateL + plateW - pegOffset, plateT + plateH - pegOffset)
 | 
			
		||||
 | 
			
		||||
        //inner btn
 | 
			
		||||
        let innerBtn = svg.child(btng, "circle", { class: innerCls, cx: btnCX, cy: btnCY, r: btnR });
 | 
			
		||||
 | 
			
		||||
        //return
 | 
			
		||||
        return { el: btng, y: top, x: left, w: plateW, h: plateH + 2 * tabSize };
 | 
			
		||||
    }
 | 
			
		||||
    export const BUTTON_PAIR_STYLE = `
 | 
			
		||||
            .sim-button {
 | 
			
		||||
                pointer-events: none;
 | 
			
		||||
                fill: #000;
 | 
			
		||||
            }
 | 
			
		||||
            .sim-button-outer:active ~ .sim-button,
 | 
			
		||||
            .sim-button-virtual:active {
 | 
			
		||||
                fill: #FFA500;
 | 
			
		||||
            }
 | 
			
		||||
            .sim-button-outer {
 | 
			
		||||
                cursor: pointer;
 | 
			
		||||
                fill: #979797;
 | 
			
		||||
            }
 | 
			
		||||
            .sim-button-outer:hover {
 | 
			
		||||
                stroke:gray;
 | 
			
		||||
                stroke-width: ${PIN_DIST / 5}px;
 | 
			
		||||
            }
 | 
			
		||||
            .sim-button-nut {
 | 
			
		||||
                fill:#000;
 | 
			
		||||
                pointer-events:none;
 | 
			
		||||
            }
 | 
			
		||||
            .sim-button-nut:hover {
 | 
			
		||||
                stroke:${PIN_DIST / 15}px solid #704A4A;
 | 
			
		||||
            }
 | 
			
		||||
            .sim-button-tab {
 | 
			
		||||
                fill:#FFF;
 | 
			
		||||
                pointer-events:none;
 | 
			
		||||
            }
 | 
			
		||||
            .sim-button-virtual {
 | 
			
		||||
                cursor: pointer;
 | 
			
		||||
                fill: rgba(255, 255, 255, 0.6);
 | 
			
		||||
                stroke: rgba(255, 255, 255, 1);
 | 
			
		||||
                stroke-width: ${PIN_DIST / 5}px;
 | 
			
		||||
            }
 | 
			
		||||
            .sim-button-virtual:hover {
 | 
			
		||||
                stroke: rgba(128, 128, 128, 1);
 | 
			
		||||
            }
 | 
			
		||||
            .sim-text-virtual {
 | 
			
		||||
                fill: #000;
 | 
			
		||||
                pointer-events:none;
 | 
			
		||||
            }
 | 
			
		||||
            `;
 | 
			
		||||
    export class ButtonPairView implements IBoardPart<ButtonPairState> {
 | 
			
		||||
        public element: SVGElement;
 | 
			
		||||
        public defs: SVGElement[];
 | 
			
		||||
        public style = BUTTON_PAIR_STYLE;
 | 
			
		||||
        private state: ButtonPairState;
 | 
			
		||||
        private bus: EventBus;
 | 
			
		||||
        private aBtn: SVGGElement;
 | 
			
		||||
        private bBtn: SVGGElement;
 | 
			
		||||
        private abBtn: SVGGElement;
 | 
			
		||||
 | 
			
		||||
        public init(bus: EventBus, state: ButtonPairState) {
 | 
			
		||||
            this.state = state;
 | 
			
		||||
            this.bus = bus;
 | 
			
		||||
            this.defs = [];
 | 
			
		||||
            this.element = this.mkBtns();
 | 
			
		||||
            this.updateState();
 | 
			
		||||
            this.attachEvents();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public moveToCoord(xy: Coord) {
 | 
			
		||||
            let btnWidth = PIN_DIST * 3;
 | 
			
		||||
            let [x, y] = xy;
 | 
			
		||||
            translateEl(this.aBtn, [x, y])
 | 
			
		||||
            translateEl(this.bBtn, [x + btnWidth, y])
 | 
			
		||||
            translateEl(this.abBtn, [x + PIN_DIST * 1.5, y + PIN_DIST * 4])
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public updateState() {
 | 
			
		||||
            let stateBtns = [this.state.aBtn, this.state.bBtn, this.state.abBtn];
 | 
			
		||||
            let svgBtns = [this.aBtn, this.bBtn, this.abBtn];
 | 
			
		||||
 | 
			
		||||
            if (this.state.usesButtonAB && this.abBtn.style.visibility != "visible") {
 | 
			
		||||
                this.abBtn.style.visibility = "visible";
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public updateTheme() {}
 | 
			
		||||
 | 
			
		||||
        private mkBtns() {
 | 
			
		||||
            this.aBtn = mkBtnSvg([0, 0]).el;
 | 
			
		||||
            this.bBtn = mkBtnSvg([0, 0]).el;
 | 
			
		||||
 | 
			
		||||
            const mkVirtualBtn = () => {
 | 
			
		||||
                const numPins = 2;
 | 
			
		||||
                const w = PIN_DIST * 2.8;
 | 
			
		||||
                const offset = (w - (numPins * PIN_DIST)) / 2;
 | 
			
		||||
                const corner = PIN_DIST / 2;
 | 
			
		||||
                const cx = 0 - offset + w / 2;
 | 
			
		||||
                const cy = cx;
 | 
			
		||||
                const txtSize = PIN_DIST * 1.3;
 | 
			
		||||
                const x = -offset;
 | 
			
		||||
                const y = -offset;
 | 
			
		||||
                const txtXOff = PIN_DIST / 7;
 | 
			
		||||
                const txtYOff = PIN_DIST / 10;
 | 
			
		||||
 | 
			
		||||
                let btng = <SVGGElement>svg.elt("g");
 | 
			
		||||
                let btn = svg.child(btng, "rect", { class: "sim-button-virtual", x: x, y: y, rx: corner, ry: corner, width: w, height: w});
 | 
			
		||||
                let btnTxt = mkTxt(cx + txtXOff, cy + txtYOff, txtSize, 0, "A+B");
 | 
			
		||||
                svg.addClass(btnTxt, "sim-text")
 | 
			
		||||
                svg.addClass(btnTxt, "sim-text-virtual");
 | 
			
		||||
                btng.appendChild(btnTxt);
 | 
			
		||||
 | 
			
		||||
                return btng;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            this.abBtn = mkVirtualBtn();
 | 
			
		||||
            this.abBtn.style.visibility = "hidden";
 | 
			
		||||
 | 
			
		||||
            let el = svg.elt("g");
 | 
			
		||||
            svg.addClass(el, "sim-buttonpair")
 | 
			
		||||
            el.appendChild(this.aBtn);
 | 
			
		||||
            el.appendChild(this.bBtn);
 | 
			
		||||
            el.appendChild(this.abBtn);
 | 
			
		||||
 | 
			
		||||
            return el;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private attachEvents() {
 | 
			
		||||
            let btnStates = [this.state.aBtn, this.state.bBtn];
 | 
			
		||||
            let btnSvgs = [this.aBtn, this.bBtn];
 | 
			
		||||
            btnSvgs.forEach((btn, index) => {
 | 
			
		||||
                pxsim.pointerEvents.down.forEach(evid => btn.addEventListener(evid, ev => {
 | 
			
		||||
                    btnStates[index].pressed = true;
 | 
			
		||||
                }))
 | 
			
		||||
                btn.addEventListener(pointerEvents.leave, ev => {
 | 
			
		||||
                    btnStates[index].pressed = false;
 | 
			
		||||
                })
 | 
			
		||||
                btn.addEventListener(pointerEvents.up, ev => {
 | 
			
		||||
                    btnStates[index].pressed = false;
 | 
			
		||||
                    this.bus.queue(btnStates[index].id, this.state.props.BUTTON_EVT_UP);
 | 
			
		||||
                    this.bus.queue(btnStates[index].id, this.state.props.BUTTON_EVT_CLICK);
 | 
			
		||||
                })
 | 
			
		||||
            })
 | 
			
		||||
            let updateBtns = (s: boolean) => {
 | 
			
		||||
                btnStates.forEach(b => b.pressed = s)
 | 
			
		||||
            };
 | 
			
		||||
            pxsim.pointerEvents.down.forEach(evid => this.abBtn.addEventListener(evid, ev => {
 | 
			
		||||
                updateBtns(true);
 | 
			
		||||
            }));
 | 
			
		||||
            this.abBtn.addEventListener(pointerEvents.leave, ev => {
 | 
			
		||||
                updateBtns(false);
 | 
			
		||||
            })
 | 
			
		||||
            this.abBtn.addEventListener(pointerEvents.up, ev => {
 | 
			
		||||
                updateBtns(false);
 | 
			
		||||
                this.bus.queue(this.state.abBtn.id, this.state.props.BUTTON_EVT_UP);
 | 
			
		||||
                this.bus.queue(this.state.abBtn.id, this.state.props.BUTTON_EVT_CLICK);
 | 
			
		||||
            })
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										86
									
								
								sim/state/edgeconnectorsim.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										86
									
								
								sim/state/edgeconnectorsim.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,86 @@
 | 
			
		||||
namespace pxsim {
 | 
			
		||||
    export enum PinFlags {
 | 
			
		||||
        Unused = 0,
 | 
			
		||||
        Digital = 0x0001,
 | 
			
		||||
        Analog = 0x0002,
 | 
			
		||||
        Input = 0x0004,
 | 
			
		||||
        Output = 0x0008,
 | 
			
		||||
        Touch = 0x0010
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    export class Pin {
 | 
			
		||||
        constructor(public id: number) { }
 | 
			
		||||
        touched = false;
 | 
			
		||||
        value = 0;
 | 
			
		||||
        period = 0;
 | 
			
		||||
        servoAngle = 0;
 | 
			
		||||
        mode = PinFlags.Unused;
 | 
			
		||||
        pitch = false;
 | 
			
		||||
        pull = 0; // PullDown
 | 
			
		||||
 | 
			
		||||
        digitalReadPin(): number {
 | 
			
		||||
            this.mode = PinFlags.Digital | PinFlags.Input;
 | 
			
		||||
            return this.value > 100 ? 1 : 0;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        digitalWritePin(value: number) {
 | 
			
		||||
            this.mode = PinFlags.Digital | PinFlags.Output;
 | 
			
		||||
            this.value = value > 0 ? 200 : 0;
 | 
			
		||||
            runtime.queueDisplayUpdate();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        setPull(pull: number) {
 | 
			
		||||
            this.pull = pull;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        analogReadPin(): number {
 | 
			
		||||
            this.mode = PinFlags.Analog | PinFlags.Input;
 | 
			
		||||
            return this.value || 0;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        analogWritePin(value: number) {
 | 
			
		||||
            this.mode = PinFlags.Analog | PinFlags.Output;
 | 
			
		||||
            this.value = Math.max(0, Math.min(1023, value));
 | 
			
		||||
            runtime.queueDisplayUpdate();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        analogSetPeriod(micros: number) {
 | 
			
		||||
            this.mode = PinFlags.Analog | PinFlags.Output;
 | 
			
		||||
            this.period = micros;
 | 
			
		||||
            runtime.queueDisplayUpdate();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        servoWritePin(value: number) {
 | 
			
		||||
            this.analogSetPeriod(20000);
 | 
			
		||||
            this.servoAngle = Math.max(0, Math.min(180, value));
 | 
			
		||||
            runtime.queueDisplayUpdate();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        servoSetPulse(pinId: number, micros: number) {
 | 
			
		||||
            // TODO
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        isTouched(): boolean {
 | 
			
		||||
            this.mode = PinFlags.Touch | PinFlags.Analog | PinFlags.Input;
 | 
			
		||||
            return this.touched;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    export interface EdgeConnectorProps {
 | 
			
		||||
        pins: number[];
 | 
			
		||||
        servos?: { [name: string]: number; }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    export class EdgeConnectorState {
 | 
			
		||||
        pins: Pin[];
 | 
			
		||||
 | 
			
		||||
        constructor(public props: EdgeConnectorProps) {
 | 
			
		||||
            this.pins = props.pins.map(id => id != undefined ? new Pin(id) : null);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public getPin(id: number) {
 | 
			
		||||
            return this.pins.filter(p => p && p.id == id)[0] || null
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										83
									
								
								sim/state/microservo.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										83
									
								
								sim/state/microservo.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,83 @@
 | 
			
		||||
namespace pxsim.visuals {
 | 
			
		||||
    function createMicroServoElement() {
 | 
			
		||||
        return svg.parseString(`
 | 
			
		||||
        <svg xmlns="http://www.w3.org/2000/svg" id="svg2" width="112.188" height="299.674">
 | 
			
		||||
          <g id="layer1" stroke-linecap="round" stroke-linejoin="round" transform="scale(0.8)">
 | 
			
		||||
            <path id="path8212" fill="#0061ff" stroke-width="6.6" d="M.378 44.61v255.064h112.188V44.61H.378z"/>
 | 
			
		||||
            <path id="crankbase" fill="#00f" stroke-width="6.6" d="M56.57 88.047C25.328 88.047 0 113.373 0 144.615c.02 22.352 11.807 42.596 32.238 51.66.03 3.318.095 5.24.088 7.938 0 13.947 11.307 25.254 25.254 25.254 13.947 0 25.254-11.307 25.254-25.254-.006-2.986-.415-5.442-.32-8.746 19.487-9.45 30.606-29.195 30.625-50.852 0-31.24-25.33-56.568-56.57-56.568z"/>
 | 
			
		||||
            <path id="lowertip" fill="#00a2ff" stroke-width="2" d="M.476 260.78v38.894h53.82v-10.486a6.82 6.566 0 0 1-4.545-6.182 6.82 6.566 0 0 1 6.82-6.566 6.82 6.566 0 0 1 6.82 6.566 6.82 6.566 0 0 1-4.545 6.182v10.486h53.82V260.78H.475z"/>
 | 
			
		||||
            <path id="uppertip" fill="#00a2ff" stroke-width="2" d="M112.566 83.503V44.61h-53.82v10.487a6.82 6.566 0 0 1 4.544 6.18 6.82 6.566 0 0 1-6.818 6.568 6.82 6.566 0 0 1-6.82-6.567 6.82 6.566 0 0 1 4.546-6.18V44.61H.378v38.893h112.188z"/>
 | 
			
		||||
            <path id="VCC" fill="red" stroke-width="2" d="M53.72 21.93h5.504v22.627H53.72z"/>
 | 
			
		||||
            <path id="LOGIC" fill="#fc0" stroke-width="2" d="M47.3 21.93h5.503v22.627H47.3z"/>
 | 
			
		||||
            <path id="GND" fill="#a02c2c" stroke-width="2" d="M60.14 21.93h5.505v22.627H60.14z"/>
 | 
			
		||||
            <path id="connector" stroke-width="2" d="M45.064 0a1.488 1.488 0 0 0-1.488 1.488v24.5a1.488 1.488 0 0 0 1.488 1.487h22.71a1.488 1.488 0 0 0 1.49-1.488v-24.5A1.488 1.488 0 0 0 67.774 0h-22.71z"/>
 | 
			
		||||
            <g id="crank" transform="translate(0 -752.688)">
 | 
			
		||||
              <path id="arm" fill="#ececec" stroke="#000" stroke-width="1.372" d="M47.767 880.88c-4.447 1.162-8.412 8.278-8.412 18.492s3.77 18.312 8.412 18.494c8.024.314 78.496 5.06 78.51-16.952.012-22.013-74.377-21.117-78.51-20.035z"/>
 | 
			
		||||
              <circle id="path8216" cx="56.661" cy="899.475" r="8.972" fill="gray" stroke-width="2"/>
 | 
			
		||||
            </g>
 | 
			
		||||
          </g>
 | 
			
		||||
        </svg>
 | 
			
		||||
                    `).firstElementChild as SVGGElement;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    export function mkMicroServoPart(xy: Coord = [0, 0]): SVGElAndSize {
 | 
			
		||||
        return { el: createMicroServoElement(), x: xy[0], y: xy[1], w: 112.188, h: 299.674 };
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    export class MicroServoView implements IBoardPart<EdgeConnectorState> {
 | 
			
		||||
        public style: string = "";
 | 
			
		||||
        public overElement: SVGElement = undefined;
 | 
			
		||||
        public element: SVGElement;
 | 
			
		||||
        public defs: SVGElement[] = [];
 | 
			
		||||
        public state: EdgeConnectorState;
 | 
			
		||||
        public bus: EventBus;
 | 
			
		||||
        private currentAngle = 0;
 | 
			
		||||
        private targetAngle = 0;
 | 
			
		||||
        private lastAngleTime = 0;
 | 
			
		||||
        private pin: number;
 | 
			
		||||
 | 
			
		||||
        private crankEl: SVGGElement;
 | 
			
		||||
        private crankTransform: string;
 | 
			
		||||
 | 
			
		||||
        public init(bus: EventBus, state: EdgeConnectorState, svgEl: SVGSVGElement, otherParams: Map<string>) {
 | 
			
		||||
            this.state = state;
 | 
			
		||||
            this.pin = this.state.props.servos[
 | 
			
		||||
                pxsim.readPin(otherParams["name"] || otherParams["pin"])
 | 
			
		||||
            ];
 | 
			
		||||
            this.bus = bus;
 | 
			
		||||
            this.defs = [];
 | 
			
		||||
            this.initDom();
 | 
			
		||||
            this.updateState();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        initDom() {
 | 
			
		||||
            this.element = createMicroServoElement();
 | 
			
		||||
            this.crankEl = this.element.querySelector("#crank") as SVGGElement;
 | 
			
		||||
            this.crankTransform = this.crankEl.getAttribute("transform");
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        moveToCoord(xy: visuals.Coord): void {
 | 
			
		||||
            let [x, y] = xy;
 | 
			
		||||
            translateEl(this.element, [x, y])
 | 
			
		||||
        }
 | 
			
		||||
        updateState(): void {
 | 
			
		||||
            this.targetAngle = 180.0 - this.state.getPin(this.pin).servoAngle;
 | 
			
		||||
            if (this.targetAngle != this.currentAngle) {
 | 
			
		||||
                const now = U.now();
 | 
			
		||||
                const cx = 56.661;
 | 
			
		||||
                const cy = 899.475;
 | 
			
		||||
                const speed = 300; // 0.1s/60 degree
 | 
			
		||||
                const dt = Math.min(now - this.lastAngleTime, 50) / 1000;
 | 
			
		||||
                const delta = this.targetAngle - this.currentAngle;
 | 
			
		||||
                this.currentAngle += Math.min(Math.abs(delta), speed * dt) * (delta > 0 ? 1 : -1);
 | 
			
		||||
                this.crankEl.setAttribute("transform", this.crankTransform
 | 
			
		||||
                    + ` rotate(${this.currentAngle}, ${cx}, ${cy})`)
 | 
			
		||||
                this.lastAngleTime = now;
 | 
			
		||||
                setTimeout(() => runtime.updateDisplay(), 20);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        updateTheme(): void {
 | 
			
		||||
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user