From ab946a066274738b2b823baae15f66b673fa4016 Mon Sep 17 00:00:00 2001 From: Manuel Date: Wed, 18 Sep 2019 11:51:46 +0100 Subject: [PATCH] Setup for GitPages --- Benchmark/dist/bundle.js | 1 - Benchmark/dist/index.html | 29 -- Benchmark/src/assembly/index.ts | 5 - Benchmark/src/index.html | 29 -- Benchmark/src/index.ts | 159 -------- Benchmark/src/styles.scss | 27 -- Checkerboard/dist/index.html | 18 + Checkerboard/{ => dist}/index.js | 0 Checkerboard/{ => dist}/index.ts | 0 Checkerboard/{ => dist}/index.wasm | Bin Checkerboard/dist/styles.css | 11 + Checkerboard/dist/tsconfig.json | 6 + Checkerboard/index.html | 11 - Checkerboard/tsconfig.json | 6 - Hello World/{ => dist}/hello-world.js | 0 Hello World/{ => dist}/hello-world.ts | 0 Hello World/{ => dist}/hello-world.wasm | Bin Hello World/dist/index.html | 12 + Hello World/dist/styles.css | 12 + Hello World/index.html | 9 - Importing JS/dist/index.html | 13 + Importing JS/{ => dist}/index.js | 0 Importing JS/{ => dist}/index.ts | 0 Importing JS/{ => dist}/index.wasm | Bin Importing JS/dist/styles.css | 11 + Importing JS/index.html | 9 - Linear Memory/dist/index.html | 12 + Linear Memory/{ => dist}/index.js | 0 Linear Memory/{ => dist}/index.ts | 0 Linear Memory/{ => dist}/index.wasm | Bin Linear Memory/dist/tsconfig.json | 6 + Linear Memory/index.html | 9 - .../dist/assembly/index.wasm | Bin 0 -> 7883 bytes Sort Colors Benchmark/dist/bundle.js | 1 + Sort Colors Benchmark/dist/index.html | 58 +++ Sort Colors Benchmark/dist/styles.css | 2 + Sort Colors Benchmark/src/assembly/index.ts | 98 +++++ Sort Colors Benchmark/src/assembly/index.wasm | Bin 0 -> 7883 bytes .../src/assembly/tsconfig.json | 6 + Sort Colors Benchmark/src/index.html | 58 +++ Sort Colors Benchmark/src/index.ts | 293 +++++++++++++++ Sort Colors Benchmark/src/interfaces.ts | 7 + Sort Colors Benchmark/src/styles.scss | 52 +++ .../src/util.ts | 78 +++- .../tsconfig.json | 5 +- .../webpack.config.js | 12 +- index.html | 17 + package-lock.json | 338 +++++++++--------- package.json | 9 +- styles.css | 22 ++ 50 files changed, 989 insertions(+), 462 deletions(-) delete mode 100644 Benchmark/dist/bundle.js delete mode 100644 Benchmark/dist/index.html delete mode 100644 Benchmark/src/assembly/index.ts delete mode 100644 Benchmark/src/index.html delete mode 100644 Benchmark/src/index.ts delete mode 100644 Benchmark/src/styles.scss create mode 100644 Checkerboard/dist/index.html rename Checkerboard/{ => dist}/index.js (100%) rename Checkerboard/{ => dist}/index.ts (100%) rename Checkerboard/{ => dist}/index.wasm (100%) create mode 100644 Checkerboard/dist/styles.css create mode 100644 Checkerboard/dist/tsconfig.json delete mode 100644 Checkerboard/index.html delete mode 100644 Checkerboard/tsconfig.json rename Hello World/{ => dist}/hello-world.js (100%) rename Hello World/{ => dist}/hello-world.ts (100%) rename Hello World/{ => dist}/hello-world.wasm (100%) create mode 100644 Hello World/dist/index.html create mode 100644 Hello World/dist/styles.css delete mode 100644 Hello World/index.html create mode 100644 Importing JS/dist/index.html rename Importing JS/{ => dist}/index.js (100%) rename Importing JS/{ => dist}/index.ts (100%) rename Importing JS/{ => dist}/index.wasm (100%) create mode 100644 Importing JS/dist/styles.css delete mode 100644 Importing JS/index.html create mode 100644 Linear Memory/dist/index.html rename Linear Memory/{ => dist}/index.js (100%) rename Linear Memory/{ => dist}/index.ts (100%) rename Linear Memory/{ => dist}/index.wasm (100%) create mode 100644 Linear Memory/dist/tsconfig.json delete mode 100644 Linear Memory/index.html create mode 100644 Sort Colors Benchmark/dist/assembly/index.wasm create mode 100644 Sort Colors Benchmark/dist/bundle.js create mode 100644 Sort Colors Benchmark/dist/index.html create mode 100644 Sort Colors Benchmark/dist/styles.css create mode 100644 Sort Colors Benchmark/src/assembly/index.ts create mode 100644 Sort Colors Benchmark/src/assembly/index.wasm create mode 100644 Sort Colors Benchmark/src/assembly/tsconfig.json create mode 100644 Sort Colors Benchmark/src/index.html create mode 100644 Sort Colors Benchmark/src/index.ts create mode 100644 Sort Colors Benchmark/src/interfaces.ts create mode 100644 Sort Colors Benchmark/src/styles.scss rename {Benchmark => Sort Colors Benchmark}/src/util.ts (56%) rename {Benchmark => Sort Colors Benchmark}/tsconfig.json (96%) rename {Benchmark => Sort Colors Benchmark}/webpack.config.js (72%) create mode 100644 index.html create mode 100644 styles.css diff --git a/Benchmark/dist/bundle.js b/Benchmark/dist/bundle.js deleted file mode 100644 index 00908dd..0000000 --- a/Benchmark/dist/bundle.js +++ /dev/null @@ -1 +0,0 @@ -!function(e){var t={};function n(E){if(t[E])return t[E].exports;var N=t[E]={i:E,l:!1,exports:{}};return e[E].call(N.exports,N,N.exports,n),N.l=!0,N.exports}n.m=e,n.c=t,n.d=function(e,t,E){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:E})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var E=Object.create(null);if(n.r(E),Object.defineProperty(E,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var N in e)n.d(E,N,function(t){return e[t]}.bind(null,N));return E},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=0)}([function(e,t){console.log("STARTING RAINBOW BENCHMARK");const n=function(){const e={JS_RENDERING:document.getElementById("section.js-rendering"),WASM_RENDERING:document.getElementById("section.wasm-rendering")};return{JS_RENDERING:{SECTION:e.JS_RENDERING,BTN_REFRESH:e.JS_RENDERING.getElementsByClassName("btn.refresh")[0],UI_EXEC_TIME:e.JS_RENDERING.getElementsByClassName("code.exec-time")[0],CANVAS:e.JS_RENDERING.getElementsByTagName("canvas")[0]},WASM_RENDERING:{SECTION:e.WASM_RENDERING,BTN_REFRESH:e.WASM_RENDERING.getElementsByClassName("btn.refresh")[0],UI_EXEC_TIME:e.WASM_RENDERING.getElementsByClassName("code.exec-time")[0],CANVAS:e.WASM_RENDERING.getElementsByTagName("canvas")[0]}}}(),E=function(){const e=n.JS_RENDERING.CANVAS.width,t=n.JS_RENDERING.CANVAS.height,E=n.JS_RENDERING.CANVAS.getContext("2d");E.fillRect(0,0,40,40),E.fill(),console.log(E.getImageData(1,1,100,100));const N={CANVAS_EL:n.JS_RENDERING.CANVAS,CTX:E,IMG_DATA:E.getImageData(0,0,e,t)},o=n.WASM_RENDERING.CANVAS.width,r=n.WASM_RENDERING.CANVAS.height,a={CANVAS_EL:n.WASM_RENDERING.CANVAS,CTX:n.WASM_RENDERING.CANVAS.getContext("2d"),IMG_DATA:n.WASM_RENDERING.CANVAS.getContext("2d").getImageData(0,0,o,r)};return{JS_RENDERING:N,WASM_RENDERING:a}}();n.JS_RENDERING.BTN_REFRESH.addEventListener("click",()=>(function(e){console.log("Drawing canvas with JS");const{CANVAS_EL:t,CTX:n,IMG_DATA:E}=e,N=E.data,{WIDTH:o,HEIGHT:r}=E;for(let e=0;e - - - - - AssemblyScript Benchmark - - - - -
-
-

Rendering with JS

- - Rendering time: - -
- -
-

Rendering with WebAssembly

- - Rendering time: - -
-
- - - - \ No newline at end of file diff --git a/Benchmark/src/assembly/index.ts b/Benchmark/src/assembly/index.ts deleted file mode 100644 index 66a9aaf..0000000 --- a/Benchmark/src/assembly/index.ts +++ /dev/null @@ -1,5 +0,0 @@ -// The entry file of your WebAssembly module. - -export function add(a: i32, b: i32): i32 { - return a + b; -} diff --git a/Benchmark/src/index.html b/Benchmark/src/index.html deleted file mode 100644 index 1b40ba3..0000000 --- a/Benchmark/src/index.html +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - AssemblyScript Benchmark - - - - -
-

WebAssembly for rendering benchmark

-

Images are both 2000 * 2000 px (scaled down in View Layer)

-
-

Rendering with JS

- - Rendering time: - -
- -
-

Rendering with WebAssembly

- - Rendering time: - -
-
- - \ No newline at end of file diff --git a/Benchmark/src/index.ts b/Benchmark/src/index.ts deleted file mode 100644 index e58374f..0000000 --- a/Benchmark/src/index.ts +++ /dev/null @@ -1,159 +0,0 @@ -import './styles.scss' -import { Timeline } from './util' - -console.log("STARTING RAINBOW BENCHMARK") - - - -const DOM_ELEMENTS = gatherDOMElements() -const CANVASES = setupCanvases() - -main() -function main() { - attachEventListeners() - let ROTATION_ANGLE = 0 - setInterval(() => { - const TIMELINE = new Timeline('Render color wheel') - - makeColorWheelJS(CANVASES.JS_RENDERING.IMG_DATA, ROTATION_ANGLE) - TIMELINE.mark('Make color wheel IMG_DATA JS') - CANVASES.JS_RENDERING.CTX.putImageData(CANVASES.JS_RENDERING.IMG_DATA, 0, 0) - DOM_ELEMENTS.JS_RENDERING.UI_EXEC_TIME.innerHTML = `${Math.round(TIMELINE.get('Make color wheel IMG_DATA JS'))} ms` - - ROTATION_ANGLE += 1 / (180 / Math.PI) - }, 100) -} - -/** Draws a color wheel in IMG_DATA */ -function makeColorWheelJS(IMG_DATA: ImageData, OFFSET_ANGLE: number) { - const WIDTH = IMG_DATA.width, HEIGHT = IMG_DATA.height - const IMG_DATA_DATA = IMG_DATA.data - const PI = Math.PI - - for (let y = 0; y < HEIGHT; y++) { - for (let x = 0; x < WIDTH; x++) { - const INDEX = y * WIDTH * 4 + x * 4 - const ANGLE_TO_CENTER = Math.atan2((x - WIDTH / 2), (y - HEIGHT / 2)) // 0 to 2pi - let HUE = (OFFSET_ANGLE + ANGLE_TO_CENTER) / (2 * PI) // 0 to 2pi => 0 to 1 - if (HUE > 1) HUE = HUE % 1 - const COLOR_RGB = HSLtoRGB(HUE, 1, 0.5) - IMG_DATA_DATA[INDEX] = COLOR_RGB[0] - IMG_DATA_DATA[INDEX + 1] = COLOR_RGB[1] - IMG_DATA_DATA[INDEX + 2] = COLOR_RGB[2] - IMG_DATA_DATA[INDEX + 3] = 255 - } - } -} - - - - -/** Converts HSLtoRGB array - * H, S and L input range = 0 ÷ 1.0 - * R, G and B output range = 0 ÷ 255 - */ -function HSLtoRGB(H, S, L) { - let var_1, var_2, R = 0, B = 0, G = 0 - - if (S == 0) { - - R = L * 255 - G = L * 255 - B = L * 255 - } else { - if (L < 0.5) var_2 = L * (1 + S) - else var_2 = (L + S) - (S * L) - - var_1 = 2 * L - var_2 - - R = Math.floor(255 * hueToRGB(var_1, var_2, H + (1 / 3))) - G = Math.floor(255 * hueToRGB(var_1, var_2, H)) - B = Math.floor(255 * hueToRGB(var_1, var_2, H - (1 / 3))) - - return [R, G, B] - } - - function hueToRGB(v1, v2, vH) { - if (vH < 0) vH += 1 - if (vH > 1) vH -= 1 - if ((6 * vH) < 1) return (v1 + (v2 - v1) * 6 * vH) - if ((2 * vH) < 1) return (v2) - if ((3 * vH) < 2) return (v1 + (v2 - v1) * ((2 / 3) - vH) * 6) - return (v1) - } -} - -function attachEventListeners() { - DOM_ELEMENTS.JS_RENDERING.BTN_REFRESH.addEventListener('click', () => makeColorWheelJS(CANVASES.JS_RENDERING.IMG_DATA, Math.random() * 2 * Math.PI)) -} - -function gatherDOMElements() { - const DOM_SECTIONS = { - JS_RENDERING: document.getElementById('section.js-rendering'), - WASM_RENDERING: document.getElementById('section.wasm-rendering') - } - - return { - JS_RENDERING: { - SECTION: DOM_SECTIONS.JS_RENDERING, - BTN_REFRESH: DOM_SECTIONS.JS_RENDERING.getElementsByClassName('btn.refresh')[0], - UI_EXEC_TIME: DOM_SECTIONS.JS_RENDERING.getElementsByClassName('code.exec-time')[0], - CANVAS: DOM_SECTIONS.JS_RENDERING.getElementsByTagName('canvas')[0] - }, - WASM_RENDERING: { - SECTION: DOM_SECTIONS.WASM_RENDERING, - BTN_REFRESH: DOM_SECTIONS.WASM_RENDERING.getElementsByClassName('btn.refresh')[0], - UI_EXEC_TIME: DOM_SECTIONS.WASM_RENDERING.getElementsByClassName('code.exec-time')[0], - CANVAS: DOM_SECTIONS.WASM_RENDERING.getElementsByTagName('canvas')[0] - } - } - -} - -function setupCanvases() { - const JS_RENDERING_WIDTH = DOM_ELEMENTS.JS_RENDERING.CANVAS.width - const JS_RENDERING_HEIGHT = DOM_ELEMENTS.JS_RENDERING.CANVAS.height - const JS_RENDERING_CTX = DOM_ELEMENTS.JS_RENDERING.CANVAS.getContext('2d') - JS_RENDERING_CTX.fillRect(0, 0, JS_RENDERING_WIDTH, JS_RENDERING_HEIGHT) - const JS_RENDERING = { - CANVAS_EL: DOM_ELEMENTS.JS_RENDERING.CANVAS, - CTX: JS_RENDERING_CTX, - IMG_DATA: JS_RENDERING_CTX.getImageData(0, 0, JS_RENDERING_WIDTH, JS_RENDERING_HEIGHT) - } - - - - const WASM_RENDERING_WIDTH = DOM_ELEMENTS.WASM_RENDERING.CANVAS.width - const WASM_RENDERING_HEIGHT = DOM_ELEMENTS.WASM_RENDERING.CANVAS.height - const WASM_RENDERING_CTX = DOM_ELEMENTS.WASM_RENDERING.CANVAS.getContext('2d') - WASM_RENDERING_CTX.fillRect(0, 0, WASM_RENDERING_WIDTH, WASM_RENDERING_HEIGHT) - const WASM_RENDERING = { - CANVAS_EL: DOM_ELEMENTS.WASM_RENDERING.CANVAS, - CTX: WASM_RENDERING_CTX, - IMG_DATA: WASM_RENDERING_CTX.getImageData(0, 0, WASM_RENDERING_WIDTH, WASM_RENDERING_HEIGHT) - } - - return { JS_RENDERING, WASM_RENDERING } -} - -async function wasmBrowserInstantiate(wasmModuleUrl, importObject) { - let response = undefined; - - if (!importObject) { - importObject = { - env: { - abort: () => console.log("Abort!") - } - }; - } - - const fetchAndInstantiateTask = async () => { - const wasmArrayBuffer = await fetch(wasmModuleUrl).then(response => - response.arrayBuffer() - ); - return WebAssembly.instantiate(wasmArrayBuffer, importObject); - }; - response = await fetchAndInstantiateTask(); - - return response; -}; \ No newline at end of file diff --git a/Benchmark/src/styles.scss b/Benchmark/src/styles.scss deleted file mode 100644 index 4557eaa..0000000 --- a/Benchmark/src/styles.scss +++ /dev/null @@ -1,27 +0,0 @@ -body { - min-width: 100vw; - min-height: 100vh; - background-color: #293a4b; - margin: 0; - padding: 10px; - font-family: Ubuntu, Verdana, Geneva, Tahoma, sans-serif; - color: white; - box-sizing: border-box; - overflow-x: hidden; -} - -section { - display: block; - margin-bottom: 40px; - min-height: 700px; - position: relative; - - > canvas { - position: absolute; - display: block; - width: 2000px; - height: 2000px; - transform-origin: 0 0; - transform: scale(0.25); - } -} diff --git a/Checkerboard/dist/index.html b/Checkerboard/dist/index.html new file mode 100644 index 0000000..954fd4a --- /dev/null +++ b/Checkerboard/dist/index.html @@ -0,0 +1,18 @@ + + + + + + Checkerboard - AssemblyScript + + + + +

Checkerboard built in WebAssembly

+

Canvas image data is shared with WebAssembly

+

Canvas is 200 * 200px

+ + + + + \ No newline at end of file diff --git a/Checkerboard/index.js b/Checkerboard/dist/index.js similarity index 100% rename from Checkerboard/index.js rename to Checkerboard/dist/index.js diff --git a/Checkerboard/index.ts b/Checkerboard/dist/index.ts similarity index 100% rename from Checkerboard/index.ts rename to Checkerboard/dist/index.ts diff --git a/Checkerboard/index.wasm b/Checkerboard/dist/index.wasm similarity index 100% rename from Checkerboard/index.wasm rename to Checkerboard/dist/index.wasm diff --git a/Checkerboard/dist/styles.css b/Checkerboard/dist/styles.css new file mode 100644 index 0000000..581341b --- /dev/null +++ b/Checkerboard/dist/styles.css @@ -0,0 +1,11 @@ +body { + min-width: 100vw; + min-height: 100vh; + background-color: #293a4b; + margin: 0; + padding: 10px; + font-family: Ubuntu, Verdana, Geneva, Tahoma, sans-serif; + color: white; + box-sizing: border-box; + overflow-x: hidden; +} diff --git a/Checkerboard/dist/tsconfig.json b/Checkerboard/dist/tsconfig.json new file mode 100644 index 0000000..20ee7a2 --- /dev/null +++ b/Checkerboard/dist/tsconfig.json @@ -0,0 +1,6 @@ +{ + "extends": "../../../node_modules/assemblyscript/std/assembly.json", + "include": [ + "./**/*.ts" + ] +} \ No newline at end of file diff --git a/Checkerboard/index.html b/Checkerboard/index.html deleted file mode 100644 index 911c3c4..0000000 --- a/Checkerboard/index.html +++ /dev/null @@ -1,11 +0,0 @@ - - - - - Checkerboard - AssemblyScript - - - - - - \ No newline at end of file diff --git a/Checkerboard/tsconfig.json b/Checkerboard/tsconfig.json deleted file mode 100644 index b8dba77..0000000 --- a/Checkerboard/tsconfig.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "extends": "../node_modules/assemblyscript/std/assembly.json", - "include": [ - "./*.ts" - ] -} \ No newline at end of file diff --git a/Hello World/hello-world.js b/Hello World/dist/hello-world.js similarity index 100% rename from Hello World/hello-world.js rename to Hello World/dist/hello-world.js diff --git a/Hello World/hello-world.ts b/Hello World/dist/hello-world.ts similarity index 100% rename from Hello World/hello-world.ts rename to Hello World/dist/hello-world.ts diff --git a/Hello World/hello-world.wasm b/Hello World/dist/hello-world.wasm similarity index 100% rename from Hello World/hello-world.wasm rename to Hello World/dist/hello-world.wasm diff --git a/Hello World/dist/index.html b/Hello World/dist/index.html new file mode 100644 index 0000000..b4338e4 --- /dev/null +++ b/Hello World/dist/index.html @@ -0,0 +1,12 @@ + + + + + Hello World - AssemblyScript + + + + + + + \ No newline at end of file diff --git a/Hello World/dist/styles.css b/Hello World/dist/styles.css new file mode 100644 index 0000000..4c1a3e1 --- /dev/null +++ b/Hello World/dist/styles.css @@ -0,0 +1,12 @@ +body { + min-width: 100vw; + min-height: 100vh; + background-color: #293a4b; + margin: 0; + padding: 10px; + font-family: Ubuntu, Verdana, Geneva, Tahoma, sans-serif; + color: white; + box-sizing: border-box; + overflow-x: hidden; + font-size: 1.3em; +} diff --git a/Hello World/index.html b/Hello World/index.html deleted file mode 100644 index 0cacf25..0000000 --- a/Hello World/index.html +++ /dev/null @@ -1,9 +0,0 @@ - - - - - Hello World - AssemblyScript - - - - \ No newline at end of file diff --git a/Importing JS/dist/index.html b/Importing JS/dist/index.html new file mode 100644 index 0000000..23858f2 --- /dev/null +++ b/Importing JS/dist/index.html @@ -0,0 +1,13 @@ + + + + + Importing JS - AssemblyScript + + + +

Imported console.log into webAssembly

+

Output in console

+ + + \ No newline at end of file diff --git a/Importing JS/index.js b/Importing JS/dist/index.js similarity index 100% rename from Importing JS/index.js rename to Importing JS/dist/index.js diff --git a/Importing JS/index.ts b/Importing JS/dist/index.ts similarity index 100% rename from Importing JS/index.ts rename to Importing JS/dist/index.ts diff --git a/Importing JS/index.wasm b/Importing JS/dist/index.wasm similarity index 100% rename from Importing JS/index.wasm rename to Importing JS/dist/index.wasm diff --git a/Importing JS/dist/styles.css b/Importing JS/dist/styles.css new file mode 100644 index 0000000..581341b --- /dev/null +++ b/Importing JS/dist/styles.css @@ -0,0 +1,11 @@ +body { + min-width: 100vw; + min-height: 100vh; + background-color: #293a4b; + margin: 0; + padding: 10px; + font-family: Ubuntu, Verdana, Geneva, Tahoma, sans-serif; + color: white; + box-sizing: border-box; + overflow-x: hidden; +} diff --git a/Importing JS/index.html b/Importing JS/index.html deleted file mode 100644 index 1b672d1..0000000 --- a/Importing JS/index.html +++ /dev/null @@ -1,9 +0,0 @@ - - - - - Importing JS - AssemblyScript - - - - \ No newline at end of file diff --git a/Linear Memory/dist/index.html b/Linear Memory/dist/index.html new file mode 100644 index 0000000..4009cfd --- /dev/null +++ b/Linear Memory/dist/index.html @@ -0,0 +1,12 @@ + + + + + Linear Memory - AssemblyScript + + + +

Output in console

+ + + \ No newline at end of file diff --git a/Linear Memory/index.js b/Linear Memory/dist/index.js similarity index 100% rename from Linear Memory/index.js rename to Linear Memory/dist/index.js diff --git a/Linear Memory/index.ts b/Linear Memory/dist/index.ts similarity index 100% rename from Linear Memory/index.ts rename to Linear Memory/dist/index.ts diff --git a/Linear Memory/index.wasm b/Linear Memory/dist/index.wasm similarity index 100% rename from Linear Memory/index.wasm rename to Linear Memory/dist/index.wasm diff --git a/Linear Memory/dist/tsconfig.json b/Linear Memory/dist/tsconfig.json new file mode 100644 index 0000000..ddffe9b --- /dev/null +++ b/Linear Memory/dist/tsconfig.json @@ -0,0 +1,6 @@ +{ + "extends": "../../node_modules/assemblyscript/std/assembly.json", + "include": [ + "./**/*.ts" + ] +} \ No newline at end of file diff --git a/Linear Memory/index.html b/Linear Memory/index.html deleted file mode 100644 index cdfd5ff..0000000 --- a/Linear Memory/index.html +++ /dev/null @@ -1,9 +0,0 @@ - - - - - Linear Memory - AssemblyScript - - - - \ No newline at end of file diff --git a/Sort Colors Benchmark/dist/assembly/index.wasm b/Sort Colors Benchmark/dist/assembly/index.wasm new file mode 100644 index 0000000000000000000000000000000000000000..f03dbe8265e8007642759cbec47f008f955837c5 GIT binary patch literal 7883 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 literal 0 HcmV?d00001 diff --git a/Sort Colors Benchmark/dist/bundle.js b/Sort Colors Benchmark/dist/bundle.js new file mode 100644 index 0000000..c2f9c7c --- /dev/null +++ b/Sort Colors Benchmark/dist/bundle.js @@ -0,0 +1 @@ +!function(t){var n={};function e(r){if(n[r])return n[r].exports;var o=n[r]={i:r,l:!1,exports:{}};return t[r].call(o.exports,o,o.exports,e),o.l=!0,o.exports}e.m=t,e.c=n,e.d=function(t,n,r){e.o(t,n)||Object.defineProperty(t,n,{enumerable:!0,get:r})},e.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},e.t=function(t,n){if(1&n&&(t=e(t)),8&n)return t;if(4&n&&"object"==typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(e.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:t}),2&n&&"string"!=typeof t)for(var o in t)e.d(r,o,function(n){return t[n]}.bind(null,o));return r},e.n=function(t){var n=t&&t.__esModule?function(){return t.default}:function(){return t};return e.d(n,"a",n),n},e.o=function(t,n){return Object.prototype.hasOwnProperty.call(t,n)},e.p="",e(e.s=3)}([function(t,n){t.exports=function(){throw new Error("define cannot be used indirect")}},function(t,n){t.exports=function(t){return t.webpackPolyfill||(t.deprecate=function(){},t.paths=[],t.children||(t.children=[]),Object.defineProperty(t,"loaded",{enumerable:!0,get:function(){return t.l}}),Object.defineProperty(t,"id",{enumerable:!0,get:function(){return t.i}}),t.webpackPolyfill=1),t}},function(t,n){(function(n){t.exports=n}).call(this,{})},function(t,n,e){"use strict";var r=this&&this.__importStar||function(t){if(t&&t.__esModule)return t;var n={};if(null!=t)for(var e in t)Object.hasOwnProperty.call(t,e)&&(n[e]=t[e]);return n.default=t,n};Object.defineProperty(n,"__esModule",{value:!0}),e(4);const o=e(5),i=r(e(6));console.log("STARTING RAINBOW SORTING BENCHMARK");const a=100,s=new ImageData(a,a),c=function(){const t={JS:document.getElementById("section-js-rendering"),WASM:document.getElementById("section-wasm-rendering"),CONTROLS:document.getElementById("section-controls")};return{JS:{SECTION:t.JS,BTN_RESET:t.JS.getElementsByClassName("btn-reset")[0],BTN_SORT:t.JS.getElementsByClassName("btn-sort")[0],UI_RENDER_TIME:t.JS.getElementsByClassName("code-render-time")[0],UI_SORT_TIME:t.JS.getElementsByClassName("code-sort-time")[0],CANVAS:t.JS.getElementsByTagName("canvas")[0]},WASM:{SECTION:t.WASM,BTN_RESET:t.WASM.getElementsByClassName("btn-reset")[0],BTN_SORT:t.WASM.getElementsByClassName("btn-sort")[0],UI_RENDER_TIME:t.WASM.getElementsByClassName("code-render-time")[0],UI_SORT_TIME:t.WASM.getElementsByClassName("code-sort-time")[0],CANVAS:t.WASM.getElementsByTagName("canvas")[0]},CONTROLS:{IN_RND_SEED:t.CONTROLS.getElementsByClassName("in-random-seed")[0],BTN_RANDOMIZE:t.CONTROLS.getElementsByClassName("btn-randomize")[0]}}}();let u="hello";function l(){const t=new i.alea(u),n=s.width,e=s.height,r=s.data;for(let i=0;iconsole.log("Abort!")}});return e=await(async()=>{const e=await fetch(t).then(t=>t.arrayBuffer());return WebAssembly.instantiate(e,n)})()}("./assembly/index.wasm");c.CONTROLS.BTN_RANDOMIZE.addEventListener("click",()=>{l(),f(t),d(n)}),c.CONTROLS.IN_RND_SEED.addEventListener("change",t=>{console.log("Got seed: "+t.target.value),t.target.value?u=t.target.value:alert("Seed must exist")}),c.JS.BTN_RESET.addEventListener("click",()=>{f(t)}),c.JS.BTN_SORT.addEventListener("click",()=>{!function(t){const n=new o.Timeline("Sort JS Canvas");console.log("Sorting JS Canvas...");const e=t.CTX.getImageData(0,0,a,a);if(0===e.width||0===e.height)throw new Error("Failed to get IMAGE DATA. Try running demo hosted on your machine");(function(t){const n=t.width,e=t.height,r=t.data;let i=!1;do{i=!1;for(let t=0;ta&&(s(e,t,r),s(e+1,t,n),i=!0)}}}while(i);function a(t,e){const o=e*n*4+4*t;return o>r.length-1?null:[r[o+0],r[o+1],r[o+2]]}function s(t,e,o){const i=e*n*4+4*t;if(i>r.length-1)return null;r[i+0]=o[0],r[i+1]=o[1],r[i+2]=o[2],r[i+3]=255}})(e),n.mark("Sort JS Canvas"),t.CTX.putImageData(e,0,0),n.mark("Render image"),n.end(),c.JS.UI_SORT_TIME.innerHTML=`${Math.round(n.RUN_DURATION)} ms`,c.JS.UI_RENDER_TIME.innerHTML=`${Math.round(n.get("Render image"))} ms`}(t)}),c.WASM.BTN_RESET.addEventListener("click",()=>{d(n)}),c.WASM.BTN_SORT.addEventListener("click",()=>{!function(t,n){const e=new o.Timeline("Reset WASM Canvas");console.log("Sorting WASM Canvas...");const r=n.CTX.getImageData(0,0,a,a),i=a*a*4,s=t.instance.exports.__alloc(i+1),u=new Uint8ClampedArray(t.instance.exports.memory.buffer,s,i);e.mark("Allocate memory in wasm"),u.set(r.data),e.mark("Transfer image to wasm"),t.instance.exports.sortImgData(s,a),e.mark("Sort image inside wasm");const l=new ImageData(u,a,a);e.mark("Transfer the sorted image back to js"),n.CTX.putImageData(l,0,0),e.mark("Render image"),e.end(!0),c.WASM.UI_SORT_TIME.innerHTML=`${Math.round(e.RUN_DURATION)} ms`,c.WASM.UI_RENDER_TIME.innerHTML=`${Math.round(e.get("Render image"))} ms`}(e,n)}),l(),f(t),d(n)}()},function(t,n,e){},function(t,n,e){"use strict";Object.defineProperty(n,"__esModule",{value:!0});n.Timeline=class{constructor(t){this.NAME=t,this.TIMES=new Map,this.START_TIME=window.performance.now(),this.PREVIOUS_TIME=window.performance.now(),this.RUN_DURATION=0}mark(t){this.TIMES.set(t,Math.round(100*(window.performance.now()-this.PREVIOUS_TIME))/100),this.RUN_DURATION+=window.performance.now()-this.PREVIOUS_TIME,this.PREVIOUS_TIME=window.performance.now()}get(t){const n=this.TIMES.get(t);return null!==n?n:"null"}setLogThereshold(t){this.LOG_TO_CONSOLE_THRESHOLD=t}end(t=!1){this.END_TIME=Math.round(100*window.performance.now())/100,this.RUN_DURATION=this.END_TIME-this.START_TIME,this.TIMES.set("TOTAL",this.RUN_DURATION),t?console.table(this.TIMES):this.LOG_TO_CONSOLE_THRESHOLD&&this.RUN_DURATION>this.LOG_TO_CONSOLE_THRESHOLD&&console.table(this.TIMES)}},n.hexToRGB=function(t){"#"===t[0]&&(t=t.slice(1));var n=parseInt(t,16);return[n>>16&255,n>>8&255,255&n]},n.rgbToHex=function(t,n,e){return"#"+((1<<24)+(t<<16)+(n<<8)+e).toString(16).slice(1)},n.rgbToHsl=function(t,n,e){t/=255,n/=255,e/=255;var r,o,i=Math.max(t,n,e),a=Math.min(t,n,e),s=(i+a)/2;if(i==a)r=o=0;else{var c=i-a;switch(o=s>.5?c/(2-i-a):c/(i+a),i){case t:r=(n-e)/c+(n1&&(e-=1),e<1/6?t+6*(n-t)*e:e<.5?n:e<2/3?t+(n-t)*(2/3-e)*6:t}var s=e<.5?e*(1+n):e+n-e*n,c=2*e-s;r=a(c,s,t+1/3),o=a(c,s,t),i=a(c,s,t-1/3)}return[255*r,255*o,255*i]},n.randomRGB=function(){return[Math.floor(255*Math.random()),Math.floor(255*Math.random()),Math.floor(255*Math.random())]},n.setTimeoutPromise=function(t){return new Promise((n,e)=>{setTimeout(()=>n(),t)})};const r=new class{constructor(){this.Log=new Map,this.CONSOLE_EL=document.getElementById("console")}log(t,n){this.Log.set(t,n)}time(t,n){this.Log.set(t+" ms",Math.round(n)),n>100&&console.log(t+" : "+n)}printLogToConsole(){const t=this.CONSOLE_EL.getElementsByClassName("log").item(0);if(t){t.innerHTML="";for(let n of this.Log){let e=n[1];if(!e)continue;const r=document.createElement("div"),o=document.createElement("span"),i=document.createElement("span");o.innerHTML=n[0].toString(),i.innerHTML=e.toString(),r.append(o,i),r.className="entry",t.append(r)}}}};n.LOGGER=r},function(t,n,e){var r=e(7),o=e(8),i=e(9),a=e(10),s=e(11),c=e(12),u=e(13);u.alea=r,u.xor128=o,u.xorwow=i,u.xorshift7=a,u.xor4096=s,u.tychei=c,t.exports=u},function(t,n,e){(function(t){var r;!function(t,o,i){function a(t){var n,e=this,r=(n=4022871197,function(t){t=String(t);for(var e=0;e>>0,n=(r*=n)>>>0,n+=4294967296*(r-=n)}return 2.3283064365386963e-10*(n>>>0)});e.next=function(){var t=2091639*e.s0+2.3283064365386963e-10*e.c;return e.s0=e.s1,e.s1=e.s2,e.s2=t-(e.c=0|t)},e.c=1,e.s0=r(" "),e.s1=r(" "),e.s2=r(" "),e.s0-=r(t),e.s0<0&&(e.s0+=1),e.s1-=r(t),e.s1<0&&(e.s1+=1),e.s2-=r(t),e.s2<0&&(e.s2+=1),r=null}function s(t,n){return n.c=t.c,n.s0=t.s0,n.s1=t.s1,n.s2=t.s2,n}function c(t,n){var e=new a(t),r=n&&n.state,o=e.next;return o.int32=function(){return 4294967296*e.next()|0},o.double=function(){return o()+11102230246251565e-32*(2097152*o()|0)},o.quick=o,r&&("object"==typeof r&&s(r,e),o.state=function(){return s(e,{})}),o}o&&o.exports?o.exports=c:e(0)&&e(2)?void 0===(r=function(){return c}.call(n,e,n,o))||(o.exports=r):this.alea=c}(0,t,e(0))}).call(this,e(1)(t))},function(t,n,e){(function(t){var r;!function(t,o,i){function a(t){var n=this,e="";n.x=0,n.y=0,n.z=0,n.w=0,n.next=function(){var t=n.x^n.x<<11;return n.x=n.y,n.y=n.z,n.z=n.w,n.w^=n.w>>>19^t^t>>>8},t===(0|t)?n.x=t:e+=t;for(var r=0;r>>0)/4294967296};return o.double=function(){do{var t=((e.next()>>>11)+(e.next()>>>0)/4294967296)/(1<<21)}while(0===t);return t},o.int32=e.next,o.quick=o,r&&("object"==typeof r&&s(r,e),o.state=function(){return s(e,{})}),o}o&&o.exports?o.exports=c:e(0)&&e(2)?void 0===(r=function(){return c}.call(n,e,n,o))||(o.exports=r):this.xor128=c}(0,t,e(0))}).call(this,e(1)(t))},function(t,n,e){(function(t){var r;!function(t,o,i){function a(t){var n=this,e="";n.next=function(){var t=n.x^n.x>>>2;return n.x=n.y,n.y=n.z,n.z=n.w,n.w=n.v,(n.d=n.d+362437|0)+(n.v=n.v^n.v<<4^t^t<<1)|0},n.x=0,n.y=0,n.z=0,n.w=0,n.v=0,t===(0|t)?n.x=t:e+=t;for(var r=0;r>>4),n.next()}function s(t,n){return n.x=t.x,n.y=t.y,n.z=t.z,n.w=t.w,n.v=t.v,n.d=t.d,n}function c(t,n){var e=new a(t),r=n&&n.state,o=function(){return(e.next()>>>0)/4294967296};return o.double=function(){do{var t=((e.next()>>>11)+(e.next()>>>0)/4294967296)/(1<<21)}while(0===t);return t},o.int32=e.next,o.quick=o,r&&("object"==typeof r&&s(r,e),o.state=function(){return s(e,{})}),o}o&&o.exports?o.exports=c:e(0)&&e(2)?void 0===(r=function(){return c}.call(n,e,n,o))||(o.exports=r):this.xorwow=c}(0,t,e(0))}).call(this,e(1)(t))},function(t,n,e){(function(t){var r;!function(t,o,i){function a(t){var n=this;n.next=function(){var t,e,r=n.x,o=n.i;return t=r[o],e=(t^=t>>>7)^t<<24,e^=(t=r[o+1&7])^t>>>10,e^=(t=r[o+3&7])^t>>>3,e^=(t=r[o+4&7])^t<<7,t=r[o+7&7],e^=(t^=t<<13)^t<<9,r[o]=e,n.i=o+1&7,e},function(t,n){var e,r=[];if(n===(0|n))r[0]=n;else for(n=""+n,e=0;e0;--e)t.next()}(n,t)}function s(t,n){return n.x=t.x.slice(),n.i=t.i,n}function c(t,n){null==t&&(t=+new Date);var e=new a(t),r=n&&n.state,o=function(){return(e.next()>>>0)/4294967296};return o.double=function(){do{var t=((e.next()>>>11)+(e.next()>>>0)/4294967296)/(1<<21)}while(0===t);return t},o.int32=e.next,o.quick=o,r&&(r.x&&s(r,e),o.state=function(){return s(e,{})}),o}o&&o.exports?o.exports=c:e(0)&&e(2)?void 0===(r=function(){return c}.call(n,e,n,o))||(o.exports=r):this.xorshift7=c}(0,t,e(0))}).call(this,e(1)(t))},function(t,n,e){(function(t){var r;!function(t,o,i){function a(t){var n=this;n.next=function(){var t,e,r=n.w,o=n.X,i=n.i;return n.w=r=r+1640531527|0,e=o[i+34&127],t=o[i=i+1&127],e^=e<<13,t^=t<<17,e^=e>>>15,t^=t>>>12,e=o[i]=e^t,n.i=i,e+(r^r>>>16)|0},function(t,n){var e,r,o,i,a,s=[],c=128;for(n===(0|n)?(r=n,n=null):(n+="\0",r=0,c=Math.max(c,n.length)),o=0,i=-32;i>>15,r^=r<<4,r^=r>>>13,i>=0&&(a=a+1640531527|0,o=0==(e=s[127&i]^=r+a)?o+1:0);for(o>=128&&(s[127&(n&&n.length||0)]=-1),o=127,i=512;i>0;--i)r=s[o+34&127],e=s[o=o+1&127],r^=r<<13,e^=e<<17,r^=r>>>15,e^=e>>>12,s[o]=r^e;t.w=a,t.X=s,t.i=o}(n,t)}function s(t,n){return n.i=t.i,n.w=t.w,n.X=t.X.slice(),n}function c(t,n){null==t&&(t=+new Date);var e=new a(t),r=n&&n.state,o=function(){return(e.next()>>>0)/4294967296};return o.double=function(){do{var t=((e.next()>>>11)+(e.next()>>>0)/4294967296)/(1<<21)}while(0===t);return t},o.int32=e.next,o.quick=o,r&&(r.X&&s(r,e),o.state=function(){return s(e,{})}),o}o&&o.exports?o.exports=c:e(0)&&e(2)?void 0===(r=function(){return c}.call(n,e,n,o))||(o.exports=r):this.xor4096=c}(0,t,e(0))}).call(this,e(1)(t))},function(t,n,e){(function(t){var r;!function(t,o,i){function a(t){var n=this,e="";n.next=function(){var t=n.b,e=n.c,r=n.d,o=n.a;return t=t<<25^t>>>7^e,e=e-r|0,r=r<<24^r>>>8^o,o=o-t|0,n.b=t=t<<20^t>>>12^e,n.c=e=e-r|0,n.d=r<<16^e>>>16^o,n.a=o-t|0},n.a=0,n.b=0,n.c=-1640531527,n.d=1367130551,t===Math.floor(t)?(n.a=t/4294967296|0,n.b=0|t):e+=t;for(var r=0;r>>0)/4294967296};return o.double=function(){do{var t=((e.next()>>>11)+(e.next()>>>0)/4294967296)/(1<<21)}while(0===t);return t},o.int32=e.next,o.quick=o,r&&("object"==typeof r&&s(r,e),o.state=function(){return s(e,{})}),o}o&&o.exports?o.exports=c:e(0)&&e(2)?void 0===(r=function(){return c}.call(n,e,n,o))||(o.exports=r):this.tychei=c}(0,t,e(0))}).call(this,e(1)(t))},function(t,n,e){var r;!function(o,i,a){var s,c=256,u=6,l="random",f=a.pow(c,u),d=a.pow(2,52),h=2*d,m=c-1;function S(t,n,e){var r=[],m=x(function t(n,e){var r,o=[],i=typeof n;if(e&&"object"==i)for(r in n)try{o.push(t(n[r],e-1))}catch(t){}return o.length?o:"string"==i?n:n+"\0"}((n=1==n?{entropy:!0}:n||{}).entropy?[t,v(i)]:null==t?function(){try{var t;return s&&(t=s.randomBytes)?t=t(c):(t=new Uint8Array(c),(o.crypto||o.msCrypto).getRandomValues(t)),v(t)}catch(t){var n=o.navigator,e=n&&n.plugins;return[+new Date,o,e,o.screen,v(i)]}}():t,3),r),S=new T(r),E=function(){for(var t=S.g(u),n=f,e=0;t=h;)t/=2,n/=2,e>>>=1;return(t+e)/n};return E.int32=function(){return 0|S.g(4)},E.quick=function(){return S.g(4)/4294967296},E.double=E,x(v(S.S),i),(n.pass||e||function(t,n,e,r){return r&&(r.S&&g(r,S),t.state=function(){return g(S,{})}),e?(a[l]=t,n):t})(E,m,"global"in n?n.global:this==a,n.state)}function T(t){var n,e=t.length,r=this,o=0,i=r.i=r.j=0,a=r.S=[];for(e||(t=[e++]);o + + + + + AssemblyScript Benchmark + + + + +
+

WebAssembly benchmark

+

Images are both 100 * 100 px (scaled up in View Layer)

+ +
+

Shared random image data for both:

+ + +
+ +
+

Sort colors with JS

+ ~ 10 to 15s to sort with hello. seed +
+ + +
+
+ Rendering time: + Sorting time: +
+
+ +
+
+ +
+

Sort colors with WebAssembly

+ ~ 7 to 9s to sort with hello. seed +
+ + +
+
+ Rendering time: + Sorting time: +
+
+ +
+
+
+ + + \ No newline at end of file diff --git a/Sort Colors Benchmark/dist/styles.css b/Sort Colors Benchmark/dist/styles.css new file mode 100644 index 0000000..53f7f39 --- /dev/null +++ b/Sort Colors Benchmark/dist/styles.css @@ -0,0 +1,2 @@ +body{min-width:100vw;min-height:100vh;background-color:#293a4b;margin:0;padding:10px;font-family:Ubuntu, Verdana, Geneva, Tahoma, sans-serif;color:white;box-sizing:border-box;overflow-x:hidden}section{display:block;margin-bottom:40px}section>div.btns{margin-top:10px}section>div.perfomance-uis{margin-top:10px;font-size:1.2em}section>div.perfomance-uis>span ~ span{margin-left:20px}section>div.viewport{position:relative;margin-top:10px;height:500px}section>div.viewport>canvas{position:absolute;display:block;transform-origin:0 0;image-rendering:pixelated;image-rendering:crisp-edges}code{padding:3px 6px} + diff --git a/Sort Colors Benchmark/src/assembly/index.ts b/Sort Colors Benchmark/src/assembly/index.ts new file mode 100644 index 0000000..1bc975a --- /dev/null +++ b/Sort Colors Benchmark/src/assembly/index.ts @@ -0,0 +1,98 @@ +// The entry file of your WebAssembly module. +memory.grow(1); + +function getPixelRGB(X: i32, Y: i32, WIDTH: i32, DATA_POINTER: i32): u32 { + const PIXEL_INDEX = Y * WIDTH * 4 + X * 4 + const R = load(DATA_POINTER + PIXEL_INDEX + 0) + const G = load(DATA_POINTER + PIXEL_INDEX + 1) + const B = load(DATA_POINTER + PIXEL_INDEX + 2) + const A = load(DATA_POINTER + PIXEL_INDEX + 3) + return (R << 16) + (G << 8) + (B) +} + +function setPixelRGB(X: i32, Y: i32, WIDTH: i32, DATA_POINTER: i32, RGB: u32): void { + const PIXEL_INDEX = Y * WIDTH * 4 + X * 4 + const R = (RGB >> 16) + const G = (RGB - (R << 16)) >> 8 + const B = (RGB - (R << 16) - (G << 8)) + + store(DATA_POINTER + PIXEL_INDEX + 0, R) + store(DATA_POINTER + PIXEL_INDEX + 1, G) + store(DATA_POINTER + PIXEL_INDEX + 2, B) + store(DATA_POINTER + PIXEL_INDEX + 3, 255) +} + +/** + * + * @param R Red as u8 + * @param G Green as u8 + * @param B Blue as u8 + * @returns HSL as u32. H, S, L range (0, 255). H is left shifted 16bits, S 8bits, and L 0bits + */ +function rgbToHsl(RGB: u32): u32 { + const R = (RGB >> 16) + const G = (RGB - (R << 16)) >> 8 + const B = (RGB - (R << 16) - (G << 8)) + + let R_f32 = (R) / 255 + let G_f32 = (G) / 255 + let B_f32 = (B) / 255; + + let max_GB = Math.max(G_f32, B_f32) + let max = Math.max(max_GB, R_f32) + let min_GB = Math.min(G_f32, B_f32) + let min = Math.min(min_GB, R_f32) + + let H: f32 = 0, S: f32 = 0, L: f32 = (max + min) / 2; + + if (max === min) { + H = S = 0; // achromatic + } else { + var d = max - min; + S = L > 0.5 ? d / (2 - max - min) : d / (max + min); + + if (max === R_f32) { + H = (G_f32 - B_f32) / d + (G_f32 < B_f32 ? 6 : 0) + } else { + if (max === G_f32) { + H = (B_f32 - R_f32) / d + 2 + } else { + if (max === B_f32) { + H = (R_f32 - G_f32) / d + 4; + } + } + } + + H = H / 6; + } + + return (((H * 255) << 16) + ((S * 255) << 8) + (L * 255)) +} + +export { getPixelRGB, setPixelRGB, rgbToHsl } + +export function sortImgData(DATA_POINTER: i32, IMG_SIZE: i32): void { + const WIDTH: i32 = IMG_SIZE + const HEIGHT: i32 = IMG_SIZE + let didChanges: u8 = 0 + + do { + didChanges = 0 + for (let y: i32 = 0; y < HEIGHT; y++) { + for (let x: i32 = 0; x < WIDTH; x++) { + const PIXEL_B = getPixelRGB(x + 1, y, WIDTH, DATA_POINTER) + const PIXEL_A = getPixelRGB(x, y, WIDTH, DATA_POINTER) + + const PIXEL_B_HUE = rgbToHsl(PIXEL_B) >> 16 + const PIXEL_A_HUE = rgbToHsl(PIXEL_A) >> 16 + + if (PIXEL_B_HUE > PIXEL_A_HUE) { + setPixelRGB(x, y, WIDTH, DATA_POINTER, PIXEL_B) + setPixelRGB(x + 1, y, WIDTH, DATA_POINTER, PIXEL_A) + didChanges = 1 + } + } + } + } while (didChanges === 1); + +} \ No newline at end of file diff --git a/Sort Colors Benchmark/src/assembly/index.wasm b/Sort Colors Benchmark/src/assembly/index.wasm new file mode 100644 index 0000000000000000000000000000000000000000..f03dbe8265e8007642759cbec47f008f955837c5 GIT binary patch literal 7883 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 literal 0 HcmV?d00001 diff --git a/Sort Colors Benchmark/src/assembly/tsconfig.json b/Sort Colors Benchmark/src/assembly/tsconfig.json new file mode 100644 index 0000000..20ee7a2 --- /dev/null +++ b/Sort Colors Benchmark/src/assembly/tsconfig.json @@ -0,0 +1,6 @@ +{ + "extends": "../../../node_modules/assemblyscript/std/assembly.json", + "include": [ + "./**/*.ts" + ] +} \ No newline at end of file diff --git a/Sort Colors Benchmark/src/index.html b/Sort Colors Benchmark/src/index.html new file mode 100644 index 0000000..1f0632e --- /dev/null +++ b/Sort Colors Benchmark/src/index.html @@ -0,0 +1,58 @@ + + + + + + AssemblyScript Benchmark + + + + +
+

WebAssembly benchmark

+

Images are both 100 * 100 px (scaled up in View Layer)

+ +
+

Shared random image data for both:

+ + +
+ +
+

Sort colors with JS

+ ~ 10 to 15s to sort with hello. seed +
+ + +
+
+ Rendering time: + Sorting time: +
+
+ +
+
+ +
+

Sort colors with WebAssembly

+ ~ 7 to 9s to sort with hello. seed +
+ + +
+
+ Rendering time: + Sorting time: +
+
+ +
+
+
+ + + \ No newline at end of file diff --git a/Sort Colors Benchmark/src/index.ts b/Sort Colors Benchmark/src/index.ts new file mode 100644 index 0000000..db60561 --- /dev/null +++ b/Sort Colors Benchmark/src/index.ts @@ -0,0 +1,293 @@ +import './styles.scss' +import { Timeline, rgbToHsl, hslToRgb } from './util' +import * as seedrandom from 'seedrandom' +import { CanvasContext } from './interfaces'; + +console.log("STARTING RAINBOW SORTING BENCHMARK") + +const IMG_SIZE = 100 +const RANDOM_IMG_DATA = new ImageData(IMG_SIZE, IMG_SIZE) // Shared initial random image data +const DOM_ELEMENTS = gatherDOMElements() + +let RND_SEED = 'hello' + + +main() +async function main() { + const JS_CANVAS = setupJSCanvas() + const WASM_CANVAS = setupWASMCanvas() + + const WASM_MODULE = await wasmBrowserInstantiate("./assembly/index.wasm"); + + attachEventListeners() + makeRndInitialImgData() + resetCanvasJS(JS_CANVAS) + resetCanvasWASM(WASM_CANVAS) + + function attachEventListeners() { + DOM_ELEMENTS.CONTROLS.BTN_RANDOMIZE.addEventListener('click', () => { + makeRndInitialImgData() + resetCanvasJS(JS_CANVAS) + resetCanvasWASM(WASM_CANVAS) + }) + + DOM_ELEMENTS.CONTROLS.IN_RND_SEED.addEventListener('change', (e) => { + console.log('Got seed: ' + e.target.value) + if (!e.target.value) { + alert('Seed must exist') + return + } + RND_SEED = e.target.value + }) + + DOM_ELEMENTS.JS.BTN_RESET.addEventListener('click', () => { + resetCanvasJS(JS_CANVAS) + }) + + DOM_ELEMENTS.JS.BTN_SORT.addEventListener('click', () => { + sortCanvasJS(JS_CANVAS) + }) + + DOM_ELEMENTS.WASM.BTN_RESET.addEventListener('click', () => { + resetCanvasWASM(WASM_CANVAS) + }) + + DOM_ELEMENTS.WASM.BTN_SORT.addEventListener('click', () => { + sortCanvasWASM(WASM_MODULE, WASM_CANVAS) + }) + } +} + +function makeRndInitialImgData() { + const seededRnd = new seedrandom.alea(RND_SEED); + + const WIDTH = RANDOM_IMG_DATA.width, HEIGHT = RANDOM_IMG_DATA.height + const RND_IMG_DATA_DATA = RANDOM_IMG_DATA.data + + for (let y = 0; y < HEIGHT; y++) { + for (let x = 0; x < WIDTH; x++) { + const INDEX = y * WIDTH * 4 + x * 4 + const COLOR_RGB = hslToRgb(seededRnd(), 1, 0.5) + + RND_IMG_DATA_DATA[INDEX] = COLOR_RGB[0] + RND_IMG_DATA_DATA[INDEX + 1] = COLOR_RGB[1] + RND_IMG_DATA_DATA[INDEX + 2] = COLOR_RGB[2] + RND_IMG_DATA_DATA[INDEX + 3] = 255 + } + } +} + + +function resetCanvasJS(JS_CANVAS: CanvasContext) { + const TIMELINE = new Timeline('Reset JS Canvas'); + + JS_CANVAS.CTX.putImageData(RANDOM_IMG_DATA, 0, 0) + TIMELINE.mark('Reset JS Canvas') + TIMELINE.end() + + DOM_ELEMENTS.JS.UI_RENDER_TIME.innerHTML = `${Math.round(TIMELINE.RUN_DURATION)} ms` +} + +function sortCanvasJS(JS_CANVAS: CanvasContext) { + const TIMELINE = new Timeline('Sort JS Canvas'); + console.log("Sorting JS Canvas...") + + const IMG_DATA = JS_CANVAS.CTX.getImageData(0, 0, IMG_SIZE, IMG_SIZE) + + if(IMG_DATA.width === 0 || IMG_DATA.height === 0){ + throw new Error('Failed to get IMAGE DATA. Try running demo hosted on your machine') + } + + sortImgDataJS(IMG_DATA) + TIMELINE.mark('Sort JS Canvas') + + JS_CANVAS.CTX.putImageData(IMG_DATA, 0, 0) + TIMELINE.mark('Render image') + TIMELINE.end() + + DOM_ELEMENTS.JS.UI_SORT_TIME.innerHTML = `${Math.round(TIMELINE.RUN_DURATION)} ms` + DOM_ELEMENTS.JS.UI_RENDER_TIME.innerHTML = `${Math.round(TIMELINE.get('Render image'))} ms` + + + /** Sorts and Mutates IMG_DATA */ + function sortImgDataJS(IMG_DATA: ImageData) { + const WIDTH = IMG_DATA.width, HEIGHT = IMG_DATA.height + const IMG_DATA_DATA = IMG_DATA.data + + let didChanges = false + + do { + didChanges = false + for (let y = 0; y < HEIGHT; y++) { + for (let x = 0; x < WIDTH; x++) { + const PIXEL_A = getPixelRGB(x, y) + const PIXEL_B = getPixelRGB(x + 1, y) // x may be larger than width but the index will be correct + + if (PIXEL_A && PIXEL_B) { + const PIXEL_A_HUE = rgbToHsl(PIXEL_A[0], PIXEL_A[1], PIXEL_A[2])[0] + const PIXEL_B_HUE = rgbToHsl(PIXEL_B[0], PIXEL_B[1], PIXEL_B[2])[0] + + if (PIXEL_B_HUE > PIXEL_A_HUE) { + setPixelRGB(x, y, PIXEL_B) + setPixelRGB(x + 1, y, PIXEL_A) + didChanges = true + } + } + } + } + } while (didChanges); + + function getPixelRGB(X: number, Y: number) { + const PIXEL_INDEX = Y * WIDTH * 4 + X * 4 + if (PIXEL_INDEX > IMG_DATA_DATA.length - 1) return null + return [ + IMG_DATA_DATA[PIXEL_INDEX + 0], + IMG_DATA_DATA[PIXEL_INDEX + 1], + IMG_DATA_DATA[PIXEL_INDEX + 2], + ] + } + + function setPixelRGB(X: number, Y: number, RGB: number[]) { + const PIXEL_INDEX = Y * WIDTH * 4 + X * 4 + if (PIXEL_INDEX > IMG_DATA_DATA.length - 1) return null + IMG_DATA_DATA[PIXEL_INDEX + 0] = RGB[0] + IMG_DATA_DATA[PIXEL_INDEX + 1] = RGB[1] + IMG_DATA_DATA[PIXEL_INDEX + 2] = RGB[2] + IMG_DATA_DATA[PIXEL_INDEX + 3] = 255 + } + + } + +} + +function resetCanvasWASM(WASM_CANVAS: CanvasContext) { + const TIMELINE = new Timeline('Reset WASM Canvas'); + + WASM_CANVAS.CTX.putImageData(RANDOM_IMG_DATA, 0, 0) + TIMELINE.mark('Reset WASM Canvas') + TIMELINE.end() + + DOM_ELEMENTS.JS.UI_RENDER_TIME.innerHTML = `${Math.round(TIMELINE.RUN_DURATION)} ms` +} + +function sortCanvasWASM(WASM_MODULE: WebAssembly.WebAssemblyInstantiatedSource, WASM_CANVAS: CanvasContext) { + const TIMELINE = new Timeline('Reset WASM Canvas'); + console.log("Sorting WASM Canvas...") + + + const IMG_DATA = WASM_CANVAS.CTX.getImageData(0, 0, IMG_SIZE, IMG_SIZE) + const IMG_DATA_LENGTH = IMG_SIZE * IMG_SIZE * 4 + + // Alocate memory and store a pointer to it + const WASM_IMG_DATA_POINTER = WASM_MODULE.instance.exports.__alloc(IMG_DATA_LENGTH + 1) + const WASM_IMG_DATA = new Uint8ClampedArray(WASM_MODULE.instance.exports.memory.buffer, WASM_IMG_DATA_POINTER, IMG_DATA_LENGTH) + TIMELINE.mark('Allocate memory in wasm') + + // Transfer the IMG_DATA from JS to WASM + WASM_IMG_DATA.set(IMG_DATA.data) + TIMELINE.mark('Transfer image to wasm') + + // Sort IMG_DATA within WASM + WASM_MODULE.instance.exports.sortImgData(WASM_IMG_DATA_POINTER, IMG_SIZE) + TIMELINE.mark('Sort image inside wasm') + + // Transfer the data back to JS + const NEW_IMG_DATA = new ImageData(WASM_IMG_DATA, IMG_SIZE, IMG_SIZE) + TIMELINE.mark('Transfer the sorted image back to js') + + + WASM_CANVAS.CTX.putImageData(NEW_IMG_DATA, 0, 0) + TIMELINE.mark('Render image') + TIMELINE.end(true) + + DOM_ELEMENTS.WASM.UI_SORT_TIME.innerHTML = `${Math.round(TIMELINE.RUN_DURATION)} ms` + DOM_ELEMENTS.WASM.UI_RENDER_TIME.innerHTML = `${Math.round(TIMELINE.get('Render image'))} ms` + +} + + + + +function gatherDOMElements() { + const DOM_SECTIONS = { + JS: document.getElementById('section-js-rendering'), + WASM: document.getElementById('section-wasm-rendering'), + CONTROLS: document.getElementById('section-controls'), + } + + return { + JS: { + SECTION: DOM_SECTIONS.JS, + BTN_RESET: DOM_SECTIONS.JS.getElementsByClassName('btn-reset')[0], + BTN_SORT: DOM_SECTIONS.JS.getElementsByClassName('btn-sort')[0], + UI_RENDER_TIME: DOM_SECTIONS.JS.getElementsByClassName('code-render-time')[0], + UI_SORT_TIME: DOM_SECTIONS.JS.getElementsByClassName('code-sort-time')[0], + CANVAS: DOM_SECTIONS.JS.getElementsByTagName('canvas')[0], + }, + WASM: { + SECTION: DOM_SECTIONS.WASM, + BTN_RESET: DOM_SECTIONS.WASM.getElementsByClassName('btn-reset')[0], + BTN_SORT: DOM_SECTIONS.WASM.getElementsByClassName('btn-sort')[0], + UI_RENDER_TIME: DOM_SECTIONS.WASM.getElementsByClassName('code-render-time')[0], + UI_SORT_TIME: DOM_SECTIONS.WASM.getElementsByClassName('code-sort-time')[0], + CANVAS: DOM_SECTIONS.WASM.getElementsByTagName('canvas')[0], + }, + CONTROLS: { + IN_RND_SEED: DOM_SECTIONS.CONTROLS.getElementsByClassName('in-random-seed')[0], + BTN_RANDOMIZE: DOM_SECTIONS.CONTROLS.getElementsByClassName('btn-randomize')[0], + } + } + +} + +function setupJSCanvas() { + const JS_CTX = DOM_ELEMENTS.JS.CANVAS.getContext('2d') + DOM_ELEMENTS.JS.CANVAS.width = IMG_SIZE + DOM_ELEMENTS.JS.CANVAS.height = IMG_SIZE + DOM_ELEMENTS.JS.CANVAS.style.transform = `scale(${500 / IMG_SIZE})` + JS_CTX.fillRect(0, 0, IMG_SIZE, IMG_SIZE) + + const JS_CANVAS: CanvasContext = { + CANVAS: DOM_ELEMENTS.JS.CANVAS, + CTX: JS_CTX, + } + + return JS_CANVAS +} + +function setupWASMCanvas() { + const WASM_CTX = DOM_ELEMENTS.WASM.CANVAS.getContext('2d') + DOM_ELEMENTS.WASM.CANVAS.width = IMG_SIZE + DOM_ELEMENTS.WASM.CANVAS.height = IMG_SIZE + DOM_ELEMENTS.WASM.CANVAS.style.transform = `scale(${500 / IMG_SIZE})` + WASM_CTX.fillRect(0, 0, IMG_SIZE, IMG_SIZE) + + const WASM_CANVAS: CanvasContext = { + CANVAS: DOM_ELEMENTS.WASM.CANVAS, + CTX: WASM_CTX, + } + + return WASM_CANVAS +} + +async function wasmBrowserInstantiate(wasmModuleUrl, importObject?) { + let response = undefined; + + if (!importObject) { + importObject = { + env: { + abort: () => console.log("Abort!") + } + }; + } + + const fetchAndInstantiateTask = async () => { + const wasmArrayBuffer = await fetch(wasmModuleUrl).then(response => + response.arrayBuffer() + ); + return WebAssembly.instantiate(wasmArrayBuffer, importObject); + }; + response = await fetchAndInstantiateTask(); + + return response; +} \ No newline at end of file diff --git a/Sort Colors Benchmark/src/interfaces.ts b/Sort Colors Benchmark/src/interfaces.ts new file mode 100644 index 0000000..261b9d5 --- /dev/null +++ b/Sort Colors Benchmark/src/interfaces.ts @@ -0,0 +1,7 @@ +export interface CanvasContext { + CANVAS: HTMLCanvasElement, + CTX: CanvasRenderingContext2D, + IMG_DATA?: ImageData, + IMG_DATA_VIEW?: DataView + +} \ No newline at end of file diff --git a/Sort Colors Benchmark/src/styles.scss b/Sort Colors Benchmark/src/styles.scss new file mode 100644 index 0000000..11f0b89 --- /dev/null +++ b/Sort Colors Benchmark/src/styles.scss @@ -0,0 +1,52 @@ +body { + min-width: 100vw; + min-height: 100vh; + background-color: #293a4b; + margin: 0; + padding: 10px; + font-family: Ubuntu, Verdana, Geneva, Tahoma, sans-serif; + color: white; + box-sizing: border-box; + overflow-x: hidden; +} + +section { + display: block; + margin-bottom: 40px; + + > div.btns { + margin-top: 10px; + + > button.btn-sort { + + } + } + + > div.perfomance-uis { + margin-top: 10px; + font-size: 1.2em; + + > span ~ span { + margin-left: 20px + } + } + + > div.viewport { + position: relative; + margin-top: 10px; + height: 500px; + + > canvas { + position: absolute; + display: block; + transform-origin: 0 0; + image-rendering: pixelated; + image-rendering: crisp-edges; + + } + } +} + +code { + padding: 3px 6px; +} \ No newline at end of file diff --git a/Benchmark/src/util.ts b/Sort Colors Benchmark/src/util.ts similarity index 56% rename from Benchmark/src/util.ts rename to Sort Colors Benchmark/src/util.ts index 6ae39a6..400fb32 100644 --- a/Benchmark/src/util.ts +++ b/Sort Colors Benchmark/src/util.ts @@ -70,10 +70,10 @@ class Timeline { this.TIMES.set('TOTAL', this.RUN_DURATION) if (PRINT) { - console.log(this.NAME, this.TIMES) + console.table(this.TIMES) } else { if (this.LOG_TO_CONSOLE_THRESHOLD && this.RUN_DURATION > this.LOG_TO_CONSOLE_THRESHOLD) { - console.log(this.NAME, this.TIMES) + console.table(this.TIMES) } } } @@ -93,6 +93,78 @@ function rgbToHex(r, g, b) { return "#" + ((1 << 24) + (r << 16) + (g << 8) + b).toString(16).slice(1); } +/** + * Converts an RGB color value to HSL. Conversion formula + * adapted from http://en.wikipedia.org/wiki/HSL_color_space. + * Assumes r, g, and b are contained in the set [0, 255] and + * returns h, s, and l in the set [0, 1]. + * + * @param Number r The red color value + * @param Number g The green color value + * @param Number b The blue color value + * @return Array The HSL representation + */ +function rgbToHsl(r, g, b) { + r /= 255, g /= 255, b /= 255; + + var max = Math.max(r, g, b), min = Math.min(r, g, b); + var h, s, l = (max + min) / 2; + + if (max == min) { + h = s = 0; // achromatic + } else { + var d = max - min; + s = l > 0.5 ? d / (2 - max - min) : d / (max + min); + + switch (max) { + case r: h = (g - b) / d + (g < b ? 6 : 0); break; + case g: h = (b - r) / d + 2; break; + case b: h = (r - g) / d + 4; break; + } + + h /= 6; + } + + return [h, s, l]; +} + +/** + * Converts an HSL color value to RGB. Conversion formula + * adapted from http://en.wikipedia.org/wiki/HSL_color_space. + * Assumes h, s, and l are contained in the set [0, 1] and + * returns r, g, and b in the set [0, 255]. + * + * @param Number h The hue + * @param Number s The saturation + * @param Number l The lightness + * @return Array The RGB representation + */ +function hslToRgb(h, s, l) { + var r, g, b; + + if (s == 0) { + r = g = b = l; // achromatic + } else { + function hue2rgb(p, q, t) { + if (t < 0) t += 1; + if (t > 1) t -= 1; + if (t < 1 / 6) return p + (q - p) * 6 * t; + if (t < 1 / 2) return q; + if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6; + return p; + } + + var q = l < 0.5 ? l * (1 + s) : l + s - l * s; + var p = 2 * l - q; + + r = hue2rgb(p, q, h + 1 / 3); + g = hue2rgb(p, q, h); + b = hue2rgb(p, q, h - 1 / 3); + } + + return [r * 255, g * 255, b * 255]; +} + function randomRGB() { return [ Math.floor(Math.random() * 255), @@ -108,4 +180,4 @@ function setTimeoutPromise(ms): Promise { } const LOGGER = new Logger() -export { LOGGER, Timeline, hexToRGB, rgbToHex, randomRGB, setTimeoutPromise } \ No newline at end of file +export { LOGGER, Timeline, hexToRGB, rgbToHex, rgbToHsl, hslToRgb, randomRGB, setTimeoutPromise } \ No newline at end of file diff --git a/Benchmark/tsconfig.json b/Sort Colors Benchmark/tsconfig.json similarity index 96% rename from Benchmark/tsconfig.json rename to Sort Colors Benchmark/tsconfig.json index 0bd59e3..92ad538 100644 --- a/Benchmark/tsconfig.json +++ b/Sort Colors Benchmark/tsconfig.json @@ -1,15 +1,14 @@ { - // "extends": "../node_modules/assemblyscript/std/assembly.json", "compilerOptions": { /* Basic Options */ // "incremental": true, /* Enable incremental compilation */ - "target": "esnext", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019' or 'ESNEXT'. */ + "target": "ES2017", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019' or 'ESNEXT'. */ "module": "commonjs", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */ "lib": [ "webworker", "es6", "dom" - ], /* Specify library files to be included in the compilation. */ + ], /* Specify library files to be included in the compilation. */ // "allowJs": true, /* Allow javascript files to be compiled. */ // "checkJs": true, /* Report errors in .js files. */ // "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */ diff --git a/Benchmark/webpack.config.js b/Sort Colors Benchmark/webpack.config.js similarity index 72% rename from Benchmark/webpack.config.js rename to Sort Colors Benchmark/webpack.config.js index 51bb59b..d4b9140 100644 --- a/Benchmark/webpack.config.js +++ b/Sort Colors Benchmark/webpack.config.js @@ -1,6 +1,8 @@ const path = require('path'); const MiniCssExtractPlugin = require('mini-css-extract-plugin'); const HtmlWebpackPlugin = require('html-webpack-plugin'); +const CopyWebpackPlugin = require('copy-webpack-plugin'); + module.exports = { @@ -15,6 +17,11 @@ module.exports = { test: /\.tsx?$/, use: 'ts-loader', exclude: /node_modules/ + }, + { + test: /\.wasm$/, + use: [], + exclude: /node_modules/ } ] }, @@ -24,7 +31,10 @@ module.exports = { }), new HtmlWebpackPlugin({ template: './src/index.html' - }) + }), + new CopyWebpackPlugin([ + {from: './src/assembly/index.wasm', to: './assembly/index.wasm'} + ]) ], resolve: { extensions: ['.tsx', '.ts', '.js'] diff --git a/index.html b/index.html new file mode 100644 index 0000000..48e6f03 --- /dev/null +++ b/index.html @@ -0,0 +1,17 @@ + + + + + WebAssembly Test suite + + + + \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 2e3089a..f490f53 100644 --- a/package-lock.json +++ b/package-lock.json @@ -253,7 +253,6 @@ "version": "6.10.2", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", - "dev": true, "requires": { "fast-deep-equal": "^2.0.1", "fast-json-stable-stringify": "^2.0.0", @@ -264,14 +263,12 @@ "ajv-errors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", - "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", - "dev": true + "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==" }, "ajv-keywords": { "version": "3.4.1", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz", - "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==", - "dev": true + "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==" }, "amdefine": { "version": "1.0.1", @@ -282,8 +279,7 @@ "ansi-colors": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", - "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==", - "dev": true + "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==" }, "ansi-html": { "version": "0.0.7", @@ -433,8 +429,7 @@ "aproba": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "dev": true + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" }, "are-we-there-yet": { "version": "1.1.5", @@ -512,7 +507,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", - "dev": true, "requires": { "array-uniq": "^1.0.1" } @@ -520,8 +514,7 @@ "array-uniq": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", - "dev": true + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=" }, "array-unique": { "version": "0.3.2", @@ -652,8 +645,7 @@ "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" }, "base": { "version": "0.11.2", @@ -734,8 +726,7 @@ "big.js": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", - "dev": true + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==" }, "binary-extensions": { "version": "1.13.1", @@ -761,8 +752,7 @@ "bluebird": { "version": "3.5.5", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.5.tgz", - "integrity": "sha512-5am6HnnfN+urzt4yfg7IgTbotDjIT/u8AJpEt0sIU9FtXfVeezXAPKswrG+xKUCOYAINpSdgZVDU6QFh+cuH3w==", - "dev": true + "integrity": "sha512-5am6HnnfN+urzt4yfg7IgTbotDjIT/u8AJpEt0sIU9FtXfVeezXAPKswrG+xKUCOYAINpSdgZVDU6QFh+cuH3w==" }, "bn.js": { "version": "4.11.8", @@ -826,7 +816,6 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -932,8 +921,7 @@ "buffer-from": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", - "dev": true + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" }, "buffer-indexof": { "version": "1.1.1", @@ -1176,8 +1164,7 @@ "chownr": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.2.tgz", - "integrity": "sha512-GkfeAQh+QNy3wquu9oIZr6SS5x7wGdSgNQvD10X3r+AZr1Oys22HW8kAmDMvNg2+Dm0TeGaEuO8gFwdBXxwO8A==", - "dev": true + "integrity": "sha512-GkfeAQh+QNy3wquu9oIZr6SS5x7wGdSgNQvD10X3r+AZr1Oys22HW8kAmDMvNg2+Dm0TeGaEuO8gFwdBXxwO8A==" }, "chrome-trace-event": { "version": "1.0.2", @@ -1301,8 +1288,7 @@ "commondir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", - "dev": true + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=" }, "component-emitter": { "version": "1.3.0", @@ -1345,14 +1331,12 @@ "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, "concat-stream": { "version": "1.6.2", "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "dev": true, "requires": { "buffer-from": "^1.0.0", "inherits": "^2.0.3", @@ -1364,7 +1348,6 @@ "version": "2.3.6", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -1378,14 +1361,12 @@ "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "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==", - "dev": true, "requires": { "safe-buffer": "~5.1.0" } @@ -1458,7 +1439,6 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", - "dev": true, "requires": { "aproba": "^1.1.1", "fs-write-stream-atomic": "^1.0.8", @@ -1474,11 +1454,98 @@ "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", "dev": true }, + "copy-webpack-plugin": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-5.0.4.tgz", + "integrity": "sha512-YBuYGpSzoCHSSDGyHy6VJ7SHojKp6WHT4D7ItcQFNAYx2hrwkMe56e97xfVR0/ovDuMTrMffXUiltvQljtAGeg==", + "requires": { + "cacache": "^11.3.3", + "find-cache-dir": "^2.1.0", + "glob-parent": "^3.1.0", + "globby": "^7.1.1", + "is-glob": "^4.0.1", + "loader-utils": "^1.2.3", + "minimatch": "^3.0.4", + "normalize-path": "^3.0.0", + "p-limit": "^2.2.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^1.7.0", + "webpack-log": "^2.0.0" + }, + "dependencies": { + "cacache": { + "version": "11.3.3", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-11.3.3.tgz", + "integrity": "sha512-p8WcneCytvzPxhDvYp31PD039vi77I12W+/KfR9S8AZbaiARFBCpsPJS+9uhWfeBfeAtW7o/4vt3MUqLkbY6nA==", + "requires": { + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + } + }, + "globby": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-7.1.1.tgz", + "integrity": "sha1-+yzP+UAfhgCUXfral0QMypcrhoA=", + "requires": { + "array-union": "^1.0.1", + "dir-glob": "^2.0.0", + "glob": "^7.1.2", + "ignore": "^3.3.5", + "pify": "^3.0.0", + "slash": "^1.0.0" + } + }, + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "requires": { + "yallist": "^3.0.2" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + }, + "y18n": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==" + }, + "yallist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", + "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==" + } + } + }, "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, "create-ecdh": { "version": "4.0.3", @@ -1602,8 +1669,7 @@ "cyclist": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", - "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=", - "dev": true + "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=" }, "dashdash": { "version": "1.14.1", @@ -1795,6 +1861,29 @@ "randombytes": "^2.0.0" } }, + "dir-glob": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.2.2.tgz", + "integrity": "sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==", + "requires": { + "path-type": "^3.0.0" + }, + "dependencies": { + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "requires": { + "pify": "^3.0.0" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" + } + } + }, "dns-equal": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", @@ -1882,7 +1971,6 @@ "version": "3.7.1", "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", - "dev": true, "requires": { "end-of-stream": "^1.0.0", "inherits": "^2.0.1", @@ -1894,7 +1982,6 @@ "version": "2.3.6", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -1908,14 +1995,12 @@ "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "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==", - "dev": true, "requires": { "safe-buffer": "~5.1.0" } @@ -1962,8 +2047,7 @@ "emojis-list": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", - "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", - "dev": true + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=" }, "encodeurl": { "version": "1.0.2", @@ -1975,7 +2059,6 @@ "version": "1.4.1", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", - "dev": true, "requires": { "once": "^1.4.0" } @@ -2351,14 +2434,12 @@ "fast-deep-equal": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", - "dev": true + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=" }, "fast-json-stable-stringify": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", - "dev": true + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" }, "faye-websocket": { "version": "0.10.0", @@ -2372,8 +2453,7 @@ "figgy-pudding": { "version": "3.5.1", "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.1.tgz", - "integrity": "sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w==", - "dev": true + "integrity": "sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w==" }, "fill-range": { "version": "7.0.1", @@ -2403,7 +2483,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", - "dev": true, "requires": { "commondir": "^1.0.1", "make-dir": "^2.0.0", @@ -2541,7 +2620,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", - "dev": true, "requires": { "inherits": "^2.0.3", "readable-stream": "^2.3.6" @@ -2551,7 +2629,6 @@ "version": "2.3.6", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -2565,14 +2642,12 @@ "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "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==", - "dev": true, "requires": { "safe-buffer": "~5.1.0" } @@ -2653,7 +2728,6 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", - "dev": true, "requires": { "inherits": "^2.0.1", "readable-stream": "^2.0.0" @@ -2663,7 +2737,6 @@ "version": "2.3.6", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -2677,14 +2750,12 @@ "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "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==", - "dev": true, "requires": { "safe-buffer": "~5.1.0" } @@ -2695,7 +2766,6 @@ "version": "1.0.10", "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", - "dev": true, "requires": { "graceful-fs": "^4.1.2", "iferr": "^0.1.5", @@ -2707,7 +2777,6 @@ "version": "2.3.6", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -2721,14 +2790,12 @@ "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "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==", - "dev": true, "requires": { "safe-buffer": "~5.1.0" } @@ -2738,8 +2805,7 @@ "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, "fsevents": { "version": "1.2.9", @@ -3372,7 +3438,6 @@ "version": "7.1.4", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", - "dev": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -3386,7 +3451,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dev": true, "requires": { "is-glob": "^3.1.0", "path-dirname": "^1.0.0" @@ -3396,7 +3460,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, "requires": { "is-extglob": "^2.1.0" } @@ -3465,8 +3528,7 @@ "graceful-fs": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.2.tgz", - "integrity": "sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q==", - "dev": true + "integrity": "sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q==" }, "handle-thing": { "version": "2.0.0", @@ -3963,8 +4025,12 @@ "iferr": { "version": "0.1.5", "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", - "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", - "dev": true + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=" + }, + "ignore": { + "version": "3.3.10", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", + "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==" }, "import-local": { "version": "2.0.0", @@ -3979,8 +4045,7 @@ "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" }, "in-publish": { "version": "2.0.0", @@ -4013,7 +4078,6 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, "requires": { "once": "^1.3.0", "wrappy": "1" @@ -4022,8 +4086,7 @@ "inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "ini": { "version": "1.3.5", @@ -4184,8 +4247,7 @@ "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" }, "is-finite": { "version": "1.0.2", @@ -4209,7 +4271,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "dev": true, "requires": { "is-extglob": "^2.1.1" } @@ -4310,8 +4371,7 @@ "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" }, "isexe": { "version": "2.0.0", @@ -4358,8 +4418,7 @@ "json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" }, "json-stringify-safe": { "version": "5.0.1", @@ -4377,7 +4436,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, "requires": { "minimist": "^1.2.0" } @@ -4438,7 +4496,6 @@ "version": "1.2.3", "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", - "dev": true, "requires": { "big.js": "^5.2.2", "emojis-list": "^2.0.0", @@ -4449,7 +4506,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, "requires": { "p-locate": "^3.0.0", "path-exists": "^3.0.0" @@ -4458,8 +4514,7 @@ "path-exists": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" } } }, @@ -4511,7 +4566,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dev": true, "requires": { "pify": "^4.0.1", "semver": "^5.6.0" @@ -4520,8 +4574,7 @@ "pify": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" } } }, @@ -4749,7 +4802,6 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, "requires": { "brace-expansion": "^1.1.7" } @@ -4757,14 +4809,12 @@ "minimist": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" }, "mississippi": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", - "dev": true, "requires": { "concat-stream": "^1.5.0", "duplexify": "^3.4.2", @@ -4803,7 +4853,6 @@ "version": "0.5.1", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, "requires": { "minimist": "0.0.8" }, @@ -4811,8 +4860,7 @@ "minimist": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" } } }, @@ -4820,7 +4868,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", - "dev": true, "requires": { "aproba": "^1.1.1", "copy-concurrently": "^1.0.0", @@ -5085,8 +5132,7 @@ "normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" }, "normalize-url": { "version": "1.9.1", @@ -5250,7 +5296,6 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, "requires": { "wrappy": "1" } @@ -5338,7 +5383,6 @@ "version": "2.2.1", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz", "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==", - "dev": true, "requires": { "p-try": "^2.0.0" } @@ -5347,7 +5391,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, "requires": { "p-limit": "^2.0.0" } @@ -5370,8 +5413,7 @@ "p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" }, "pako": { "version": "1.0.10", @@ -5383,7 +5425,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", - "dev": true, "requires": { "cyclist": "^1.0.1", "inherits": "^2.0.3", @@ -5394,7 +5435,6 @@ "version": "2.3.6", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -5408,14 +5448,12 @@ "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "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==", - "dev": true, "requires": { "safe-buffer": "~5.1.0" } @@ -5481,8 +5519,7 @@ "path-dirname": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", - "dev": true + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=" }, "path-exists": { "version": "2.1.0", @@ -5496,8 +5533,7 @@ "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" }, "path-is-inside": { "version": "1.0.2", @@ -5584,7 +5620,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", - "dev": true, "requires": { "find-up": "^3.0.0" }, @@ -5593,7 +5628,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, "requires": { "locate-path": "^3.0.0" } @@ -5711,14 +5745,12 @@ "process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, "promise-inflight": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", - "dev": true + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=" }, "proxy-addr": { "version": "2.0.5", @@ -5766,7 +5798,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, "requires": { "end-of-stream": "^1.1.0", "once": "^1.3.1" @@ -5776,7 +5807,6 @@ "version": "1.5.1", "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", - "dev": true, "requires": { "duplexify": "^3.6.0", "inherits": "^2.0.3", @@ -5787,7 +5817,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", - "dev": true, "requires": { "end-of-stream": "^1.1.0", "once": "^1.3.1" @@ -5798,8 +5827,7 @@ "punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" }, "qs": { "version": "6.5.2", @@ -6248,7 +6276,6 @@ "version": "2.7.1", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, "requires": { "glob": "^7.1.3" } @@ -6267,7 +6294,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", - "dev": true, "requires": { "aproba": "^1.1.1" } @@ -6357,6 +6383,11 @@ } } }, + "seedrandom": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/seedrandom/-/seedrandom-3.0.5.tgz", + "integrity": "sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg==" + }, "select-hose": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", @@ -6375,8 +6406,7 @@ "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" }, "send": { "version": "0.17.1", @@ -6410,8 +6440,7 @@ "serialize-javascript": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.9.1.tgz", - "integrity": "sha512-0Vb/54WJ6k5v8sSWN09S0ora+Hnr+cX40r9F170nT+mSkaxltoE/7R3OrIdBSUv1OoiobH1QoWQbCnAO+e8J1A==", - "dev": true + "integrity": "sha512-0Vb/54WJ6k5v8sSWN09S0ora+Hnr+cX40r9F170nT+mSkaxltoE/7R3OrIdBSUv1OoiobH1QoWQbCnAO+e8J1A==" }, "serve-index": { "version": "1.9.1", @@ -6547,6 +6576,11 @@ "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", "dev": true }, + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=" + }, "snapdragon": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", @@ -6883,7 +6917,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", - "dev": true, "requires": { "figgy-pudding": "^3.5.1" } @@ -7002,7 +7035,6 @@ "version": "1.2.3", "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", - "dev": true, "requires": { "end-of-stream": "^1.1.0", "stream-shift": "^1.0.0" @@ -7056,8 +7088,7 @@ "stream-shift": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", - "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", - "dev": true + "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=" }, "strict-uri-encode": { "version": "1.1.0", @@ -7217,7 +7248,6 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, "requires": { "readable-stream": "~2.3.6", "xtend": "~4.0.1" @@ -7227,7 +7257,6 @@ "version": "2.3.6", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -7241,14 +7270,12 @@ "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "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==", - "dev": true, "requires": { "safe-buffer": "~5.1.0" } @@ -7423,8 +7450,7 @@ "typedarray": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", - "dev": true + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" }, "typescript": { "version": "3.6.3", @@ -7472,7 +7498,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", - "dev": true, "requires": { "unique-slug": "^2.0.0" } @@ -7481,7 +7506,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", - "dev": true, "requires": { "imurmurhash": "^0.1.4" } @@ -7548,7 +7572,6 @@ "version": "4.2.2", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", - "dev": true, "requires": { "punycode": "^2.1.0" } @@ -7613,8 +7636,7 @@ "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" }, "util.promisify": { "version": "1.0.0", @@ -7641,8 +7663,7 @@ "uuid": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.3.tgz", - "integrity": "sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ==", - "dev": true + "integrity": "sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ==" }, "v8-compile-cache": { "version": "2.0.3", @@ -8252,7 +8273,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz", "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", - "dev": true, "requires": { "ansi-colors": "^3.0.0", "uuid": "^3.3.2" @@ -8331,8 +8351,7 @@ "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "ws": { "version": "6.2.1", @@ -8346,8 +8365,7 @@ "xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "dev": true + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" }, "y18n": { "version": "3.2.1", diff --git a/package.json b/package.json index d8fa6b4..2cc352a 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,10 @@ "description": "", "main": " ", "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" + "test": "echo \"Error: no test specified\" && exit 1", + "asbuild:untouched": "asc assembly/index.ts -b build/untouched.wasm -t build/untouched.wat --sourceMap --validate --debug", + "asbuild:optimized": "asc assembly/index.ts -b build/optimized.wasm -t build/optimized.wat --sourceMap --validate --optimize", + "asbuild": "npm run asbuild:untouched && npm run asbuild:optimized" }, "author": "", "license": "ISC", @@ -20,5 +23,9 @@ "webpack": "^4.40.2", "webpack-cli": "^3.3.8", "webpack-dev-server": "^3.8.1" + }, + "dependencies": { + "copy-webpack-plugin": "^5.0.4", + "seedrandom": "^3.0.5" } } diff --git a/styles.css b/styles.css new file mode 100644 index 0000000..6889025 --- /dev/null +++ b/styles.css @@ -0,0 +1,22 @@ +body { + min-width: 100vw; + min-height: 100vh; + background-color: #293a4b; + margin: 0; + padding: 10px; + font-family: Ubuntu, Verdana, Geneva, Tahoma, sans-serif; + color: white; + box-sizing: border-box; +} + +a { + color: white +} + +li { + margin-top: 10px +} + +a:visited { + color: rgb(196, 143, 194) +} \ No newline at end of file