From 7ac5451c8130db1b18d86b28c172226d7572f44f Mon Sep 17 00:00:00 2001 From: alanpoon Date: Sat, 30 Jun 2018 20:02:28 +0800 Subject: [PATCH 01/64] t From 0fea787b36a856cc4871b42304b74eb3925f0cc8 Mon Sep 17 00:00:00 2001 From: alanpoon Date: Tue, 19 Feb 2019 08:31:56 +0800 Subject: [PATCH 02/64] t --- Cargo.toml | 2 + backends/conrod_crayon/Cargo.toml | 24 + backends/conrod_crayon/examples/crayon.rs | 87 ++ .../conrod_crayon/examples/workspace.toml | 33 + backends/conrod_crayon/src/lib.rs | 150 ++++ backends/conrod_crayon/src/shaders/conrod.fs | 24 + backends/conrod_crayon/src/shaders/conrod.vs | 18 + .../src/shaders/render_target_p1.fs | 8 + .../src/shaders/render_target_p1.vs | 10 + .../src/shaders/render_target_p2.fs | 12 + .../src/shaders/render_target_p2.vs | 10 + backends/conrod_crayon/src/shaders/texture.fs | 10 + backends/conrod_crayon/src/shaders/texture.vs | 10 + backends/conrod_gfx/examples/all_winit_gfx.rs | 2 +- backends/conrod_ggez/Cargo.toml | 37 + backends/conrod_ggez/examples/ggez.rs | 165 ++++ backends/conrod_ggez/src/ggez_event.rs | 47 ++ backends/conrod_ggez/src/gwg_event.rs | 50 ++ backends/conrod_ggez/src/lib.rs | 756 ++++++++++++++++++ .../examples/all_piston_window.rs | 1 + backends/conrod_piston/src/event.rs | 1 + 21 files changed, 1456 insertions(+), 1 deletion(-) create mode 100644 backends/conrod_crayon/Cargo.toml create mode 100644 backends/conrod_crayon/examples/crayon.rs create mode 100644 backends/conrod_crayon/examples/workspace.toml create mode 100644 backends/conrod_crayon/src/lib.rs create mode 100644 backends/conrod_crayon/src/shaders/conrod.fs create mode 100644 backends/conrod_crayon/src/shaders/conrod.vs create mode 100644 backends/conrod_crayon/src/shaders/render_target_p1.fs create mode 100644 backends/conrod_crayon/src/shaders/render_target_p1.vs create mode 100644 backends/conrod_crayon/src/shaders/render_target_p2.fs create mode 100644 backends/conrod_crayon/src/shaders/render_target_p2.vs create mode 100644 backends/conrod_crayon/src/shaders/texture.fs create mode 100644 backends/conrod_crayon/src/shaders/texture.vs create mode 100644 backends/conrod_ggez/Cargo.toml create mode 100644 backends/conrod_ggez/examples/ggez.rs create mode 100644 backends/conrod_ggez/src/ggez_event.rs create mode 100644 backends/conrod_ggez/src/gwg_event.rs create mode 100644 backends/conrod_ggez/src/lib.rs diff --git a/Cargo.toml b/Cargo.toml index bf624ff20..ee6d6f583 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -8,4 +8,6 @@ members = [ "backends/conrod_glium", "backends/conrod_piston", "backends/conrod_vulkano", + "backends/conrod_ggez", + "backends/conrod_crayon" ] diff --git a/backends/conrod_crayon/Cargo.toml b/backends/conrod_crayon/Cargo.toml new file mode 100644 index 000000000..aa42811df --- /dev/null +++ b/backends/conrod_crayon/Cargo.toml @@ -0,0 +1,24 @@ +[package] +name = "conrod_crayon" +version = "0.62.0" +authors = ["Mitchell Nordine "] +keywords = ["ui", "widgets", "gui", "interface", "graphics"] +description = "An easy-to-use, 100% Rust, extensible 2D GUI library." +license = "MIT OR Apache-2.0" +readme = "../../README.md" +repository = "https://github.com/pistondevelopers/conrod.git" +homepage = "https://github.com/pistondevelopers/conrod" +documentation = "https://docs.rs/conrod" +categories = ["gui"] + +[lib] +name = "conrod_crayon" +path = "./src/lib.rs" + +[dependencies] +conrod_core = { path = "../../conrod_core", version = "0.63" } +crayon = { path = "../../../wasm/crayon"} + +[dev-dependencies] +find_folder = "0.3.0" +image = "0.21" \ No newline at end of file diff --git a/backends/conrod_crayon/examples/crayon.rs b/backends/conrod_crayon/examples/crayon.rs new file mode 100644 index 000000000..60ba5bf54 --- /dev/null +++ b/backends/conrod_crayon/examples/crayon.rs @@ -0,0 +1,87 @@ +extern crate crayon; +extern crate conrod_crayon; +extern crate find_folder; +use crayon::prelude::*; +use conrod_crayon::Renderer; + +struct Window { + renderer: Renderer, + app: conrod_example_shared::DemoApp, + ui: conrod_core::Ui, + ids: conrod_example_shared::Ids, + image_map: conrod_core::image::Map, + batch: CommandBuffer, + time: f32, +} + +impl Window { + pub fn build() -> CrResult { + + let mut ui = conrod_core::UiBuilder::new([WIN_W as f64, WIN_H as f64]) + .theme(conrod_example_shared::theme()) + .build(); + let ids = conrod_example_shared::Ids::new(ui.widget_id_generator()); + let assets = find_folder::Search::KidsThenParents(3, 5).for_folder("assets").unwrap(); + let font_path = assets.join("fonts/NotoSans/NotoSans-Regular.ttf"); + ui.fonts.insert_from_file(font_path).unwrap(); + let rtv = graphics::screen_render_target(ctx); + let mut image_map: conrod_core::image::Map<(RenderTextureHandle,(f64,f64))> = conrod_core::image::Map::new(); + let rust_logo = image_map.insert(load_rust_logo()); + + // Demonstration app state that we'll control with our conrod GUI. + let app = conrod_example_shared::DemoApp::new(rust_logo); + let dpi_factor = device_pixel_ratio(); + let renderer = conrod_crayon::Renderer::new((WIN_W,WIN_H), dpi_factor as f64).unwrap(); + Ok(Window { + app:app, + ui:ui, + ids:ids, + image_map:image_map, + renderer:renderer, + batch: CommandBuffer::new(), + time: 0.0, + }) + } +} + +impl Drop for Window { + fn drop(&mut self) { + video::delete_render_texture(self.texture); + + video::delete_mesh(self.pass.mesh); + video::delete_shader(self.pass.shader); + video::delete_surface(self.pass.surface); + + video::delete_mesh(self.post_effect.mesh); + video::delete_shader(self.post_effect.shader); + video::delete_surface(self.post_effect.surface); + } +} + +impl LifecycleListener for Window { + fn on_update(&mut self) -> CrResult<()> { + let surface = self.pass.surface; + let dc = Draw::new(self.pass.shader, self.pass.mesh); + self.batch.draw(dc); + self.batch.submit(surface)?; + + let surface = self.post_effect.surface; + let mut dc = Draw::new(self.post_effect.shader, self.post_effect.mesh); + dc.set_uniform_variable("renderedTexture", self.texture); + dc.set_uniform_variable("time", self.time); + self.batch.draw(dc); + self.batch.submit(surface)?; + + self.time += 0.05; + Ok(()) + } +} +fn load_rust_logo() -> TextureHandle { + video::create_texture_from("res:rust.png") +} +main!({ + let mut params = Params::default(); + params.window.title = "CR: RenderTexture".into(); + params.window.size = (568, 320).into(); + crayon::application::setup(params, Window::build).unwrap(); +}); \ No newline at end of file diff --git a/backends/conrod_crayon/examples/workspace.toml b/backends/conrod_crayon/examples/workspace.toml new file mode 100644 index 000000000..44c86d2dc --- /dev/null +++ b/backends/conrod_crayon/examples/workspace.toml @@ -0,0 +1,33 @@ +[assets] +source = 'assets' +destination = 'resources' + +[[assets.importers]] +type = 'Texture' +extensions = [ + '.png', + '.jpg', + '.jpeg', + '.bmp', + '.tga', + '.psd', # Yes, we do supports .PSD files. +] + +[[assets.importers]] +type = 'Transmission' +extensions = [ + '.obj', + '.blend', + '.fbx', + '.gltf', + '.dae', + '.3ds', +] + +[[assets.importers]] +type = 'Audio' +extensions = [ + '.mp3', + '.wav', + '.ogg', +] \ No newline at end of file diff --git a/backends/conrod_crayon/src/lib.rs b/backends/conrod_crayon/src/lib.rs new file mode 100644 index 000000000..7cfde0d6c --- /dev/null +++ b/backends/conrod_crayon/src/lib.rs @@ -0,0 +1,150 @@ +extern crate crayon; +extern crate conrod_core; +use crayon::impl_vertex; +use crayon::prelude::*; +use conrod_core::{ + Rect, + Scalar, + color, + image, + render, + text::{rt, GlyphCache}, +}; +impl_vertex! { + Vertex { + pos => [Position; Float; 2; false], + uv =>[Bitangent; Float; 2; false], + color =>[Color0; Float; 4; true], + mode => [Tangent; UShort; 2;false], + } +} +/// Draw text from the text cache texture `tex` in the fragment shader. +pub const MODE_TEXT: u16 = 0; +/// Draw an image from the texture at `tex` in the fragment shader. +pub const MODE_IMAGE: u16 = 1; +/// Ignore `tex` and draw simple, colored 2D geometry. +pub const MODE_GEOMETRY: u16 = 2; +pub struct Renderer { + mesh: Option, + shader: ShaderHandle, + surface: SurfaceHandle, + rendered_texture:RenderTextureHandle +} +impl Renderer{ + pub fn new(dim:(f64,f64),dpi_factor: f64)->Self{ + let mut params = RenderTextureParams::default(); + params.format = RenderTextureFormat::RGBA8; + params.dimensions = (dim.1,dim.2).into(); + let rendered_texture = video::create_render_texture(params)?; + let attributes = AttributeLayoutBuilder::new() + .with(Attribute::Position, 2) + .finish(); + let mut params = ShaderParams::default(); + params.attributes = attributes; + let vs = include_str!("shaders/conrod.vs").to_owned(); + let fs = include_str!("shaders/conrod.fs").to_owned(); + let shader = video::create_shader(params, vs, fs).unwrap(); + let mut params = SurfaceParams::default(); + params.set_attachments(&[rendered_texture], None)?; + params.set_clear(Color::gray(), None, None); + + let surface = video::create_surface(params).unwrap(); + Renderer{ + mesh:None, + shader:shader, + surface:surface, + rendered_texture:rendered_texture, + } + } + pub fn fill

(&mut self,dims: (f64, f64),dpi_factor: f64,mut primitives: P, image_map:conrod_core::image::Map )where P: render::PrimitiveWalker{ + let (screen_w, screen_h) = dims; + let half_win_w = screen_w / 2.0; + let half_win_h = screen_h / 2.0; + let Renderer { mut mesh,shader,surface,rendered_texture} = *self; + let mut vertices:Vec = Vec::new(); + let current_scissor =SurfaceScissor::Enable{ + position: Vector2{x:0,y:0}, + size: Vector2{x:screen_w as u32,y:screen_h as u32} + }; + let rect_to_crayon_rect = |rect: Rect| { + let (w, h) = rect.w_h(); + let left = (rect.left() * dpi_factor + half_win_w) as i32; + let bottom = (rect.bottom() * dpi_factor + half_win_h) as i32; + let width = (w * dpi_factor) as u32; + let height = (h * dpi_factor) as u32; + SurfaceScissor::Enable{ + position: Vector2{x:std::cmp::max(left, 0),y:std::cmp::max(bottom, 0)}, + size: Vector2{x:std::cmp::min(width, screen_w as u32),y: std::cmp::min(height, screen_h as u32)} + } + }; + + let vx = |x: f64| (x * dpi_factor / half_win_w) as f32; + let vy = |y: f64| (y * dpi_factor / half_win_h) as f32; + while let Some(primitive) = primitives.next_primitive() { + let render::Primitive { kind, scizzor, rect, .. } = primitive; + let new_scizzor = rect_to_crayon_rect(scizzor); + if new_scizzor != current_scissor { + + } + match kind { + render::PrimitiveKind::Rectangle { color } => { + let color = gamma_srgb_to_linear(color.to_fsa()); + let (l, r, b, t) = rect.l_r_b_t(); + let v = |x, y| { + // Convert from conrod Scalar range to GL range -1.0 to 1.0. + Vertex { + pos: [vx(x), vy(y)], + uv: [0.0, 0.0], + color: color, + mode: [MODE_GEOMETRY,0], + } + }; + + let mut push_v = |x, y| vertices.push(v(x, y)); + + // Bottom left triangle. + push_v(l, t); + push_v(r, b); + push_v(l, b); + + // Top right triangle. + push_v(l, t); + push_v(r, b); + push_v(r, t); + }, + _=>{} + } + } + let mut params = MeshParams::default(); + params.num_verts = 3; + params.num_idxes = 3; + let idxes: [u16; 3] = [0, 1, 2]; + let data = MeshData { + vptr: Vertex::encode(&vertices[..]).into(), + iptr: IndexFormat::encode(&idxes).into(), + }; + + mesh = Some(video::create_mesh(params, Some(data)).unwrap()); + + } + pub fn draw(&self,batch: &mut CommandBuffer){ + if let Some(m) = self.mesh{ + let surface = self.surface; + let dc = Draw::new(self.shader, m); + batch.draw(dc); + batch.submit(surface).unwrap(); + } + } +} + +fn gamma_srgb_to_linear(c: [f32; 4]) -> [f32; 4] { + fn component(f: f32) -> f32 { + // Taken from https://github.com/PistonDevelopers/graphics/src/color.rs#L42 + if f <= 0.04045 { + f / 12.92 + } else { + ((f + 0.055) / 1.055).powf(2.4) + } + } + [component(c[0]), component(c[1]), component(c[2]), c[3]] +} \ No newline at end of file diff --git a/backends/conrod_crayon/src/shaders/conrod.fs b/backends/conrod_crayon/src/shaders/conrod.fs new file mode 100644 index 000000000..c4748ad7f --- /dev/null +++ b/backends/conrod_crayon/src/shaders/conrod.fs @@ -0,0 +1,24 @@ +#version 300 es +precision mediump float; +uniform sampler2D tex; + +in vec2 v_tex_coords; +in vec4 v_color; +flat in uint v_mode; + +out vec4 f_color; + +void main() { + // Text + if (v_mode == uint(0)) { + f_color = v_color * vec4(1.0, 1.0, 1.0, texture(tex, v_tex_coords).r); + + // Image + } else if (v_mode == uint(1)) { + f_color = texture(tex, v_tex_coords); + + // 2D Geometry + } else if (v_mode == uint(2)) { + f_color = v_color; + } +} \ No newline at end of file diff --git a/backends/conrod_crayon/src/shaders/conrod.vs b/backends/conrod_crayon/src/shaders/conrod.vs new file mode 100644 index 000000000..d6489ee29 --- /dev/null +++ b/backends/conrod_crayon/src/shaders/conrod.vs @@ -0,0 +1,18 @@ +#version 300 es +precision mediump float; + +in vec2 position; +in vec2 tex_coords; +in vec4 color; +in uint mode; + +out vec2 v_tex_coords; +out vec4 v_color; +flat out uint v_mode; + +void main() { + gl_Position = vec4(position, 0.0, 1.0); + v_tex_coords = tex_coords; + v_color = color; + v_mode = mode; +} \ No newline at end of file diff --git a/backends/conrod_crayon/src/shaders/render_target_p1.fs b/backends/conrod_crayon/src/shaders/render_target_p1.fs new file mode 100644 index 000000000..54dd3044c --- /dev/null +++ b/backends/conrod_crayon/src/shaders/render_target_p1.fs @@ -0,0 +1,8 @@ +#version 100 +precision lowp float; + +varying vec2 v_Color; + +void main() { + gl_FragColor = vec4(v_Color, 0.0, 1.0); +} \ No newline at end of file diff --git a/backends/conrod_crayon/src/shaders/render_target_p1.vs b/backends/conrod_crayon/src/shaders/render_target_p1.vs new file mode 100644 index 000000000..0ed75bedf --- /dev/null +++ b/backends/conrod_crayon/src/shaders/render_target_p1.vs @@ -0,0 +1,10 @@ +#version 100 +precision lowp float; + +attribute vec2 Position; +varying vec2 v_Color; + +void main() { + gl_Position = vec4(Position, 0.0, 1.0); + v_Color = Position; +} \ No newline at end of file diff --git a/backends/conrod_crayon/src/shaders/render_target_p2.fs b/backends/conrod_crayon/src/shaders/render_target_p2.fs new file mode 100644 index 000000000..e0e68fadb --- /dev/null +++ b/backends/conrod_crayon/src/shaders/render_target_p2.fs @@ -0,0 +1,12 @@ +#version 100 +precision lowp float; + +varying vec2 v_Texcoord; + +uniform sampler2D renderedTexture; +uniform float time; + +void main() { + vec2 offset = 0.025*vec2(sin(time+1024.0*v_Texcoord.x), cos(time+768.0*v_Texcoord.y)); + gl_FragColor = vec4(texture2D( renderedTexture, v_Texcoord + offset ).xyz, 1.0); +} \ No newline at end of file diff --git a/backends/conrod_crayon/src/shaders/render_target_p2.vs b/backends/conrod_crayon/src/shaders/render_target_p2.vs new file mode 100644 index 000000000..f8d5d4991 --- /dev/null +++ b/backends/conrod_crayon/src/shaders/render_target_p2.vs @@ -0,0 +1,10 @@ +#version 100 +precision lowp float; + +attribute vec2 Position; +varying vec2 v_Texcoord; + +void main(){ + gl_Position = vec4(Position, 0.0, 1.0); + v_Texcoord = (Position + vec2(1.0, 1.0)) / 2.0; +} diff --git a/backends/conrod_crayon/src/shaders/texture.fs b/backends/conrod_crayon/src/shaders/texture.fs new file mode 100644 index 000000000..d478ceb80 --- /dev/null +++ b/backends/conrod_crayon/src/shaders/texture.fs @@ -0,0 +1,10 @@ +#version 100 +precision lowp float; + +varying vec2 v_Texcoord; + +uniform sampler2D renderedTexture; + +void main() { + gl_FragColor = vec4(texture2D( renderedTexture, v_Texcoord ).xyz, 1.0); +} \ No newline at end of file diff --git a/backends/conrod_crayon/src/shaders/texture.vs b/backends/conrod_crayon/src/shaders/texture.vs new file mode 100644 index 000000000..f8d5d4991 --- /dev/null +++ b/backends/conrod_crayon/src/shaders/texture.vs @@ -0,0 +1,10 @@ +#version 100 +precision lowp float; + +attribute vec2 Position; +varying vec2 v_Texcoord; + +void main(){ + gl_Position = vec4(Position, 0.0, 1.0); + v_Texcoord = (Position + vec2(1.0, 1.0)) / 2.0; +} diff --git a/backends/conrod_gfx/examples/all_winit_gfx.rs b/backends/conrod_gfx/examples/all_winit_gfx.rs index ee1475b5b..71f5ca7b9 100644 --- a/backends/conrod_gfx/examples/all_winit_gfx.rs +++ b/backends/conrod_gfx/examples/all_winit_gfx.rs @@ -101,7 +101,7 @@ fn main() { }; let dpi_factor = window.get_hidpi_factor() as f32; - + println!("get_hidpi_factor {:?}",dpi_factor); if let Some(primitives) = ui.draw_if_changed() { let dims = (win_w as f32 * dpi_factor, win_h as f32 * dpi_factor); diff --git a/backends/conrod_ggez/Cargo.toml b/backends/conrod_ggez/Cargo.toml new file mode 100644 index 000000000..6d1a79108 --- /dev/null +++ b/backends/conrod_ggez/Cargo.toml @@ -0,0 +1,37 @@ +[package] +name = "conrod_ggez" +version = "0.62.0" +authors = ["Mitchell Nordine "] +keywords = ["ui", "widgets", "gui", "interface", "graphics"] +description = "An easy-to-use, 100% Rust, extensible 2D GUI library." +license = "MIT OR Apache-2.0" +readme = "../../README.md" +repository = "https://github.com/pistondevelopers/conrod.git" +homepage = "https://github.com/pistondevelopers/conrod" +documentation = "https://docs.rs/conrod" +categories = ["gui"] + +[lib] +name = "conrod_ggez" +path = "./src/lib.rs" + +[dependencies] +conrod_core = { path = "../../conrod_core", version = "0.63" } +gfx = { version = "0.17" } +gfx_core = { version = "0.8" } +gfx_device_gl = "0.15" + +[target.'cfg(not(target_arch = "wasm32"))'.dependencies] +ggez = { git = "https://github.com/ozkriff/ggez", rev = "a23153a18" } +conrod_winit = { path = "../conrod_winit", version = "0.63" } + +[target.'cfg(target_arch = "wasm32")'.dependencies] +good-web-game = { git="https://github.com/not-fl3/good-web-game"} +stdweb = "0.4.12" + +[dev-dependencies] +conrod_example_shared = { path = "../conrod_example_shared", version = "0.63" } +find_folder = "0.3.0" +image = "0.19" +petgraph = "0.4" +## glutin_gfx.rs example dependencies \ No newline at end of file diff --git a/backends/conrod_ggez/examples/ggez.rs b/backends/conrod_ggez/examples/ggez.rs new file mode 100644 index 000000000..92f548150 --- /dev/null +++ b/backends/conrod_ggez/examples/ggez.rs @@ -0,0 +1,165 @@ +//! The simplest possible example that does something. +extern crate conrod_core; +extern crate conrod_example_shared; +extern crate conrod_ggez; + +extern crate gfx; +extern crate gfx_core; + +use conrod_ggez::{ggez,map_key}; +use ggez::conf::{WindowMode}; +use ggez::graphics; +use ggez::{Context, GameResult}; +use ggez::event::{self, KeyCode, KeyMods, MouseButton}; +use std::time::SystemTime; +use conrod_example_shared::{WIN_W, WIN_H}; + +use gfx::Device; + +const CLEAR_COLOR: [f32; 4] = [0.2, 0.2, 0.2, 1.0]; + +struct MainState <'a> { + pos_x: f32, + app: conrod_example_shared::DemoApp, + ui: conrod_core::Ui, + ids: conrod_example_shared::Ids, + image_map: conrod_core::image::Map<(gfx::handle::ShaderResourceView, (u32, u32))>, + renderer: conrod_ggez::Renderer<'a> +} + +impl<'a> MainState<'a> { + fn new(ctx: &mut Context) -> GameResult { + // Create Ui and Ids of widgets to instantiate + let dpi_factor = graphics::hidpi_factor(ctx) as f64; + let mut ui = conrod_core::UiBuilder::new([WIN_W as f64, WIN_H as f64]) + .theme(conrod_example_shared::theme()) + .build(); + let ids = conrod_example_shared::Ids::new(ui.widget_id_generator()); + + // Load font from file + let assets = find_folder::Search::KidsThenParents(3, 5).for_folder("assets").unwrap(); + let font_path = assets.join("fonts/NotoSans/NotoSans-Regular.ttf"); + ui.fonts.insert_from_file(font_path).unwrap(); + let rtv = graphics::screen_render_target(ctx); + + let factory = graphics::factory(ctx); + let mut image_map: conrod_core::image::Map<_> = conrod_core::image::Map::new(); + let rust_logo = image_map.insert(load_rust_logo::(factory)); + + // Demonstration app state that we'll control with our conrod GUI. + let app = conrod_example_shared::DemoApp::new(rust_logo); + let renderer = conrod_ggez::Renderer::new(factory, &rtv, dpi_factor).unwrap(); + let s = MainState { pos_x: 0.0,app:app,ui:ui,ids:ids,image_map:image_map,renderer:renderer}; + Ok(s) + } +} + +impl<'a> event::EventHandler for MainState<'a> { + fn update(&mut self, ctx: &mut Context) -> GameResult { + self.pos_x = self.pos_x % 800.0 + 1.0; + let mut ui = self.ui.set_widgets(); + conrod_example_shared::gui(&mut ui, &self.ids, &mut self.app); + Ok(()) + } + + fn draw(&mut self, ctx: &mut Context) -> GameResult { + let dpi_factor =graphics::hidpi_factor(ctx); + //let dpi_factor =1.16; + + if let Some(primitives) = self.ui.draw_if_changed() { + { + println!("get_hidpi_factor {:?} {:?}",dpi_factor,SystemTime::now()); + let (factory, device, mut encoder, _depthview, _colorview) = graphics::gfx_objects(ctx); + self.renderer.clear(&mut encoder, CLEAR_COLOR); + let dims = (WIN_W as f32 * dpi_factor, WIN_H as f32 * dpi_factor); + + //Clear the window + self.renderer.clear(&mut encoder, CLEAR_COLOR); + + self.renderer.fill(&mut encoder,dims,dpi_factor as f64,primitives,&self.image_map); + + self.renderer.draw(factory,&mut encoder,&self.image_map); + + } + graphics::present(ctx)?; + } + Ok(()) + } + fn mouse_button_down_event(&mut self, _ctx: &mut Context, button: MouseButton, x: f32, y: f32) { + println!("button {:?}",button); + conrod_ggez::event::mouse_button_down_event(&mut self.ui,button); + } + + fn mouse_button_up_event(&mut self, _ctx: &mut Context, button: MouseButton, x: f32, y: f32) { + conrod_ggez::event::mouse_button_up_event(&mut self.ui,button); + } + + fn mouse_motion_event(&mut self, _ctx: &mut Context, x: f32, y: f32, _xrel: f32, _yrel: f32) { + conrod_ggez::event::mouse_motion_event(&mut self.ui,x,y); + } + + fn mouse_wheel_event(&mut self, _ctx: &mut Context, x: f32, y: f32) { + conrod_ggez::event::mouse_wheel_event(&mut self.ui,x,y); + } + + fn key_down_event( + &mut self, + _ctx: &mut Context, + keycode: KeyCode, + keymod: KeyMods, + repeat: bool, + ) { + //conrod_ggez::event::key_down_event(&mut self.ui,keycode,keymod); + } + + fn key_up_event(&mut self, _ctx: &mut Context, keycode: KeyCode, keymod: KeyMods) { + //conrod_ggez::event::key_up_event(&mut self.ui,keycode,keymod); + } + + fn focus_event(&mut self, _ctx: &mut Context, _gained: bool) { + + } +} +// Load the Rust logo from our assets folder to use as an example image. +fn load_rust_logo>(factory: &mut F) -> (gfx::handle::ShaderResourceView::View>,(u32,u32)) { + use gfx::{format, texture}; + use gfx::memory::Bind; + use gfx::memory::Usage; + let assets = find_folder::Search::ParentsThenKids(5, 3).for_folder("assets").unwrap(); + let path = assets.join("images/rust.png"); + let rgba_image = image::open(&std::path::Path::new(&path)).unwrap().to_rgba(); + let image_dimensions = rgba_image.dimensions(); + let kind = texture::Kind::D2( + image_dimensions.0 as texture::Size, + image_dimensions.1 as texture::Size, + texture::AaMode::Single + ); + let info = texture::Info { + kind: kind, + levels: 1, + format: ::get_surface_type(), + bind: Bind::SHADER_RESOURCE, + usage: Usage::Dynamic, + }; + let raw = factory.create_texture_raw( + info, + Some(::get_channel_type()), + Some((&[rgba_image.into_raw().as_slice()], texture::Mipmap::Provided))).unwrap(); + let tex = gfx_core::memory::Typed::new(raw); + let view = factory.view_texture_as_shader_resource::( + &tex, (0,0), format::Swizzle::new() + ).unwrap(); + (view,image_dimensions) +} +pub fn main() -> GameResult { + println!("w {:?}, h {:?}",WIN_W,WIN_H); + let cb = ggez::ContextBuilder::new("super_simple", "ggez") + .window_mode( + WindowMode::default() + .dimensions(WIN_W as f32, WIN_H as f32) + .resizable(true), + ); + let (ctx, event_loop) = &mut cb.build()?; + let state = &mut MainState::new(ctx)?; + event::run(ctx, event_loop, state) +} diff --git a/backends/conrod_ggez/src/ggez_event.rs b/backends/conrod_ggez/src/ggez_event.rs new file mode 100644 index 000000000..1e23dce32 --- /dev/null +++ b/backends/conrod_ggez/src/ggez_event.rs @@ -0,0 +1,47 @@ +use ggez::input::keyboard::{KeyCode,KeyMods}; +use ggez::input::mouse::{MouseButton::{self,Left,Right,Middle,Other}}; +use conrod_winit::map_key; +use conrod_core::event::Input; +use conrod_core::input::Button::Keyboard; +use conrod_core::input::Button::Mouse; +use conrod_core::input::Motion; +use conrod_core::Ui; + +pub fn mouse_button_down_event(ui:&mut Ui,button: MouseButton){ + let mmb =match button{ + Left=> conrod_core::input::state::mouse::Button::Left, + Right=> conrod_core::input::state::mouse::Button::Right, + Middle=> conrod_core::input::state::mouse::Button::Middle, + Other(_j) => conrod_core::input::state::mouse::Button::Unknown + }; + ui.handle_event(Input::Press(Mouse(mmb))); +} +pub fn mouse_button_up_event(ui:&mut Ui,button: MouseButton){ + let mmb =match button{ + Left=> conrod_core::input::state::mouse::Button::Left, + Right=> conrod_core::input::state::mouse::Button::Right, + Middle=> conrod_core::input::state::mouse::Button::Middle, + Other(_j) => conrod_core::input::state::mouse::Button::Unknown + }; + ui.handle_event(Input::Release(Mouse(mmb))); +} +pub fn mouse_motion_event(ui:&mut Ui,xx: f32, yy: f32){ + let x = xx as f64; + let y = yy as f64; + ui.handle_event(Input::Motion(Motion::MouseCursor{x,y})); +} +pub fn mouse_wheel_event(ui:&mut Ui,xx: f32, yy: f32){ + let x = xx as f64; + let y = yy as f64; + ui.handle_event(Input::Motion(Motion::Scroll{x,y})); +} +pub fn key_down_event(ui:&mut Ui,key:KeyCode,_keymod:KeyMods){ + ui.handle_event(Input::Press(Keyboard(map_key(key.clone())))); + ui.handle_event(Input::Press(Keyboard(map_key(key.clone())))); +} +pub fn key_up_event(ui:&mut Ui,key:KeyCode,_keymod:KeyMods){ + ui.handle_event(Input::Release(Keyboard(map_key(key.clone())))); +} +pub fn text_input_event(ui:&mut Ui,ch: char){ + ui.handle_event(Input::Text(ch.to_string())); +} \ No newline at end of file diff --git a/backends/conrod_ggez/src/gwg_event.rs b/backends/conrod_ggez/src/gwg_event.rs new file mode 100644 index 000000000..132f94071 --- /dev/null +++ b/backends/conrod_ggez/src/gwg_event.rs @@ -0,0 +1,50 @@ +use conrod_core::input; +use conrod_core::event::Input; +use conrod_core::input::Button::Keyboard; +use conrod_core::input::Button::Mouse; +use conrod_core::input::Motion; +use conrod_core::Ui; +use stdweb::web::event::MouseButton; +pub fn map_key(keycode: String) -> input::keyboard::Key { + input::keyboard::Key::Hash +} + +pub fn mouse_button_down_event(ui:&mut Ui,button: MouseButton){ + let mmb =match button{ + Left=> conrod_core::input::state::mouse::Button::Left, + Right=> conrod_core::input::state::mouse::Button::Right, + Wheel=> conrod_core::input::state::mouse::Button::Middle, + Button4 => conrod_core::input::state::mouse::Button::Unknown, + Button5 => conrod_core::input::state::mouse::Button::Unknown + }; + ui.handle_event(Input::Press(Mouse(mmb))); +} +pub fn mouse_button_up_event(ui:&mut Ui,button: MouseButton){ + let mmb =match button{ + Left=> conrod_core::input::state::mouse::Button::Left, + Right=> conrod_core::input::state::mouse::Button::Right, + Wheel=> conrod_core::input::state::mouse::Button::Middle, + Button4 => conrod_core::input::state::mouse::Button::Unknown, + Button5 => conrod_core::input::state::mouse::Button::Unknown + }; + ui.handle_event(Input::Release(Mouse(mmb))); +} +pub fn mouse_motion_event(ui:&mut Ui,xx: f32, yy: f32){ + let x = xx as f64; + let y = yy as f64; + ui.handle_event(Input::Motion(Motion::MouseCursor{x,y})); +} +pub fn mouse_wheel_event(ui:&mut Ui,xx: f32, yy: f32){ + let x = xx as f64; + let y = yy as f64; + ui.handle_event(Input::Motion(Motion::Scroll{x,y})); +} +pub fn key_down_event(ui:&mut Ui,key:String){ + //ui.handle_event(Input::Press(Keyboard(map_key(key.clone())))); +} +pub fn key_up_event(ui:&mut Ui,key:String){ + //ui.handle_event(Input::Release(Keyboard(map_key(key.clone())))); +} +pub fn text_input_event(ui:&mut Ui,ch: char){ + ui.handle_event(Input::Text(ch.to_string())); +} \ No newline at end of file diff --git a/backends/conrod_ggez/src/lib.rs b/backends/conrod_ggez/src/lib.rs new file mode 100644 index 000000000..b404e3272 --- /dev/null +++ b/backends/conrod_ggez/src/lib.rs @@ -0,0 +1,756 @@ +//! A gfx backend for rendering conrod primitives. +extern crate conrod_core; +#[macro_use] +extern crate gfx; +extern crate gfx_core; +extern crate gfx_device_gl; +#[cfg(not(target_arch = "wasm32"))] +extern crate conrod_winit; +#[cfg(not(target_arch = "wasm32"))] +pub extern crate ggez; +#[cfg(not(target_arch = "wasm32"))] +pub use conrod_winit::map_key; +#[cfg(not(target_arch = "wasm32"))] +pub mod ggez_event; +#[cfg(not(target_arch = "wasm32"))] +pub use ggez_event as event; + +#[cfg(target_arch = "wasm32")] +pub extern crate good_web_game as ggez; +#[cfg(target_arch = "wasm32")] +pub use conrod_winit::map_key; +#[cfg(target_arch = "wasm32")] +pub mod gwg_event; +#[cfg(target_arch = "wasm32")] +pub use gwg_event as event; +#[cfg(target_arch = "wasm32")] +extern crate stdweb; + +use gfx::{Factory, texture, PipelineState, + handle::RawRenderTargetView, + traits::FactoryExt, +}; + +use conrod_core::{ + Rect, + Scalar, + color, + image, + render, + text::{rt, GlyphCache}, +}; + +/// A `Command` describing a step in the drawing process. +#[derive(Clone, Debug)] +pub enum Command<'a> { + /// Draw to the target. + Draw(Draw<'a>), + /// Update the scizzor within the pipeline. + Scizzor(gfx::Rect), +} + +/// An iterator yielding `Command`s, produced by the `Renderer::commands` method. +pub struct Commands<'a> { + commands: std::slice::Iter<'a, PreparedCommand>, + vertices: &'a [Vertex], +} + +/// A `Command` for drawing to the target. +/// +/// Each variant describes how to draw the contents of the vertex buffer. +#[derive(Clone, Debug)] +pub enum Draw<'a> { + /// A range of vertices representing triangles textured with the image in the + /// image_map at the given `widget::Id`. + Image(image::Id, &'a [Vertex]), + /// A range of vertices representing plain triangles. + Plain(&'a [Vertex]), +} + +enum PreparedCommand { + Image(image::Id, std::ops::Range), + Plain(std::ops::Range), + Scizzor(gfx::Rect), +} + +/// Draw text from the text cache texture `tex` in the fragment shader. +pub const MODE_TEXT: u32 = 0; +/// Draw an image from the texture at `tex` in the fragment shader. +pub const MODE_IMAGE: u32 = 1; +/// Ignore `tex` and draw simple, colored 2D geometry. +pub const MODE_GEOMETRY: u32 = 2; + +const FRAGMENT_SHADER: &'static [u8] = b" + #version 140 + uniform sampler2D t_Color; + + in vec2 v_Uv; + in vec4 v_Color; + flat in uint v_Mode; + + out vec4 f_Color; + + void main() { + // Text + if (v_Mode == uint(0)) { + f_Color = v_Color * vec4(1.0, 1.0, 1.0, texture(t_Color, v_Uv).a); + + // Image + } else if (v_Mode == uint(1)) { + f_Color = texture(t_Color, v_Uv); + + // 2D Geometry + } else if (v_Mode == uint(2)) { + f_Color = v_Color; + } + } +"; + +const VERTEX_SHADER: &'static [u8] = b" + #version 140 + + in vec2 a_Pos; + in vec2 a_Uv; + in vec4 a_Color; + in uint a_Mode; + + out vec2 v_Uv; + out vec4 v_Color; + flat out uint v_Mode; + + void main() { + v_Uv = a_Uv; + v_Color = a_Color; + gl_Position = vec4(a_Pos, 0.0, 1.0); + v_Mode = a_Mode; + } +"; + +/// Possible errors that may occur during a call to `Renderer::new`. +#[derive(Debug)] +pub enum RendererCreationError { + /// Errors that might occur when creating the pipeline. + PipelineState(gfx::PipelineStateError), +} + +// Format definitions (must be pub for gfx_defines to use them) +/// Color format used with gfx buffers. +pub type ColorFormat = gfx::format::Srgba8; +type SurfaceFormat = gfx::format::R8_G8_B8_A8; +type FullFormat = (SurfaceFormat, gfx::format::Unorm); + +// This is it's own module to allow_unsafe within it +mod defines { + //it appears gfx_defines generates unsafe code + #![allow(unsafe_code)] + + use gfx; + use super::ColorFormat; + // Vertex and pipeline declarations + gfx_defines! { + vertex Vertex { + pos: [f32; 2] = "a_Pos", + uv: [f32; 2] = "a_Uv", + color: [f32; 4] = "a_Color", + mode: u32 = "a_Mode", + } + + pipeline pipe { + vbuf: gfx::VertexBuffer = (), + color: gfx::TextureSampler<[f32; 4]> = "t_Color", + scissor: gfx::Scissor = (), + //out: gfx::RenderTarget = "Target0", + out: gfx::BlendTarget = ("f_Color", ::gfx::state::ColorMask::all(), ::gfx::preset::blend::ALPHA), + } + + } +} + +use self::defines::*; + +/// This type is used for translating `render::Primitives` into `Commands`s that indicate how to +/// draw the GUI using `gfx`. +pub struct Renderer<'a> { + pipeline: PipelineState, + glyph_cache: GlyphCache<'a>, + cache_tex: gfx::handle::Texture, + cache_tex_view: gfx::handle::ShaderResourceView, + data: pipe::Data, + commands: Vec, + vertices: Vec, +} + +impl<'a> Renderer<'a> { + /// Create a new renderer from a `gfx::Factory`, `gfx::handle::RawRenderTargetView` and + /// a given `dpi_factor` + pub fn new(factory: &mut F, + rtv: &RawRenderTargetView, + dpi_factor: f64) + -> Result + where F: Factory, + { + let sampler_info = texture::SamplerInfo::new( + texture::FilterMethod::Bilinear, + texture::WrapMode::Clamp, + ); + let sampler = factory.create_sampler(sampler_info); + + let vbuf = factory.create_vertex_buffer(&[]); + let (_, fake_texture) = create_texture(factory, 1, 1, &[0; 4]); + + let (width, height, _depth, _samples) = rtv.get_dimensions(); + + let data = pipe::Data { + vbuf, + scissor: gfx::Rect { x: 0, y: 0, w: width, h: height }, + color: (fake_texture.clone(), sampler), + out: gfx::memory::Typed::new(rtv.clone()), + }; + + let shader_set = factory.create_shader_set(VERTEX_SHADER, FRAGMENT_SHADER).unwrap(); + + let pipeline = factory.create_pipeline_state( + &shader_set, + gfx::Primitive::TriangleList, + gfx::state::Rasterizer { + samples: Some(gfx::state::MultiSample {}), + ..gfx::state::Rasterizer::new_fill() + }, + pipe::new())?; + + let (glyph_cache, cache_tex, cache_tex_view) = { + let width = (width as f64 * dpi_factor) as u32; + let height = (height as f64 * dpi_factor) as u32; + + const SCALE_TOLERANCE: f32 = 0.1; + const POSITION_TOLERANCE: f32 = 0.1; + + let cache = GlyphCache::builder() + .dimensions(width, height) + .scale_tolerance(SCALE_TOLERANCE) + .position_tolerance(POSITION_TOLERANCE) + .build(); + + let data = vec![0; (width * height * 4) as usize]; + + let (texture, texture_view) = create_texture(factory, width, height, &data); + + (cache, texture, texture_view) + }; + Ok(Renderer { + pipeline, + glyph_cache, + cache_tex, + cache_tex_view, + data, + commands: vec![], + vertices: vec![], + }) + } + + /// Produce an `Iterator` yielding `Command`s. + pub fn commands(&self) -> Commands { + let Renderer { ref commands, ref vertices, .. } = *self; + Commands { + commands: commands.iter(), + vertices: vertices, + } + } + + /// Fill the inner vertex and command buffers by translating the given `primitives`. + pub fn fill(&mut self, + encoder: &mut gfx::Encoder, + dims: (f32, f32), + dpi_factor: f64, + mut primitives: P, + image_map: &image::Map<(gfx::handle::ShaderResourceView, + (u32, u32))>) + where P: render::PrimitiveWalker, + C: gfx::CommandBuffer, + { + let Renderer { ref mut commands, ref mut vertices, ref mut glyph_cache, ref mut cache_tex, .. } = *self; + + commands.clear(); + vertices.clear(); + + enum State { + Image { image_id: image::Id, start: usize }, + Plain { start: usize }, + } + + let mut current_state = State::Plain { start: 0 }; + + // Switches to the `Plain` state and completes the previous `Command` if not already in the + // `Plain` state. + macro_rules! switch_to_plain_state { + () => { + match current_state { + State::Plain { .. } => (), + State::Image { image_id, start } => { + commands.push(PreparedCommand::Image(image_id, start..vertices.len())); + current_state = State::Plain { start: vertices.len() }; + }, + } + }; + } + + // Framebuffer dimensions and the "dots per inch" factor. + let (screen_w, screen_h) = dims; + let (win_w, win_h) = (screen_w as Scalar, screen_h as Scalar); + let half_win_w = win_w / 2.0; + let half_win_h = win_h / 2.0; + + // Functions for converting for conrod scalar coords to GL vertex coords (-1.0 to 1.0). + let vx = |x: Scalar| (x * dpi_factor / half_win_w) as f32; + let vy = |y: Scalar| (y * dpi_factor / half_win_h) as f32; + + let mut current_scizzor = gfx::Rect { + x: 0, + w: screen_w as u16, + y: 0, + h: screen_h as u16, + }; + + let rect_to_gfx_rect = |rect: Rect| { + let (w, h) = rect.w_h(); + let left = (rect.left() * dpi_factor + half_win_w) as u16; + let bottom = (rect.bottom() * dpi_factor + half_win_h) as u16; + let width = (w * dpi_factor) as u16; + let height = (h * dpi_factor) as u16; + gfx::Rect { + x: std::cmp::max(left, 0), + w: std::cmp::min(width, screen_w as u16), + y: std::cmp::max(bottom, 0), + h: std::cmp::min(height, screen_h as u16), + } + }; + + // Draw each primitive in order of depth. + while let Some(primitive) = primitives.next_primitive() { + let render::Primitive { kind, scizzor, rect, .. } = primitive; + + // Check for a `Scizzor` command. + let new_scizzor = rect_to_gfx_rect(scizzor); + if new_scizzor != current_scizzor { + // Finish the current command. + match current_state { + State::Plain { start } => + commands.push(PreparedCommand::Plain(start..vertices.len())), + State::Image { image_id, start } => + commands.push(PreparedCommand::Image(image_id, start..vertices.len())), + } + + // Update the scizzor and produce a command. + current_scizzor = new_scizzor; + commands.push(PreparedCommand::Scizzor(new_scizzor)); + + // Set the state back to plain drawing. + current_state = State::Plain { start: vertices.len() }; + } + + match kind { + render::PrimitiveKind::Rectangle { color } => { + switch_to_plain_state!(); + + let color = gamma_srgb_to_linear(color.to_fsa()); + let (l, r, b, t) = rect.l_r_b_t(); + + let v = |x, y| { + // Convert from conrod Scalar range to GL range -1.0 to 1.0. + Vertex { + pos: [vx(x), vy(y)], + uv: [0.0, 0.0], + color: color, + mode: MODE_GEOMETRY, + } + }; + + let mut push_v = |x, y| vertices.push(v(x, y)); + + // Bottom left triangle. + push_v(l, t); + push_v(r, b); + push_v(l, b); + + // Top right triangle. + push_v(l, t); + push_v(r, b); + push_v(r, t); + } + + render::PrimitiveKind::TrianglesSingleColor { color, triangles } => { + if triangles.is_empty() { + continue; + } + + switch_to_plain_state!(); + + let color = gamma_srgb_to_linear(color.into()); + + let v = |p: [Scalar; 2]| { + Vertex { + pos: [vx(p[0]), vy(p[1])], + uv: [0.0, 0.0], + color: color, + mode: MODE_GEOMETRY, + } + }; + + for triangle in triangles { + vertices.push(v(triangle[0])); + vertices.push(v(triangle[1])); + vertices.push(v(triangle[2])); + } + } + + render::PrimitiveKind::TrianglesMultiColor { triangles } => { + if triangles.is_empty() { + continue; + } + + switch_to_plain_state!(); + + let v = |(p, c): ([Scalar; 2], color::Rgba)| { + Vertex { + pos: [vx(p[0]), vy(p[1])], + uv: [0.0, 0.0], + color: gamma_srgb_to_linear(c.into()), + mode: MODE_GEOMETRY, + } + }; + + for triangle in triangles { + vertices.push(v(triangle[0])); + vertices.push(v(triangle[1])); + vertices.push(v(triangle[2])); + } + } + + render::PrimitiveKind::Text { color, text, font_id } => { + switch_to_plain_state!(); + + let positioned_glyphs = text.positioned_glyphs(dpi_factor as f32); + + // Queue the glyphs to be cached + for glyph in positioned_glyphs { + glyph_cache.queue_glyph(font_id.index(), glyph.clone()); + } + + glyph_cache.cache_queued(|rect, data| { + let offset = [rect.min.x as u16, rect.min.y as u16]; + let size = [rect.width() as u16, rect.height() as u16]; + + let new_data = data.iter().map(|x| [255, 255, 255, *x]).collect::>(); + + update_texture(encoder, &cache_tex, offset, size, &new_data); + }).unwrap(); + + let color = gamma_srgb_to_linear(color.to_fsa()); + let cache_id = font_id.index(); + let origin = rt::point(0.0, 0.0); + + // A closure to convert RustType rects to GL rects + let to_gl_rect = |screen_rect: rt::Rect| rt::Rect { + min: origin + + (rt::vector(screen_rect.min.x as f32 / screen_w - 0.5, + 1.0 - screen_rect.min.y as f32 / screen_h - 0.5)) * 2.0, + max: origin + + (rt::vector(screen_rect.max.x as f32 / screen_w - 0.5, + 1.0 - screen_rect.max.y as f32 / screen_h - 0.5)) * 2.0, + }; + + for g in positioned_glyphs { + if let Ok(Some((uv_rect, screen_rect))) = glyph_cache.rect_for(cache_id, g) { + let gl_rect = to_gl_rect(screen_rect); + let v = |p, t| Vertex { + pos: p, + uv: t, + color: color, + mode: MODE_TEXT, + }; + let mut push_v = |p, t| vertices.push(v(p, t)); + push_v([gl_rect.min.x, gl_rect.max.y], [uv_rect.min.x, uv_rect.max.y]); + push_v([gl_rect.min.x, gl_rect.min.y], [uv_rect.min.x, uv_rect.min.y]); + push_v([gl_rect.max.x, gl_rect.min.y], [uv_rect.max.x, uv_rect.min.y]); + push_v([gl_rect.max.x, gl_rect.min.y], [uv_rect.max.x, uv_rect.min.y]); + push_v([gl_rect.max.x, gl_rect.max.y], [uv_rect.max.x, uv_rect.max.y]); + push_v([gl_rect.min.x, gl_rect.max.y], [uv_rect.min.x, uv_rect.max.y]); + } + } + } + + render::PrimitiveKind::Image { image_id, color, source_rect } => { + + // Switch to the `Image` state for this image if we're not in it already. + let new_image_id = image_id; + match current_state { + + // If we're already in the drawing mode for this image, we're done. + State::Image { image_id, .. } if image_id == new_image_id => (), + + // If we were in the `Plain` drawing state, switch to Image drawing state. + State::Plain { start } => { + commands.push(PreparedCommand::Plain(start..vertices.len())); + current_state = State::Image { + image_id: new_image_id, + start: vertices.len(), + }; + } + + // If we were drawing a different image, switch state to draw *this* image. + State::Image { image_id, start } => { + commands.push(PreparedCommand::Image(image_id, start..vertices.len())); + current_state = State::Image { + image_id: new_image_id, + start: vertices.len(), + }; + } + } + + let color = color.unwrap_or(color::WHITE).to_fsa(); + + let (image_w, image_h) = image_map.get(&image_id).unwrap().1; + let (image_w, image_h) = (image_w as Scalar, image_h as Scalar); + + // Get the sides of the source rectangle as uv coordinates. + // + // Texture coordinates range: + // - left to right: 0.0 to 1.0 + // - bottom to top: 1.0 to 0.0 + // Note bottom and top are flipped in comparison to glium so that we don't need to flip images when loading + let (uv_l, uv_r, uv_t, uv_b) = match source_rect { + Some(src_rect) => { + let (l, r, b, t) = src_rect.l_r_b_t(); + ((l / image_w) as f32, + (r / image_w) as f32, + (b / image_h) as f32, + (t / image_h) as f32) + } + None => (0.0, 1.0, 0.0, 1.0), + }; + + let v = |x, y, t| { + // Convert from conrod Scalar range to GL range -1.0 to 1.0. + let x = (x * dpi_factor as Scalar / half_win_w) as f32; + let y = (y * dpi_factor as Scalar / half_win_h) as f32; + Vertex { + pos: [x, y], + uv: t, + color: color, + mode: MODE_IMAGE, + } + }; + + let mut push_v = |x, y, t| vertices.push(v(x, y, t)); + + let (l, r, b, t) = rect.l_r_b_t(); + + // Bottom left triangle. + push_v(l, t, [uv_l, uv_t]); + push_v(r, b, [uv_r, uv_b]); + push_v(l, b, [uv_l, uv_b]); + + // Top right triangle. + push_v(l, t, [uv_l, uv_t]); + push_v(r, b, [uv_r, uv_b]); + push_v(r, t, [uv_r, uv_t]); + } + + // We have no special case widgets to handle. + render::PrimitiveKind::Other(_) => (), + } + } + + // Enter the final command. + match current_state { + State::Plain { start } => + commands.push(PreparedCommand::Plain(start..vertices.len())), + State::Image { image_id, start } => + commands.push(PreparedCommand::Image(image_id, start..vertices.len())), + } + } + + /// Draws using the inner list of `Command`s to the given `display`. + /// + /// Note: If you require more granular control over rendering, you may want to use the `fill` + /// and `commands` methods separately. This method is simply a convenience wrapper around those + /// methods for the case that the user does not require accessing or modifying conrod's draw + /// parameters, uniforms or generated draw commands. + pub fn draw(&self, factory: &mut F, encoder: &mut gfx::Encoder, image_map: &image::Map<(gfx::handle::ShaderResourceView, (u32, u32))>) + where F: Factory, + C: gfx::CommandBuffer, + { + let Renderer { ref pipeline, ref data, ref cache_tex_view, .. } = *self; + + let mut data = data.clone(); + + for command in self.commands() { + match command { + + // Update the `scizzor` before continuing to draw. + Command::Scizzor(scizzor) => data.scissor = scizzor, + + // Draw to the target with the given `draw` command. + Command::Draw(draw) => match draw { + + // Draw text and plain 2D geometry. + Draw::Plain(verts) => { + data.color.0 = cache_tex_view.clone(); + let (vbuf, slice) = factory.create_vertex_buffer_with_slice(&verts, ()); + data.vbuf = vbuf; + encoder.draw(&slice, &pipeline, &data); + } + + // Draw an image whose texture data lies within the `image_map` at the + // given `id`. + Draw::Image(image_id, verts) => { + let image = &image_map.get(&image_id).unwrap().0; + data.color.0 = image.clone(); + let (vbuf, slice) = factory.create_vertex_buffer_with_slice(&verts, ()); + data.vbuf = vbuf; + encoder.draw(&slice, &pipeline, &data); + } + } + } + } + } + + /// Call this routine when a window has been resized. This ensures that conrod primitives are + /// drawn properly with the `draw` call. + pub fn on_resize(&mut self, rtv: RawRenderTargetView) { + let (width, height, _depth, _samples) = rtv.get_dimensions(); + self.data.out = gfx::memory::Typed::new(rtv.clone()); + self.data.scissor = gfx::Rect { x: 0, y: 0, w: width, h: height }; + } + + /// Call this routine to clear the render target. + pub fn clear(&self, encoder: &mut gfx::Encoder, clear_color: [f32; 4]) + where C: gfx::CommandBuffer, + { + encoder.clear(&self.data.out, clear_color); + } +} + +fn gamma_srgb_to_linear(c: [f32; 4]) -> [f32; 4] { + fn component(f: f32) -> f32 { + // Taken from https://github.com/PistonDevelopers/graphics/src/color.rs#L42 + if f <= 0.04045 { + f / 12.92 + } else { + ((f + 0.055) / 1.055).powf(2.4) + } + } + [component(c[0]), component(c[1]), component(c[2]), c[3]] +} + +// Creates a gfx texture with the given data +fn create_texture(factory: &mut F, width: u32, height: u32, data: &[u8]) + -> (gfx::handle::Texture, gfx::handle::ShaderResourceView) + where F: gfx::Factory +{ + // Modified `Factory::create_texture_immutable_u8` for dynamic texture. + fn create_texture( + factory: &mut F, + kind: gfx::texture::Kind, + data: &[&[u8]], + ) -> Result<( + gfx::handle::Texture, + gfx::handle::ShaderResourceView + ), gfx::CombinedError> + where F: gfx::Factory, + T: gfx::format::TextureFormat + { + use gfx::{format, texture}; + use gfx::memory::Usage; + use gfx::memory::Bind; + + use gfx_core::memory::Typed; + + let surface = ::get_surface_type(); + let num_slices = kind.get_num_slices().unwrap_or(1) as usize; + let num_faces = if kind.is_cube() { 6 } else { 1 }; + let desc = texture::Info { + kind: kind, + levels: (data.len() / (num_slices * num_faces)) as texture::Level, + format: surface, + bind: Bind::SHADER_RESOURCE, + usage: Usage::Dynamic, + }; + let cty = ::get_channel_type(); + let raw = factory.create_texture_raw( + desc, + Some(cty), + Some((data, gfx::texture::Mipmap::Provided)))?; + let levels = (0, raw.get_info().levels - 1); + let tex = Typed::new(raw); + let view = factory.view_texture_as_shader_resource::( + &tex, levels, format::Swizzle::new(), + )?; + Ok((tex, view)) + } + + let kind = texture::Kind::D2( + width as texture::Size, + height as texture::Size, + texture::AaMode::Single, + ); + create_texture::(factory, kind, &[data]).unwrap() +} + +// Updates a texture with the given data (used for updating the GlyphCache texture) +fn update_texture(encoder: &mut gfx::Encoder, + texture: &gfx::handle::Texture, + offset: [u16; 2], + size: [u16; 2], + data: &[[u8; 4]]) + where C: gfx::CommandBuffer +{ + let info = texture::ImageInfoCommon { + xoffset: offset[0], + yoffset: offset[1], + zoffset: 0, + width: size[0], + height: size[1], + depth: 0, + format: (), + mipmap: 0, + }; + + encoder.update_texture::(texture, None, info, data).unwrap(); +} + +impl<'a> Iterator for Commands<'a> { + type Item = Command<'a>; + fn next(&mut self) -> Option { + let Commands { ref mut commands, ref vertices } = *self; + commands.next().map(|command| match *command { + PreparedCommand::Scizzor(scizzor) => Command::Scizzor(scizzor), + PreparedCommand::Plain(ref range) => + Command::Draw(Draw::Plain(&vertices[range.clone()])), + PreparedCommand::Image(id, ref range) => + Command::Draw(Draw::Image(id, &vertices[range.clone()])), + }) + } +} + +impl From> for RendererCreationError { + fn from(err: gfx::PipelineStateError) -> Self { + RendererCreationError::PipelineState(err) + } +} + +impl std::error::Error for RendererCreationError { + fn description(&self) -> &str { + match *self { + RendererCreationError::PipelineState(ref e) => std::error::Error::description(e), + } + } +} + +impl std::fmt::Display for RendererCreationError { + fn fmt(&self, f: &mut std::fmt::Formatter) -> Result<(), std::fmt::Error> { + match *self { + RendererCreationError::PipelineState(ref e) => std::fmt::Display::fmt(e, f), + } + } +} diff --git a/backends/conrod_piston/examples/all_piston_window.rs b/backends/conrod_piston/examples/all_piston_window.rs index 0b6ae9968..daa52c7f0 100644 --- a/backends/conrod_piston/examples/all_piston_window.rs +++ b/backends/conrod_piston/examples/all_piston_window.rs @@ -80,6 +80,7 @@ pub fn main() { let size = window.size(); let (win_w, win_h) = (size.width as conrod_core::Scalar, size.height as conrod_core::Scalar); if let Some(e) = conrod_piston::event::convert(event.clone(), win_w, win_h) { + println!("e{:?}",e.clone()); ui.handle_event(e); } diff --git a/backends/conrod_piston/src/event.rs b/backends/conrod_piston/src/event.rs index d08730a64..5aeaf41b5 100644 --- a/backends/conrod_piston/src/event.rs +++ b/backends/conrod_piston/src/event.rs @@ -25,6 +25,7 @@ pub fn convert(event: E, win_w: Scalar, win_h: Scalar) -> Option Date: Wed, 20 Feb 2019 08:12:20 +0800 Subject: [PATCH 03/64] c --- Cargo.toml | 3 ++ backends/conrod_crayon/Cargo.toml | 1 + backends/conrod_crayon/examples/crayon.rs | 15 ++++++--- .../conrod_crayon/examples/workspace.toml | 33 ------------------- backends/conrod_crayon/src/lib.rs | 6 ++-- 5 files changed, 17 insertions(+), 41 deletions(-) delete mode 100644 backends/conrod_crayon/examples/workspace.toml diff --git a/Cargo.toml b/Cargo.toml index ee6d6f583..7c9f7d702 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -11,3 +11,6 @@ members = [ "backends/conrod_ggez", "backends/conrod_crayon" ] +[assets] +source = 'assets' +destination = 'resources' diff --git a/backends/conrod_crayon/Cargo.toml b/backends/conrod_crayon/Cargo.toml index aa42811df..bcf9dbbf6 100644 --- a/backends/conrod_crayon/Cargo.toml +++ b/backends/conrod_crayon/Cargo.toml @@ -18,6 +18,7 @@ path = "./src/lib.rs" [dependencies] conrod_core = { path = "../../conrod_core", version = "0.63" } crayon = { path = "../../../wasm/crayon"} +conrod_example_shared = { path = "../conrod_example_shared", version = "0.63" } [dev-dependencies] find_folder = "0.3.0" diff --git a/backends/conrod_crayon/examples/crayon.rs b/backends/conrod_crayon/examples/crayon.rs index 60ba5bf54..41adc45ce 100644 --- a/backends/conrod_crayon/examples/crayon.rs +++ b/backends/conrod_crayon/examples/crayon.rs @@ -1,8 +1,11 @@ extern crate crayon; extern crate conrod_crayon; +extern crate conrod_example_shared; extern crate find_folder; use crayon::prelude::*; +use crayon::window::device_pixel_ratio; use conrod_crayon::Renderer; +use conrod_example_shared::{WIN_W, WIN_H}; struct Window { renderer: Renderer, @@ -24,14 +27,13 @@ impl Window { let assets = find_folder::Search::KidsThenParents(3, 5).for_folder("assets").unwrap(); let font_path = assets.join("fonts/NotoSans/NotoSans-Regular.ttf"); ui.fonts.insert_from_file(font_path).unwrap(); - let rtv = graphics::screen_render_target(ctx); - let mut image_map: conrod_core::image::Map<(RenderTextureHandle,(f64,f64))> = conrod_core::image::Map::new(); + let mut image_map: conrod_core::image::Map = conrod_core::image::Map::new(); let rust_logo = image_map.insert(load_rust_logo()); // Demonstration app state that we'll control with our conrod GUI. let app = conrod_example_shared::DemoApp::new(rust_logo); let dpi_factor = device_pixel_ratio(); - let renderer = conrod_crayon::Renderer::new((WIN_W,WIN_H), dpi_factor as f64).unwrap(); + let renderer = conrod_crayon::Renderer::new((WIN_W as f64,WIN_H as f64), dpi_factor as f64); Ok(Window { app:app, ui:ui, @@ -46,7 +48,7 @@ impl Window { impl Drop for Window { fn drop(&mut self) { - video::delete_render_texture(self.texture); + /*video::delete_render_texture(self.texture); video::delete_mesh(self.pass.mesh); video::delete_shader(self.pass.shader); @@ -55,11 +57,13 @@ impl Drop for Window { video::delete_mesh(self.post_effect.mesh); video::delete_shader(self.post_effect.shader); video::delete_surface(self.post_effect.surface); + */ } } impl LifecycleListener for Window { fn on_update(&mut self) -> CrResult<()> { + /* let surface = self.pass.surface; let dc = Draw::new(self.pass.shader, self.pass.mesh); self.batch.draw(dc); @@ -73,11 +77,12 @@ impl LifecycleListener for Window { self.batch.submit(surface)?; self.time += 0.05; + */ Ok(()) } } fn load_rust_logo() -> TextureHandle { - video::create_texture_from("res:rust.png") + video::create_texture_from("res:images/rust.png").unwrap() } main!({ let mut params = Params::default(); diff --git a/backends/conrod_crayon/examples/workspace.toml b/backends/conrod_crayon/examples/workspace.toml deleted file mode 100644 index 44c86d2dc..000000000 --- a/backends/conrod_crayon/examples/workspace.toml +++ /dev/null @@ -1,33 +0,0 @@ -[assets] -source = 'assets' -destination = 'resources' - -[[assets.importers]] -type = 'Texture' -extensions = [ - '.png', - '.jpg', - '.jpeg', - '.bmp', - '.tga', - '.psd', # Yes, we do supports .PSD files. -] - -[[assets.importers]] -type = 'Transmission' -extensions = [ - '.obj', - '.blend', - '.fbx', - '.gltf', - '.dae', - '.3ds', -] - -[[assets.importers]] -type = 'Audio' -extensions = [ - '.mp3', - '.wav', - '.ogg', -] \ No newline at end of file diff --git a/backends/conrod_crayon/src/lib.rs b/backends/conrod_crayon/src/lib.rs index 7cfde0d6c..eff8024e9 100644 --- a/backends/conrod_crayon/src/lib.rs +++ b/backends/conrod_crayon/src/lib.rs @@ -34,8 +34,8 @@ impl Renderer{ pub fn new(dim:(f64,f64),dpi_factor: f64)->Self{ let mut params = RenderTextureParams::default(); params.format = RenderTextureFormat::RGBA8; - params.dimensions = (dim.1,dim.2).into(); - let rendered_texture = video::create_render_texture(params)?; + params.dimensions = (dim.0 as u32,dim.1 as u32).into(); + let rendered_texture = video::create_render_texture(params).unwrap(); let attributes = AttributeLayoutBuilder::new() .with(Attribute::Position, 2) .finish(); @@ -45,7 +45,7 @@ impl Renderer{ let fs = include_str!("shaders/conrod.fs").to_owned(); let shader = video::create_shader(params, vs, fs).unwrap(); let mut params = SurfaceParams::default(); - params.set_attachments(&[rendered_texture], None)?; + params.set_attachments(&[rendered_texture], None).unwrap(); params.set_clear(Color::gray(), None, None); let surface = video::create_surface(params).unwrap(); From a2b835a1acbc2cf0eccfa9751d1fc02c0614fe0e Mon Sep 17 00:00:00 2001 From: alanpoon Date: Fri, 22 Feb 2019 11:13:38 +0800 Subject: [PATCH 04/64] tft --- .gitignore | 2 +- Cargo.toml | 3 - assets/crayon/assets/cornell_box.obj | 118 ++++++++++++++++++ .../crayon/assets/cornell_box.obj.meta.toml | 31 +++++ assets/crayon/assets/crate.bmp | Bin 0 -> 66614 bytes assets/crayon/assets/crate.bmp.meta.toml | 15 +++ assets/crayon/assets/music.mp3 | Bin 0 -> 261067 bytes assets/crayon/assets/music.mp3.meta.toml | 11 ++ assets/crayon/assets/sfx.ogg | Bin 0 -> 18441 bytes assets/crayon/assets/sfx.ogg.meta.toml | 11 ++ .../NotoSans-BoldItalic.ttf.meta.toml | 10 ++ .../NotoSans/NotoSans-Italic.ttf.meta.toml | 10 ++ assets/images/rust.png.meta.toml | 6 + assets/images/rust_hover.png.meta.toml | 6 + assets/images/rust_press.png.meta.toml | 6 + backends/conrod_crayon/examples/crayon.rs | 22 +++- backends/conrod_crayon/src/lib.rs | 6 +- backends/conrod_crayon/src/shaders/conrod.vs | 16 +-- workspace.toml | 33 +++++ 19 files changed, 291 insertions(+), 15 deletions(-) create mode 100644 assets/crayon/assets/cornell_box.obj create mode 100644 assets/crayon/assets/cornell_box.obj.meta.toml create mode 100755 assets/crayon/assets/crate.bmp create mode 100644 assets/crayon/assets/crate.bmp.meta.toml create mode 100644 assets/crayon/assets/music.mp3 create mode 100644 assets/crayon/assets/music.mp3.meta.toml create mode 100644 assets/crayon/assets/sfx.ogg create mode 100644 assets/crayon/assets/sfx.ogg.meta.toml create mode 100644 assets/fonts/NotoSans/NotoSans-BoldItalic.ttf.meta.toml create mode 100644 assets/fonts/NotoSans/NotoSans-Italic.ttf.meta.toml create mode 100644 assets/images/rust.png.meta.toml create mode 100644 assets/images/rust_hover.png.meta.toml create mode 100644 assets/images/rust_press.png.meta.toml create mode 100644 workspace.toml diff --git a/.gitignore b/.gitignore index 9f3c00dd2..2ea71dfab 100644 --- a/.gitignore +++ b/.gitignore @@ -20,5 +20,5 @@ target/ /.rust/ rusti.sh /examples/**/target - +assets/crayon/resources Cargo.lock diff --git a/Cargo.toml b/Cargo.toml index 7c9f7d702..ee6d6f583 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -11,6 +11,3 @@ members = [ "backends/conrod_ggez", "backends/conrod_crayon" ] -[assets] -source = 'assets' -destination = 'resources' diff --git a/assets/crayon/assets/cornell_box.obj b/assets/crayon/assets/cornell_box.obj new file mode 100644 index 000000000..fb00a8ddd --- /dev/null +++ b/assets/crayon/assets/cornell_box.obj @@ -0,0 +1,118 @@ +# The original Cornell Box in OBJ format. +# Note that the real box is not a perfect cube, so +# the faces are imperfect in this data set. +# +# Created by Guedis Cardenas and Morgan McGuire at Williams College, 2011 +# Released into the Public Domain. +# +# http://graphics.cs.williams.edu/data +# http://www.graphics.cornell.edu/online/box/data.html +# + +## Object floor +v -1.01 0.00 0.99 +v 1.00 0.00 0.99 +v 1.00 0.00 -1.04 +v -0.99 0.00 -1.04 + +g floor +usemtl floor +f -4 -3 -2 -1 + +## Object backwall +v -0.99 0.00 -1.04 +v 1.00 0.00 -1.04 +v 1.00 1.99 -1.04 +v -1.02 1.99 -1.04 + +## Object shortBox +g shortBox +usemtl shortBox + +# Top Face +v 0.53 0.60 0.75 +v 0.70 0.60 0.17 +v 0.13 0.60 0.00 +v -0.05 0.60 0.57 +f -4 -3 -2 -1 + +# Left Face +v -0.05 0.00 0.57 +v -0.05 0.60 0.57 +v 0.13 0.60 0.00 +v 0.13 0.00 0.00 +f -4 -3 -2 -1 + +# Front Face +v 0.53 0.00 0.75 +v 0.53 0.60 0.75 +v -0.05 0.60 0.57 +v -0.05 0.00 0.57 +f -4 -3 -2 -1 + +# Right Face +v 0.70 0.00 0.17 +v 0.70 0.60 0.17 +v 0.53 0.60 0.75 +v 0.53 0.00 0.75 +f -4 -3 -2 -1 + +# Back Face +v 0.13 0.00 0.00 +v 0.13 0.60 0.00 +v 0.70 0.60 0.17 +v 0.70 0.00 0.17 +f -4 -3 -2 -1 + +# Bottom Face +v 0.53 0.00 0.75 +v 0.70 0.00 0.17 +v 0.13 0.00 0.00 +v -0.05 0.00 0.57 +f -12 -11 -10 -9 + +## Object tallBox +g tallBox +usemtl tallBox + +# Top Face +v -0.53 1.20 0.09 +v 0.04 1.20 -0.09 +v -0.14 1.20 -0.67 +v -0.71 1.20 -0.49 +f -4 -3 -2 -1 + +# Left Face +v -0.53 0.00 0.09 +v -0.53 1.20 0.09 +v -0.71 1.20 -0.49 +v -0.71 0.00 -0.49 +f -4 -3 -2 -1 + +# Back Face +v -0.71 0.00 -0.49 +v -0.71 1.20 -0.49 +v -0.14 1.20 -0.67 +v -0.14 0.00 -0.67 +f -4 -3 -2 -1 + +# Right Face +v -0.14 0.00 -0.67 +v -0.14 1.20 -0.67 +v 0.04 1.20 -0.09 +v 0.04 0.00 -0.09 +f -4 -3 -2 -1 + +# Front Face +v 0.04 0.00 -0.09 +v 0.04 1.20 -0.09 +v -0.53 1.20 0.09 +v -0.53 0.00 0.09 +f -4 -3 -2 -1 + +# Bottom Face +v -0.53 0.00 0.09 +v 0.04 0.00 -0.09 +v -0.14 0.00 -0.67 +v -0.71 0.00 -0.49 +f -8 -7 -6 -5 \ No newline at end of file diff --git a/assets/crayon/assets/cornell_box.obj.meta.toml b/assets/crayon/assets/cornell_box.obj.meta.toml new file mode 100644 index 000000000..69ad076d8 --- /dev/null +++ b/assets/crayon/assets/cornell_box.obj.meta.toml @@ -0,0 +1,31 @@ +name = 'cornell_box.obj' +uuid = '13b56f8c-7724-4313-a5ff-d870db23b243' + +[[resources]] +type = 'Prefab' +name = 'cornell_box.obj' +uuid = '64cd2e4e-1949-4718-ad79-bec5f4cd5600' + +[[resources]] +type = 'Mesh' +name = 'floor' +uuid = '6f0c4447-040f-47c2-8f48-bb8284df5678' + +[[resources]] +type = 'Mesh' +name = 'shortBox' +uuid = 'd0cb0ac2-ac69-49c9-98cb-f5841751b3fd' + +[[resources]] +type = 'Mesh' +name = 'tallBox' +uuid = 'e32f80df-6b59-46d9-b49e-4651aaf8a64e' + +[params] +type = 'Transmission' + +[params.mesh] +optimize = true +calculate_normals = true +calculate_tangents = false +calculate_texcoord = false diff --git a/assets/crayon/assets/crate.bmp b/assets/crayon/assets/crate.bmp new file mode 100755 index 0000000000000000000000000000000000000000..73fe985a835b40e4bbf09019a9af75399c5d6a2e GIT binary patch literal 66614 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%0DD*gaGAb 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 V^g|5vz5IV)&lB{s|4**xe*wUOQS1N! literal 0 HcmV?d00001 diff --git a/assets/crayon/assets/music.mp3.meta.toml b/assets/crayon/assets/music.mp3.meta.toml new file mode 100644 index 000000000..90cdf0bc6 --- /dev/null +++ b/assets/crayon/assets/music.mp3.meta.toml @@ -0,0 +1,11 @@ +name = 'music.mp3' +uuid = '6d4cf11e-a3f2-4e6f-8d1f-117c00a2622f' + +[[resources]] +type = 'AudioClip' +name = 'music.mp3' +uuid = '4572a4b5-c9f1-46bd-8451-7f6fa535fae6' + +[params] +type = 'Audio' +compression = 'HighQuality' diff --git a/assets/crayon/assets/sfx.ogg b/assets/crayon/assets/sfx.ogg new file mode 100644 index 0000000000000000000000000000000000000000..4ffaee5a01ac042905f244c2b784c65090143755 GIT binary patch literal 18441 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 literal 0 HcmV?d00001 diff --git a/assets/crayon/assets/sfx.ogg.meta.toml b/assets/crayon/assets/sfx.ogg.meta.toml new file mode 100644 index 000000000..6d946102a --- /dev/null +++ b/assets/crayon/assets/sfx.ogg.meta.toml @@ -0,0 +1,11 @@ +name = 'sound_efx.ogg' +uuid = 'c8c0425f-79ed-41bc-baf1-2c8b6df6b0e9' + +[[resources]] +type = 'AudioClip' +name = 'sound_efx.ogg' +uuid = '427eb273-e774-46b8-b701-0ace1b7652ee' + +[params] +type = 'Audio' +compression = 'HighQuality' diff --git a/assets/fonts/NotoSans/NotoSans-BoldItalic.ttf.meta.toml b/assets/fonts/NotoSans/NotoSans-BoldItalic.ttf.meta.toml new file mode 100644 index 000000000..0356e0bd0 --- /dev/null +++ b/assets/fonts/NotoSans/NotoSans-BoldItalic.ttf.meta.toml @@ -0,0 +1,10 @@ +name = 'fonts/NotoSans/NotoSans-BoldItalic.ttf' +uuid = 'b0a1740a-bc68-48e5-9c26-cc17089f2675' + +[[resources]] +type = 'Bytes' +name = 'fonts/NotoSans/NotoSans-BoldItalic.ttf' +uuid = '3b904684-995f-46e9-a6f4-567f284b82f3' + +[params] +type = 'Bytes' diff --git a/assets/fonts/NotoSans/NotoSans-Italic.ttf.meta.toml b/assets/fonts/NotoSans/NotoSans-Italic.ttf.meta.toml new file mode 100644 index 000000000..cd651a01c --- /dev/null +++ b/assets/fonts/NotoSans/NotoSans-Italic.ttf.meta.toml @@ -0,0 +1,10 @@ +name = 'fonts/NotoSans/NotoSans-Italic.ttf' +uuid = 'd17c06ff-d2d5-443e-865a-a26bde79c4bf' + +[[resources]] +type = 'Bytes' +name = 'fonts/NotoSans/NotoSans-Italic.ttf' +uuid = '8f9795bb-5c7d-4215-b38d-65ea3d784813' + +[params] +type = 'Bytes' diff --git a/assets/images/rust.png.meta.toml b/assets/images/rust.png.meta.toml new file mode 100644 index 000000000..33a12eaa7 --- /dev/null +++ b/assets/images/rust.png.meta.toml @@ -0,0 +1,6 @@ +name = 'rust.png' +uuid = '6723cbed-c40c-42bf-ac33-93e9088322c7' +resources = [] + +[params] +type = 'Bytes' diff --git a/assets/images/rust_hover.png.meta.toml b/assets/images/rust_hover.png.meta.toml new file mode 100644 index 000000000..e49c4afc9 --- /dev/null +++ b/assets/images/rust_hover.png.meta.toml @@ -0,0 +1,6 @@ +name = 'rust_hover.png' +uuid = '24ec0d61-9ee5-4f9c-8b74-acd2f09ae404' +resources = [] + +[params] +type = 'Bytes' diff --git a/assets/images/rust_press.png.meta.toml b/assets/images/rust_press.png.meta.toml new file mode 100644 index 000000000..b7bc0a14b --- /dev/null +++ b/assets/images/rust_press.png.meta.toml @@ -0,0 +1,6 @@ +name = 'images/rust_press.png' +uuid = 'e1674a5f-a55d-44a7-951e-ebfd827b267f' +resources = [] + +[params] +type = 'Bytes' diff --git a/backends/conrod_crayon/examples/crayon.rs b/backends/conrod_crayon/examples/crayon.rs index 41adc45ce..06d41f632 100644 --- a/backends/conrod_crayon/examples/crayon.rs +++ b/backends/conrod_crayon/examples/crayon.rs @@ -6,6 +6,7 @@ use crayon::prelude::*; use crayon::window::device_pixel_ratio; use conrod_crayon::Renderer; use conrod_example_shared::{WIN_W, WIN_H}; +use std::time::SystemTime; struct Window { renderer: Renderer, @@ -78,15 +79,34 @@ impl LifecycleListener for Window { self.time += 0.05; */ + { + let mut ui = self.ui.set_widgets(); + conrod_example_shared::gui(&mut ui, &self.ids, &mut self.app); + } + let dpi_factor =device_pixel_ratio() as f64; + //let dpi_factor =1.16; + if let Some(primitives) = self.ui.draw_if_changed() { + println!("get_hidpi_factor {:?} {:?}",dpi_factor,SystemTime::now()); + let dims = (WIN_W as f64 * dpi_factor, WIN_H as f64 * dpi_factor); + self.renderer.fill(dims,dpi_factor as f64,primitives,&self.image_map); + self.renderer.draw(&mut self.batch); + } Ok(()) } } fn load_rust_logo() -> TextureHandle { - video::create_texture_from("res:images/rust.png").unwrap() + video::create_texture_from("res:crate.bmp").unwrap() } main!({ + #[cfg(not(target_arch = "wasm32"))] + let res = format!("file://{}/../../assets/crayon/resources/", env!("CARGO_MANIFEST_DIR")); + #[cfg(target_arch = "wasm32")] + let res = format!("http://localhost:8080/examples/resources/"); + println!("{}", env!("CARGO_MANIFEST_DIR")); let mut params = Params::default(); params.window.title = "CR: RenderTexture".into(); params.window.size = (568, 320).into(); + params.res.shortcuts.add("res:", res).unwrap(); + params.res.dirs.push("res:".into()); crayon::application::setup(params, Window::build).unwrap(); }); \ No newline at end of file diff --git a/backends/conrod_crayon/src/lib.rs b/backends/conrod_crayon/src/lib.rs index eff8024e9..066c7e798 100644 --- a/backends/conrod_crayon/src/lib.rs +++ b/backends/conrod_crayon/src/lib.rs @@ -13,7 +13,7 @@ use conrod_core::{ impl_vertex! { Vertex { pos => [Position; Float; 2; false], - uv =>[Bitangent; Float; 2; false], + uv =>[Texcoord0; Float; 2; false], color =>[Color0; Float; 4; true], mode => [Tangent; UShort; 2;false], } @@ -41,6 +41,7 @@ impl Renderer{ .finish(); let mut params = ShaderParams::default(); params.attributes = attributes; + //looking for Position let vs = include_str!("shaders/conrod.vs").to_owned(); let fs = include_str!("shaders/conrod.fs").to_owned(); let shader = video::create_shader(params, vs, fs).unwrap(); @@ -56,7 +57,7 @@ impl Renderer{ rendered_texture:rendered_texture, } } - pub fn fill

(&mut self,dims: (f64, f64),dpi_factor: f64,mut primitives: P, image_map:conrod_core::image::Map )where P: render::PrimitiveWalker{ + pub fn fill

(&mut self,dims: (f64, f64),dpi_factor: f64,mut primitives: P, image_map:&conrod_core::image::Map )where P: render::PrimitiveWalker{ let (screen_w, screen_h) = dims; let half_win_w = screen_w / 2.0; let half_win_h = screen_h / 2.0; @@ -88,6 +89,7 @@ impl Renderer{ } match kind { render::PrimitiveKind::Rectangle { color } => { + dbg!("there is rect"); let color = gamma_srgb_to_linear(color.to_fsa()); let (l, r, b, t) = rect.l_r_b_t(); let v = |x, y| { diff --git a/backends/conrod_crayon/src/shaders/conrod.vs b/backends/conrod_crayon/src/shaders/conrod.vs index d6489ee29..5bde4f17d 100644 --- a/backends/conrod_crayon/src/shaders/conrod.vs +++ b/backends/conrod_crayon/src/shaders/conrod.vs @@ -1,18 +1,18 @@ #version 300 es precision mediump float; -in vec2 position; -in vec2 tex_coords; -in vec4 color; -in uint mode; +in vec2 Position; +in vec2 Texcoord0; +in vec4 Color0; +in vec2 Tangent; out vec2 v_tex_coords; out vec4 v_color; flat out uint v_mode; void main() { - gl_Position = vec4(position, 0.0, 1.0); - v_tex_coords = tex_coords; - v_color = color; - v_mode = mode; + gl_Position = vec4(Position, 0.0, 1.0); + v_tex_coords = Texcoord0; + v_color = Color0; + v_mode = uint(Tangent.x); } \ No newline at end of file diff --git a/workspace.toml b/workspace.toml new file mode 100644 index 000000000..4dee26684 --- /dev/null +++ b/workspace.toml @@ -0,0 +1,33 @@ +[assets] +source = 'assets/images' +destination = 'assets/resources' + +[[assets.importers]] +type = 'Texture' +extensions = [ + '.png', + '.jpg', + '.jpeg', + '.bmp', + '.tga', + '.psd', # Yes, we do supports .PSD files. +] + +[[assets.importers]] +type = 'Transmission' +extensions = [ + '.obj', + '.blend', + '.fbx', + '.gltf', + '.dae', + '.3ds', +] + +[[assets.importers]] +type = 'Audio' +extensions = [ + '.mp3', + '.wav', + '.ogg', +] \ No newline at end of file From d0a667773c995604da081f752790c2c6b8bc8a25 Mon Sep 17 00:00:00 2001 From: alanpoon Date: Tue, 26 Feb 2019 22:39:37 +0800 Subject: [PATCH 05/64] added events --- backends/conrod_crayon/Cargo.toml | 1 + backends/conrod_crayon/examples/crayon.rs | 22 +-- backends/conrod_crayon/src/events.rs | 52 +++++++ backends/conrod_crayon/src/lib.rs | 172 ++++++++++++++++++---- 4 files changed, 204 insertions(+), 43 deletions(-) create mode 100644 backends/conrod_crayon/src/events.rs diff --git a/backends/conrod_crayon/Cargo.toml b/backends/conrod_crayon/Cargo.toml index bcf9dbbf6..a91501a26 100644 --- a/backends/conrod_crayon/Cargo.toml +++ b/backends/conrod_crayon/Cargo.toml @@ -19,6 +19,7 @@ path = "./src/lib.rs" conrod_core = { path = "../../conrod_core", version = "0.63" } crayon = { path = "../../../wasm/crayon"} conrod_example_shared = { path = "../conrod_example_shared", version = "0.63" } +serde_json = "1.0" [dev-dependencies] find_folder = "0.3.0" diff --git a/backends/conrod_crayon/examples/crayon.rs b/backends/conrod_crayon/examples/crayon.rs index 06d41f632..2c4173260 100644 --- a/backends/conrod_crayon/examples/crayon.rs +++ b/backends/conrod_crayon/examples/crayon.rs @@ -64,26 +64,12 @@ impl Drop for Window { impl LifecycleListener for Window { fn on_update(&mut self) -> CrResult<()> { - /* - let surface = self.pass.surface; - let dc = Draw::new(self.pass.shader, self.pass.mesh); - self.batch.draw(dc); - self.batch.submit(surface)?; - - let surface = self.post_effect.surface; - let mut dc = Draw::new(self.post_effect.shader, self.post_effect.mesh); - dc.set_uniform_variable("renderedTexture", self.texture); - dc.set_uniform_variable("time", self.time); - self.batch.draw(dc); - self.batch.submit(surface)?; - - self.time += 0.05; - */ + conrod_crayon::events::convert_event(&mut self.ui); { - let mut ui = self.ui.set_widgets(); - conrod_example_shared::gui(&mut ui, &self.ids, &mut self.app); + let mut ui = self.ui.set_widgets(); + conrod_example_shared::gui(&mut ui, &self.ids, &mut self.app); } - let dpi_factor =device_pixel_ratio() as f64; + let dpi_factor = device_pixel_ratio() as f64; //let dpi_factor =1.16; if let Some(primitives) = self.ui.draw_if_changed() { println!("get_hidpi_factor {:?} {:?}",dpi_factor,SystemTime::now()); diff --git a/backends/conrod_crayon/src/events.rs b/backends/conrod_crayon/src/events.rs new file mode 100644 index 000000000..eab934a07 --- /dev/null +++ b/backends/conrod_crayon/src/events.rs @@ -0,0 +1,52 @@ +use conrod_core::event::Input; +use conrod_core::input::Button::Keyboard; +use conrod_core::input::Button::Mouse; +use conrod_core::input::Motion; +use conrod_core::Ui; +use crayon::prelude::*; +use crayon::utils::hash::FastHashSet; +use serde_json::Result; + +pub fn convert_event(ui:&mut Ui){ + let mouse_presses = input::mouse_presses(); + for mp in mouse_presses.iter(){ + let e = match mp{ + crayon::input::mouse::MouseButton::Left => conrod_core::input::state::mouse::Button::Left, + crayon::input::mouse::MouseButton::Right => conrod_core::input::state::mouse::Button::Right, + crayon::input::mouse::MouseButton::Middle => conrod_core::input::state::mouse::Button::Middle, + crayon::input::mouse::MouseButton::Other(_j) => conrod_core::input::state::mouse::Button::Unknown + }; + ui.handle_event(Input::Press(conrod_core::input::Button::Mouse(e))); + } + let mouse_releases = input::mouse_releases(); + for mp in mouse_releases.iter(){ + let e = match mp{ + crayon::input::mouse::MouseButton::Left => conrod_core::input::state::mouse::Button::Left, + crayon::input::mouse::MouseButton::Right => conrod_core::input::state::mouse::Button::Right, + crayon::input::mouse::MouseButton::Middle => conrod_core::input::state::mouse::Button::Middle, + crayon::input::mouse::MouseButton::Other(_j) => conrod_core::input::state::mouse::Button::Unknown + }; + ui.handle_event(Input::Release(conrod_core::input::Button::Mouse(e))); + } + let key_presses = input::key_presses(); + for kp in key_presses.iter(){ + let e = serde_json::to_string(kp).unwrap(); + let ee:conrod_core::input::keyboard::Key = serde_json::from_str(&e).unwrap(); + ui.handle_event(Input::Press(Keyboard(ee))); + } + let key_releases = input::key_releases(); + for kp in key_releases.iter(){ + let e = serde_json::to_string(kp).unwrap(); + let ee:conrod_core::input::keyboard::Key = serde_json::from_str(&e).unwrap(); + ui.handle_event(Input::Release(Keyboard(ee))); + } + let k = input::mouse_movement(); + if k.x >0.0 || k.y >0.0 { + let j = input::mouse_position(); + ui.handle_event(Input::Motion(Motion::MouseCursor{x:j.x as f64,y:j.y as f64})); + } + let j = input::mouse_scroll(); + if j.x > 0.0 || j.y >0.0{ + ui.handle_event(Input::Motion(Motion::Scroll{x:j.x as f64,y:j.y as f64})); + } +} diff --git a/backends/conrod_crayon/src/lib.rs b/backends/conrod_crayon/src/lib.rs index 066c7e798..359e948d5 100644 --- a/backends/conrod_crayon/src/lib.rs +++ b/backends/conrod_crayon/src/lib.rs @@ -1,7 +1,9 @@ extern crate crayon; extern crate conrod_core; +extern crate serde_json; use crayon::impl_vertex; use crayon::prelude::*; +pub mod events; use conrod_core::{ Rect, Scalar, @@ -24,11 +26,41 @@ pub const MODE_TEXT: u16 = 0; pub const MODE_IMAGE: u16 = 1; /// Ignore `tex` and draw simple, colored 2D geometry. pub const MODE_GEOMETRY: u16 = 2; +/// A `Command` describing a step in the drawing process. +#[derive(Clone, Debug)] +pub enum Command<'a> { + /// Draw to the target. + Draw(Draw_e<'a>), + /// Update the scizzor within the `glium::DrawParameters`. + Scizzor(SurfaceScissor), +} +enum PreparedCommand { + Image(image::Id, std::ops::Range), + Plain(std::ops::Range), + Scizzor(SurfaceScissor), +} pub struct Renderer { - mesh: Option, + vertices: Vec, shader: ShaderHandle, surface: SurfaceHandle, - rendered_texture:RenderTextureHandle + rendered_texture:RenderTextureHandle, + commands: Vec, +} +/// A `Command` for drawing to the target. +/// +/// Each variant describes how to draw the contents of the vertex buffer. +#[derive(Clone, Debug)] +pub enum Draw_e<'a> { + /// A range of vertices representing triangles textured with the image in the + /// image_map at the given `widget::Id`. + Image(image::Id, &'a [Vertex]), + /// A range of vertices representing plain triangles. + Plain(&'a [Vertex]), +} + +pub struct Commands<'a> { + commands: std::slice::Iter<'a, PreparedCommand>, + vertices: &'a [Vertex], } impl Renderer{ pub fn new(dim:(f64,f64),dpi_factor: f64)->Self{ @@ -48,25 +80,51 @@ impl Renderer{ let mut params = SurfaceParams::default(); params.set_attachments(&[rendered_texture], None).unwrap(); params.set_clear(Color::gray(), None, None); - + let vert:Vec = Vec::new(); + let commands:Vec = Vec::new(); let surface = video::create_surface(params).unwrap(); Renderer{ - mesh:None, + vertices: vert, shader:shader, surface:surface, rendered_texture:rendered_texture, + commands: commands + } + } + pub fn commands(&self) -> Commands { + let Renderer { ref commands, ref vertices, .. } = *self; + Commands { + commands: commands.iter(), + vertices: vertices, } } pub fn fill

(&mut self,dims: (f64, f64),dpi_factor: f64,mut primitives: P, image_map:&conrod_core::image::Map )where P: render::PrimitiveWalker{ let (screen_w, screen_h) = dims; let half_win_w = screen_w / 2.0; let half_win_h = screen_h / 2.0; - let Renderer { mut mesh,shader,surface,rendered_texture} = *self; - let mut vertices:Vec = Vec::new(); - let current_scissor =SurfaceScissor::Enable{ + let Renderer { ref mut vertices,shader,surface,rendered_texture,ref mut commands} = *self; + commands.clear(); + vertices.clear(); + let mut current_scissor =SurfaceScissor::Enable{ position: Vector2{x:0,y:0}, size: Vector2{x:screen_w as u32,y:screen_h as u32} }; + enum State { + Image { image_id: image::Id, start: usize }, + Plain { start: usize }, + } + let mut current_state = State::Plain { start: 0 }; + macro_rules! switch_to_plain_state { + () => { + match current_state { + State::Plain { .. } => (), + State::Image { image_id, start } => { + commands.push(PreparedCommand::Image(image_id, start..vertices.len())); + current_state = State::Plain { start: vertices.len() }; + }, + } + }; + } let rect_to_crayon_rect = |rect: Rect| { let (w, h) = rect.w_h(); let left = (rect.left() * dpi_factor + half_win_w) as i32; @@ -81,14 +139,29 @@ impl Renderer{ let vx = |x: f64| (x * dpi_factor / half_win_w) as f32; let vy = |y: f64| (y * dpi_factor / half_win_h) as f32; + let mut c =0; while let Some(primitive) = primitives.next_primitive() { let render::Primitive { kind, scizzor, rect, .. } = primitive; - let new_scizzor = rect_to_crayon_rect(scizzor); - if new_scizzor != current_scissor { + let new_scissor = rect_to_crayon_rect(scizzor); + if new_scissor != current_scissor { + // Finish the current command. + match current_state { + State::Plain { start } => + commands.push(PreparedCommand::Plain(start..vertices.len())), + State::Image { image_id, start } => + commands.push(PreparedCommand::Image(image_id, start..vertices.len())), + } + // Update the scizzor and produce a command. + current_scissor = new_scissor; + commands.push(PreparedCommand::Scizzor(current_scissor)); + + // Set the state back to plain drawing. + current_state = State::Plain { start: vertices.len() }; } match kind { render::PrimitiveKind::Rectangle { color } => { + switch_to_plain_state!(); dbg!("there is rect"); let color = gamma_srgb_to_linear(color.to_fsa()); let (l, r, b, t) = rect.l_r_b_t(); @@ -117,25 +190,60 @@ impl Renderer{ _=>{} } } - let mut params = MeshParams::default(); - params.num_verts = 3; - params.num_idxes = 3; - let idxes: [u16; 3] = [0, 1, 2]; - let data = MeshData { - vptr: Vertex::encode(&vertices[..]).into(), - iptr: IndexFormat::encode(&idxes).into(), - }; - - mesh = Some(video::create_mesh(params, Some(data)).unwrap()); - + // Enter the final command. + match current_state { + State::Plain { start } => + commands.push(PreparedCommand::Plain(start..vertices.len())), + State::Image { image_id, start } => + commands.push(PreparedCommand::Image(image_id, start..vertices.len())), + } } pub fn draw(&self,batch: &mut CommandBuffer){ - if let Some(m) = self.mesh{ - let surface = self.surface; - let dc = Draw::new(self.shader, m); - batch.draw(dc); - batch.submit(surface).unwrap(); + const NUM_VERTICES_IN_TRIANGLE: usize = 3; + + + for command in self.commands() { + match command { + Command::Scizzor(scizzor) => batch.update_scissor(scizzor), + + // Draw to the target with the given `draw` command. + Command::Draw(draw) => match draw { + Draw_e::Plain(slice) => if slice.len() >= NUM_VERTICES_IN_TRIANGLE { + //let mut idxes = vec![]; + let mut idxes:Vec = vec![]; + for i in 0..slice.len(){ + idxes.push(i as u8); + } + // let idxes = [0,1,2]; + println!("vertices {:?}",slice); + let mut params = MeshParams::default(); + params.num_verts = slice.len(); + params.num_idxes = slice.len(); + params.primitive = MeshPrimitive::Triangles; + params.layout = Vertex::layout(); + let data = MeshData { + //vptr: Vertex::encode(&slice[..]).into(), + vptr: Vertex::encode(&slice[..]).into(), + iptr: IndexFormat::encode(&idxes).into(), + }; + dbg!("before_create_mesh"); + let mesh = video::create_mesh(params.clone(), Some(data)).unwrap(); + dbg!("after_create_mesh"); + let dc = Draw::new(self.shader, mesh); + dbg!("dc"); + batch.draw(dc); + dbg!("draw dc"); + batch.submit(self.surface).unwrap(); + dbg!("submit dc"); + }, + _=>{ + + } + } + } } + + } } @@ -149,4 +257,18 @@ fn gamma_srgb_to_linear(c: [f32; 4]) -> [f32; 4] { } } [component(c[0]), component(c[1]), component(c[2]), c[3]] +} + +impl<'a> Iterator for Commands<'a> { + type Item = Command<'a>; + fn next(&mut self) -> Option { + let Commands { ref mut commands, ref vertices } = *self; + commands.next().map(|command| match *command { + PreparedCommand::Scizzor(scizzor) => Command::Scizzor(scizzor), + PreparedCommand::Plain(ref range) => + Command::Draw(Draw_e::Plain(&vertices[range.clone()])), + PreparedCommand::Image(id, ref range) => + Command::Draw(Draw_e::Image(id, &vertices[range.clone()])), + }) + } } \ No newline at end of file From cb4b008dbce0f0cf03ddbef72a14aade11e89143 Mon Sep 17 00:00:00 2001 From: alanpoon Date: Fri, 1 Mar 2019 08:28:53 +0800 Subject: [PATCH 06/64] t --- backends/conrod_crayon/examples/crayon.rs | 26 ++-- backends/conrod_crayon/src/events.rs | 1 + backends/conrod_crayon/src/lib.rs | 142 +++++++++++++----- .../conrod_crayon/src/shaders/conrod.1.fs | 22 +++ .../conrod_crayon/src/shaders/conrod.1.vs | 18 +++ .../conrod_crayon/src/shaders/triangle.fs | 8 + .../conrod_crayon/src/shaders/triangle.vs | 10 ++ backends/conrod_example_shared/src/lib.rs | 4 +- backends/conrod_ggez/src/lib.rs | 7 +- backends/conrod_glium/examples/rect.rs | 98 ++++++++++++ backends/conrod_glium/src/lib.rs | 11 +- t.txt | 4 + 12 files changed, 293 insertions(+), 58 deletions(-) create mode 100644 backends/conrod_crayon/src/shaders/conrod.1.fs create mode 100644 backends/conrod_crayon/src/shaders/conrod.1.vs create mode 100644 backends/conrod_crayon/src/shaders/triangle.fs create mode 100644 backends/conrod_crayon/src/shaders/triangle.vs create mode 100644 backends/conrod_glium/examples/rect.rs create mode 100644 t.txt diff --git a/backends/conrod_crayon/examples/crayon.rs b/backends/conrod_crayon/examples/crayon.rs index 2c4173260..c378147bd 100644 --- a/backends/conrod_crayon/examples/crayon.rs +++ b/backends/conrod_crayon/examples/crayon.rs @@ -2,12 +2,13 @@ extern crate crayon; extern crate conrod_crayon; extern crate conrod_example_shared; extern crate find_folder; +extern crate conrod_core; use crayon::prelude::*; use crayon::window::device_pixel_ratio; use conrod_crayon::Renderer; use conrod_example_shared::{WIN_W, WIN_H}; use std::time::SystemTime; - +use conrod_core::{color, widget, Widget,Positionable,event::{Input}}; struct Window { renderer: Renderer, app: conrod_example_shared::DemoApp, @@ -49,6 +50,7 @@ impl Window { impl Drop for Window { fn drop(&mut self) { + /*video::delete_render_texture(self.texture); video::delete_mesh(self.pass.mesh); @@ -64,19 +66,20 @@ impl Drop for Window { impl LifecycleListener for Window { fn on_update(&mut self) -> CrResult<()> { - conrod_crayon::events::convert_event(&mut self.ui); + //conrod_crayon::events::convert_event(&mut self.ui); + self.ui.handle_event(Input::Press(conrod_core::input::Button::Mouse(conrod_core::input::state::mouse::Button::Left))); { - let mut ui = self.ui.set_widgets(); - conrod_example_shared::gui(&mut ui, &self.ids, &mut self.app); + let ui = &mut self.ui.set_widgets(); + widget::Rectangle::fill([80.0, 80.0]).middle().set(self.ids.rectangle_fill, ui); } + let dpi_factor = device_pixel_ratio() as f64; //let dpi_factor =1.16; - if let Some(primitives) = self.ui.draw_if_changed() { - println!("get_hidpi_factor {:?} {:?}",dpi_factor,SystemTime::now()); - let dims = (WIN_W as f64 * dpi_factor, WIN_H as f64 * dpi_factor); - self.renderer.fill(dims,dpi_factor as f64,primitives,&self.image_map); - self.renderer.draw(&mut self.batch); - } + let primitives = self.ui.draw(); + let dims = (WIN_W as f64 * dpi_factor, WIN_H as f64 * dpi_factor); + self.renderer.fill(dims,dpi_factor as f64,primitives,&self.image_map); + self.renderer.draw(&mut self.batch); + Ok(()) } } @@ -88,10 +91,9 @@ main!({ let res = format!("file://{}/../../assets/crayon/resources/", env!("CARGO_MANIFEST_DIR")); #[cfg(target_arch = "wasm32")] let res = format!("http://localhost:8080/examples/resources/"); - println!("{}", env!("CARGO_MANIFEST_DIR")); let mut params = Params::default(); params.window.title = "CR: RenderTexture".into(); - params.window.size = (568, 320).into(); + params.window.size = (464, 434).into(); params.res.shortcuts.add("res:", res).unwrap(); params.res.dirs.push("res:".into()); crayon::application::setup(params, Window::build).unwrap(); diff --git a/backends/conrod_crayon/src/events.rs b/backends/conrod_crayon/src/events.rs index eab934a07..b9ec5872e 100644 --- a/backends/conrod_crayon/src/events.rs +++ b/backends/conrod_crayon/src/events.rs @@ -10,6 +10,7 @@ use serde_json::Result; pub fn convert_event(ui:&mut Ui){ let mouse_presses = input::mouse_presses(); for mp in mouse_presses.iter(){ + println!("mp {:?}",mp); let e = match mp{ crayon::input::mouse::MouseButton::Left => conrod_core::input::state::mouse::Button::Left, crayon::input::mouse::MouseButton::Right => conrod_core::input::state::mouse::Button::Right, diff --git a/backends/conrod_crayon/src/lib.rs b/backends/conrod_crayon/src/lib.rs index 359e948d5..f89a110af 100644 --- a/backends/conrod_crayon/src/lib.rs +++ b/backends/conrod_crayon/src/lib.rs @@ -12,20 +12,28 @@ use conrod_core::{ render, text::{rt, GlyphCache}, }; +/* impl_vertex! { Vertex { pos => [Position; Float; 2; false], uv =>[Texcoord0; Float; 2; false], - color =>[Color0; Float; 4; true], - mode => [Tangent; UShort; 2;false], + //color =>[Color0; Float; 4; true], + color =>[Color0; Float; 4; false], + mode => [Tangent; Float; 2;false], + } +} +*/ +impl_vertex! { + Vertex { + position => [Position; Float; 2; false], } } /// Draw text from the text cache texture `tex` in the fragment shader. -pub const MODE_TEXT: u16 = 0; +pub const MODE_TEXT: f32 = 0.0; /// Draw an image from the texture at `tex` in the fragment shader. -pub const MODE_IMAGE: u16 = 1; +pub const MODE_IMAGE: f32 = 1.0; /// Ignore `tex` and draw simple, colored 2D geometry. -pub const MODE_GEOMETRY: u16 = 2; +pub const MODE_GEOMETRY: f32 = 2.0; /// A `Command` describing a step in the drawing process. #[derive(Clone, Debug)] pub enum Command<'a> { @@ -42,8 +50,9 @@ enum PreparedCommand { pub struct Renderer { vertices: Vec, shader: ShaderHandle, + shader2: ShaderHandle, surface: SurfaceHandle, - rendered_texture:RenderTextureHandle, + //rendered_texture:RenderTextureHandle, commands: Vec, } /// A `Command` for drawing to the target. @@ -56,6 +65,7 @@ pub enum Draw_e<'a> { Image(image::Id, &'a [Vertex]), /// A range of vertices representing plain triangles. Plain(&'a [Vertex]), + Test, } pub struct Commands<'a> { @@ -64,30 +74,46 @@ pub struct Commands<'a> { } impl Renderer{ pub fn new(dim:(f64,f64),dpi_factor: f64)->Self{ - let mut params = RenderTextureParams::default(); + /*let mut params = RenderTextureParams::default(); params.format = RenderTextureFormat::RGBA8; params.dimensions = (dim.0 as u32,dim.1 as u32).into(); let rendered_texture = video::create_render_texture(params).unwrap(); + */ let attributes = AttributeLayoutBuilder::new() .with(Attribute::Position, 2) .finish(); + let uniforms = UniformVariableLayout::build() + .with("tex", UniformVariableType::RenderTexture) + .finish(); let mut params = ShaderParams::default(); params.attributes = attributes; + //params.uniforms = uniforms; //looking for Position - let vs = include_str!("shaders/conrod.vs").to_owned(); - let fs = include_str!("shaders/conrod.fs").to_owned(); - let shader = video::create_shader(params, vs, fs).unwrap(); + let vs = include_str!("shaders/conrod.1.vs").to_owned(); + let fs = include_str!("shaders/conrod.1.fs").to_owned(); + let shader = video::create_shader(params.clone(), vs, fs).unwrap(); + + let mut params = ShaderParams::default(); + let attributes2 = AttributeLayoutBuilder::new() + .with(Attribute::Position, 2) + .finish(); + params.attributes = attributes2; + let vs2 = include_str!("shaders/triangle.vs").to_owned(); + let fs2 = include_str!("shaders/triangle.fs").to_owned(); + let shader2 = video::create_shader(params, vs2, fs2).unwrap(); let mut params = SurfaceParams::default(); - params.set_attachments(&[rendered_texture], None).unwrap(); + //params.set_attachments(&[rendered_texture], None).unwrap(); params.set_clear(Color::gray(), None, None); let vert:Vec = Vec::new(); let commands:Vec = Vec::new(); let surface = video::create_surface(params).unwrap(); + Renderer{ vertices: vert, shader:shader, + shader2:shader2, surface:surface, - rendered_texture:rendered_texture, + //rendered_texture:rendered_texture, commands: commands } } @@ -101,8 +127,8 @@ impl Renderer{ pub fn fill

(&mut self,dims: (f64, f64),dpi_factor: f64,mut primitives: P, image_map:&conrod_core::image::Map )where P: render::PrimitiveWalker{ let (screen_w, screen_h) = dims; let half_win_w = screen_w / 2.0; - let half_win_h = screen_h / 2.0; - let Renderer { ref mut vertices,shader,surface,rendered_texture,ref mut commands} = *self; + let half_win_h = screen_h / 2.0; + let Renderer { ref mut vertices,shader,surface,ref mut commands,..} = *self; commands.clear(); vertices.clear(); let mut current_scissor =SurfaceScissor::Enable{ @@ -139,9 +165,10 @@ impl Renderer{ let vx = |x: f64| (x * dpi_factor / half_win_w) as f32; let vy = |y: f64| (y * dpi_factor / half_win_h) as f32; - let mut c =0; + let mut c = 0; while let Some(primitive) = primitives.next_primitive() { let render::Primitive { kind, scizzor, rect, .. } = primitive; + /* let new_scissor = rect_to_crayon_rect(scizzor); if new_scissor != current_scissor { // Finish the current command. @@ -159,63 +186,71 @@ impl Renderer{ // Set the state back to plain drawing. current_state = State::Plain { start: vertices.len() }; } + */ match kind { render::PrimitiveKind::Rectangle { color } => { + switch_to_plain_state!(); - dbg!("there is rect"); let color = gamma_srgb_to_linear(color.to_fsa()); let (l, r, b, t) = rect.l_r_b_t(); let v = |x, y| { // Convert from conrod Scalar range to GL range -1.0 to 1.0. - Vertex { + /*Vertex { pos: [vx(x), vy(y)], uv: [0.0, 0.0], color: color, - mode: [MODE_GEOMETRY,0], - } + mode: [MODE_GEOMETRY,0.0], + }*/ + Vertex::new([vx(x),vy(y)]) }; - - let mut push_v = |x, y| vertices.push(v(x, y)); + if c ==0{ + let mut push_v = |x, y| vertices.push(v(x, y)); // Bottom left triangle. - push_v(l, t); - push_v(r, b); - push_v(l, b); + push_v(l, t); + push_v(r, b); + push_v(l, b); - // Top right triangle. - push_v(l, t); - push_v(r, b); - push_v(r, t); + // Top right triangle. + push_v(l, t); + push_v(r, b); + push_v(r, t); + } + }, + render::PrimitiveKind::Other(_) => (), _=>{} } } // Enter the final command. + match current_state { State::Plain { start } => commands.push(PreparedCommand::Plain(start..vertices.len())), State::Image { image_id, start } => commands.push(PreparedCommand::Image(image_id, start..vertices.len())), } + } pub fn draw(&self,batch: &mut CommandBuffer){ const NUM_VERTICES_IN_TRIANGLE: usize = 3; - - + let mut c=0; for command in self.commands() { match command { - Command::Scizzor(scizzor) => batch.update_scissor(scizzor), + Command::Scizzor(scizzor) => { + batch.update_scissor(scizzor) + }, // Draw to the target with the given `draw` command. Command::Draw(draw) => match draw { Draw_e::Plain(slice) => if slice.len() >= NUM_VERTICES_IN_TRIANGLE { //let mut idxes = vec![]; - let mut idxes:Vec = vec![]; + let mut idxes:Vec = vec![]; for i in 0..slice.len(){ - idxes.push(i as u8); + idxes.push(i as u16); } // let idxes = [0,1,2]; - println!("vertices {:?}",slice); + println!("slice {:?}",slice.len()); let mut params = MeshParams::default(); params.num_verts = slice.len(); params.num_idxes = slice.len(); @@ -226,16 +261,44 @@ impl Renderer{ vptr: Vertex::encode(&slice[..]).into(), iptr: IndexFormat::encode(&idxes).into(), }; - dbg!("before_create_mesh"); + let mesh = video::create_mesh(params.clone(), Some(data)).unwrap(); - dbg!("after_create_mesh"); let dc = Draw::new(self.shader, mesh); - dbg!("dc"); batch.draw(dc); - dbg!("draw dc"); batch.submit(self.surface).unwrap(); - dbg!("submit dc"); + }, + Draw_e::Test =>{ + let mut params = MeshParams::default(); + let slice : [Vertex; 6] = [ + Vertex::new([0.5, 0.0]), + Vertex::new([0.5, 0.5]), + Vertex::new([0.0, 0.0]), + Vertex::new([0.0, 0.0]), + Vertex::new([0.0, 0.5]), + Vertex::new([0.5, 0.5]) + ]; + let mut idxes:Vec = vec![]; + for i in 0..slice.len(){ + idxes.push(i as u16); + } + params.num_verts = slice.len(); + params.num_idxes = slice.len(); + params.primitive = MeshPrimitive::Triangles; + params.layout = Vertex::layout(); + let data = MeshData { + //vptr: Vertex::encode(&slice[..]).into(), + vptr: Vertex::encode(&slice[..]).into(), + iptr: IndexFormat::encode(&idxes).into(), + }; + + let mesh = video::create_mesh(params.clone(), Some(data)).unwrap(); + let dc = Draw::new(self.shader2, mesh); + batch.draw(dc); + batch.submit(self.surface).unwrap(); + println!("submitted"); + + } _=>{ } @@ -267,6 +330,7 @@ impl<'a> Iterator for Commands<'a> { PreparedCommand::Scizzor(scizzor) => Command::Scizzor(scizzor), PreparedCommand::Plain(ref range) => Command::Draw(Draw_e::Plain(&vertices[range.clone()])), + // Command::Draw(Draw_e::Test), PreparedCommand::Image(id, ref range) => Command::Draw(Draw_e::Image(id, &vertices[range.clone()])), }) diff --git a/backends/conrod_crayon/src/shaders/conrod.1.fs b/backends/conrod_crayon/src/shaders/conrod.1.fs new file mode 100644 index 000000000..2d9dce70e --- /dev/null +++ b/backends/conrod_crayon/src/shaders/conrod.1.fs @@ -0,0 +1,22 @@ +#version 100 +precision lowp float; +varying vec2 v_tex_coords; +varying vec4 v_color; +varying float v_mode; +uniform sampler2D tex; + +void main() { + // Text + gl_FragColor = v_color; + if (v_mode == 0.0) { + gl_FragColor = v_color * vec4(1.0, 1.0, 1.0, texture2D(tex, v_tex_coords).r); + + // Image + } else if (v_mode == 1.0) { + gl_FragColor = texture2D(tex, v_tex_coords); + + // 2D Geometry + } else if (v_mode == 2.0) { + gl_FragColor = v_color; + } +} \ No newline at end of file diff --git a/backends/conrod_crayon/src/shaders/conrod.1.vs b/backends/conrod_crayon/src/shaders/conrod.1.vs new file mode 100644 index 000000000..31f12e716 --- /dev/null +++ b/backends/conrod_crayon/src/shaders/conrod.1.vs @@ -0,0 +1,18 @@ +#version 100 +precision lowp float; + +attribute lowp vec2 Position; +attribute lowp vec2 Texcoord0; +attribute lowp vec4 Color0; +attribute lowp vec2 Tangent; + +varying vec2 v_tex_coords; +varying vec4 v_color; +varying float v_mode; + +void main() { + gl_Position = vec4(Position, 0.0, 1.0); + v_tex_coords = Texcoord0; + v_color = Color0; + v_mode = Tangent.x; +} \ No newline at end of file diff --git a/backends/conrod_crayon/src/shaders/triangle.fs b/backends/conrod_crayon/src/shaders/triangle.fs new file mode 100644 index 000000000..54dd3044c --- /dev/null +++ b/backends/conrod_crayon/src/shaders/triangle.fs @@ -0,0 +1,8 @@ +#version 100 +precision lowp float; + +varying vec2 v_Color; + +void main() { + gl_FragColor = vec4(v_Color, 0.0, 1.0); +} \ No newline at end of file diff --git a/backends/conrod_crayon/src/shaders/triangle.vs b/backends/conrod_crayon/src/shaders/triangle.vs new file mode 100644 index 000000000..396641e8a --- /dev/null +++ b/backends/conrod_crayon/src/shaders/triangle.vs @@ -0,0 +1,10 @@ +#version 100 +precision lowp float; + +attribute vec2 Position; +varying vec2 v_Color; + +void main() { + gl_Position = vec4(Position, 0.0, 1.0); + v_Color = vec2(0.0,0.0); +} \ No newline at end of file diff --git a/backends/conrod_example_shared/src/lib.rs b/backends/conrod_example_shared/src/lib.rs index cd1a2586e..c84cdc94b 100644 --- a/backends/conrod_example_shared/src/lib.rs +++ b/backends/conrod_example_shared/src/lib.rs @@ -177,7 +177,7 @@ pub fn gui(ui: &mut conrod_core::UiCell, ids: &Ids, app: &mut DemoApp) { let radius = 10.0; widget::RoundedRectangle::fill([w, h], radius) .color(conrod_core::color::CHARCOAL.alpha(0.25)) - .middle_of(ids.shapes_canvas) + .mid_top_of(ids.canvas) .set(ids.rounded_rectangle, ui); let start = [-40.0, -40.0]; @@ -190,7 +190,7 @@ pub fn gui(ui: &mut conrod_core::UiCell, ids: &Ids, app: &mut DemoApp) { let points = once(left).chain(once(top)).chain(once(right)); widget::PointPath::centred(points).right(SHAPE_GAP).set(ids.point_path, ui); - widget::Rectangle::fill([80.0, 80.0]).right(SHAPE_GAP).set(ids.rectangle_fill, ui); + widget::Rectangle::fill([80.0, 80.0]).mid_top_of(ids.canvas).set(ids.rectangle_fill, ui); widget::Rectangle::outline([80.0, 80.0]).right(SHAPE_GAP).set(ids.rectangle_outline, ui); diff --git a/backends/conrod_ggez/src/lib.rs b/backends/conrod_ggez/src/lib.rs index b404e3272..9d3b7b305 100644 --- a/backends/conrod_ggez/src/lib.rs +++ b/backends/conrod_ggez/src/lib.rs @@ -376,8 +376,9 @@ impl<'a> Renderer<'a> { push_v(l, t); push_v(r, b); push_v(r, t); - } - + }, + _ =>{} +/* render::PrimitiveKind::TrianglesSingleColor { color, triangles } => { if triangles.is_empty() { continue; @@ -558,7 +559,9 @@ impl<'a> Renderer<'a> { // We have no special case widgets to handle. render::PrimitiveKind::Other(_) => (), + */ } + } // Enter the final command. diff --git a/backends/conrod_glium/examples/rect.rs b/backends/conrod_glium/examples/rect.rs new file mode 100644 index 000000000..49378c553 --- /dev/null +++ b/backends/conrod_glium/examples/rect.rs @@ -0,0 +1,98 @@ +//! A simple example demonstrating the `Triangles` widget. + +#[macro_use] +extern crate conrod_core; +extern crate glium; +extern crate conrod_glium; +extern crate conrod_winit; +extern crate find_folder; + +mod support; + +use conrod_core::{color, widget, Widget}; +use conrod_core::widget::triangles::Triangle; +use conrod_core::Positionable; +use glium::Surface; + +fn main() { + const WIDTH: u32 = 700; + const HEIGHT: u32 = 400; + + // Build the window. + let mut events_loop = glium::glutin::EventsLoop::new(); + let window = glium::glutin::WindowBuilder::new() + .with_title("Triangles!") + .with_dimensions((WIDTH, HEIGHT).into()); + let context = glium::glutin::ContextBuilder::new() + .with_vsync(true) + .with_multisampling(4); + let display = glium::Display::new(window, context, &events_loop).unwrap(); + let display = support::GliumDisplayWinitWrapper(display); + + // construct our `Ui`. + let mut ui = conrod_core::UiBuilder::new([WIDTH as f64, HEIGHT as f64]).build(); + + // Generate the widget identifiers. + widget_ids!(struct Ids { triangles }); + let ids = Ids::new(ui.widget_id_generator()); + + // Add a `Font` to the `Ui`'s `font::Map` from file. + let assets = find_folder::Search::KidsThenParents(3, 5).for_folder("assets").unwrap(); + let font_path = assets.join("fonts/NotoSans/NotoSans-Regular.ttf"); + ui.fonts.insert_from_file(font_path).unwrap(); + + // A type used for converting `conrod_core::render::Primitives` into `Command`s that can be used + // for drawing to the glium `Surface`. + let mut renderer = conrod_glium::Renderer::new(&display.0).unwrap(); + + // The image map describing each of our widget->image mappings (in our case, none). + let image_map = conrod_core::image::Map::::new(); + + events_loop.run_forever(|event| { + match event.clone() { + glium::glutin::Event::WindowEvent { event, .. } => match event { + + // Break from the loop upon `Escape` or closed window. + glium::glutin::WindowEvent::CloseRequested | + glium::glutin::WindowEvent::KeyboardInput { + input: glium::glutin::KeyboardInput { + virtual_keycode: Some(glium::glutin::VirtualKeyCode::Escape), + .. + }, + .. + } => return glium::glutin::ControlFlow::Break, + + _ => (), + }, + _ => (), + } + + // Use the `winit` backend feature to convert the winit event to a conrod one. + let input = match conrod_winit::convert_event(event, &display) { + None => return glium::glutin::ControlFlow::Continue, + Some(input) => input, + }; + + // Handle the input with the `Ui`. + ui.handle_event(input); + + // Set the triangle widget. + { + let ui = &mut ui.set_widgets(); + widget::Rectangle::fill([80.0, 80.0]) + .middle() + .set(ids.triangles, ui); + } + + // Draw the `Ui` if it has changed. + if let Some(primitives) = ui.draw_if_changed() { + renderer.fill(&display.0, primitives, &image_map); + let mut target = display.0.draw(); + target.clear_color(0.0, 0.0, 0.0, 1.0); + renderer.draw(&display.0, &mut target, &image_map).unwrap(); + target.finish().unwrap(); + } + + glium::glutin::ControlFlow::Continue + }); +} diff --git a/backends/conrod_glium/src/lib.rs b/backends/conrod_glium/src/lib.rs index 46027aad5..d51c595dd 100644 --- a/backends/conrod_glium/src/lib.rs +++ b/backends/conrod_glium/src/lib.rs @@ -484,7 +484,7 @@ impl Renderer { // // The buffer is only used if an older version was detected, otherwise the text GPU cache // uses the rusttype `data` buffer directly. - let mut text_data_u8u8u8 = Vec::new(); + //let mut text_data_u8u8u8 = Vec::new(); // Determine the texture format that we're using. let opengl_version = display.get_opengl_version(); @@ -542,7 +542,7 @@ impl Renderer { height: std::cmp::min(height, screen_h), } }; - + let mut c= 0; // Draw each primitive in order of depth. while let Some(primitive) = primitives.next_primitive() { let render::Primitive { kind, scizzor, rect, .. } = primitive; @@ -569,6 +569,8 @@ impl Renderer { match kind { render::PrimitiveKind::Rectangle { color } => { + println!("c {:?}",c); + c = c+1; switch_to_plain_state!(); let color = gamma_srgb_to_linear(color.to_fsa()); @@ -596,7 +598,8 @@ impl Renderer { push_v(r, b); push_v(r, t); }, - + _ =>{}, + /* render::PrimitiveKind::TrianglesSingleColor { color, triangles } => { if triangles.is_empty() { continue; @@ -808,6 +811,7 @@ impl Renderer { // We have no special case widgets to handle. render::PrimitiveKind::Other(_) => (), + */ } } @@ -857,6 +861,7 @@ impl Renderer { // // Only submit the vertices if there is enough for at least one triangle. Draw::Plain(slice) => if slice.len() >= NUM_VERTICES_IN_TRIANGLE { + println!("slice {:?}",slice); let vertex_buffer = glium::VertexBuffer::new(facade, slice)?; surface.draw(&vertex_buffer, no_indices, &self.program, &uniforms, &draw_params).unwrap(); }, diff --git a/t.txt b/t.txt new file mode 100644 index 000000000..54955e0a7 --- /dev/null +++ b/t.txt @@ -0,0 +1,4 @@ +[Vertex { mode: 2, position: [-1.0, 1.0], tex_coords: [0.0, 0.0], color: [0.0, 0.0, 0.0, 0.0] }, Vertex { mode: 2, position: [1.0, -1.0], tex_coords: [0.0, 0.0], color: [0.0, 0.0, 0.0, 0.0] }, Vertex { mode: 2, position: [-1.0, -1.0], tex_coords: [0.0, 0.0], color: [0.0, 0.0, 0.0, 0.0] }, Vertex { mode: 2, position: [-1.0, 1.0], tex_coords: [0.0, 0.0], color: [0.0, 0.0, 0.0, 0.0] }, Vertex { mode: 2, position: [1.0, -1.0], tex_coords: [0.0, 0.0], color: [0.0, 0.0, 0.0, 0.0] }, Vertex { mode: 2, position: [1.0, 1.0], tex_coords: [0.0, 0.0], color: [0.0, 0.0, 0.0, 0.0] }, Vertex { mode: 2, position: [-0.11423909, 0.19985725], tex_coords: [0.0, 0.0], color: [1.0, 1.0, 1.0, 1.0] }, Vertex { mode: 2, position: [0.11423909, -0.19985725], tex_coords: [0.0, 0.0], color: [1.0, 1.0, 1.0, 1.0] }, Vertex { mode: 2, position: [-0.11423909, -0.19985725], tex_coords: [0.0, 0.0], color: [1.0, 1.0, 1.0, 1.0] }, Vertex { mode: 2, position: [-0.11423909, 0.19985725], tex_coords: [0.0, 0.0], color: [1.0, 1.0, 1.0, 1.0] }, Vertex { mode: 2, position: [0.11423909, -0.19985725], tex_coords: [0.0, 0.0], color: [1.0, 1.0, 1.0, 1.0] }, Vertex { mode: 2, position: [0.11423909, 0.19985725], tex_coords: [0.0, 0.0], color: [1.0, 1.0, 1.0, 1.0] }] + +//crayon +[Vertex { pos: [-1.0, 1.0], uv: [0.0, 0.0], color: [0.0, 0.0, 0.0, 0.0], mode: [2, 0] }, Vertex { pos: [1.0, -1.0], uv: [0.0, 0.0], color: [0.0, 0.0, 0.0, 0.0], mode: [2, 0] }, Vertex { pos: [-1.0, -1.0], uv: [0.0, 0.0], color: [0.0, 0.0, 0.0, 0.0], mode: [2, 0] }, Vertex { pos: [-1.0, 1.0], uv: [0.0, 0.0], color: [0.0, 0.0, 0.0, 0.0], mode: [2, 0] }, Vertex { pos: [1.0, -1.0], uv: [0.0, 0.0], color: [0.0, 0.0, 0.0, 0.0], mode: [2, 0] }, Vertex { pos: [1.0, 1.0], uv: [0.0, 0.0], color: [0.0, 0.0, 0.0, 0.0], mode: [2, 0] }, Vertex { pos: [-0.13333334, 0.1904762], uv: [0.0, 0.0], color: [0.2462014, 0.25415218, 0.23455065, 1.0], mode: [2, 0] }, Vertex { pos: [0.13333334, -0.1904762], uv: [0.0, 0.0], color: [0.2462014, 0.25415218, 0.23455065, 1.0], mode: [2, 0] }, Vertex { pos: [-0.13333334, -0.1904762], uv: [0.0, 0.0], color: [0.2462014, 0.25415218, 0.23455065, 1.0], mode: [2, 0] }, Vertex { pos: [-0.13333334, 0.1904762], uv: [0.0, 0.0], color: [0.2462014, 0.25415218, 0.23455065, 1.0], mode: [2, 0] }, Vertex { pos: [0.13333334, -0.1904762], uv: [0.0, 0.0], color: [0.2462014, 0.25415218, 0.23455065, 1.0], mode: [2, 0] }, Vertex { pos: [0.13333334, 0.1904762], uv: [0.0, 0.0], color: [0.2462014, 0.25415218, 0.23455065, 1.0], mode: [2, 0] }] \ No newline at end of file From aa035493328a64e1f04e25b4efe3bdbca9fb7b7a Mon Sep 17 00:00:00 2001 From: alanpoon Date: Sun, 3 Mar 2019 23:02:01 +0800 Subject: [PATCH 07/64] added tools for crayon --- .gitignore | 2 + assets/images/cornell_box.obj | 118 + assets/images/cornell_box.obj.meta.toml | 31 + assets/images/crate.bmp | Bin 0 -> 66614 bytes backends/conrod_crayon/Cargo.toml | 4 + backends/conrod_crayon/examples/crayon.rs | 20 +- backends/conrod_crayon/src/lib.rs | 258 +- .../conrod_crayon/src/shaders/conrod.1.fs | 1 - .../conrod_crayon/src/shaders/conrod.1.vs | 2 +- backends/conrod_crayon/src/shaders/conrod.fs | 8 +- backends/conrod_crayon/src/shaders/conrod.vs | 4 +- .../conrod_crayon/tools/profiler/README.md | 8 + backends/conrod_crayon/tools/profiler/run.sh | 17 + .../tools/profiler/scripts/cddl1.txt | 384 ++ .../tools/profiler/scripts/flamegraph.pl | 1125 ++++ .../tools/profiler/scripts/stackcollapse.pl | 109 + .../tools/wasm-template/README.md | 8 + .../tools/wasm-template/index.html | 10 + .../tools/wasm-template/index.js | 1 + .../tools/wasm-template/package-lock.json | 5931 +++++++++++++++++ .../tools/wasm-template/package.json | 13 + .../conrod_crayon/tools/wasm-template/run.sh | 10 + .../tools/wasm-template/webpack.config.js | 28 + backends/conrod_example_shared/src/lib.rs | 2 +- backends/conrod_glium/examples/image.rs | 4 +- backends/conrod_glium/src/lib.rs | 12 +- t.txt | 5 +- 27 files changed, 8007 insertions(+), 108 deletions(-) create mode 100644 assets/images/cornell_box.obj create mode 100644 assets/images/cornell_box.obj.meta.toml create mode 100755 assets/images/crate.bmp create mode 100644 backends/conrod_crayon/tools/profiler/README.md create mode 100755 backends/conrod_crayon/tools/profiler/run.sh create mode 100644 backends/conrod_crayon/tools/profiler/scripts/cddl1.txt create mode 100755 backends/conrod_crayon/tools/profiler/scripts/flamegraph.pl create mode 100755 backends/conrod_crayon/tools/profiler/scripts/stackcollapse.pl create mode 100644 backends/conrod_crayon/tools/wasm-template/README.md create mode 100644 backends/conrod_crayon/tools/wasm-template/index.html create mode 100644 backends/conrod_crayon/tools/wasm-template/index.js create mode 100644 backends/conrod_crayon/tools/wasm-template/package-lock.json create mode 100644 backends/conrod_crayon/tools/wasm-template/package.json create mode 100755 backends/conrod_crayon/tools/wasm-template/run.sh create mode 100644 backends/conrod_crayon/tools/wasm-template/webpack.config.js diff --git a/.gitignore b/.gitignore index 2ea71dfab..8cb14af60 100644 --- a/.gitignore +++ b/.gitignore @@ -22,3 +22,5 @@ rusti.sh /examples/**/target assets/crayon/resources Cargo.lock +*/**/dist +*/**/node_modules \ No newline at end of file diff --git a/assets/images/cornell_box.obj b/assets/images/cornell_box.obj new file mode 100644 index 000000000..fb00a8ddd --- /dev/null +++ b/assets/images/cornell_box.obj @@ -0,0 +1,118 @@ +# The original Cornell Box in OBJ format. +# Note that the real box is not a perfect cube, so +# the faces are imperfect in this data set. +# +# Created by Guedis Cardenas and Morgan McGuire at Williams College, 2011 +# Released into the Public Domain. +# +# http://graphics.cs.williams.edu/data +# http://www.graphics.cornell.edu/online/box/data.html +# + +## Object floor +v -1.01 0.00 0.99 +v 1.00 0.00 0.99 +v 1.00 0.00 -1.04 +v -0.99 0.00 -1.04 + +g floor +usemtl floor +f -4 -3 -2 -1 + +## Object backwall +v -0.99 0.00 -1.04 +v 1.00 0.00 -1.04 +v 1.00 1.99 -1.04 +v -1.02 1.99 -1.04 + +## Object shortBox +g shortBox +usemtl shortBox + +# Top Face +v 0.53 0.60 0.75 +v 0.70 0.60 0.17 +v 0.13 0.60 0.00 +v -0.05 0.60 0.57 +f -4 -3 -2 -1 + +# Left Face +v -0.05 0.00 0.57 +v -0.05 0.60 0.57 +v 0.13 0.60 0.00 +v 0.13 0.00 0.00 +f -4 -3 -2 -1 + +# Front Face +v 0.53 0.00 0.75 +v 0.53 0.60 0.75 +v -0.05 0.60 0.57 +v -0.05 0.00 0.57 +f -4 -3 -2 -1 + +# Right Face +v 0.70 0.00 0.17 +v 0.70 0.60 0.17 +v 0.53 0.60 0.75 +v 0.53 0.00 0.75 +f -4 -3 -2 -1 + +# Back Face +v 0.13 0.00 0.00 +v 0.13 0.60 0.00 +v 0.70 0.60 0.17 +v 0.70 0.00 0.17 +f -4 -3 -2 -1 + +# Bottom Face +v 0.53 0.00 0.75 +v 0.70 0.00 0.17 +v 0.13 0.00 0.00 +v -0.05 0.00 0.57 +f -12 -11 -10 -9 + +## Object tallBox +g tallBox +usemtl tallBox + +# Top Face +v -0.53 1.20 0.09 +v 0.04 1.20 -0.09 +v -0.14 1.20 -0.67 +v -0.71 1.20 -0.49 +f -4 -3 -2 -1 + +# Left Face +v -0.53 0.00 0.09 +v -0.53 1.20 0.09 +v -0.71 1.20 -0.49 +v -0.71 0.00 -0.49 +f -4 -3 -2 -1 + +# Back Face +v -0.71 0.00 -0.49 +v -0.71 1.20 -0.49 +v -0.14 1.20 -0.67 +v -0.14 0.00 -0.67 +f -4 -3 -2 -1 + +# Right Face +v -0.14 0.00 -0.67 +v -0.14 1.20 -0.67 +v 0.04 1.20 -0.09 +v 0.04 0.00 -0.09 +f -4 -3 -2 -1 + +# Front Face +v 0.04 0.00 -0.09 +v 0.04 1.20 -0.09 +v -0.53 1.20 0.09 +v -0.53 0.00 0.09 +f -4 -3 -2 -1 + +# Bottom Face +v -0.53 0.00 0.09 +v 0.04 0.00 -0.09 +v -0.14 0.00 -0.67 +v -0.71 0.00 -0.49 +f -8 -7 -6 -5 \ No newline at end of file diff --git a/assets/images/cornell_box.obj.meta.toml b/assets/images/cornell_box.obj.meta.toml new file mode 100644 index 000000000..69ad076d8 --- /dev/null +++ b/assets/images/cornell_box.obj.meta.toml @@ -0,0 +1,31 @@ +name = 'cornell_box.obj' +uuid = '13b56f8c-7724-4313-a5ff-d870db23b243' + +[[resources]] +type = 'Prefab' +name = 'cornell_box.obj' +uuid = '64cd2e4e-1949-4718-ad79-bec5f4cd5600' + +[[resources]] +type = 'Mesh' +name = 'floor' +uuid = '6f0c4447-040f-47c2-8f48-bb8284df5678' + +[[resources]] +type = 'Mesh' +name = 'shortBox' +uuid = 'd0cb0ac2-ac69-49c9-98cb-f5841751b3fd' + +[[resources]] +type = 'Mesh' +name = 'tallBox' +uuid = 'e32f80df-6b59-46d9-b49e-4651aaf8a64e' + +[params] +type = 'Transmission' + +[params.mesh] +optimize = true +calculate_normals = true +calculate_tangents = false +calculate_texcoord = false diff --git a/assets/images/crate.bmp b/assets/images/crate.bmp new file mode 100755 index 0000000000000000000000000000000000000000..73fe985a835b40e4bbf09019a9af75399c5d6a2e GIT binary patch literal 66614 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 m_;_%`?U1 = conrod_core::image::Map::new(); let rust_logo = image_map.insert(load_rust_logo()); - + dbg!("l"); // Demonstration app state that we'll control with our conrod GUI. let app = conrod_example_shared::DemoApp::new(rust_logo); let dpi_factor = device_pixel_ratio(); @@ -69,8 +69,18 @@ impl LifecycleListener for Window { //conrod_crayon::events::convert_event(&mut self.ui); self.ui.handle_event(Input::Press(conrod_core::input::Button::Mouse(conrod_core::input::state::mouse::Button::Left))); { - let ui = &mut self.ui.set_widgets(); - widget::Rectangle::fill([80.0, 80.0]).middle().set(self.ids.rectangle_fill, ui); + let mut ui = &mut self.ui.set_widgets(); + + const LOGO_SIDE: conrod_core::Scalar = 306.0; + widget::Image::new(self.app.rust_logo) + .w_h(LOGO_SIDE, LOGO_SIDE) + .middle() + .set(self.ids.rust_logo, ui); + /* + widget::Rectangle::fill_with([80.0, 80.0],color::ORANGE) + .middle() + .set(self.ids.rust_logo, ui); + */ } let dpi_factor = device_pixel_ratio() as f64; @@ -78,7 +88,7 @@ impl LifecycleListener for Window { let primitives = self.ui.draw(); let dims = (WIN_W as f64 * dpi_factor, WIN_H as f64 * dpi_factor); self.renderer.fill(dims,dpi_factor as f64,primitives,&self.image_map); - self.renderer.draw(&mut self.batch); + self.renderer.draw(&mut self.batch,&self.image_map); Ok(()) } diff --git a/backends/conrod_crayon/src/lib.rs b/backends/conrod_crayon/src/lib.rs index f89a110af..86885e63c 100644 --- a/backends/conrod_crayon/src/lib.rs +++ b/backends/conrod_crayon/src/lib.rs @@ -12,28 +12,28 @@ use conrod_core::{ render, text::{rt, GlyphCache}, }; -/* + impl_vertex! { Vertex { pos => [Position; Float; 2; false], uv =>[Texcoord0; Float; 2; false], - //color =>[Color0; Float; 4; true], - color =>[Color0; Float; 4; false], - mode => [Tangent; Float; 2;false], + color =>[Color0; Float; 4; true], } } -*/ + +/* impl_vertex! { Vertex { position => [Position; Float; 2; false], } } +*/ /// Draw text from the text cache texture `tex` in the fragment shader. -pub const MODE_TEXT: f32 = 0.0; +pub const MODE_TEXT: i32 = 0; /// Draw an image from the texture at `tex` in the fragment shader. -pub const MODE_IMAGE: f32 = 1.0; +pub const MODE_IMAGE: i32 = 1; /// Ignore `tex` and draw simple, colored 2D geometry. -pub const MODE_GEOMETRY: f32 = 2.0; +pub const MODE_GEOMETRY: i32 = 2; /// A `Command` describing a step in the drawing process. #[derive(Clone, Debug)] pub enum Command<'a> { @@ -50,7 +50,6 @@ enum PreparedCommand { pub struct Renderer { vertices: Vec, shader: ShaderHandle, - shader2: ShaderHandle, surface: SurfaceHandle, //rendered_texture:RenderTextureHandle, commands: Vec, @@ -81,26 +80,21 @@ impl Renderer{ */ let attributes = AttributeLayoutBuilder::new() .with(Attribute::Position, 2) + .with(Attribute::Texcoord0, 2) + .with(Attribute::Color0, 4) .finish(); let uniforms = UniformVariableLayout::build() - .with("tex", UniformVariableType::RenderTexture) + .with("tex", UniformVariableType::Texture) + .with("mode", UniformVariableType::I32) .finish(); let mut params = ShaderParams::default(); params.attributes = attributes; - //params.uniforms = uniforms; + params.uniforms = uniforms; //looking for Position - let vs = include_str!("shaders/conrod.1.vs").to_owned(); - let fs = include_str!("shaders/conrod.1.fs").to_owned(); + let vs = include_str!("shaders/conrod.vs").to_owned(); + let fs = include_str!("shaders/conrod.fs").to_owned(); let shader = video::create_shader(params.clone(), vs, fs).unwrap(); - let mut params = ShaderParams::default(); - let attributes2 = AttributeLayoutBuilder::new() - .with(Attribute::Position, 2) - .finish(); - params.attributes = attributes2; - let vs2 = include_str!("shaders/triangle.vs").to_owned(); - let fs2 = include_str!("shaders/triangle.fs").to_owned(); - let shader2 = video::create_shader(params, vs2, fs2).unwrap(); let mut params = SurfaceParams::default(); //params.set_attachments(&[rendered_texture], None).unwrap(); params.set_clear(Color::gray(), None, None); @@ -111,7 +105,6 @@ impl Renderer{ Renderer{ vertices: vert, shader:shader, - shader2:shader2, surface:surface, //rendered_texture:rendered_texture, commands: commands @@ -168,7 +161,7 @@ impl Renderer{ let mut c = 0; while let Some(primitive) = primitives.next_primitive() { let render::Primitive { kind, scizzor, rect, .. } = primitive; - /* + let new_scissor = rect_to_crayon_rect(scizzor); if new_scissor != current_scissor { // Finish the current command. @@ -186,37 +179,145 @@ impl Renderer{ // Set the state back to plain drawing. current_state = State::Plain { start: vertices.len() }; } - */ + match kind { + render::PrimitiveKind::Rectangle { color } => { switch_to_plain_state!(); let color = gamma_srgb_to_linear(color.to_fsa()); let (l, r, b, t) = rect.l_r_b_t(); let v = |x, y| { - // Convert from conrod Scalar range to GL range -1.0 to 1.0. - /*Vertex { - pos: [vx(x), vy(y)], - uv: [0.0, 0.0], - color: color, - mode: [MODE_GEOMETRY,0.0], - }*/ - Vertex::new([vx(x),vy(y)]) + Vertex::new([vx(x),vy(y)],[0.0,0.0],color) }; - if c ==0{ - let mut push_v = |x, y| vertices.push(v(x, y)); + + let mut push_v = |x, y| vertices.push(v(x, y)); - // Bottom left triangle. - push_v(l, t); - push_v(r, b); - push_v(l, b); + // Bottom left triangle. + push_v(l, t); + push_v(r, b); + push_v(l, b); - // Top right triangle. - push_v(l, t); - push_v(r, b); - push_v(r, t); + // Top right triangle. + push_v(l, t); + push_v(r, b); + push_v(r, t); + + }, + + render::PrimitiveKind::TrianglesSingleColor { color, triangles } => { + if triangles.is_empty() { + continue; + } + + switch_to_plain_state!(); + + let color = gamma_srgb_to_linear(color.into()); + + let v = |p: [Scalar; 2]| { + Vertex::new([vx(p[0]), vy(p[1])],[0.0,0.0],color) + }; + + for triangle in triangles { + vertices.push(v(triangle[0])); + vertices.push(v(triangle[1])); + vertices.push(v(triangle[2])); + } + }, + + render::PrimitiveKind::TrianglesMultiColor { triangles } => { + if triangles.is_empty() { + continue; + } + + switch_to_plain_state!(); + + let v = |(p, c): ([Scalar; 2], color::Rgba)| { + Vertex::new([vx(p[0]), vy(p[1])],[0.0,0.0],gamma_srgb_to_linear(c.into())) + }; + + for triangle in triangles { + vertices.push(v(triangle[0])); + vertices.push(v(triangle[1])); + vertices.push(v(triangle[2])); + } + }, + + render::PrimitiveKind::Image { image_id, color, source_rect } => { + // Switch to the `Image` state for this image if we're not in it already. + let new_image_id = image_id; + match current_state { + + // If we're already in the drawing mode for this image, we're done. + State::Image { image_id, .. } if image_id == new_image_id => (), + + // If we were in the `Plain` drawing state, switch to Image drawing state. + State::Plain { start } => { + commands.push(PreparedCommand::Plain(start..vertices.len())); + current_state = State::Image { + image_id: new_image_id, + start: vertices.len(), + }; + }, + + // If we were drawing a different image, switch state to draw *this* image. + State::Image { image_id, start } => { + commands.push(PreparedCommand::Image(image_id, start..vertices.len())); + current_state = State::Image { + image_id: new_image_id, + start: vertices.len(), + }; + }, } + let color = color.unwrap_or(color::WHITE).to_fsa(); + + if let Some(&image) = image_map.get(&image_id) { + let mut image_w:f64 = 100.0; + let mut image_h:f64 = 100.0; + if let Some(image_param) = video::texture(image){ + image_w = image_param.dimensions.x as f64; + image_h = image_param.dimensions.y as f64; + } + + // Get the sides of the source rectangle as uv coordinates. + // + // Texture coordinates range: + // - left to right: 0.0 to 1.0 + // - bottom to top: 0.0 to 1.0 + let (uv_l, uv_r, uv_b, uv_t) = match source_rect { + Some(src_rect) => { + let (l, r, b, t) = src_rect.l_r_b_t(); + ((l / image_w) as f32, + (r / image_w) as f32, + (b / image_h) as f32, + (t / image_h) as f32) + }, + + None => (0.0, 1.0 , 0.0, 1.0), + }; + + let v = |x, y, t| { + // Convert from conrod Scalar range to GL range -1.0 to 1.0. + let x = (x * dpi_factor as Scalar / half_win_w) as f32; + let y = (y * dpi_factor as Scalar / half_win_h) as f32; + Vertex::new([x, y],t,color) + }; + + let mut push_v = |x, y, t| vertices.push(v(x, y, t)); + + let (l, r, b, t) = rect.l_r_b_t(); + + // Bottom left triangle. + push_v(l, t, [uv_l, uv_t]); + push_v(r, b, [uv_r, uv_b]); + push_v(l, b, [uv_l, uv_b]); + + // Top right triangle. + push_v(l, t, [uv_l, uv_t]); + push_v(r, b, [uv_r, uv_b]); + push_v(r, t, [uv_r, uv_t]); + } }, render::PrimitiveKind::Other(_) => (), _=>{} @@ -232,9 +333,8 @@ impl Renderer{ } } - pub fn draw(&self,batch: &mut CommandBuffer){ + pub fn draw(&self,batch: &mut CommandBuffer,image_map:&conrod_core::image::Map){ const NUM_VERTICES_IN_TRIANGLE: usize = 3; - let mut c=0; for command in self.commands() { match command { Command::Scizzor(scizzor) => { @@ -244,61 +344,59 @@ impl Renderer{ // Draw to the target with the given `draw` command. Command::Draw(draw) => match draw { Draw_e::Plain(slice) => if slice.len() >= NUM_VERTICES_IN_TRIANGLE { - //let mut idxes = vec![]; let mut idxes:Vec = vec![]; for i in 0..slice.len(){ idxes.push(i as u16); } - // let idxes = [0,1,2]; - println!("slice {:?}",slice.len()); + let mut params = MeshParams::default(); params.num_verts = slice.len(); params.num_idxes = slice.len(); params.primitive = MeshPrimitive::Triangles; params.layout = Vertex::layout(); let data = MeshData { - //vptr: Vertex::encode(&slice[..]).into(), vptr: Vertex::encode(&slice[..]).into(), iptr: IndexFormat::encode(&idxes).into(), }; let mesh = video::create_mesh(params.clone(), Some(data)).unwrap(); - let dc = Draw::new(self.shader, mesh); + let mut dc = Draw::new(self.shader, mesh); + dc.set_uniform_variable("mode",MODE_GEOMETRY); batch.draw(dc); batch.submit(self.surface).unwrap(); }, - Draw_e::Test =>{ - let mut params = MeshParams::default(); - let slice : [Vertex; 6] = [ - Vertex::new([0.5, 0.0]), - Vertex::new([0.5, 0.5]), - Vertex::new([0.0, 0.0]), - Vertex::new([0.0, 0.0]), - Vertex::new([0.0, 0.5]), - Vertex::new([0.5, 0.5]) - ]; - let mut idxes:Vec = vec![]; - for i in 0..slice.len(){ - idxes.push(i as u16); + // Draw an image whose texture data lies within the `image_map` at the + // given `id`. + // + // Only submit the vertices if there is enough for at least one triangle. + Draw_e::Image(image_id, slice) => if slice.len() >= NUM_VERTICES_IN_TRIANGLE { + if let Some(&image) = image_map.get(&image_id) { + + let mut idxes:Vec = vec![]; + for i in 0..slice.len(){ + idxes.push(i as u16); + } + + let mut params = MeshParams::default(); + params.num_verts = slice.len(); + params.num_idxes = slice.len(); + params.primitive = MeshPrimitive::Triangles; + params.layout = Vertex::layout(); + let data = MeshData { + vptr: Vertex::encode(&slice[..]).into(), + iptr: IndexFormat::encode(&idxes).into(), + }; + + let mesh = video::create_mesh(params, Some(data)).unwrap(); + let mut dc = Draw::new(self.shader, mesh); + dc.set_uniform_variable("tex", image); + dc.set_uniform_variable("mode",MODE_IMAGE); + batch.draw(dc); + batch.submit(self.surface).unwrap() } - params.num_verts = slice.len(); - params.num_idxes = slice.len(); - params.primitive = MeshPrimitive::Triangles; - params.layout = Vertex::layout(); - let data = MeshData { - //vptr: Vertex::encode(&slice[..]).into(), - vptr: Vertex::encode(&slice[..]).into(), - iptr: IndexFormat::encode(&idxes).into(), - }; - - let mesh = video::create_mesh(params.clone(), Some(data)).unwrap(); - let dc = Draw::new(self.shader2, mesh); - batch.draw(dc); - batch.submit(self.surface).unwrap(); - println!("submitted"); - - } + }, + _=>{ } @@ -330,7 +428,7 @@ impl<'a> Iterator for Commands<'a> { PreparedCommand::Scizzor(scizzor) => Command::Scizzor(scizzor), PreparedCommand::Plain(ref range) => Command::Draw(Draw_e::Plain(&vertices[range.clone()])), - // Command::Draw(Draw_e::Test), + // Command::Draw(Draw_e::Test), PreparedCommand::Image(id, ref range) => Command::Draw(Draw_e::Image(id, &vertices[range.clone()])), }) diff --git a/backends/conrod_crayon/src/shaders/conrod.1.fs b/backends/conrod_crayon/src/shaders/conrod.1.fs index 2d9dce70e..cc7f7368f 100644 --- a/backends/conrod_crayon/src/shaders/conrod.1.fs +++ b/backends/conrod_crayon/src/shaders/conrod.1.fs @@ -7,7 +7,6 @@ uniform sampler2D tex; void main() { // Text - gl_FragColor = v_color; if (v_mode == 0.0) { gl_FragColor = v_color * vec4(1.0, 1.0, 1.0, texture2D(tex, v_tex_coords).r); diff --git a/backends/conrod_crayon/src/shaders/conrod.1.vs b/backends/conrod_crayon/src/shaders/conrod.1.vs index 31f12e716..80ca365a7 100644 --- a/backends/conrod_crayon/src/shaders/conrod.1.vs +++ b/backends/conrod_crayon/src/shaders/conrod.1.vs @@ -12,7 +12,7 @@ varying float v_mode; void main() { gl_Position = vec4(Position, 0.0, 1.0); - v_tex_coords = Texcoord0; + v_tex_coords = (Position + vec2(1.0, 1.0)) / 2.0; v_color = Color0; v_mode = Tangent.x; } \ No newline at end of file diff --git a/backends/conrod_crayon/src/shaders/conrod.fs b/backends/conrod_crayon/src/shaders/conrod.fs index c4748ad7f..72537a07c 100644 --- a/backends/conrod_crayon/src/shaders/conrod.fs +++ b/backends/conrod_crayon/src/shaders/conrod.fs @@ -1,24 +1,24 @@ #version 300 es precision mediump float; uniform sampler2D tex; +uniform int mode; in vec2 v_tex_coords; in vec4 v_color; -flat in uint v_mode; out vec4 f_color; void main() { // Text - if (v_mode == uint(0)) { + if (mode == 0) { f_color = v_color * vec4(1.0, 1.0, 1.0, texture(tex, v_tex_coords).r); // Image - } else if (v_mode == uint(1)) { + } else if (mode == 1) { f_color = texture(tex, v_tex_coords); // 2D Geometry - } else if (v_mode == uint(2)) { + } else if (mode == 2) { f_color = v_color; } } \ No newline at end of file diff --git a/backends/conrod_crayon/src/shaders/conrod.vs b/backends/conrod_crayon/src/shaders/conrod.vs index 5bde4f17d..f0da3de86 100644 --- a/backends/conrod_crayon/src/shaders/conrod.vs +++ b/backends/conrod_crayon/src/shaders/conrod.vs @@ -4,15 +4,13 @@ precision mediump float; in vec2 Position; in vec2 Texcoord0; in vec4 Color0; -in vec2 Tangent; + out vec2 v_tex_coords; out vec4 v_color; -flat out uint v_mode; void main() { gl_Position = vec4(Position, 0.0, 1.0); v_tex_coords = Texcoord0; v_color = Color0; - v_mode = uint(Tangent.x); } \ No newline at end of file diff --git a/backends/conrod_crayon/tools/profiler/README.md b/backends/conrod_crayon/tools/profiler/README.md new file mode 100644 index 000000000..eb30f5812 --- /dev/null +++ b/backends/conrod_crayon/tools/profiler/README.md @@ -0,0 +1,8 @@ +# Profiler + +This script is a simple wrapper of [dtrace](http://dtrace.org/) and [flamegraph](https://github.com/brendangregg/FlameGraph). + +```sh +$ # Notes that dtrace requires additional privileges. +$ sudo ./tools/profiler/run.sh target/release/saturn out.svg +``` \ No newline at end of file diff --git a/backends/conrod_crayon/tools/profiler/run.sh b/backends/conrod_crayon/tools/profiler/run.sh new file mode 100755 index 000000000..a1e6e3752 --- /dev/null +++ b/backends/conrod_crayon/tools/profiler/run.sh @@ -0,0 +1,17 @@ +USAGE="Usage: sudo ./tools/profiler/run.sh [EXECUTABLE_FILE] [OUT_FILE]" + +if [ "$#" -ne 2 ]; then + echo $USAGE + exit 1 +fi + +EXECUTABLE_FILE=$1 +OUT_FILE=$2 +SCRIPT_FILE="$( cd "$(dirname "$0")" ; pwd -P )" +NAME=$(basename $EXECUTABLE_FILE) + +set -e +rm -f out.stacks +dtrace -c $EXECUTABLE_FILE -o out.stacks -n "profile-30 /execname == \"${NAME}\"/ { @[ustack(1000)] = count(); }" +$SCRIPT_FILE/scripts/stackcollapse.pl out.stacks | $SCRIPT_FILE/scripts/flamegraph.pl > $OUT_FILE +rm -f out.stacks \ No newline at end of file diff --git a/backends/conrod_crayon/tools/profiler/scripts/cddl1.txt b/backends/conrod_crayon/tools/profiler/scripts/cddl1.txt new file mode 100644 index 000000000..da23621dc --- /dev/null +++ b/backends/conrod_crayon/tools/profiler/scripts/cddl1.txt @@ -0,0 +1,384 @@ +Unless otherwise noted, all files in this distribution are released +under the Common Development and Distribution License (CDDL). +Exceptions are noted within the associated source files. + +-------------------------------------------------------------------- + + +COMMON DEVELOPMENT AND DISTRIBUTION LICENSE Version 1.0 + +1. Definitions. + + 1.1. "Contributor" means each individual or entity that creates + or contributes to the creation of Modifications. + + 1.2. "Contributor Version" means the combination of the Original + Software, prior Modifications used by a Contributor (if any), + and the Modifications made by that particular Contributor. + + 1.3. "Covered Software" means (a) the Original Software, or (b) + Modifications, or (c) the combination of files containing + Original Software with files containing Modifications, in + each case including portions thereof. + + 1.4. "Executable" means the Covered Software in any form other + than Source Code. + + 1.5. "Initial Developer" means the individual or entity that first + makes Original Software available under this License. + + 1.6. "Larger Work" means a work which combines Covered Software or + portions thereof with code not governed by the terms of this + License. + + 1.7. "License" means this document. + + 1.8. "Licensable" means having the right to grant, to the maximum + extent possible, whether at the time of the initial grant or + subsequently acquired, any and all of the rights conveyed + herein. + + 1.9. "Modifications" means the Source Code and Executable form of + any of the following: + + A. Any file that results from an addition to, deletion from or + modification of the contents of a file containing Original + Software or previous Modifications; + + B. Any new file that contains any part of the Original + Software or previous Modifications; or + + C. Any new file that is contributed or otherwise made + available under the terms of this License. + + 1.10. "Original Software" means the Source Code and Executable + form of computer software code that is originally released + under this License. + + 1.11. "Patent Claims" means any patent claim(s), now owned or + hereafter acquired, including without limitation, method, + process, and apparatus claims, in any patent Licensable by + grantor. + + 1.12. "Source Code" means (a) the common form of computer software + code in which modifications are made and (b) associated + documentation included in or with such code. + + 1.13. "You" (or "Your") means an individual or a legal entity + exercising rights under, and complying with all of the terms + of, this License. For legal entities, "You" includes any + entity which controls, is controlled by, or is under common + control with You. For purposes of this definition, + "control" means (a) the power, direct or indirect, to cause + the direction or management of such entity, whether by + contract or otherwise, or (b) ownership of more than fifty + percent (50%) of the outstanding shares or beneficial + ownership of such entity. + +2. License Grants. + + 2.1. The Initial Developer Grant. + + Conditioned upon Your compliance with Section 3.1 below and + subject to third party intellectual property claims, the Initial + Developer hereby grants You a world-wide, royalty-free, + non-exclusive license: + + (a) under intellectual property rights (other than patent or + trademark) Licensable by Initial Developer, to use, + reproduce, modify, display, perform, sublicense and + distribute the Original Software (or portions thereof), + with or without Modifications, and/or as part of a Larger + Work; and + + (b) under Patent Claims infringed by the making, using or + selling of Original Software, to make, have made, use, + practice, sell, and offer for sale, and/or otherwise + dispose of the Original Software (or portions thereof). + + (c) The licenses granted in Sections 2.1(a) and (b) are + effective on the date Initial Developer first distributes + or otherwise makes the Original Software available to a + third party under the terms of this License. + + (d) Notwithstanding Section 2.1(b) above, no patent license is + granted: (1) for code that You delete from the Original + Software, or (2) for infringements caused by: (i) the + modification of the Original Software, or (ii) the + combination of the Original Software with other software + or devices. + + 2.2. Contributor Grant. + + Conditioned upon Your compliance with Section 3.1 below and + subject to third party intellectual property claims, each + Contributor hereby grants You a world-wide, royalty-free, + non-exclusive license: + + (a) under intellectual property rights (other than patent or + trademark) Licensable by Contributor to use, reproduce, + modify, display, perform, sublicense and distribute the + Modifications created by such Contributor (or portions + thereof), either on an unmodified basis, with other + Modifications, as Covered Software and/or as part of a + Larger Work; and + + (b) under Patent Claims infringed by the making, using, or + selling of Modifications made by that Contributor either + alone and/or in combination with its Contributor Version + (or portions of such combination), to make, use, sell, + offer for sale, have made, and/or otherwise dispose of: + (1) Modifications made by that Contributor (or portions + thereof); and (2) the combination of Modifications made by + that Contributor with its Contributor Version (or portions + of such combination). + + (c) The licenses granted in Sections 2.2(a) and 2.2(b) are + effective on the date Contributor first distributes or + otherwise makes the Modifications available to a third + party. + + (d) Notwithstanding Section 2.2(b) above, no patent license is + granted: (1) for any code that Contributor has deleted + from the Contributor Version; (2) for infringements caused + by: (i) third party modifications of Contributor Version, + or (ii) the combination of Modifications made by that + Contributor with other software (except as part of the + Contributor Version) or other devices; or (3) under Patent + Claims infringed by Covered Software in the absence of + Modifications made by that Contributor. + +3. Distribution Obligations. + + 3.1. Availability of Source Code. + + Any Covered Software that You distribute or otherwise make + available in Executable form must also be made available in Source + Code form and that Source Code form must be distributed only under + the terms of this License. You must include a copy of this + License with every copy of the Source Code form of the Covered + Software You distribute or otherwise make available. You must + inform recipients of any such Covered Software in Executable form + as to how they can obtain such Covered Software in Source Code + form in a reasonable manner on or through a medium customarily + used for software exchange. + + 3.2. Modifications. + + The Modifications that You create or to which You contribute are + governed by the terms of this License. You represent that You + believe Your Modifications are Your original creation(s) and/or + You have sufficient rights to grant the rights conveyed by this + License. + + 3.3. Required Notices. + + You must include a notice in each of Your Modifications that + identifies You as the Contributor of the Modification. You may + not remove or alter any copyright, patent or trademark notices + contained within the Covered Software, or any notices of licensing + or any descriptive text giving attribution to any Contributor or + the Initial Developer. + + 3.4. Application of Additional Terms. + + You may not offer or impose any terms on any Covered Software in + Source Code form that alters or restricts the applicable version + of this License or the recipients' rights hereunder. You may + choose to offer, and to charge a fee for, warranty, support, + indemnity or liability obligations to one or more recipients of + Covered Software. However, you may do so only on Your own behalf, + and not on behalf of the Initial Developer or any Contributor. + You must make it absolutely clear that any such warranty, support, + indemnity or liability obligation is offered by You alone, and You + hereby agree to indemnify the Initial Developer and every + Contributor for any liability incurred by the Initial Developer or + such Contributor as a result of warranty, support, indemnity or + liability terms You offer. + + 3.5. Distribution of Executable Versions. + + You may distribute the Executable form of the Covered Software + under the terms of this License or under the terms of a license of + Your choice, which may contain terms different from this License, + provided that You are in compliance with the terms of this License + and that the license for the Executable form does not attempt to + limit or alter the recipient's rights in the Source Code form from + the rights set forth in this License. If You distribute the + Covered Software in Executable form under a different license, You + must make it absolutely clear that any terms which differ from + this License are offered by You alone, not by the Initial + Developer or Contributor. You hereby agree to indemnify the + Initial Developer and every Contributor for any liability incurred + by the Initial Developer or such Contributor as a result of any + such terms You offer. + + 3.6. Larger Works. + + You may create a Larger Work by combining Covered Software with + other code not governed by the terms of this License and + distribute the Larger Work as a single product. In such a case, + You must make sure the requirements of this License are fulfilled + for the Covered Software. + +4. Versions of the License. + + 4.1. New Versions. + + Sun Microsystems, Inc. is the initial license steward and may + publish revised and/or new versions of this License from time to + time. Each version will be given a distinguishing version number. + Except as provided in Section 4.3, no one other than the license + steward has the right to modify this License. + + 4.2. Effect of New Versions. + + You may always continue to use, distribute or otherwise make the + Covered Software available under the terms of the version of the + License under which You originally received the Covered Software. + If the Initial Developer includes a notice in the Original + Software prohibiting it from being distributed or otherwise made + available under any subsequent version of the License, You must + distribute and make the Covered Software available under the terms + of the version of the License under which You originally received + the Covered Software. Otherwise, You may also choose to use, + distribute or otherwise make the Covered Software available under + the terms of any subsequent version of the License published by + the license steward. + + 4.3. Modified Versions. + + When You are an Initial Developer and You want to create a new + license for Your Original Software, You may create and use a + modified version of this License if You: (a) rename the license + and remove any references to the name of the license steward + (except to note that the license differs from this License); and + (b) otherwise make it clear that the license contains terms which + differ from this License. + +5. DISCLAIMER OF WARRANTY. + + COVERED SOFTWARE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" + BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, + INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE COVERED + SOFTWARE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR + PURPOSE OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND + PERFORMANCE OF THE COVERED SOFTWARE IS WITH YOU. SHOULD ANY + COVERED SOFTWARE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE + INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY + NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF + WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF + ANY COVERED SOFTWARE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS + DISCLAIMER. + +6. TERMINATION. + + 6.1. This License and the rights granted hereunder will terminate + automatically if You fail to comply with terms herein and fail to + cure such breach within 30 days of becoming aware of the breach. + Provisions which, by their nature, must remain in effect beyond + the termination of this License shall survive. + + 6.2. If You assert a patent infringement claim (excluding + declaratory judgment actions) against Initial Developer or a + Contributor (the Initial Developer or Contributor against whom You + assert such claim is referred to as "Participant") alleging that + the Participant Software (meaning the Contributor Version where + the Participant is a Contributor or the Original Software where + the Participant is the Initial Developer) directly or indirectly + infringes any patent, then any and all rights granted directly or + indirectly to You by such Participant, the Initial Developer (if + the Initial Developer is not the Participant) and all Contributors + under Sections 2.1 and/or 2.2 of this License shall, upon 60 days + notice from Participant terminate prospectively and automatically + at the expiration of such 60 day notice period, unless if within + such 60 day period You withdraw Your claim with respect to the + Participant Software against such Participant either unilaterally + or pursuant to a written agreement with Participant. + + 6.3. In the event of termination under Sections 6.1 or 6.2 above, + all end user licenses that have been validly granted by You or any + distributor hereunder prior to termination (excluding licenses + granted to You by any distributor) shall survive termination. + +7. LIMITATION OF LIABILITY. + + UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT + (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE + INITIAL DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF + COVERED SOFTWARE, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE + LIABLE TO ANY PERSON FOR ANY INDIRECT, SPECIAL, INCIDENTAL, OR + CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT + LIMITATION, DAMAGES FOR LOST PROFITS, LOSS OF GOODWILL, WORK + STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER + COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN + INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF + LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL + INJURY RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT + APPLICABLE LAW PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO + NOT ALLOW THE EXCLUSION OR LIMITATION OF INCIDENTAL OR + CONSEQUENTIAL DAMAGES, SO THIS EXCLUSION AND LIMITATION MAY NOT + APPLY TO YOU. + +8. U.S. GOVERNMENT END USERS. + + The Covered Software is a "commercial item," as that term is + defined in 48 C.F.R. 2.101 (Oct. 1995), consisting of "commercial + computer software" (as that term is defined at 48 + C.F.R. 252.227-7014(a)(1)) and "commercial computer software + documentation" as such terms are used in 48 C.F.R. 12.212 + (Sept. 1995). Consistent with 48 C.F.R. 12.212 and 48 + C.F.R. 227.7202-1 through 227.7202-4 (June 1995), all + U.S. Government End Users acquire Covered Software with only those + rights set forth herein. This U.S. Government Rights clause is in + lieu of, and supersedes, any other FAR, DFAR, or other clause or + provision that addresses Government rights in computer software + under this License. + +9. MISCELLANEOUS. + + This License represents the complete agreement concerning subject + matter hereof. If any provision of this License is held to be + unenforceable, such provision shall be reformed only to the extent + necessary to make it enforceable. This License shall be governed + by the law of the jurisdiction specified in a notice contained + within the Original Software (except to the extent applicable law, + if any, provides otherwise), excluding such jurisdiction's + conflict-of-law provisions. Any litigation relating to this + License shall be subject to the jurisdiction of the courts located + in the jurisdiction and venue specified in a notice contained + within the Original Software, with the losing party responsible + for costs, including, without limitation, court costs and + reasonable attorneys' fees and expenses. The application of the + United Nations Convention on Contracts for the International Sale + of Goods is expressly excluded. Any law or regulation which + provides that the language of a contract shall be construed + against the drafter shall not apply to this License. You agree + that You alone are responsible for compliance with the United + States export administration regulations (and the export control + laws and regulation of any other countries) when You use, + distribute or otherwise make available any Covered Software. + +10. RESPONSIBILITY FOR CLAIMS. + + As between Initial Developer and the Contributors, each party is + responsible for claims and damages arising, directly or + indirectly, out of its utilization of rights under this License + and You agree to work with Initial Developer and Contributors to + distribute such responsibility on an equitable basis. Nothing + herein is intended or shall be deemed to constitute any admission + of liability. + +-------------------------------------------------------------------- + +NOTICE PURSUANT TO SECTION 9 OF THE COMMON DEVELOPMENT AND +DISTRIBUTION LICENSE (CDDL) + +For Covered Software in this distribution, this License shall +be governed by the laws of the State of California (excluding +conflict-of-law provisions). + +Any litigation relating to this License shall be subject to the +jurisdiction of the Federal Courts of the Northern District of +California and the state courts of the State of California, with +venue lying in Santa Clara County, California. diff --git a/backends/conrod_crayon/tools/profiler/scripts/flamegraph.pl b/backends/conrod_crayon/tools/profiler/scripts/flamegraph.pl new file mode 100755 index 000000000..ac3819ccf --- /dev/null +++ b/backends/conrod_crayon/tools/profiler/scripts/flamegraph.pl @@ -0,0 +1,1125 @@ +#!/usr/bin/perl -w +# +# flamegraph.pl flame stack grapher. +# +# This takes stack samples and renders a call graph, allowing hot functions +# and codepaths to be quickly identified. Stack samples can be generated using +# tools such as DTrace, perf, SystemTap, and Instruments. +# +# USAGE: ./flamegraph.pl [options] input.txt > graph.svg +# +# grep funcA input.txt | ./flamegraph.pl [options] > graph.svg +# +# Then open the resulting .svg in a web browser, for interactivity: mouse-over +# frames for info, click to zoom, and ctrl-F to search. +# +# Options are listed in the usage message (--help). +# +# The input is stack frames and sample counts formatted as single lines. Each +# frame in the stack is semicolon separated, with a space and count at the end +# of the line. These can be generated for Linux perf script output using +# stackcollapse-perf.pl, for DTrace using stackcollapse.pl, and for other tools +# using the other stackcollapse programs. Example input: +# +# swapper;start_kernel;rest_init;cpu_idle;default_idle;native_safe_halt 1 +# +# An optional extra column of counts can be provided to generate a differential +# flame graph of the counts, colored red for more, and blue for less. This +# can be useful when using flame graphs for non-regression testing. +# See the header comment in the difffolded.pl program for instructions. +# +# The input functions can optionally have annotations at the end of each +# function name, following a precedent by some tools (Linux perf's _[k]): +# _[k] for kernel +# _[i] for inlined +# _[j] for jit +# _[w] for waker +# Some of the stackcollapse programs support adding these annotations, eg, +# stackcollapse-perf.pl --kernel --jit. They are used merely for colors by +# some palettes, eg, flamegraph.pl --color=java. +# +# The output flame graph shows relative presence of functions in stack samples. +# The ordering on the x-axis has no meaning; since the data is samples, time +# order of events is not known. The order used sorts function names +# alphabetically. +# +# While intended to process stack samples, this can also process stack traces. +# For example, tracing stacks for memory allocation, or resource usage. You +# can use --title to set the title to reflect the content, and --countname +# to change "samples" to "bytes" etc. +# +# There are a few different palettes, selectable using --color. By default, +# the colors are selected at random (except for differentials). Functions +# called "-" will be printed gray, which can be used for stack separators (eg, +# between user and kernel stacks). +# +# HISTORY +# +# This was inspired by Neelakanth Nadgir's excellent function_call_graph.rb +# program, which visualized function entry and return trace events. As Neel +# wrote: "The output displayed is inspired by Roch's CallStackAnalyzer which +# was in turn inspired by the work on vftrace by Jan Boerhout". See: +# https://blogs.oracle.com/realneel/entry/visualizing_callstacks_via_dtrace_and +# +# Copyright 2016 Netflix, Inc. +# Copyright 2011 Joyent, Inc. All rights reserved. +# Copyright 2011 Brendan Gregg. All rights reserved. +# +# CDDL HEADER START +# +# The contents of this file are subject to the terms of the +# Common Development and Distribution License (the "License"). +# You may not use this file except in compliance with the License. +# +# You can obtain a copy of the license at docs/cddl1.txt or +# http://opensource.org/licenses/CDDL-1.0. +# See the License for the specific language governing permissions +# and limitations under the License. +# +# When distributing Covered Code, include this CDDL HEADER in each +# file and include the License file at docs/cddl1.txt. +# If applicable, add the following below this CDDL HEADER, with the +# fields enclosed by brackets "[]" replaced with your own identifying +# information: Portions Copyright [yyyy] [name of copyright owner] +# +# CDDL HEADER END +# +# 11-Oct-2014 Adrien Mahieux Added zoom. +# 21-Nov-2013 Shawn Sterling Added consistent palette file option +# 17-Mar-2013 Tim Bunce Added options and more tunables. +# 15-Dec-2011 Dave Pacheco Support for frames with whitespace. +# 10-Sep-2011 Brendan Gregg Created this. + +use strict; + +use Getopt::Long; + +use open qw(:std :utf8); + +# tunables +my $encoding; +my $fonttype = "Verdana"; +my $imagewidth = 1200; # max width, pixels +my $frameheight = 16; # max height is dynamic +my $fontsize = 12; # base text size +my $fontwidth = 0.59; # avg width relative to fontsize +my $minwidth = 0.1; # min function width, pixels +my $nametype = "Function:"; # what are the names in the data? +my $countname = "samples"; # what are the counts in the data? +my $colors = "hot"; # color theme +my $bgcolor1 = "#eeeeee"; # background color gradient start +my $bgcolor2 = "#eeeeb0"; # background color gradient stop +my $nameattrfile; # file holding function attributes +my $timemax; # (override the) sum of the counts +my $factor = 1; # factor to scale counts by +my $hash = 0; # color by function name +my $palette = 0; # if we use consistent palettes (default off) +my %palette_map; # palette map hash +my $pal_file = "palette.map"; # palette map file name +my $stackreverse = 0; # reverse stack order, switching merge end +my $inverted = 0; # icicle graph +my $negate = 0; # switch differential hues +my $titletext = ""; # centered heading +my $titledefault = "Flame Graph"; # overwritten by --title +my $titleinverted = "Icicle Graph"; # " " +my $searchcolor = "rgb(230,0,230)"; # color for search highlighting +my $notestext = ""; # embedded notes in SVG +my $subtitletext = ""; # second level title (optional) +my $help = 0; + +sub usage { + die < outfile.svg\n + --title TEXT # change title text + --subtitle TEXT # second level title (optional) + --width NUM # width of image (default 1200) + --height NUM # height of each frame (default 16) + --minwidth NUM # omit smaller functions (default 0.1 pixels) + --fonttype FONT # font type (default "Verdana") + --fontsize NUM # font size (default 12) + --countname TEXT # count type label (default "samples") + --nametype TEXT # name type label (default "Function:") + --colors PALETTE # set color palette. choices are: hot (default), mem, + # io, wakeup, chain, java, js, perl, red, green, blue, + # aqua, yellow, purple, orange + --hash # colors are keyed by function name hash + --cp # use consistent palette (palette.map) + --reverse # generate stack-reversed flame graph + --inverted # icicle graph + --negate # switch differential hues (blue<->red) + --notes TEXT # add notes comment in SVG (for debugging) + --help # this message + + eg, + $0 --title="Flame Graph: malloc()" trace.txt > graph.svg +USAGE_END +} + +GetOptions( + 'fonttype=s' => \$fonttype, + 'width=i' => \$imagewidth, + 'height=i' => \$frameheight, + 'encoding=s' => \$encoding, + 'fontsize=f' => \$fontsize, + 'fontwidth=f' => \$fontwidth, + 'minwidth=f' => \$minwidth, + 'title=s' => \$titletext, + 'subtitle=s' => \$subtitletext, + 'nametype=s' => \$nametype, + 'countname=s' => \$countname, + 'nameattr=s' => \$nameattrfile, + 'total=s' => \$timemax, + 'factor=f' => \$factor, + 'colors=s' => \$colors, + 'hash' => \$hash, + 'cp' => \$palette, + 'reverse' => \$stackreverse, + 'inverted' => \$inverted, + 'negate' => \$negate, + 'notes=s' => \$notestext, + 'help' => \$help, +) or usage(); +$help && usage(); + +# internals +my $ypad1 = $fontsize * 3; # pad top, include title +my $ypad2 = $fontsize * 2 + 10; # pad bottom, include labels +my $ypad3 = $fontsize * 2; # pad top, include subtitle (optional) +my $xpad = 10; # pad lefm and right +my $framepad = 1; # vertical padding for frames +my $depthmax = 0; +my %Events; +my %nameattr; + +if ($titletext eq "") { + unless ($inverted) { + $titletext = $titledefault; + } else { + $titletext = $titleinverted; + } +} + +if ($nameattrfile) { + # The name-attribute file format is a function name followed by a tab then + # a sequence of tab separated name=value pairs. + open my $attrfh, $nameattrfile or die "Can't read $nameattrfile: $!\n"; + while (<$attrfh>) { + chomp; + my ($funcname, $attrstr) = split /\t/, $_, 2; + die "Invalid format in $nameattrfile" unless defined $attrstr; + $nameattr{$funcname} = { map { split /=/, $_, 2 } split /\t/, $attrstr }; + } +} + +if ($notestext =~ /[<>]/) { + die "Notes string can't contain < or >" +} + +# background colors: +# - yellow gradient: default (hot, java, js, perl) +# - blue gradient: mem, chain +# - gray gradient: io, wakeup, flat colors (red, green, blue, ...) +if ($colors eq "mem" or $colors eq "chain") { + $bgcolor1 = "#eeeeee"; $bgcolor2 = "#e0e0ff"; +} +if ($colors =~ /^(io|wakeup|red|green|blue|aqua|yellow|purple|orange)$/) { + $bgcolor1 = "#f8f8f8"; $bgcolor2 = "#e8e8e8"; +} + +# SVG functions +{ package SVG; + sub new { + my $class = shift; + my $self = {}; + bless ($self, $class); + return $self; + } + + sub header { + my ($self, $w, $h) = @_; + my $enc_attr = ''; + if (defined $encoding) { + $enc_attr = qq{ encoding="$encoding"}; + } + $self->{svg} .= < + + + + +SVG + } + + sub include { + my ($self, $content) = @_; + $self->{svg} .= $content; + } + + sub colorAllocate { + my ($self, $r, $g, $b) = @_; + return "rgb($r,$g,$b)"; + } + + sub group_start { + my ($self, $attr) = @_; + + my @g_attr = map { + exists $attr->{$_} ? sprintf(qq/$_="%s"/, $attr->{$_}) : () + } qw(class style onmouseover onmouseout onclick); + push @g_attr, $attr->{g_extra} if $attr->{g_extra}; + $self->{svg} .= sprintf qq/\n/, join(' ', @g_attr); + + $self->{svg} .= sprintf qq/%s<\/title>/, $attr->{title} + if $attr->{title}; # should be first element within g container + + if ($attr->{href}) { + my @a_attr; + push @a_attr, sprintf qq/xlink:href="%s"/, $attr->{href} if $attr->{href}; + # default target=_top else links will open within SVG + push @a_attr, sprintf qq/target="%s"/, $attr->{target} || "_top"; + push @a_attr, $attr->{a_extra} if $attr->{a_extra}; + $self->{svg} .= sprintf qq//, join(' ', @a_attr); + } + } + + sub group_end { + my ($self, $attr) = @_; + $self->{svg} .= qq/<\/a>\n/ if $attr->{href}; + $self->{svg} .= qq/<\/g>\n/; + } + + sub filledRectangle { + my ($self, $x1, $y1, $x2, $y2, $fill, $extra) = @_; + $x1 = sprintf "%0.1f", $x1; + $x2 = sprintf "%0.1f", $x2; + my $w = sprintf "%0.1f", $x2 - $x1; + my $h = sprintf "%0.1f", $y2 - $y1; + $extra = defined $extra ? $extra : ""; + $self->{svg} .= qq/\n/; + } + + sub stringTTF { + my ($self, $color, $font, $size, $angle, $x, $y, $str, $loc, $extra) = @_; + $x = sprintf "%0.2f", $x; + $loc = defined $loc ? $loc : "left"; + $extra = defined $extra ? $extra : ""; + $self->{svg} .= qq/$str<\/text>\n/; + } + + sub svg { + my $self = shift; + return "$self->{svg}\n"; + } + 1; +} + +sub namehash { + # Generate a vector hash for the name string, weighting early over + # later characters. We want to pick the same colors for function + # names across different flame graphs. + my $name = shift; + my $vector = 0; + my $weight = 1; + my $max = 1; + my $mod = 10; + # if module name present, trunc to 1st char + $name =~ s/.(.*?)`//; + foreach my $c (split //, $name) { + my $i = (ord $c) % $mod; + $vector += ($i / ($mod++ - 1)) * $weight; + $max += 1 * $weight; + $weight *= 0.70; + last if $mod > 12; + } + return (1 - $vector / $max) +} + +sub color { + my ($type, $hash, $name) = @_; + my ($v1, $v2, $v3); + + if ($hash) { + $v1 = namehash($name); + $v2 = $v3 = namehash(scalar reverse $name); + } else { + $v1 = rand(1); + $v2 = rand(1); + $v3 = rand(1); + } + + # theme palettes + if (defined $type and $type eq "hot") { + my $r = 205 + int(50 * $v3); + my $g = 0 + int(230 * $v1); + my $b = 0 + int(55 * $v2); + return "rgb($r,$g,$b)"; + } + if (defined $type and $type eq "mem") { + my $r = 0; + my $g = 190 + int(50 * $v2); + my $b = 0 + int(210 * $v1); + return "rgb($r,$g,$b)"; + } + if (defined $type and $type eq "io") { + my $r = 80 + int(60 * $v1); + my $g = $r; + my $b = 190 + int(55 * $v2); + return "rgb($r,$g,$b)"; + } + + # multi palettes + if (defined $type and $type eq "java") { + # Handle both annotations (_[j], _[i], ...; which are + # accurate), as well as input that lacks any annotations, as + # best as possible. Without annotations, we get a little hacky + # and match on java|org|com, etc. + if ($name =~ m:_\[j\]$:) { # jit annotation + $type = "green"; + } elsif ($name =~ m:_\[i\]$:) { # inline annotation + $type = "aqua"; + } elsif ($name =~ m:^L?(java|org|com|io|sun)/:) { # Java + $type = "green"; + } elsif ($name =~ m:_\[k\]$:) { # kernel annotation + $type = "orange"; + } elsif ($name =~ /::/) { # C++ + $type = "yellow"; + } else { # system + $type = "red"; + } + # fall-through to color palettes + } + if (defined $type and $type eq "perl") { + if ($name =~ /::/) { # C++ + $type = "yellow"; + } elsif ($name =~ m:Perl: or $name =~ m:\.pl:) { # Perl + $type = "green"; + } elsif ($name =~ m:_\[k\]$:) { # kernel + $type = "orange"; + } else { # system + $type = "red"; + } + # fall-through to color palettes + } + if (defined $type and $type eq "js") { + # Handle both annotations (_[j], _[i], ...; which are + # accurate), as well as input that lacks any annotations, as + # best as possible. Without annotations, we get a little hacky, + # and match on a "/" with a ".js", etc. + if ($name =~ m:_\[j\]$:) { # jit annotation + if ($name =~ m:/:) { + $type = "green"; # source + } else { + $type = "aqua"; # builtin + } + } elsif ($name =~ /::/) { # C++ + $type = "yellow"; + } elsif ($name =~ m:/.*\.js:) { # JavaScript (match "/" in path) + $type = "green"; + } elsif ($name =~ m/:/) { # JavaScript (match ":" in builtin) + $type = "aqua"; + } elsif ($name =~ m/^ $/) { # Missing symbol + $type = "green"; + } elsif ($name =~ m:_\[k\]:) { # kernel + $type = "orange"; + } else { # system + $type = "red"; + } + # fall-through to color palettes + } + if (defined $type and $type eq "wakeup") { + $type = "aqua"; + # fall-through to color palettes + } + if (defined $type and $type eq "chain") { + if ($name =~ m:_\[w\]:) { # waker + $type = "aqua" + } else { # off-CPU + $type = "blue"; + } + # fall-through to color palettes + } + + # color palettes + if (defined $type and $type eq "red") { + my $r = 200 + int(55 * $v1); + my $x = 50 + int(80 * $v1); + return "rgb($r,$x,$x)"; + } + if (defined $type and $type eq "green") { + my $g = 200 + int(55 * $v1); + my $x = 50 + int(60 * $v1); + return "rgb($x,$g,$x)"; + } + if (defined $type and $type eq "blue") { + my $b = 205 + int(50 * $v1); + my $x = 80 + int(60 * $v1); + return "rgb($x,$x,$b)"; + } + if (defined $type and $type eq "yellow") { + my $x = 175 + int(55 * $v1); + my $b = 50 + int(20 * $v1); + return "rgb($x,$x,$b)"; + } + if (defined $type and $type eq "purple") { + my $x = 190 + int(65 * $v1); + my $g = 80 + int(60 * $v1); + return "rgb($x,$g,$x)"; + } + if (defined $type and $type eq "aqua") { + my $r = 50 + int(60 * $v1); + my $g = 165 + int(55 * $v1); + my $b = 165 + int(55 * $v1); + return "rgb($r,$g,$b)"; + } + if (defined $type and $type eq "orange") { + my $r = 190 + int(65 * $v1); + my $g = 90 + int(65 * $v1); + return "rgb($r,$g,0)"; + } + + return "rgb(0,0,0)"; +} + +sub color_scale { + my ($value, $max) = @_; + my ($r, $g, $b) = (255, 255, 255); + $value = -$value if $negate; + if ($value > 0) { + $g = $b = int(210 * ($max - $value) / $max); + } elsif ($value < 0) { + $r = $g = int(210 * ($max + $value) / $max); + } + return "rgb($r,$g,$b)"; +} + +sub color_map { + my ($colors, $func) = @_; + if (exists $palette_map{$func}) { + return $palette_map{$func}; + } else { + $palette_map{$func} = color($colors, $hash, $func); + return $palette_map{$func}; + } +} + +sub write_palette { + open(FILE, ">$pal_file"); + foreach my $key (sort keys %palette_map) { + print FILE $key."->".$palette_map{$key}."\n"; + } + close(FILE); +} + +sub read_palette { + if (-e $pal_file) { + open(FILE, $pal_file) or die "can't open file $pal_file: $!"; + while ( my $line = ) { + chomp($line); + (my $key, my $value) = split("->",$line); + $palette_map{$key}=$value; + } + close(FILE) + } +} + +my %Node; # Hash of merged frame data +my %Tmp; + +# flow() merges two stacks, storing the merged frames and value data in %Node. +sub flow { + my ($last, $this, $v, $d) = @_; + + my $len_a = @$last - 1; + my $len_b = @$this - 1; + + my $i = 0; + my $len_same; + for (; $i <= $len_a; $i++) { + last if $i > $len_b; + last if $last->[$i] ne $this->[$i]; + } + $len_same = $i; + + for ($i = $len_a; $i >= $len_same; $i--) { + my $k = "$last->[$i];$i"; + # a unique ID is constructed from "func;depth;etime"; + # func-depth isn't unique, it may be repeated later. + $Node{"$k;$v"}->{stime} = delete $Tmp{$k}->{stime}; + if (defined $Tmp{$k}->{delta}) { + $Node{"$k;$v"}->{delta} = delete $Tmp{$k}->{delta}; + } + delete $Tmp{$k}; + } + + for ($i = $len_same; $i <= $len_b; $i++) { + my $k = "$this->[$i];$i"; + $Tmp{$k}->{stime} = $v; + if (defined $d) { + $Tmp{$k}->{delta} += $i == $len_b ? $d : 0; + } + } + + return $this; +} + +# parse input +my @Data; +my $last = []; +my $time = 0; +my $delta = undef; +my $ignored = 0; +my $line; +my $maxdelta = 1; + +# reverse if needed +foreach (<>) { + chomp; + $line = $_; + if ($stackreverse) { + # there may be an extra samples column for differentials + # XXX todo: redo these REs as one. It's repeated below. + my($stack, $samples) = (/^(.*)\s+?(\d+(?:\.\d*)?)$/); + my $samples2 = undef; + if ($stack =~ /^(.*)\s+?(\d+(?:\.\d*)?)$/) { + $samples2 = $samples; + ($stack, $samples) = $stack =~ (/^(.*)\s+?(\d+(?:\.\d*)?)$/); + unshift @Data, join(";", reverse split(";", $stack)) . " $samples $samples2"; + } else { + unshift @Data, join(";", reverse split(";", $stack)) . " $samples"; + } + } else { + unshift @Data, $line; + } +} + +# process and merge frames +foreach (sort @Data) { + chomp; + # process: folded_stack count + # eg: func_a;func_b;func_c 31 + my ($stack, $samples) = (/^(.*)\s+?(\d+(?:\.\d*)?)$/); + unless (defined $samples and defined $stack) { + ++$ignored; + next; + } + + # there may be an extra samples column for differentials: + my $samples2 = undef; + if ($stack =~ /^(.*)\s+?(\d+(?:\.\d*)?)$/) { + $samples2 = $samples; + ($stack, $samples) = $stack =~ (/^(.*)\s+?(\d+(?:\.\d*)?)$/); + } + $delta = undef; + if (defined $samples2) { + $delta = $samples2 - $samples; + $maxdelta = abs($delta) if abs($delta) > $maxdelta; + } + + # for chain graphs, annotate waker frames with "_[w]", for later + # coloring. This is a hack, but has a precedent ("_[k]" from perf). + if ($colors eq "chain") { + my @parts = split ";--;", $stack; + my @newparts = (); + $stack = shift @parts; + $stack .= ";--;"; + foreach my $part (@parts) { + $part =~ s/;/_[w];/g; + $part .= "_[w]"; + push @newparts, $part; + } + $stack .= join ";--;", @parts; + } + + # merge frames and populate %Node: + $last = flow($last, [ '', split ";", $stack ], $time, $delta); + + if (defined $samples2) { + $time += $samples2; + } else { + $time += $samples; + } +} +flow($last, [], $time, $delta); + +warn "Ignored $ignored lines with invalid format\n" if $ignored; +unless ($time) { + warn "ERROR: No stack counts found\n"; + my $im = SVG->new(); + # emit an error message SVG, for tools automating flamegraph use + my $imageheight = $fontsize * 5; + $im->header($imagewidth, $imageheight); + $im->stringTTF($im->colorAllocate(0, 0, 0), $fonttype, $fontsize + 2, + 0.0, int($imagewidth / 2), $fontsize * 2, + "ERROR: No valid input provided to flamegraph.pl.", "middle"); + print $im->svg; + exit 2; +} +if ($timemax and $timemax < $time) { + warn "Specified --total $timemax is less than actual total $time, so ignored\n" + if $timemax/$time > 0.02; # only warn is significant (e.g., not rounding etc) + undef $timemax; +} +$timemax ||= $time; + +my $widthpertime = ($imagewidth - 2 * $xpad) / $timemax; +my $minwidth_time = $minwidth / $widthpertime; + +# prune blocks that are too narrow and determine max depth +while (my ($id, $node) = each %Node) { + my ($func, $depth, $etime) = split ";", $id; + my $stime = $node->{stime}; + die "missing start for $id" if not defined $stime; + + if (($etime-$stime) < $minwidth_time) { + delete $Node{$id}; + next; + } + $depthmax = $depth if $depth > $depthmax; +} + +# draw canvas, and embed interactive JavaScript program +my $imageheight = (($depthmax + 1) * $frameheight) + $ypad1 + $ypad2; +$imageheight += $ypad3 if $subtitletext ne ""; +my $im = SVG->new(); +$im->header($imagewidth, $imageheight); +my $inc = < + + + + + + + +INC +$im->include($inc); +$im->filledRectangle(0, 0, $imagewidth, $imageheight, 'url(#background)'); +my ($white, $black, $vvdgrey, $vdgrey, $dgrey) = ( + $im->colorAllocate(255, 255, 255), + $im->colorAllocate(0, 0, 0), + $im->colorAllocate(40, 40, 40), + $im->colorAllocate(160, 160, 160), + $im->colorAllocate(200, 200, 200), + ); +$im->stringTTF($black, $fonttype, $fontsize + 5, 0.0, int($imagewidth / 2), $fontsize * 2, $titletext, "middle"); +if ($subtitletext ne "") { + $im->stringTTF($vdgrey, $fonttype, $fontsize, 0.0, int($imagewidth / 2), $fontsize * 4, $subtitletext, "middle"); +} +$im->stringTTF($black, $fonttype, $fontsize, 0.0, $xpad, $imageheight - ($ypad2 / 2), " ", "", 'id="details"'); +$im->stringTTF($black, $fonttype, $fontsize, 0.0, $xpad, $fontsize * 2, + "Reset Zoom", "", 'id="unzoom" onclick="unzoom()" style="opacity:0.0;cursor:pointer"'); +$im->stringTTF($black, $fonttype, $fontsize, 0.0, $imagewidth - $xpad - 100, + $fontsize * 2, "Search", "", 'id="search" onmouseover="searchover()" onmouseout="searchout()" onclick="search_prompt()" style="opacity:0.1;cursor:pointer"'); +$im->stringTTF($black, $fonttype, $fontsize, 0.0, $imagewidth - $xpad - 100, $imageheight - ($ypad2 / 2), " ", "", 'id="matched"'); + +if ($palette) { + read_palette(); +} + +# draw frames +while (my ($id, $node) = each %Node) { + my ($func, $depth, $etime) = split ";", $id; + my $stime = $node->{stime}; + my $delta = $node->{delta}; + + $etime = $timemax if $func eq "" and $depth == 0; + + my $x1 = $xpad + $stime * $widthpertime; + my $x2 = $xpad + $etime * $widthpertime; + my ($y1, $y2); + unless ($inverted) { + $y1 = $imageheight - $ypad2 - ($depth + 1) * $frameheight + $framepad; + $y2 = $imageheight - $ypad2 - $depth * $frameheight; + } else { + $y1 = $ypad1 + $depth * $frameheight; + $y2 = $ypad1 + ($depth + 1) * $frameheight - $framepad; + } + + my $samples = sprintf "%.0f", ($etime - $stime) * $factor; + (my $samples_txt = $samples) # add commas per perlfaq5 + =~ s/(^[-+]?\d+?(?=(?>(?:\d{3})+)(?!\d))|\G\d{3}(?=\d))/$1,/g; + + my $info; + if ($func eq "" and $depth == 0) { + $info = "all ($samples_txt $countname, 100%)"; + } else { + my $pct = sprintf "%.2f", ((100 * $samples) / ($timemax * $factor)); + my $escaped_func = $func; + # clean up SVG breaking characters: + $escaped_func =~ s/&/&/g; + $escaped_func =~ s//>/g; + $escaped_func =~ s/"/"/g; + $escaped_func =~ s/_\[[kwij]\]$//; # strip any annotation + unless (defined $delta) { + $info = "$escaped_func ($samples_txt $countname, $pct%)"; + } else { + my $d = $negate ? -$delta : $delta; + my $deltapct = sprintf "%.2f", ((100 * $d) / ($timemax * $factor)); + $deltapct = $d > 0 ? "+$deltapct" : $deltapct; + $info = "$escaped_func ($samples_txt $countname, $pct%; $deltapct%)"; + } + } + + my $nameattr = { %{ $nameattr{$func}||{} } }; # shallow clone + $nameattr->{class} ||= "func_g"; + $nameattr->{onmouseover} ||= "s(this)"; + $nameattr->{onmouseout} ||= "c()"; + $nameattr->{onclick} ||= "zoom(this)"; + $nameattr->{title} ||= $info; + $im->group_start($nameattr); + + my $color; + if ($func eq "--") { + $color = $vdgrey; + } elsif ($func eq "-") { + $color = $dgrey; + } elsif (defined $delta) { + $color = color_scale($delta, $maxdelta); + } elsif ($palette) { + $color = color_map($colors, $func); + } else { + $color = color($colors, $hash, $func); + } + $im->filledRectangle($x1, $y1, $x2, $y2, $color, 'rx="2" ry="2"'); + + my $chars = int( ($x2 - $x1) / ($fontsize * $fontwidth)); + my $text = ""; + if ($chars >= 3) { # room for one char plus two dots + $func =~ s/_\[[kwij]\]$//; # strip any annotation + $text = substr $func, 0, $chars; + substr($text, -2, 2) = ".." if $chars < length $func; + $text =~ s/&/&/g; + $text =~ s//>/g; + } + $im->stringTTF($black, $fonttype, $fontsize, 0.0, $x1 + 3, 3 + ($y1 + $y2) / 2, $text, ""); + + $im->group_end($nameattr); +} + +print $im->svg; + +if ($palette) { + write_palette(); +} + +# vim: ts=8 sts=8 sw=8 noexpandtab diff --git a/backends/conrod_crayon/tools/profiler/scripts/stackcollapse.pl b/backends/conrod_crayon/tools/profiler/scripts/stackcollapse.pl new file mode 100755 index 000000000..17144bb62 --- /dev/null +++ b/backends/conrod_crayon/tools/profiler/scripts/stackcollapse.pl @@ -0,0 +1,109 @@ +#!/usr/bin/perl -w +# +# stackcolllapse.pl collapse multiline stacks into single lines. +# +# Parses a multiline stack followed by a number on a separate line, and +# outputs a semicolon separated stack followed by a space and the number. +# If memory addresses (+0xd) are present, they are stripped, and resulting +# identical stacks are colased with their counts summed. +# +# USAGE: ./stackcollapse.pl infile > outfile +# +# Example input: +# +# unix`i86_mwait+0xd +# unix`cpu_idle_mwait+0xf1 +# unix`idle+0x114 +# unix`thread_start+0x8 +# 1641 +# +# Example output: +# +# unix`thread_start;unix`idle;unix`cpu_idle_mwait;unix`i86_mwait 1641 +# +# Input may contain many stacks, and can be generated using DTrace. The +# first few lines of input are skipped (see $headerlines). +# +# Copyright 2011 Joyent, Inc. All rights reserved. +# Copyright 2011 Brendan Gregg. All rights reserved. +# +# CDDL HEADER START +# +# The contents of this file are subject to the terms of the +# Common Development and Distribution License (the "License"). +# You may not use this file except in compliance with the License. +# +# You can obtain a copy of the license at docs/cddl1.txt or +# http://opensource.org/licenses/CDDL-1.0. +# See the License for the specific language governing permissions +# and limitations under the License. +# +# When distributing Covered Code, include this CDDL HEADER in each +# file and include the License file at docs/cddl1.txt. +# If applicable, add the following below this CDDL HEADER, with the +# fields enclosed by brackets "[]" replaced with your own identifying +# information: Portions Copyright [yyyy] [name of copyright owner] +# +# CDDL HEADER END +# +# 14-Aug-2011 Brendan Gregg Created this. + +use strict; + +my $headerlines = 3; # number of input lines to skip +my $includeoffset = 0; # include function offset (except leafs) +my %collapsed; + +sub remember_stack { + my ($stack, $count) = @_; + $collapsed{$stack} += $count; +} + +my $nr = 0; +my @stack; + +foreach (<>) { + next if $nr++ < $headerlines; + chomp; + + if (m/^\s*(\d+)+$/) { + my $count = $1; + my $joined = join(";", @stack); + + # trim leaf offset if these were retained: + $joined =~ s/\+[^+]*$// if $includeoffset; + + remember_stack($joined, $count); + @stack = (); + next; + } + + next if (m/^\s*$/); + + my $frame = $_; + $frame =~ s/^\s*//; + $frame =~ s/\+[^+]*$// unless $includeoffset; + + # Remove arguments from C++ function names: + $frame =~ s/(::.*)[(<].*/$1/; + + $frame = "-" if $frame eq ""; + + my @inline; + for (split /\->/, $frame) { + my $func = $_; + + # Strip out L and ; included in java stacks + $func =~ tr/\;/:/; + $func =~ s/^L//; + $func .= "_[i]" if scalar(@inline) > 0; #inlined + + push @inline, $func; + } + + unshift @stack, @inline; +} + +foreach my $k (sort { $a cmp $b } keys %collapsed) { + print "$k $collapsed{$k}\n"; +} diff --git a/backends/conrod_crayon/tools/wasm-template/README.md b/backends/conrod_crayon/tools/wasm-template/README.md new file mode 100644 index 000000000..58f53d1ea --- /dev/null +++ b/backends/conrod_crayon/tools/wasm-template/README.md @@ -0,0 +1,8 @@ +# Wasm-Template + +```sh +$ cd ./tools/wasm-template +$ npm install +$ cd ../.. +$ ./tools/wasm-template/run.sh render_texture +``` \ No newline at end of file diff --git a/backends/conrod_crayon/tools/wasm-template/index.html b/backends/conrod_crayon/tools/wasm-template/index.html new file mode 100644 index 000000000..f05867bc6 --- /dev/null +++ b/backends/conrod_crayon/tools/wasm-template/index.html @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/backends/conrod_crayon/tools/wasm-template/index.js b/backends/conrod_crayon/tools/wasm-template/index.js new file mode 100644 index 000000000..e8c34aa76 --- /dev/null +++ b/backends/conrod_crayon/tools/wasm-template/index.js @@ -0,0 +1 @@ +import('./dist/native').catch(console.error); \ No newline at end of file diff --git a/backends/conrod_crayon/tools/wasm-template/package-lock.json b/backends/conrod_crayon/tools/wasm-template/package-lock.json new file mode 100644 index 000000000..7d6ef7232 --- /dev/null +++ b/backends/conrod_crayon/tools/wasm-template/package-lock.json @@ -0,0 +1,5931 @@ +{ + "requires": true, + "lockfileVersion": 1, + "dependencies": { + "@webassemblyjs/ast": { + "version": "1.7.10", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.7.10.tgz", + "integrity": "sha512-wTUeaByYN2EA6qVqhbgavtGc7fLTOx0glG2IBsFlrFG51uXIGlYBTyIZMf4SPLo3v1bgV/7lBN3l7Z0R6Hswew==", + "dev": true, + "requires": { + "@webassemblyjs/helper-module-context": "1.7.10", + "@webassemblyjs/helper-wasm-bytecode": "1.7.10", + "@webassemblyjs/wast-parser": "1.7.10" + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.7.10", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.7.10.tgz", + "integrity": "sha512-gMsGbI6I3p/P1xL2UxqhNh1ga2HCsx5VBB2i5VvJFAaqAjd2PBTRULc3BpTydabUQEGlaZCzEUQhLoLG7TvEYQ==", + "dev": true + }, + "@webassemblyjs/helper-api-error": { + "version": "1.7.10", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.7.10.tgz", + "integrity": "sha512-DoYRlPWtuw3yd5BOr9XhtrmB6X1enYF0/54yNvQWGXZEPDF5PJVNI7zQ7gkcKfTESzp8bIBWailaFXEK/jjCsw==", + "dev": true + }, + "@webassemblyjs/helper-buffer": { + "version": "1.7.10", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.7.10.tgz", + "integrity": "sha512-+RMU3dt/dPh4EpVX4u5jxsOlw22tp3zjqE0m3ftU2tsYxnPULb4cyHlgaNd2KoWuwasCQqn8Mhr+TTdbtj3LlA==", + "dev": true + }, + "@webassemblyjs/helper-code-frame": { + "version": "1.7.10", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.7.10.tgz", + "integrity": "sha512-UiytbpKAULOEab2hUZK2ywXen4gWJVrgxtwY3Kn+eZaaSWaRM8z/7dAXRSoamhKFiBh1uaqxzE/XD9BLlug3gw==", + "dev": true, + "requires": { + "@webassemblyjs/wast-printer": "1.7.10" + } + }, + "@webassemblyjs/helper-fsm": { + "version": "1.7.10", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.7.10.tgz", + "integrity": "sha512-w2vDtUK9xeSRtt5+RnnlRCI7wHEvLjF0XdnxJpgx+LJOvklTZPqWkuy/NhwHSLP19sm9H8dWxKeReMR7sCkGZA==", + "dev": true + }, + "@webassemblyjs/helper-module-context": { + "version": "1.7.10", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.7.10.tgz", + "integrity": "sha512-yE5x/LzZ3XdPdREmJijxzfrf+BDRewvO0zl8kvORgSWmxpRrkqY39KZSq6TSgIWBxkK4SrzlS3BsMCv2s1FpsQ==", + "dev": true + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.7.10", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.7.10.tgz", + "integrity": "sha512-u5qy4SJ/OrxKxZqJ9N3qH4ZQgHaAzsopsYwLvoWJY6Q33r8PhT3VPyNMaJ7ZFoqzBnZlCcS/0f4Sp8WBxylXfg==", + "dev": true + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.7.10", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.7.10.tgz", + "integrity": "sha512-Ecvww6sCkcjatcyctUrn22neSJHLN/TTzolMGG/N7S9rpbsTZ8c6Bl98GpSpV77EvzNijiNRHBG0+JO99qKz6g==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.7.10", + "@webassemblyjs/helper-buffer": "1.7.10", + "@webassemblyjs/helper-wasm-bytecode": "1.7.10", + "@webassemblyjs/wasm-gen": "1.7.10" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.7.10", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.7.10.tgz", + "integrity": "sha512-HRcWcY+YWt4+s/CvQn+vnSPfRaD4KkuzQFt5MNaELXXHSjelHlSEA8ZcqT69q0GTIuLWZ6JaoKar4yWHVpZHsQ==", + "dev": true, + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.7.10", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.7.10.tgz", + "integrity": "sha512-og8MciYlA8hvzCLR71hCuZKPbVBfLQeHv7ImKZ4nlyxrYbG7uJHYtHiHu6OV9SqrGuD03H/HtXC4Bgdjfm9FHw==", + "dev": true, + "requires": { + "@xtuc/long": "4.2.1" + } + }, + "@webassemblyjs/utf8": { + "version": "1.7.10", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.7.10.tgz", + "integrity": "sha512-Ng6Pxv6siyZp635xCSnH3mKmIFgqWPCcGdoo0GBYgyGdxu7cUj4agV7Uu1a8REP66UYUFXJLudeGgd4RvuJAnQ==", + "dev": true + }, + "@webassemblyjs/wasm-edit": { + "version": "1.7.10", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.7.10.tgz", + "integrity": "sha512-e9RZFQlb+ZuYcKRcW9yl+mqX/Ycj9+3/+ppDI8nEE/NCY6FoK8f3dKBcfubYV/HZn44b+ND4hjh+4BYBt+sDnA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.7.10", + "@webassemblyjs/helper-buffer": "1.7.10", + "@webassemblyjs/helper-wasm-bytecode": "1.7.10", + "@webassemblyjs/helper-wasm-section": "1.7.10", + "@webassemblyjs/wasm-gen": "1.7.10", + "@webassemblyjs/wasm-opt": "1.7.10", + "@webassemblyjs/wasm-parser": "1.7.10", + "@webassemblyjs/wast-printer": "1.7.10" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.7.10", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.7.10.tgz", + "integrity": "sha512-M0lb6cO2Y0PzDye/L39PqwV+jvO+2YxEG5ax+7dgq7EwXdAlpOMx1jxyXJTScQoeTpzOPIb+fLgX/IkLF8h2yw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.7.10", + "@webassemblyjs/helper-wasm-bytecode": "1.7.10", + "@webassemblyjs/ieee754": "1.7.10", + "@webassemblyjs/leb128": "1.7.10", + "@webassemblyjs/utf8": "1.7.10" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.7.10", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.7.10.tgz", + "integrity": "sha512-R66IHGCdicgF5ZliN10yn5HaC7vwYAqrSVJGjtJJQp5+QNPBye6heWdVH/at40uh0uoaDN/UVUfXK0gvuUqtVg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.7.10", + "@webassemblyjs/helper-buffer": "1.7.10", + "@webassemblyjs/wasm-gen": "1.7.10", + "@webassemblyjs/wasm-parser": "1.7.10" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.7.10", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.7.10.tgz", + "integrity": "sha512-AEv8mkXVK63n/iDR3T693EzoGPnNAwKwT3iHmKJNBrrALAhhEjuPzo/lTE4U7LquEwyvg5nneSNdTdgrBaGJcA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.7.10", + "@webassemblyjs/helper-api-error": "1.7.10", + "@webassemblyjs/helper-wasm-bytecode": "1.7.10", + "@webassemblyjs/ieee754": "1.7.10", + "@webassemblyjs/leb128": "1.7.10", + "@webassemblyjs/utf8": "1.7.10" + } + }, + "@webassemblyjs/wast-parser": { + "version": "1.7.10", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.7.10.tgz", + "integrity": "sha512-YTPEtOBljkCL0VjDp4sHe22dAYSm3ZwdJ9+2NTGdtC7ayNvuip1wAhaAS8Zt9Q6SW9E5Jf5PX7YE3XWlrzR9cw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.7.10", + "@webassemblyjs/floating-point-hex-parser": "1.7.10", + "@webassemblyjs/helper-api-error": "1.7.10", + "@webassemblyjs/helper-code-frame": "1.7.10", + "@webassemblyjs/helper-fsm": "1.7.10", + "@xtuc/long": "4.2.1" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.7.10", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.7.10.tgz", + "integrity": "sha512-mJ3QKWtCchL1vhU/kZlJnLPuQZnlDOdZsyP0bbLWPGdYsQDnSBvyTLhzwBA3QAMlzEL9V4JHygEmK6/OTEyytA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.7.10", + "@webassemblyjs/wast-parser": "1.7.10", + "@xtuc/long": "4.2.1" + } + }, + "@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true + }, + "@xtuc/long": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.1.tgz", + "integrity": "sha512-FZdkNBDqBRHKQ2MEbSC17xnPFOhZxeJ2YGSfr2BKf3sujG49Qe3bB+rGCwQfIaA7WHnGeGkSijX4FuBCdrzW/g==", + "dev": true + }, + "accepts": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", + "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", + "dev": true, + "requires": { + "mime-types": "~2.1.18", + "negotiator": "0.6.1" + } + }, + "acorn": { + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", + "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==", + "dev": true + }, + "acorn-dynamic-import": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-3.0.0.tgz", + "integrity": "sha512-zVWV8Z8lislJoOKKqdNMOB+s6+XV5WERty8MnKBeFgwA+19XJjJHs2RP5dzM57FftIs+jQnRToLiWazKr6sSWg==", + "dev": true, + "requires": { + "acorn": "^5.0.0" + } + }, + "ajv": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.5.4.tgz", + "integrity": "sha512-4Wyjt8+t6YszqaXnLDfMmG/8AlO5Zbcsy3ATHncCzjW/NoPzAId8AK6749Ybjmdt+kUY1gP60fCu46oDxPv/mg==", + "dev": true, + "requires": { + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-errors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.0.tgz", + "integrity": "sha1-7PAh+hCP0X37Xms4Py3SM+Mf/Fk=", + "dev": true + }, + "ajv-keywords": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.2.0.tgz", + "integrity": "sha1-6GuBnGAs+IIa1jdBNpjx3sAhhHo=", + "dev": true + }, + "ansi-colors": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.1.tgz", + "integrity": "sha512-Xt+zb6nqgvV9SWAVp0EG3lRsHcbq5DDgqjPPz6pwgtj6RKz65zGXMNa82oJfOSBA/to6GmRP7Dr+6o+kbApTzQ==", + "dev": true + }, + "ansi-html": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", + "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=", + "dev": true + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "dev": true + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true + }, + "array-flatten": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.1.tgz", + "integrity": "sha1-Qmu52oQJDBg42BLIFQryCoMx4pY=", + "dev": true + }, + "array-union": { + "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" + } + }, + "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 + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "asn1.js": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", + "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "assert": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz", + "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=", + "dev": true, + "requires": { + "util": "0.10.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", + "dev": true + }, + "util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "dev": true, + "requires": { + "inherits": "2.0.1" + } + } + } + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true + }, + "async": { + "version": "1.5.2", + "resolved": "http://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true + }, + "async-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", + "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=", + "dev": true + }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "base64-js": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", + "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==", + "dev": true + }, + "batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", + "dev": true + }, + "big.js": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", + "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==", + "dev": true + }, + "binary-extensions": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.12.0.tgz", + "integrity": "sha512-DYWGk01lDcxeS/K9IHPGWfT8PsJmbXRtRd2Sx72Tnb8pcYZQFF1oSDb8hJtS1vhp212q1Rzi5dUf9+nq0o9UIg==", + "dev": true + }, + "bluebird": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.2.tgz", + "integrity": "sha512-dhHTWMI7kMx5whMQntl7Vr9C6BvV10lFXDAasnqnrMYhXVCzzk6IO9Fo2L75jXHT07WrOngL1WDXOp+yYS91Yg==", + "dev": true + }, + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", + "dev": true + }, + "body-parser": { + "version": "1.18.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz", + "integrity": "sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ=", + "dev": true, + "requires": { + "bytes": "3.0.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "~1.6.3", + "iconv-lite": "0.4.23", + "on-finished": "~2.3.0", + "qs": "6.5.2", + "raw-body": "2.3.3", + "type-is": "~1.6.16" + } + }, + "bonjour": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", + "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", + "dev": true, + "requires": { + "array-flatten": "^2.1.0", + "deep-equal": "^1.0.1", + "dns-equal": "^1.0.0", + "dns-txt": "^2.0.2", + "multicast-dns": "^6.0.1", + "multicast-dns-service-types": "^1.1.0" + } + }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", + "dev": true + }, + "brace-expansion": { + "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" + } + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", + "dev": true + }, + "browserify-aes": { + "version": "1.2.0", + "resolved": "http://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "dev": true, + "requires": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "dev": true, + "requires": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "browserify-rsa": { + "version": "4.0.1", + "resolved": "http://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "randombytes": "^2.0.1" + } + }, + "browserify-sign": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", + "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", + "dev": true, + "requires": { + "bn.js": "^4.1.1", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.2", + "elliptic": "^6.0.0", + "inherits": "^2.0.1", + "parse-asn1": "^5.0.0" + } + }, + "browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "dev": true, + "requires": { + "pako": "~1.0.5" + } + }, + "buffer": { + "version": "4.9.1", + "resolved": "http://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", + "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", + "dev": true, + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + } + } + }, + "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 + }, + "buffer-indexof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", + "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", + "dev": true + }, + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", + "dev": true + }, + "builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", + "dev": true + }, + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", + "dev": true + }, + "cacache": { + "version": "10.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-10.0.4.tgz", + "integrity": "sha512-Dph0MzuH+rTQzGPNT9fAnrPmMmjKfST6trxJeK7NQuHRaVw24VzPRWTmg9MpcwOVQZO0E1FBICUlFeNaKPIfHA==", + "dev": true, + "requires": { + "bluebird": "^3.5.1", + "chownr": "^1.0.1", + "glob": "^7.1.2", + "graceful-fs": "^4.1.11", + "lru-cache": "^4.1.1", + "mississippi": "^2.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.2", + "ssri": "^5.2.4", + "unique-filename": "^1.1.0", + "y18n": "^4.0.0" + } + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + } + }, + "camel-case": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", + "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=", + "dev": true, + "requires": { + "no-case": "^2.2.0", + "upper-case": "^1.1.1" + } + }, + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "chokidar": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.4.tgz", + "integrity": "sha512-z9n7yt9rOvIJrMhvDtDictKrkFHeihkNl6uWMmZlmL6tJtX9Cs+87oK+teBx+JIgzvbX3yZHT3eF8vpbDxHJXQ==", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.0", + "braces": "^2.3.0", + "fsevents": "^1.2.2", + "glob-parent": "^3.1.0", + "inherits": "^2.0.1", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "lodash.debounce": "^4.0.8", + "normalize-path": "^2.1.1", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.0.0", + "upath": "^1.0.5" + } + }, + "chownr": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.1.tgz", + "integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==", + "dev": true + }, + "chrome-trace-event": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.0.tgz", + "integrity": "sha512-xDbVgyfDTT2piup/h8dK/y4QZfJRSa73bw1WZ8b4XM1o7fsFubUVGYcE+1ANtOzJJELGpYoG2961z0Z6OAld9A==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "clean-css": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.1.tgz", + "integrity": "sha512-4ZxI6dy4lrY6FHzfiy1aEOXgu4LIsW2MhwG0VBKdcoGoH/XLFgaHSdLTGr4O8Be6A8r3MOphEiI8Gc1n0ecf3g==", + "dev": true, + "requires": { + "source-map": "~0.6.0" + } + }, + "cliui": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", + "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "dev": true, + "requires": { + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "commander": { + "version": "2.17.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", + "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", + "dev": true + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "dev": true + }, + "compressible": { + "version": "2.0.15", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.15.tgz", + "integrity": "sha512-4aE67DL33dSW9gw4CI2H/yTxqHLNcxp0yS6jB+4h+wr3e43+1z7vm0HU9qXOH8j+qjKuL8+UtkOxYQSMq60Ylw==", + "dev": true, + "requires": { + "mime-db": ">= 1.36.0 < 2" + } + }, + "compression": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.3.tgz", + "integrity": "sha512-HSjyBG5N1Nnz7tF2+O7A9XUhyjru71/fwgNb7oIsEVHR0WShfs2tIS/EySLgiTe98aOK18YDlMXpzjCXY/n9mg==", + "dev": true, + "requires": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.14", + "debug": "2.6.9", + "on-headers": "~1.0.1", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + } + }, + "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 + }, + "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", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "http://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", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "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" + } + } + } + }, + "connect-history-api-fallback": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.5.0.tgz", + "integrity": "sha1-sGhzk0vF40T+9hGhlqb6rgruAVo=", + "dev": true + }, + "console-browserify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", + "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", + "dev": true, + "requires": { + "date-now": "^0.1.4" + } + }, + "constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", + "dev": true + }, + "content-disposition": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", + "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=", + "dev": true + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "dev": true + }, + "cookie": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", + "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=", + "dev": true + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", + "dev": true + }, + "copy-concurrently": { + "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", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.0" + } + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true + }, + "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 + }, + "create-ecdh": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", + "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "elliptic": "^6.0.0" + } + }, + "create-hash": { + "version": "1.2.0", + "resolved": "http://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "create-hmac": { + "version": "1.1.7", + "resolved": "http://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "dev": true, + "requires": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "dev": true, + "requires": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + } + }, + "css-select": { + "version": "1.2.0", + "resolved": "http://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", + "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", + "dev": true, + "requires": { + "boolbase": "~1.0.0", + "css-what": "2.1", + "domutils": "1.5.1", + "nth-check": "~1.0.1" + } + }, + "css-what": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.2.tgz", + "integrity": "sha512-wan8dMWQ0GUeF7DGEPVjhHemVW/vy6xUYmFzRY8RYqgA0JtXC9rJmbScBjqSu6dg9q0lwPQy6ZAmJVr3PPTvqQ==", + "dev": true + }, + "cyclist": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-0.2.2.tgz", + "integrity": "sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA=", + "dev": true + }, + "date-now": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", + "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", + "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "decamelize": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-2.0.0.tgz", + "integrity": "sha512-Ikpp5scV3MSYxY39ymh45ZLEecsTdv/Xj2CaQfI8RLMuwi7XvjX9H/fhraiSuU+C5w5NTDu4ZU72xNiZnurBPg==", + "dev": true, + "requires": { + "xregexp": "4.0.0" + } + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true + }, + "deep-equal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", + "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=", + "dev": true + }, + "default-gateway": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-2.7.2.tgz", + "integrity": "sha512-lAc4i9QJR0YHSDFdzeBQKfZ1SRDG3hsJNEkrpcZa8QhBfidLAilT60BDEIVUUGqosFp425KOgB3uYqcnQrWafQ==", + "dev": true, + "requires": { + "execa": "^0.10.0", + "ip-regex": "^2.1.0" + } + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "del": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/del/-/del-3.0.0.tgz", + "integrity": "sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU=", + "dev": true, + "requires": { + "globby": "^6.1.0", + "is-path-cwd": "^1.0.0", + "is-path-in-cwd": "^1.0.0", + "p-map": "^1.1.1", + "pify": "^3.0.0", + "rimraf": "^2.2.8" + } + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true + }, + "des.js": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", + "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", + "dev": true + }, + "detect-node": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.4.tgz", + "integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==", + "dev": true + }, + "diffie-hellman": { + "version": "5.0.3", + "resolved": "http://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + } + }, + "dns-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", + "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=", + "dev": true + }, + "dns-packet": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz", + "integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==", + "dev": true, + "requires": { + "ip": "^1.1.0", + "safe-buffer": "^5.0.1" + } + }, + "dns-txt": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", + "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", + "dev": true, + "requires": { + "buffer-indexof": "^1.0.0" + } + }, + "dom-converter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", + "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", + "dev": true, + "requires": { + "utila": "~0.4" + } + }, + "dom-serializer": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", + "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=", + "dev": true, + "requires": { + "domelementtype": "~1.1.1", + "entities": "~1.1.1" + }, + "dependencies": { + "domelementtype": { + "version": "1.1.3", + "resolved": "http://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz", + "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=", + "dev": true + } + } + }, + "domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", + "dev": true + }, + "domelementtype": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.2.1.tgz", + "integrity": "sha512-SQVCLFS2E7G5CRCMdn6K9bIhRj1bS6QBWZfF0TUPh4V/BbqrQ619IdSS3/izn0FZ+9l+uODzaZjb08fjOfablA==", + "dev": true + }, + "domhandler": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.1.0.tgz", + "integrity": "sha1-0mRvXlf2w7qxHPbLBdPArPdBJZQ=", + "dev": true, + "requires": { + "domelementtype": "1" + } + }, + "domutils": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", + "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", + "dev": true, + "requires": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "duplexify": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.6.1.tgz", + "integrity": "sha512-vM58DwdnKmty+FSPzT14K9JXb90H+j5emaR4KYbr2KTIz00WHGbWOe5ghQTx233ZCLZtrGDALzKwcjEtSt35mA==", + "dev": true, + "requires": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "http://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", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "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" + } + } + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", + "dev": true + }, + "elliptic": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.1.tgz", + "integrity": "sha512-BsXLz5sqX8OHcsh7CqBMztyXARmGQ3LWPtGjJi6DiJHq5C/qvi9P3OqgswKSDftbu8+IoI/QDTAm2fFnQ9SZSQ==", + "dev": true, + "requires": { + "bn.js": "^4.4.0", + "brorand": "^1.0.1", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.0" + } + }, + "emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", + "dev": true + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "dev": true + }, + "end-of-stream": { + "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" + } + }, + "enhanced-resolve": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz", + "integrity": "sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.4.0", + "tapable": "^1.0.0" + } + }, + "entities": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", + "dev": true + }, + "errno": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", + "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", + "dev": true, + "requires": { + "prr": "~1.0.1" + } + }, + "es-abstract": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.12.0.tgz", + "integrity": "sha512-C8Fx/0jFmV5IPoMOFPA9P9G5NtqW+4cOPit3MIuvR2t7Ag2K15EJTpxnHAYTzL+aYQJIESYeXZmDBfOBE1HcpA==", + "dev": true, + "requires": { + "es-to-primitive": "^1.1.1", + "function-bind": "^1.1.1", + "has": "^1.0.1", + "is-callable": "^1.1.3", + "is-regex": "^1.0.4" + } + }, + "es-to-primitive": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz", + "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "eslint-scope": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.0.tgz", + "integrity": "sha512-1G6UTDi7Jc1ELFwnR58HV4fK9OQK4S6N985f166xqXxpjU6plxFISJa2Ba9KCQuFa8RCnj/lSFJbHo7UFDBnUA==", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "esrecurse": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", + "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "dev": true, + "requires": { + "estraverse": "^4.1.0" + } + }, + "estraverse": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", + "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", + "dev": true + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "dev": true + }, + "eventemitter3": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.0.tgz", + "integrity": "sha512-ivIvhpq/Y0uSjcHDcOIccjmYjGLcP09MFGE7ysAwkAvkXfpZlC985pH2/ui64DKazbTW/4kN3yqozUxlXzI6cA==", + "dev": true + }, + "events": { + "version": "1.1.1", + "resolved": "http://registry.npmjs.org/events/-/events-1.1.1.tgz", + "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=", + "dev": true + }, + "eventsource": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.0.7.tgz", + "integrity": "sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ==", + "dev": true, + "requires": { + "original": "^1.0.0" + } + }, + "evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dev": true, + "requires": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "execa": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.10.0.tgz", + "integrity": "sha512-7XOMnz8Ynx1gGo/3hyV9loYNPWM94jG3+3T3Y8tsfSstFmETmENCMU/A/zj8Lyaj1lkgEepKepvd6240tBRvlw==", + "dev": true, + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "express": { + "version": "4.16.4", + "resolved": "https://registry.npmjs.org/express/-/express-4.16.4.tgz", + "integrity": "sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg==", + "dev": true, + "requires": { + "accepts": "~1.3.5", + "array-flatten": "1.1.1", + "body-parser": "1.18.3", + "content-disposition": "0.5.2", + "content-type": "~1.0.4", + "cookie": "0.3.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.1.1", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.4", + "qs": "6.5.2", + "range-parser": "~1.2.0", + "safe-buffer": "5.1.2", + "send": "0.16.2", + "serve-static": "1.13.2", + "setprototypeof": "1.1.0", + "statuses": "~1.4.0", + "type-is": "~1.6.16", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "dependencies": { + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", + "dev": true + } + } + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "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 + }, + "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 + }, + "faye-websocket": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", + "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", + "dev": true, + "requires": { + "websocket-driver": ">=0.5.1" + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "finalhandler": { + "version": "1.1.1", + "resolved": "http://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", + "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", + "dev": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", + "statuses": "~1.4.0", + "unpipe": "~1.0.0" + } + }, + "find-cache-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-1.0.0.tgz", + "integrity": "sha1-kojj6ePMN0hxfTnq3hfPcfww7m8=", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^1.0.0", + "pkg-dir": "^2.0.0" + } + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "flush-write-stream": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.0.3.tgz", + "integrity": "sha512-calZMC10u0FMUqoiunI2AiGIIUtUIvifNwkHhNupZH4cbNnW1Itkoh/Nf5HFYmDrwWPjrUxpkZT0KhuCq0jmGw==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.4" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "http://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", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "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" + } + } + } + }, + "follow-redirects": { + "version": "1.5.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.9.tgz", + "integrity": "sha512-Bh65EZI/RU8nx0wbYF9shkFZlqLP+6WT/5FnA3cE/djNSuKNHJEinGGZgu/cQEkeeb2GdFOgenAmn8qaqYke2w==", + "dev": true, + "requires": { + "debug": "=3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", + "dev": true + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "requires": { + "map-cache": "^0.2.2" + } + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "dev": true + }, + "from2": { + "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" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "http://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", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "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" + } + } + } + }, + "fs-write-stream-atomic": { + "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", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fsevents": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.4.tgz", + "integrity": "sha512-z8H8/diyk76B7q5wg+Ud0+CqzcAF3mBBI/bA5ne5zrRUUIvNkJY//D3BqyH571KuAC4Nr7Rw7CjWX4r0y9DvNg==", + "dev": true, + "optional": true, + "requires": { + "nan": "^2.9.2", + "node-pre-gyp": "^0.10.0" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "dev": true + }, + "aproba": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "chownr": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "debug": { + "version": "2.6.9", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ms": "2.0.0" + } + }, + "deep-extend": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "optional": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "fs-minipass": { + "version": "1.2.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "glob": { + "version": "7.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "iconv-lite": { + "version": "0.4.21", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safer-buffer": "^2.1.0" + } + }, + "ignore-walk": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true, + "dev": true + }, + "ini": { + "version": "1.3.5", + "bundled": true, + "dev": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true, + "dev": true + }, + "minipass": { + "version": "2.2.4", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "^5.1.1", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "needle": { + "version": "2.2.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "debug": "^2.1.2", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.10.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.0", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.1.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npm-bundled": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "npm-packlist": { + "version": "1.1.10", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "osenv": { + "version": "0.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "process-nextick-args": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "rc": { + "version": "1.2.7", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "deep-extend": "^0.5.1", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "rimraf": { + "version": "2.6.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "glob": "^7.0.5" + } + }, + "safe-buffer": { + "version": "5.1.1", + "bundled": true, + "dev": true + }, + "safer-buffer": { + "version": "2.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "sax": { + "version": "1.2.4", + "bundled": true, + "dev": true, + "optional": true + }, + "semver": { + "version": "5.5.0", + "bundled": true, + "dev": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "tar": { + "version": "4.4.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "chownr": "^1.0.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.2.4", + "minizlib": "^1.1.0", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.1", + "yallist": "^3.0.2" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "wide-align": { + "version": "1.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "string-width": "^1.0.2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "yallist": { + "version": "3.0.2", + "bundled": true, + "dev": true + } + } + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", + "dev": true + }, + "get-stream": { + "version": "3.0.0", + "resolved": "http://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true + }, + "glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "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" + }, + "dependencies": { + "is-glob": { + "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" + } + } + } + }, + "global-modules-path": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/global-modules-path/-/global-modules-path-2.3.0.tgz", + "integrity": "sha512-HchvMJNYh9dGSCy8pOQ2O8u/hoXaL+0XhnrwH0RyLiSXMMTl9W3N6KUU73+JFOg5PGjtzl6VZzUQsnrpm7Szag==", + "dev": true + }, + "globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "dev": true, + "requires": { + "array-union": "^1.0.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "http://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "dev": true + }, + "handle-thing": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-1.2.5.tgz", + "integrity": "sha1-/Xqtcmvxpf0W38KbL3pmAdJxOcQ=", + "dev": true + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "has-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", + "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", + "dev": true + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "hash-base": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", + "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "hash.js": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.5.tgz", + "integrity": "sha512-eWI5HG9Np+eHV1KQhisXWwM+4EPPYe5dFX1UZZH7k/E3JzDEazVH+VGlZi6R94ZqImq+A3D1mCEtrFIfg/E7sA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "he": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", + "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", + "dev": true + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "dev": true, + "requires": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "http://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", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "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" + } + } + } + }, + "html-entities": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.2.1.tgz", + "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=", + "dev": true + }, + "html-minifier": { + "version": "3.5.20", + "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.20.tgz", + "integrity": "sha512-ZmgNLaTp54+HFKkONyLFEfs5dd/ZOtlquKaTnqIWFmx3Av5zG6ZPcV2d0o9XM2fXOTxxIf6eDcwzFFotke/5zA==", + "dev": true, + "requires": { + "camel-case": "3.0.x", + "clean-css": "4.2.x", + "commander": "2.17.x", + "he": "1.1.x", + "param-case": "2.1.x", + "relateurl": "0.2.x", + "uglify-js": "3.4.x" + } + }, + "html-webpack-plugin": { + "version": "3.2.0", + "resolved": "http://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-3.2.0.tgz", + "integrity": "sha1-sBq71yOsqqeze2r0SS69oD2d03s=", + "dev": true, + "requires": { + "html-minifier": "^3.2.3", + "loader-utils": "^0.2.16", + "lodash": "^4.17.3", + "pretty-error": "^2.0.2", + "tapable": "^1.0.0", + "toposort": "^1.0.0", + "util.promisify": "1.0.0" + } + }, + "htmlparser2": { + "version": "3.3.0", + "resolved": "http://registry.npmjs.org/htmlparser2/-/htmlparser2-3.3.0.tgz", + "integrity": "sha1-zHDQWln2VC5D8OaFyYLhTJJKnv4=", + "dev": true, + "requires": { + "domelementtype": "1", + "domhandler": "2.1", + "domutils": "1.1", + "readable-stream": "1.0" + }, + "dependencies": { + "domutils": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.1.6.tgz", + "integrity": "sha1-vdw94Jm5ou+sxRxiPyj0FuzFdIU=", + "dev": true, + "requires": { + "domelementtype": "1" + } + } + } + }, + "http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=", + "dev": true + }, + "http-errors": { + "version": "1.6.3", + "resolved": "http://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + } + }, + "http-parser-js": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.0.tgz", + "integrity": "sha512-cZdEF7r4gfRIq7ezX9J0T+kQmJNOub71dWbgAXVHDct80TKP4MCETtZQ31xyv38UwgzkWPYF/Xc0ge55dW9Z9w==", + "dev": true + }, + "http-proxy": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.17.0.tgz", + "integrity": "sha512-Taqn+3nNvYRfJ3bGvKfBSRwy1v6eePlm3oc/aWVxZp57DQr5Eq3xhKJi7Z4hZpS8PC3H4qI+Yly5EmFacGuA/g==", + "dev": true, + "requires": { + "eventemitter3": "^3.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + } + }, + "http-proxy-middleware": { + "version": "0.18.0", + "resolved": "http://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.18.0.tgz", + "integrity": "sha512-Fs25KVMPAIIcgjMZkVHJoKg9VcXcC1C8yb9JUgeDvVXY0S/zgVIhMb+qVswDIgtJe2DfckMSY2d6TuTEutlk6Q==", + "dev": true, + "requires": { + "http-proxy": "^1.16.2", + "is-glob": "^4.0.0", + "lodash": "^4.17.5", + "micromatch": "^3.1.9" + } + }, + "https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", + "dev": true + }, + "iconv-lite": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", + "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ieee754": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.12.tgz", + "integrity": "sha512-GguP+DRY+pJ3soyIiGPTvdiVXjZ+DbXOxGpXn3eMvNW4x4irjqXm4wHKscC+TfxSJ0yw/S1F24tqdMNsMZTiLA==", + "dev": true + }, + "iferr": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", + "dev": true + }, + "import-local": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", + "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", + "dev": true, + "requires": { + "pkg-dir": "^3.0.0", + "resolve-cwd": "^2.0.0" + }, + "dependencies": { + "find-up": { + "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" + } + }, + "locate-path": { + "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" + } + }, + "p-limit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.0.0.tgz", + "integrity": "sha512-fl5s52lI5ahKCernzzIyAP0QAZbGIovtVHGwpcu1Jr/EpzLVDI2myISHwGqK7m8uQFugVWSrbxH7XnhGtvEc+A==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "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" + } + }, + "p-try": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz", + "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==", + "dev": true + }, + "pkg-dir": { + "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" + } + } + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "indexof": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", + "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", + "dev": true + }, + "inflight": { + "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" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "internal-ip": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-3.0.1.tgz", + "integrity": "sha512-NXXgESC2nNVtU+pqmC9e6R8B1GpKxzsAQhffvh5AL79qKnodd+L7tnEQmTiUAVngqLalPbSqRA7XGIEL5nCd0Q==", + "dev": true, + "requires": { + "default-gateway": "^2.6.0", + "ipaddr.js": "^1.5.2" + } + }, + "interpret": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz", + "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=", + "dev": true + }, + "invert-kv": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", + "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", + "dev": true + }, + "ip": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", + "dev": true + }, + "ip-regex": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", + "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", + "dev": true + }, + "ipaddr.js": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.8.0.tgz", + "integrity": "sha1-6qM9bd16zo9/b+DJygRA5wZzix4=", + "dev": true + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-callable": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", + "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==", + "dev": true + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-date-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", + "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", + "dev": true + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "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 + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "is-glob": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", + "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-path-cwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", + "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", + "dev": true + }, + "is-path-in-cwd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", + "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", + "dev": true, + "requires": { + "is-path-inside": "^1.0.0" + } + }, + "is-path-inside": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", + "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", + "dev": true, + "requires": { + "path-is-inside": "^1.0.1" + } + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "is-regex": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", + "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", + "dev": true, + "requires": { + "has": "^1.0.1" + } + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, + "is-symbol": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", + "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", + "dev": true, + "requires": { + "has-symbols": "^1.0.0" + } + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "dev": true + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "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 + }, + "json3": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", + "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=", + "dev": true + }, + "json5": { + "version": "0.5.1", + "resolved": "http://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", + "dev": true + }, + "killable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", + "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + }, + "lcid": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", + "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", + "dev": true, + "requires": { + "invert-kv": "^2.0.0" + } + }, + "loader-runner": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.3.1.tgz", + "integrity": "sha512-By6ZFY7ETWOc9RFaAIb23IjJVcM4dvJC/N57nmdz9RSkMXvAXGI7SyVlAw3v8vjtDRlqThgVDVmTnr9fqMlxkw==", + "dev": true + }, + "loader-utils": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", + "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", + "dev": true, + "requires": { + "big.js": "^3.1.3", + "emojis-list": "^2.0.0", + "json5": "^0.5.0", + "object-assign": "^4.0.1" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "dev": true + }, + "lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=", + "dev": true + }, + "loglevel": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.1.tgz", + "integrity": "sha1-4PyVEztu8nbNyIh82vJKpvFW+Po=", + "dev": true + }, + "lower-case": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", + "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=", + "dev": true + }, + "lru-cache": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz", + "integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==", + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "make-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, + "map-age-cleaner": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.2.tgz", + "integrity": "sha512-UN1dNocxQq44IhJyMI4TU8phc2m9BddacHRPRjKGLYaF0jqd3xLz0jS0skpAU9WgYyoR4gHtUpzytNBS385FWQ==", + "dev": true, + "requires": { + "p-defer": "^1.0.0" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dev": true, + "requires": { + "object-visit": "^1.0.0" + } + }, + "md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "media-typer": { + "version": "0.3.0", + "resolved": "http://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "dev": true + }, + "mem": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-4.0.0.tgz", + "integrity": "sha512-WQxG/5xYc3tMbYLXoXPm81ET2WDULiU5FxbuIoNbJqLOOI8zehXFdZuiUEgfdrU2mVB1pxBZUGlYORSrpuJreA==", + "dev": true, + "requires": { + "map-age-cleaner": "^0.1.1", + "mimic-fn": "^1.0.0", + "p-is-promise": "^1.1.0" + } + }, + "memory-fs": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "dev": true, + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "http://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", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "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" + } + } + } + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", + "dev": true + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + } + }, + "mime": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", + "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==", + "dev": true + }, + "mime-db": { + "version": "1.37.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.37.0.tgz", + "integrity": "sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg==", + "dev": true + }, + "mime-types": { + "version": "2.1.21", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.21.tgz", + "integrity": "sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg==", + "dev": true, + "requires": { + "mime-db": "~1.37.0" + } + }, + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "dev": true + }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", + "dev": true + }, + "minimatch": { + "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" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + }, + "mississippi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-2.0.0.tgz", + "integrity": "sha512-zHo8v+otD1J10j/tC+VNoGK9keCuByhKovAvdn74dmxJl9+mWHnx6EMsDN4lgRoMI/eYo2nchAxniIbUPb5onw==", + "dev": true, + "requires": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^2.0.1", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + } + }, + "mixin-deep": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", + "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", + "dev": true, + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "move-concurrently": { + "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", + "fs-write-stream-atomic": "^1.0.8", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.3" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "multicast-dns": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", + "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", + "dev": true, + "requires": { + "dns-packet": "^1.3.1", + "thunky": "^1.0.2" + } + }, + "multicast-dns-service-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", + "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", + "dev": true + }, + "nan": { + "version": "2.11.1", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.11.1.tgz", + "integrity": "sha512-iji6k87OSXa0CcrLl9z+ZiYSuR2o+c0bGuNmXdrhTQTakxytAFsC56SArGYoiHlJlFoHSnvmhpceZJaXkVuOtA==", + "dev": true, + "optional": true + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + } + }, + "negotiator": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", + "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=", + "dev": true + }, + "neo-async": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.0.tgz", + "integrity": "sha512-MFh0d/Wa7vkKO3Y3LlacqAEeHK0mckVqzDieUKTT+KGxi+zIpeVsFxymkIiRpbpDziHc290Xr9A1O4Om7otoRA==", + "dev": true + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "no-case": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", + "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", + "dev": true, + "requires": { + "lower-case": "^1.1.1" + } + }, + "node-forge": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.7.5.tgz", + "integrity": "sha512-MmbQJ2MTESTjt3Gi/3yG1wGpIMhUfcIypUCGtTizFR9IiccFwxSpfp0vtIZlkFclEqERemxfnSdZEMR9VqqEFQ==", + "dev": true + }, + "node-libs-browser": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.1.0.tgz", + "integrity": "sha512-5AzFzdoIMb89hBGMZglEegffzgRg+ZFoUmisQ8HI4j1KDdpx13J0taNp2y9xPbur6W61gepGDDotGBVQ7mfUCg==", + "dev": true, + "requires": { + "assert": "^1.1.1", + "browserify-zlib": "^0.2.0", + "buffer": "^4.3.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.11.0", + "domain-browser": "^1.1.1", + "events": "^1.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "0.0.0", + "process": "^0.11.10", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.3.3", + "stream-browserify": "^2.0.1", + "stream-http": "^2.7.2", + "string_decoder": "^1.0.0", + "timers-browserify": "^2.0.4", + "tty-browserify": "0.0.0", + "url": "^0.11.0", + "util": "^0.10.3", + "vm-browserify": "0.0.4" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "http://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", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "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" + } + } + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "requires": { + "path-key": "^2.0.0" + } + }, + "nth-check": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", + "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", + "dev": true, + "requires": { + "boolbase": "~1.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "object-keys": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.12.tgz", + "integrity": "sha512-FTMyFUm2wBcGHnH2eXmz7tC6IwlqQZ6mVZ+6dm6vZ4IQIHjs6FdNsQBuKGPuUUUY6NfJw2PshC08Tn6LzLDOag==", + "dev": true + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, + "requires": { + "isobject": "^3.0.0" + } + }, + "object.getownpropertydescriptors": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz", + "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "es-abstract": "^1.5.1" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "dev": true + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } + }, + "on-headers": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz", + "integrity": "sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c=", + "dev": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "opn": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.4.0.tgz", + "integrity": "sha512-YF9MNdVy/0qvJvDtunAOzFw9iasOQHpVthTCvGzxt61Il64AYSGdK+rYwld7NAfk9qJ7dt+hymBNSc9LNYS+Sw==", + "dev": true, + "requires": { + "is-wsl": "^1.1.0" + } + }, + "original": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz", + "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==", + "dev": true, + "requires": { + "url-parse": "^1.4.3" + } + }, + "os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", + "dev": true + }, + "os-locale": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.0.1.tgz", + "integrity": "sha512-7g5e7dmXPtzcP4bgsZ8ixDVqA7oWYuEz4lOSujeWyliPai4gfVDiFIcwBg3aGCPnmSGfzOKTK3ccPn0CKv3DBw==", + "dev": true, + "requires": { + "execa": "^0.10.0", + "lcid": "^2.0.0", + "mem": "^4.0.0" + } + }, + "p-defer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", + "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", + "dev": true + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true + }, + "p-is-promise": { + "version": "1.1.0", + "resolved": "http://registry.npmjs.org/p-is-promise/-/p-is-promise-1.1.0.tgz", + "integrity": "sha1-nJRWmJ6fZYgBewQ01WCXZ1w9oF4=", + "dev": true + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-map": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz", + "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==", + "dev": true + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + }, + "pako": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.6.tgz", + "integrity": "sha512-lQe48YPsMJAig+yngZ87Lus+NF+3mtu7DVOBu6b/gHO1YpKwIj5AWjZ/TOS7i46HD/UixzWb1zeWDZfGZ3iYcg==", + "dev": true + }, + "parallel-transform": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.1.0.tgz", + "integrity": "sha1-1BDwZbBdojCB/NEPKIVMKb2jOwY=", + "dev": true, + "requires": { + "cyclist": "~0.2.2", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "http://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", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "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" + } + } + } + }, + "param-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", + "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=", + "dev": true, + "requires": { + "no-case": "^2.2.0" + } + }, + "parse-asn1": { + "version": "5.1.1", + "resolved": "http://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.1.tgz", + "integrity": "sha512-KPx7flKXg775zZpnp9SxJlz00gTd4BmJ2yJufSc44gMCRrRQ7NSzAcSJQfifuOLgW6bEi+ftrALtsgALeB2Adw==", + "dev": true, + "requires": { + "asn1.js": "^4.0.0", + "browserify-aes": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3" + } + }, + "parseurl": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", + "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=", + "dev": true + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true + }, + "path-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", + "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=", + "dev": true + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "dev": true + }, + "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 + }, + "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 + }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "dev": true + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", + "dev": true + }, + "pbkdf2": { + "version": "3.0.17", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", + "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", + "dev": true, + "requires": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "requires": { + "pinkie": "^2.0.0" + } + }, + "pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "dev": true, + "requires": { + "find-up": "^2.1.0" + } + }, + "portfinder": { + "version": "1.0.19", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.19.tgz", + "integrity": "sha512-23aeQKW9KgHe6citUrG3r9HjeX6vls0h713TAa+CwTKZwNIr/pD2ApaxYF4Um3ZZyq4ar+Siv3+fhoHaIwSOSw==", + "dev": true, + "requires": { + "async": "^1.5.2", + "debug": "^2.2.0", + "mkdirp": "0.5.x" + } + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true + }, + "pretty-error": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.1.tgz", + "integrity": "sha1-X0+HyPkeWuPzuoerTPXgOxoX8aM=", + "dev": true, + "requires": { + "renderkid": "^2.0.1", + "utila": "~0.4" + } + }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", + "dev": true + }, + "promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", + "dev": true + }, + "proxy-addr": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.4.tgz", + "integrity": "sha512-5erio2h9jp5CHGwcybmxmVqHmnCBZeewlfJ0pex+UW7Qny7OOZXTtH56TGNyBizkgiOwhJtMKrVzDTeKcySZwA==", + "dev": true, + "requires": { + "forwarded": "~0.1.2", + "ipaddr.js": "1.8.0" + } + }, + "prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", + "dev": true + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true + }, + "public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "pump": { + "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" + } + }, + "pumpify": { + "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", + "pump": "^2.0.0" + } + }, + "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 + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "dev": true + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "dev": true + }, + "querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", + "dev": true + }, + "querystringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.1.0.tgz", + "integrity": "sha512-sluvZZ1YiTLD5jsqZcDmFyV2EwToyXZBfpoVOmktMmW+VEnhgakFHnasVph65fOjGPTWN0Nw3+XQaSeMayr0kg==", + "dev": true + }, + "randombytes": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.6.tgz", + "integrity": "sha512-CIQ5OFxf4Jou6uOKe9t1AOgqpeU5fd70A8NPdHSGeYXqXsPe6peOwI0cUl88RWZ6sP1vPMV3avd/R6cZ5/sP1A==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "dev": true, + "requires": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "range-parser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", + "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=", + "dev": true + }, + "raw-body": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz", + "integrity": "sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw==", + "dev": true, + "requires": { + "bytes": "3.0.0", + "http-errors": "1.6.3", + "iconv-lite": "0.4.23", + "unpipe": "1.0.0" + } + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "http://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", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "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" + } + } + } + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + } + }, + "relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=", + "dev": true + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true + }, + "renderkid": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.2.tgz", + "integrity": "sha512-FsygIxevi1jSiPY9h7vZmBFUbAOcbYm9UwyiLNdVsLRs/5We9Ob5NMPbGYUTWiLq5L+ezlVdE0A8bbME5CWTpg==", + "dev": true, + "requires": { + "css-select": "^1.1.0", + "dom-converter": "~0.2", + "htmlparser2": "~3.3.0", + "strip-ansi": "^3.0.0", + "utila": "^0.4.0" + } + }, + "repeat-element": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "dev": true + }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", + "dev": true + }, + "resolve-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "dev": true, + "requires": { + "resolve-from": "^3.0.0" + } + }, + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "dev": true + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true + }, + "rimraf": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", + "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "dev": true, + "requires": { + "glob": "^7.0.5" + } + }, + "ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "run-queue": { + "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" + } + }, + "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 + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "requires": { + "ret": "~0.1.10" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "schema-utils": { + "version": "0.4.7", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.7.tgz", + "integrity": "sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-keywords": "^3.1.0" + } + }, + "select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=", + "dev": true + }, + "selfsigned": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.4.tgz", + "integrity": "sha512-9AukTiDmHXGXWtWjembZ5NDmVvP2695EtpgbCsxCa68w3c88B+alqbmZ4O3hZ4VWGXeGWzEVdvqgAJD8DQPCDw==", + "dev": true, + "requires": { + "node-forge": "0.7.5" + } + }, + "semver": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", + "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", + "dev": true + }, + "send": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", + "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", + "dev": true, + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.6.2", + "mime": "1.4.1", + "ms": "2.0.0", + "on-finished": "~2.3.0", + "range-parser": "~1.2.0", + "statuses": "~1.4.0" + } + }, + "serialize-javascript": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.5.0.tgz", + "integrity": "sha512-Ga8c8NjAAp46Br4+0oZ2WxJCwIzwP60Gq1YPgU+39PiTVxyed/iKE/zyZI6+UlVYH5Q4PaQdHhcegIFPZTUfoQ==", + "dev": true + }, + "serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", + "dev": true, + "requires": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + } + }, + "serve-static": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", + "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", + "dev": true, + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.2", + "send": "0.16.2" + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "set-value": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", + "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", + "dev": true + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + }, + "sha.js": { + "version": "2.4.11", + "resolved": "http://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "dev": true + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "requires": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "requires": { + "kind-of": "^3.2.0" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "sockjs": { + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.19.tgz", + "integrity": "sha512-V48klKZl8T6MzatbLlzzRNhMepEys9Y4oGFpypBFFn1gLI/QQ9HtLLyWJNbPlwGLelOVOEijUbTTJeLLI59jLw==", + "dev": true, + "requires": { + "faye-websocket": "^0.10.0", + "uuid": "^3.0.1" + } + }, + "sockjs-client": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.3.0.tgz", + "integrity": "sha512-R9jxEzhnnrdxLCNln0xg5uGHqMnkhPSTzUZH2eXcR03S/On9Yvoq2wyUZILRUhZCNVu2PmwWVoyuiPz8th8zbg==", + "dev": true, + "requires": { + "debug": "^3.2.5", + "eventsource": "^1.0.7", + "faye-websocket": "~0.11.1", + "inherits": "^2.0.3", + "json3": "^3.3.2", + "url-parse": "^1.4.3" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "faye-websocket": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.1.tgz", + "integrity": "sha1-8O/hjE9W5PQK/H4Gxxn9XuYYjzg=", + "dev": true, + "requires": { + "websocket-driver": ">=0.5.1" + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + } + } + }, + "source-list-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "source-map-resolve": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", + "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", + "dev": true, + "requires": { + "atob": "^2.1.1", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", + "dev": true + }, + "spdy": { + "version": "3.4.7", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-3.4.7.tgz", + "integrity": "sha1-Qv9B7OXMD5mjpsKKq7c/XDsDrLw=", + "dev": true, + "requires": { + "debug": "^2.6.8", + "handle-thing": "^1.2.5", + "http-deceiver": "^1.2.7", + "safe-buffer": "^5.0.1", + "select-hose": "^2.0.0", + "spdy-transport": "^2.0.18" + } + }, + "spdy-transport": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-2.1.0.tgz", + "integrity": "sha512-bpUeGpZcmZ692rrTiqf9/2EUakI6/kXX1Rpe0ib/DyOzbiexVfXkw6GnvI9hVGvIwVaUhkaBojjCZwLNRGQg1g==", + "dev": true, + "requires": { + "debug": "^2.6.8", + "detect-node": "^2.0.3", + "hpack.js": "^2.1.6", + "obuf": "^1.1.1", + "readable-stream": "^2.2.9", + "safe-buffer": "^5.0.1", + "wbuf": "^1.7.2" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "http://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", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "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" + } + } + } + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.0" + } + }, + "ssri": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-5.3.0.tgz", + "integrity": "sha512-XRSIPqLij52MtgoQavH/x/dU1qVKtWUAAZeOHsR9c2Ddi4XerFy3mc1alf+dLJKl9EUIm/Ht+EowFkTUOA6GAQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.1" + } + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "statuses": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", + "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", + "dev": true + }, + "stream-browserify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", + "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=", + "dev": true, + "requires": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "http://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", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "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" + } + } + } + }, + "stream-each": { + "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" + } + }, + "stream-http": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", + "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", + "dev": true, + "requires": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "http://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", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "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" + } + } + } + }, + "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 + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "tapable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.0.tgz", + "integrity": "sha512-IlqtmLVaZA2qab8epUXbVWRn3aB1imbDMJtjB3nu4X0NqPkcY/JH9ZtCBWKHWPxs8Svi9tyo8w2dBoi07qZbBA==", + "dev": true + }, + "text-encoding": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/text-encoding/-/text-encoding-0.7.0.tgz", + "integrity": "sha512-oJQ3f1hrOnbRLOcwKz0Liq2IcrvDeZRHXhd9RgLrsT+DjWY/nty1Hi7v3dtkaEYbPYe0mUoOfzRrMwfXXwgPUA==", + "dev": true + }, + "through2": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", + "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", + "dev": true, + "requires": { + "readable-stream": "^2.1.5", + "xtend": "~4.0.1" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "http://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", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "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" + } + } + } + }, + "thunky": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.0.3.tgz", + "integrity": "sha512-YwT8pjmNcAXBZqrubu22P4FYsh2D4dxRmnWBOL8Jk8bUcRUtc5326kx32tuTmFDAZtLOGEVNl8POAR8j896Iow==", + "dev": true + }, + "timers-browserify": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.10.tgz", + "integrity": "sha512-YvC1SV1XdOUaL6gx5CoGroT3Gu49pK9+TZ38ErPldOWW4j49GI1HKs9DV+KGq/w6y+LZ72W1c8cKz2vzY+qpzg==", + "dev": true, + "requires": { + "setimmediate": "^1.0.4" + } + }, + "to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", + "dev": true + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + }, + "toposort": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/toposort/-/toposort-1.0.7.tgz", + "integrity": "sha1-LmhELZ9k7HILjMieZEOsbKqVACk=", + "dev": true + }, + "tslib": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", + "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==", + "dev": true + }, + "tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", + "dev": true + }, + "type-is": { + "version": "1.6.16", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz", + "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==", + "dev": true, + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.18" + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "uglify-js": { + "version": "3.4.9", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.9.tgz", + "integrity": "sha512-8CJsbKOtEbnJsTyv6LE6m6ZKniqMiFWmm9sRbopbkGs3gMPPfd3Fh8iIA4Ykv5MgaTbqHr4BaoGLJLZNhsrW1Q==", + "dev": true, + "requires": { + "commander": "~2.17.1", + "source-map": "~0.6.1" + } + }, + "uglifyjs-webpack-plugin": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-1.3.0.tgz", + "integrity": "sha512-ovHIch0AMlxjD/97j9AYovZxG5wnHOPkL7T1GKochBADp/Zwc44pEWNqpKl1Loupp1WhFg7SlYmHZRUfdAacgw==", + "dev": true, + "requires": { + "cacache": "^10.0.4", + "find-cache-dir": "^1.0.0", + "schema-utils": "^0.4.5", + "serialize-javascript": "^1.4.0", + "source-map": "^0.6.1", + "uglify-es": "^3.3.4", + "webpack-sources": "^1.1.0", + "worker-farm": "^1.5.2" + }, + "dependencies": { + "commander": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.13.0.tgz", + "integrity": "sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA==", + "dev": true + }, + "uglify-es": { + "version": "3.3.9", + "resolved": "https://registry.npmjs.org/uglify-es/-/uglify-es-3.3.9.tgz", + "integrity": "sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ==", + "dev": true, + "requires": { + "commander": "~2.13.0", + "source-map": "~0.6.1" + } + } + } + }, + "union-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", + "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^0.4.3" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "set-value": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", + "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.1", + "to-object-path": "^0.3.0" + } + } + } + }, + "unique-filename": { + "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" + } + }, + "unique-slug": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.1.tgz", + "integrity": "sha512-n9cU6+gITaVu7VGj1Z8feKMmfAjEAQGhwD9fE3zvpRRa0wEIx8ODYkVGfSc94M2OX00tUFV8wH3zYbm1I8mxFg==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4" + } + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "dev": true + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dev": true, + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + } + } + }, + "upath": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.0.tgz", + "integrity": "sha512-bzpH/oBhoS/QI/YtbkqCg6VEiPYjSZtrHQM6/QnJS6OL9pKUFLqb3aFh4Scvwm45+7iAgiMkLhSbaZxUqmrprw==", + "dev": true + }, + "upper-case": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", + "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=", + "dev": true + }, + "uri-js": { + "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" + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true + }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "dev": true, + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "dev": true + } + } + }, + "url-parse": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.3.tgz", + "integrity": "sha512-rh+KuAW36YKo0vClhQzLLveoj8FwPJNu65xLb7Mrt+eZht0IPT0IXgSv8gcMegZ6NvjJUALf6Mf25POlMwD1Fw==", + "dev": true, + "requires": { + "querystringify": "^2.0.0", + "requires-port": "^1.0.0" + } + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true + }, + "util": { + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", + "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", + "dev": true, + "requires": { + "inherits": "2.0.3" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "util.promisify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", + "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "object.getownpropertydescriptors": "^2.0.3" + } + }, + "utila": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", + "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=", + "dev": true + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "dev": true + }, + "uuid": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", + "dev": true + }, + "v8-compile-cache": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.0.2.tgz", + "integrity": "sha512-1wFuMUIM16MDJRCrpbpuEPTUGmM5QMUg0cr3KFwra2XgOgFcPGDQHDh3CszSCD2Zewc/dh/pamNEW8CbfDebUw==", + "dev": true + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "dev": true + }, + "vm-browserify": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", + "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=", + "dev": true, + "requires": { + "indexof": "0.0.1" + } + }, + "watchpack": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz", + "integrity": "sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==", + "dev": true, + "requires": { + "chokidar": "^2.0.2", + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0" + } + }, + "wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "dev": true, + "requires": { + "minimalistic-assert": "^1.0.0" + } + }, + "webpack": { + "version": "4.23.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.23.1.tgz", + "integrity": "sha512-iE5Cu4rGEDk7ONRjisTOjVHv3dDtcFfwitSxT7evtYj/rANJpt1OuC/Kozh1pBa99AUBr1L/LsaNB+D9Xz3CEg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.7.10", + "@webassemblyjs/helper-module-context": "1.7.10", + "@webassemblyjs/wasm-edit": "1.7.10", + "@webassemblyjs/wasm-parser": "1.7.10", + "acorn": "^5.6.2", + "acorn-dynamic-import": "^3.0.0", + "ajv": "^6.1.0", + "ajv-keywords": "^3.1.0", + "chrome-trace-event": "^1.0.0", + "enhanced-resolve": "^4.1.0", + "eslint-scope": "^4.0.0", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^2.3.0", + "loader-utils": "^1.1.0", + "memory-fs": "~0.4.1", + "micromatch": "^3.1.8", + "mkdirp": "~0.5.0", + "neo-async": "^2.5.0", + "node-libs-browser": "^2.0.0", + "schema-utils": "^0.4.4", + "tapable": "^1.1.0", + "uglifyjs-webpack-plugin": "^1.2.4", + "watchpack": "^1.5.0", + "webpack-sources": "^1.3.0" + }, + "dependencies": { + "loader-utils": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", + "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", + "dev": true, + "requires": { + "big.js": "^3.1.3", + "emojis-list": "^2.0.0", + "json5": "^0.5.0" + } + } + } + }, + "webpack-cli": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.1.2.tgz", + "integrity": "sha512-Cnqo7CeqeSvC6PTdts+dywNi5CRlIPbLx1AoUPK2T6vC1YAugMG3IOoO9DmEscd+Dghw7uRlnzV1KwOe5IrtgQ==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "cross-spawn": "^6.0.5", + "enhanced-resolve": "^4.1.0", + "global-modules-path": "^2.3.0", + "import-local": "^2.0.0", + "interpret": "^1.1.0", + "loader-utils": "^1.1.0", + "supports-color": "^5.5.0", + "v8-compile-cache": "^2.0.2", + "yargs": "^12.0.2" + }, + "dependencies": { + "loader-utils": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", + "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", + "dev": true, + "requires": { + "big.js": "^3.1.3", + "emojis-list": "^2.0.0", + "json5": "^0.5.0" + } + } + } + }, + "webpack-dev-middleware": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.4.0.tgz", + "integrity": "sha512-Q9Iyc0X9dP9bAsYskAVJ/hmIZZQwf/3Sy4xCAZgL5cUkjZmUZLt4l5HpbST/Pdgjn3u6pE7u5OdGd1apgzRujA==", + "dev": true, + "requires": { + "memory-fs": "~0.4.1", + "mime": "^2.3.1", + "range-parser": "^1.0.3", + "webpack-log": "^2.0.0" + }, + "dependencies": { + "mime": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.3.1.tgz", + "integrity": "sha512-OEUllcVoydBHGN1z84yfQDimn58pZNNNXgZlHXSboxMlFvgI6MXSWpWKpFRra7H1HxpVhHTkrghfRW49k6yjeg==", + "dev": true + } + } + }, + "webpack-dev-server": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.1.10.tgz", + "integrity": "sha512-RqOAVjfqZJtQcB0LmrzJ5y4Jp78lv9CK0MZ1YJDTaTmedMZ9PU9FLMQNrMCfVu8hHzaVLVOJKBlGEHMN10z+ww==", + "dev": true, + "requires": { + "ansi-html": "0.0.7", + "bonjour": "^3.5.0", + "chokidar": "^2.0.0", + "compression": "^1.5.2", + "connect-history-api-fallback": "^1.3.0", + "debug": "^3.1.0", + "del": "^3.0.0", + "express": "^4.16.2", + "html-entities": "^1.2.0", + "http-proxy-middleware": "~0.18.0", + "import-local": "^2.0.0", + "internal-ip": "^3.0.1", + "ip": "^1.1.5", + "killable": "^1.0.0", + "loglevel": "^1.4.1", + "opn": "^5.1.0", + "portfinder": "^1.0.9", + "schema-utils": "^1.0.0", + "selfsigned": "^1.9.1", + "serve-index": "^1.7.2", + "sockjs": "0.3.19", + "sockjs-client": "1.3.0", + "spdy": "^3.4.1", + "strip-ansi": "^3.0.0", + "supports-color": "^5.1.0", + "webpack-dev-middleware": "3.4.0", + "webpack-log": "^2.0.0", + "yargs": "12.0.2" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + }, + "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==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + } + } + }, + "webpack-log": { + "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" + } + }, + "webpack-sources": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.3.0.tgz", + "integrity": "sha512-OiVgSrbGu7NEnEvQJJgdSFPl2qWKkWq5lHMhgiToIiN9w34EBnjYzSYs+VbL5KoYiLNtFFa7BZIKxRED3I32pA==", + "dev": true, + "requires": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + } + }, + "websocket-driver": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.0.tgz", + "integrity": "sha1-DK+dLXVdk67gSdS90NP+LMoqJOs=", + "dev": true, + "requires": { + "http-parser-js": ">=0.4.0", + "websocket-extensions": ">=0.1.1" + } + }, + "websocket-extensions": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz", + "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==", + "dev": true + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "worker-farm": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.6.0.tgz", + "integrity": "sha512-6w+3tHbM87WnSWnENBUvA2pxJPLhQUg5LKwUQHq3r+XPhIM+Gh2R5ycbwPCyuGbNg+lPgdcnQUhuC02kJCvffQ==", + "dev": true, + "requires": { + "errno": "~0.1.7" + } + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "http://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "xregexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-4.0.0.tgz", + "integrity": "sha512-PHyM+sQouu7xspQQwELlGwwd05mXUFqwFYfqPO0cC7x4fxyHnnuetmQr6CjJiafIDoH4MogHb9dOoJzR/Y4rFg==", + "dev": true + }, + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", + "dev": true + }, + "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==", + "dev": true + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + }, + "yargs": { + "version": "12.0.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.2.tgz", + "integrity": "sha512-e7SkEx6N6SIZ5c5H22RTZae61qtn3PYUE8JYbBFlK9sYmh3DMQ6E5ygtaG/2BW0JZi4WGgTR2IV5ChqlqrDGVQ==", + "dev": true, + "requires": { + "cliui": "^4.0.0", + "decamelize": "^2.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^1.0.1", + "os-locale": "^3.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1 || ^4.0.0", + "yargs-parser": "^10.1.0" + }, + "dependencies": { + "find-up": { + "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" + } + }, + "locate-path": { + "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" + } + }, + "p-limit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.0.0.tgz", + "integrity": "sha512-fl5s52lI5ahKCernzzIyAP0QAZbGIovtVHGwpcu1Jr/EpzLVDI2myISHwGqK7m8uQFugVWSrbxH7XnhGtvEc+A==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "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" + } + }, + "p-try": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz", + "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==", + "dev": true + } + } + }, + "yargs-parser": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.1.0.tgz", + "integrity": "sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==", + "dev": true, + "requires": { + "camelcase": "^4.1.0" + } + } + } +} diff --git a/backends/conrod_crayon/tools/wasm-template/package.json b/backends/conrod_crayon/tools/wasm-template/package.json new file mode 100644 index 000000000..a63a0e512 --- /dev/null +++ b/backends/conrod_crayon/tools/wasm-template/package.json @@ -0,0 +1,13 @@ +{ + "scripts": { + "build": "webpack", + "serve": "webpack-dev-server" + }, + "devDependencies": { + "text-encoding": "^0.7.0", + "html-webpack-plugin": "^3.2.0", + "webpack": "^4.11.1", + "webpack-cli": "^3.1.1", + "webpack-dev-server": "^3.1.0" + } +} diff --git a/backends/conrod_crayon/tools/wasm-template/run.sh b/backends/conrod_crayon/tools/wasm-template/run.sh new file mode 100755 index 000000000..217fe2247 --- /dev/null +++ b/backends/conrod_crayon/tools/wasm-template/run.sh @@ -0,0 +1,10 @@ +SCRIPT_DIR=$(dirname "$0") +BASE_DIR=$SCRIPT_DIR/../../../../ + +set -e +cargo build --example $1 --target wasm32-unknown-unknown +cp $BASE_DIR/target/wasm32-unknown-unknown/debug/examples/$1.wasm $SCRIPT_DIR/dist/intermediate/native.wasm +wasm-bindgen $SCRIPT_DIR/dist/intermediate/native.wasm --out-dir $SCRIPT_DIR/dist + +cd $SCRIPT_DIR +sudo npm run serve \ No newline at end of file diff --git a/backends/conrod_crayon/tools/wasm-template/webpack.config.js b/backends/conrod_crayon/tools/wasm-template/webpack.config.js new file mode 100644 index 000000000..677158ee7 --- /dev/null +++ b/backends/conrod_crayon/tools/wasm-template/webpack.config.js @@ -0,0 +1,28 @@ +const path = require('path'); +const HtmlWebpackPlugin = require('html-webpack-plugin'); +const webpack = require('webpack'); + +module.exports = { + entry: './index.js', + output: { + path: path.resolve(__dirname, 'dist'), + filename: 'index.js', + }, + plugins: [ + new HtmlWebpackPlugin({ + template: "index.html" + }), + // Have this example work in Edge which doesn't ship `TextEncoder` or + // `TextDecoder` at this time. + new webpack.ProvidePlugin({ + TextDecoder: ['text-encoding', 'TextDecoder'], + TextEncoder: ['text-encoding', 'TextEncoder'] + }) + ], + devServer: { + contentBase: [__dirname, path.join(__dirname, '../..')], + inline:true, + port: 80 + }, + mode: 'development' +}; \ No newline at end of file diff --git a/backends/conrod_example_shared/src/lib.rs b/backends/conrod_example_shared/src/lib.rs index c84cdc94b..3b56a392e 100644 --- a/backends/conrod_example_shared/src/lib.rs +++ b/backends/conrod_example_shared/src/lib.rs @@ -21,7 +21,7 @@ pub struct DemoApp { ball_xy: conrod_core::Point, ball_color: conrod_core::Color, sine_frequency: f32, - rust_logo: conrod_core::image::Id, + pub rust_logo: conrod_core::image::Id, } diff --git a/backends/conrod_glium/examples/image.rs b/backends/conrod_glium/examples/image.rs index 132a7f342..97dc768db 100644 --- a/backends/conrod_glium/examples/image.rs +++ b/backends/conrod_glium/examples/image.rs @@ -80,7 +80,7 @@ fn main() { { let ui = &mut ui.set_widgets(); // Draw a light blue background. - widget::Canvas::new().color(color::LIGHT_BLUE).set(ids.background, ui); + //widget::Canvas::new().color(color::LIGHT_BLUE).set(ids.background, ui); // Instantiate the `Image` at its full size in the middle of the window. widget::Image::new(rust_logo).w_h(w as f64, h as f64).middle().set(ids.rust_logo, ui); } @@ -99,7 +99,7 @@ fn main() { // Load the Rust logo from our assets folder to use as an example image. fn load_rust_logo(display: &glium::Display) -> glium::texture::Texture2d { let assets = find_folder::Search::ParentsThenKids(5, 3).for_folder("assets").unwrap(); - let path = assets.join("images/rust.png"); + let path = assets.join("images/crate.bmp"); let rgba_image = image::open(&std::path::Path::new(&path)).unwrap().to_rgba(); let image_dimensions = rgba_image.dimensions(); let raw_image = glium::texture::RawImage2d::from_raw_rgba_reversed(&rgba_image.into_raw(), image_dimensions); diff --git a/backends/conrod_glium/src/lib.rs b/backends/conrod_glium/src/lib.rs index d51c595dd..30f9e46e3 100644 --- a/backends/conrod_glium/src/lib.rs +++ b/backends/conrod_glium/src/lib.rs @@ -484,7 +484,7 @@ impl Renderer { // // The buffer is only used if an older version was detected, otherwise the text GPU cache // uses the rusttype `data` buffer directly. - //let mut text_data_u8u8u8 = Vec::new(); + let mut text_data_u8u8u8 = Vec::new(); // Determine the texture format that we're using. let opengl_version = display.get_opengl_version(); @@ -542,7 +542,7 @@ impl Renderer { height: std::cmp::min(height, screen_h), } }; - let mut c= 0; + // Draw each primitive in order of depth. while let Some(primitive) = primitives.next_primitive() { let render::Primitive { kind, scizzor, rect, .. } = primitive; @@ -569,8 +569,6 @@ impl Renderer { match kind { render::PrimitiveKind::Rectangle { color } => { - println!("c {:?}",c); - c = c+1; switch_to_plain_state!(); let color = gamma_srgb_to_linear(color.to_fsa()); @@ -598,8 +596,7 @@ impl Renderer { push_v(r, b); push_v(r, t); }, - _ =>{}, - /* + render::PrimitiveKind::TrianglesSingleColor { color, triangles } => { if triangles.is_empty() { continue; @@ -811,7 +808,6 @@ impl Renderer { // We have no special case widgets to handle. render::PrimitiveKind::Other(_) => (), - */ } } @@ -861,7 +857,6 @@ impl Renderer { // // Only submit the vertices if there is enough for at least one triangle. Draw::Plain(slice) => if slice.len() >= NUM_VERTICES_IN_TRIANGLE { - println!("slice {:?}",slice); let vertex_buffer = glium::VertexBuffer::new(facade, slice)?; surface.draw(&vertex_buffer, no_indices, &self.program, &uniforms, &draw_params).unwrap(); }, @@ -871,6 +866,7 @@ impl Renderer { // // Only submit the vertices if there is enough for at least one triangle. Draw::Image(image_id, slice) => if slice.len() >= NUM_VERTICES_IN_TRIANGLE { + println!("slice {:?}",slice); let vertex_buffer = glium::VertexBuffer::new(facade, slice).unwrap(); if let Some(image) = image_map.get(&image_id) { let image_uniforms = uniform! { diff --git a/t.txt b/t.txt index 54955e0a7..51cf49569 100644 --- a/t.txt +++ b/t.txt @@ -1,4 +1,3 @@ -[Vertex { mode: 2, position: [-1.0, 1.0], tex_coords: [0.0, 0.0], color: [0.0, 0.0, 0.0, 0.0] }, Vertex { mode: 2, position: [1.0, -1.0], tex_coords: [0.0, 0.0], color: [0.0, 0.0, 0.0, 0.0] }, Vertex { mode: 2, position: [-1.0, -1.0], tex_coords: [0.0, 0.0], color: [0.0, 0.0, 0.0, 0.0] }, Vertex { mode: 2, position: [-1.0, 1.0], tex_coords: [0.0, 0.0], color: [0.0, 0.0, 0.0, 0.0] }, Vertex { mode: 2, position: [1.0, -1.0], tex_coords: [0.0, 0.0], color: [0.0, 0.0, 0.0, 0.0] }, Vertex { mode: 2, position: [1.0, 1.0], tex_coords: [0.0, 0.0], color: [0.0, 0.0, 0.0, 0.0] }, Vertex { mode: 2, position: [-0.11423909, 0.19985725], tex_coords: [0.0, 0.0], color: [1.0, 1.0, 1.0, 1.0] }, Vertex { mode: 2, position: [0.11423909, -0.19985725], tex_coords: [0.0, 0.0], color: [1.0, 1.0, 1.0, 1.0] }, Vertex { mode: 2, position: [-0.11423909, -0.19985725], tex_coords: [0.0, 0.0], color: [1.0, 1.0, 1.0, 1.0] }, Vertex { mode: 2, position: [-0.11423909, 0.19985725], tex_coords: [0.0, 0.0], color: [1.0, 1.0, 1.0, 1.0] }, Vertex { mode: 2, position: [0.11423909, -0.19985725], tex_coords: [0.0, 0.0], color: [1.0, 1.0, 1.0, 1.0] }, Vertex { mode: 2, position: [0.11423909, 0.19985725], tex_coords: [0.0, 0.0], color: [1.0, 1.0, 1.0, 1.0] }] +[Vertex { pos: [-0.24, 0.34285715], uv: [0.0, 1.0], color: [1.0, 1.0, 1.0, 1.0], mode: [1.0, 0.0] }, Vertex { pos: [0.24, -0.34285715], uv: [1.0, 0.0], color: [1.0, 1.0, 1.0, 1.0], mode: [1.0, 0.0] }, Vertex { pos: [-0.24, -0.34285715], uv: [0.0, 0.0], color: [1.0, 1.0, 1.0, 1.0], mode: [1.0, 0.0] }, Vertex { pos: [-0.24, 0.34285715], uv: [0.0, 1.0], color: [1.0, 1.0, 1.0, 1.0], mode: [1.0, 0.0] }, Vertex { pos: [0.24, -0.34285715], uv: [1.0, 0.0], color: [1.0, 1.0, 1.0, 1.0], mode: [1.0, 0.0] }, Vertex { pos: [0.24, 0.34285715], uv: [1.0, 1.0], color: [1.0, 1.0, 1.0, 1.0], mode: [1.0, 0.0] }] -//crayon -[Vertex { pos: [-1.0, 1.0], uv: [0.0, 0.0], color: [0.0, 0.0, 0.0, 0.0], mode: [2, 0] }, Vertex { pos: [1.0, -1.0], uv: [0.0, 0.0], color: [0.0, 0.0, 0.0, 0.0], mode: [2, 0] }, Vertex { pos: [-1.0, -1.0], uv: [0.0, 0.0], color: [0.0, 0.0, 0.0, 0.0], mode: [2, 0] }, Vertex { pos: [-1.0, 1.0], uv: [0.0, 0.0], color: [0.0, 0.0, 0.0, 0.0], mode: [2, 0] }, Vertex { pos: [1.0, -1.0], uv: [0.0, 0.0], color: [0.0, 0.0, 0.0, 0.0], mode: [2, 0] }, Vertex { pos: [1.0, 1.0], uv: [0.0, 0.0], color: [0.0, 0.0, 0.0, 0.0], mode: [2, 0] }, Vertex { pos: [-0.13333334, 0.1904762], uv: [0.0, 0.0], color: [0.2462014, 0.25415218, 0.23455065, 1.0], mode: [2, 0] }, Vertex { pos: [0.13333334, -0.1904762], uv: [0.0, 0.0], color: [0.2462014, 0.25415218, 0.23455065, 1.0], mode: [2, 0] }, Vertex { pos: [-0.13333334, -0.1904762], uv: [0.0, 0.0], color: [0.2462014, 0.25415218, 0.23455065, 1.0], mode: [2, 0] }, Vertex { pos: [-0.13333334, 0.1904762], uv: [0.0, 0.0], color: [0.2462014, 0.25415218, 0.23455065, 1.0], mode: [2, 0] }, Vertex { pos: [0.13333334, -0.1904762], uv: [0.0, 0.0], color: [0.2462014, 0.25415218, 0.23455065, 1.0], mode: [2, 0] }, Vertex { pos: [0.13333334, 0.1904762], uv: [0.0, 0.0], color: [0.2462014, 0.25415218, 0.23455065, 1.0], mode: [2, 0] }] \ No newline at end of file +[Vertex { mode: 1, position: [-0.3201143, 0.42666668], tex_coords: [0.0, 1.0], color: [1.0, 1.0, 1.0, 1.0] }, Vertex { mode: 1, position: [0.3201143, -0.42666668], tex_coords: [1.0, 0.0], color: [1.0, 1.0, 1.0, 1.0] }, Vertex { mode: 1, position: [-0.3201143, -0.42666668], tex_coords: [0.0, 0.0], color: [1.0, 1.0, 1.0, 1.0] }, Vertex { mode: 1, position: [-0.3201143, 0.42666668], tex_coords: [0.0, 1.0], color: [1.0, 1.0, 1.0, 1.0] }, Vertex { mode: 1, position: [0.3201143, -0.42666668], tex_coords: [1.0, 0.0], color: [1.0, 1.0, 1.0, 1.0] }, Vertex { mode: 1, position: [0.3201143, 0.42666668], tex_coords: [1.0, 1.0], color: [1.0, 1.0, 1.0, 1.0] }] \ No newline at end of file From 3bddb3045e146e516b228e782fddd2d187bc6232 Mon Sep 17 00:00:00 2001 From: alanpoon Date: Wed, 6 Mar 2019 14:18:35 +0800 Subject: [PATCH 08/64] remove find_folder --- backends/conrod_crayon/Cargo.toml | 6 +- backends/conrod_crayon/examples/crayon.rs | 11 +- .../conrod_crayon/src/shaders/conrod.1.fs | 10 +- .../conrod_crayon/src/shaders/conrod.1.vs | 7 +- .../tools/wasm-template/package-lock.json | 995 ++++++++++-------- .../tools/wasm-template/package.json | 9 +- .../tools/wasm-template/webpack.config.js | 4 +- 7 files changed, 565 insertions(+), 477 deletions(-) diff --git a/backends/conrod_crayon/Cargo.toml b/backends/conrod_crayon/Cargo.toml index ae9019f19..183fe6b7a 100644 --- a/backends/conrod_crayon/Cargo.toml +++ b/backends/conrod_crayon/Cargo.toml @@ -23,8 +23,4 @@ serde_json = "1.0" [target.'cfg(target_arch = "wasm32")'.dependencies] -wasm-bindgen = "*" - -[dev-dependencies] -find_folder = "0.3.0" -image = "0.21" \ No newline at end of file +wasm-bindgen = "*" \ No newline at end of file diff --git a/backends/conrod_crayon/examples/crayon.rs b/backends/conrod_crayon/examples/crayon.rs index 46dc2a244..f6d7ad2d8 100644 --- a/backends/conrod_crayon/examples/crayon.rs +++ b/backends/conrod_crayon/examples/crayon.rs @@ -1,7 +1,6 @@ extern crate crayon; extern crate conrod_crayon; extern crate conrod_example_shared; -extern crate find_folder; extern crate conrod_core; use crayon::prelude::*; use crayon::window::device_pixel_ratio; @@ -26,9 +25,6 @@ impl Window { .theme(conrod_example_shared::theme()) .build(); let ids = conrod_example_shared::Ids::new(ui.widget_id_generator()); - let assets = find_folder::Search::KidsThenParents(3, 5).for_folder("assets").unwrap(); - let font_path = assets.join("fonts/NotoSans/NotoSans-Regular.ttf"); - ui.fonts.insert_from_file(font_path).unwrap(); let mut image_map: conrod_core::image::Map = conrod_core::image::Map::new(); let rust_logo = image_map.insert(load_rust_logo()); dbg!("l"); @@ -72,15 +68,16 @@ impl LifecycleListener for Window { let mut ui = &mut self.ui.set_widgets(); const LOGO_SIDE: conrod_core::Scalar = 306.0; + widget::Image::new(self.app.rust_logo) .w_h(LOGO_SIDE, LOGO_SIDE) .middle() .set(self.ids.rust_logo, ui); - /* + /* widget::Rectangle::fill_with([80.0, 80.0],color::ORANGE) .middle() .set(self.ids.rust_logo, ui); - */ + */ } let dpi_factor = device_pixel_ratio() as f64; @@ -100,7 +97,7 @@ main!({ #[cfg(not(target_arch = "wasm32"))] let res = format!("file://{}/../../assets/crayon/resources/", env!("CARGO_MANIFEST_DIR")); #[cfg(target_arch = "wasm32")] - let res = format!("http://localhost:8080/examples/resources/"); + let res = format!("http://localhost:8080/resources/"); let mut params = Params::default(); params.window.title = "CR: RenderTexture".into(); params.window.size = (464, 434).into(); diff --git a/backends/conrod_crayon/src/shaders/conrod.1.fs b/backends/conrod_crayon/src/shaders/conrod.1.fs index cc7f7368f..ad6818528 100644 --- a/backends/conrod_crayon/src/shaders/conrod.1.fs +++ b/backends/conrod_crayon/src/shaders/conrod.1.fs @@ -2,20 +2,20 @@ precision lowp float; varying vec2 v_tex_coords; varying vec4 v_color; -varying float v_mode; -uniform sampler2D tex; +uniform sampler2D tex; +uniform int mode; void main() { // Text - if (v_mode == 0.0) { + if (mode == 0) { gl_FragColor = v_color * vec4(1.0, 1.0, 1.0, texture2D(tex, v_tex_coords).r); // Image - } else if (v_mode == 1.0) { + } else if (mode == 1) { gl_FragColor = texture2D(tex, v_tex_coords); // 2D Geometry - } else if (v_mode == 2.0) { + } else if (mode == 2) { gl_FragColor = v_color; } } \ No newline at end of file diff --git a/backends/conrod_crayon/src/shaders/conrod.1.vs b/backends/conrod_crayon/src/shaders/conrod.1.vs index 80ca365a7..ca69a8bb5 100644 --- a/backends/conrod_crayon/src/shaders/conrod.1.vs +++ b/backends/conrod_crayon/src/shaders/conrod.1.vs @@ -4,15 +4,14 @@ precision lowp float; attribute lowp vec2 Position; attribute lowp vec2 Texcoord0; attribute lowp vec4 Color0; -attribute lowp vec2 Tangent; + varying vec2 v_tex_coords; varying vec4 v_color; -varying float v_mode; void main() { gl_Position = vec4(Position, 0.0, 1.0); - v_tex_coords = (Position + vec2(1.0, 1.0)) / 2.0; + v_tex_coords = Texcoord0; v_color = Color0; - v_mode = Tangent.x; + } \ No newline at end of file diff --git a/backends/conrod_crayon/tools/wasm-template/package-lock.json b/backends/conrod_crayon/tools/wasm-template/package-lock.json index 7d6ef7232..bb312b543 100644 --- a/backends/conrod_crayon/tools/wasm-template/package-lock.json +++ b/backends/conrod_crayon/tools/wasm-template/package-lock.json @@ -2,176 +2,191 @@ "requires": true, "lockfileVersion": 1, "dependencies": { + "@wasm-tool/wasm-pack-plugin": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@wasm-tool/wasm-pack-plugin/-/wasm-pack-plugin-0.2.3.tgz", + "integrity": "sha512-s6ncwvdt0xogRYC2Sg14QZ+6pAT2Lib+nZT0bM2qs7W32DjLgcz3o++aDhHKSl28FdaRhqzOcyAgmBNAskv0sQ==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "command-exists": "^1.2.7", + "watchpack": "^1.6.0" + } + }, "@webassemblyjs/ast": { - "version": "1.7.10", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.7.10.tgz", - "integrity": "sha512-wTUeaByYN2EA6qVqhbgavtGc7fLTOx0glG2IBsFlrFG51uXIGlYBTyIZMf4SPLo3v1bgV/7lBN3l7Z0R6Hswew==", + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.8.5.tgz", + "integrity": "sha512-aJMfngIZ65+t71C3y2nBBg5FFG0Okt9m0XEgWZ7Ywgn1oMAT8cNwx00Uv1cQyHtidq0Xn94R4TAywO+LCQ+ZAQ==", "dev": true, "requires": { - "@webassemblyjs/helper-module-context": "1.7.10", - "@webassemblyjs/helper-wasm-bytecode": "1.7.10", - "@webassemblyjs/wast-parser": "1.7.10" + "@webassemblyjs/helper-module-context": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/wast-parser": "1.8.5" } }, "@webassemblyjs/floating-point-hex-parser": { - "version": "1.7.10", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.7.10.tgz", - "integrity": "sha512-gMsGbI6I3p/P1xL2UxqhNh1ga2HCsx5VBB2i5VvJFAaqAjd2PBTRULc3BpTydabUQEGlaZCzEUQhLoLG7TvEYQ==", + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.8.5.tgz", + "integrity": "sha512-9p+79WHru1oqBh9ewP9zW95E3XAo+90oth7S5Re3eQnECGq59ly1Ri5tsIipKGpiStHsUYmY3zMLqtk3gTcOtQ==", "dev": true }, "@webassemblyjs/helper-api-error": { - "version": "1.7.10", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.7.10.tgz", - "integrity": "sha512-DoYRlPWtuw3yd5BOr9XhtrmB6X1enYF0/54yNvQWGXZEPDF5PJVNI7zQ7gkcKfTESzp8bIBWailaFXEK/jjCsw==", + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.8.5.tgz", + "integrity": "sha512-Za/tnzsvnqdaSPOUXHyKJ2XI7PDX64kWtURyGiJJZKVEdFOsdKUCPTNEVFZq3zJ2R0G5wc2PZ5gvdTRFgm81zA==", "dev": true }, "@webassemblyjs/helper-buffer": { - "version": "1.7.10", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.7.10.tgz", - "integrity": "sha512-+RMU3dt/dPh4EpVX4u5jxsOlw22tp3zjqE0m3ftU2tsYxnPULb4cyHlgaNd2KoWuwasCQqn8Mhr+TTdbtj3LlA==", + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.8.5.tgz", + "integrity": "sha512-Ri2R8nOS0U6G49Q86goFIPNgjyl6+oE1abW1pS84BuhP1Qcr5JqMwRFT3Ah3ADDDYGEgGs1iyb1DGX+kAi/c/Q==", "dev": true }, "@webassemblyjs/helper-code-frame": { - "version": "1.7.10", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.7.10.tgz", - "integrity": "sha512-UiytbpKAULOEab2hUZK2ywXen4gWJVrgxtwY3Kn+eZaaSWaRM8z/7dAXRSoamhKFiBh1uaqxzE/XD9BLlug3gw==", + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.8.5.tgz", + "integrity": "sha512-VQAadSubZIhNpH46IR3yWO4kZZjMxN1opDrzePLdVKAZ+DFjkGD/rf4v1jap744uPVU6yjL/smZbRIIJTOUnKQ==", "dev": true, "requires": { - "@webassemblyjs/wast-printer": "1.7.10" + "@webassemblyjs/wast-printer": "1.8.5" } }, "@webassemblyjs/helper-fsm": { - "version": "1.7.10", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.7.10.tgz", - "integrity": "sha512-w2vDtUK9xeSRtt5+RnnlRCI7wHEvLjF0XdnxJpgx+LJOvklTZPqWkuy/NhwHSLP19sm9H8dWxKeReMR7sCkGZA==", + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.8.5.tgz", + "integrity": "sha512-kRuX/saORcg8se/ft6Q2UbRpZwP4y7YrWsLXPbbmtepKr22i8Z4O3V5QE9DbZK908dh5Xya4Un57SDIKwB9eow==", "dev": true }, "@webassemblyjs/helper-module-context": { - "version": "1.7.10", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.7.10.tgz", - "integrity": "sha512-yE5x/LzZ3XdPdREmJijxzfrf+BDRewvO0zl8kvORgSWmxpRrkqY39KZSq6TSgIWBxkK4SrzlS3BsMCv2s1FpsQ==", - "dev": true + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.8.5.tgz", + "integrity": "sha512-/O1B236mN7UNEU4t9X7Pj38i4VoU8CcMHyy3l2cV/kIF4U5KoHXDVqcDuOs1ltkac90IM4vZdHc52t1x8Yfs3g==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "mamacro": "^0.0.3" + } }, "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.7.10", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.7.10.tgz", - "integrity": "sha512-u5qy4SJ/OrxKxZqJ9N3qH4ZQgHaAzsopsYwLvoWJY6Q33r8PhT3VPyNMaJ7ZFoqzBnZlCcS/0f4Sp8WBxylXfg==", + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.8.5.tgz", + "integrity": "sha512-Cu4YMYG3Ddl72CbmpjU/wbP6SACcOPVbHN1dI4VJNJVgFwaKf1ppeFJrwydOG3NDHxVGuCfPlLZNyEdIYlQ6QQ==", "dev": true }, "@webassemblyjs/helper-wasm-section": { - "version": "1.7.10", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.7.10.tgz", - "integrity": "sha512-Ecvww6sCkcjatcyctUrn22neSJHLN/TTzolMGG/N7S9rpbsTZ8c6Bl98GpSpV77EvzNijiNRHBG0+JO99qKz6g==", + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.8.5.tgz", + "integrity": "sha512-VV083zwR+VTrIWWtgIUpqfvVdK4ff38loRmrdDBgBT8ADXYsEZ5mPQ4Nde90N3UYatHdYoDIFb7oHzMncI02tA==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.7.10", - "@webassemblyjs/helper-buffer": "1.7.10", - "@webassemblyjs/helper-wasm-bytecode": "1.7.10", - "@webassemblyjs/wasm-gen": "1.7.10" + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-buffer": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/wasm-gen": "1.8.5" } }, "@webassemblyjs/ieee754": { - "version": "1.7.10", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.7.10.tgz", - "integrity": "sha512-HRcWcY+YWt4+s/CvQn+vnSPfRaD4KkuzQFt5MNaELXXHSjelHlSEA8ZcqT69q0GTIuLWZ6JaoKar4yWHVpZHsQ==", + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.8.5.tgz", + "integrity": "sha512-aaCvQYrvKbY/n6wKHb/ylAJr27GglahUO89CcGXMItrOBqRarUMxWLJgxm9PJNuKULwN5n1csT9bYoMeZOGF3g==", "dev": true, "requires": { "@xtuc/ieee754": "^1.2.0" } }, "@webassemblyjs/leb128": { - "version": "1.7.10", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.7.10.tgz", - "integrity": "sha512-og8MciYlA8hvzCLR71hCuZKPbVBfLQeHv7ImKZ4nlyxrYbG7uJHYtHiHu6OV9SqrGuD03H/HtXC4Bgdjfm9FHw==", + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.8.5.tgz", + "integrity": "sha512-plYUuUwleLIziknvlP8VpTgO4kqNaH57Y3JnNa6DLpu/sGcP6hbVdfdX5aHAV716pQBKrfuU26BJK29qY37J7A==", "dev": true, "requires": { - "@xtuc/long": "4.2.1" + "@xtuc/long": "4.2.2" } }, "@webassemblyjs/utf8": { - "version": "1.7.10", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.7.10.tgz", - "integrity": "sha512-Ng6Pxv6siyZp635xCSnH3mKmIFgqWPCcGdoo0GBYgyGdxu7cUj4agV7Uu1a8REP66UYUFXJLudeGgd4RvuJAnQ==", + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.8.5.tgz", + "integrity": "sha512-U7zgftmQriw37tfD934UNInokz6yTmn29inT2cAetAsaU9YeVCveWEwhKL1Mg4yS7q//NGdzy79nlXh3bT8Kjw==", "dev": true }, "@webassemblyjs/wasm-edit": { - "version": "1.7.10", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.7.10.tgz", - "integrity": "sha512-e9RZFQlb+ZuYcKRcW9yl+mqX/Ycj9+3/+ppDI8nEE/NCY6FoK8f3dKBcfubYV/HZn44b+ND4hjh+4BYBt+sDnA==", + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.8.5.tgz", + "integrity": "sha512-A41EMy8MWw5yvqj7MQzkDjU29K7UJq1VrX2vWLzfpRHt3ISftOXqrtojn7nlPsZ9Ijhp5NwuODuycSvfAO/26Q==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.7.10", - "@webassemblyjs/helper-buffer": "1.7.10", - "@webassemblyjs/helper-wasm-bytecode": "1.7.10", - "@webassemblyjs/helper-wasm-section": "1.7.10", - "@webassemblyjs/wasm-gen": "1.7.10", - "@webassemblyjs/wasm-opt": "1.7.10", - "@webassemblyjs/wasm-parser": "1.7.10", - "@webassemblyjs/wast-printer": "1.7.10" + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-buffer": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/helper-wasm-section": "1.8.5", + "@webassemblyjs/wasm-gen": "1.8.5", + "@webassemblyjs/wasm-opt": "1.8.5", + "@webassemblyjs/wasm-parser": "1.8.5", + "@webassemblyjs/wast-printer": "1.8.5" } }, "@webassemblyjs/wasm-gen": { - "version": "1.7.10", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.7.10.tgz", - "integrity": "sha512-M0lb6cO2Y0PzDye/L39PqwV+jvO+2YxEG5ax+7dgq7EwXdAlpOMx1jxyXJTScQoeTpzOPIb+fLgX/IkLF8h2yw==", + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.8.5.tgz", + "integrity": "sha512-BCZBT0LURC0CXDzj5FXSc2FPTsxwp3nWcqXQdOZE4U7h7i8FqtFK5Egia6f9raQLpEKT1VL7zr4r3+QX6zArWg==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.7.10", - "@webassemblyjs/helper-wasm-bytecode": "1.7.10", - "@webassemblyjs/ieee754": "1.7.10", - "@webassemblyjs/leb128": "1.7.10", - "@webassemblyjs/utf8": "1.7.10" + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/ieee754": "1.8.5", + "@webassemblyjs/leb128": "1.8.5", + "@webassemblyjs/utf8": "1.8.5" } }, "@webassemblyjs/wasm-opt": { - "version": "1.7.10", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.7.10.tgz", - "integrity": "sha512-R66IHGCdicgF5ZliN10yn5HaC7vwYAqrSVJGjtJJQp5+QNPBye6heWdVH/at40uh0uoaDN/UVUfXK0gvuUqtVg==", + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.8.5.tgz", + "integrity": "sha512-HKo2mO/Uh9A6ojzu7cjslGaHaUU14LdLbGEKqTR7PBKwT6LdPtLLh9fPY33rmr5wcOMrsWDbbdCHq4hQUdd37Q==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.7.10", - "@webassemblyjs/helper-buffer": "1.7.10", - "@webassemblyjs/wasm-gen": "1.7.10", - "@webassemblyjs/wasm-parser": "1.7.10" + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-buffer": "1.8.5", + "@webassemblyjs/wasm-gen": "1.8.5", + "@webassemblyjs/wasm-parser": "1.8.5" } }, "@webassemblyjs/wasm-parser": { - "version": "1.7.10", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.7.10.tgz", - "integrity": "sha512-AEv8mkXVK63n/iDR3T693EzoGPnNAwKwT3iHmKJNBrrALAhhEjuPzo/lTE4U7LquEwyvg5nneSNdTdgrBaGJcA==", + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.8.5.tgz", + "integrity": "sha512-pi0SYE9T6tfcMkthwcgCpL0cM9nRYr6/6fjgDtL6q/ZqKHdMWvxitRi5JcZ7RI4SNJJYnYNaWy5UUrHQy998lw==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.7.10", - "@webassemblyjs/helper-api-error": "1.7.10", - "@webassemblyjs/helper-wasm-bytecode": "1.7.10", - "@webassemblyjs/ieee754": "1.7.10", - "@webassemblyjs/leb128": "1.7.10", - "@webassemblyjs/utf8": "1.7.10" + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-api-error": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/ieee754": "1.8.5", + "@webassemblyjs/leb128": "1.8.5", + "@webassemblyjs/utf8": "1.8.5" } }, "@webassemblyjs/wast-parser": { - "version": "1.7.10", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.7.10.tgz", - "integrity": "sha512-YTPEtOBljkCL0VjDp4sHe22dAYSm3ZwdJ9+2NTGdtC7ayNvuip1wAhaAS8Zt9Q6SW9E5Jf5PX7YE3XWlrzR9cw==", + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.8.5.tgz", + "integrity": "sha512-daXC1FyKWHF1i11obK086QRlsMsY4+tIOKgBqI1lxAnkp9xe9YMcgOxm9kLe+ttjs5aWV2KKE1TWJCN57/Btsg==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.7.10", - "@webassemblyjs/floating-point-hex-parser": "1.7.10", - "@webassemblyjs/helper-api-error": "1.7.10", - "@webassemblyjs/helper-code-frame": "1.7.10", - "@webassemblyjs/helper-fsm": "1.7.10", - "@xtuc/long": "4.2.1" + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/floating-point-hex-parser": "1.8.5", + "@webassemblyjs/helper-api-error": "1.8.5", + "@webassemblyjs/helper-code-frame": "1.8.5", + "@webassemblyjs/helper-fsm": "1.8.5", + "@xtuc/long": "4.2.2" } }, "@webassemblyjs/wast-printer": { - "version": "1.7.10", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.7.10.tgz", - "integrity": "sha512-mJ3QKWtCchL1vhU/kZlJnLPuQZnlDOdZsyP0bbLWPGdYsQDnSBvyTLhzwBA3QAMlzEL9V4JHygEmK6/OTEyytA==", + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.8.5.tgz", + "integrity": "sha512-w0U0pD4EhlnvRyeJzBqaVSJAo9w/ce7/WPogeXLzGkO6hzhr4GnQIZ4W4uUt5b9ooAaXPtnXlj0gzsXEOUNYMg==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.7.10", - "@webassemblyjs/wast-parser": "1.7.10", - "@xtuc/long": "4.2.1" + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/wast-parser": "1.8.5", + "@xtuc/long": "4.2.2" } }, "@xtuc/ieee754": { @@ -181,9 +196,9 @@ "dev": true }, "@xtuc/long": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.1.tgz", - "integrity": "sha512-FZdkNBDqBRHKQ2MEbSC17xnPFOhZxeJ2YGSfr2BKf3sujG49Qe3bB+rGCwQfIaA7WHnGeGkSijX4FuBCdrzW/g==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", "dev": true }, "accepts": { @@ -197,19 +212,16 @@ } }, "acorn": { - "version": "5.7.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", - "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.1.1.tgz", + "integrity": "sha512-jPTiwtOxaHNaAPg/dmrJ/beuzLRnXtB0kQPQ8JpotKJgTB6rX6c8mlf315941pyjBSaPg8NHXS9fhP4u17DpGA==", "dev": true }, "acorn-dynamic-import": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-3.0.0.tgz", - "integrity": "sha512-zVWV8Z8lislJoOKKqdNMOB+s6+XV5WERty8MnKBeFgwA+19XJjJHs2RP5dzM57FftIs+jQnRToLiWazKr6sSWg==", - "dev": true, - "requires": { - "acorn": "^5.0.0" - } + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-4.0.0.tgz", + "integrity": "sha512-d3OEjQV4ROpoflsnUA8HozoIR504TFxNivYEUi6uwz0IYhBkTDXGuWlNdMtybRt3nqVx/L6XqMt0FxkXuWKZhw==", + "dev": true }, "ajv": { "version": "6.5.4", @@ -256,7 +268,7 @@ "ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "integrity": "sha1-QfuyAkPlCxK+DwS43tvwdSDOhB0=", "dev": true, "requires": { "color-convert": "^1.9.0" @@ -265,7 +277,7 @@ "anymatch": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "integrity": "sha1-vLJLTzeTTZqnrBe0ra+J58du8us=", "dev": true, "requires": { "micromatch": "^3.1.4", @@ -287,7 +299,7 @@ "arr-flatten": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "integrity": "sha1-NgSLv/TntH4TZkQxbJlmnqWukfE=", "dev": true }, "arr-union": { @@ -381,7 +393,7 @@ "atob": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "integrity": "sha1-bZUX654DDSQ2ZmZR6GvZ9vE1M8k=", "dev": true }, "balanced-match": { @@ -393,7 +405,7 @@ "base": { "version": "0.11.2", "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "integrity": "sha1-e95c7RRbbVUakNuH+DxVi060io8=", "dev": true, "requires": { "cache-base": "^1.0.1", @@ -417,7 +429,7 @@ "is-accessor-descriptor": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=", "dev": true, "requires": { "kind-of": "^6.0.0" @@ -426,7 +438,7 @@ "is-data-descriptor": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=", "dev": true, "requires": { "kind-of": "^6.0.0" @@ -435,7 +447,7 @@ "is-descriptor": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=", "dev": true, "requires": { "is-accessor-descriptor": "^1.0.0", @@ -460,19 +472,19 @@ "big.js": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", - "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==", + "integrity": "sha1-pfwpi4G54Nyi5FiCR4S2XFK6WI4=", "dev": true }, "binary-extensions": { "version": "1.12.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.12.0.tgz", - "integrity": "sha512-DYWGk01lDcxeS/K9IHPGWfT8PsJmbXRtRd2Sx72Tnb8pcYZQFF1oSDb8hJtS1vhp212q1Rzi5dUf9+nq0o9UIg==", + "integrity": "sha1-wteA9T1Fu6gxeokC1M7q86Y4WxQ=", "dev": true }, "bluebird": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.2.tgz", - "integrity": "sha512-dhHTWMI7kMx5whMQntl7Vr9C6BvV10lFXDAasnqnrMYhXVCzzk6IO9Fo2L75jXHT07WrOngL1WDXOp+yYS91Yg==", + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.3.tgz", + "integrity": "sha512-/qKPUQlaW1OyR51WeCPBvRnAlnZFUJkCSG5HzGnuIqhgyJtF+T94lFnn33eiazjRm2LAHVy2guNnaq48X9SJuw==", "dev": true }, "bn.js": { @@ -522,7 +534,7 @@ "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "integrity": "sha1-PH/L9SnYcibz0vUrlm/1Jx60Qd0=", "dev": true, "requires": { "balanced-match": "^1.0.0", @@ -532,7 +544,7 @@ "braces": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "integrity": "sha1-WXn9PxTNUxVl5fot8av/8d+u5yk=", "dev": true, "requires": { "arr-flatten": "^1.1.0", @@ -566,7 +578,7 @@ }, "browserify-aes": { "version": "1.2.0", - "resolved": "http://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", "dev": true, "requires": { @@ -603,7 +615,7 @@ }, "browserify-rsa": { "version": "4.0.1", - "resolved": "http://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", "dev": true, "requires": { @@ -637,7 +649,7 @@ }, "buffer": { "version": "4.9.1", - "resolved": "http://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", "dev": true, "requires": { @@ -663,7 +675,7 @@ "buffer-indexof": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", - "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", + "integrity": "sha1-Uvq8xqYG0aADAoAmSO9o9jnaJow=", "dev": true }, "buffer-xor": { @@ -685,30 +697,39 @@ "dev": true }, "cacache": { - "version": "10.0.4", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-10.0.4.tgz", - "integrity": "sha512-Dph0MzuH+rTQzGPNT9fAnrPmMmjKfST6trxJeK7NQuHRaVw24VzPRWTmg9MpcwOVQZO0E1FBICUlFeNaKPIfHA==", - "dev": true, - "requires": { - "bluebird": "^3.5.1", - "chownr": "^1.0.1", - "glob": "^7.1.2", - "graceful-fs": "^4.1.11", - "lru-cache": "^4.1.1", - "mississippi": "^2.0.0", + "version": "11.3.2", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-11.3.2.tgz", + "integrity": "sha512-E0zP4EPGDOaT2chM08Als91eYnf8Z+eH1awwwVsngUmgppfM5jjJ8l3z5vO5p5w/I3LsiXawb1sW0VY65pQABg==", + "dev": true, + "requires": { + "bluebird": "^3.5.3", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.3", + "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.2", - "ssri": "^5.2.4", - "unique-filename": "^1.1.0", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", "y18n": "^4.0.0" + }, + "dependencies": { + "graceful-fs": { + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", + "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", + "dev": true + } } }, "cache-base": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "integrity": "sha1-Cn9GQWgxyLZi7jb+TnxZ129marI=", "dev": true, "requires": { "collection-visit": "^1.0.0", @@ -752,7 +773,7 @@ "chokidar": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.4.tgz", - "integrity": "sha512-z9n7yt9rOvIJrMhvDtDictKrkFHeihkNl6uWMmZlmL6tJtX9Cs+87oK+teBx+JIgzvbX3yZHT3eF8vpbDxHJXQ==", + "integrity": "sha1-NW/04rDo5D4yLRijckYLvPOszSY=", "dev": true, "requires": { "anymatch": "^2.0.0", @@ -798,7 +819,7 @@ "class-utils": { "version": "0.3.6", "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "integrity": "sha1-+TNprouafOAv1B+q0MqDAzGQxGM=", "dev": true, "requires": { "arr-union": "^3.1.0", @@ -821,7 +842,7 @@ "clean-css": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.1.tgz", - "integrity": "sha512-4ZxI6dy4lrY6FHzfiy1aEOXgu4LIsW2MhwG0VBKdcoGoH/XLFgaHSdLTGr4O8Be6A8r3MOphEiI8Gc1n0ecf3g==", + "integrity": "sha1-LUEe92uFabbQyEBo2r6FsKpeXBc=", "dev": true, "requires": { "source-map": "~0.6.0" @@ -830,7 +851,7 @@ "cliui": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", - "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "integrity": "sha1-NIQi2+gtgAswIu709qwQvy5NG0k=", "dev": true, "requires": { "string-width": "^2.1.1", @@ -874,7 +895,7 @@ "color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "integrity": "sha1-u3GFBpDh8TZWfeYp0tVHHe2kweg=", "dev": true, "requires": { "color-name": "1.1.3" @@ -886,10 +907,16 @@ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true }, + "command-exists": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/command-exists/-/command-exists-1.2.8.tgz", + "integrity": "sha512-PM54PkseWbiiD/mMsbvW351/u+dafwTJ0ye2qB60G1aGQP9j3xK2gmMDc+R34L3nDtx4qMCitXT75mkbkGJDLw==", + "dev": true + }, "commander": { "version": "2.17.1", "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", - "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", + "integrity": "sha1-vXerfebelCBc6sxy8XFtKfIKd78=", "dev": true }, "commondir": { @@ -907,7 +934,7 @@ "compressible": { "version": "2.0.15", "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.15.tgz", - "integrity": "sha512-4aE67DL33dSW9gw4CI2H/yTxqHLNcxp0yS6jB+4h+wr3e43+1z7vm0HU9qXOH8j+qjKuL8+UtkOxYQSMq60Ylw==", + "integrity": "sha1-hXqasKfloH2Ng37UP+Le//ZP4hI=", "dev": true, "requires": { "mime-db": ">= 1.36.0 < 2" @@ -916,7 +943,7 @@ "compression": { "version": "1.7.3", "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.3.tgz", - "integrity": "sha512-HSjyBG5N1Nnz7tF2+O7A9XUhyjru71/fwgNb7oIsEVHR0WShfs2tIS/EySLgiTe98aOK18YDlMXpzjCXY/n9mg==", + "integrity": "sha1-J+DhdqryYPfywoE8PkQK258Zk9s=", "dev": true, "requires": { "accepts": "~1.3.5", @@ -954,7 +981,7 @@ }, "readable-stream": { "version": "2.3.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { @@ -1008,7 +1035,7 @@ "content-type": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "integrity": "sha1-4TjMdeBAxyexlm/l5fjJruJW/js=", "dev": true }, "cookie": { @@ -1061,7 +1088,7 @@ }, "create-hash": { "version": "1.2.0", - "resolved": "http://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", "dev": true, "requires": { @@ -1074,7 +1101,7 @@ }, "create-hmac": { "version": "1.1.7", - "resolved": "http://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", "dev": true, "requires": { @@ -1089,7 +1116,7 @@ "cross-spawn": { "version": "6.0.5", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "integrity": "sha1-Sl7Hxk364iw6FBJNus3uhG2Ay8Q=", "dev": true, "requires": { "nice-try": "^1.0.4", @@ -1133,7 +1160,7 @@ "css-what": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.2.tgz", - "integrity": "sha512-wan8dMWQ0GUeF7DGEPVjhHemVW/vy6xUYmFzRY8RYqgA0JtXC9rJmbScBjqSu6dg9q0lwPQy6ZAmJVr3PPTvqQ==", + "integrity": "sha1-wIdtnQSAkn19SSDc1yrzWVZJVU0=", "dev": true }, "cyclist": { @@ -1151,7 +1178,7 @@ "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", "dev": true, "requires": { "ms": "2.0.0" @@ -1181,7 +1208,7 @@ "default-gateway": { "version": "2.7.2", "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-2.7.2.tgz", - "integrity": "sha512-lAc4i9QJR0YHSDFdzeBQKfZ1SRDG3hsJNEkrpcZa8QhBfidLAilT60BDEIVUUGqosFp425KOgB3uYqcnQrWafQ==", + "integrity": "sha1-t+8znl4CSwRUZ69APVA0jbRkLQ8=", "dev": true, "requires": { "execa": "^0.10.0", @@ -1191,7 +1218,7 @@ "define-properties": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "integrity": "sha1-z4jabL7ib+bbcJT2HYcMvYTO6fE=", "dev": true, "requires": { "object-keys": "^1.0.12" @@ -1200,7 +1227,7 @@ "define-property": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "integrity": "sha1-1Flono1lS6d+AqgX+HENcCyxbp0=", "dev": true, "requires": { "is-descriptor": "^1.0.2", @@ -1210,7 +1237,7 @@ "is-accessor-descriptor": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=", "dev": true, "requires": { "kind-of": "^6.0.0" @@ -1219,7 +1246,7 @@ "is-data-descriptor": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=", "dev": true, "requires": { "kind-of": "^6.0.0" @@ -1228,7 +1255,7 @@ "is-descriptor": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=", "dev": true, "requires": { "is-accessor-descriptor": "^1.0.0", @@ -1277,12 +1304,12 @@ "detect-node": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.4.tgz", - "integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==", + "integrity": "sha1-AU7o+PZpxcWAI9pkuBecCDooxGw=", "dev": true }, "diffie-hellman": { "version": "5.0.3", - "resolved": "http://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", "dev": true, "requires": { @@ -1300,7 +1327,7 @@ "dns-packet": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz", - "integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==", + "integrity": "sha1-EqpCaYEHW+UAuRDu3NC0fdfe2lo=", "dev": true, "requires": { "ip": "^1.1.0", @@ -1319,7 +1346,7 @@ "dom-converter": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", - "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", + "integrity": "sha1-ZyGp2u4uKTaClVtq/kFncWJ7t2g=", "dev": true, "requires": { "utila": "~0.4" @@ -1375,9 +1402,9 @@ } }, "duplexify": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.6.1.tgz", - "integrity": "sha512-vM58DwdnKmty+FSPzT14K9JXb90H+j5emaR4KYbr2KTIz00WHGbWOe5ghQTx233ZCLZtrGDALzKwcjEtSt35mA==", + "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", @@ -1394,7 +1421,7 @@ }, "readable-stream": { "version": "2.3.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { @@ -1463,7 +1490,7 @@ "enhanced-resolve": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz", - "integrity": "sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng==", + "integrity": "sha1-Qcfgv9/nSsH/4eV61qXGyfN0Kn8=", "dev": true, "requires": { "graceful-fs": "^4.1.2", @@ -1474,13 +1501,13 @@ "entities": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", - "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", + "integrity": "sha1-vfpzUplmTfr9NFKe1PhSKidf6lY=", "dev": true }, "errno": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", - "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", + "integrity": "sha1-RoTXF3mtOa8Xfj8AeZb3xnyFJhg=", "dev": true, "requires": { "prr": "~1.0.1" @@ -1502,7 +1529,7 @@ "es-to-primitive": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz", - "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", + "integrity": "sha1-7fckeAM0VujdqO8J4ArZZQcH83c=", "dev": true, "requires": { "is-callable": "^1.1.4", @@ -1523,9 +1550,9 @@ "dev": true }, "eslint-scope": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.0.tgz", - "integrity": "sha512-1G6UTDi7Jc1ELFwnR58HV4fK9OQK4S6N985f166xqXxpjU6plxFISJa2Ba9KCQuFa8RCnj/lSFJbHo7UFDBnUA==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.2.tgz", + "integrity": "sha512-5q1+B/ogmHl8+paxtOKx38Z8LtWkVGuNt3+GQNErqwLl6ViNp/gdJGMCjZNxZ8j/VYjDNZ2Fo+eQc1TAVPIzbg==", "dev": true, "requires": { "esrecurse": "^4.1.0", @@ -1556,19 +1583,19 @@ "eventemitter3": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.0.tgz", - "integrity": "sha512-ivIvhpq/Y0uSjcHDcOIccjmYjGLcP09MFGE7ysAwkAvkXfpZlC985pH2/ui64DKazbTW/4kN3yqozUxlXzI6cA==", + "integrity": "sha1-CQtNbNvWRe0Qv3UNS1QHlC17oWM=", "dev": true }, "events": { - "version": "1.1.1", - "resolved": "http://registry.npmjs.org/events/-/events-1.1.1.tgz", - "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.0.0.tgz", + "integrity": "sha512-Dc381HFWJzEOhQ+d8pkNon++bk9h6cdAoAj4iE6Q4y6xgTzySWXlKn05/TVNpjnfRqi/X0EpJEJohPjNI3zpVA==", "dev": true }, "eventsource": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.0.7.tgz", - "integrity": "sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ==", + "integrity": "sha1-j7xyyT/NNAiAkLwKTmT0tc7m2NA=", "dev": true, "requires": { "original": "^1.0.0" @@ -1637,7 +1664,7 @@ "express": { "version": "4.16.4", "resolved": "https://registry.npmjs.org/express/-/express-4.16.4.tgz", - "integrity": "sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg==", + "integrity": "sha1-/d72GSYQniTFFeqX/S8b2/Yt8S4=", "dev": true, "requires": { "accepts": "~1.3.5", @@ -1693,7 +1720,7 @@ "is-extendable": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=", "dev": true, "requires": { "is-plain-object": "^2.0.4" @@ -1704,7 +1731,7 @@ "extglob": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "integrity": "sha1-rQD+TcYSqSMuhxhxHcXLWrAoVUM=", "dev": true, "requires": { "array-unique": "^0.3.2", @@ -1738,7 +1765,7 @@ "is-accessor-descriptor": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=", "dev": true, "requires": { "kind-of": "^6.0.0" @@ -1747,7 +1774,7 @@ "is-data-descriptor": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=", "dev": true, "requires": { "kind-of": "^6.0.0" @@ -1756,7 +1783,7 @@ "is-descriptor": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=", "dev": true, "requires": { "is-accessor-descriptor": "^1.0.0", @@ -1787,6 +1814,12 @@ "websocket-driver": ">=0.5.1" } }, + "figgy-pudding": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.1.tgz", + "integrity": "sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w==", + "dev": true + }, "fill-range": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", @@ -1826,33 +1859,33 @@ } }, "find-cache-dir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-1.0.0.tgz", - "integrity": "sha1-kojj6ePMN0hxfTnq3hfPcfww7m8=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.0.0.tgz", + "integrity": "sha512-LDUY6V1Xs5eFskUVYtIwatojt6+9xC9Chnlk/jYOOvn3FAFfSaWddxahDGyNHh0b2dMXa6YW2m0tk8TdVaXHlA==", "dev": true, "requires": { "commondir": "^1.0.1", "make-dir": "^1.0.0", - "pkg-dir": "^2.0.0" + "pkg-dir": "^3.0.0" } }, "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "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": "^2.0.0" + "locate-path": "^3.0.0" } }, "flush-write-stream": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.0.3.tgz", - "integrity": "sha512-calZMC10u0FMUqoiunI2AiGIIUtUIvifNwkHhNupZH4cbNnW1Itkoh/Nf5HFYmDrwWPjrUxpkZT0KhuCq0jmGw==", + "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.1", - "readable-stream": "^2.0.4" + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" }, "dependencies": { "isarray": { @@ -1863,7 +1896,7 @@ }, "readable-stream": { "version": "2.3.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { @@ -1952,7 +1985,7 @@ }, "readable-stream": { "version": "2.3.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { @@ -2035,12 +2068,14 @@ "balanced-match": { "version": "1.0.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "brace-expansion": { "version": "1.1.11", "bundled": true, "dev": true, + "optional": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -2055,17 +2090,20 @@ "code-point-at": { "version": "1.1.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "concat-map": { "version": "0.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "console-control-strings": { "version": "1.1.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "core-util-is": { "version": "1.0.2", @@ -2182,7 +2220,8 @@ "inherits": { "version": "2.0.3", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "ini": { "version": "1.3.5", @@ -2194,6 +2233,7 @@ "version": "1.0.0", "bundled": true, "dev": true, + "optional": true, "requires": { "number-is-nan": "^1.0.0" } @@ -2208,6 +2248,7 @@ "version": "3.0.4", "bundled": true, "dev": true, + "optional": true, "requires": { "brace-expansion": "^1.1.7" } @@ -2215,12 +2256,14 @@ "minimist": { "version": "0.0.8", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "minipass": { "version": "2.2.4", "bundled": true, "dev": true, + "optional": true, "requires": { "safe-buffer": "^5.1.1", "yallist": "^3.0.0" @@ -2239,6 +2282,7 @@ "version": "0.5.1", "bundled": true, "dev": true, + "optional": true, "requires": { "minimist": "0.0.8" } @@ -2319,7 +2363,8 @@ "number-is-nan": { "version": "1.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "object-assign": { "version": "4.1.1", @@ -2331,6 +2376,7 @@ "version": "1.4.0", "bundled": true, "dev": true, + "optional": true, "requires": { "wrappy": "1" } @@ -2452,6 +2498,7 @@ "version": "1.0.2", "bundled": true, "dev": true, + "optional": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -2526,13 +2573,13 @@ "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "integrity": "sha1-pWiZ0+o8m6uHS7l3O3xe3pL0iV0=", "dev": true }, "get-caller-file": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", - "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", + "integrity": "sha1-+Xj6TJDR3+f/LWvtoqUV5xO9z0o=", "dev": true }, "get-stream": { @@ -2550,7 +2597,7 @@ "glob": { "version": "7.1.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "integrity": "sha1-OWCDLT8VdBCDQtr9OmezMsCWnfE=", "dev": true, "requires": { "fs.realpath": "^1.0.0", @@ -2624,7 +2671,7 @@ "has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "integrity": "sha1-ci18v8H2qoJB8W3YFOAR4fQeh5Y=", "dev": true, "requires": { "function-bind": "^1.1.1" @@ -2685,9 +2732,9 @@ } }, "hash.js": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.5.tgz", - "integrity": "sha512-eWI5HG9Np+eHV1KQhisXWwM+4EPPYe5dFX1UZZH7k/E3JzDEazVH+VGlZi6R94ZqImq+A3D1mCEtrFIfg/E7sA==", + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", "dev": true, "requires": { "inherits": "^2.0.3", @@ -2747,7 +2794,7 @@ "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==", + "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=", "dev": true, "requires": { "safe-buffer": "~5.1.0" @@ -2835,13 +2882,13 @@ "http-parser-js": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.0.tgz", - "integrity": "sha512-cZdEF7r4gfRIq7ezX9J0T+kQmJNOub71dWbgAXVHDct80TKP4MCETtZQ31xyv38UwgzkWPYF/Xc0ge55dW9Z9w==", + "integrity": "sha1-1l7b7ehDSdDcMDIIFaFdOcw8u9g=", "dev": true }, "http-proxy": { "version": "1.17.0", "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.17.0.tgz", - "integrity": "sha512-Taqn+3nNvYRfJ3bGvKfBSRwy1v6eePlm3oc/aWVxZp57DQr5Eq3xhKJi7Z4hZpS8PC3H4qI+Yly5EmFacGuA/g==", + "integrity": "sha1-etOElGWPhGBeL220Q230EPTlvpo=", "dev": true, "requires": { "eventemitter3": "^3.0.0", @@ -2870,7 +2917,7 @@ "iconv-lite": { "version": "0.4.23", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", - "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", + "integrity": "sha1-KXhx9jvlB63Pv8pxXQzQ7thOmmM=", "dev": true, "requires": { "safer-buffer": ">= 2.1.2 < 3" @@ -2891,7 +2938,7 @@ "import-local": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", - "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", + "integrity": "sha1-VQcL44pZk88Y72236WH1vuXFoJ0=", "dev": true, "requires": { "pkg-dir": "^3.0.0", @@ -2983,7 +3030,7 @@ "internal-ip": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-3.0.1.tgz", - "integrity": "sha512-NXXgESC2nNVtU+pqmC9e6R8B1GpKxzsAQhffvh5AL79qKnodd+L7tnEQmTiUAVngqLalPbSqRA7XGIEL5nCd0Q==", + "integrity": "sha1-31yZh24dLrLqLXT1IOP2aaAOzic=", "dev": true, "requires": { "default-gateway": "^2.6.0", @@ -2999,7 +3046,7 @@ "invert-kv": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", - "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", + "integrity": "sha1-c5P1r6Weyf9fZ6J2INEcIm4+7AI=", "dev": true }, "ip": { @@ -3052,13 +3099,13 @@ "is-buffer": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "integrity": "sha1-76ouqdqg16suoTqXsritUf776L4=", "dev": true }, "is-callable": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", - "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==", + "integrity": "sha1-HhrfIZ4e62hNaR+dagX/DTCiTXU=", "dev": true }, "is-data-descriptor": { @@ -3090,7 +3137,7 @@ "is-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "integrity": "sha1-Nm2CQN3kh8pRgjsaufB6EKeCUco=", "dev": true, "requires": { "is-accessor-descriptor": "^0.1.6", @@ -3101,7 +3148,7 @@ "kind-of": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "integrity": "sha1-cpyR4thXt6QZofmqZWhcTDP1hF0=", "dev": true } } @@ -3162,7 +3209,7 @@ "is-path-in-cwd": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", - "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", + "integrity": "sha1-WsSLNF72dTOb1sekipEhELJBz1I=", "dev": true, "requires": { "is-path-inside": "^1.0.0" @@ -3180,7 +3227,7 @@ "is-plain-object": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "integrity": "sha1-LBY7P6+xtgbZ0Xko8FwqHDjgdnc=", "dev": true, "requires": { "isobject": "^3.0.1" @@ -3204,7 +3251,7 @@ "is-symbol": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", - "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", + "integrity": "sha1-oFX2rlcZLK7jKeeoYBGLSXqVDzg=", "dev": true, "requires": { "has-symbols": "^1.0.0" @@ -3213,7 +3260,7 @@ "is-windows": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "integrity": "sha1-0YUOuXkezRjmGCzhKjDzlmNLsZ0=", "dev": true }, "is-wsl": { @@ -3249,7 +3296,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==", + "integrity": "sha1-afaofZUTq4u4/mO9sJecRI5oRmA=", "dev": true }, "json3": { @@ -3267,28 +3314,28 @@ "killable": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", - "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==", + "integrity": "sha1-TIzkQRh6Bhx0dPuHygjipjgZSJI=", "dev": true }, "kind-of": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "integrity": "sha1-ARRrNqYhjmTljzqNZt5df8b20FE=", "dev": true }, "lcid": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", - "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", + "integrity": "sha1-bvXS32DlL4LrIopMNz6NHzlyU88=", "dev": true, "requires": { "invert-kv": "^2.0.0" } }, "loader-runner": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.3.1.tgz", - "integrity": "sha512-By6ZFY7ETWOc9RFaAIb23IjJVcM4dvJC/N57nmdz9RSkMXvAXGI7SyVlAw3v8vjtDRlqThgVDVmTnr9fqMlxkw==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", + "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", "dev": true }, "loader-utils": { @@ -3304,19 +3351,19 @@ } }, "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "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": "^2.0.0", + "p-locate": "^3.0.0", "path-exists": "^3.0.0" } }, "lodash": { "version": "4.17.11", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "integrity": "sha1-s56mIp72B+zYniyN8SU2iRysm40=", "dev": true }, "lodash.debounce": { @@ -3338,13 +3385,12 @@ "dev": true }, "lru-cache": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz", - "integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dev": true, "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" + "yallist": "^3.0.2" } }, "make-dir": { @@ -3356,6 +3402,12 @@ "pify": "^3.0.0" } }, + "mamacro": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/mamacro/-/mamacro-0.0.3.tgz", + "integrity": "sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA==", + "dev": true + }, "map-age-cleaner": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.2.tgz", @@ -3442,7 +3494,7 @@ "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==", + "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=", "dev": true, "requires": { "safe-buffer": "~5.1.0" @@ -3465,7 +3517,7 @@ "micromatch": { "version": "3.1.10", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "integrity": "sha1-cIWbyVyYQJUvNZoGij/En57PrCM=", "dev": true, "requires": { "arr-diff": "^4.0.0", @@ -3496,19 +3548,19 @@ "mime": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", - "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==", + "integrity": "sha1-Eh+evEnjdm8xGnbh+hyAA8SwOqY=", "dev": true }, "mime-db": { "version": "1.37.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.37.0.tgz", - "integrity": "sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg==", + "integrity": "sha1-C2oM5v2+lXbiXx8tL96IMNwK0Ng=", "dev": true }, "mime-types": { "version": "2.1.21", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.21.tgz", - "integrity": "sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg==", + "integrity": "sha1-KJlaoey3cHQv5q5+WPkYHHRLP5Y=", "dev": true, "requires": { "mime-db": "~1.37.0" @@ -3517,13 +3569,13 @@ "mimic-fn": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "integrity": "sha1-ggyGo5M0ZA6ZUWkovQP8qIBX0CI=", "dev": true }, "minimalistic-assert": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "integrity": "sha1-LhlN4ERibUoQ5/f7wAznPoPk1cc=", "dev": true }, "minimalistic-crypto-utils": { @@ -3535,7 +3587,7 @@ "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=", "dev": true, "requires": { "brace-expansion": "^1.1.7" @@ -3548,9 +3600,9 @@ "dev": true }, "mississippi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-2.0.0.tgz", - "integrity": "sha512-zHo8v+otD1J10j/tC+VNoGK9keCuByhKovAvdn74dmxJl9+mWHnx6EMsDN4lgRoMI/eYo2nchAxniIbUPb5onw==", + "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", @@ -3559,7 +3611,7 @@ "flush-write-stream": "^1.0.0", "from2": "^2.1.0", "parallel-transform": "^1.1.0", - "pump": "^2.0.1", + "pump": "^3.0.0", "pumpify": "^1.3.3", "stream-each": "^1.1.0", "through2": "^2.0.0" @@ -3568,7 +3620,7 @@ "mixin-deep": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", - "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", + "integrity": "sha1-pJ5yaNzhoNlpjkUybFYm3zVD0P4=", "dev": true, "requires": { "for-in": "^1.0.2", @@ -3578,7 +3630,7 @@ "is-extendable": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=", "dev": true, "requires": { "is-plain-object": "^2.0.4" @@ -3618,7 +3670,7 @@ "multicast-dns": { "version": "6.2.3", "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", - "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", + "integrity": "sha1-oOx72QVcQoL3kMPIL04o2zsxsik=", "dev": true, "requires": { "dns-packet": "^1.3.1", @@ -3641,7 +3693,7 @@ "nanomatch": { "version": "1.2.13", "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "integrity": "sha1-uHqKpPwN6P5r6IiVs4mD/yZb0Rk=", "dev": true, "requires": { "arr-diff": "^4.0.0", @@ -3672,13 +3724,13 @@ "nice-try": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "integrity": "sha1-ozeKdpbOfSI+iPybdkvX7xCJ42Y=", "dev": true }, "no-case": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", - "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", + "integrity": "sha1-YLgTOWvjmz8SiKTB7V0efSi0ZKw=", "dev": true, "requires": { "lower-case": "^1.1.1" @@ -3687,13 +3739,13 @@ "node-forge": { "version": "0.7.5", "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.7.5.tgz", - "integrity": "sha512-MmbQJ2MTESTjt3Gi/3yG1wGpIMhUfcIypUCGtTizFR9IiccFwxSpfp0vtIZlkFclEqERemxfnSdZEMR9VqqEFQ==", + "integrity": "sha1-bBUsNFzhHFL0ZcKr2VfoY5zWdN8=", "dev": true }, "node-libs-browser": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.1.0.tgz", - "integrity": "sha512-5AzFzdoIMb89hBGMZglEegffzgRg+ZFoUmisQ8HI4j1KDdpx13J0taNp2y9xPbur6W61gepGDDotGBVQ7mfUCg==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.0.tgz", + "integrity": "sha512-5MQunG/oyOaBdttrL40dA7bUfPORLRWMUJLQtMg7nluxUvk5XwnLdL9twQHFAjRx/y7mIMkLKT9++qPbbk6BZA==", "dev": true, "requires": { "assert": "^1.1.1", @@ -3703,7 +3755,7 @@ "constants-browserify": "^1.0.0", "crypto-browserify": "^3.11.0", "domain-browser": "^1.1.1", - "events": "^1.0.0", + "events": "^3.0.0", "https-browserify": "^1.0.0", "os-browserify": "^0.3.0", "path-browserify": "0.0.0", @@ -3717,7 +3769,7 @@ "timers-browserify": "^2.0.4", "tty-browserify": "0.0.0", "url": "^0.11.0", - "util": "^0.10.3", + "util": "^0.11.0", "vm-browserify": "0.0.4" }, "dependencies": { @@ -3735,7 +3787,7 @@ }, "readable-stream": { "version": "2.3.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { @@ -3746,12 +3798,23 @@ "safe-buffer": "~5.1.1", "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" + }, + "dependencies": { + "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" + } + } } }, "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==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.2.0.tgz", + "integrity": "sha512-6YqyX6ZWEYguAxgZzHGL7SsCeGx3V2TtOTqZz1xSTSWnqsbWwbptafNyvf/ACquZUXV3DANr5BDIwNYe1mN42w==", "dev": true, "requires": { "safe-buffer": "~5.1.0" @@ -3780,7 +3843,7 @@ "nth-check": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", - "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", + "integrity": "sha1-sr0pXDfj3VijvwcAN2Zjuk2c8Fw=", "dev": true, "requires": { "boolbase": "~1.0.0" @@ -3832,7 +3895,7 @@ "object-keys": { "version": "1.0.12", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.12.tgz", - "integrity": "sha512-FTMyFUm2wBcGHnH2eXmz7tC6IwlqQZ6mVZ+6dm6vZ4IQIHjs6FdNsQBuKGPuUUUY6NfJw2PshC08Tn6LzLDOag==", + "integrity": "sha1-CcU4VTd1dTEMymL1W7M0q/97PtI=", "dev": true }, "object-visit": { @@ -3866,7 +3929,7 @@ "obuf": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", - "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "integrity": "sha1-Cb6jND1BhZ69RGKS0RydTbYZCE4=", "dev": true }, "on-finished": { @@ -3896,7 +3959,7 @@ "opn": { "version": "5.4.0", "resolved": "https://registry.npmjs.org/opn/-/opn-5.4.0.tgz", - "integrity": "sha512-YF9MNdVy/0qvJvDtunAOzFw9iasOQHpVthTCvGzxt61Il64AYSGdK+rYwld7NAfk9qJ7dt+hymBNSc9LNYS+Sw==", + "integrity": "sha1-y1Reeqt4VivrEao7+rxwQuF2EDU=", "dev": true, "requires": { "is-wsl": "^1.1.0" @@ -3905,7 +3968,7 @@ "original": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz", - "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==", + "integrity": "sha1-5EKmHP/hxf0gpl8yYcJmY7MD8l8=", "dev": true, "requires": { "url-parse": "^1.4.3" @@ -3947,39 +4010,39 @@ "dev": true }, "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", + "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", "dev": true, "requires": { - "p-try": "^1.0.0" + "p-try": "^2.0.0" } }, "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "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": "^1.1.0" + "p-limit": "^2.0.0" } }, "p-map": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz", - "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==", + "integrity": "sha1-5OlPMR6rvIYzoeeZCBZfyiYkG2s=", "dev": true }, "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz", + "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==", "dev": true }, "pako": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.6.tgz", - "integrity": "sha512-lQe48YPsMJAig+yngZ87Lus+NF+3mtu7DVOBu6b/gHO1YpKwIj5AWjZ/TOS7i46HD/UixzWb1zeWDZfGZ3iYcg==", + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.10.tgz", + "integrity": "sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw==", "dev": true }, "parallel-transform": { @@ -4001,7 +4064,7 @@ }, "readable-stream": { "version": "2.3.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { @@ -4035,16 +4098,17 @@ } }, "parse-asn1": { - "version": "5.1.1", - "resolved": "http://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.1.tgz", - "integrity": "sha512-KPx7flKXg775zZpnp9SxJlz00gTd4BmJ2yJufSc44gMCRrRQ7NSzAcSJQfifuOLgW6bEi+ftrALtsgALeB2Adw==", + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.4.tgz", + "integrity": "sha512-Qs5duJcuvNExRfFZ99HDD3z4mAi3r9Wl/FOjEOijlxwCZs7E7mW2vjTpgQ4J8LpTF8x5v+1Vn5UQFejmWT11aw==", "dev": true, "requires": { "asn1.js": "^4.0.0", "browserify-aes": "^1.0.0", "create-hash": "^1.1.0", "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3" + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" } }, "parseurl": { @@ -4136,12 +4200,12 @@ } }, "pkg-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", - "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "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": "^2.1.0" + "find-up": "^3.0.0" } }, "portfinder": { @@ -4180,7 +4244,7 @@ "process-nextick-args": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", + "integrity": "sha1-o31zL0JxtKsa0HDTVQjoKQeI/6o=", "dev": true }, "promise-inflight": { @@ -4192,7 +4256,7 @@ "proxy-addr": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.4.tgz", - "integrity": "sha512-5erio2h9jp5CHGwcybmxmVqHmnCBZeewlfJ0pex+UW7Qny7OOZXTtH56TGNyBizkgiOwhJtMKrVzDTeKcySZwA==", + "integrity": "sha1-7PxzO/Iv+Mb0B/onUye5q2fki5M=", "dev": true, "requires": { "forwarded": "~0.1.2", @@ -4205,12 +4269,6 @@ "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", "dev": true }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", - "dev": true - }, "public-encrypt": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", @@ -4226,9 +4284,9 @@ } }, "pump": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", - "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "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", @@ -4244,18 +4302,30 @@ "duplexify": "^3.6.0", "inherits": "^2.0.3", "pump": "^2.0.0" + }, + "dependencies": { + "pump": { + "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" + } + } } }, "punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "integrity": "sha1-tYsBCsQMIsVldhbI0sLALHv0eew=", "dev": true }, "qs": { "version": "6.5.2", "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "integrity": "sha1-yzroBuh0BERYTvFUzo7pjUA/PjY=", "dev": true }, "querystring": { @@ -4273,13 +4343,13 @@ "querystringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.1.0.tgz", - "integrity": "sha512-sluvZZ1YiTLD5jsqZcDmFyV2EwToyXZBfpoVOmktMmW+VEnhgakFHnasVph65fOjGPTWN0Nw3+XQaSeMayr0kg==", + "integrity": "sha1-fe2N+/eHncxg0KZErGdUsoOtF+8=", "dev": true }, "randombytes": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.6.tgz", - "integrity": "sha512-CIQ5OFxf4Jou6uOKe9t1AOgqpeU5fd70A8NPdHSGeYXqXsPe6peOwI0cUl88RWZ6sP1vPMV3avd/R6cZ5/sP1A==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", "dev": true, "requires": { "safe-buffer": "^5.1.0" @@ -4304,7 +4374,7 @@ "raw-body": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz", - "integrity": "sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw==", + "integrity": "sha1-GzJOzmtXBuFThVvBFIxlu39uoMM=", "dev": true, "requires": { "bytes": "3.0.0", @@ -4328,7 +4398,7 @@ "readdirp": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "integrity": "sha1-DodiKjMlqjPokihcr4tOhGUppSU=", "dev": true, "requires": { "graceful-fs": "^4.1.11", @@ -4360,7 +4430,7 @@ "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==", + "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=", "dev": true, "requires": { "safe-buffer": "~5.1.0" @@ -4371,7 +4441,7 @@ "regex-not": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "integrity": "sha1-H07OJ+ALC2XgJHpoEOaoXYOldSw=", "dev": true, "requires": { "extend-shallow": "^3.0.2", @@ -4393,7 +4463,7 @@ "renderkid": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.2.tgz", - "integrity": "sha512-FsygIxevi1jSiPY9h7vZmBFUbAOcbYm9UwyiLNdVsLRs/5We9Ob5NMPbGYUTWiLq5L+ezlVdE0A8bbME5CWTpg==", + "integrity": "sha1-EtMQ8lU2DAetj94lP2yeneNy0qo=", "dev": true, "requires": { "css-select": "^1.1.0", @@ -4406,7 +4476,7 @@ "repeat-element": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", - "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", + "integrity": "sha1-eC4NglwMWjuzlzH4Tv7mt0Lmsc4=", "dev": true }, "repeat-string": { @@ -4457,7 +4527,7 @@ "ret": { "version": "0.1.15", "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "integrity": "sha1-uKSCXVvbH8P29Twrwz+BOIaBx7w=", "dev": true }, "rimraf": { @@ -4491,7 +4561,7 @@ "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==", + "integrity": "sha1-mR7GnSluAxN0fVm9/St0XDX4go0=", "dev": true }, "safe-regex": { @@ -4506,16 +4576,17 @@ "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "integrity": "sha1-RPoWGwGHuVSd2Eu5GAL5vYOFzWo=", "dev": true }, "schema-utils": { - "version": "0.4.7", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.7.tgz", - "integrity": "sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", "dev": true, "requires": { "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", "ajv-keywords": "^3.1.0" } }, @@ -4528,7 +4599,7 @@ "selfsigned": { "version": "1.10.4", "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.4.tgz", - "integrity": "sha512-9AukTiDmHXGXWtWjembZ5NDmVvP2695EtpgbCsxCa68w3c88B+alqbmZ4O3hZ4VWGXeGWzEVdvqgAJD8DQPCDw==", + "integrity": "sha1-zdfsz8pO12NdR6CL8tXTB0CS4s0=", "dev": true, "requires": { "node-forge": "0.7.5" @@ -4537,13 +4608,13 @@ "semver": { "version": "5.6.0", "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", - "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", + "integrity": "sha1-fnQlb7qknHWqfHogXMInmcrIAAQ=", "dev": true }, "send": { "version": "0.16.2", "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", - "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", + "integrity": "sha1-bsyh4PjBVtFBWXVZhI32RzCmu8E=", "dev": true, "requires": { "debug": "2.6.9", @@ -4562,9 +4633,9 @@ } }, "serialize-javascript": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.5.0.tgz", - "integrity": "sha512-Ga8c8NjAAp46Br4+0oZ2WxJCwIzwP60Gq1YPgU+39PiTVxyed/iKE/zyZI6+UlVYH5Q4PaQdHhcegIFPZTUfoQ==", + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.6.1.tgz", + "integrity": "sha512-A5MOagrPFga4YaKQSWHryl7AXvbQkEqpw4NNYMTNYUNV51bA8ABHgYFpqKx+YFFrw59xMV1qGH1R4AgoNIVgCw==", "dev": true }, "serve-index": { @@ -4585,7 +4656,7 @@ "serve-static": { "version": "1.13.2", "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", - "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", + "integrity": "sha1-CV6Ecv1bRiN9tQzkhqQ/S4bGzsE=", "dev": true, "requires": { "encodeurl": "~1.0.2", @@ -4603,7 +4674,7 @@ "set-value": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", - "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", + "integrity": "sha1-ca5KiPD+77v1LR6mBPP7MV67YnQ=", "dev": true, "requires": { "extend-shallow": "^2.0.1", @@ -4632,12 +4703,12 @@ "setprototypeof": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "integrity": "sha1-0L2FU2iHtv58DYGMuWLZ2RxU5lY=", "dev": true }, "sha.js": { "version": "2.4.11", - "resolved": "http://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", "dev": true, "requires": { @@ -4669,7 +4740,7 @@ "snapdragon": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "integrity": "sha1-ZJIufFZbDhQgS6GqfWlkJ40lGC0=", "dev": true, "requires": { "base": "^0.11.1", @@ -4711,7 +4782,7 @@ "snapdragon-node": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "integrity": "sha1-bBdfhv8UvbByRWPo88GwIaKGhTs=", "dev": true, "requires": { "define-property": "^1.0.0", @@ -4731,7 +4802,7 @@ "is-accessor-descriptor": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=", "dev": true, "requires": { "kind-of": "^6.0.0" @@ -4740,7 +4811,7 @@ "is-data-descriptor": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=", "dev": true, "requires": { "kind-of": "^6.0.0" @@ -4749,7 +4820,7 @@ "is-descriptor": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=", "dev": true, "requires": { "is-accessor-descriptor": "^1.0.0", @@ -4762,7 +4833,7 @@ "snapdragon-util": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "integrity": "sha1-+VZHlIbyrNeXAGk/b3uAXkWrVuI=", "dev": true, "requires": { "kind-of": "^3.2.0" @@ -4782,7 +4853,7 @@ "sockjs": { "version": "0.3.19", "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.19.tgz", - "integrity": "sha512-V48klKZl8T6MzatbLlzzRNhMepEys9Y4oGFpypBFFn1gLI/QQ9HtLLyWJNbPlwGLelOVOEijUbTTJeLLI59jLw==", + "integrity": "sha1-2Xa76ACve9IK4IWY1YI5NQiZPA0=", "dev": true, "requires": { "faye-websocket": "^0.10.0", @@ -4792,7 +4863,7 @@ "sockjs-client": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.3.0.tgz", - "integrity": "sha512-R9jxEzhnnrdxLCNln0xg5uGHqMnkhPSTzUZH2eXcR03S/On9Yvoq2wyUZILRUhZCNVu2PmwWVoyuiPz8th8zbg==", + "integrity": "sha1-EvydbLZj2lc509xftuhofalcsXc=", "dev": true, "requires": { "debug": "^3.2.5", @@ -4806,7 +4877,7 @@ "debug": { "version": "3.2.6", "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "integrity": "sha1-6D0X3hbYp++3cX7b5fsQE17uYps=", "dev": true, "requires": { "ms": "^2.1.1" @@ -4824,7 +4895,7 @@ "ms": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "integrity": "sha1-MKWGTrPrsKZvLr5tcnrwagnYbgo=", "dev": true } } @@ -4838,13 +4909,13 @@ "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", "dev": true }, "source-map-resolve": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", - "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", + "integrity": "sha1-cuLMNAlVQ+Q7LGKyxMENSpBU8lk=", "dev": true, "requires": { "atob": "^2.1.1", @@ -4854,6 +4925,16 @@ "urix": "^0.1.0" } }, + "source-map-support": { + "version": "0.5.10", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.10.tgz", + "integrity": "sha512-YfQ3tQFTK/yzlGJuX8pTwa4tifQj4QS2Mj7UegOu8jAz59MqIiMGPXxQhVQiIMNzayuUSF/jEuVnfFF5JqybmQ==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, "source-map-url": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", @@ -4924,19 +5005,19 @@ "split-string": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "integrity": "sha1-fLCd2jqGWFcFxks5pkZgOGguj+I=", "dev": true, "requires": { "extend-shallow": "^3.0.0" } }, "ssri": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-5.3.0.tgz", - "integrity": "sha512-XRSIPqLij52MtgoQavH/x/dU1qVKtWUAAZeOHsR9c2Ddi4XerFy3mc1alf+dLJKl9EUIm/Ht+EowFkTUOA6GAQ==", + "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": { - "safe-buffer": "^5.1.1" + "figgy-pudding": "^3.5.1" } }, "static-extend": { @@ -4963,13 +5044,13 @@ "statuses": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", - "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", + "integrity": "sha1-u3PURtonlhBu/MG2AaJT1sRr0Ic=", "dev": true }, "stream-browserify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", - "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", + "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", "dev": true, "requires": { "inherits": "~2.0.1", @@ -4984,7 +5065,7 @@ }, "readable-stream": { "version": "2.3.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { @@ -5039,7 +5120,7 @@ }, "readable-stream": { "version": "2.3.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { @@ -5072,7 +5153,7 @@ "string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "integrity": "sha1-q5Pyeo3BPSjKyBXEYhQ6bZASrp4=", "dev": true, "requires": { "is-fullwidth-code-point": "^2.0.0", @@ -5120,7 +5201,7 @@ "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "integrity": "sha1-4uaaRKyHcveKHsCzW2id9lMO/I8=", "dev": true, "requires": { "has-flag": "^3.0.0" @@ -5132,19 +5213,46 @@ "integrity": "sha512-IlqtmLVaZA2qab8epUXbVWRn3aB1imbDMJtjB3nu4X0NqPkcY/JH9ZtCBWKHWPxs8Svi9tyo8w2dBoi07qZbBA==", "dev": true }, + "terser": { + "version": "3.16.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-3.16.1.tgz", + "integrity": "sha512-JDJjgleBROeek2iBcSNzOHLKsB/MdDf+E/BOAJ0Tk9r7p9/fVobfv7LMJ/g/k3v9SXdmjZnIlFd5nfn/Rt0Xow==", + "dev": true, + "requires": { + "commander": "~2.17.1", + "source-map": "~0.6.1", + "source-map-support": "~0.5.9" + } + }, + "terser-webpack-plugin": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.2.3.tgz", + "integrity": "sha512-GOK7q85oAb/5kE12fMuLdn2btOS9OBZn4VsecpHDywoUC/jLhSAKOiYo0ezx7ss2EXPMzyEWFoE0s1WLE+4+oA==", + "dev": true, + "requires": { + "cacache": "^11.0.2", + "find-cache-dir": "^2.0.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^1.4.0", + "source-map": "^0.6.1", + "terser": "^3.16.1", + "webpack-sources": "^1.1.0", + "worker-farm": "^1.5.2" + } + }, "text-encoding": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/text-encoding/-/text-encoding-0.7.0.tgz", - "integrity": "sha512-oJQ3f1hrOnbRLOcwKz0Liq2IcrvDeZRHXhd9RgLrsT+DjWY/nty1Hi7v3dtkaEYbPYe0mUoOfzRrMwfXXwgPUA==", + "integrity": "sha1-+JXoNuRZkGJAhmAXmOqY6PNu5kM=", "dev": true }, "through2": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", - "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", + "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.1.5", + "readable-stream": "~2.3.6", "xtend": "~4.0.1" }, "dependencies": { @@ -5156,7 +5264,7 @@ }, "readable-stream": { "version": "2.3.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { @@ -5183,7 +5291,7 @@ "thunky": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.0.3.tgz", - "integrity": "sha512-YwT8pjmNcAXBZqrubu22P4FYsh2D4dxRmnWBOL8Jk8bUcRUtc5326kx32tuTmFDAZtLOGEVNl8POAR8j896Iow==", + "integrity": "sha1-9d9zJFNAewkZHa5z4qjMc/OBqCY=", "dev": true }, "timers-browserify": { @@ -5224,7 +5332,7 @@ "to-regex": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "integrity": "sha1-E8/dmzNlUvMLUfM6iuG0Knp1mc4=", "dev": true, "requires": { "define-property": "^2.0.2", @@ -5264,7 +5372,7 @@ "type-is": { "version": "1.6.16", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz", - "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==", + "integrity": "sha1-+JzjQVQcZysl7nrjxz3uOyvlAZQ=", "dev": true, "requires": { "media-typer": "0.3.0", @@ -5280,47 +5388,13 @@ "uglify-js": { "version": "3.4.9", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.9.tgz", - "integrity": "sha512-8CJsbKOtEbnJsTyv6LE6m6ZKniqMiFWmm9sRbopbkGs3gMPPfd3Fh8iIA4Ykv5MgaTbqHr4BaoGLJLZNhsrW1Q==", + "integrity": "sha1-rwLxgMEgfXZDLkc+0koo9KeCuuM=", "dev": true, "requires": { "commander": "~2.17.1", "source-map": "~0.6.1" } }, - "uglifyjs-webpack-plugin": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-1.3.0.tgz", - "integrity": "sha512-ovHIch0AMlxjD/97j9AYovZxG5wnHOPkL7T1GKochBADp/Zwc44pEWNqpKl1Loupp1WhFg7SlYmHZRUfdAacgw==", - "dev": true, - "requires": { - "cacache": "^10.0.4", - "find-cache-dir": "^1.0.0", - "schema-utils": "^0.4.5", - "serialize-javascript": "^1.4.0", - "source-map": "^0.6.1", - "uglify-es": "^3.3.4", - "webpack-sources": "^1.1.0", - "worker-farm": "^1.5.2" - }, - "dependencies": { - "commander": { - "version": "2.13.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.13.0.tgz", - "integrity": "sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA==", - "dev": true - }, - "uglify-es": { - "version": "3.3.9", - "resolved": "https://registry.npmjs.org/uglify-es/-/uglify-es-3.3.9.tgz", - "integrity": "sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ==", - "dev": true, - "requires": { - "commander": "~2.13.0", - "source-map": "~0.6.1" - } - } - } - }, "union-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", @@ -5429,7 +5503,7 @@ "upath": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.0.tgz", - "integrity": "sha512-bzpH/oBhoS/QI/YtbkqCg6VEiPYjSZtrHQM6/QnJS6OL9pKUFLqb3aFh4Scvwm45+7iAgiMkLhSbaZxUqmrprw==", + "integrity": "sha1-NSVll+RqWB20eT0M5H+prr/J+r0=", "dev": true }, "upper-case": { @@ -5441,7 +5515,7 @@ "uri-js": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", - "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "integrity": "sha1-lMVA4f93KVbiKZUHwBCupsiDjrA=", "dev": true, "requires": { "punycode": "^2.1.0" @@ -5484,13 +5558,13 @@ "use": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "integrity": "sha1-1QyMrHmhn7wg8pEfVuuXP04QBw8=", "dev": true }, "util": { - "version": "0.10.4", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", - "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", + "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", "dev": true, "requires": { "inherits": "2.0.3" @@ -5505,7 +5579,7 @@ "util.promisify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", - "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", + "integrity": "sha1-RA9xZaRZyaFtwUXrjnLzVocJcDA=", "dev": true, "requires": { "define-properties": "^1.1.2", @@ -5527,13 +5601,13 @@ "uuid": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", + "integrity": "sha1-G0r0lV6zB3xQHCOHL8ZROBFYcTE=", "dev": true }, "v8-compile-cache": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.0.2.tgz", - "integrity": "sha512-1wFuMUIM16MDJRCrpbpuEPTUGmM5QMUg0cr3KFwra2XgOgFcPGDQHDh3CszSCD2Zewc/dh/pamNEW8CbfDebUw==", + "integrity": "sha1-pCiyi7JnkHNMT8i8n6EG/M6/amw=", "dev": true }, "vary": { @@ -5565,24 +5639,24 @@ "wbuf": { "version": "1.7.3", "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", - "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "integrity": "sha1-wdjRSTFtPqhShIiVy2oL/oh7h98=", "dev": true, "requires": { "minimalistic-assert": "^1.0.0" } }, "webpack": { - "version": "4.23.1", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.23.1.tgz", - "integrity": "sha512-iE5Cu4rGEDk7ONRjisTOjVHv3dDtcFfwitSxT7evtYj/rANJpt1OuC/Kozh1pBa99AUBr1L/LsaNB+D9Xz3CEg==", + "version": "4.29.6", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.29.6.tgz", + "integrity": "sha512-MwBwpiE1BQpMDkbnUUaW6K8RFZjljJHArC6tWQJoFm0oQtfoSebtg4Y7/QHnJ/SddtjYLHaKGX64CFjG5rehJw==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.7.10", - "@webassemblyjs/helper-module-context": "1.7.10", - "@webassemblyjs/wasm-edit": "1.7.10", - "@webassemblyjs/wasm-parser": "1.7.10", - "acorn": "^5.6.2", - "acorn-dynamic-import": "^3.0.0", + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-module-context": "1.8.5", + "@webassemblyjs/wasm-edit": "1.8.5", + "@webassemblyjs/wasm-parser": "1.8.5", + "acorn": "^6.0.5", + "acorn-dynamic-import": "^4.0.0", "ajv": "^6.1.0", "ajv-keywords": "^3.1.0", "chrome-trace-event": "^1.0.0", @@ -5596,23 +5670,44 @@ "mkdirp": "~0.5.0", "neo-async": "^2.5.0", "node-libs-browser": "^2.0.0", - "schema-utils": "^0.4.4", + "schema-utils": "^1.0.0", "tapable": "^1.1.0", - "uglifyjs-webpack-plugin": "^1.2.4", + "terser-webpack-plugin": "^1.1.0", "watchpack": "^1.5.0", "webpack-sources": "^1.3.0" }, "dependencies": { + "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 + }, + "json5": { + "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" + } + }, "loader-utils": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", - "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", + "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": "^3.1.3", + "big.js": "^5.2.2", "emojis-list": "^2.0.0", - "json5": "^0.5.0" + "json5": "^1.0.1" } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true } } }, @@ -5650,7 +5745,7 @@ "webpack-dev-middleware": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.4.0.tgz", - "integrity": "sha512-Q9Iyc0X9dP9bAsYskAVJ/hmIZZQwf/3Sy4xCAZgL5cUkjZmUZLt4l5HpbST/Pdgjn3u6pE7u5OdGd1apgzRujA==", + "integrity": "sha1-ETL+zJAm/ZDw7O2sXL/3XR+0WJA=", "dev": true, "requires": { "memory-fs": "~0.4.1", @@ -5734,7 +5829,7 @@ "webpack-log": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz", - "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", + "integrity": "sha1-W3ko4GN1k/EZ0y9iJ8HgrDHhtH8=", "dev": true, "requires": { "ansi-colors": "^3.0.0", @@ -5764,13 +5859,13 @@ "websocket-extensions": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz", - "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==", + "integrity": "sha1-XS/yKXcAPsaHpLhwc9+7rBRszyk=", "dev": true }, "which": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "integrity": "sha1-pFBD1U9YBTFtqNYvn1CRjT2nCwo=", "dev": true, "requires": { "isexe": "^2.0.0" @@ -5832,7 +5927,7 @@ "xregexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-4.0.0.tgz", - "integrity": "sha512-PHyM+sQouu7xspQQwELlGwwd05mXUFqwFYfqPO0cC7x4fxyHnnuetmQr6CjJiafIDoH4MogHb9dOoJzR/Y4rFg==", + "integrity": "sha1-5pgYneSd0qGMxWh7BeF8jkOUMCA=", "dev": true }, "xtend": { @@ -5844,13 +5939,13 @@ "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==", + "integrity": "sha1-le+U+F7MgdAHwmThkKEg8KPIVms=", "dev": true }, "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", + "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==", "dev": true }, "yargs": { diff --git a/backends/conrod_crayon/tools/wasm-template/package.json b/backends/conrod_crayon/tools/wasm-template/package.json index a63a0e512..34116bf2f 100644 --- a/backends/conrod_crayon/tools/wasm-template/package.json +++ b/backends/conrod_crayon/tools/wasm-template/package.json @@ -1,12 +1,13 @@ { "scripts": { - "build": "webpack", - "serve": "webpack-dev-server" + "build": "webpack -p", + "serve": "webpack-dev-server -p" }, "devDependencies": { - "text-encoding": "^0.7.0", + "@wasm-tool/wasm-pack-plugin": "0.2.3", "html-webpack-plugin": "^3.2.0", - "webpack": "^4.11.1", + "text-encoding": "^0.7.0", + "webpack": "^4.29.4", "webpack-cli": "^3.1.1", "webpack-dev-server": "^3.1.0" } diff --git a/backends/conrod_crayon/tools/wasm-template/webpack.config.js b/backends/conrod_crayon/tools/wasm-template/webpack.config.js index 677158ee7..b025434e7 100644 --- a/backends/conrod_crayon/tools/wasm-template/webpack.config.js +++ b/backends/conrod_crayon/tools/wasm-template/webpack.config.js @@ -20,9 +20,9 @@ module.exports = { }) ], devServer: { - contentBase: [__dirname, path.join(__dirname, '../..')], + contentBase: [__dirname, path.join(__dirname, '../../../../assets/crayon')], inline:true, - port: 80 + port: 8080 }, mode: 'development' }; \ No newline at end of file From a06332284ea929c51488203d9986c62cd8abfff2 Mon Sep 17 00:00:00 2001 From: alanpoon Date: Sun, 10 Mar 2019 16:12:47 +0800 Subject: [PATCH 09/64] add azure-pipelines.yml --- azure-pipelines.yml | 19 +++++++++++++++++++ backends/conrod_crayon/examples/crayon.rs | 14 +++++++++++++- backends/conrod_crayon/src/events.rs | 3 ++- backends/conrod_example_shared/src/lib.rs | 3 +++ 4 files changed, 37 insertions(+), 2 deletions(-) create mode 100644 azure-pipelines.yml diff --git a/azure-pipelines.yml b/azure-pipelines.yml new file mode 100644 index 000000000..c23ced43c --- /dev/null +++ b/azure-pipelines.yml @@ -0,0 +1,19 @@ +# Starter pipeline +# Start with a minimal pipeline that you can customize to build and deploy your code. +# Add steps that build, run tests, deploy, and more: +# https://aka.ms/yaml + +trigger: +- master + +pool: + vmImage: 'Ubuntu-16.04' + +steps: +- script: echo Hello, world! + displayName: 'Run a one-line script' + +- script: | + echo Add other tasks to build, test, and deploy your project. + echo See https://aka.ms/yaml + displayName: 'Run a multi-line script' diff --git a/backends/conrod_crayon/examples/crayon.rs b/backends/conrod_crayon/examples/crayon.rs index f6d7ad2d8..e7159d6cf 100644 --- a/backends/conrod_crayon/examples/crayon.rs +++ b/backends/conrod_crayon/examples/crayon.rs @@ -7,6 +7,7 @@ use crayon::window::device_pixel_ratio; use conrod_crayon::Renderer; use conrod_example_shared::{WIN_W, WIN_H}; use std::time::SystemTime; +use std::collections::HashMap; use conrod_core::{color,Colorable, widget, Widget,Positionable,event::{Input},Sizeable}; struct Window { renderer: Renderer, @@ -62,7 +63,18 @@ impl Drop for Window { impl LifecycleListener for Window { fn on_update(&mut self) -> CrResult<()> { - //conrod_crayon::events::convert_event(&mut self.ui); + let mut text_edit:HashMap = HashMap::new(); + text_edit.insert("text_edit".to_owned(),self.app.textedit.clone()); + conrod_crayon::events::convert_event(&mut self.ui,Box::new(|vt:&mut HashMap|{ + for (id,val) in input::text_edit(){ + if let Some(k) = vt.get_mut(&id.clone()){ + *k = val; + } + } + }),&mut text_edit); + let k = "text_edit".to_owned(); + self.app.textedit = text_edit.get(&k).unwrap().clone(); + self.ui.handle_event(Input::Press(conrod_core::input::Button::Mouse(conrod_core::input::state::mouse::Button::Left))); { let mut ui = &mut self.ui.set_widgets(); diff --git a/backends/conrod_crayon/src/events.rs b/backends/conrod_crayon/src/events.rs index b9ec5872e..ea46eaea9 100644 --- a/backends/conrod_crayon/src/events.rs +++ b/backends/conrod_crayon/src/events.rs @@ -7,7 +7,7 @@ use crayon::prelude::*; use crayon::utils::hash::FastHashSet; use serde_json::Result; -pub fn convert_event(ui:&mut Ui){ +pub fn convert_event(ui:&mut Ui,closure:Box,app:&mut T){ let mouse_presses = input::mouse_presses(); for mp in mouse_presses.iter(){ println!("mp {:?}",mp); @@ -50,4 +50,5 @@ pub fn convert_event(ui:&mut Ui){ if j.x > 0.0 || j.y >0.0{ ui.handle_event(Input::Motion(Motion::Scroll{x:j.x as f64,y:j.y as f64})); } + } diff --git a/backends/conrod_example_shared/src/lib.rs b/backends/conrod_example_shared/src/lib.rs index 3b56a392e..6993a890e 100644 --- a/backends/conrod_example_shared/src/lib.rs +++ b/backends/conrod_example_shared/src/lib.rs @@ -22,6 +22,7 @@ pub struct DemoApp { ball_color: conrod_core::Color, sine_frequency: f32, pub rust_logo: conrod_core::image::Id, + pub textedit: String } @@ -33,6 +34,7 @@ impl DemoApp { ball_color: conrod_core::color::WHITE, sine_frequency: 1.0, rust_logo: rust_logo, + textedit: "".to_owned() } } } @@ -97,6 +99,7 @@ widget_ids! { plot_path, // Scrollbar canvas_scrollbar, + text_edit } } From 85082767f1ff8a06addcabfef19d03b5d73352a8 Mon Sep 17 00:00:00 2001 From: alanpoon Date: Sun, 10 Mar 2019 16:24:14 +0800 Subject: [PATCH 10/64] c1 --- azure-pipelines.yml | 5 ++++- ci/azure-install-node.yml | 6 ++++++ ci/azure-install-rust.yml | 25 +++++++++++++++++++++++++ 3 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 ci/azure-install-node.yml create mode 100644 ci/azure-install-rust.yml diff --git a/azure-pipelines.yml b/azure-pipelines.yml index c23ced43c..857db9868 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -10,9 +10,12 @@ pool: vmImage: 'Ubuntu-16.04' steps: +- template: ci/azure-install-rust.yml +- template: ci/azure-install-node.yml - script: echo Hello, world! displayName: 'Run a one-line script' - +- script: cargo build +- script: node -v - script: | echo Add other tasks to build, test, and deploy your project. echo See https://aka.ms/yaml diff --git a/ci/azure-install-node.yml b/ci/azure-install-node.yml new file mode 100644 index 000000000..9f77b4103 --- /dev/null +++ b/ci/azure-install-node.yml @@ -0,0 +1,6 @@ +steps: + - script: rustup target add wasm32-unknown-unknown + displayName: "Add WebAssembly target via rustup" + - task: NodeTool@0 + inputs: + versionSpec: '>=10.11' diff --git a/ci/azure-install-rust.yml b/ci/azure-install-rust.yml new file mode 100644 index 000000000..dd4ac1c06 --- /dev/null +++ b/ci/azure-install-rust.yml @@ -0,0 +1,25 @@ +parameters: + toolchain: 'stable' + +steps: + - bash: | + curl https://sh.rustup.rs -sSf | sh -s -- -y --default-toolchain $TOOLCHAIN + echo "##vso[task.setvariable variable=PATH;]$PATH:$HOME/.cargo/bin" + displayName: Install rust - Unix + condition: ne( variables['Agent.OS'], 'Windows_NT' ) + env: + TOOLCHAIN: ${{ parameters.toolchain }} + + - script: | + curl -sSf -o rustup-init.exe https://win.rustup.rs + rustup-init.exe -y --default-toolchain %TOOLCHAIN% + echo "##vso[task.setvariable variable=PATH;]%PATH%;%USERPROFILE%\.cargo\bin" + displayName: Install rust - Windows + condition: eq( variables['Agent.OS'], 'Windows_NT' ) + env: + TOOLCHAIN: ${{ parameters.toolchain }} + + - script: | + rustc -Vv + cargo -V + displayName: Query rust and cargo versions From bd57431f7066885a91973ad302b5a171bb689bf4 Mon Sep 17 00:00:00 2001 From: alanpoon Date: Sun, 10 Mar 2019 21:29:06 +0800 Subject: [PATCH 11/64] fix cargo build --- backends/conrod_crayon/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backends/conrod_crayon/Cargo.toml b/backends/conrod_crayon/Cargo.toml index 183fe6b7a..9b72f8d02 100644 --- a/backends/conrod_crayon/Cargo.toml +++ b/backends/conrod_crayon/Cargo.toml @@ -17,7 +17,7 @@ path = "./src/lib.rs" [dependencies] conrod_core = { path = "../../conrod_core", version = "0.63" } -crayon = { path = "../../../wasm/crayon"} +crayon = { git = "https://github.com/alanpoon/crayon.git", branch ="textedit"} conrod_example_shared = { path = "../conrod_example_shared", version = "0.63" } serde_json = "1.0" From aecd4161cc30160f83e32596784a372dc9f0a086 Mon Sep 17 00:00:00 2001 From: alanpoon Date: Sun, 10 Mar 2019 21:52:43 +0800 Subject: [PATCH 12/64] wasm --- azure-pipelines.yml | 3 ++- backends/conrod_crayon/tools/wasm-template/run.sh | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 857db9868..9fef649d0 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -14,7 +14,8 @@ steps: - template: ci/azure-install-node.yml - script: echo Hello, world! displayName: 'Run a one-line script' -- script: cargo build +- script: cd backends/conrod_crayon/tools/wasm-template && npm install +- script: backends/conrod_crayon/tools/run.sh - script: node -v - script: | echo Add other tasks to build, test, and deploy your project. diff --git a/backends/conrod_crayon/tools/wasm-template/run.sh b/backends/conrod_crayon/tools/wasm-template/run.sh index 217fe2247..861d000b8 100755 --- a/backends/conrod_crayon/tools/wasm-template/run.sh +++ b/backends/conrod_crayon/tools/wasm-template/run.sh @@ -7,4 +7,4 @@ cp $BASE_DIR/target/wasm32-unknown-unknown/debug/examples/$1.wasm $SCRIPT_DIR/di wasm-bindgen $SCRIPT_DIR/dist/intermediate/native.wasm --out-dir $SCRIPT_DIR/dist cd $SCRIPT_DIR -sudo npm run serve \ No newline at end of file +npm run serve \ No newline at end of file From 10d3c5ff7d874ddd5166cc26f5303ddd420ade56 Mon Sep 17 00:00:00 2001 From: alanpoon Date: Sun, 10 Mar 2019 21:57:22 +0800 Subject: [PATCH 13/64] t --- azure-pipelines.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 9fef649d0..4a7fd91f6 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -15,7 +15,7 @@ steps: - script: echo Hello, world! displayName: 'Run a one-line script' - script: cd backends/conrod_crayon/tools/wasm-template && npm install -- script: backends/conrod_crayon/tools/run.sh +- script: backends/conrod_crayon/tools/wasm-template/run.sh - script: node -v - script: | echo Add other tasks to build, test, and deploy your project. From 4a96b08093c08caf22e1b86cbc3b398742b1a656 Mon Sep 17 00:00:00 2001 From: alanpoon Date: Sun, 10 Mar 2019 22:02:48 +0800 Subject: [PATCH 14/64] t2 --- azure-pipelines.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 4a7fd91f6..b2d2905a8 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -15,7 +15,7 @@ steps: - script: echo Hello, world! displayName: 'Run a one-line script' - script: cd backends/conrod_crayon/tools/wasm-template && npm install -- script: backends/conrod_crayon/tools/wasm-template/run.sh +- script: backends/conrod_crayon/tools/wasm-template/run.sh crayon - script: node -v - script: | echo Add other tasks to build, test, and deploy your project. From ddd91be7b19d37337197284c403e6e4e9fb94144 Mon Sep 17 00:00:00 2001 From: alanpoon Date: Sun, 10 Mar 2019 22:21:22 +0800 Subject: [PATCH 15/64] t3 --- backends/conrod_crayon/tools/wasm-template/run.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/backends/conrod_crayon/tools/wasm-template/run.sh b/backends/conrod_crayon/tools/wasm-template/run.sh index 861d000b8..3f2a40e37 100755 --- a/backends/conrod_crayon/tools/wasm-template/run.sh +++ b/backends/conrod_crayon/tools/wasm-template/run.sh @@ -3,6 +3,8 @@ BASE_DIR=$SCRIPT_DIR/../../../../ set -e cargo build --example $1 --target wasm32-unknown-unknown +mkdir $SCRIPT_DIR/dist +mkdir $SCRIPT_DIR/dist/intermediate cp $BASE_DIR/target/wasm32-unknown-unknown/debug/examples/$1.wasm $SCRIPT_DIR/dist/intermediate/native.wasm wasm-bindgen $SCRIPT_DIR/dist/intermediate/native.wasm --out-dir $SCRIPT_DIR/dist From 9122163af601c70ddcd8f100187e986121c1b29f Mon Sep 17 00:00:00 2001 From: alanpoon Date: Mon, 11 Mar 2019 21:10:59 +0800 Subject: [PATCH 16/64] t4 --- azure-pipelines.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index b2d2905a8..d820a418a 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -14,6 +14,7 @@ steps: - template: ci/azure-install-node.yml - script: echo Hello, world! displayName: 'Run a one-line script' +- script: cargo install wasm-bindgen-cli - script: cd backends/conrod_crayon/tools/wasm-template && npm install - script: backends/conrod_crayon/tools/wasm-template/run.sh crayon - script: node -v From 7d1e3813675e5f6ef7f4d72353212cb9024af4b6 Mon Sep 17 00:00:00 2001 From: alanpoon Date: Mon, 11 Mar 2019 22:54:35 +0800 Subject: [PATCH 17/64] t5 --- azure-pipelines.yml | 13 +- .../conrod_crayon/tools/wasm-template/app.js | 7 + .../tools/wasm-template/package-lock.json | 358 ++++++++---------- .../tools/wasm-template/package.json | 3 + .../conrod_crayon/tools/wasm-template/run.sh | 2 +- 5 files changed, 167 insertions(+), 216 deletions(-) create mode 100644 backends/conrod_crayon/tools/wasm-template/app.js diff --git a/azure-pipelines.yml b/azure-pipelines.yml index d820a418a..af855a814 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -17,8 +17,11 @@ steps: - script: cargo install wasm-bindgen-cli - script: cd backends/conrod_crayon/tools/wasm-template && npm install - script: backends/conrod_crayon/tools/wasm-template/run.sh crayon -- script: node -v -- script: | - echo Add other tasks to build, test, and deploy your project. - echo See https://aka.ms/yaml - displayName: 'Run a multi-line script' +- task: AzureRmWebAppDeployment@3 + inputs: + azureSubscription: 'Free Trial' + WebAppName: 'conrod' + Package: '$(System.DefaultWorkingDirectory)/backends/conrod_crayon/tools/wasm-template' + GenerateWebConfig: true + WebConfigParameters: '-Handler iisnode -NodeStartFile app.js -appType node' + diff --git a/backends/conrod_crayon/tools/wasm-template/app.js b/backends/conrod_crayon/tools/wasm-template/app.js new file mode 100644 index 000000000..177dc5f9a --- /dev/null +++ b/backends/conrod_crayon/tools/wasm-template/app.js @@ -0,0 +1,7 @@ +var express = require('express') +var app = express() + +// respond with "hello world" when a GET request is made to the homepage + +app.use(express.static('dist')); +app.listen(3000); diff --git a/backends/conrod_crayon/tools/wasm-template/package-lock.json b/backends/conrod_crayon/tools/wasm-template/package-lock.json index bb312b543..ec9faabbf 100644 --- a/backends/conrod_crayon/tools/wasm-template/package-lock.json +++ b/backends/conrod_crayon/tools/wasm-template/package-lock.json @@ -192,7 +192,7 @@ "@xtuc/ieee754": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "integrity": "sha1-7vAUoxRa5Hehy8AM0eVSM23Ot5A=", "dev": true }, "@xtuc/long": { @@ -205,7 +205,6 @@ "version": "1.3.5", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", - "dev": true, "requires": { "mime-types": "~2.1.18", "negotiator": "0.6.1" @@ -220,7 +219,7 @@ "acorn-dynamic-import": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-4.0.0.tgz", - "integrity": "sha512-d3OEjQV4ROpoflsnUA8HozoIR504TFxNivYEUi6uwz0IYhBkTDXGuWlNdMtybRt3nqVx/L6XqMt0FxkXuWKZhw==", + "integrity": "sha1-SCIQFAWCo2uDw+NC4c/ryqkkCUg=", "dev": true }, "ajv": { @@ -287,7 +286,7 @@ "aproba": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "integrity": "sha1-aALmJk79GMeQobDVF/DyYnvyyUo=", "dev": true }, "arr-diff": { @@ -338,7 +337,7 @@ "asn1.js": { "version": "4.10.1", "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", - "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", + "integrity": "sha1-ucK/WAXx5kqt7tbfOiv6+1pz9aA=", "dev": true, "requires": { "bn.js": "^4.0.0", @@ -460,7 +459,7 @@ "base64-js": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", - "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==", + "integrity": "sha1-yrHmEY8FEJXli1KBrqjBzSK/wOM=", "dev": true }, "batch": { @@ -484,20 +483,19 @@ "bluebird": { "version": "3.5.3", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.3.tgz", - "integrity": "sha512-/qKPUQlaW1OyR51WeCPBvRnAlnZFUJkCSG5HzGnuIqhgyJtF+T94lFnn33eiazjRm2LAHVy2guNnaq48X9SJuw==", + "integrity": "sha1-fQHG+WFsmlGrD4xUmnnf5uwz76c=", "dev": true }, "bn.js": { "version": "4.11.8", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", - "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", + "integrity": "sha1-LN4J617jQfSEdGuwMJsyU7GxRC8=", "dev": true }, "body-parser": { "version": "1.18.3", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz", "integrity": "sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ=", - "dev": true, "requires": { "bytes": "3.0.0", "content-type": "~1.0.4", @@ -579,7 +577,7 @@ "browserify-aes": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "integrity": "sha1-Mmc0ZC9APavDADIJhTu3CtQo70g=", "dev": true, "requires": { "buffer-xor": "^1.0.3", @@ -593,7 +591,7 @@ "browserify-cipher": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", - "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "integrity": "sha1-jWR0wbhwv9q807z8wZNKEOlPFfA=", "dev": true, "requires": { "browserify-aes": "^1.0.4", @@ -604,7 +602,7 @@ "browserify-des": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", - "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "integrity": "sha1-OvTx9Zg5QDVy8cZiBDdfen9wPpw=", "dev": true, "requires": { "cipher-base": "^1.0.1", @@ -641,7 +639,7 @@ "browserify-zlib": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", - "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "integrity": "sha1-KGlFnZqjviRf6P4sofRuLn9U1z8=", "dev": true, "requires": { "pako": "~1.0.5" @@ -669,7 +667,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==", + "integrity": "sha1-MnE7wCj3XAL9txDXx7zsHyxgcO8=", "dev": true }, "buffer-indexof": { @@ -693,13 +691,12 @@ "bytes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", - "dev": true + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" }, "cacache": { "version": "11.3.2", "resolved": "https://registry.npmjs.org/cacache/-/cacache-11.3.2.tgz", - "integrity": "sha512-E0zP4EPGDOaT2chM08Als91eYnf8Z+eH1awwwVsngUmgppfM5jjJ8l3z5vO5p5w/I3LsiXawb1sW0VY65pQABg==", + "integrity": "sha1-LYHjCOPSWMo4Eltna5iyrJzmm/o=", "dev": true, "requires": { "bluebird": "^3.5.3", @@ -794,13 +791,13 @@ "chownr": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.1.tgz", - "integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==", + "integrity": "sha1-VHJri4//TfBTxCGH6AH7RBLfFJQ=", "dev": true }, "chrome-trace-event": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.0.tgz", - "integrity": "sha512-xDbVgyfDTT2piup/h8dK/y4QZfJRSa73bw1WZ8b4XM1o7fsFubUVGYcE+1ANtOzJJELGpYoG2961z0Z6OAld9A==", + "integrity": "sha1-Rakb0sIMlBHwljtarrmhuV4JzEg=", "dev": true, "requires": { "tslib": "^1.9.0" @@ -809,7 +806,7 @@ "cipher-base": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "integrity": "sha1-h2Dk7MJy9MNjUy+SbYdKriwTl94=", "dev": true, "requires": { "inherits": "^2.0.1", @@ -964,7 +961,7 @@ "concat-stream": { "version": "1.6.2", "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "integrity": "sha1-kEvfGUzTEi/Gdcd/xKw9T/D9GjQ=", "dev": true, "requires": { "buffer-from": "^1.0.0", @@ -982,7 +979,7 @@ "readable-stream": { "version": "2.3.6", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "integrity": "sha1-sRwn2IuP8fvgcGQ8+UsMea4bCq8=", "dev": true, "requires": { "core-util-is": "~1.0.0", @@ -997,7 +994,7 @@ "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==", + "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=", "dev": true, "requires": { "safe-buffer": "~5.1.0" @@ -1029,31 +1026,27 @@ "content-disposition": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", - "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=", - "dev": true + "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=" }, "content-type": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha1-4TjMdeBAxyexlm/l5fjJruJW/js=", - "dev": true + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" }, "cookie": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", - "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=", - "dev": true + "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" }, "cookie-signature": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", - "dev": true + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" }, "copy-concurrently": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", - "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", + "integrity": "sha1-kilzmMrjSTf8r9bsgTnBgFHwteA=", "dev": true, "requires": { "aproba": "^1.1.1", @@ -1079,7 +1072,7 @@ "create-ecdh": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", - "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", + "integrity": "sha1-yREbbzMEXEaX8UR4f5JUzcd8Rf8=", "dev": true, "requires": { "bn.js": "^4.1.0", @@ -1089,7 +1082,7 @@ "create-hash": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "integrity": "sha1-iJB4rxGmN1a8+1m9IhmWvjqe8ZY=", "dev": true, "requires": { "cipher-base": "^1.0.1", @@ -1102,7 +1095,7 @@ "create-hmac": { "version": "1.1.7", "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "integrity": "sha1-aRcMeLOrlXFHsriwRXLkfq0iQ/8=", "dev": true, "requires": { "cipher-base": "^1.0.3", @@ -1129,7 +1122,7 @@ "crypto-browserify": { "version": "3.12.0", "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", - "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "integrity": "sha1-OWz58xN/A+S45TLFj2mCVOAPgOw=", "dev": true, "requires": { "browserify-cipher": "^1.0.0", @@ -1179,7 +1172,6 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", - "dev": true, "requires": { "ms": "2.0.0" } @@ -1282,8 +1274,7 @@ "depd": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", - "dev": true + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" }, "des.js": { "version": "1.0.0", @@ -1298,8 +1289,7 @@ "destroy": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", - "dev": true + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" }, "detect-node": { "version": "2.0.4", @@ -1310,7 +1300,7 @@ "diffie-hellman": { "version": "5.0.3", "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", - "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "integrity": "sha1-QOjumPVaIUlgcUaSHGPhrl89KHU=", "dev": true, "requires": { "bn.js": "^4.1.0", @@ -1373,7 +1363,7 @@ "domain-browser": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", - "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", + "integrity": "sha1-PTH1AZGmdJ3RN1p/Ui6CPULlTto=", "dev": true }, "domelementtype": { @@ -1422,7 +1412,7 @@ "readable-stream": { "version": "2.3.6", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "integrity": "sha1-sRwn2IuP8fvgcGQ8+UsMea4bCq8=", "dev": true, "requires": { "core-util-is": "~1.0.0", @@ -1437,7 +1427,7 @@ "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==", + "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=", "dev": true, "requires": { "safe-buffer": "~5.1.0" @@ -1448,13 +1438,12 @@ "ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", - "dev": true + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" }, "elliptic": { "version": "6.4.1", "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.1.tgz", - "integrity": "sha512-BsXLz5sqX8OHcsh7CqBMztyXARmGQ3LWPtGjJi6DiJHq5C/qvi9P3OqgswKSDftbu8+IoI/QDTAm2fFnQ9SZSQ==", + "integrity": "sha1-wtC3d2kRuGcixjLDwGxg8vgZk5o=", "dev": true, "requires": { "bn.js": "^4.4.0", @@ -1475,13 +1464,12 @@ "encodeurl": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", - "dev": true + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" }, "end-of-stream": { "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==", + "integrity": "sha1-7SljTRm6ukY7bOa4CjchPqtx7EM=", "dev": true, "requires": { "once": "^1.4.0" @@ -1540,8 +1528,7 @@ "escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", - "dev": true + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" }, "escape-string-regexp": { "version": "1.0.5", @@ -1562,7 +1549,7 @@ "esrecurse": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", - "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "integrity": "sha1-AHo7n9vCs7uH5IeeoZyS/b05Qs8=", "dev": true, "requires": { "estraverse": "^4.1.0" @@ -1577,8 +1564,7 @@ "etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", - "dev": true + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" }, "eventemitter3": { "version": "3.1.0", @@ -1589,7 +1575,7 @@ "events": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/events/-/events-3.0.0.tgz", - "integrity": "sha512-Dc381HFWJzEOhQ+d8pkNon++bk9h6cdAoAj4iE6Q4y6xgTzySWXlKn05/TVNpjnfRqi/X0EpJEJohPjNI3zpVA==", + "integrity": "sha1-mgoN+vYok9krh1uPJpjKQRSXPog=", "dev": true }, "eventsource": { @@ -1604,7 +1590,7 @@ "evp_bytestokey": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "integrity": "sha1-f8vbGY3HGVlDLv4ThCaE4FJaywI=", "dev": true, "requires": { "md5.js": "^1.3.4", @@ -1664,8 +1650,7 @@ "express": { "version": "4.16.4", "resolved": "https://registry.npmjs.org/express/-/express-4.16.4.tgz", - "integrity": "sha1-/d72GSYQniTFFeqX/S8b2/Yt8S4=", - "dev": true, + "integrity": "sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg==", "requires": { "accepts": "~1.3.5", "array-flatten": "1.1.1", @@ -1702,8 +1687,7 @@ "array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", - "dev": true + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" } } }, @@ -1817,7 +1801,7 @@ "figgy-pudding": { "version": "3.5.1", "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.1.tgz", - "integrity": "sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w==", + "integrity": "sha1-hiRwESkBxyeg5JWoB0S9W6odZ5A=", "dev": true }, "fill-range": { @@ -1845,9 +1829,8 @@ }, "finalhandler": { "version": "1.1.1", - "resolved": "http://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", - "dev": true, "requires": { "debug": "2.6.9", "encodeurl": "~1.0.2", @@ -1861,7 +1844,7 @@ "find-cache-dir": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.0.0.tgz", - "integrity": "sha512-LDUY6V1Xs5eFskUVYtIwatojt6+9xC9Chnlk/jYOOvn3FAFfSaWddxahDGyNHh0b2dMXa6YW2m0tk8TdVaXHlA==", + "integrity": "sha1-TB+u1Z9FGEUw+51/oSOk0EqYRy0=", "dev": true, "requires": { "commondir": "^1.0.1", @@ -1872,7 +1855,7 @@ "find-up": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "integrity": "sha1-SRafHXmTQwZG2mHsxa41XCHJe3M=", "dev": true, "requires": { "locate-path": "^3.0.0" @@ -1897,7 +1880,7 @@ "readable-stream": { "version": "2.3.6", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "integrity": "sha1-sRwn2IuP8fvgcGQ8+UsMea4bCq8=", "dev": true, "requires": { "core-util-is": "~1.0.0", @@ -1912,7 +1895,7 @@ "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==", + "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=", "dev": true, "requires": { "safe-buffer": "~5.1.0" @@ -1932,7 +1915,7 @@ "debug": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "integrity": "sha1-W7WgZyYotkFJVmuhaBnmFRjGcmE=", "dev": true, "requires": { "ms": "2.0.0" @@ -1949,8 +1932,7 @@ "forwarded": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", - "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", - "dev": true + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" }, "fragment-cache": { "version": "0.2.1", @@ -1964,8 +1946,7 @@ "fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", - "dev": true + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" }, "from2": { "version": "2.3.0", @@ -1986,7 +1967,7 @@ "readable-stream": { "version": "2.3.6", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "integrity": "sha1-sRwn2IuP8fvgcGQ8+UsMea4bCq8=", "dev": true, "requires": { "core-util-is": "~1.0.0", @@ -2001,7 +1982,7 @@ "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==", + "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=", "dev": true, "requires": { "safe-buffer": "~5.1.0" @@ -2068,14 +2049,12 @@ "balanced-match": { "version": "1.0.0", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "brace-expansion": { "version": "1.1.11", "bundled": true, "dev": true, - "optional": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -2090,20 +2069,17 @@ "code-point-at": { "version": "1.1.0", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "concat-map": { "version": "0.0.1", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "console-control-strings": { "version": "1.1.0", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "core-util-is": { "version": "1.0.2", @@ -2220,8 +2196,7 @@ "inherits": { "version": "2.0.3", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "ini": { "version": "1.3.5", @@ -2233,7 +2208,6 @@ "version": "1.0.0", "bundled": true, "dev": true, - "optional": true, "requires": { "number-is-nan": "^1.0.0" } @@ -2248,7 +2222,6 @@ "version": "3.0.4", "bundled": true, "dev": true, - "optional": true, "requires": { "brace-expansion": "^1.1.7" } @@ -2256,14 +2229,12 @@ "minimist": { "version": "0.0.8", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "minipass": { "version": "2.2.4", "bundled": true, "dev": true, - "optional": true, "requires": { "safe-buffer": "^5.1.1", "yallist": "^3.0.0" @@ -2282,7 +2253,6 @@ "version": "0.5.1", "bundled": true, "dev": true, - "optional": true, "requires": { "minimist": "0.0.8" } @@ -2363,8 +2333,7 @@ "number-is-nan": { "version": "1.0.1", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "object-assign": { "version": "4.1.1", @@ -2376,7 +2345,6 @@ "version": "1.4.0", "bundled": true, "dev": true, - "optional": true, "requires": { "wrappy": "1" } @@ -2498,7 +2466,6 @@ "version": "1.0.2", "bundled": true, "dev": true, - "optional": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -2734,7 +2701,7 @@ "hash.js": { "version": "1.1.7", "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "integrity": "sha1-C6vKU46NTuSg+JiNaIZlN6ADz0I=", "dev": true, "requires": { "inherits": "^2.0.3", @@ -2871,7 +2838,6 @@ "version": "1.6.3", "resolved": "http://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", - "dev": true, "requires": { "depd": "~1.1.2", "inherits": "2.0.3", @@ -2917,8 +2883,7 @@ "iconv-lite": { "version": "0.4.23", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", - "integrity": "sha1-KXhx9jvlB63Pv8pxXQzQ7thOmmM=", - "dev": true, + "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", "requires": { "safer-buffer": ">= 2.1.2 < 3" } @@ -2926,7 +2891,7 @@ "ieee754": { "version": "1.1.12", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.12.tgz", - "integrity": "sha512-GguP+DRY+pJ3soyIiGPTvdiVXjZ+DbXOxGpXn3eMvNW4x4irjqXm4wHKscC+TfxSJ0yw/S1F24tqdMNsMZTiLA==", + "integrity": "sha1-UL8k5bnIu5ivSWTJQc2wkY2ntgs=", "dev": true }, "iferr": { @@ -3024,8 +2989,7 @@ "inherits": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" }, "internal-ip": { "version": "3.0.1", @@ -3064,8 +3028,7 @@ "ipaddr.js": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.8.0.tgz", - "integrity": "sha1-6qM9bd16zo9/b+DJygRA5wZzix4=", - "dev": true + "integrity": "sha1-6qM9bd16zo9/b+DJygRA5wZzix4=" }, "is-accessor-descriptor": { "version": "0.1.6", @@ -3290,7 +3253,7 @@ "json-parse-better-errors": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "integrity": "sha1-u4Z8+zRQ5pEHwTHRxRS6s9yLyqk=", "dev": true }, "json-schema-traverse": { @@ -3335,7 +3298,7 @@ "loader-runner": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", - "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", + "integrity": "sha1-7UcGa/5TTX6ExMe5mYwqdWB9k1c=", "dev": true }, "loader-utils": { @@ -3353,7 +3316,7 @@ "locate-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "integrity": "sha1-2+w7OrdZdYBxtY/ln8QYca8hQA4=", "dev": true, "requires": { "p-locate": "^3.0.0", @@ -3387,7 +3350,7 @@ "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==", + "integrity": "sha1-HaJ+ZxAnGUdpXa9oSOhH8B2EuSA=", "dev": true, "requires": { "yallist": "^3.0.2" @@ -3396,7 +3359,7 @@ "make-dir": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", - "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "integrity": "sha1-ecEDO4BRW9bSTsmTPoYMp17ifww=", "dev": true, "requires": { "pify": "^3.0.0" @@ -3435,7 +3398,7 @@ "md5.js": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", - "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "integrity": "sha1-tdB7jjIW4+J81yjXL3DR5qNCAF8=", "dev": true, "requires": { "hash-base": "^3.0.0", @@ -3445,9 +3408,8 @@ }, "media-typer": { "version": "0.3.0", - "resolved": "http://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", - "dev": true + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" }, "mem": { "version": "4.0.0", @@ -3505,14 +3467,12 @@ "merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", - "dev": true + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" }, "methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", - "dev": true + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" }, "micromatch": { "version": "3.1.10", @@ -3538,7 +3498,7 @@ "miller-rabin": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "integrity": "sha1-8IA1HIZbDcViqEYpZtqlNUPHik0=", "dev": true, "requires": { "bn.js": "^4.0.0", @@ -3548,20 +3508,17 @@ "mime": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", - "integrity": "sha1-Eh+evEnjdm8xGnbh+hyAA8SwOqY=", - "dev": true + "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==" }, "mime-db": { "version": "1.37.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.37.0.tgz", - "integrity": "sha1-C2oM5v2+lXbiXx8tL96IMNwK0Ng=", - "dev": true + "integrity": "sha1-C2oM5v2+lXbiXx8tL96IMNwK0Ng=" }, "mime-types": { "version": "2.1.21", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.21.tgz", "integrity": "sha1-KJlaoey3cHQv5q5+WPkYHHRLP5Y=", - "dev": true, "requires": { "mime-db": "~1.37.0" } @@ -3602,7 +3559,7 @@ "mississippi": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", - "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", + "integrity": "sha1-6goykfl+C16HdrNj1fChLZTGcCI=", "dev": true, "requires": { "concat-stream": "^1.5.0", @@ -3664,8 +3621,7 @@ "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, "multicast-dns": { "version": "6.2.3", @@ -3712,13 +3668,12 @@ "negotiator": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", - "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=", - "dev": true + "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" }, "neo-async": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.0.tgz", - "integrity": "sha512-MFh0d/Wa7vkKO3Y3LlacqAEeHK0mckVqzDieUKTT+KGxi+zIpeVsFxymkIiRpbpDziHc290Xr9A1O4Om7otoRA==", + "integrity": "sha1-udFeTXHGdikIZUtRg+04t1M0CDU=", "dev": true }, "nice-try": { @@ -3745,7 +3700,7 @@ "node-libs-browser": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.0.tgz", - "integrity": "sha512-5MQunG/oyOaBdttrL40dA7bUfPORLRWMUJLQtMg7nluxUvk5XwnLdL9twQHFAjRx/y7mIMkLKT9++qPbbk6BZA==", + "integrity": "sha1-xy9g2dRt4IqUDe27JfP/ovm7qnc=", "dev": true, "requires": { "assert": "^1.1.1", @@ -3788,7 +3743,7 @@ "readable-stream": { "version": "2.3.6", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "integrity": "sha1-sRwn2IuP8fvgcGQ8+UsMea4bCq8=", "dev": true, "requires": { "core-util-is": "~1.0.0", @@ -3803,7 +3758,7 @@ "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==", + "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=", "dev": true, "requires": { "safe-buffer": "~5.1.0" @@ -3814,7 +3769,7 @@ "string_decoder": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.2.0.tgz", - "integrity": "sha512-6YqyX6ZWEYguAxgZzHGL7SsCeGx3V2TtOTqZz1xSTSWnqsbWwbptafNyvf/ACquZUXV3DANr5BDIwNYe1mN42w==", + "integrity": "sha1-/obnOLGVRK/nBGkkOyoe6SQOro0=", "dev": true, "requires": { "safe-buffer": "~5.1.0" @@ -3936,7 +3891,6 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "dev": true, "requires": { "ee-first": "1.1.1" } @@ -4021,7 +3975,7 @@ "p-locate": { "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==", + "integrity": "sha1-Mi1poFwCZLJZl9n0DNiokasAZKQ=", "dev": true, "requires": { "p-limit": "^2.0.0" @@ -4036,7 +3990,7 @@ "p-try": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz", - "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==", + "integrity": "sha1-hQgLuHxkaI+keZb+j3376CEXYLE=", "dev": true }, "pako": { @@ -4065,7 +4019,7 @@ "readable-stream": { "version": "2.3.6", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "integrity": "sha1-sRwn2IuP8fvgcGQ8+UsMea4bCq8=", "dev": true, "requires": { "core-util-is": "~1.0.0", @@ -4080,7 +4034,7 @@ "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==", + "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=", "dev": true, "requires": { "safe-buffer": "~5.1.0" @@ -4114,8 +4068,7 @@ "parseurl": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", - "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=", - "dev": true + "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=" }, "pascalcase": { "version": "0.1.1", @@ -4162,13 +4115,12 @@ "path-to-regexp": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", - "dev": true + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" }, "pbkdf2": { "version": "3.0.17", "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", - "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", + "integrity": "sha1-l2wgZTBhexTrsyEUI597CTNuk6Y=", "dev": true, "requires": { "create-hash": "^1.1.2", @@ -4202,7 +4154,7 @@ "pkg-dir": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "integrity": "sha1-J0kCDyOe2ZCIGx9xIQ1R62UjvqM=", "dev": true, "requires": { "find-up": "^3.0.0" @@ -4256,8 +4208,7 @@ "proxy-addr": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.4.tgz", - "integrity": "sha1-7PxzO/Iv+Mb0B/onUye5q2fki5M=", - "dev": true, + "integrity": "sha512-5erio2h9jp5CHGwcybmxmVqHmnCBZeewlfJ0pex+UW7Qny7OOZXTtH56TGNyBizkgiOwhJtMKrVzDTeKcySZwA==", "requires": { "forwarded": "~0.1.2", "ipaddr.js": "1.8.0" @@ -4272,7 +4223,7 @@ "public-encrypt": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", - "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "integrity": "sha1-T8ydd6B+SLp1J+fL4N4z0HATMeA=", "dev": true, "requires": { "bn.js": "^4.1.0", @@ -4286,7 +4237,7 @@ "pump": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "integrity": "sha1-tKIRaBW94vTh6mAjVOjHVWUQemQ=", "dev": true, "requires": { "end-of-stream": "^1.1.0", @@ -4296,7 +4247,7 @@ "pumpify": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", - "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "integrity": "sha1-NlE74karJ1cLGjdKXOJ4v9dDcM4=", "dev": true, "requires": { "duplexify": "^3.6.0", @@ -4307,7 +4258,7 @@ "pump": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", - "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "integrity": "sha1-Ejma3W5M91Jtlzy8i1zi4pCLOQk=", "dev": true, "requires": { "end-of-stream": "^1.1.0", @@ -4325,8 +4276,7 @@ "qs": { "version": "6.5.2", "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha1-yzroBuh0BERYTvFUzo7pjUA/PjY=", - "dev": true + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" }, "querystring": { "version": "0.2.0", @@ -4358,7 +4308,7 @@ "randomfill": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", - "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "integrity": "sha1-ySGW/IarQr6YPxvzF3giSTHWFFg=", "dev": true, "requires": { "randombytes": "^2.0.5", @@ -4368,14 +4318,12 @@ "range-parser": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", - "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=", - "dev": true + "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=" }, "raw-body": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz", - "integrity": "sha1-GzJOzmtXBuFThVvBFIxlu39uoMM=", - "dev": true, + "integrity": "sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw==", "requires": { "bytes": "3.0.0", "http-errors": "1.6.3", @@ -4542,7 +4490,7 @@ "ripemd160": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "integrity": "sha1-ocGm9iR1FXe6XQeRTLyShQWFiQw=", "dev": true, "requires": { "hash-base": "^3.0.0", @@ -4561,8 +4509,7 @@ "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha1-mR7GnSluAxN0fVm9/St0XDX4go0=", - "dev": true + "integrity": "sha1-mR7GnSluAxN0fVm9/St0XDX4go0=" }, "safe-regex": { "version": "1.1.0", @@ -4576,8 +4523,7 @@ "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha1-RPoWGwGHuVSd2Eu5GAL5vYOFzWo=", - "dev": true + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "schema-utils": { "version": "1.0.0", @@ -4614,8 +4560,7 @@ "send": { "version": "0.16.2", "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", - "integrity": "sha1-bsyh4PjBVtFBWXVZhI32RzCmu8E=", - "dev": true, + "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", "requires": { "debug": "2.6.9", "depd": "~1.1.2", @@ -4635,7 +4580,7 @@ "serialize-javascript": { "version": "1.6.1", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.6.1.tgz", - "integrity": "sha512-A5MOagrPFga4YaKQSWHryl7AXvbQkEqpw4NNYMTNYUNV51bA8ABHgYFpqKx+YFFrw59xMV1qGH1R4AgoNIVgCw==", + "integrity": "sha1-TR9pfsSUKahHym9EKip1USbE2Hk=", "dev": true }, "serve-index": { @@ -4656,8 +4601,7 @@ "serve-static": { "version": "1.13.2", "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", - "integrity": "sha1-CV6Ecv1bRiN9tQzkhqQ/S4bGzsE=", - "dev": true, + "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", "requires": { "encodeurl": "~1.0.2", "escape-html": "~1.0.3", @@ -4703,13 +4647,12 @@ "setprototypeof": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha1-0L2FU2iHtv58DYGMuWLZ2RxU5lY=", - "dev": true + "integrity": "sha1-0L2FU2iHtv58DYGMuWLZ2RxU5lY=" }, "sha.js": { "version": "2.4.11", "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "integrity": "sha1-N6XPC4HsvGlD3hCbopYNGyZYSuc=", "dev": true, "requires": { "inherits": "^2.0.1", @@ -4903,7 +4846,7 @@ "source-list-map": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", - "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", + "integrity": "sha1-OZO9hzv8SEecyp6jpUeDXHwVSzQ=", "dev": true }, "source-map": { @@ -4928,7 +4871,7 @@ "source-map-support": { "version": "0.5.10", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.10.tgz", - "integrity": "sha512-YfQ3tQFTK/yzlGJuX8pTwa4tifQj4QS2Mj7UegOu8jAz59MqIiMGPXxQhVQiIMNzayuUSF/jEuVnfFF5JqybmQ==", + "integrity": "sha1-IhQIC8nVGDJRHuK6uW48L5NTEgw=", "dev": true, "requires": { "buffer-from": "^1.0.0", @@ -5014,7 +4957,7 @@ "ssri": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", - "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", + "integrity": "sha1-KjxBso3UW2K2Nnbst0ABJlrp7dg=", "dev": true, "requires": { "figgy-pudding": "^3.5.1" @@ -5044,13 +4987,12 @@ "statuses": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", - "integrity": "sha1-u3PURtonlhBu/MG2AaJT1sRr0Ic=", - "dev": true + "integrity": "sha1-u3PURtonlhBu/MG2AaJT1sRr0Ic=" }, "stream-browserify": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", - "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", + "integrity": "sha1-h1IdOKRKp+6RzhzSpH3wy0ndZgs=", "dev": true, "requires": { "inherits": "~2.0.1", @@ -5066,7 +5008,7 @@ "readable-stream": { "version": "2.3.6", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "integrity": "sha1-sRwn2IuP8fvgcGQ8+UsMea4bCq8=", "dev": true, "requires": { "core-util-is": "~1.0.0", @@ -5081,7 +5023,7 @@ "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==", + "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=", "dev": true, "requires": { "safe-buffer": "~5.1.0" @@ -5092,7 +5034,7 @@ "stream-each": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", - "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", + "integrity": "sha1-6+J6DDibBPvMIzZClS4Qcxr6m64=", "dev": true, "requires": { "end-of-stream": "^1.1.0", @@ -5102,7 +5044,7 @@ "stream-http": { "version": "2.8.3", "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", - "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", + "integrity": "sha1-stJCRpKIpaJ+xP6JM6z2I95lFPw=", "dev": true, "requires": { "builtin-status-codes": "^3.0.0", @@ -5121,7 +5063,7 @@ "readable-stream": { "version": "2.3.6", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "integrity": "sha1-sRwn2IuP8fvgcGQ8+UsMea4bCq8=", "dev": true, "requires": { "core-util-is": "~1.0.0", @@ -5136,7 +5078,7 @@ "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==", + "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=", "dev": true, "requires": { "safe-buffer": "~5.1.0" @@ -5249,7 +5191,7 @@ "through2": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "integrity": "sha1-AcHjnrMdB8t9A6lqcIIyYLIxMs0=", "dev": true, "requires": { "readable-stream": "~2.3.6", @@ -5265,7 +5207,7 @@ "readable-stream": { "version": "2.3.6", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "integrity": "sha1-sRwn2IuP8fvgcGQ8+UsMea4bCq8=", "dev": true, "requires": { "core-util-is": "~1.0.0", @@ -5280,7 +5222,7 @@ "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==", + "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=", "dev": true, "requires": { "safe-buffer": "~5.1.0" @@ -5297,7 +5239,7 @@ "timers-browserify": { "version": "2.0.10", "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.10.tgz", - "integrity": "sha512-YvC1SV1XdOUaL6gx5CoGroT3Gu49pK9+TZ38ErPldOWW4j49GI1HKs9DV+KGq/w6y+LZ72W1c8cKz2vzY+qpzg==", + "integrity": "sha1-HSjj0qrfHVpZlsTp+VYBzQU0gK4=", "dev": true, "requires": { "setimmediate": "^1.0.4" @@ -5360,7 +5302,7 @@ "tslib": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", - "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==", + "integrity": "sha1-1+TdeSRdhUKMTX5IIqeZF5VMooY=", "dev": true }, "tty-browserify": { @@ -5372,8 +5314,7 @@ "type-is": { "version": "1.6.16", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz", - "integrity": "sha1-+JzjQVQcZysl7nrjxz3uOyvlAZQ=", - "dev": true, + "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==", "requires": { "media-typer": "0.3.0", "mime-types": "~2.1.18" @@ -5433,7 +5374,7 @@ "unique-filename": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", - "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "integrity": "sha1-HWl2k2mtoFgxA6HmrodoG1ZXMjA=", "dev": true, "requires": { "unique-slug": "^2.0.0" @@ -5442,7 +5383,7 @@ "unique-slug": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.1.tgz", - "integrity": "sha512-n9cU6+gITaVu7VGj1Z8feKMmfAjEAQGhwD9fE3zvpRRa0wEIx8ODYkVGfSc94M2OX00tUFV8wH3zYbm1I8mxFg==", + "integrity": "sha1-Xp7cbRzo+yZNsYpQfvm9hURFHKY=", "dev": true, "requires": { "imurmurhash": "^0.1.4" @@ -5451,8 +5392,7 @@ "unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", - "dev": true + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" }, "unset-value": { "version": "1.0.0", @@ -5564,7 +5504,7 @@ "util": { "version": "0.11.1", "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", - "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", + "integrity": "sha1-MjZzNyDsZLsn9uJvQhqqLhtYjWE=", "dev": true, "requires": { "inherits": "2.0.3" @@ -5595,8 +5535,7 @@ "utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", - "dev": true + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" }, "uuid": { "version": "3.3.2", @@ -5613,8 +5552,7 @@ "vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", - "dev": true + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" }, "vm-browserify": { "version": "0.0.4", @@ -5628,7 +5566,7 @@ "watchpack": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz", - "integrity": "sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==", + "integrity": "sha1-S8EsLr6KonenHx0/FNaFx7RGzQA=", "dev": true, "requires": { "chokidar": "^2.0.2", @@ -5680,13 +5618,13 @@ "big.js": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "integrity": "sha1-ZfCvOC9Xi83HQr2cKB6cstd2gyg=", "dev": true }, "json5": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "integrity": "sha1-d5+wAYYE+oVOrL9iUhgNg1Q+Pb4=", "dev": true, "requires": { "minimist": "^1.2.0" @@ -5695,7 +5633,7 @@ "loader-utils": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", - "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", + "integrity": "sha1-H/XcaRHJ8KBiUxpMBLYJQGEIwsc=", "dev": true, "requires": { "big.js": "^5.2.2", @@ -5801,7 +5739,7 @@ "debug": { "version": "3.2.6", "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "integrity": "sha1-6D0X3hbYp++3cX7b5fsQE17uYps=", "dev": true, "requires": { "ms": "^2.1.1" @@ -5810,13 +5748,13 @@ "ms": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "integrity": "sha1-MKWGTrPrsKZvLr5tcnrwagnYbgo=", "dev": true }, "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==", + "integrity": "sha1-C3mpMgTXtgDUsoUNH2bCo0lRx3A=", "dev": true, "requires": { "ajv": "^6.1.0", @@ -5839,7 +5777,7 @@ "webpack-sources": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.3.0.tgz", - "integrity": "sha512-OiVgSrbGu7NEnEvQJJgdSFPl2qWKkWq5lHMhgiToIiN9w34EBnjYzSYs+VbL5KoYiLNtFFa7BZIKxRED3I32pA==", + "integrity": "sha1-KijcufH0X+lg2PFJMlK17mUw+oU=", "dev": true, "requires": { "source-list-map": "^2.0.0", @@ -5880,7 +5818,7 @@ "worker-farm": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.6.0.tgz", - "integrity": "sha512-6w+3tHbM87WnSWnENBUvA2pxJPLhQUg5LKwUQHq3r+XPhIM+Gh2R5ycbwPCyuGbNg+lPgdcnQUhuC02kJCvffQ==", + "integrity": "sha1-rsxAWXb6talVJhgIRvDboojzpKA=", "dev": true, "requires": { "errno": "~0.1.7" @@ -5945,7 +5883,7 @@ "yallist": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", - "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==", + "integrity": "sha1-tLBJ4xS+VF486AIjbWzSLNkcPek=", "dev": true }, "yargs": { diff --git a/backends/conrod_crayon/tools/wasm-template/package.json b/backends/conrod_crayon/tools/wasm-template/package.json index 34116bf2f..cc2a3878d 100644 --- a/backends/conrod_crayon/tools/wasm-template/package.json +++ b/backends/conrod_crayon/tools/wasm-template/package.json @@ -10,5 +10,8 @@ "webpack": "^4.29.4", "webpack-cli": "^3.1.1", "webpack-dev-server": "^3.1.0" + }, + "dependencies": { + "express": "^4.16.4" } } diff --git a/backends/conrod_crayon/tools/wasm-template/run.sh b/backends/conrod_crayon/tools/wasm-template/run.sh index 3f2a40e37..e614b45d5 100755 --- a/backends/conrod_crayon/tools/wasm-template/run.sh +++ b/backends/conrod_crayon/tools/wasm-template/run.sh @@ -9,4 +9,4 @@ cp $BASE_DIR/target/wasm32-unknown-unknown/debug/examples/$1.wasm $SCRIPT_DIR/di wasm-bindgen $SCRIPT_DIR/dist/intermediate/native.wasm --out-dir $SCRIPT_DIR/dist cd $SCRIPT_DIR -npm run serve \ No newline at end of file +npm run build \ No newline at end of file From 5c7369c1ebce940a4c14d125a009d250d832294f Mon Sep 17 00:00:00 2001 From: alan poon Date: Tue, 12 Mar 2019 09:39:02 +0800 Subject: [PATCH 18/64] t6 --- backends/conrod_crayon/tools/wasm-template/app.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/backends/conrod_crayon/tools/wasm-template/app.js b/backends/conrod_crayon/tools/wasm-template/app.js index 177dc5f9a..7e3b35be6 100644 --- a/backends/conrod_crayon/tools/wasm-template/app.js +++ b/backends/conrod_crayon/tools/wasm-template/app.js @@ -4,4 +4,5 @@ var app = express() // respond with "hello world" when a GET request is made to the homepage app.use(express.static('dist')); -app.listen(3000); +var port = process.env.PORT || 1337; +app.listen(port); From de13cce579f4801afdbf04e717c1d318e7cfaff1 Mon Sep 17 00:00:00 2001 From: alanpoon Date: Tue, 12 Mar 2019 22:49:49 +0800 Subject: [PATCH 19/64] t7 --- backends/conrod_crayon/examples/crayon.rs | 2 +- .../conrod_crayon/tools/wasm-template/app.js | 18 ++++--- .../tools/wasm-template/package-lock.json | 54 ++++++++++++------- .../tools/wasm-template/package.json | 3 +- .../conrod_crayon/tools/wasm-template/run.sh | 3 +- 5 files changed, 52 insertions(+), 28 deletions(-) diff --git a/backends/conrod_crayon/examples/crayon.rs b/backends/conrod_crayon/examples/crayon.rs index e7159d6cf..ef5656fc6 100644 --- a/backends/conrod_crayon/examples/crayon.rs +++ b/backends/conrod_crayon/examples/crayon.rs @@ -109,7 +109,7 @@ main!({ #[cfg(not(target_arch = "wasm32"))] let res = format!("file://{}/../../assets/crayon/resources/", env!("CARGO_MANIFEST_DIR")); #[cfg(target_arch = "wasm32")] - let res = format!("http://localhost:8080/resources/"); + let res = format!("/resources/"); let mut params = Params::default(); params.window.title = "CR: RenderTexture".into(); params.window.size = (464, 434).into(); diff --git a/backends/conrod_crayon/tools/wasm-template/app.js b/backends/conrod_crayon/tools/wasm-template/app.js index 7e3b35be6..83f172ecb 100644 --- a/backends/conrod_crayon/tools/wasm-template/app.js +++ b/backends/conrod_crayon/tools/wasm-template/app.js @@ -1,8 +1,14 @@ -var express = require('express') -var app = express() -// respond with "hello world" when a GET request is made to the homepage +var port = process.env.PORT || 8080; +const config = require('./webpack.config.js') +const webpack = require('webpack'); +const middleware = require('webpack-dev-middleware'); +const compiler = webpack(config); +const express = require('express'); +const app = express(); -app.use(express.static('dist')); -var port = process.env.PORT || 1337; -app.listen(port); +app.use(middleware(compiler, { + // webpack-dev-middleware options +})); + +app.listen(port, () => console.log('Example app listening on port 8080!')) \ No newline at end of file diff --git a/backends/conrod_crayon/tools/wasm-template/package-lock.json b/backends/conrod_crayon/tools/wasm-template/package-lock.json index ec9faabbf..65b849ba1 100644 --- a/backends/conrod_crayon/tools/wasm-template/package-lock.json +++ b/backends/conrod_crayon/tools/wasm-template/package-lock.json @@ -1031,7 +1031,7 @@ "content-type": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" + "integrity": "sha1-4TjMdeBAxyexlm/l5fjJruJW/js=" }, "cookie": { "version": "0.3.1", @@ -1830,7 +1830,7 @@ "finalhandler": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", - "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", + "integrity": "sha1-7r9O2EAHnIP0JJA4ydcDAIMBsQU=", "requires": { "debug": "2.6.9", "encodeurl": "~1.0.2", @@ -2883,7 +2883,7 @@ "iconv-lite": { "version": "0.4.23", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", - "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", + "integrity": "sha1-KXhx9jvlB63Pv8pxXQzQ7thOmmM=", "requires": { "safer-buffer": ">= 2.1.2 < 3" } @@ -3508,7 +3508,7 @@ "mime": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", - "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==" + "integrity": "sha1-Eh+evEnjdm8xGnbh+hyAA8SwOqY=" }, "mime-db": { "version": "1.37.0", @@ -4208,7 +4208,7 @@ "proxy-addr": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.4.tgz", - "integrity": "sha512-5erio2h9jp5CHGwcybmxmVqHmnCBZeewlfJ0pex+UW7Qny7OOZXTtH56TGNyBizkgiOwhJtMKrVzDTeKcySZwA==", + "integrity": "sha1-7PxzO/Iv+Mb0B/onUye5q2fki5M=", "requires": { "forwarded": "~0.1.2", "ipaddr.js": "1.8.0" @@ -4276,7 +4276,7 @@ "qs": { "version": "6.5.2", "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" + "integrity": "sha1-yzroBuh0BERYTvFUzo7pjUA/PjY=" }, "querystring": { "version": "0.2.0", @@ -4323,7 +4323,7 @@ "raw-body": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz", - "integrity": "sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw==", + "integrity": "sha1-GzJOzmtXBuFThVvBFIxlu39uoMM=", "requires": { "bytes": "3.0.0", "http-errors": "1.6.3", @@ -4523,7 +4523,7 @@ "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + "integrity": "sha1-RPoWGwGHuVSd2Eu5GAL5vYOFzWo=" }, "schema-utils": { "version": "1.0.0", @@ -4560,7 +4560,7 @@ "send": { "version": "0.16.2", "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", - "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", + "integrity": "sha1-bsyh4PjBVtFBWXVZhI32RzCmu8E=", "requires": { "debug": "2.6.9", "depd": "~1.1.2", @@ -4601,7 +4601,7 @@ "serve-static": { "version": "1.13.2", "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", - "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", + "integrity": "sha1-CV6Ecv1bRiN9tQzkhqQ/S4bGzsE=", "requires": { "encodeurl": "~1.0.2", "escape-html": "~1.0.3", @@ -5314,7 +5314,7 @@ "type-is": { "version": "1.6.16", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz", - "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==", + "integrity": "sha1-+JzjQVQcZysl7nrjxz3uOyvlAZQ=", "requires": { "media-typer": "0.3.0", "mime-types": "~2.1.18" @@ -5681,21 +5681,21 @@ } }, "webpack-dev-middleware": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.4.0.tgz", - "integrity": "sha1-ETL+zJAm/ZDw7O2sXL/3XR+0WJA=", + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.6.1.tgz", + "integrity": "sha512-XQmemun8QJexMEvNFbD2BIg4eSKrmSIMrTfnl2nql2Sc6OGAYFyb8rwuYrCjl/IiEYYuyTEiimMscu7EXji/Dw==", "dev": true, "requires": { - "memory-fs": "~0.4.1", + "memory-fs": "^0.4.1", "mime": "^2.3.1", "range-parser": "^1.0.3", "webpack-log": "^2.0.0" }, "dependencies": { "mime": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.3.1.tgz", - "integrity": "sha512-OEUllcVoydBHGN1z84yfQDimn58pZNNNXgZlHXSboxMlFvgI6MXSWpWKpFRra7H1HxpVhHTkrghfRW49k6yjeg==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.0.tgz", + "integrity": "sha512-ikBcWwyqXQSHKtciCcctu9YfPbFYZ4+gbHEmE0Q8jzcTYQg5dHCr3g2wwAZjPoJfQVXZq6KXAjpXOTf5/cjT7w==", "dev": true } } @@ -5745,6 +5745,12 @@ "ms": "^2.1.1" } }, + "mime": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.0.tgz", + "integrity": "sha512-ikBcWwyqXQSHKtciCcctu9YfPbFYZ4+gbHEmE0Q8jzcTYQg5dHCr3g2wwAZjPoJfQVXZq6KXAjpXOTf5/cjT7w==", + "dev": true + }, "ms": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", @@ -5761,6 +5767,18 @@ "ajv-errors": "^1.0.0", "ajv-keywords": "^3.1.0" } + }, + "webpack-dev-middleware": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.4.0.tgz", + "integrity": "sha512-Q9Iyc0X9dP9bAsYskAVJ/hmIZZQwf/3Sy4xCAZgL5cUkjZmUZLt4l5HpbST/Pdgjn3u6pE7u5OdGd1apgzRujA==", + "dev": true, + "requires": { + "memory-fs": "~0.4.1", + "mime": "^2.3.1", + "range-parser": "^1.0.3", + "webpack-log": "^2.0.0" + } } } }, diff --git a/backends/conrod_crayon/tools/wasm-template/package.json b/backends/conrod_crayon/tools/wasm-template/package.json index cc2a3878d..92d5d8c19 100644 --- a/backends/conrod_crayon/tools/wasm-template/package.json +++ b/backends/conrod_crayon/tools/wasm-template/package.json @@ -9,7 +9,8 @@ "text-encoding": "^0.7.0", "webpack": "^4.29.4", "webpack-cli": "^3.1.1", - "webpack-dev-server": "^3.1.0" + "webpack-dev-server": "^3.1.0", + "webpack-dev-middleware": "^3.6.1" }, "dependencies": { "express": "^4.16.4" diff --git a/backends/conrod_crayon/tools/wasm-template/run.sh b/backends/conrod_crayon/tools/wasm-template/run.sh index e614b45d5..af80ea88d 100755 --- a/backends/conrod_crayon/tools/wasm-template/run.sh +++ b/backends/conrod_crayon/tools/wasm-template/run.sh @@ -8,5 +8,4 @@ mkdir $SCRIPT_DIR/dist/intermediate cp $BASE_DIR/target/wasm32-unknown-unknown/debug/examples/$1.wasm $SCRIPT_DIR/dist/intermediate/native.wasm wasm-bindgen $SCRIPT_DIR/dist/intermediate/native.wasm --out-dir $SCRIPT_DIR/dist -cd $SCRIPT_DIR -npm run build \ No newline at end of file +cd $SCRIPT_DIR \ No newline at end of file From 3d998c81fbdb4ebf648fbacdef7c307d78096f97 Mon Sep 17 00:00:00 2001 From: alan poon Date: Wed, 13 Mar 2019 11:14:16 +0800 Subject: [PATCH 20/64] t8 --- backends/conrod_crayon/tools/wasm-template/app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backends/conrod_crayon/tools/wasm-template/app.js b/backends/conrod_crayon/tools/wasm-template/app.js index 83f172ecb..1b5a899b8 100644 --- a/backends/conrod_crayon/tools/wasm-template/app.js +++ b/backends/conrod_crayon/tools/wasm-template/app.js @@ -8,7 +8,7 @@ const express = require('express'); const app = express(); app.use(middleware(compiler, { - // webpack-dev-middleware options + // webpack-dev-middleware options t })); app.listen(port, () => console.log('Example app listening on port 8080!')) \ No newline at end of file From 3a7de3e41493d60b13236227eaa9f4a4fc286ab9 Mon Sep 17 00:00:00 2001 From: alan poon Date: Wed, 13 Mar 2019 15:17:56 +0800 Subject: [PATCH 21/64] updated webpack --- backends/conrod_crayon/tools/wasm-template/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backends/conrod_crayon/tools/wasm-template/package.json b/backends/conrod_crayon/tools/wasm-template/package.json index 92d5d8c19..37a82b3a6 100644 --- a/backends/conrod_crayon/tools/wasm-template/package.json +++ b/backends/conrod_crayon/tools/wasm-template/package.json @@ -7,7 +7,7 @@ "@wasm-tool/wasm-pack-plugin": "0.2.3", "html-webpack-plugin": "^3.2.0", "text-encoding": "^0.7.0", - "webpack": "^4.29.4", + "webpack": "^4.29.6", "webpack-cli": "^3.1.1", "webpack-dev-server": "^3.1.0", "webpack-dev-middleware": "^3.6.1" From 325287ac82d723d47b06e26af7ba0ca985eeba65 Mon Sep 17 00:00:00 2001 From: alanpoon Date: Wed, 13 Mar 2019 23:38:07 +0800 Subject: [PATCH 22/64] updated to latest --- azure-pipelines.yml | 2 + .../tools/wasm-template/package-lock.json | 588 ++++++++++++------ .../tools/wasm-template/package.json | 6 +- 3 files changed, 409 insertions(+), 187 deletions(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index af855a814..f6e1dd8cc 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -16,6 +16,8 @@ steps: displayName: 'Run a one-line script' - script: cargo install wasm-bindgen-cli - script: cd backends/conrod_crayon/tools/wasm-template && npm install +- script: npm ls | grep webpack + displayName: webpack version - script: backends/conrod_crayon/tools/wasm-template/run.sh crayon - task: AzureRmWebAppDeployment@3 inputs: diff --git a/backends/conrod_crayon/tools/wasm-template/package-lock.json b/backends/conrod_crayon/tools/wasm-template/package-lock.json index 65b849ba1..93e371f8f 100644 --- a/backends/conrod_crayon/tools/wasm-template/package-lock.json +++ b/backends/conrod_crayon/tools/wasm-template/package-lock.json @@ -3,9 +3,9 @@ "lockfileVersion": 1, "dependencies": { "@wasm-tool/wasm-pack-plugin": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@wasm-tool/wasm-pack-plugin/-/wasm-pack-plugin-0.2.3.tgz", - "integrity": "sha512-s6ncwvdt0xogRYC2Sg14QZ+6pAT2Lib+nZT0bM2qs7W32DjLgcz3o++aDhHKSl28FdaRhqzOcyAgmBNAskv0sQ==", + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/@wasm-tool/wasm-pack-plugin/-/wasm-pack-plugin-0.2.5.tgz", + "integrity": "sha512-wTKezDG2PS2aeNE5NH90UZ6ViuKUmEZZW4hDHmxc/tY2b8sMzFffyu9GtcEBh/1O7LDvVqWwbFiRbAHp+gbPnw==", "dev": true, "requires": { "chalk": "^2.4.1", @@ -267,7 +267,7 @@ "ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha1-QfuyAkPlCxK+DwS43tvwdSDOhB0=", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { "color-convert": "^1.9.0" @@ -308,9 +308,9 @@ "dev": true }, "array-flatten": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.1.tgz", - "integrity": "sha1-Qmu52oQJDBg42BLIFQryCoMx4pY=", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", "dev": true }, "array-union": { @@ -379,7 +379,7 @@ }, "async": { "version": "1.5.2", - "resolved": "http://registry.npmjs.org/async/-/async-1.5.2.tgz", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", "dev": true }, @@ -673,7 +673,7 @@ "buffer-indexof": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", - "integrity": "sha1-Uvq8xqYG0aADAoAmSO9o9jnaJow=", + "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", "dev": true }, "buffer-xor": { @@ -757,9 +757,9 @@ "dev": true }, "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { "ansi-styles": "^3.2.1", @@ -892,7 +892,7 @@ "color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha1-u3GFBpDh8TZWfeYp0tVHHe2kweg=", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, "requires": { "color-name": "1.1.3" @@ -929,18 +929,26 @@ "dev": true }, "compressible": { - "version": "2.0.15", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.15.tgz", - "integrity": "sha1-hXqasKfloH2Ng37UP+Le//ZP4hI=", + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.16.tgz", + "integrity": "sha512-JQfEOdnI7dASwCuSPWIeVYwc/zMsu/+tRhoUvEfXz2gxOA2DNjmG5vhtFdBlhWPPGo+RdT9S3tgc/uH5qgDiiA==", "dev": true, "requires": { - "mime-db": ">= 1.36.0 < 2" + "mime-db": ">= 1.38.0 < 2" + }, + "dependencies": { + "mime-db": { + "version": "1.38.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.38.0.tgz", + "integrity": "sha512-bqVioMFFzc2awcdJZIzR3HjZFX20QhilVS7hytkKrv7xFAn8bM1gzc/FOX2awLISvWe0PV8ptFKcon+wZ5qYkg==", + "dev": true + } } }, "compression": { "version": "1.7.3", "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.3.tgz", - "integrity": "sha1-J+DhdqryYPfywoE8PkQK258Zk9s=", + "integrity": "sha512-HSjyBG5N1Nnz7tF2+O7A9XUhyjru71/fwgNb7oIsEVHR0WShfs2tIS/EySLgiTe98aOK18YDlMXpzjCXY/n9mg==", "dev": true, "requires": { "accepts": "~1.3.5", @@ -1003,9 +1011,9 @@ } }, "connect-history-api-fallback": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.5.0.tgz", - "integrity": "sha1-sGhzk0vF40T+9hGhlqb6rgruAVo=", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", + "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", "dev": true }, "console-browserify": { @@ -1198,13 +1206,39 @@ "dev": true }, "default-gateway": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-2.7.2.tgz", - "integrity": "sha1-t+8znl4CSwRUZ69APVA0jbRkLQ8=", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz", + "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==", "dev": true, "requires": { - "execa": "^0.10.0", + "execa": "^1.0.0", "ip-regex": "^2.1.0" + }, + "dependencies": { + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + } } }, "define-properties": { @@ -1291,10 +1325,16 @@ "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" }, + "detect-file": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", + "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", + "dev": true + }, "detect-node": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.4.tgz", - "integrity": "sha1-AU7o+PZpxcWAI9pkuBecCDooxGw=", + "integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==", "dev": true }, "diffie-hellman": { @@ -1317,7 +1357,7 @@ "dns-packet": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz", - "integrity": "sha1-EqpCaYEHW+UAuRDu3NC0fdfe2lo=", + "integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==", "dev": true, "requires": { "ip": "^1.1.0", @@ -1569,7 +1609,7 @@ "eventemitter3": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.0.tgz", - "integrity": "sha1-CQtNbNvWRe0Qv3UNS1QHlC17oWM=", + "integrity": "sha512-ivIvhpq/Y0uSjcHDcOIccjmYjGLcP09MFGE7ysAwkAvkXfpZlC985pH2/ui64DKazbTW/4kN3yqozUxlXzI6cA==", "dev": true }, "events": { @@ -1581,7 +1621,7 @@ "eventsource": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.0.7.tgz", - "integrity": "sha1-j7xyyT/NNAiAkLwKTmT0tc7m2NA=", + "integrity": "sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ==", "dev": true, "requires": { "original": "^1.0.0" @@ -1647,6 +1687,15 @@ } } }, + "expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", + "dev": true, + "requires": { + "homedir-polyfill": "^1.0.1" + } + }, "express": { "version": "4.16.4", "resolved": "https://registry.npmjs.org/express/-/express-4.16.4.tgz", @@ -1861,6 +1910,29 @@ "locate-path": "^3.0.0" } }, + "findup-sync": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz", + "integrity": "sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=", + "dev": true, + "requires": { + "detect-file": "^1.0.0", + "is-glob": "^3.1.0", + "micromatch": "^3.0.4", + "resolve-dir": "^1.0.1" + }, + "dependencies": { + "is-glob": { + "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" + } + } + } + }, "flush-write-stream": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", @@ -1904,22 +1976,28 @@ } }, "follow-redirects": { - "version": "1.5.9", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.9.tgz", - "integrity": "sha512-Bh65EZI/RU8nx0wbYF9shkFZlqLP+6WT/5FnA3cE/djNSuKNHJEinGGZgu/cQEkeeb2GdFOgenAmn8qaqYke2w==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.7.0.tgz", + "integrity": "sha512-m/pZQy4Gj287eNy94nivy5wchN3Kp+Q5WgUPNy5lJSZ3sgkVKSYV/ZChMAQVIgx1SqfZ2zBZtPA2YlXIWxxJOQ==", "dev": true, "requires": { - "debug": "=3.1.0" + "debug": "^3.2.6" }, "dependencies": { "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha1-W7WgZyYotkFJVmuhaBnmFRjGcmE=", + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", "dev": true, "requires": { - "ms": "2.0.0" + "ms": "^2.1.1" } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true } } }, @@ -2028,7 +2106,8 @@ "ansi-regex": { "version": "2.1.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "aproba": { "version": "1.2.0", @@ -2049,12 +2128,14 @@ "balanced-match": { "version": "1.0.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "brace-expansion": { "version": "1.1.11", "bundled": true, "dev": true, + "optional": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -2069,17 +2150,20 @@ "code-point-at": { "version": "1.1.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "concat-map": { "version": "0.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "console-control-strings": { "version": "1.1.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "core-util-is": { "version": "1.0.2", @@ -2196,7 +2280,8 @@ "inherits": { "version": "2.0.3", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "ini": { "version": "1.3.5", @@ -2208,6 +2293,7 @@ "version": "1.0.0", "bundled": true, "dev": true, + "optional": true, "requires": { "number-is-nan": "^1.0.0" } @@ -2222,6 +2308,7 @@ "version": "3.0.4", "bundled": true, "dev": true, + "optional": true, "requires": { "brace-expansion": "^1.1.7" } @@ -2229,12 +2316,14 @@ "minimist": { "version": "0.0.8", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "minipass": { "version": "2.2.4", "bundled": true, "dev": true, + "optional": true, "requires": { "safe-buffer": "^5.1.1", "yallist": "^3.0.0" @@ -2253,6 +2342,7 @@ "version": "0.5.1", "bundled": true, "dev": true, + "optional": true, "requires": { "minimist": "0.0.8" } @@ -2333,7 +2423,8 @@ "number-is-nan": { "version": "1.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "object-assign": { "version": "4.1.1", @@ -2345,6 +2436,7 @@ "version": "1.4.0", "bundled": true, "dev": true, + "optional": true, "requires": { "wrappy": "1" } @@ -2430,7 +2522,8 @@ "safe-buffer": { "version": "5.1.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "safer-buffer": { "version": "2.1.2", @@ -2466,6 +2559,7 @@ "version": "1.0.2", "bundled": true, "dev": true, + "optional": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -2485,6 +2579,7 @@ "version": "3.0.1", "bundled": true, "dev": true, + "optional": true, "requires": { "ansi-regex": "^2.0.0" } @@ -2528,12 +2623,14 @@ "wrappy": { "version": "1.0.2", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "yallist": { "version": "3.0.2", "bundled": true, - "dev": true + "dev": true, + "optional": true } } }, @@ -2596,11 +2693,29 @@ } } }, - "global-modules-path": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/global-modules-path/-/global-modules-path-2.3.0.tgz", - "integrity": "sha512-HchvMJNYh9dGSCy8pOQ2O8u/hoXaL+0XhnrwH0RyLiSXMMTl9W3N6KUU73+JFOg5PGjtzl6VZzUQsnrpm7Szag==", - "dev": true + "global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "dev": true, + "requires": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + } + }, + "global-prefix": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", + "dev": true, + "requires": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + } }, "globby": { "version": "6.1.0", @@ -2617,7 +2732,7 @@ "dependencies": { "pify": { "version": "2.3.0", - "resolved": "http://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", "dev": true } @@ -2630,9 +2745,9 @@ "dev": true }, "handle-thing": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-1.2.5.tgz", - "integrity": "sha1-/Xqtcmvxpf0W38KbL3pmAdJxOcQ=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.0.tgz", + "integrity": "sha512-d4sze1JNC454Wdo2fkuyzCr6aHcbL6PGGuFAz0Li/NcOm1tCHGnWDRmJP85dh9IhQErTc2svWFEX5xHIOo//kQ==", "dev": true }, "has": { @@ -2725,6 +2840,15 @@ "minimalistic-crypto-utils": "^1.0.1" } }, + "homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "dev": true, + "requires": { + "parse-passwd": "^1.0.0" + } + }, "hpack.js": { "version": "2.1.6", "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", @@ -2745,7 +2869,7 @@ }, "readable-stream": { "version": "2.3.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { @@ -2761,7 +2885,7 @@ "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "requires": { "safe-buffer": "~5.1.0" @@ -2848,13 +2972,13 @@ "http-parser-js": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.0.tgz", - "integrity": "sha1-1l7b7ehDSdDcMDIIFaFdOcw8u9g=", + "integrity": "sha512-cZdEF7r4gfRIq7ezX9J0T+kQmJNOub71dWbgAXVHDct80TKP4MCETtZQ31xyv38UwgzkWPYF/Xc0ge55dW9Z9w==", "dev": true }, "http-proxy": { "version": "1.17.0", "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.17.0.tgz", - "integrity": "sha1-etOElGWPhGBeL220Q230EPTlvpo=", + "integrity": "sha512-Taqn+3nNvYRfJ3bGvKfBSRwy1v6eePlm3oc/aWVxZp57DQr5Eq3xhKJi7Z4hZpS8PC3H4qI+Yly5EmFacGuA/g==", "dev": true, "requires": { "eventemitter3": "^3.0.0", @@ -2863,15 +2987,15 @@ } }, "http-proxy-middleware": { - "version": "0.18.0", - "resolved": "http://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.18.0.tgz", - "integrity": "sha512-Fs25KVMPAIIcgjMZkVHJoKg9VcXcC1C8yb9JUgeDvVXY0S/zgVIhMb+qVswDIgtJe2DfckMSY2d6TuTEutlk6Q==", + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz", + "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==", "dev": true, "requires": { - "http-proxy": "^1.16.2", + "http-proxy": "^1.17.0", "is-glob": "^4.0.0", - "lodash": "^4.17.5", - "micromatch": "^3.1.9" + "lodash": "^4.17.11", + "micromatch": "^3.1.10" } }, "https-browserify": { @@ -2991,20 +3115,34 @@ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "dev": true + }, "internal-ip": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-3.0.1.tgz", - "integrity": "sha1-31yZh24dLrLqLXT1IOP2aaAOzic=", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.2.0.tgz", + "integrity": "sha512-ZY8Rk+hlvFeuMmG5uH1MXhhdeMntmIaxaInvAmzMq/SHV8rv4Kh+6GiQNNDQd0wZFrcO+FiTBo8lui/osKOyJw==", "dev": true, "requires": { - "default-gateway": "^2.6.0", - "ipaddr.js": "^1.5.2" + "default-gateway": "^4.0.1", + "ipaddr.js": "^1.9.0" + }, + "dependencies": { + "ipaddr.js": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.0.tgz", + "integrity": "sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA==", + "dev": true + } } }, "interpret": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz", - "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz", + "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==", "dev": true }, "invert-kv": { @@ -3172,7 +3310,7 @@ "is-path-in-cwd": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", - "integrity": "sha1-WsSLNF72dTOb1sekipEhELJBz1I=", + "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", "dev": true, "requires": { "is-path-inside": "^1.0.0" @@ -3277,7 +3415,7 @@ "killable": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", - "integrity": "sha1-TIzkQRh6Bhx0dPuHygjipjgZSJI=", + "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==", "dev": true }, "kind-of": { @@ -3626,7 +3764,7 @@ "multicast-dns": { "version": "6.2.3", "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", - "integrity": "sha1-oOx72QVcQoL3kMPIL04o2zsxsik=", + "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", "dev": true, "requires": { "dns-packet": "^1.3.1", @@ -3694,7 +3832,7 @@ "node-forge": { "version": "0.7.5", "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.7.5.tgz", - "integrity": "sha1-bBUsNFzhHFL0ZcKr2VfoY5zWdN8=", + "integrity": "sha512-MmbQJ2MTESTjt3Gi/3yG1wGpIMhUfcIypUCGtTizFR9IiccFwxSpfp0vtIZlkFclEqERemxfnSdZEMR9VqqEFQ==", "dev": true }, "node-libs-browser": { @@ -3884,7 +4022,7 @@ "obuf": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", - "integrity": "sha1-Cb6jND1BhZ69RGKS0RydTbYZCE4=", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", "dev": true }, "on-finished": { @@ -3896,9 +4034,9 @@ } }, "on-headers": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz", - "integrity": "sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c=", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", "dev": true }, "once": { @@ -3913,7 +4051,7 @@ "opn": { "version": "5.4.0", "resolved": "https://registry.npmjs.org/opn/-/opn-5.4.0.tgz", - "integrity": "sha1-y1Reeqt4VivrEao7+rxwQuF2EDU=", + "integrity": "sha512-YF9MNdVy/0qvJvDtunAOzFw9iasOQHpVthTCvGzxt61Il64AYSGdK+rYwld7NAfk9qJ7dt+hymBNSc9LNYS+Sw==", "dev": true, "requires": { "is-wsl": "^1.1.0" @@ -3922,7 +4060,7 @@ "original": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz", - "integrity": "sha1-5EKmHP/hxf0gpl8yYcJmY7MD8l8=", + "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==", "dev": true, "requires": { "url-parse": "^1.4.3" @@ -3984,7 +4122,7 @@ "p-map": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz", - "integrity": "sha1-5OlPMR6rvIYzoeeZCBZfyiYkG2s=", + "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==", "dev": true }, "p-try": { @@ -4065,6 +4203,12 @@ "safe-buffer": "^5.1.1" } }, + "parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", + "dev": true + }, "parseurl": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", @@ -4161,9 +4305,9 @@ } }, "portfinder": { - "version": "1.0.19", - "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.19.tgz", - "integrity": "sha512-23aeQKW9KgHe6citUrG3r9HjeX6vls0h713TAa+CwTKZwNIr/pD2ApaxYF4Um3ZZyq4ar+Siv3+fhoHaIwSOSw==", + "version": "1.0.20", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.20.tgz", + "integrity": "sha512-Yxe4mTyDzTd59PZJY4ojZR8F+E5e97iq2ZOHPz3HDgSvYC5siNad2tLooQ5y5QHyQhc3xVqvyk/eNA3wuoa7Sw==", "dev": true, "requires": { "async": "^1.5.2", @@ -4293,7 +4437,7 @@ "querystringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.1.0.tgz", - "integrity": "sha1-fe2N+/eHncxg0KZErGdUsoOtF+8=", + "integrity": "sha512-sluvZZ1YiTLD5jsqZcDmFyV2EwToyXZBfpoVOmktMmW+VEnhgakFHnasVph65fOjGPTWN0Nw3+XQaSeMayr0kg==", "dev": true }, "randombytes": { @@ -4460,6 +4604,16 @@ "resolve-from": "^3.0.0" } }, + "resolve-dir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", + "dev": true, + "requires": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + } + }, "resolve-from": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", @@ -4545,7 +4699,7 @@ "selfsigned": { "version": "1.10.4", "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.4.tgz", - "integrity": "sha1-zdfsz8pO12NdR6CL8tXTB0CS4s0=", + "integrity": "sha512-9AukTiDmHXGXWtWjembZ5NDmVvP2695EtpgbCsxCa68w3c88B+alqbmZ4O3hZ4VWGXeGWzEVdvqgAJD8DQPCDw==", "dev": true, "requires": { "node-forge": "0.7.5" @@ -4796,7 +4950,7 @@ "sockjs": { "version": "0.3.19", "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.19.tgz", - "integrity": "sha1-2Xa76ACve9IK4IWY1YI5NQiZPA0=", + "integrity": "sha512-V48klKZl8T6MzatbLlzzRNhMepEys9Y4oGFpypBFFn1gLI/QQ9HtLLyWJNbPlwGLelOVOEijUbTTJeLLI59jLw==", "dev": true, "requires": { "faye-websocket": "^0.10.0", @@ -4806,7 +4960,7 @@ "sockjs-client": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.3.0.tgz", - "integrity": "sha1-EvydbLZj2lc509xftuhofalcsXc=", + "integrity": "sha512-R9jxEzhnnrdxLCNln0xg5uGHqMnkhPSTzUZH2eXcR03S/On9Yvoq2wyUZILRUhZCNVu2PmwWVoyuiPz8th8zbg==", "dev": true, "requires": { "debug": "^3.2.5", @@ -4820,7 +4974,7 @@ "debug": { "version": "3.2.6", "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha1-6D0X3hbYp++3cX7b5fsQE17uYps=", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", "dev": true, "requires": { "ms": "^2.1.1" @@ -4838,7 +4992,7 @@ "ms": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha1-MKWGTrPrsKZvLr5tcnrwagnYbgo=", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", "dev": true } } @@ -4885,59 +5039,79 @@ "dev": true }, "spdy": { - "version": "3.4.7", - "resolved": "https://registry.npmjs.org/spdy/-/spdy-3.4.7.tgz", - "integrity": "sha1-Qv9B7OXMD5mjpsKKq7c/XDsDrLw=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.0.tgz", + "integrity": "sha512-ot0oEGT/PGUpzf/6uk4AWLqkq+irlqHXkrdbk51oWONh3bxQmBuljxPNl66zlRRcIJStWq0QkLUCPOPjgjvU0Q==", "dev": true, "requires": { - "debug": "^2.6.8", - "handle-thing": "^1.2.5", + "debug": "^4.1.0", + "handle-thing": "^2.0.0", "http-deceiver": "^1.2.7", - "safe-buffer": "^5.0.1", "select-hose": "^2.0.0", - "spdy-transport": "^2.0.18" + "spdy-transport": "^3.0.0" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + } } }, "spdy-transport": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-2.1.0.tgz", - "integrity": "sha512-bpUeGpZcmZ692rrTiqf9/2EUakI6/kXX1Rpe0ib/DyOzbiexVfXkw6GnvI9hVGvIwVaUhkaBojjCZwLNRGQg1g==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", "dev": true, "requires": { - "debug": "^2.6.8", - "detect-node": "^2.0.3", + "debug": "^4.1.0", + "detect-node": "^2.0.4", "hpack.js": "^2.1.6", - "obuf": "^1.1.1", - "readable-stream": "^2.2.9", - "safe-buffer": "^5.0.1", - "wbuf": "^1.7.2" + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" }, "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", "dev": true }, "readable-stream": { - "version": "2.3.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.2.0.tgz", + "integrity": "sha512-RV20kLjdmpZuTF1INEb9IA3L68Nmi+Ri7ppZqo78wj//Pn62fCoJyV9zalccNzDD/OuJpMG4f+pfMl8+L6QdGw==", "dev": true, "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" } }, "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==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.2.0.tgz", + "integrity": "sha512-6YqyX6ZWEYguAxgZzHGL7SsCeGx3V2TtOTqZz1xSTSWnqsbWwbptafNyvf/ACquZUXV3DANr5BDIwNYe1mN42w==", "dev": true, "requires": { "safe-buffer": "~5.1.0" @@ -5143,7 +5317,7 @@ "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha1-4uaaRKyHcveKHsCzW2id9lMO/I8=", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "requires": { "has-flag": "^3.0.0" @@ -5233,7 +5407,7 @@ "thunky": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.0.3.tgz", - "integrity": "sha1-9d9zJFNAewkZHa5z4qjMc/OBqCY=", + "integrity": "sha512-YwT8pjmNcAXBZqrubu22P4FYsh2D4dxRmnWBOL8Jk8bUcRUtc5326kx32tuTmFDAZtLOGEVNl8POAR8j896Iow==", "dev": true }, "timers-browserify": { @@ -5486,9 +5660,9 @@ } }, "url-parse": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.3.tgz", - "integrity": "sha512-rh+KuAW36YKo0vClhQzLLveoj8FwPJNu65xLb7Mrt+eZht0IPT0IXgSv8gcMegZ6NvjJUALf6Mf25POlMwD1Fw==", + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.4.tgz", + "integrity": "sha512-/92DTTorg4JjktLNLe6GPS2/RvAd/RGr6LuktmWSMLEOa6rjnlrFXNgSbSmkNvCoL2T028A0a1JaJLzRMlFoHg==", "dev": true, "requires": { "querystringify": "^2.0.0", @@ -5546,7 +5720,7 @@ "v8-compile-cache": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.0.2.tgz", - "integrity": "sha1-pCiyi7JnkHNMT8i8n6EG/M6/amw=", + "integrity": "sha512-1wFuMUIM16MDJRCrpbpuEPTUGmM5QMUg0cr3KFwra2XgOgFcPGDQHDh3CszSCD2Zewc/dh/pamNEW8CbfDebUw==", "dev": true }, "vary": { @@ -5577,7 +5751,7 @@ "wbuf": { "version": "1.7.3", "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", - "integrity": "sha1-wdjRSTFtPqhShIiVy2oL/oh7h98=", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", "dev": true, "requires": { "minimalistic-assert": "^1.0.0" @@ -5650,32 +5824,96 @@ } }, "webpack-cli": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.1.2.tgz", - "integrity": "sha512-Cnqo7CeqeSvC6PTdts+dywNi5CRlIPbLx1AoUPK2T6vC1YAugMG3IOoO9DmEscd+Dghw7uRlnzV1KwOe5IrtgQ==", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.2.3.tgz", + "integrity": "sha512-Ik3SjV6uJtWIAN5jp5ZuBMWEAaP5E4V78XJ2nI+paFPh8v4HPSwo/myN0r29Xc/6ZKnd2IdrAlpSgNOu2CDQ6Q==", "dev": true, "requires": { "chalk": "^2.4.1", "cross-spawn": "^6.0.5", "enhanced-resolve": "^4.1.0", - "global-modules-path": "^2.3.0", + "findup-sync": "^2.0.0", + "global-modules": "^1.0.0", "import-local": "^2.0.0", "interpret": "^1.1.0", "loader-utils": "^1.1.0", "supports-color": "^5.5.0", "v8-compile-cache": "^2.0.2", - "yargs": "^12.0.2" + "yargs": "^12.0.4" }, "dependencies": { + "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 + }, + "camelcase": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.2.0.tgz", + "integrity": "sha512-IXFsBS2pC+X0j0N/GE7Dm7j3bsEBp+oTpb7F50dwEVX7rf3IgwO9XatnegTsDtniKCUtEJH4fSU6Asw7uoVLfQ==", + "dev": true + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "json5": { + "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" + } + }, "loader-utils": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", - "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", + "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": "^3.1.3", + "big.js": "^5.2.2", "emojis-list": "^2.0.0", - "json5": "^0.5.0" + "json5": "^1.0.1" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "yargs": { + "version": "12.0.5", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", + "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", + "dev": true, + "requires": { + "cliui": "^4.0.0", + "decamelize": "^1.2.0", + "find-up": "^3.0.0", + "get-caller-file": "^1.0.1", + "os-locale": "^3.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1 || ^4.0.0", + "yargs-parser": "^11.1.1" + } + }, + "yargs-parser": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", + "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" } } } @@ -5701,9 +5939,9 @@ } }, "webpack-dev-server": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.1.10.tgz", - "integrity": "sha512-RqOAVjfqZJtQcB0LmrzJ5y4Jp78lv9CK0MZ1YJDTaTmedMZ9PU9FLMQNrMCfVu8hHzaVLVOJKBlGEHMN10z+ww==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.2.1.tgz", + "integrity": "sha512-sjuE4mnmx6JOh9kvSbPYw3u/6uxCLHNWfhWaIPwcXWsvWOPN+nc5baq4i9jui3oOBRXGonK9+OI0jVkaz6/rCw==", "dev": true, "requires": { "ansi-html": "0.0.7", @@ -5711,13 +5949,13 @@ "chokidar": "^2.0.0", "compression": "^1.5.2", "connect-history-api-fallback": "^1.3.0", - "debug": "^3.1.0", + "debug": "^4.1.1", "del": "^3.0.0", "express": "^4.16.2", "html-entities": "^1.2.0", - "http-proxy-middleware": "~0.18.0", + "http-proxy-middleware": "^0.19.1", "import-local": "^2.0.0", - "internal-ip": "^3.0.1", + "internal-ip": "^4.2.0", "ip": "^1.1.5", "killable": "^1.0.0", "loglevel": "^1.4.1", @@ -5725,59 +5963,41 @@ "portfinder": "^1.0.9", "schema-utils": "^1.0.0", "selfsigned": "^1.9.1", + "semver": "^5.6.0", "serve-index": "^1.7.2", "sockjs": "0.3.19", "sockjs-client": "1.3.0", - "spdy": "^3.4.1", + "spdy": "^4.0.0", "strip-ansi": "^3.0.0", - "supports-color": "^5.1.0", - "webpack-dev-middleware": "3.4.0", + "supports-color": "^6.1.0", + "url": "^0.11.0", + "webpack-dev-middleware": "^3.5.1", "webpack-log": "^2.0.0", "yargs": "12.0.2" }, "dependencies": { "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha1-6D0X3hbYp++3cX7b5fsQE17uYps=", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "dev": true, "requires": { "ms": "^2.1.1" } }, - "mime": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.0.tgz", - "integrity": "sha512-ikBcWwyqXQSHKtciCcctu9YfPbFYZ4+gbHEmE0Q8jzcTYQg5dHCr3g2wwAZjPoJfQVXZq6KXAjpXOTf5/cjT7w==", - "dev": true - }, "ms": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha1-MKWGTrPrsKZvLr5tcnrwagnYbgo=", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", "dev": true }, - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha1-C3mpMgTXtgDUsoUNH2bCo0lRx3A=", - "dev": true, - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - }, - "webpack-dev-middleware": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.4.0.tgz", - "integrity": "sha512-Q9Iyc0X9dP9bAsYskAVJ/hmIZZQwf/3Sy4xCAZgL5cUkjZmUZLt4l5HpbST/Pdgjn3u6pE7u5OdGd1apgzRujA==", + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", "dev": true, "requires": { - "memory-fs": "~0.4.1", - "mime": "^2.3.1", - "range-parser": "^1.0.3", - "webpack-log": "^2.0.0" + "has-flag": "^3.0.0" } } } @@ -5815,7 +6035,7 @@ "websocket-extensions": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz", - "integrity": "sha1-XS/yKXcAPsaHpLhwc9+7rBRszyk=", + "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==", "dev": true }, "which": { diff --git a/backends/conrod_crayon/tools/wasm-template/package.json b/backends/conrod_crayon/tools/wasm-template/package.json index 37a82b3a6..9cd8308a2 100644 --- a/backends/conrod_crayon/tools/wasm-template/package.json +++ b/backends/conrod_crayon/tools/wasm-template/package.json @@ -4,12 +4,12 @@ "serve": "webpack-dev-server -p" }, "devDependencies": { - "@wasm-tool/wasm-pack-plugin": "0.2.3", + "@wasm-tool/wasm-pack-plugin": "0.2.5", "html-webpack-plugin": "^3.2.0", "text-encoding": "^0.7.0", "webpack": "^4.29.6", - "webpack-cli": "^3.1.1", - "webpack-dev-server": "^3.1.0", + "webpack-cli": "^3.2.3", + "webpack-dev-server": "^3.2.1", "webpack-dev-middleware": "^3.6.1" }, "dependencies": { From 3a22d297a74f7f8717247bd7bebf4c83de58ecff Mon Sep 17 00:00:00 2001 From: alanpoon Date: Wed, 13 Mar 2019 23:41:41 +0800 Subject: [PATCH 23/64] added status badge --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 6c01e611b..11091fb04 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ # Conrod [![Build Status](https://travis-ci.org/PistonDevelopers/conrod.svg?branch=master)](https://travis-ci.org/PistonDevelopers/conrod) [![Crates.io](https://img.shields.io/crates/l/conrod_core.svg)](https://github.com/PistonDevelopers/conrod/blob/master/LICENSE) - +[![Build Status](https://dev.azure.com/K1720055F/conrod/_apis/build/status/alanpoon.conrod%20(1)?branchName=master)](https://dev.azure.com/K1720055F/conrod/_build/latest?definitionId=3&branchName=master) An easy-to-use, 2D GUI library written entirely in Rust. Guide From 21a7b68b0b78d714447358d113e8943a46743446 Mon Sep 17 00:00:00 2001 From: alanpoon Date: Wed, 13 Mar 2019 23:56:38 +0800 Subject: [PATCH 24/64] fix webpack version script --- azure-pipelines.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index f6e1dd8cc..58a881697 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -16,7 +16,7 @@ steps: displayName: 'Run a one-line script' - script: cargo install wasm-bindgen-cli - script: cd backends/conrod_crayon/tools/wasm-template && npm install -- script: npm ls | grep webpack +- script: cd backends/conrod_crayon/tools/wasm-template && npm ls | grep webpack displayName: webpack version - script: backends/conrod_crayon/tools/wasm-template/run.sh crayon - task: AzureRmWebAppDeployment@3 From bfb4603cdad17c7319e3c19697a38402d8bda080 Mon Sep 17 00:00:00 2001 From: alanpoon Date: Wed, 10 Apr 2019 08:16:52 +0800 Subject: [PATCH 25/64] t --- backends/conrod_crayon/examples/crayon.rs | 20 +++++++++++++++---- backends/conrod_crayon/src/events.rs | 1 - backends/conrod_crayon/src/lib.rs | 1 - .../tools/wasm-template/run.1.sh | 13 ++++++++++++ .../conrod_crayon/tools/wasm-template/run.sh | 2 +- backends/conrod_ggez/examples/ggez.rs | 1 - conrod_core/src/ui.rs | 6 +++++- conrod_core/src/widget/button.rs | 2 +- 8 files changed, 36 insertions(+), 10 deletions(-) create mode 100755 backends/conrod_crayon/tools/wasm-template/run.1.sh diff --git a/backends/conrod_crayon/examples/crayon.rs b/backends/conrod_crayon/examples/crayon.rs index ef5656fc6..ff808547d 100644 --- a/backends/conrod_crayon/examples/crayon.rs +++ b/backends/conrod_crayon/examples/crayon.rs @@ -75,7 +75,7 @@ impl LifecycleListener for Window { let k = "text_edit".to_owned(); self.app.textedit = text_edit.get(&k).unwrap().clone(); - self.ui.handle_event(Input::Press(conrod_core::input::Button::Mouse(conrod_core::input::state::mouse::Button::Left))); + //self.ui.handle_event(Input::Press(conrod_core::input::Button::Mouse(conrod_core::input::state::mouse::Button::Left))); { let mut ui = &mut self.ui.set_widgets(); @@ -85,13 +85,25 @@ impl LifecycleListener for Window { .w_h(LOGO_SIDE, LOGO_SIDE) .middle() .set(self.ids.rust_logo, ui); - /* + /* + widget::text_box::TextBox::new(&self.app.textedit) + .w_h(200.0,50.0) + .mid_bottom() + .set(self.ids.text_edit,ui); + */ + widget::button::Button::new() + .w_h(200.0,50.0) + .hover_color(color::RED) + .press_color(color::ORANGE) + .mid_bottom() + .set(self.ids.text_edit,ui); + /* widget::Rectangle::fill_with([80.0, 80.0],color::ORANGE) .middle() .set(self.ids.rust_logo, ui); */ } - + let dpi_factor = device_pixel_ratio() as f64; //let dpi_factor =1.16; let primitives = self.ui.draw(); @@ -106,7 +118,7 @@ fn load_rust_logo() -> TextureHandle { video::create_texture_from("res:crate.bmp").unwrap() } main!({ - #[cfg(not(target_arch = "wasm32"))] + #[cfg(not(target_arch = "wasm32"))] let res = format!("file://{}/../../assets/crayon/resources/", env!("CARGO_MANIFEST_DIR")); #[cfg(target_arch = "wasm32")] let res = format!("/resources/"); diff --git a/backends/conrod_crayon/src/events.rs b/backends/conrod_crayon/src/events.rs index ea46eaea9..a624e0861 100644 --- a/backends/conrod_crayon/src/events.rs +++ b/backends/conrod_crayon/src/events.rs @@ -10,7 +10,6 @@ use serde_json::Result; pub fn convert_event(ui:&mut Ui,closure:Box,app:&mut T){ let mouse_presses = input::mouse_presses(); for mp in mouse_presses.iter(){ - println!("mp {:?}",mp); let e = match mp{ crayon::input::mouse::MouseButton::Left => conrod_core::input::state::mouse::Button::Left, crayon::input::mouse::MouseButton::Right => conrod_core::input::state::mouse::Button::Right, diff --git a/backends/conrod_crayon/src/lib.rs b/backends/conrod_crayon/src/lib.rs index 86885e63c..8a976c014 100644 --- a/backends/conrod_crayon/src/lib.rs +++ b/backends/conrod_crayon/src/lib.rs @@ -183,7 +183,6 @@ impl Renderer{ match kind { render::PrimitiveKind::Rectangle { color } => { - switch_to_plain_state!(); let color = gamma_srgb_to_linear(color.to_fsa()); let (l, r, b, t) = rect.l_r_b_t(); diff --git a/backends/conrod_crayon/tools/wasm-template/run.1.sh b/backends/conrod_crayon/tools/wasm-template/run.1.sh new file mode 100755 index 000000000..dd156ec15 --- /dev/null +++ b/backends/conrod_crayon/tools/wasm-template/run.1.sh @@ -0,0 +1,13 @@ +SCRIPT_DIR=$(dirname "$0") +BASE_DIR=$SCRIPT_DIR/../../../../ + +set -e +cargo build --example $1 --target wasm32-unknown-unknown +mkdir $SCRIPT_DIR/dist +mkdir $SCRIPT_DIR/dist/intermediate +cp $BASE_DIR/target/wasm32-unknown-unknown/debug/examples/$1.wasm $SCRIPT_DIR/dist/intermediate/native.wasm +wasm-bindgen $SCRIPT_DIR/dist/intermediate/native.wasm --out-dir $SCRIPT_DIR/dist --no-typescript +wasm-opt -O3 -o optimized.wasm $SCRIPT_DIR/dist/native_bg.wasm && +mv optimized.wasm $SCRIPT_DIR/dist/native_bg.wasm + +cd $SCRIPT_DIR \ No newline at end of file diff --git a/backends/conrod_crayon/tools/wasm-template/run.sh b/backends/conrod_crayon/tools/wasm-template/run.sh index af80ea88d..7d6309b3b 100755 --- a/backends/conrod_crayon/tools/wasm-template/run.sh +++ b/backends/conrod_crayon/tools/wasm-template/run.sh @@ -6,6 +6,6 @@ cargo build --example $1 --target wasm32-unknown-unknown mkdir $SCRIPT_DIR/dist mkdir $SCRIPT_DIR/dist/intermediate cp $BASE_DIR/target/wasm32-unknown-unknown/debug/examples/$1.wasm $SCRIPT_DIR/dist/intermediate/native.wasm -wasm-bindgen $SCRIPT_DIR/dist/intermediate/native.wasm --out-dir $SCRIPT_DIR/dist +wasm-bindgen $SCRIPT_DIR/dist/intermediate/native.wasm --out-dir $SCRIPT_DIR/dist --no-typescript cd $SCRIPT_DIR \ No newline at end of file diff --git a/backends/conrod_ggez/examples/ggez.rs b/backends/conrod_ggez/examples/ggez.rs index 92f548150..002fe1db8 100644 --- a/backends/conrod_ggez/examples/ggez.rs +++ b/backends/conrod_ggez/examples/ggez.rs @@ -86,7 +86,6 @@ impl<'a> event::EventHandler for MainState<'a> { Ok(()) } fn mouse_button_down_event(&mut self, _ctx: &mut Context, button: MouseButton, x: f32, y: f32) { - println!("button {:?}",button); conrod_ggez::event::mouse_button_down_event(&mut self.ui,button); } diff --git a/conrod_core/src/ui.rs b/conrod_core/src/ui.rs index d112298e2..26fe70453 100644 --- a/conrod_core/src/ui.rs +++ b/conrod_core/src/ui.rs @@ -420,13 +420,15 @@ impl Ui { }; let widget = self.global_input.current.widget_capturing_mouse; let press_event = event::Ui::Press(widget, press).into(); + println!("press"); self.global_input.push_event(press_event); - + if let MouseButton::Left = mouse_button { // Check to see if we need to uncapture the keyboard. if let Some(idx) = self.global_input.current.widget_capturing_keyboard { if Some(idx) != self.global_input.current.widget_under_mouse { let source = input::Source::Keyboard; + println!("press_O {:?}",idx); let event = event::Ui::WidgetUncapturesInputSource(idx, source); self.global_input.push_event(event.into()); self.global_input.current.widget_capturing_keyboard = None; @@ -435,6 +437,7 @@ impl Ui { // Check to see if we need to capture the keyboard. if let Some(idx) = self.global_input.current.widget_under_mouse { + println!("press_2 {:?}",idx); let source = input::Source::Keyboard; let event = event::Ui::WidgetCapturesInputSource(idx, source); self.global_input.push_event(event.into()); @@ -444,6 +447,7 @@ impl Ui { // Keep track of pressed buttons in the current input::State. let xy = self.global_input.current.mouse.xy; + println!("xy {:?}",xy); let widget = self.global_input.current.widget_under_mouse; self.global_input.current.mouse.buttons.press(mouse_button, xy, widget); }, diff --git a/conrod_core/src/widget/button.rs b/conrod_core/src/widget/button.rs index 7e68b3bbd..9b4c25e32 100644 --- a/conrod_core/src/widget/button.rs +++ b/conrod_core/src/widget/button.rs @@ -298,7 +298,6 @@ impl<'a> Widget for Button<'a, Flat> { fn update(self, args: widget::UpdateArgs) -> Self::Event { let widget::UpdateArgs { id, state, style, rect, ui, .. } = args; let Button { show, maybe_label, .. } = self; - let (interaction, times_triggered) = interaction_and_times_triggered(id, ui); let color = match interaction { Interaction::Idle => style.color(&ui.theme), @@ -388,6 +387,7 @@ fn interaction_and_times_triggered(button_id: widget::Id, ui: &UiCell) -> (Inter mouse.buttons.left().is_down() || ui.global_input().current.touch.values() .any(|t| t.start.widget == Some(button_id)); + println!("is_pressed {:?}",is_pressed); if is_pressed { Interaction::Press } else { Interaction::Hover } }); let times_triggered = (input.clicks().left().count() + input.taps().count()) as u16; From 12af141146c6fccd810ca638e9c0ee7741527d5f Mon Sep 17 00:00:00 2001 From: alan poon Date: Wed, 10 Apr 2019 13:53:56 +0800 Subject: [PATCH 26/64] fixed windows error --- backends/conrod_crayon/Cargo.toml | 2 +- backends/conrod_crayon/examples/crayon.rs | 5 +++-- backends/conrod_crayon/src/events.rs | 12 +++++++----- conrod_core/src/widget/button.rs | 1 - 4 files changed, 11 insertions(+), 9 deletions(-) diff --git a/backends/conrod_crayon/Cargo.toml b/backends/conrod_crayon/Cargo.toml index 9b72f8d02..7edea1dfa 100644 --- a/backends/conrod_crayon/Cargo.toml +++ b/backends/conrod_crayon/Cargo.toml @@ -23,4 +23,4 @@ serde_json = "1.0" [target.'cfg(target_arch = "wasm32")'.dependencies] -wasm-bindgen = "*" \ No newline at end of file +wasm-bindgen = "0.2.40" \ No newline at end of file diff --git a/backends/conrod_crayon/examples/crayon.rs b/backends/conrod_crayon/examples/crayon.rs index ff808547d..a75a01704 100644 --- a/backends/conrod_crayon/examples/crayon.rs +++ b/backends/conrod_crayon/examples/crayon.rs @@ -32,6 +32,7 @@ impl Window { // Demonstration app state that we'll control with our conrod GUI. let app = conrod_example_shared::DemoApp::new(rust_logo); let dpi_factor = device_pixel_ratio(); + println!("dpi {:?}",dpi_factor); let renderer = conrod_crayon::Renderer::new((WIN_W as f64,WIN_H as f64), dpi_factor as f64); Ok(Window { app:app, @@ -119,12 +120,12 @@ fn load_rust_logo() -> TextureHandle { } main!({ #[cfg(not(target_arch = "wasm32"))] - let res = format!("file://{}/../../assets/crayon/resources/", env!("CARGO_MANIFEST_DIR")); + let res = format!("file://{}/../../assets/crayon/resources/", env!("CARGO_MANIFEST_DIR").replace("\\","/")); #[cfg(target_arch = "wasm32")] let res = format!("/resources/"); let mut params = Params::default(); params.window.title = "CR: RenderTexture".into(); - params.window.size = (464, 434).into(); + params.window.size = (WIN_W as u32, WIN_H as u32).into(); params.res.shortcuts.add("res:", res).unwrap(); params.res.dirs.push("res:".into()); crayon::application::setup(params, Window::build).unwrap(); diff --git a/backends/conrod_crayon/src/events.rs b/backends/conrod_crayon/src/events.rs index a624e0861..fcdbcc314 100644 --- a/backends/conrod_crayon/src/events.rs +++ b/backends/conrod_crayon/src/events.rs @@ -7,8 +7,10 @@ use crayon::prelude::*; use crayon::utils::hash::FastHashSet; use serde_json::Result; -pub fn convert_event(ui:&mut Ui,closure:Box,app:&mut T){ +pub fn convert_event(ui:&mut Ui, closure:Box,app:&mut T){ let mouse_presses = input::mouse_presses(); + let w = ui.win_w; + let h = ui.win_h; for mp in mouse_presses.iter(){ let e = match mp{ crayon::input::mouse::MouseButton::Left => conrod_core::input::state::mouse::Button::Left, @@ -41,13 +43,13 @@ pub fn convert_event(ui:&mut Ui,closure:Box,app:&mut T){ ui.handle_event(Input::Release(Keyboard(ee))); } let k = input::mouse_movement(); - if k.x >0.0 || k.y >0.0 { + //if k.x >0.0 || k.y >0.0 { let j = input::mouse_position(); - ui.handle_event(Input::Motion(Motion::MouseCursor{x:j.x as f64,y:j.y as f64})); - } + ui.handle_event(Input::Motion(Motion::MouseCursor{x:(j.x as f64)-w/2.0,y:(j.y as f64)-h/2.0})); + //} let j = input::mouse_scroll(); if j.x > 0.0 || j.y >0.0{ - ui.handle_event(Input::Motion(Motion::Scroll{x:j.x as f64,y:j.y as f64})); + ui.handle_event(Input::Motion(Motion::Scroll{x:(j.x as f64)-w/2.0,y:(j.y as f64)-h/2.0})); } } diff --git a/conrod_core/src/widget/button.rs b/conrod_core/src/widget/button.rs index 9b4c25e32..471bd6680 100644 --- a/conrod_core/src/widget/button.rs +++ b/conrod_core/src/widget/button.rs @@ -387,7 +387,6 @@ fn interaction_and_times_triggered(button_id: widget::Id, ui: &UiCell) -> (Inter mouse.buttons.left().is_down() || ui.global_input().current.touch.values() .any(|t| t.start.widget == Some(button_id)); - println!("is_pressed {:?}",is_pressed); if is_pressed { Interaction::Press } else { Interaction::Hover } }); let times_triggered = (input.clicks().left().count() + input.taps().count()) as u16; From 104eb2ae4c07dc057052716ad6f95109b83387a5 Mon Sep 17 00:00:00 2001 From: alan poon Date: Fri, 12 Apr 2019 16:32:52 +0800 Subject: [PATCH 27/64] added some fonts to crayon --- assets/crayon/workspace.toml | 39 +++++++++++++++++++++++ backends/conrod_crayon/examples/crayon.rs | 38 ++++++++++------------ backends/conrod_crayon/src/events.rs | 2 +- 3 files changed, 56 insertions(+), 23 deletions(-) create mode 100644 assets/crayon/workspace.toml diff --git a/assets/crayon/workspace.toml b/assets/crayon/workspace.toml new file mode 100644 index 000000000..34dfd3180 --- /dev/null +++ b/assets/crayon/workspace.toml @@ -0,0 +1,39 @@ +[assets] +source = 'assets' +destination = 'resources' + +[[assets.importers]] +type = 'Texture' +extensions = [ + '.png', + '.jpg', + '.jpeg', + '.bmp', + '.tga', + '.psd', # Yes, we do supports .PSD files. +] + +[[assets.importers]] +type = 'Transmission' +extensions = [ + '.obj', + '.blend', + '.fbx', + '.gltf', + '.dae', + '.3ds', +] + +[[assets.importers]] +type = 'Audio' +extensions = [ + '.mp3', + '.wav', + '.ogg', +] + +[[assets.importers]] +type = 'Bytes' +extensions = [ + '.ttf', +] \ No newline at end of file diff --git a/backends/conrod_crayon/examples/crayon.rs b/backends/conrod_crayon/examples/crayon.rs index a75a01704..f2a3cdc6d 100644 --- a/backends/conrod_crayon/examples/crayon.rs +++ b/backends/conrod_crayon/examples/crayon.rs @@ -64,41 +64,35 @@ impl Drop for Window { impl LifecycleListener for Window { fn on_update(&mut self) -> CrResult<()> { - let mut text_edit:HashMap = HashMap::new(); - text_edit.insert("text_edit".to_owned(),self.app.textedit.clone()); - conrod_crayon::events::convert_event(&mut self.ui,Box::new(|vt:&mut HashMap|{ - for (id,val) in input::text_edit(){ - if let Some(k) = vt.get_mut(&id.clone()){ - *k = val; - } - } - }),&mut text_edit); - let k = "text_edit".to_owned(); - self.app.textedit = text_edit.get(&k).unwrap().clone(); - - //self.ui.handle_event(Input::Press(conrod_core::input::Button::Mouse(conrod_core::input::state::mouse::Button::Left))); + conrod_crayon::events::convert_event(&mut self.ui); { let mut ui = &mut self.ui.set_widgets(); const LOGO_SIDE: conrod_core::Scalar = 306.0; - + /* widget::Image::new(self.app.rust_logo) .w_h(LOGO_SIDE, LOGO_SIDE) .middle() - .set(self.ids.rust_logo, ui); - /* - widget::text_box::TextBox::new(&self.app.textedit) - .w_h(200.0,50.0) - .mid_bottom() - .set(self.ids.text_edit,ui); - */ + .set(self.ids.rust_logo, ui);*/ + for edit in widget::TextEdit::new(&self.app.textedit) + .color(color::WHITE) + .w_h(LOGO_SIDE, LOGO_SIDE) + .middle() + .center_justify() + .line_spacing(2.5) + //.restrict_to_height(false) // Let the height grow infinitely and scroll. + .set(self.ids.text_edit, ui) + { + self.app.textedit = edit; + } + /* widget::button::Button::new() .w_h(200.0,50.0) .hover_color(color::RED) .press_color(color::ORANGE) .mid_bottom() .set(self.ids.text_edit,ui); - /* + widget::Rectangle::fill_with([80.0, 80.0],color::ORANGE) .middle() .set(self.ids.rust_logo, ui); diff --git a/backends/conrod_crayon/src/events.rs b/backends/conrod_crayon/src/events.rs index fcdbcc314..65afb882b 100644 --- a/backends/conrod_crayon/src/events.rs +++ b/backends/conrod_crayon/src/events.rs @@ -7,7 +7,7 @@ use crayon::prelude::*; use crayon::utils::hash::FastHashSet; use serde_json::Result; -pub fn convert_event(ui:&mut Ui, closure:Box,app:&mut T){ +pub fn convert_event(ui:&mut Ui){ let mouse_presses = input::mouse_presses(); let w = ui.win_w; let h = ui.win_h; From 85afdb356bec523d5ff1221495ea37f4d52970ee Mon Sep 17 00:00:00 2001 From: alanpoon Date: Sat, 13 Apr 2019 12:19:27 +0800 Subject: [PATCH 28/64] t --- backends/conrod_crayon/Cargo.toml | 2 +- backends/conrod_crayon/examples/crayon.rs | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/backends/conrod_crayon/Cargo.toml b/backends/conrod_crayon/Cargo.toml index 9b72f8d02..ec4afb7c2 100644 --- a/backends/conrod_crayon/Cargo.toml +++ b/backends/conrod_crayon/Cargo.toml @@ -20,7 +20,7 @@ conrod_core = { path = "../../conrod_core", version = "0.63" } crayon = { git = "https://github.com/alanpoon/crayon.git", branch ="textedit"} conrod_example_shared = { path = "../conrod_example_shared", version = "0.63" } serde_json = "1.0" - +crayon_bytes = { git = "https://github.com/alanpoon/crayon.git", branch ="textedit"} [target.'cfg(target_arch = "wasm32")'.dependencies] wasm-bindgen = "*" \ No newline at end of file diff --git a/backends/conrod_crayon/examples/crayon.rs b/backends/conrod_crayon/examples/crayon.rs index ff808547d..69369ea14 100644 --- a/backends/conrod_crayon/examples/crayon.rs +++ b/backends/conrod_crayon/examples/crayon.rs @@ -2,6 +2,7 @@ extern crate crayon; extern crate conrod_crayon; extern crate conrod_example_shared; extern crate conrod_core; +extern crate crayon_bytes; use crayon::prelude::*; use crayon::window::device_pixel_ratio; use conrod_crayon::Renderer; @@ -9,6 +10,7 @@ use conrod_example_shared::{WIN_W, WIN_H}; use std::time::SystemTime; use std::collections::HashMap; use conrod_core::{color,Colorable, widget, Widget,Positionable,event::{Input},Sizeable}; +use conrod_core::text::{Font,FontCollection}; struct Window { renderer: Renderer, app: conrod_example_shared::DemoApp, @@ -33,6 +35,7 @@ impl Window { let app = conrod_example_shared::DemoApp::new(rust_logo); let dpi_factor = device_pixel_ratio(); let renderer = conrod_crayon::Renderer::new((WIN_W as f64,WIN_H as f64), dpi_factor as f64); + let f = ui.fonts.insert(load_bold()); Ok(Window { app:app, ui:ui, @@ -117,6 +120,9 @@ impl LifecycleListener for Window { fn load_rust_logo() -> TextureHandle { video::create_texture_from("res:crate.bmp").unwrap() } +fn load_bold() ->Font{ + FontCollection::from_bytes(crayon_bytes::state(crayon_bytes::create_bytes_from("res:Oswald-Heavy.ttf")?)).into_font().unwrap() +} main!({ #[cfg(not(target_arch = "wasm32"))] let res = format!("file://{}/../../assets/crayon/resources/", env!("CARGO_MANIFEST_DIR")); From 093953f946ad1ce30c44f2849e6ebed3c46dd67b Mon Sep 17 00:00:00 2001 From: alanpoon Date: Sat, 13 Apr 2019 21:06:57 +0800 Subject: [PATCH 29/64] before PrimitiveKind::Text for crayon --- assets/crayon/assets/Oswald-Heavy.ttf | Bin 0 -> 74596 bytes .../crayon/assets/Oswald-Heavy.ttf.meta.toml | 10 ++++ assets/crayon/workspace.toml | 40 +++++++++++++++ backends/conrod_crayon/examples/crayon.rs | 47 +++++++++++++----- backends/conrod_crayon/src/events.rs | 17 ++++--- 5 files changed, 94 insertions(+), 20 deletions(-) create mode 100644 assets/crayon/assets/Oswald-Heavy.ttf create mode 100644 assets/crayon/assets/Oswald-Heavy.ttf.meta.toml create mode 100644 assets/crayon/workspace.toml diff --git a/assets/crayon/assets/Oswald-Heavy.ttf b/assets/crayon/assets/Oswald-Heavy.ttf new file mode 100644 index 0000000000000000000000000000000000000000..0db6cf0529f592dca8cc3d314a5d11f9e9c064d6 GIT binary patch literal 74596 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 RMBo_MKkt(JNQU*r@L%R>>VW_N literal 0 HcmV?d00001 diff --git a/assets/crayon/assets/Oswald-Heavy.ttf.meta.toml b/assets/crayon/assets/Oswald-Heavy.ttf.meta.toml new file mode 100644 index 000000000..fd96a680f --- /dev/null +++ b/assets/crayon/assets/Oswald-Heavy.ttf.meta.toml @@ -0,0 +1,10 @@ +name = 'Oswald-Heavy.ttf' +uuid = 'b148e135-5e22-451b-92f6-3671e60ac865' + +[[resources]] +type = 'Bytes' +name = 'Oswald-Heavy.ttf' +uuid = '26aa066c-5983-4da8-884c-4ac7bf9c49f6' + +[params] +type = 'Bytes' diff --git a/assets/crayon/workspace.toml b/assets/crayon/workspace.toml new file mode 100644 index 000000000..b1ac920d8 --- /dev/null +++ b/assets/crayon/workspace.toml @@ -0,0 +1,40 @@ +[assets] +source = 'assets' +destination = 'resources' + +[[assets.importers]] +type = 'Texture' +extensions = [ + '.png', + '.jpg', + '.jpeg', + '.bmp', + '.tga', + '.psd', # Yes, we do supports .PSD files. +] + +[[assets.importers]] +type = 'Transmission' +extensions = [ + '.obj', + '.blend', + '.fbx', + '.gltf', + '.dae', + '.3ds', +] + +[[assets.importers]] +type = 'Audio' +extensions = [ + '.mp3', + '.wav', + '.ogg', +] + +[[assets.importers]] +type = 'Bytes' +extensions = [ + '.ttf', + '.otf', +] \ No newline at end of file diff --git a/backends/conrod_crayon/examples/crayon.rs b/backends/conrod_crayon/examples/crayon.rs index 99a1b45a1..7eda2ce73 100644 --- a/backends/conrod_crayon/examples/crayon.rs +++ b/backends/conrod_crayon/examples/crayon.rs @@ -3,7 +3,9 @@ extern crate conrod_crayon; extern crate conrod_example_shared; extern crate conrod_core; extern crate crayon_bytes; + use crayon::prelude::*; +use crayon_bytes::prelude::*; use crayon::window::device_pixel_ratio; use conrod_crayon::Renderer; use conrod_example_shared::{WIN_W, WIN_H}; @@ -11,6 +13,25 @@ use std::time::SystemTime; use std::collections::HashMap; use conrod_core::{color,Colorable, widget, Widget,Positionable,event::{Input},Sizeable}; use conrod_core::text::{Font,FontCollection}; +#[derive(Debug, Clone, Copy)] +struct WindowResources { + b: BytesHandle, +} + +impl WindowResources { + pub fn new() -> CrResult { + crayon_bytes::setup()?; + Ok(WindowResources { + b: crayon_bytes::create_bytes_from("res:Oswald-Heavy.ttf")?, + }) + } +} +impl LatchProbe for WindowResources { + fn is_set(&self) -> bool { + crayon_bytes::state(self.b) != ResourceState::NotReady + } +} + struct Window { renderer: Renderer, app: conrod_example_shared::DemoApp, @@ -19,10 +40,11 @@ struct Window { image_map: conrod_core::image::Map, batch: CommandBuffer, time: f32, + resources: WindowResources } impl Window { - pub fn build() -> CrResult { + pub fn build(resources: &WindowResources) -> CrResult { let mut ui = conrod_core::UiBuilder::new([WIN_W as f64, WIN_H as f64]) .theme(conrod_example_shared::theme()) @@ -36,7 +58,8 @@ impl Window { let dpi_factor = device_pixel_ratio(); println!("dpi {:?}",dpi_factor); let renderer = conrod_crayon::Renderer::new((WIN_W as f64,WIN_H as f64), dpi_factor as f64); - let f = ui.fonts.insert(load_bold()); + let f = ui.fonts.insert(load_bold(resources.b)); + ui.theme.font_id = Some(f); Ok(Window { app:app, ui:ui, @@ -45,6 +68,7 @@ impl Window { renderer:renderer, batch: CommandBuffer::new(), time: 0.0, + resources: *resources }) } } @@ -89,18 +113,12 @@ impl LifecycleListener for Window { .w_h(LOGO_SIDE, LOGO_SIDE) .middle() .set(self.ids.rust_logo, ui); - /* + widget::text_box::TextBox::new(&self.app.textedit) .w_h(200.0,50.0) .mid_bottom() .set(self.ids.text_edit,ui); - */ - widget::button::Button::new() - .w_h(200.0,50.0) - .hover_color(color::RED) - .press_color(color::ORANGE) - .mid_bottom() - .set(self.ids.text_edit,ui); + /* widget::Rectangle::fill_with([80.0, 80.0],color::ORANGE) .middle() @@ -121,8 +139,8 @@ impl LifecycleListener for Window { fn load_rust_logo() -> TextureHandle { video::create_texture_from("res:crate.bmp").unwrap() } -fn load_bold() ->Font{ - FontCollection::from_bytes(crayon_bytes::state(crayon_bytes::create_bytes_from("res:Oswald-Heavy.ttf")?)).into_font().unwrap() +fn load_bold(handle:BytesHandle) ->Font{ + FontCollection::from_bytes(crayon_bytes::create_bytes(handle).unwrap()).unwrap().into_font().unwrap() } main!({ #[cfg(not(target_arch = "wasm32"))] @@ -134,5 +152,8 @@ main!({ params.window.size = (WIN_W as u32, WIN_H as u32).into(); params.res.shortcuts.add("res:", res).unwrap(); params.res.dirs.push("res:".into()); - crayon::application::setup(params, Window::build).unwrap(); + crayon::application::setup(params,|| { + let resources = WindowResources::new()?; + Ok(Launcher::new(resources, |r| Window::build(r))) + }).unwrap(); }); \ No newline at end of file diff --git a/backends/conrod_crayon/src/events.rs b/backends/conrod_crayon/src/events.rs index fcdbcc314..f6806a9f0 100644 --- a/backends/conrod_crayon/src/events.rs +++ b/backends/conrod_crayon/src/events.rs @@ -32,24 +32,27 @@ pub fn convert_event(ui:&mut Ui, closure:Box,app:&mut T){ } let key_presses = input::key_presses(); for kp in key_presses.iter(){ - let e = serde_json::to_string(kp).unwrap(); + let e = key_convert(serde_json::to_string(kp).unwrap()); let ee:conrod_core::input::keyboard::Key = serde_json::from_str(&e).unwrap(); ui.handle_event(Input::Press(Keyboard(ee))); } let key_releases = input::key_releases(); for kp in key_releases.iter(){ - let e = serde_json::to_string(kp).unwrap(); + let e = key_convert(serde_json::to_string(kp).unwrap()); let ee:conrod_core::input::keyboard::Key = serde_json::from_str(&e).unwrap(); ui.handle_event(Input::Release(Keyboard(ee))); } - let k = input::mouse_movement(); - //if k.x >0.0 || k.y >0.0 { - let j = input::mouse_position(); - ui.handle_event(Input::Motion(Motion::MouseCursor{x:(j.x as f64)-w/2.0,y:(j.y as f64)-h/2.0})); - //} + + let j = input::mouse_position(); + ui.handle_event(Input::Motion(Motion::MouseCursor{x:(j.x as f64)-w/2.0,y:(j.y as f64)-h/2.0})); let j = input::mouse_scroll(); if j.x > 0.0 || j.y >0.0{ ui.handle_event(Input::Motion(Motion::Scroll{x:(j.x as f64)-w/2.0,y:(j.y as f64)-h/2.0})); } } + +pub fn key_convert(j:String)->String{ + j.replace("Key","D").replace("Control","Ctrl").replace("LBracket","LeftBracket").replace("RBracket","RightBracket") + .replace("Subtract","Minus") +} From 26c30c73e9685bcb621968a5ee0b53225ea9b20d Mon Sep 17 00:00:00 2001 From: alanpoon Date: Sun, 14 Apr 2019 23:44:16 +0800 Subject: [PATCH 30/64] zz --- backends/conrod_crayon/Cargo.toml | 1 + backends/conrod_crayon/examples/crayon.rs | 5 +- backends/conrod_crayon/src/events.rs | 3 - backends/conrod_crayon/src/lib.rs | 203 +++++++++++++++--- backends/conrod_glium/examples/hello_world.rs | 16 +- backends/conrod_glium/src/lib.rs | 16 +- t.txt | 7 +- 7 files changed, 201 insertions(+), 50 deletions(-) diff --git a/backends/conrod_crayon/Cargo.toml b/backends/conrod_crayon/Cargo.toml index c87ad9d75..2d99ba223 100644 --- a/backends/conrod_crayon/Cargo.toml +++ b/backends/conrod_crayon/Cargo.toml @@ -21,6 +21,7 @@ crayon = { git = "https://github.com/alanpoon/crayon.git", branch ="textedit"} conrod_example_shared = { path = "../conrod_example_shared", version = "0.63" } serde_json = "1.0" crayon_bytes = { git = "https://github.com/alanpoon/crayon.git", branch ="textedit"} +cgmath = "*" [target.'cfg(target_arch = "wasm32")'.dependencies] wasm-bindgen = "0.2.40" \ No newline at end of file diff --git a/backends/conrod_crayon/examples/crayon.rs b/backends/conrod_crayon/examples/crayon.rs index 7eda2ce73..50f00690f 100644 --- a/backends/conrod_crayon/examples/crayon.rs +++ b/backends/conrod_crayon/examples/crayon.rs @@ -114,9 +114,10 @@ impl LifecycleListener for Window { .middle() .set(self.ids.rust_logo, ui); - widget::text_box::TextBox::new(&self.app.textedit) + widget::Text::new("CAB") + .color(color::LIGHT_GREEN) .w_h(200.0,50.0) - .mid_bottom() + .middle() .set(self.ids.text_edit,ui); /* diff --git a/backends/conrod_crayon/src/events.rs b/backends/conrod_crayon/src/events.rs index f6806a9f0..03440d8ef 100644 --- a/backends/conrod_crayon/src/events.rs +++ b/backends/conrod_crayon/src/events.rs @@ -1,11 +1,8 @@ use conrod_core::event::Input; use conrod_core::input::Button::Keyboard; -use conrod_core::input::Button::Mouse; use conrod_core::input::Motion; use conrod_core::Ui; use crayon::prelude::*; -use crayon::utils::hash::FastHashSet; -use serde_json::Result; pub fn convert_event(ui:&mut Ui, closure:Box,app:&mut T){ let mouse_presses = input::mouse_presses(); diff --git a/backends/conrod_crayon/src/lib.rs b/backends/conrod_crayon/src/lib.rs index 8a976c014..e08d53546 100644 --- a/backends/conrod_crayon/src/lib.rs +++ b/backends/conrod_crayon/src/lib.rs @@ -1,8 +1,12 @@ extern crate crayon; extern crate conrod_core; extern crate serde_json; +extern crate cgmath; use crayon::impl_vertex; use crayon::prelude::*; +use crayon::errors::Result; +use crayon::video::assets::texture::*; + pub mod events; use conrod_core::{ Rect, @@ -10,7 +14,7 @@ use conrod_core::{ color, image, render, - text::{rt, GlyphCache}, + text, }; impl_vertex! { @@ -21,13 +25,6 @@ impl_vertex! { } } -/* -impl_vertex! { - Vertex { - position => [Position; Float; 2; false], - } -} -*/ /// Draw text from the text cache texture `tex` in the fragment shader. pub const MODE_TEXT: i32 = 0; /// Draw an image from the texture at `tex` in the fragment shader. @@ -38,16 +35,62 @@ pub const MODE_GEOMETRY: i32 = 2; #[derive(Clone, Debug)] pub enum Command<'a> { /// Draw to the target. - Draw(Draw_e<'a>), + Draw(DrawE<'a>), /// Update the scizzor within the `glium::DrawParameters`. Scizzor(SurfaceScissor), } enum PreparedCommand { Image(image::Id, std::ops::Range), - Plain(std::ops::Range), + Plain(std::ops::Range,i32), Scizzor(SurfaceScissor), } +/// A rusttype `GlyphCache` along with a `glium::texture::Texture2d` for caching text on the `GPU`. +pub struct GlyphCache { + cache: text::GlyphCache<'static>, + texture: TextureHandle, +} + +impl GlyphCache { + /// Construct a **GlyphCache** with the given texture dimensions. + /// + /// When calling `GlyphCache::new`, the `get_framebuffer_dimensions` method is used to produce + /// the width and height. However, often creating a texture the size of the screen might not be + /// large enough to cache the necessary text for an application. The following constant + /// multiplier is used to ensure plenty of room in the cache. + pub fn with_dimensions( + width: u32, + height: u32, + ) -> Result + { + // First, the rusttype `Cache` which performs the logic for rendering and laying out glyphs + // in the cache. + let cache = rusttype_glyph_cache(width, height); + + // Now the texture to which glyphs will be rendered. + let texture = glyph_cache_texture(width, height)?; + + Ok(GlyphCache { + cache: cache, + texture: texture, + }) + } + + /// Construct a `GlyphCache` with a size equal to the given `Display`'s current framebuffer + /// dimensions. + pub fn new(dim:(f64,f64)) -> Result + { + println!("inii {:?}",dim); + Self::with_dimensions(dim.0 as u32, dim.1 as u32) + } + + /// The texture used to cache the glyphs on the GPU. + pub fn texture(&self) -> &TextureHandle { + &self.texture + } +} + pub struct Renderer { + glyph_cache: GlyphCache, vertices: Vec, shader: ShaderHandle, surface: SurfaceHandle, @@ -58,12 +101,12 @@ pub struct Renderer { /// /// Each variant describes how to draw the contents of the vertex buffer. #[derive(Clone, Debug)] -pub enum Draw_e<'a> { +pub enum DrawE<'a> { /// A range of vertices representing triangles textured with the image in the /// image_map at the given `widget::Id`. Image(image::Id, &'a [Vertex]), /// A range of vertices representing plain triangles. - Plain(&'a [Vertex]), + Plain(&'a [Vertex],i32), Test, } @@ -73,11 +116,7 @@ pub struct Commands<'a> { } impl Renderer{ pub fn new(dim:(f64,f64),dpi_factor: f64)->Self{ - /*let mut params = RenderTextureParams::default(); - params.format = RenderTextureFormat::RGBA8; - params.dimensions = (dim.0 as u32,dim.1 as u32).into(); - let rendered_texture = video::create_render_texture(params).unwrap(); - */ + let attributes = AttributeLayoutBuilder::new() .with(Attribute::Position, 2) .with(Attribute::Texcoord0, 2) @@ -103,6 +142,7 @@ impl Renderer{ let surface = video::create_surface(params).unwrap(); Renderer{ + glyph_cache:GlyphCache::new((dim.0 * dpi_factor,dim.1 * dpi_factor)).unwrap(), vertices: vert, shader:shader, surface:surface, @@ -110,6 +150,7 @@ impl Renderer{ commands: commands } } + pub fn commands(&self) -> Commands { let Renderer { ref commands, ref vertices, .. } = *self; Commands { @@ -119,9 +160,10 @@ impl Renderer{ } pub fn fill

(&mut self,dims: (f64, f64),dpi_factor: f64,mut primitives: P, image_map:&conrod_core::image::Map )where P: render::PrimitiveWalker{ let (screen_w, screen_h) = dims; + println!("dim {:?} {:?}",screen_w,screen_h); let half_win_w = screen_w / 2.0; let half_win_h = screen_h / 2.0; - let Renderer { ref mut vertices,shader,surface,ref mut commands,..} = *self; + let Renderer { ref mut vertices,shader,surface,ref mut commands, ref mut glyph_cache,..} = *self; commands.clear(); vertices.clear(); let mut current_scissor =SurfaceScissor::Enable{ @@ -158,16 +200,21 @@ impl Renderer{ let vx = |x: f64| (x * dpi_factor / half_win_w) as f32; let vy = |y: f64| (y * dpi_factor / half_win_h) as f32; - let mut c = 0; + let mut mode = MODE_GEOMETRY; + while let Some(primitive) = primitives.next_primitive() { let render::Primitive { kind, scizzor, rect, .. } = primitive; let new_scissor = rect_to_crayon_rect(scizzor); + if let render::PrimitiveKind::Text { .. } = kind{ + mode = MODE_TEXT; + } + if new_scissor != current_scissor { // Finish the current command. match current_state { State::Plain { start } => - commands.push(PreparedCommand::Plain(start..vertices.len())), + commands.push(PreparedCommand::Plain(start..vertices.len(),mode)), State::Image { image_id, start } => commands.push(PreparedCommand::Image(image_id, start..vertices.len())), } @@ -241,7 +288,69 @@ impl Renderer{ vertices.push(v(triangle[2])); } }, - + render::PrimitiveKind::Text { color, text, font_id } => { + switch_to_plain_state!(); + + let positioned_glyphs = text.positioned_glyphs(dpi_factor as f32); + + let GlyphCache { ref mut cache, ref mut texture } = *glyph_cache; + + // Queue the glyphs to be cached. + for glyph in positioned_glyphs.iter() { + cache.queue_glyph(font_id.index(), glyph.clone()); + } + + // Cache the glyphs on the GPU. + cache.cache_queued(|rect, data| { + let width = rect.width(); + let height = rect.height(); + println!("rect2 {:?}",rect); + let lbwh = [rect.min.x,rect.min.y,rect.max.x,rect.max.y]; + let p1 = cgmath::Point2::new(lbwh[0],lbwh[1]); + let p2 = cgmath::Point2::new(lbwh[2],lbwh[3]); + let rect = crayon::math::aabb::Aabb2::new(p1,p2); + //let dataz =vec![0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79, 92, 92, 92, 20, 0, 64, 92, 92, 92, 36, 0, 0, 219, 255, 255, 255, 56, 0, 177, 255, 255, 255, 100, 0, 0, 219, 255, 255, 255, 56, 0, 177, 255, 255, 255, 100, 0, 0, 219, 255, 255, 255, 56, 0, 177, 255, 255, 255, 100, 0, 0, 219, 255, 255, 255, 56, 0, 177, 255, 255, 255, 100, 0, 0, 219, 255, 255, 255, 56, 0, 177, 255, 255, 255, 100, 0, 0, 219, 255, 255, 255, 56, 0, 177, 255, 255, 255, 100, 0, 0, 219, 255, 255, 255, 206, 193, 236, 255, 255, 255, 100, 0, 0, 219, 255, 255, 255, 255, 255, 255, 255, 255, 255, 100, 0, 0, 219, 255, 255, 255, 255, 255, 255, 255, 255, 255, 100, 0, 0, 219, 255, 255, 255, 91, 45, 191, 255, 255, 255, 100, 0, 0, 219, 255, 255, 255, 56, 0, 177, 255, 255, 255, 100, 0, 0, 219, 255, 255, 255, 56, 0, 177, 255, 255, 255, 100, 0, 0, 219, 255, 255, 255, 56, 0, 177, 255, 255, 255, 100, 0, 0, 219, 255, 255, 255, 56, 0, 177, 255, 255, 255, 100, 0, 0, 219, 255, 255, 255, 56, 0, 177, 255, 255, 255, 100, 0, 0, 219, 255, 255, 255, 56, 0, 177, 255, 255, 255, 100, 0, 0, 73, 85, 85, 85, 19, 0, 59, 85, 85, 85, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; + //let datal = dataz.as_slice(); + //println!("d {:?} {:?} {:?}",data,width,height); + //let data = std::borrow::Cow::Owned(data); + video::update_texture(*texture,rect,data).unwrap(); + + }).unwrap(); + + let color = gamma_srgb_to_linear(color.to_fsa()); + + let cache_id = font_id.index(); + + let origin = text::rt::point(0.0, 0.0); + let to_gl_rect = |screen_rect: text::rt::Rect| text::rt::Rect { + min: origin + + (text::rt::vector(screen_rect.min.x as f32 / screen_w as f32 - 0.5, + 1.0 - screen_rect.min.y as f32 / screen_h as f32 - 0.5)) * 2.0, + max: origin + + (text::rt::vector(screen_rect.max.x as f32 / screen_w as f32 - 0.5, + 1.0 - screen_rect.max.y as f32 / screen_h as f32 - 0.5)) * 2.0 + }; + let mut l =0; + for g in positioned_glyphs { + + if let Ok(Some((uv_rect, screen_rect))) = cache.rect_for(cache_id, g) { + + let gl_rect = to_gl_rect(screen_rect); + println!("gl_rect {:?}",gl_rect); + let v = |p:[f32;2],t:[f32;2]| {Vertex::new(p,t,color)}; + let mut push_v = |p, t| vertices.push(v(p, t)); + push_v([gl_rect.min.x, gl_rect.max.y], [uv_rect.min.x, uv_rect.max.y]); + push_v([gl_rect.min.x, gl_rect.min.y], [uv_rect.min.x, uv_rect.min.y]); + push_v([gl_rect.max.x, gl_rect.min.y], [uv_rect.max.x, uv_rect.min.y]); + push_v([gl_rect.max.x, gl_rect.min.y], [uv_rect.max.x, uv_rect.min.y]); + push_v([gl_rect.max.x, gl_rect.max.y], [uv_rect.max.x, uv_rect.max.y]); + push_v([gl_rect.min.x, gl_rect.max.y], [uv_rect.min.x, uv_rect.max.y]); + l = l+1; + + } + } + + }, render::PrimitiveKind::Image { image_id, color, source_rect } => { // Switch to the `Image` state for this image if we're not in it already. let new_image_id = image_id; @@ -252,7 +361,7 @@ impl Renderer{ // If we were in the `Plain` drawing state, switch to Image drawing state. State::Plain { start } => { - commands.push(PreparedCommand::Plain(start..vertices.len())); + commands.push(PreparedCommand::Plain(start..vertices.len(),mode)); current_state = State::Image { image_id: new_image_id, start: vertices.len(), @@ -326,7 +435,7 @@ impl Renderer{ match current_state { State::Plain { start } => - commands.push(PreparedCommand::Plain(start..vertices.len())), + commands.push(PreparedCommand::Plain(start..vertices.len(),mode)), State::Image { image_id, start } => commands.push(PreparedCommand::Image(image_id, start..vertices.len())), } @@ -334,6 +443,8 @@ impl Renderer{ } pub fn draw(&self,batch: &mut CommandBuffer,image_map:&conrod_core::image::Map){ const NUM_VERTICES_IN_TRIANGLE: usize = 3; + let uniform =self.glyph_cache.texture(); //can use rendertexture + for command in self.commands() { match command { Command::Scizzor(scizzor) => { @@ -342,7 +453,7 @@ impl Renderer{ // Draw to the target with the given `draw` command. Command::Draw(draw) => match draw { - Draw_e::Plain(slice) => if slice.len() >= NUM_VERTICES_IN_TRIANGLE { + DrawE::Plain(slice,mode) => if slice.len() >= NUM_VERTICES_IN_TRIANGLE { let mut idxes:Vec = vec![]; for i in 0..slice.len(){ idxes.push(i as u16); @@ -357,10 +468,10 @@ impl Renderer{ vptr: Vertex::encode(&slice[..]).into(), iptr: IndexFormat::encode(&idxes).into(), }; - let mesh = video::create_mesh(params.clone(), Some(data)).unwrap(); let mut dc = Draw::new(self.shader, mesh); - dc.set_uniform_variable("mode",MODE_GEOMETRY); + dc.set_uniform_variable("tex", *uniform); + dc.set_uniform_variable("mode",MODE_TEXT); batch.draw(dc); batch.submit(self.surface).unwrap(); @@ -369,7 +480,7 @@ impl Renderer{ // given `id`. // // Only submit the vertices if there is enough for at least one triangle. - Draw_e::Image(image_id, slice) => if slice.len() >= NUM_VERTICES_IN_TRIANGLE { + DrawE::Image(image_id, slice) => if slice.len() >= NUM_VERTICES_IN_TRIANGLE { if let Some(&image) = image_map.get(&image_id) { let mut idxes:Vec = vec![]; @@ -425,11 +536,41 @@ impl<'a> Iterator for Commands<'a> { let Commands { ref mut commands, ref vertices } = *self; commands.next().map(|command| match *command { PreparedCommand::Scizzor(scizzor) => Command::Scizzor(scizzor), - PreparedCommand::Plain(ref range) => - Command::Draw(Draw_e::Plain(&vertices[range.clone()])), - // Command::Draw(Draw_e::Test), + PreparedCommand::Plain(ref range,mode) => + Command::Draw(DrawE::Plain(&vertices[range.clone()],mode)), + // Command::Draw(DrawE::Test), PreparedCommand::Image(id, ref range) => - Command::Draw(Draw_e::Image(id, &vertices[range.clone()])), + Command::Draw(DrawE::Image(id, &vertices[range.clone()])), }) } +} +// Creating the rusttype glyph cache used within a `GlyphCache`. +fn rusttype_glyph_cache(w: u32, h: u32) -> text::GlyphCache<'static> { + const SCALE_TOLERANCE: f32 = 0.1; + const POSITION_TOLERANCE: f32 = 0.1; + text::GlyphCache::builder() + .dimensions(w, h) + .scale_tolerance(SCALE_TOLERANCE) + .position_tolerance(POSITION_TOLERANCE) + .build() +} + +// Create the texture used within a `GlyphCache` of the given size. +fn glyph_cache_texture( + width: u32, + height: u32, +) -> Result +{ + // Determine the optimal texture format to use given the opengl version. + let mut params = TextureParams::default(); + //params.format = TextureFormat::RGBA8; + //params.hint = TextureHint::Stream; + params.hint = TextureHint::Stream; + params.dimensions = (width, height).into(); + let data_size = params.format.size(params.dimensions) as usize; + let bytes = vec![128u8; data_size]; + let data = TextureData{ + bytes: vec![bytes.into_boxed_slice()] + }; + video::create_texture(params,data) } \ No newline at end of file diff --git a/backends/conrod_glium/examples/hello_world.rs b/backends/conrod_glium/examples/hello_world.rs index 3b08394fd..db1e4c9dc 100644 --- a/backends/conrod_glium/examples/hello_world.rs +++ b/backends/conrod_glium/examples/hello_world.rs @@ -9,11 +9,11 @@ extern crate glium; mod support; -use conrod_core::{widget, Colorable, Positionable, Widget}; +use conrod_core::{widget, Colorable, Positionable, Widget,color,Sizeable}; use glium::Surface; -const WIDTH: u32 = 400; -const HEIGHT: u32 = 200; +const WIDTH: u32 = 600; +const HEIGHT: u32 = 420; fn main() { // Build the window. @@ -36,7 +36,7 @@ fn main() { // Add a `Font` to the `Ui`'s `font::Map` from file. let assets = find_folder::Search::KidsThenParents(3, 5).for_folder("assets").unwrap(); - let font_path = assets.join("fonts/NotoSans/NotoSans-Regular.ttf"); + let font_path = assets.join("crayon/assets/Oswald-Heavy.ttf"); ui.fonts.insert_from_file(font_path).unwrap(); // A type used for converting `conrod_core::render::Primitives` into `Command`s that can be used @@ -96,10 +96,10 @@ fn main() { let ui = &mut ui.set_widgets(); // "Hello World!" in the middle of the screen. - widget::Text::new("Hello World!") - .middle_of(ui.window) - .color(conrod_core::color::WHITE) - .font_size(32) + widget::Text::new("H") + .color(color::LIGHT_GREEN) + .w_h(200.0,50.0) + .middle() .set(ids.text, ui); } diff --git a/backends/conrod_glium/src/lib.rs b/backends/conrod_glium/src/lib.rs index 30f9e46e3..b93f3c409 100644 --- a/backends/conrod_glium/src/lib.rs +++ b/backends/conrod_glium/src/lib.rs @@ -407,6 +407,7 @@ impl GlyphCache { F: glium::backend::Facade, { let (w, h) = facade.get_context().get_framebuffer_dimensions(); + println!("inii {:?}",(w,h)); Self::with_dimensions(facade, w, h) } @@ -513,6 +514,7 @@ impl Renderer { // Framebuffer dimensions and the "dots per inch" factor. let (screen_w, screen_h) = display.get_framebuffer_dimensions(); + println!("dim {:?} {:?}",screen_w,screen_h); let (win_w, win_h) = (screen_w as Scalar, screen_h as Scalar); let half_win_w = win_w / 2.0; let half_win_h = win_h / 2.0; @@ -659,6 +661,7 @@ impl Renderer { // Cache the glyphs on the GPU. cache.cache_queued(|rect, data| { + println!("rect2 {:?}",rect); let w = rect.width(); let h = rect.height(); let glium_rect = glium::Rect { @@ -684,7 +687,7 @@ impl Renderer { // The text cache is only ever created with U8 or U8U8U8 formats. _ => unreachable!(), }; - + println!("data {:?} {:?} {:?}",data,w,h); let image = glium::texture::RawImage2d { data: data, width: w, @@ -707,9 +710,10 @@ impl Renderer { + (text::rt::vector(screen_rect.max.x as f32 / screen_w as f32 - 0.5, 1.0 - screen_rect.max.y as f32 / screen_h as f32 - 0.5)) * 2.0 }; - + let mut l =0; for g in positioned_glyphs { if let Ok(Some((uv_rect, screen_rect))) = cache.rect_for(cache_id, g) { + println!("g {:?} {:?}",cache_id,g); let gl_rect = to_gl_rect(screen_rect); let v = |p, t| Vertex { position: p, @@ -724,8 +728,11 @@ impl Renderer { push_v([gl_rect.max.x, gl_rect.min.y], [uv_rect.max.x, uv_rect.min.y]); push_v([gl_rect.max.x, gl_rect.max.y], [uv_rect.max.x, uv_rect.max.y]); push_v([gl_rect.min.x, gl_rect.max.y], [uv_rect.min.x, uv_rect.max.y]); + l = l+1; + println!("mm {:?}",(uv_rect, screen_rect)); } } + }, render::PrimitiveKind::Image { image_id, color, source_rect } => { @@ -858,7 +865,10 @@ impl Renderer { // Only submit the vertices if there is enough for at least one triangle. Draw::Plain(slice) => if slice.len() >= NUM_VERTICES_IN_TRIANGLE { let vertex_buffer = glium::VertexBuffer::new(facade, slice)?; - surface.draw(&vertex_buffer, no_indices, &self.program, &uniforms, &draw_params).unwrap(); + //surface.draw(&vertex_buffer, no_indices, &self.program, &uniforms, &draw_params).unwrap(); + //glium::uniforms::EmptyUniforms + + surface.draw(&vertex_buffer, no_indices, &self.program, &glium::uniforms::EmptyUniforms, &draw_params).unwrap(); }, // Draw an image whose texture data lies within the `image_map` at the diff --git a/t.txt b/t.txt index 51cf49569..15622162c 100644 --- a/t.txt +++ b/t.txt @@ -1,3 +1,4 @@ -[Vertex { pos: [-0.24, 0.34285715], uv: [0.0, 1.0], color: [1.0, 1.0, 1.0, 1.0], mode: [1.0, 0.0] }, Vertex { pos: [0.24, -0.34285715], uv: [1.0, 0.0], color: [1.0, 1.0, 1.0, 1.0], mode: [1.0, 0.0] }, Vertex { pos: [-0.24, -0.34285715], uv: [0.0, 0.0], color: [1.0, 1.0, 1.0, 1.0], mode: [1.0, 0.0] }, Vertex { pos: [-0.24, 0.34285715], uv: [0.0, 1.0], color: [1.0, 1.0, 1.0, 1.0], mode: [1.0, 0.0] }, Vertex { pos: [0.24, -0.34285715], uv: [1.0, 0.0], color: [1.0, 1.0, 1.0, 1.0], mode: [1.0, 0.0] }, Vertex { pos: [0.24, 0.34285715], uv: [1.0, 1.0], color: [1.0, 1.0, 1.0, 1.0], mode: [1.0, 0.0] }] - -[Vertex { mode: 1, position: [-0.3201143, 0.42666668], tex_coords: [0.0, 1.0], color: [1.0, 1.0, 1.0, 1.0] }, Vertex { mode: 1, position: [0.3201143, -0.42666668], tex_coords: [1.0, 0.0], color: [1.0, 1.0, 1.0, 1.0] }, Vertex { mode: 1, position: [-0.3201143, -0.42666668], tex_coords: [0.0, 0.0], color: [1.0, 1.0, 1.0, 1.0] }, Vertex { mode: 1, position: [-0.3201143, 0.42666668], tex_coords: [0.0, 1.0], color: [1.0, 1.0, 1.0, 1.0] }, Vertex { mode: 1, position: [0.3201143, -0.42666668], tex_coords: [1.0, 0.0], color: [1.0, 1.0, 1.0, 1.0] }, Vertex { mode: 1, position: [0.3201143, 0.42666668], tex_coords: [1.0, 1.0], color: [1.0, 1.0, 1.0, 1.0] }] \ No newline at end of file +> Vertex { pos: [-0.3314286, 0.032653093], uv: [0.0014285714, 0.036734693], color: [0.25415218, 0.76052463, 0.034339808, 1.0] }, Vertex { pos: [-0.3314286, 0.10204077], uv: [0.0014285714, 0.0020408162], color: [0.25415218, 0.76052463, 0.034339808, 1.0] }, Vertex { pos: [-0.3, 0.10204077], uv: [0.017142856, 0.0020408162], color: [0.25415218, 0.76052463, 0.034339808, 1.0] }, Vertex { pos: [-0.3, 0.10204077], uv: [0.017142856, 0.0020408162], color: [0.25415218, 0.76052463, 0.034339808, 1.0] }, Vertex { pos: [-0.3, 0.032653093], uv: [0.017142856, 0.036734693], color: [0.25415218, 0.76052463, 0.034339808, 1.0] }, Vertex { pos: [-0.3314286, 0.032653093], uv: [0.0014285714, 0.036734693], color: [0.25415218, 0.76052463, 0.034339808, 1.0] }] +(Rect { min: Point { x: 0.0014285714, y: 0.0020408162 }, max: Point { x: 0.017142856, y: 0.036734693 } }, Rect { min: Point { x: 234, y: 220 }, max: Point { x: 245, y: 237 } }) +> Vertex { pos: [-0.3314286, 0.032652974], uv: [0.0014306152, 0.036809817], color: [0.25415218, 0.76052463, 0.034339808, 1.0] }, Vertex { pos: [-0.3314286, 0.10204077], uv: [0.0014306152, 0.0020449897], color: [0.25415218, 0.76052463, 0.034339808, 1.0] }, Vertex { pos: [-0.3, 0.10204077], uv: [0.017167382, 0.0020449897], color: [0.25415218, 0.76052463, 0.034339808, 1.0] }, Vertex { pos: [-0.3, 0.10204077], uv: [0.017167382, 0.0020449897], color: [0.25415218, 0.76052463, 0.034339808, 1.0] }, Vertex { pos: [-0.3, 0.032652974], uv: [0.017167382, 0.036809817], color: [0.25415218, 0.76052463, 0.034339808, 1.0] }, Vertex { pos: [-0.3314286, 0.032652974], uv: [0.0014306152, 0.036809817], color: [0.25415218, 0.76052463, 0.034339808, 1.0] }] + min: Point { x: -0.3314286, y: 0.106122375 }, max: Point { x: -0.3, y: 0.028571367 } } \ No newline at end of file From 25564a2d472e566c1c21f4ede4ea135ec2802dca Mon Sep 17 00:00:00 2001 From: alan poon Date: Tue, 16 Apr 2019 15:19:26 +0800 Subject: [PATCH 31/64] fixed textrender --- backends/conrod_crayon/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backends/conrod_crayon/Cargo.toml b/backends/conrod_crayon/Cargo.toml index 2d99ba223..fcaf732c6 100644 --- a/backends/conrod_crayon/Cargo.toml +++ b/backends/conrod_crayon/Cargo.toml @@ -21,7 +21,7 @@ crayon = { git = "https://github.com/alanpoon/crayon.git", branch ="textedit"} conrod_example_shared = { path = "../conrod_example_shared", version = "0.63" } serde_json = "1.0" crayon_bytes = { git = "https://github.com/alanpoon/crayon.git", branch ="textedit"} -cgmath = "*" +cgmath = "0.16.1" [target.'cfg(target_arch = "wasm32")'.dependencies] wasm-bindgen = "0.2.40" \ No newline at end of file From 8587fedb9b49257b2ad96f0fc37abc452359b999 Mon Sep 17 00:00:00 2001 From: alan poon Date: Tue, 16 Apr 2019 15:20:34 +0800 Subject: [PATCH 32/64] fixed text rendered --- backends/conrod_crayon/examples/crayon.rs | 36 +++++++++++++---------- backends/conrod_crayon/src/lib.rs | 22 +++++--------- 2 files changed, 27 insertions(+), 31 deletions(-) diff --git a/backends/conrod_crayon/examples/crayon.rs b/backends/conrod_crayon/examples/crayon.rs index 50f00690f..37d4401a7 100644 --- a/backends/conrod_crayon/examples/crayon.rs +++ b/backends/conrod_crayon/examples/crayon.rs @@ -1,7 +1,7 @@ extern crate crayon; extern crate conrod_crayon; extern crate conrod_example_shared; -extern crate conrod_core; +#[macro_use] extern crate conrod_core; extern crate crayon_bytes; use crayon::prelude::*; @@ -11,7 +11,7 @@ use conrod_crayon::Renderer; use conrod_example_shared::{WIN_W, WIN_H}; use std::time::SystemTime; use std::collections::HashMap; -use conrod_core::{color,Colorable, widget, Widget,Positionable,event::{Input},Sizeable}; +use conrod_core::{color,Colorable, widget, Widget,Positionable,event::{Input},Sizeable,Labelable}; use conrod_core::text::{Font,FontCollection}; #[derive(Debug, Clone, Copy)] struct WindowResources { @@ -31,37 +31,40 @@ impl LatchProbe for WindowResources { crayon_bytes::state(self.b) != ResourceState::NotReady } } - +widget_ids!(struct Ids { text }); struct Window { renderer: Renderer, - app: conrod_example_shared::DemoApp, + //app: conrod_example_shared::DemoApp, ui: conrod_core::Ui, - ids: conrod_example_shared::Ids, + ids: Ids, image_map: conrod_core::image::Map, batch: CommandBuffer, time: f32, resources: WindowResources } - +//crayon_bytes = { git = "https://github.com/alanpoon/crayon.git", branch ="textedit"} +//crayon = { git = "https://github.com/alanpoon/crayon.git", branch ="textedit"} impl Window { pub fn build(resources: &WindowResources) -> CrResult { let mut ui = conrod_core::UiBuilder::new([WIN_W as f64, WIN_H as f64]) .theme(conrod_example_shared::theme()) .build(); - let ids = conrod_example_shared::Ids::new(ui.widget_id_generator()); + //let ids = conrod_example_shared::Ids::new(ui.widget_id_generator()); + + let ids = Ids::new(ui.widget_id_generator()); let mut image_map: conrod_core::image::Map = conrod_core::image::Map::new(); - let rust_logo = image_map.insert(load_rust_logo()); + //let rust_logo = image_map.insert(load_rust_logo()); dbg!("l"); // Demonstration app state that we'll control with our conrod GUI. - let app = conrod_example_shared::DemoApp::new(rust_logo); + //let app = conrod_example_shared::DemoApp::new(rust_logo); let dpi_factor = device_pixel_ratio(); println!("dpi {:?}",dpi_factor); let renderer = conrod_crayon::Renderer::new((WIN_W as f64,WIN_H as f64), dpi_factor as f64); let f = ui.fonts.insert(load_bold(resources.b)); ui.theme.font_id = Some(f); Ok(Window { - app:app, + //app:app, ui:ui, ids:ids, image_map:image_map, @@ -92,7 +95,7 @@ impl Drop for Window { impl LifecycleListener for Window { fn on_update(&mut self) -> CrResult<()> { let mut text_edit:HashMap = HashMap::new(); - text_edit.insert("text_edit".to_owned(),self.app.textedit.clone()); + text_edit.insert("text_edit".to_owned(),"t".to_owned()); conrod_crayon::events::convert_event(&mut self.ui,Box::new(|vt:&mut HashMap|{ for (id,val) in input::text_edit(){ if let Some(k) = vt.get_mut(&id.clone()){ @@ -101,24 +104,25 @@ impl LifecycleListener for Window { } }),&mut text_edit); let k = "text_edit".to_owned(); - self.app.textedit = text_edit.get(&k).unwrap().clone(); + //self.app.textedit = text_edit.get(&k).unwrap().clone(); //self.ui.handle_event(Input::Press(conrod_core::input::Button::Mouse(conrod_core::input::state::mouse::Button::Left))); { let mut ui = &mut self.ui.set_widgets(); const LOGO_SIDE: conrod_core::Scalar = 306.0; - + /* widget::Image::new(self.app.rust_logo) .w_h(LOGO_SIDE, LOGO_SIDE) .middle() .set(self.ids.rust_logo, ui); - - widget::Text::new("CAB") + */ + widget::Text::new("H") .color(color::LIGHT_GREEN) + .font_size(120) .w_h(200.0,50.0) .middle() - .set(self.ids.text_edit,ui); + .set(self.ids.text,ui); /* widget::Rectangle::fill_with([80.0, 80.0],color::ORANGE) diff --git a/backends/conrod_crayon/src/lib.rs b/backends/conrod_crayon/src/lib.rs index e08d53546..2ed0fcd83 100644 --- a/backends/conrod_crayon/src/lib.rs +++ b/backends/conrod_crayon/src/lib.rs @@ -127,6 +127,9 @@ impl Renderer{ .with("mode", UniformVariableType::I32) .finish(); let mut params = ShaderParams::default(); + params.state.color_blend = Some((crayon::video::assets::shader::Equation::Add, + crayon::video::assets::shader::BlendFactor::Value(crayon::video::assets::shader::BlendValue::SourceAlpha), + crayon::video::assets::shader::BlendFactor::OneMinusValue(crayon::video::assets::shader::BlendValue::SourceAlpha))); params.attributes = attributes; params.uniforms = uniforms; //looking for Position @@ -135,7 +138,6 @@ impl Renderer{ let shader = video::create_shader(params.clone(), vs, fs).unwrap(); let mut params = SurfaceParams::default(); - //params.set_attachments(&[rendered_texture], None).unwrap(); params.set_clear(Color::gray(), None, None); let vert:Vec = Vec::new(); let commands:Vec = Vec::new(); @@ -146,7 +148,6 @@ impl Renderer{ vertices: vert, shader:shader, surface:surface, - //rendered_texture:rendered_texture, commands: commands } } @@ -160,7 +161,6 @@ impl Renderer{ } pub fn fill

(&mut self,dims: (f64, f64),dpi_factor: f64,mut primitives: P, image_map:&conrod_core::image::Map )where P: render::PrimitiveWalker{ let (screen_w, screen_h) = dims; - println!("dim {:?} {:?}",screen_w,screen_h); let half_win_w = screen_w / 2.0; let half_win_h = screen_h / 2.0; let Renderer { ref mut vertices,shader,surface,ref mut commands, ref mut glyph_cache,..} = *self; @@ -304,21 +304,15 @@ impl Renderer{ cache.cache_queued(|rect, data| { let width = rect.width(); let height = rect.height(); - println!("rect2 {:?}",rect); let lbwh = [rect.min.x,rect.min.y,rect.max.x,rect.max.y]; let p1 = cgmath::Point2::new(lbwh[0],lbwh[1]); let p2 = cgmath::Point2::new(lbwh[2],lbwh[3]); let rect = crayon::math::aabb::Aabb2::new(p1,p2); - //let dataz =vec![0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79, 92, 92, 92, 20, 0, 64, 92, 92, 92, 36, 0, 0, 219, 255, 255, 255, 56, 0, 177, 255, 255, 255, 100, 0, 0, 219, 255, 255, 255, 56, 0, 177, 255, 255, 255, 100, 0, 0, 219, 255, 255, 255, 56, 0, 177, 255, 255, 255, 100, 0, 0, 219, 255, 255, 255, 56, 0, 177, 255, 255, 255, 100, 0, 0, 219, 255, 255, 255, 56, 0, 177, 255, 255, 255, 100, 0, 0, 219, 255, 255, 255, 56, 0, 177, 255, 255, 255, 100, 0, 0, 219, 255, 255, 255, 206, 193, 236, 255, 255, 255, 100, 0, 0, 219, 255, 255, 255, 255, 255, 255, 255, 255, 255, 100, 0, 0, 219, 255, 255, 255, 255, 255, 255, 255, 255, 255, 100, 0, 0, 219, 255, 255, 255, 91, 45, 191, 255, 255, 255, 100, 0, 0, 219, 255, 255, 255, 56, 0, 177, 255, 255, 255, 100, 0, 0, 219, 255, 255, 255, 56, 0, 177, 255, 255, 255, 100, 0, 0, 219, 255, 255, 255, 56, 0, 177, 255, 255, 255, 100, 0, 0, 219, 255, 255, 255, 56, 0, 177, 255, 255, 255, 100, 0, 0, 219, 255, 255, 255, 56, 0, 177, 255, 255, 255, 100, 0, 0, 219, 255, 255, 255, 56, 0, 177, 255, 255, 255, 100, 0, 0, 73, 85, 85, 85, 19, 0, 59, 85, 85, 85, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; - //let datal = dataz.as_slice(); - //println!("d {:?} {:?} {:?}",data,width,height); - //let data = std::borrow::Cow::Owned(data); video::update_texture(*texture,rect,data).unwrap(); }).unwrap(); let color = gamma_srgb_to_linear(color.to_fsa()); - let cache_id = font_id.index(); let origin = text::rt::point(0.0, 0.0); @@ -336,7 +330,6 @@ impl Renderer{ if let Ok(Some((uv_rect, screen_rect))) = cache.rect_for(cache_id, g) { let gl_rect = to_gl_rect(screen_rect); - println!("gl_rect {:?}",gl_rect); let v = |p:[f32;2],t:[f32;2]| {Vertex::new(p,t,color)}; let mut push_v = |p, t| vertices.push(v(p, t)); push_v([gl_rect.min.x, gl_rect.max.y], [uv_rect.min.x, uv_rect.max.y]); @@ -471,7 +464,7 @@ impl Renderer{ let mesh = video::create_mesh(params.clone(), Some(data)).unwrap(); let mut dc = Draw::new(self.shader, mesh); dc.set_uniform_variable("tex", *uniform); - dc.set_uniform_variable("mode",MODE_TEXT); + dc.set_uniform_variable("mode",mode); batch.draw(dc); batch.submit(self.surface).unwrap(); @@ -538,7 +531,6 @@ impl<'a> Iterator for Commands<'a> { PreparedCommand::Scizzor(scizzor) => Command::Scizzor(scizzor), PreparedCommand::Plain(ref range,mode) => Command::Draw(DrawE::Plain(&vertices[range.clone()],mode)), - // Command::Draw(DrawE::Test), PreparedCommand::Image(id, ref range) => Command::Draw(DrawE::Image(id, &vertices[range.clone()])), }) @@ -563,14 +555,14 @@ fn glyph_cache_texture( { // Determine the optimal texture format to use given the opengl version. let mut params = TextureParams::default(); - //params.format = TextureFormat::RGBA8; + params.format = TextureFormat::R8; //params.hint = TextureHint::Stream; params.hint = TextureHint::Stream; params.dimensions = (width, height).into(); let data_size = params.format.size(params.dimensions) as usize; - let bytes = vec![128u8; data_size]; + let bytes = vec![]; let data = TextureData{ - bytes: vec![bytes.into_boxed_slice()] + bytes:bytes }; video::create_texture(params,data) } \ No newline at end of file From a0d88c78b15ffe8cc99de0946a0e8df8f46dc441 Mon Sep 17 00:00:00 2001 From: alan poon Date: Tue, 16 Apr 2019 15:25:57 +0800 Subject: [PATCH 33/64] merge --- assets/crayon/workspace.toml | 3 -- backends/conrod_crayon/examples/crayon.rs | 39 ----------------------- 2 files changed, 42 deletions(-) diff --git a/assets/crayon/workspace.toml b/assets/crayon/workspace.toml index f0b2093c9..b1ac920d8 100644 --- a/assets/crayon/workspace.toml +++ b/assets/crayon/workspace.toml @@ -36,8 +36,5 @@ extensions = [ type = 'Bytes' extensions = [ '.ttf', -<<<<<<< HEAD -======= '.otf', ->>>>>>> primitivetext ] \ No newline at end of file diff --git a/backends/conrod_crayon/examples/crayon.rs b/backends/conrod_crayon/examples/crayon.rs index 9e8409609..cb9f603f7 100644 --- a/backends/conrod_crayon/examples/crayon.rs +++ b/backends/conrod_crayon/examples/crayon.rs @@ -94,23 +94,7 @@ impl Drop for Window { impl LifecycleListener for Window { fn on_update(&mut self) -> CrResult<()> { -<<<<<<< HEAD conrod_crayon::events::convert_event(&mut self.ui); -======= - let mut text_edit:HashMap = HashMap::new(); - text_edit.insert("text_edit".to_owned(),"t".to_owned()); - conrod_crayon::events::convert_event(&mut self.ui,Box::new(|vt:&mut HashMap|{ - for (id,val) in input::text_edit(){ - if let Some(k) = vt.get_mut(&id.clone()){ - *k = val; - } - } - }),&mut text_edit); - let k = "text_edit".to_owned(); - //self.app.textedit = text_edit.get(&k).unwrap().clone(); - - //self.ui.handle_event(Input::Press(conrod_core::input::Button::Mouse(conrod_core::input::state::mouse::Button::Left))); ->>>>>>> primitivetext { let mut ui = &mut self.ui.set_widgets(); @@ -119,28 +103,6 @@ impl LifecycleListener for Window { widget::Image::new(self.app.rust_logo) .w_h(LOGO_SIDE, LOGO_SIDE) .middle() -<<<<<<< HEAD - .set(self.ids.rust_logo, ui);*/ - for edit in widget::TextEdit::new(&self.app.textedit) - .color(color::WHITE) - .w_h(LOGO_SIDE, LOGO_SIDE) - .middle() - .center_justify() - .line_spacing(2.5) - //.restrict_to_height(false) // Let the height grow infinitely and scroll. - .set(self.ids.text_edit, ui) - { - self.app.textedit = edit; - } - /* - widget::button::Button::new() - .w_h(200.0,50.0) - .hover_color(color::RED) - .press_color(color::ORANGE) - .mid_bottom() - .set(self.ids.text_edit,ui); - -======= .set(self.ids.rust_logo, ui); */ widget::Text::new("H") @@ -151,7 +113,6 @@ impl LifecycleListener for Window { .set(self.ids.text,ui); /* ->>>>>>> primitivetext widget::Rectangle::fill_with([80.0, 80.0],color::ORANGE) .middle() .set(self.ids.rust_logo, ui); From 8fe2b882c5430f6fcba71fa2b5ad72cdd19b1f67 Mon Sep 17 00:00:00 2001 From: alan poon Date: Wed, 17 Apr 2019 15:33:37 +0800 Subject: [PATCH 34/64] before fixing uniform mode --- backends/conrod_crayon/examples/crayon.rs | 34 +++++++++++++++++------ 1 file changed, 26 insertions(+), 8 deletions(-) diff --git a/backends/conrod_crayon/examples/crayon.rs b/backends/conrod_crayon/examples/crayon.rs index cb9f603f7..decad1f23 100644 --- a/backends/conrod_crayon/examples/crayon.rs +++ b/backends/conrod_crayon/examples/crayon.rs @@ -31,8 +31,9 @@ impl LatchProbe for WindowResources { crayon_bytes::state(self.b) != ResourceState::NotReady } } -widget_ids!(struct Ids { text }); +widget_ids!(struct Ids { text,canvas }); struct Window { + text:String, renderer: Renderer, //app: conrod_example_shared::DemoApp, ui: conrod_core::Ui, @@ -63,8 +64,16 @@ impl Window { let renderer = conrod_crayon::Renderer::new((WIN_W as f64,WIN_H as f64), dpi_factor as f64); let f = ui.fonts.insert(load_bold(resources.b)); ui.theme.font_id = Some(f); + let mut demo_text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. \ + Mauris aliquet porttitor tellus vel euismod. Integer lobortis volutpat bibendum. Nulla \ + finibus odio nec elit condimentum, rhoncus fermentum purus lacinia. Interdum et malesuada \ + fames ac ante ipsum primis in faucibus. Cras rhoncus nisi nec dolor bibendum pellentesque. \ + Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. \ + Quisque commodo nibh hendrerit nunc sollicitudin sodales. Cras vitae tempus ipsum. Nam \ + magna est, efficitur suscipit dolor eu, consectetur consectetur urna.".to_owned(); Ok(Window { //app:app, + text: demo_text, ui:ui, ids:ids, image_map:image_map, @@ -105,13 +114,22 @@ impl LifecycleListener for Window { .middle() .set(self.ids.rust_logo, ui); */ - widget::Text::new("H") - .color(color::LIGHT_GREEN) - .font_size(120) - .w_h(200.0,50.0) - .middle() - .set(self.ids.text,ui); - + widget::Canvas::new() + .scroll_kids_vertically() + .color(color::DARK_CHARCOAL) + .set(self.ids.canvas, ui); + for edit in widget::TextEdit::new(&self.text) + .color(color::WHITE) + .font_size(20) + .padded_w_of(self.ids.canvas, 20.0) + .mid_top_of(self.ids.canvas) + .center_justify() + .line_spacing(2.5) + .set(self.ids.text,ui){ + println!("aa{:?}",edit.clone()); + self.text = edit; + + } /* widget::Rectangle::fill_with([80.0, 80.0],color::ORANGE) .middle() From 9bc55bfa7e209bf94885787c0e489d5fb0cfe4d6 Mon Sep 17 00:00:00 2001 From: alan poon Date: Wed, 17 Apr 2019 18:24:48 +0800 Subject: [PATCH 35/64] mode stuck --- backends/conrod_crayon/Cargo.toml | 4 +- backends/conrod_crayon/examples/crayon.rs | 13 ++++-- backends/conrod_crayon/src/lib.rs | 48 +++++++++----------- backends/conrod_crayon/src/shaders/conrod.fs | 16 +++---- backends/conrod_crayon/src/shaders/conrod.vs | 9 ++-- backends/conrod_glium/examples/text_edit.rs | 2 +- backends/conrod_piston/src/event.rs | 1 - 7 files changed, 46 insertions(+), 47 deletions(-) diff --git a/backends/conrod_crayon/Cargo.toml b/backends/conrod_crayon/Cargo.toml index fcaf732c6..b45fa737b 100644 --- a/backends/conrod_crayon/Cargo.toml +++ b/backends/conrod_crayon/Cargo.toml @@ -17,10 +17,10 @@ path = "./src/lib.rs" [dependencies] conrod_core = { path = "../../conrod_core", version = "0.63" } -crayon = { git = "https://github.com/alanpoon/crayon.git", branch ="textedit"} +crayon = { path="../../../crayon"} conrod_example_shared = { path = "../conrod_example_shared", version = "0.63" } serde_json = "1.0" -crayon_bytes = { git = "https://github.com/alanpoon/crayon.git", branch ="textedit"} +crayon_bytes = { path="../../../crayon/modules/bytes" } cgmath = "0.16.1" [target.'cfg(target_arch = "wasm32")'.dependencies] diff --git a/backends/conrod_crayon/examples/crayon.rs b/backends/conrod_crayon/examples/crayon.rs index decad1f23..1b3a1c628 100644 --- a/backends/conrod_crayon/examples/crayon.rs +++ b/backends/conrod_crayon/examples/crayon.rs @@ -31,7 +31,7 @@ impl LatchProbe for WindowResources { crayon_bytes::state(self.b) != ResourceState::NotReady } } -widget_ids!(struct Ids { text,canvas }); +widget_ids!(struct Ids { text,canvas,scrollbar }); struct Window { text:String, renderer: Renderer, @@ -49,7 +49,7 @@ impl Window { pub fn build(resources: &WindowResources) -> CrResult { let mut ui = conrod_core::UiBuilder::new([WIN_W as f64, WIN_H as f64]) - .theme(conrod_example_shared::theme()) + // .theme(conrod_example_shared::theme()) .build(); //let ids = conrod_example_shared::Ids::new(ui.widget_id_generator()); @@ -116,8 +116,9 @@ impl LifecycleListener for Window { */ widget::Canvas::new() .scroll_kids_vertically() - .color(color::DARK_CHARCOAL) + .color(color::BLUE) .set(self.ids.canvas, ui); + for edit in widget::TextEdit::new(&self.text) .color(color::WHITE) .font_size(20) @@ -130,10 +131,12 @@ impl LifecycleListener for Window { self.text = edit; } - /* + + widget::Scrollbar::y_axis(self.ids.canvas).auto_hide(true).set(self.ids.scrollbar, ui); + /* widget::Rectangle::fill_with([80.0, 80.0],color::ORANGE) .middle() - .set(self.ids.rust_logo, ui); + .set(self.ids.text, ui); */ } diff --git a/backends/conrod_crayon/src/lib.rs b/backends/conrod_crayon/src/lib.rs index 2ed0fcd83..e8834f7cb 100644 --- a/backends/conrod_crayon/src/lib.rs +++ b/backends/conrod_crayon/src/lib.rs @@ -22,15 +22,16 @@ impl_vertex! { pos => [Position; Float; 2; false], uv =>[Texcoord0; Float; 2; false], color =>[Color0; Float; 4; true], + mode =>[Weight; UShort; 1; false], } } /// Draw text from the text cache texture `tex` in the fragment shader. -pub const MODE_TEXT: i32 = 0; +pub const MODE_TEXT: u32 = 0; /// Draw an image from the texture at `tex` in the fragment shader. -pub const MODE_IMAGE: i32 = 1; +pub const MODE_IMAGE: u32 = 1; /// Ignore `tex` and draw simple, colored 2D geometry. -pub const MODE_GEOMETRY: i32 = 2; +pub const MODE_GEOMETRY: u32 = 2; /// A `Command` describing a step in the drawing process. #[derive(Clone, Debug)] pub enum Command<'a> { @@ -41,7 +42,7 @@ pub enum Command<'a> { } enum PreparedCommand { Image(image::Id, std::ops::Range), - Plain(std::ops::Range,i32), + Plain(std::ops::Range), Scizzor(SurfaceScissor), } /// A rusttype `GlyphCache` along with a `glium::texture::Texture2d` for caching text on the `GPU`. @@ -106,7 +107,7 @@ pub enum DrawE<'a> { /// image_map at the given `widget::Id`. Image(image::Id, &'a [Vertex]), /// A range of vertices representing plain triangles. - Plain(&'a [Vertex],i32), + Plain(&'a [Vertex]), Test, } @@ -121,15 +122,16 @@ impl Renderer{ .with(Attribute::Position, 2) .with(Attribute::Texcoord0, 2) .with(Attribute::Color0, 4) + .with(Attribute::Weight,1) .finish(); let uniforms = UniformVariableLayout::build() .with("tex", UniformVariableType::Texture) - .with("mode", UniformVariableType::I32) .finish(); let mut params = ShaderParams::default(); - params.state.color_blend = Some((crayon::video::assets::shader::Equation::Add, + /* params.state.color_blend = Some((crayon::video::assets::shader::Equation::Add, crayon::video::assets::shader::BlendFactor::Value(crayon::video::assets::shader::BlendValue::SourceAlpha), crayon::video::assets::shader::BlendFactor::OneMinusValue(crayon::video::assets::shader::BlendValue::SourceAlpha))); + */ params.attributes = attributes; params.uniforms = uniforms; //looking for Position @@ -200,21 +202,16 @@ impl Renderer{ let vx = |x: f64| (x * dpi_factor / half_win_w) as f32; let vy = |y: f64| (y * dpi_factor / half_win_h) as f32; - let mut mode = MODE_GEOMETRY; while let Some(primitive) = primitives.next_primitive() { let render::Primitive { kind, scizzor, rect, .. } = primitive; - let new_scissor = rect_to_crayon_rect(scizzor); - if let render::PrimitiveKind::Text { .. } = kind{ - mode = MODE_TEXT; - } - + let new_scissor = rect_to_crayon_rect(scizzor); if new_scissor != current_scissor { // Finish the current command. match current_state { State::Plain { start } => - commands.push(PreparedCommand::Plain(start..vertices.len(),mode)), + commands.push(PreparedCommand::Plain(start..vertices.len())), State::Image { image_id, start } => commands.push(PreparedCommand::Image(image_id, start..vertices.len())), } @@ -232,9 +229,10 @@ impl Renderer{ render::PrimitiveKind::Rectangle { color } => { switch_to_plain_state!(); let color = gamma_srgb_to_linear(color.to_fsa()); + println!("rec {:?} {:?}",color,rect); let (l, r, b, t) = rect.l_r_b_t(); let v = |x, y| { - Vertex::new([vx(x),vy(y)],[0.0,0.0],color) + Vertex::new([vx(x),vy(y)],[0.0,0.0],color,MODE_GEOMETRY) }; let mut push_v = |x, y| vertices.push(v(x, y)); @@ -261,7 +259,7 @@ impl Renderer{ let color = gamma_srgb_to_linear(color.into()); let v = |p: [Scalar; 2]| { - Vertex::new([vx(p[0]), vy(p[1])],[0.0,0.0],color) + Vertex::new([vx(p[0]), vy(p[1])],[0.0,0.0],color,MODE_GEOMETRY) }; for triangle in triangles { @@ -279,7 +277,7 @@ impl Renderer{ switch_to_plain_state!(); let v = |(p, c): ([Scalar; 2], color::Rgba)| { - Vertex::new([vx(p[0]), vy(p[1])],[0.0,0.0],gamma_srgb_to_linear(c.into())) + Vertex::new([vx(p[0]), vy(p[1])],[0.0,0.0],gamma_srgb_to_linear(c.into()),MODE_GEOMETRY) }; for triangle in triangles { @@ -330,7 +328,7 @@ impl Renderer{ if let Ok(Some((uv_rect, screen_rect))) = cache.rect_for(cache_id, g) { let gl_rect = to_gl_rect(screen_rect); - let v = |p:[f32;2],t:[f32;2]| {Vertex::new(p,t,color)}; + let v = |p:[f32;2],t:[f32;2]| {Vertex::new(p,t,color,MODE_TEXT)}; let mut push_v = |p, t| vertices.push(v(p, t)); push_v([gl_rect.min.x, gl_rect.max.y], [uv_rect.min.x, uv_rect.max.y]); push_v([gl_rect.min.x, gl_rect.min.y], [uv_rect.min.x, uv_rect.min.y]); @@ -354,7 +352,7 @@ impl Renderer{ // If we were in the `Plain` drawing state, switch to Image drawing state. State::Plain { start } => { - commands.push(PreparedCommand::Plain(start..vertices.len(),mode)); + commands.push(PreparedCommand::Plain(start..vertices.len())); current_state = State::Image { image_id: new_image_id, start: vertices.len(), @@ -402,7 +400,7 @@ impl Renderer{ // Convert from conrod Scalar range to GL range -1.0 to 1.0. let x = (x * dpi_factor as Scalar / half_win_w) as f32; let y = (y * dpi_factor as Scalar / half_win_h) as f32; - Vertex::new([x, y],t,color) + Vertex::new([x, y],t,color,MODE_IMAGE) }; let mut push_v = |x, y, t| vertices.push(v(x, y, t)); @@ -428,7 +426,7 @@ impl Renderer{ match current_state { State::Plain { start } => - commands.push(PreparedCommand::Plain(start..vertices.len(),mode)), + commands.push(PreparedCommand::Plain(start..vertices.len())), State::Image { image_id, start } => commands.push(PreparedCommand::Image(image_id, start..vertices.len())), } @@ -446,7 +444,7 @@ impl Renderer{ // Draw to the target with the given `draw` command. Command::Draw(draw) => match draw { - DrawE::Plain(slice,mode) => if slice.len() >= NUM_VERTICES_IN_TRIANGLE { + DrawE::Plain(slice) => if slice.len() >= NUM_VERTICES_IN_TRIANGLE { let mut idxes:Vec = vec![]; for i in 0..slice.len(){ idxes.push(i as u16); @@ -464,7 +462,6 @@ impl Renderer{ let mesh = video::create_mesh(params.clone(), Some(data)).unwrap(); let mut dc = Draw::new(self.shader, mesh); dc.set_uniform_variable("tex", *uniform); - dc.set_uniform_variable("mode",mode); batch.draw(dc); batch.submit(self.surface).unwrap(); @@ -494,7 +491,6 @@ impl Renderer{ let mesh = video::create_mesh(params, Some(data)).unwrap(); let mut dc = Draw::new(self.shader, mesh); dc.set_uniform_variable("tex", image); - dc.set_uniform_variable("mode",MODE_IMAGE); batch.draw(dc); batch.submit(self.surface).unwrap() } @@ -529,8 +525,8 @@ impl<'a> Iterator for Commands<'a> { let Commands { ref mut commands, ref vertices } = *self; commands.next().map(|command| match *command { PreparedCommand::Scizzor(scizzor) => Command::Scizzor(scizzor), - PreparedCommand::Plain(ref range,mode) => - Command::Draw(DrawE::Plain(&vertices[range.clone()],mode)), + PreparedCommand::Plain(ref range) => + Command::Draw(DrawE::Plain(&vertices[range.clone()])), PreparedCommand::Image(id, ref range) => Command::Draw(DrawE::Image(id, &vertices[range.clone()])), }) diff --git a/backends/conrod_crayon/src/shaders/conrod.fs b/backends/conrod_crayon/src/shaders/conrod.fs index 72537a07c..68eb9f205 100644 --- a/backends/conrod_crayon/src/shaders/conrod.fs +++ b/backends/conrod_crayon/src/shaders/conrod.fs @@ -1,8 +1,7 @@ -#version 300 es -precision mediump float; +#version 140 uniform sampler2D tex; -uniform int mode; +flat in uint v_mode; in vec2 v_tex_coords; in vec4 v_color; @@ -10,15 +9,16 @@ out vec4 f_color; void main() { // Text - if (mode == 0) { + + if (v_mode == uint(0) ) { f_color = v_color * vec4(1.0, 1.0, 1.0, texture(tex, v_tex_coords).r); - + // Image - } else if (mode == 1) { + } else if (v_mode == uint(1)) { f_color = texture(tex, v_tex_coords); - + // 2D Geometry - } else if (mode == 2) { + } else { f_color = v_color; } } \ No newline at end of file diff --git a/backends/conrod_crayon/src/shaders/conrod.vs b/backends/conrod_crayon/src/shaders/conrod.vs index f0da3de86..372f6ba85 100644 --- a/backends/conrod_crayon/src/shaders/conrod.vs +++ b/backends/conrod_crayon/src/shaders/conrod.vs @@ -1,16 +1,17 @@ -#version 300 es -precision mediump float; +#version 140 in vec2 Position; in vec2 Texcoord0; in vec4 Color0; +in uint Weight; - -out vec2 v_tex_coords; out vec4 v_color; +out vec2 v_tex_coords; +flat out uint v_mode; void main() { gl_Position = vec4(Position, 0.0, 1.0); v_tex_coords = Texcoord0; v_color = Color0; + v_mode = Weight; } \ No newline at end of file diff --git a/backends/conrod_glium/examples/text_edit.rs b/backends/conrod_glium/examples/text_edit.rs index 8a4d86613..a2a789506 100644 --- a/backends/conrod_glium/examples/text_edit.rs +++ b/backends/conrod_glium/examples/text_edit.rs @@ -109,7 +109,7 @@ fn set_ui(ref mut ui: conrod_core::UiCell, ids: &Ids, demo_text: &mut String) { widget::Canvas::new() .scroll_kids_vertically() - .color(color::DARK_CHARCOAL) + .color(color::BLUE) .set(ids.canvas, ui); for edit in widget::TextEdit::new(demo_text) diff --git a/backends/conrod_piston/src/event.rs b/backends/conrod_piston/src/event.rs index 5aeaf41b5..d08730a64 100644 --- a/backends/conrod_piston/src/event.rs +++ b/backends/conrod_piston/src/event.rs @@ -25,7 +25,6 @@ pub fn convert(event: E, win_w: Scalar, win_h: Scalar) -> Option Date: Wed, 17 Apr 2019 22:27:38 +0800 Subject: [PATCH 36/64] added chars --- backends/conrod_crayon/src/events.rs | 8 +++++++- backends/conrod_crayon/src/lib.rs | 14 +++++++------- backends/conrod_crayon/src/shaders/conrod.fs | 8 ++++---- backends/conrod_crayon/src/shaders/conrod.vs | 4 ++-- 4 files changed, 20 insertions(+), 14 deletions(-) diff --git a/backends/conrod_crayon/src/events.rs b/backends/conrod_crayon/src/events.rs index d11ac591f..943190b2d 100644 --- a/backends/conrod_crayon/src/events.rs +++ b/backends/conrod_crayon/src/events.rs @@ -47,9 +47,15 @@ pub fn convert_event(ui:&mut Ui){ ui.handle_event(Input::Motion(Motion::Scroll{x:(j.x as f64)-w/2.0,y:(j.y as f64)-h/2.0})); } + for k in input::chars(){ + if k != '\u{8}'{ + ui.handle_event(Input::Text(k.to_string())); + } + } + } pub fn key_convert(j:String)->String{ j.replace("Key","D").replace("Control","Ctrl").replace("LBracket","LeftBracket").replace("RBracket","RightBracket") - .replace("Subtract","Minus") + .replace("Subtract","Minus").replace("Add","Plus").replace("Back","Backspace").replace("Backspaceslash","Backslash") } diff --git a/backends/conrod_crayon/src/lib.rs b/backends/conrod_crayon/src/lib.rs index e8834f7cb..b196923b1 100644 --- a/backends/conrod_crayon/src/lib.rs +++ b/backends/conrod_crayon/src/lib.rs @@ -22,16 +22,16 @@ impl_vertex! { pos => [Position; Float; 2; false], uv =>[Texcoord0; Float; 2; false], color =>[Color0; Float; 4; true], - mode =>[Weight; UShort; 1; false], + mode =>[Weight; UByte; 1; false], } } /// Draw text from the text cache texture `tex` in the fragment shader. -pub const MODE_TEXT: u32 = 0; +pub const MODE_TEXT: u8 = 0; /// Draw an image from the texture at `tex` in the fragment shader. -pub const MODE_IMAGE: u32 = 1; +pub const MODE_IMAGE: u8 = 1; /// Ignore `tex` and draw simple, colored 2D geometry. -pub const MODE_GEOMETRY: u32 = 2; +pub const MODE_GEOMETRY: u8 = 2; /// A `Command` describing a step in the drawing process. #[derive(Clone, Debug)] pub enum Command<'a> { @@ -128,10 +128,10 @@ impl Renderer{ .with("tex", UniformVariableType::Texture) .finish(); let mut params = ShaderParams::default(); - /* params.state.color_blend = Some((crayon::video::assets::shader::Equation::Add, + params.state.color_blend = Some((crayon::video::assets::shader::Equation::Add, crayon::video::assets::shader::BlendFactor::Value(crayon::video::assets::shader::BlendValue::SourceAlpha), crayon::video::assets::shader::BlendFactor::OneMinusValue(crayon::video::assets::shader::BlendValue::SourceAlpha))); - */ + params.attributes = attributes; params.uniforms = uniforms; //looking for Position @@ -229,7 +229,7 @@ impl Renderer{ render::PrimitiveKind::Rectangle { color } => { switch_to_plain_state!(); let color = gamma_srgb_to_linear(color.to_fsa()); - println!("rec {:?} {:?}",color,rect); + let (l, r, b, t) = rect.l_r_b_t(); let v = |x, y| { Vertex::new([vx(x),vy(y)],[0.0,0.0],color,MODE_GEOMETRY) diff --git a/backends/conrod_crayon/src/shaders/conrod.fs b/backends/conrod_crayon/src/shaders/conrod.fs index 68eb9f205..218cb64c8 100644 --- a/backends/conrod_crayon/src/shaders/conrod.fs +++ b/backends/conrod_crayon/src/shaders/conrod.fs @@ -1,7 +1,7 @@ #version 140 uniform sampler2D tex; -flat in uint v_mode; +flat in int v_mode; in vec2 v_tex_coords; in vec4 v_color; @@ -10,15 +10,15 @@ out vec4 f_color; void main() { // Text - if (v_mode == uint(0) ) { + if (v_mode < int(0.1) ) { f_color = v_color * vec4(1.0, 1.0, 1.0, texture(tex, v_tex_coords).r); // Image - } else if (v_mode == uint(1)) { + } else if (v_mode < int(1.1)) { f_color = texture(tex, v_tex_coords); // 2D Geometry - } else { + } else if (v_mode < int(2.1)){ f_color = v_color; } } \ No newline at end of file diff --git a/backends/conrod_crayon/src/shaders/conrod.vs b/backends/conrod_crayon/src/shaders/conrod.vs index 372f6ba85..13072faa4 100644 --- a/backends/conrod_crayon/src/shaders/conrod.vs +++ b/backends/conrod_crayon/src/shaders/conrod.vs @@ -3,11 +3,11 @@ in vec2 Position; in vec2 Texcoord0; in vec4 Color0; -in uint Weight; +in int Weight; out vec4 v_color; out vec2 v_tex_coords; -flat out uint v_mode; +flat out int v_mode; void main() { gl_Position = vec4(Position, 0.0, 1.0); From 19e13a78148b8f957ba6b2905589aeb2a62ef6bb Mon Sep 17 00:00:00 2001 From: alanpoon Date: Wed, 24 Apr 2019 13:12:55 +0800 Subject: [PATCH 37/64] attributes 3 requires int --- backends/conrod_crayon/Cargo.toml | 7 +++--- backends/conrod_crayon/examples/crayon.rs | 25 ++++++++++--------- backends/conrod_crayon/src/lib.rs | 8 +++--- backends/conrod_crayon/src/shaders/conrod.fs | 3 ++- backends/conrod_crayon/src/shaders/conrod.vs | 3 ++- .../tools/wasm-template/webpack.config.js | 1 - t.txt | 4 ++- 7 files changed, 28 insertions(+), 23 deletions(-) diff --git a/backends/conrod_crayon/Cargo.toml b/backends/conrod_crayon/Cargo.toml index b45fa737b..01c851e5e 100644 --- a/backends/conrod_crayon/Cargo.toml +++ b/backends/conrod_crayon/Cargo.toml @@ -17,11 +17,12 @@ path = "./src/lib.rs" [dependencies] conrod_core = { path = "../../conrod_core", version = "0.63" } -crayon = { path="../../../crayon"} +crayon = { path = "../../../wasm/crayon"} conrod_example_shared = { path = "../conrod_example_shared", version = "0.63" } serde_json = "1.0" -crayon_bytes = { path="../../../crayon/modules/bytes" } +crayon_bytes = { path = "../../../wasm/crayon/modules/bytes"} cgmath = "0.16.1" + [target.'cfg(target_arch = "wasm32")'.dependencies] -wasm-bindgen = "0.2.40" \ No newline at end of file +wasm-bindgen = "0.2.42" \ No newline at end of file diff --git a/backends/conrod_crayon/examples/crayon.rs b/backends/conrod_crayon/examples/crayon.rs index 1b3a1c628..a7c89bff2 100644 --- a/backends/conrod_crayon/examples/crayon.rs +++ b/backends/conrod_crayon/examples/crayon.rs @@ -35,7 +35,7 @@ widget_ids!(struct Ids { text,canvas,scrollbar }); struct Window { text:String, renderer: Renderer, - //app: conrod_example_shared::DemoApp, + app: conrod_example_shared::DemoApp, ui: conrod_core::Ui, ids: Ids, image_map: conrod_core::image::Map, @@ -55,10 +55,10 @@ impl Window { let ids = Ids::new(ui.widget_id_generator()); let mut image_map: conrod_core::image::Map = conrod_core::image::Map::new(); - //let rust_logo = image_map.insert(load_rust_logo()); + let rust_logo = image_map.insert(load_rust_logo()); dbg!("l"); // Demonstration app state that we'll control with our conrod GUI. - //let app = conrod_example_shared::DemoApp::new(rust_logo); + let app = conrod_example_shared::DemoApp::new(rust_logo); let dpi_factor = device_pixel_ratio(); println!("dpi {:?}",dpi_factor); let renderer = conrod_crayon::Renderer::new((WIN_W as f64,WIN_H as f64), dpi_factor as f64); @@ -72,7 +72,7 @@ impl Window { Quisque commodo nibh hendrerit nunc sollicitudin sodales. Cras vitae tempus ipsum. Nam \ magna est, efficitur suscipit dolor eu, consectetur consectetur urna.".to_owned(); Ok(Window { - //app:app, + app:app, text: demo_text, ui:ui, ids:ids, @@ -108,17 +108,18 @@ impl LifecycleListener for Window { let mut ui = &mut self.ui.set_widgets(); const LOGO_SIDE: conrod_core::Scalar = 306.0; - /* + widget::Image::new(self.app.rust_logo) .w_h(LOGO_SIDE, LOGO_SIDE) .middle() - .set(self.ids.rust_logo, ui); - */ - widget::Canvas::new() + .set(self.ids.canvas, ui); + + /*widget::Canvas::new() .scroll_kids_vertically() .color(color::BLUE) .set(self.ids.canvas, ui); - + */ + /* for edit in widget::TextEdit::new(&self.text) .color(color::WHITE) .font_size(20) @@ -131,8 +132,8 @@ impl LifecycleListener for Window { self.text = edit; } - - widget::Scrollbar::y_axis(self.ids.canvas).auto_hide(true).set(self.ids.scrollbar, ui); + */ + //widget::Scrollbar::y_axis(self.ids.canvas).auto_hide(true).set(self.ids.scrollbar, ui); /* widget::Rectangle::fill_with([80.0, 80.0],color::ORANGE) .middle() @@ -160,7 +161,7 @@ main!({ #[cfg(not(target_arch = "wasm32"))] let res = format!("file://{}/../../assets/crayon/resources/", env!("CARGO_MANIFEST_DIR").replace("\\","/")); #[cfg(target_arch = "wasm32")] - let res = format!("/resources/"); + let res = format!("http://localhost:8080/resources/"); let mut params = Params::default(); params.window.title = "CR: RenderTexture".into(); params.window.size = (WIN_W as u32, WIN_H as u32).into(); diff --git a/backends/conrod_crayon/src/lib.rs b/backends/conrod_crayon/src/lib.rs index b196923b1..f0bc668de 100644 --- a/backends/conrod_crayon/src/lib.rs +++ b/backends/conrod_crayon/src/lib.rs @@ -22,16 +22,16 @@ impl_vertex! { pos => [Position; Float; 2; false], uv =>[Texcoord0; Float; 2; false], color =>[Color0; Float; 4; true], - mode =>[Weight; UByte; 1; false], + mode =>[Weight; Short; 1; false], } } /// Draw text from the text cache texture `tex` in the fragment shader. -pub const MODE_TEXT: u8 = 0; +pub const MODE_TEXT: i32 = 0; /// Draw an image from the texture at `tex` in the fragment shader. -pub const MODE_IMAGE: u8 = 1; +pub const MODE_IMAGE: i32 = 1; /// Ignore `tex` and draw simple, colored 2D geometry. -pub const MODE_GEOMETRY: u8 = 2; +pub const MODE_GEOMETRY: i32 = 2; /// A `Command` describing a step in the drawing process. #[derive(Clone, Debug)] pub enum Command<'a> { diff --git a/backends/conrod_crayon/src/shaders/conrod.fs b/backends/conrod_crayon/src/shaders/conrod.fs index 218cb64c8..d8fa709ea 100644 --- a/backends/conrod_crayon/src/shaders/conrod.fs +++ b/backends/conrod_crayon/src/shaders/conrod.fs @@ -1,4 +1,5 @@ -#version 140 +#version 300 es +precision mediump float; uniform sampler2D tex; flat in int v_mode; diff --git a/backends/conrod_crayon/src/shaders/conrod.vs b/backends/conrod_crayon/src/shaders/conrod.vs index 13072faa4..2f0379ff4 100644 --- a/backends/conrod_crayon/src/shaders/conrod.vs +++ b/backends/conrod_crayon/src/shaders/conrod.vs @@ -1,4 +1,5 @@ -#version 140 +#version 300 es +precision mediump float; in vec2 Position; in vec2 Texcoord0; diff --git a/backends/conrod_crayon/tools/wasm-template/webpack.config.js b/backends/conrod_crayon/tools/wasm-template/webpack.config.js index b025434e7..a909e22ee 100644 --- a/backends/conrod_crayon/tools/wasm-template/webpack.config.js +++ b/backends/conrod_crayon/tools/wasm-template/webpack.config.js @@ -21,7 +21,6 @@ module.exports = { ], devServer: { contentBase: [__dirname, path.join(__dirname, '../../../../assets/crayon')], - inline:true, port: 8080 }, mode: 'development' diff --git a/t.txt b/t.txt index 15622162c..3e5f1aa03 100644 --- a/t.txt +++ b/t.txt @@ -1,4 +1,6 @@ > Vertex { pos: [-0.3314286, 0.032653093], uv: [0.0014285714, 0.036734693], color: [0.25415218, 0.76052463, 0.034339808, 1.0] }, Vertex { pos: [-0.3314286, 0.10204077], uv: [0.0014285714, 0.0020408162], color: [0.25415218, 0.76052463, 0.034339808, 1.0] }, Vertex { pos: [-0.3, 0.10204077], uv: [0.017142856, 0.0020408162], color: [0.25415218, 0.76052463, 0.034339808, 1.0] }, Vertex { pos: [-0.3, 0.10204077], uv: [0.017142856, 0.0020408162], color: [0.25415218, 0.76052463, 0.034339808, 1.0] }, Vertex { pos: [-0.3, 0.032653093], uv: [0.017142856, 0.036734693], color: [0.25415218, 0.76052463, 0.034339808, 1.0] }, Vertex { pos: [-0.3314286, 0.032653093], uv: [0.0014285714, 0.036734693], color: [0.25415218, 0.76052463, 0.034339808, 1.0] }] (Rect { min: Point { x: 0.0014285714, y: 0.0020408162 }, max: Point { x: 0.017142856, y: 0.036734693 } }, Rect { min: Point { x: 234, y: 220 }, max: Point { x: 245, y: 237 } }) > Vertex { pos: [-0.3314286, 0.032652974], uv: [0.0014306152, 0.036809817], color: [0.25415218, 0.76052463, 0.034339808, 1.0] }, Vertex { pos: [-0.3314286, 0.10204077], uv: [0.0014306152, 0.0020449897], color: [0.25415218, 0.76052463, 0.034339808, 1.0] }, Vertex { pos: [-0.3, 0.10204077], uv: [0.017167382, 0.0020449897], color: [0.25415218, 0.76052463, 0.034339808, 1.0] }, Vertex { pos: [-0.3, 0.10204077], uv: [0.017167382, 0.0020449897], color: [0.25415218, 0.76052463, 0.034339808, 1.0] }, Vertex { pos: [-0.3, 0.032652974], uv: [0.017167382, 0.036809817], color: [0.25415218, 0.76052463, 0.034339808, 1.0] }, Vertex { pos: [-0.3314286, 0.032652974], uv: [0.0014306152, 0.036809817], color: [0.25415218, 0.76052463, 0.034339808, 1.0] }] - min: Point { x: -0.3314286, y: 0.106122375 }, max: Point { x: -0.3, y: 0.028571367 } } \ No newline at end of file + min: Point { x: -0.3314286, y: 0.106122375 }, max: Point { x: -0.3, y: 0.028571367 } } + + www.arewewebyet.org \ No newline at end of file From 1f2b0dd2534b9bf6fb43ed0c677016cb417cc497 Mon Sep 17 00:00:00 2001 From: alanpoon Date: Thu, 25 Apr 2019 09:20:06 +0800 Subject: [PATCH 38/64] t1 --- backends/conrod_crayon/examples/crayon.rs | 12 ++++++------ backends/conrod_crayon/src/lib.rs | 10 +++++----- backends/conrod_crayon/src/shaders/conrod.1.fs | 10 +++++----- backends/conrod_crayon/src/shaders/conrod.1.vs | 6 +++--- backends/conrod_crayon/src/shaders/conrod.fs | 8 ++++---- backends/conrod_crayon/src/shaders/conrod.vs | 4 ++-- backends/conrod_crayon/tools/wasm-template/run.sh | 1 + 7 files changed, 26 insertions(+), 25 deletions(-) diff --git a/backends/conrod_crayon/examples/crayon.rs b/backends/conrod_crayon/examples/crayon.rs index a7c89bff2..5edc02743 100644 --- a/backends/conrod_crayon/examples/crayon.rs +++ b/backends/conrod_crayon/examples/crayon.rs @@ -108,18 +108,18 @@ impl LifecycleListener for Window { let mut ui = &mut self.ui.set_widgets(); const LOGO_SIDE: conrod_core::Scalar = 306.0; - + /* widget::Image::new(self.app.rust_logo) .w_h(LOGO_SIDE, LOGO_SIDE) .middle() .set(self.ids.canvas, ui); - - /*widget::Canvas::new() + */ + widget::Canvas::new() .scroll_kids_vertically() .color(color::BLUE) .set(self.ids.canvas, ui); - */ - /* + + for edit in widget::TextEdit::new(&self.text) .color(color::WHITE) .font_size(20) @@ -132,7 +132,7 @@ impl LifecycleListener for Window { self.text = edit; } - */ + //widget::Scrollbar::y_axis(self.ids.canvas).auto_hide(true).set(self.ids.scrollbar, ui); /* widget::Rectangle::fill_with([80.0, 80.0],color::ORANGE) diff --git a/backends/conrod_crayon/src/lib.rs b/backends/conrod_crayon/src/lib.rs index f0bc668de..1dd299010 100644 --- a/backends/conrod_crayon/src/lib.rs +++ b/backends/conrod_crayon/src/lib.rs @@ -22,16 +22,16 @@ impl_vertex! { pos => [Position; Float; 2; false], uv =>[Texcoord0; Float; 2; false], color =>[Color0; Float; 4; true], - mode =>[Weight; Short; 1; false], + mode =>[Weight; Float; 1; false], } } /// Draw text from the text cache texture `tex` in the fragment shader. -pub const MODE_TEXT: i32 = 0; +pub const MODE_TEXT: f32 = 0.0; /// Draw an image from the texture at `tex` in the fragment shader. -pub const MODE_IMAGE: i32 = 1; +pub const MODE_IMAGE: f32 = 1.0; /// Ignore `tex` and draw simple, colored 2D geometry. -pub const MODE_GEOMETRY: i32 = 2; +pub const MODE_GEOMETRY: f32 = 2.0; /// A `Command` describing a step in the drawing process. #[derive(Clone, Debug)] pub enum Command<'a> { @@ -306,7 +306,7 @@ impl Renderer{ let p1 = cgmath::Point2::new(lbwh[0],lbwh[1]); let p2 = cgmath::Point2::new(lbwh[2],lbwh[3]); let rect = crayon::math::aabb::Aabb2::new(p1,p2); - video::update_texture(*texture,rect,data).unwrap(); + //video::update_texture(*texture,rect,data).unwrap(); }).unwrap(); diff --git a/backends/conrod_crayon/src/shaders/conrod.1.fs b/backends/conrod_crayon/src/shaders/conrod.1.fs index ad6818528..d688d3ddd 100644 --- a/backends/conrod_crayon/src/shaders/conrod.1.fs +++ b/backends/conrod_crayon/src/shaders/conrod.1.fs @@ -2,20 +2,20 @@ precision lowp float; varying vec2 v_tex_coords; varying vec4 v_color; - +varying float mode; uniform sampler2D tex; -uniform int mode; + void main() { // Text - if (mode == 0) { + if (mode < 0.1) { gl_FragColor = v_color * vec4(1.0, 1.0, 1.0, texture2D(tex, v_tex_coords).r); // Image - } else if (mode == 1) { + } else if (mode < 1.1) { gl_FragColor = texture2D(tex, v_tex_coords); // 2D Geometry - } else if (mode == 2) { + } else if (mode < 2.1) { gl_FragColor = v_color; } } \ No newline at end of file diff --git a/backends/conrod_crayon/src/shaders/conrod.1.vs b/backends/conrod_crayon/src/shaders/conrod.1.vs index ca69a8bb5..0df5f83db 100644 --- a/backends/conrod_crayon/src/shaders/conrod.1.vs +++ b/backends/conrod_crayon/src/shaders/conrod.1.vs @@ -4,14 +4,14 @@ precision lowp float; attribute lowp vec2 Position; attribute lowp vec2 Texcoord0; attribute lowp vec4 Color0; - +attribute lowp float Weight; varying vec2 v_tex_coords; varying vec4 v_color; - +varying float mode; void main() { gl_Position = vec4(Position, 0.0, 1.0); v_tex_coords = Texcoord0; v_color = Color0; - + mode = Weight; } \ No newline at end of file diff --git a/backends/conrod_crayon/src/shaders/conrod.fs b/backends/conrod_crayon/src/shaders/conrod.fs index d8fa709ea..dcfe0d916 100644 --- a/backends/conrod_crayon/src/shaders/conrod.fs +++ b/backends/conrod_crayon/src/shaders/conrod.fs @@ -2,7 +2,7 @@ precision mediump float; uniform sampler2D tex; -flat in int v_mode; +in float v_mode; in vec2 v_tex_coords; in vec4 v_color; @@ -11,15 +11,15 @@ out vec4 f_color; void main() { // Text - if (v_mode < int(0.1) ) { + if (v_mode < 0.1 ) { f_color = v_color * vec4(1.0, 1.0, 1.0, texture(tex, v_tex_coords).r); // Image - } else if (v_mode < int(1.1)) { + } else if (v_mode < 1.1) { f_color = texture(tex, v_tex_coords); // 2D Geometry - } else if (v_mode < int(2.1)){ + } else if (v_mode < 2.1){ f_color = v_color; } } \ No newline at end of file diff --git a/backends/conrod_crayon/src/shaders/conrod.vs b/backends/conrod_crayon/src/shaders/conrod.vs index 2f0379ff4..843834625 100644 --- a/backends/conrod_crayon/src/shaders/conrod.vs +++ b/backends/conrod_crayon/src/shaders/conrod.vs @@ -4,11 +4,11 @@ precision mediump float; in vec2 Position; in vec2 Texcoord0; in vec4 Color0; -in int Weight; +in float Weight; out vec4 v_color; out vec2 v_tex_coords; -flat out int v_mode; +out float v_mode; void main() { gl_Position = vec4(Position, 0.0, 1.0); diff --git a/backends/conrod_crayon/tools/wasm-template/run.sh b/backends/conrod_crayon/tools/wasm-template/run.sh index 7d6309b3b..e9e276adb 100755 --- a/backends/conrod_crayon/tools/wasm-template/run.sh +++ b/backends/conrod_crayon/tools/wasm-template/run.sh @@ -3,6 +3,7 @@ BASE_DIR=$SCRIPT_DIR/../../../../ set -e cargo build --example $1 --target wasm32-unknown-unknown +rm -rf $SCRIPT_DIR/dist mkdir $SCRIPT_DIR/dist mkdir $SCRIPT_DIR/dist/intermediate cp $BASE_DIR/target/wasm32-unknown-unknown/debug/examples/$1.wasm $SCRIPT_DIR/dist/intermediate/native.wasm From 2ef39e36f91e454b9ab01cf92f177a765d329984 Mon Sep 17 00:00:00 2001 From: alanpoon Date: Tue, 30 Apr 2019 18:07:43 +0800 Subject: [PATCH 39/64] render text --- backends/conrod_crayon/src/lib.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/backends/conrod_crayon/src/lib.rs b/backends/conrod_crayon/src/lib.rs index 1dd299010..4e5702ed8 100644 --- a/backends/conrod_crayon/src/lib.rs +++ b/backends/conrod_crayon/src/lib.rs @@ -306,7 +306,7 @@ impl Renderer{ let p1 = cgmath::Point2::new(lbwh[0],lbwh[1]); let p2 = cgmath::Point2::new(lbwh[2],lbwh[3]); let rect = crayon::math::aabb::Aabb2::new(p1,p2); - //video::update_texture(*texture,rect,data).unwrap(); + video::update_texture(*texture,rect,data).unwrap(); }).unwrap(); @@ -552,7 +552,6 @@ fn glyph_cache_texture( // Determine the optimal texture format to use given the opengl version. let mut params = TextureParams::default(); params.format = TextureFormat::R8; - //params.hint = TextureHint::Stream; params.hint = TextureHint::Stream; params.dimensions = (width, height).into(); let data_size = params.format.size(params.dimensions) as usize; From c8bd91232d5969310278640ac38686e527f08ada Mon Sep 17 00:00:00 2001 From: alanpoon Date: Thu, 2 May 2019 23:31:32 +0800 Subject: [PATCH 40/64] xargo --- Xargo.toml | 4 + backends/conrod_crayon/Cargo.toml | 4 +- backends/conrod_crayon/Xargo.toml | 4 + backends/conrod_crayon/tools/polyfill.js | 8049 +++++++++++++++++ backends/conrod_crayon/tools/polyfill.wasm | Bin 0 -> 75469 bytes .../tools/wasm-template/Xargo.toml | 4 + .../conrod_crayon/tools/wasm-template/env.js | 17 + .../tools/wasm-template/index.js | 37 +- .../tools/wasm-template/package-lock.json | 133 +- .../tools/wasm-template/package.json | 7 +- .../tools/wasm-template/run.1.sh | 10 +- .../tools/wasm-template/run.2.sh | 11 + .../conrod_crayon/tools/wasm-template/run.sh | 2 +- t.txt | 17 +- 14 files changed, 8227 insertions(+), 72 deletions(-) create mode 100644 Xargo.toml create mode 100644 backends/conrod_crayon/Xargo.toml create mode 100644 backends/conrod_crayon/tools/polyfill.js create mode 100644 backends/conrod_crayon/tools/polyfill.wasm create mode 100644 backends/conrod_crayon/tools/wasm-template/Xargo.toml create mode 100644 backends/conrod_crayon/tools/wasm-template/env.js create mode 100755 backends/conrod_crayon/tools/wasm-template/run.2.sh diff --git a/Xargo.toml b/Xargo.toml new file mode 100644 index 000000000..7c9918823 --- /dev/null +++ b/Xargo.toml @@ -0,0 +1,4 @@ +[target.wasm32-unknown-unknown.dependencies.std] +features = [ + "wasm_syscall", +] diff --git a/backends/conrod_crayon/Cargo.toml b/backends/conrod_crayon/Cargo.toml index 01c851e5e..5275849e4 100644 --- a/backends/conrod_crayon/Cargo.toml +++ b/backends/conrod_crayon/Cargo.toml @@ -23,6 +23,6 @@ serde_json = "1.0" crayon_bytes = { path = "../../../wasm/crayon/modules/bytes"} cgmath = "0.16.1" - [target.'cfg(target_arch = "wasm32")'.dependencies] -wasm-bindgen = "0.2.42" \ No newline at end of file +wasm-bindgen = "0.2.43" + diff --git a/backends/conrod_crayon/Xargo.toml b/backends/conrod_crayon/Xargo.toml new file mode 100644 index 000000000..7c9918823 --- /dev/null +++ b/backends/conrod_crayon/Xargo.toml @@ -0,0 +1,4 @@ +[target.wasm32-unknown-unknown.dependencies.std] +features = [ + "wasm_syscall", +] diff --git a/backends/conrod_crayon/tools/polyfill.js b/backends/conrod_crayon/tools/polyfill.js new file mode 100644 index 000000000..881093c91 --- /dev/null +++ b/backends/conrod_crayon/tools/polyfill.js @@ -0,0 +1,8049 @@ +// Copyright 2010 The Emscripten Authors. All rights reserved. +// Emscripten is available under two separate licenses, the MIT license and the +// University of Illinois/NCSA Open Source License. Both these licenses can be +// found in the LICENSE file. + +// The Module object: Our interface to the outside world. We import +// and export values on it. There are various ways Module can be used: +// 1. Not defined. We create it here +// 2. A function parameter, function(Module) { ..generated code.. } +// 3. pre-run appended it, var Module = {}; ..generated code.. +// 4. External script tag defines var Module. +// We need to check if Module already exists (e.g. case 3 above). +// Substitution will be replaced with actual code on later stage of the build, +// this way Closure Compiler will not mangle it (e.g. case 4. above). +// Note that if you want to run closure, and also to use Module +// after the generated code, you will need to define var Module = {}; +// before the code. Then that object will be used in the code, and you +// can continue to use Module afterwards as well. +var Module = typeof Module !== 'undefined' ? Module : {}; + +// --pre-jses are emitted after the Module integration code, so that they can +// refer to Module (if they choose; they can also define Module) +// To implement `proc_exit`, we define a custom exception object +// that we can throw to unwind the stack and carry the exit value. +function WASIExit(return_value, message, fileName, lineNumber) { + let instance = new Error(message, fileName, lineNumber); + instance.return_value = return_value; + Object.setPrototypeOf(instance, Object.getPrototypeOf(this)); + if (Error.captureStackTrace) { + Error.captureStackTrace(instance, WASIExit); + } + return instance; +} + +WASIExit.prototype = Object.create(Error.prototype, { + constructor: { + value: Error, + enumerable: false, + writable: true, + configurable: true + } +}); + +if (Object.setPrototypeOf) { + Object.setPrototypeOf(WASIExit, Error); +} else { + WASIExit.__proto__ = Error; +} + +function handleWASIExit(e) { + if (e.return_value != 0) { + console.log('program exited with non-zero exit status ' + e.return_value); + } +} + +// The current guest wasm instance. +var currentInstance; + +// There are two heaps in play, the guest heap, which belongs to the WASI-using +// program, and the host heap, which belongs to the Emscripten-compiled polyfill +// library. The following declare support for the guest heap in a similar manner +// to Emscripten's heap. + +var GUEST_HEAP, +/** @type {ArrayBuffer} */ + GUEST_buffer, +/** @type {Int8Array} */ + GUEST_HEAP8, +/** @type {Uint8Array} */ + GUEST_HEAPU8, +/** @type {Int16Array} */ + GUEST_HEAP16, +/** @type {Uint16Array} */ + GUEST_HEAPU16, +/** @type {Int32Array} */ + GUEST_HEAP32, +/** @type {Uint32Array} */ + GUEST_HEAPU32, +/** @type {Float32Array} */ + GUEST_HEAPF32, +/** @type {Float64Array} */ + GUEST_HEAPF64; + +function setInstance(instance) { + currentInstance = instance; + updateGuestBuffer(); +} + +/// We call updateGuestBuffer any time the guest's memory may have changed, +/// such as when creating a new instance, or after calling _malloc. +function updateGuestBuffer() { + var buf = currentInstance.exports.memory.buffer; + Module['GUEST_buffer'] = GUEST_buffer = buf; + Module['GUEST_HEAP8'] = GUEST_HEAP8 = new Int8Array(GUEST_buffer); + Module['GUEST_HEAP16'] = GUEST_HEAP16 = new Int16Array(GUEST_buffer); + Module['GUEST_HEAP32'] = GUEST_HEAP32 = new Int32Array(GUEST_buffer); + Module['GUEST_HEAPU8'] = GUEST_HEAPU8 = new Uint8Array(GUEST_buffer); + Module['GUEST_HEAPU16'] = GUEST_HEAPU16 = new Uint16Array(GUEST_buffer); + Module['GUEST_HEAPU32'] = GUEST_HEAPU32 = new Uint32Array(GUEST_buffer); + Module['GUEST_HEAPF32'] = GUEST_HEAPF32 = new Float32Array(GUEST_buffer); + Module['GUEST_HEAPF64'] = GUEST_HEAPF64 = new Float64Array(GUEST_buffer); +} + +function copyin_bytes(src, len) { + let dst = _malloc(len); + updateGuestBuffer(); + + for (let i = 0; i < len; ++i) { + HEAP8[dst + i] = GUEST_HEAP8[src + i]; + } + return dst; +} + +function copyout_bytes(dst, src, len) { + updateGuestBuffer(); + + for (let i = 0; i < len; ++i) { + GUEST_HEAP8[dst + i] = HEAP8[src + i]; + } + _free(src); +} + +function copyout_i32(dst, src) { + updateGuestBuffer(); + + GUEST_HEAP32[dst>>2] = HEAP32[src>>2]; + _free(src); +} + +function copyout_i64(dst, src) { + updateGuestBuffer(); + + GUEST_HEAP32[dst>>2] = HEAP32[src>>2]; + GUEST_HEAP32[(dst + 4)>>2] = HEAP32[(src + 4)>>2]; + _free(src); +} + +function translate_ciovs(iovs, iovs_len) { + host_iovs = _malloc(8 * iovs_len); + updateGuestBuffer(); + + for (let i = 0; i < iovs_len; ++i) { + let ptr = GUEST_HEAP32[(iovs + i * 8 + 0) >> 2]; + let len = GUEST_HEAP32[(iovs + i * 8 + 4) >> 2]; + let buf = copyin_bytes(ptr, len); + HEAP32[(host_iovs + i * 8 + 0)>>2] = buf; + HEAP32[(host_iovs + i * 8 + 4)>>2] = len; + } + return host_iovs; +} + +function free_ciovs(host_iovs, iovs_len) { + for (let i = 0; i < iovs_len; ++i) { + let buf = HEAP32[(host_iovs + i * 8 + 0) >> 2]; + _free(buf); + } + _free(host_iovs); +} + +function translate_iovs(iovs, iovs_len) { + host_iovs = _malloc(8 * iovs_len); + updateGuestBuffer(); + + for (let i = 0; i < iovs_len; ++i) { + let len = GUEST_HEAP32[(iovs + i * 8 + 4) >> 2]; + let buf = _malloc(len); + updateGuestBuffer(); + HEAP32[(host_iovs + i * 8 + 0)>>2] = buf; + HEAP32[(host_iovs + i * 8 + 4)>>2] = len; + } + return host_iovs; +} + +function free_iovs(host_iovs, iovs_len, iovs) { + updateGuestBuffer(); + for (let i = 0; i < iovs_len; ++i) { + let buf = HEAP32[(host_iovs + i * 8 + 0) >> 2]; + let len = HEAP32[(host_iovs + i * 8 + 4) >> 2]; + let ptr = GUEST_HEAP32[(host_iovs + i * 8 + 0) >> 2]; + copyout_bytes(ptr, buf, len); + } + _free(host_iovs); +} + +var WASIPolyfill = { + +args_get: function(argv, argv_buf) { + return 0; +}, + +args_sizes_get: function(argc, argv_buf_size) { + updateGuestBuffer(); + + // TODO: Implement command-line arguments. + GUEST_HEAP32[(argc) >> 2] = 0; + GUEST_HEAP32[(argv_buf_size) >> 2] = 0; + return 0; +}, + +clock_res_get: function(clock_id, resolution) { + let host_resolution = _malloc(8); + let ret = ___wasi_clock_res_get(clock_id, host_resolution); + copyout_i64(resolution, host_resolution); + return ret; +}, + +clock_time_get: function(clock_id, precision, time) { + let host_time = _malloc(8); + let ret = ___wasi_clock_time_get(clock_id, precision, host_time); + copyout_i64(time, host_time); + return ret; +}, + +environ_get: function(environ, environ_buf) { + return 0; +}, + +environ_sizes_get: function(environ_size, environ_buf_size) { + updateGuestBuffer(); + + // TODO: Implement environment variables. + GUEST_HEAP32[(environ_size) >> 2] = 0; + GUEST_HEAP32[(environ_buf_size) >> 2] = 0; + return 0; +}, + +fd_prestat_get: function(fd, buf) { + let host_buf = _malloc(8); // sizeof __wasi_prestat_t + let ret = ___wasi_fd_prestat_get(fd, host_buf); + copyout_bytes(buf, host_buf, 8); + return ret; +}, + +fd_prestat_dir_name: function(fd, path, path_len) { + let host_buf = _malloc(path_len); + let ret = ___wasi_fd_prestat_get(fd, host_buf, path_len); + copyout_bytes(buf, host_buf, path_len); + return ret; +}, + +fd_close: function(fd) { + return ___wasi_fd_close(fd); +}, + +fd_datasync: function(fd) { + return ___wasi_fd_datasync(fd); +}, + +fd_pread: function(fd, iovs, iovs_len, offset, nread) { + let host_iovs = translate_iovs(iovs, iovs_len); + let host_nread = _malloc(4); + let ret = ___wasi_fd_pread(fd, host_iovs, iovs_len, offset, host_nread); + copyout_i32(nread, host_nread); + free_iovs(host_iovs, iovs_len); + return ret; +}, + +fd_pwrite: function(fd, iovs, iovs_len, offset, nwritten) { + let host_iovs = translate_ciovs(iovs, iovs_len); + let host_nwritten = _malloc(4); + let ret = ___wasi_fd_pwrite(fd, host_iovs, iovs_len, offset, host_nwritten); + copyout_i32(nwritten, host_nwritten); + free_ciovs(host_iovs, iovs_len); + return ret; +}, + +fd_read: function(fd, iovs, iovs_len, nread) { + let host_iovs = translate_iovs(iovs, iovs_len); + let host_nread = _malloc(4); + let ret = ___wasi_fd_read(fd, host_iovs, iovs_len, host_nread); + copyout_i32(nread, host_nread); + free_iovs(host_iovs, iovs_len); + return ret; +}, + +fd_renumber: function(from, to) { + return ___wasi_fd_renumber(from, to); +}, + +fd_seek: function(fd, offset, whence, newoffset) { + let host_newoffset = _malloc(8); + let ret = ___wasi_fd_seek(fd, offset, whence, host_newoffset); + copyout_i64(newoffset, host_newoffset); + return ret; +}, + +fd_tell: function(fd, newoffset) { + let host_newoffset = _malloc(8); + let ret = ___wasi_fd_seek(fd, host_newoffset); + copyout_i64(newoffset, host_newoffset); + return ret; +}, + +fd_fdstat_get: function(fd, buf) { + let host_buf = _malloc(24); // sizeof __wasi_fdstat_t + let ret = ___wasi_fd_fdstat_get(fd, host_buf); + copyout_bytes(buf, host_buf, 24); + return ret; +}, + +fd_fdstat_set_flags: function(fd, flags) { + return ___wasi_fd_fdstat_set_flags(fd, flags); +}, + +fd_fdstat_set_rights: function(fd, fs_rights_base, fs_rights_inheriting) { + return ___wasi_fd_fdstat_set_rights(fd, fs_rights_base, fs_rights_inheriting); +}, + +fd_sync: function(fd) { + return ___wasi_fd_sync(fd); +}, + +fd_write: function(fd, iovs, iovs_len, nwritten) { + let host_iovs = translate_ciovs(iovs, iovs_len); + let host_nwritten = _malloc(4); + let ret = ___wasi_fd_write(fd, host_iovs, iovs_len, host_nwritten); + copyout_i32(nwritten, host_nwritten); + free_ciovs(host_iovs, iovs_len); + return ret; +}, + +fd_advise: function(fd, offset, len, advice) { + return ___wasi_fd_advise(fd, offset, len, advice); +}, + +fd_allocate: function(fd, offset, len) { + return ___wasi_fd_allocate(fd, offset, len); +}, + +path_create_directory: function(fd, path, path_len) { + let host_path = copyin_bytes(path, path_len); + let ret = ___wasi_path_create_directory(fd, host_path, path_len); + _free(host_path); + return ret; +}, + +path_link: function(fd0, path0, path_len0, fd1, path1, path_len1) { + let host_path0 = copyin_bytes(path0, path_len0); + let host_path1 = copyin_bytes(path1, path_len1); + let ret = ___wasi_path_link(fd, host_path0, path_len0, fd1, host_path1, path1_len); + _free(host_path1); + _free(host_path0); + return ret; +}, + +path_open: function(dirfd, dirflags, path, path_len, oflags, fs_rights_base, fs_rights_inheriting, fs_flags, fd) { + let host_path = copyin_bytes(path, path_len); + let host_fd = _malloc(4); + let ret = ___wasi_path_open(dirfd, dirflags, host_path, path_len, oflags, fs_rights_base, fs_rights_inheriting, fs_flags, host_fd); + copyout_i32(fd, host_fd); + _free(host_path); + return ret; +}, + +fd_readdir: function(fd, buf, buf_len, cookie, buf_used) { + let host_buf = _malloc(buf_len); + let host_buf_used = _malloc(4); + let ret = ___wasi_fd_readdir(fd, buf, buf_len, cookie, host_buf_used); + copyout_i32(buf_used, host_buf_used); + copyout_bytes(buf, host_buf, buf_len); + return ret; +}, + +path_readlink: function(fd, path, path_len, buf, buf_len, buf_used) { + let host_path = copyin_bytes(path, path_len); + let host_buf = _malloc(buf_len); + let host_buf_used = _malloc(4); + let ret = ___wasi_path_readlink(fd, path, path_len, buf, buf_len, host_buf_used); + copyout_i32(buf_used, host_buf_used); + copyout_bytes(buf, host_buf, buf_len); + _free(host_path); + return ret; +}, + +path_rename: function(fd0, path0, path_len0, fd1, path1, path_len1) { + let host_path0 = copyin_bytes(path0, path_len0); + let host_path1 = copyin_bytes(path1, path_len1); + let ret = ___wasi_path_rename(fd, host_path0, path_len0, fd1, host_path1, path1_len); + _free(host_path1); + _free(host_path0); + return ret; +}, + +fd_filestat_get: function(fd, buf) { + let host_buf = _malloc(56); // sizeof __wasi_filestat_t + let ret = ___wasi_fd_filestat_get(host_buf); + copyout_bytes(buf, host_buf, 56); + return ret; +}, + +fd_filestat_set_size: function(fd, size) { + return ___wasi_fd_filestat_set_size(fd, size); +}, + +fd_filestat_set_times: function(fd, st_atim, st_mtim, fstflags) { + return ___wasi_fd_filestat_set_times(fd, st_atim, st_mtim, fstflags); +}, + +path_filestat_get: function(fd, path, path_len, buf) { + let host_path = copyin_bytes(path, path_len); + let host_buf = _malloc(56); // sizeof __wasi_filestat_t + let ret = ___wasi_path_filestat_get(fd, host_path, path_len, host_buf); + copyout_bytes(buf, host_buf, 56); + _free(host_path); + return ret; +}, + +path_filestat_set_times: function(fd, path, path_len, st_atim, st_mtim, flags) { + let host_path = copyin_bytes(path, path_len); + let ret = ___wasi_path_filestat_set_times(fd, host_path, st_atim, st_mtim, fstflags); + _free(host_path); + return ret; +}, + +path_symlink: function(path0, path_len0, fd, path1, path_len1) { + let host_path0 = copyin_bytes(path0, path0_len); + let host_path1 = copyin_bytes(path1, path1_len); + let ret = ___wasi_path_symlink(host_path0, path_len0, fd, host_path1, path_len1); + _free(host_path1); + _free(host_path0); + return ret; +}, + +path_unlink_file: function(fd, path, path_len, flags) { + let host_path = copyin_bytes(path, path_len); + let ret = ___wasi_path_unlink_file(fd, host_path, path_len, flags); + _free(host_path); + return ret; +}, + +path_remove_directory: function(fd, path, path_len, flags) { + let host_path = copyin_bytes(path, path_len); + let ret = ___wasi_path_remove_directory(fd, host_path, path_len, flags); + _free(host_path); + return ret; +}, + +poll_oneoff: function(in_, out, nsubscriptions, nevents) { + let host_in = copyin_bytes(in_, nsubscriptions * 56); // sizeof __wasi_subscription_t + let host_out = _malloc(nsubscriptions * 32); // sizeof __wasi_event_t + let host_nevents = _malloc(4); + let ret = ___wasi_poll_oneoff(host_in, host_out, host_nevents); + copyout_bytes(out, host_out, nsubscriptions * 32); + copyout_i32(nevents, host_nevents); + _free(host_in); + return ret; +}, + +proc_exit: function(rval) { + let message; + if (rval == 0) { + message = "success"; + } else { + message = "error code " + rval; + } + throw new WASIExit(rval, message); +}, + +proc_raise: function(sig) { + if (sig == 18 || // SIGSTOP + sig == 19 || // SIGTSTP + sig == 20 || // SIGTTIN + sig == 21 || // SIGTTOU + sig == 22 || // SIGURG + sig == 16 || // SIGCHLD + sig == 13) // SIGPIPE + { + return 0; + } + + let message = "raised signal " + sig; + throw new WASIExit(128 + sig, message); +}, + +random_get: function(buf, buf_len) { + let host_buf = _malloc(buf_len); + let ret = __wasi_random_get(host_buf, buf_len); + copyout_bytes(buf, host_buf, buf_len); + return ret; +}, + +sched_yield: function() { + return __wasi_sched_yield(); +}, + +sock_recv: function(sock, ri_data, ri_data_len, ri_flags, ro_datalen, ro_flags) { + let host_ri_data = translate_iovs(ri_data, ri_data_len); + let host_ro_datalen = _malloc(4); + let ret = ___wasi_sock_recv(sock, host_ri_data, ri_data_len, ri_flags, host_ro_data, ro_flags); + copyout_i32(ro_datalen, host_ro_datalen); + free_iovs(host_ri_data, ri_data_len); + return ret; +}, + +sock_send: function(sock, si_data, si_data_len, si_flags, so_datalen) { + let host_si_data = translate_ciovs(si_data, si_data_len); + let host_so_datalen = _malloc(4); + let ret = ___wasi_sock_send(sock, host_si_data, si_data_len, si_flags, host_so_datalen); + copyout_i32(so_datalen, host_so_datalen); + free_ciovs(host_si_data, si_data_len); + return ret; +}, + +sock_shutdown: function(sock, how) { + return __wasi_sock_shutdown(sock, how); +} + +}; + + + +// Sometimes an existing Module object exists with properties +// meant to overwrite the default module functionality. Here +// we collect those properties and reapply _after_ we configure +// the current environment's defaults to avoid having to be so +// defensive during initialization. +var moduleOverrides = {}; +var key; +for (key in Module) { + if (Module.hasOwnProperty(key)) { + moduleOverrides[key] = Module[key]; + } +} + +Module['arguments'] = []; +Module['thisProgram'] = './this.program'; +Module['quit'] = function(status, toThrow) { + throw toThrow; +}; +Module['preRun'] = []; +Module['postRun'] = []; + +// Determine the runtime environment we are in. You can customize this by +// setting the ENVIRONMENT setting at compile time (see settings.js). + +var ENVIRONMENT_IS_WEB = false; +var ENVIRONMENT_IS_WORKER = false; +var ENVIRONMENT_IS_NODE = false; +var ENVIRONMENT_IS_SHELL = false; +ENVIRONMENT_IS_WEB = typeof window === 'object'; +ENVIRONMENT_IS_WORKER = typeof importScripts === 'function'; +ENVIRONMENT_IS_NODE = typeof process === 'object' && typeof require === 'function' && !ENVIRONMENT_IS_WEB && !ENVIRONMENT_IS_WORKER; +ENVIRONMENT_IS_SHELL = !ENVIRONMENT_IS_WEB && !ENVIRONMENT_IS_NODE && !ENVIRONMENT_IS_WORKER; + +if (Module['ENVIRONMENT']) { + throw new Error('Module.ENVIRONMENT has been deprecated. To force the environment, use the ENVIRONMENT compile-time option (for example, -s ENVIRONMENT=web or -s ENVIRONMENT=node)'); +} + + +// Three configurations we can be running in: +// 1) We could be the application main() thread running in the main JS UI thread. (ENVIRONMENT_IS_WORKER == false and ENVIRONMENT_IS_PTHREAD == false) +// 2) We could be the application main() thread proxied to worker. (with Emscripten -s PROXY_TO_WORKER=1) (ENVIRONMENT_IS_WORKER == true, ENVIRONMENT_IS_PTHREAD == false) +// 3) We could be an application pthread running in a worker. (ENVIRONMENT_IS_WORKER == true and ENVIRONMENT_IS_PTHREAD == true) + + + + +// `/` should be present at the end if `scriptDirectory` is not empty +var scriptDirectory = ''; +function locateFile(path) { + if (Module['locateFile']) { + return Module['locateFile'](path, scriptDirectory); + } else { + return scriptDirectory + path; + } +} + +if (ENVIRONMENT_IS_NODE) { + scriptDirectory = __dirname + '/'; + + // Expose functionality in the same simple way that the shells work + // Note that we pollute the global namespace here, otherwise we break in node + var nodeFS; + var nodePath; + + Module['read'] = function shell_read(filename, binary) { + var ret; + if (!nodeFS) nodeFS = require('fs'); + if (!nodePath) nodePath = require('path'); + filename = nodePath['normalize'](filename); + ret = nodeFS['readFileSync'](filename); + return binary ? ret : ret.toString(); + }; + + Module['readBinary'] = function readBinary(filename) { + var ret = Module['read'](filename, true); + if (!ret.buffer) { + ret = new Uint8Array(ret); + } + assert(ret.buffer); + return ret; + }; + + if (process['argv'].length > 1) { + Module['thisProgram'] = process['argv'][1].replace(/\\/g, '/'); + } + + Module['arguments'] = process['argv'].slice(2); + + if (typeof module !== 'undefined') { + module['exports'] = Module; + } + + process['on']('uncaughtException', function(ex) { + // suppress ExitStatus exceptions from showing an error + if (!(ex instanceof ExitStatus)) { + throw ex; + } + }); + // Currently node will swallow unhandled rejections, but this behavior is + // deprecated, and in the future it will exit with error status. + process['on']('unhandledRejection', abort); + + Module['quit'] = function(status) { + process['exit'](status); + }; + + Module['inspect'] = function () { return '[Emscripten Module object]'; }; +} else +if (ENVIRONMENT_IS_SHELL) { + + + if (typeof read != 'undefined') { + Module['read'] = function shell_read(f) { + return read(f); + }; + } + + Module['readBinary'] = function readBinary(f) { + var data; + if (typeof readbuffer === 'function') { + return new Uint8Array(readbuffer(f)); + } + data = read(f, 'binary'); + assert(typeof data === 'object'); + return data; + }; + + if (typeof scriptArgs != 'undefined') { + Module['arguments'] = scriptArgs; + } else if (typeof arguments != 'undefined') { + Module['arguments'] = arguments; + } + + if (typeof quit === 'function') { + Module['quit'] = function(status) { + quit(status); + } + } +} else +if (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) { + if (ENVIRONMENT_IS_WORKER) { // Check worker, not web, since window could be polyfilled + scriptDirectory = self.location.href; + } else if (document.currentScript) { // web + scriptDirectory = document.currentScript.src; + } + // blob urls look like blob:http://site.com/etc/etc and we cannot infer anything from them. + // otherwise, slice off the final part of the url to find the script directory. + // if scriptDirectory does not contain a slash, lastIndexOf will return -1, + // and scriptDirectory will correctly be replaced with an empty string. + if (scriptDirectory.indexOf('blob:') !== 0) { + scriptDirectory = scriptDirectory.substr(0, scriptDirectory.lastIndexOf('/')+1); + } else { + scriptDirectory = ''; + } + + + Module['read'] = function shell_read(url) { + var xhr = new XMLHttpRequest(); + xhr.open('GET', url, false); + xhr.send(null); + return xhr.responseText; + }; + + if (ENVIRONMENT_IS_WORKER) { + Module['readBinary'] = function readBinary(url) { + var xhr = new XMLHttpRequest(); + xhr.open('GET', url, false); + xhr.responseType = 'arraybuffer'; + xhr.send(null); + return new Uint8Array(xhr.response); + }; + } + + Module['readAsync'] = function readAsync(url, onload, onerror) { + var xhr = new XMLHttpRequest(); + xhr.open('GET', url, true); + xhr.responseType = 'arraybuffer'; + xhr.onload = function xhr_onload() { + if (xhr.status == 200 || (xhr.status == 0 && xhr.response)) { // file URLs can return 0 + onload(xhr.response); + return; + } + onerror(); + }; + xhr.onerror = onerror; + xhr.send(null); + }; + + Module['setWindowTitle'] = function(title) { document.title = title }; +} else +{ + throw new Error('environment detection error'); +} + +// Set up the out() and err() hooks, which are how we can print to stdout or +// stderr, respectively. +// If the user provided Module.print or printErr, use that. Otherwise, +// console.log is checked first, as 'print' on the web will open a print dialogue +// printErr is preferable to console.warn (works better in shells) +// bind(console) is necessary to fix IE/Edge closed dev tools panel behavior. +var out = Module['print'] || (typeof console !== 'undefined' ? console.log.bind(console) : (typeof print !== 'undefined' ? print : null)); +var err = Module['printErr'] || (typeof printErr !== 'undefined' ? printErr : ((typeof console !== 'undefined' && console.warn.bind(console)) || out)); + +// Merge back in the overrides +for (key in moduleOverrides) { + if (moduleOverrides.hasOwnProperty(key)) { + Module[key] = moduleOverrides[key]; + } +} +// Free the object hierarchy contained in the overrides, this lets the GC +// reclaim data used e.g. in memoryInitializerRequest, which is a large typed array. +moduleOverrides = undefined; + +// perform assertions in shell.js after we set up out() and err(), as otherwise if an assertion fails it cannot print the message +assert(typeof Module['memoryInitializerPrefixURL'] === 'undefined', 'Module.memoryInitializerPrefixURL option was removed, use Module.locateFile instead'); +assert(typeof Module['pthreadMainPrefixURL'] === 'undefined', 'Module.pthreadMainPrefixURL option was removed, use Module.locateFile instead'); +assert(typeof Module['cdInitializerPrefixURL'] === 'undefined', 'Module.cdInitializerPrefixURL option was removed, use Module.locateFile instead'); +assert(typeof Module['filePackagePrefixURL'] === 'undefined', 'Module.filePackagePrefixURL option was removed, use Module.locateFile instead'); + + + +// Copyright 2017 The Emscripten Authors. All rights reserved. +// Emscripten is available under two separate licenses, the MIT license and the +// University of Illinois/NCSA Open Source License. Both these licenses can be +// found in the LICENSE file. + +// {{PREAMBLE_ADDITIONS}} + +var STACK_ALIGN = 16; + +// stack management, and other functionality that is provided by the compiled code, +// should not be used before it is ready +stackSave = stackRestore = stackAlloc = function() { + abort('cannot use the stack before compiled code is ready to run, and has provided stack access'); +}; + +function staticAlloc(size) { + abort('staticAlloc is no longer available at runtime; instead, perform static allocations at compile time (using makeStaticAlloc)'); +} + +function dynamicAlloc(size) { + assert(DYNAMICTOP_PTR); + var ret = HEAP32[DYNAMICTOP_PTR>>2]; + var end = (ret + size + 15) & -16; + if (end <= _emscripten_get_heap_size()) { + HEAP32[DYNAMICTOP_PTR>>2] = end; + } else { + return 0; + } + return ret; +} + +function alignMemory(size, factor) { + if (!factor) factor = STACK_ALIGN; // stack alignment (16-byte) by default + return Math.ceil(size / factor) * factor; +} + +function getNativeTypeSize(type) { + switch (type) { + case 'i1': case 'i8': return 1; + case 'i16': return 2; + case 'i32': return 4; + case 'i64': return 8; + case 'float': return 4; + case 'double': return 8; + default: { + if (type[type.length-1] === '*') { + return 4; // A pointer + } else if (type[0] === 'i') { + var bits = parseInt(type.substr(1)); + assert(bits % 8 === 0, 'getNativeTypeSize invalid bits ' + bits + ', type ' + type); + return bits / 8; + } else { + return 0; + } + } + } +} + +function warnOnce(text) { + if (!warnOnce.shown) warnOnce.shown = {}; + if (!warnOnce.shown[text]) { + warnOnce.shown[text] = 1; + err(text); + } +} + +var asm2wasmImports = { // special asm2wasm imports + "f64-rem": function(x, y) { + return x % y; + }, + "debugger": function() { + debugger; + } +}; + + + +var jsCallStartIndex = 1; +var functionPointers = new Array(0); + +// Wraps a JS function as a wasm function with a given signature. +// In the future, we may get a WebAssembly.Function constructor. Until then, +// we create a wasm module that takes the JS function as an import with a given +// signature, and re-exports that as a wasm function. +function convertJsFunctionToWasm(func, sig) { + // The module is static, with the exception of the type section, which is + // generated based on the signature passed in. + var typeSection = [ + 0x01, // id: section, + 0x00, // length: 0 (placeholder) + 0x01, // count: 1 + 0x60, // form: func + ]; + var sigRet = sig.slice(0, 1); + var sigParam = sig.slice(1); + var typeCodes = { + 'i': 0x7f, // i32 + 'j': 0x7e, // i64 + 'f': 0x7d, // f32 + 'd': 0x7c, // f64 + }; + + // Parameters, length + signatures + typeSection.push(sigParam.length); + for (var i = 0; i < sigParam.length; ++i) { + typeSection.push(typeCodes[sigParam[i]]); + } + + // Return values, length + signatures + // With no multi-return in MVP, either 0 (void) or 1 (anything else) + if (sigRet == 'v') { + typeSection.push(0x00); + } else { + typeSection = typeSection.concat([0x01, typeCodes[sigRet]]); + } + + // Write the overall length of the type section back into the section header + // (excepting the 2 bytes for the section id and length) + typeSection[1] = typeSection.length - 2; + + // Rest of the module is static + var bytes = new Uint8Array([ + 0x00, 0x61, 0x73, 0x6d, // magic ("\0asm") + 0x01, 0x00, 0x00, 0x00, // version: 1 + ].concat(typeSection, [ + 0x02, 0x07, // import section + // (import "e" "f" (func 0 (type 0))) + 0x01, 0x01, 0x65, 0x01, 0x66, 0x00, 0x00, + 0x07, 0x05, // export section + // (export "f" (func 0 (type 0))) + 0x01, 0x01, 0x66, 0x00, 0x00, + ])); + + // We can compile this wasm module synchronously because it is very small. + // This accepts an import (at "e.f"), that it reroutes to an export (at "f") + var module = new WebAssembly.Module(bytes); + var instance = new WebAssembly.Instance(module, { + e: { + f: func + } + }); + var wrappedFunc = instance.exports.f; + return wrappedFunc; +} + +// Add a wasm function to the table. +function addFunctionWasm(func, sig) { + var table = wasmTable; + var ret = table.length; + + // Grow the table + try { + table.grow(1); + } catch (err) { + if (!err instanceof RangeError) { + throw err; + } + throw 'Unable to grow wasm table. Use a higher value for RESERVED_FUNCTION_POINTERS or set ALLOW_TABLE_GROWTH.'; + } + + // Insert new element + try { + // Attempting to call this with JS function will cause of table.set() to fail + table.set(ret, func); + } catch (err) { + if (!err instanceof TypeError) { + throw err; + } + assert(typeof sig !== 'undefined', 'Missing signature argument to addFunction'); + var wrapped = convertJsFunctionToWasm(func, sig); + table.set(ret, wrapped); + } + + return ret; +} + +function removeFunctionWasm(index) { + // TODO(sbc): Look into implementing this to allow re-using of table slots +} + +// 'sig' parameter is required for the llvm backend but only when func is not +// already a WebAssembly function. +function addFunction(func, sig) { + + + var base = 0; + for (var i = base; i < base + 0; i++) { + if (!functionPointers[i]) { + functionPointers[i] = func; + return jsCallStartIndex + i; + } + } + throw 'Finished up all reserved function pointers. Use a higher value for RESERVED_FUNCTION_POINTERS.'; + +} + +function removeFunction(index) { + + functionPointers[index-jsCallStartIndex] = null; +} + +var funcWrappers = {}; + +function getFuncWrapper(func, sig) { + if (!func) return; // on null pointer, return undefined + assert(sig); + if (!funcWrappers[sig]) { + funcWrappers[sig] = {}; + } + var sigCache = funcWrappers[sig]; + if (!sigCache[func]) { + // optimize away arguments usage in common cases + if (sig.length === 1) { + sigCache[func] = function dynCall_wrapper() { + return dynCall(sig, func); + }; + } else if (sig.length === 2) { + sigCache[func] = function dynCall_wrapper(arg) { + return dynCall(sig, func, [arg]); + }; + } else { + // general case + sigCache[func] = function dynCall_wrapper() { + return dynCall(sig, func, Array.prototype.slice.call(arguments)); + }; + } + } + return sigCache[func]; +} + + +function makeBigInt(low, high, unsigned) { + return unsigned ? ((+((low>>>0)))+((+((high>>>0)))*4294967296.0)) : ((+((low>>>0)))+((+((high|0)))*4294967296.0)); +} + +function dynCall(sig, ptr, args) { + if (args && args.length) { + assert(args.length == sig.length-1); + assert(('dynCall_' + sig) in Module, 'bad function pointer type - no table for sig \'' + sig + '\''); + return Module['dynCall_' + sig].apply(null, [ptr].concat(args)); + } else { + assert(sig.length == 1); + assert(('dynCall_' + sig) in Module, 'bad function pointer type - no table for sig \'' + sig + '\''); + return Module['dynCall_' + sig].call(null, ptr); + } +} + +var tempRet0 = 0; + +var setTempRet0 = function(value) { + tempRet0 = value; +} + +var getTempRet0 = function() { + return tempRet0; +} + +function getCompilerSetting(name) { + throw 'You must build with -s RETAIN_COMPILER_SETTINGS=1 for getCompilerSetting or emscripten_get_compiler_setting to work'; +} + +var Runtime = { + // helpful errors + getTempRet0: function() { abort('getTempRet0() is now a top-level function, after removing the Runtime object. Remove "Runtime."') }, + staticAlloc: function() { abort('staticAlloc() is now a top-level function, after removing the Runtime object. Remove "Runtime."') }, + stackAlloc: function() { abort('stackAlloc() is now a top-level function, after removing the Runtime object. Remove "Runtime."') }, +}; + +// The address globals begin at. Very low in memory, for code size and optimization opportunities. +// Above 0 is static memory, starting with globals. +// Then the stack. +// Then 'dynamic' memory for sbrk. +var GLOBAL_BASE = 1024; + + + + +// === Preamble library stuff === + +// Documentation for the public APIs defined in this file must be updated in: +// site/source/docs/api_reference/preamble.js.rst +// A prebuilt local version of the documentation is available at: +// site/build/text/docs/api_reference/preamble.js.txt +// You can also build docs locally as HTML or other formats in site/ +// An online HTML version (which may be of a different version of Emscripten) +// is up at http://kripken.github.io/emscripten-site/docs/api_reference/preamble.js.html + + +if (typeof WebAssembly !== 'object') { + abort('No WebAssembly support found. Build with -s WASM=0 to target JavaScript instead.'); +} + + +/** @type {function(number, string, boolean=)} */ +function getValue(ptr, type, noSafe) { + type = type || 'i8'; + if (type.charAt(type.length-1) === '*') type = 'i32'; // pointers are 32-bit + switch(type) { + case 'i1': return HEAP8[((ptr)>>0)]; + case 'i8': return HEAP8[((ptr)>>0)]; + case 'i16': return HEAP16[((ptr)>>1)]; + case 'i32': return HEAP32[((ptr)>>2)]; + case 'i64': return HEAP32[((ptr)>>2)]; + case 'float': return HEAPF32[((ptr)>>2)]; + case 'double': return HEAPF64[((ptr)>>3)]; + default: abort('invalid type for getValue: ' + type); + } + return null; +} + + + + +// Wasm globals + +var wasmMemory; + +// Potentially used for direct table calls. +var wasmTable; + + +//======================================== +// Runtime essentials +//======================================== + +// whether we are quitting the application. no code should run after this. +// set in exit() and abort() +var ABORT = false; + +// set by exit() and abort(). Passed to 'onExit' handler. +// NOTE: This is also used as the process return code code in shell environments +// but only when noExitRuntime is false. +var EXITSTATUS = 0; + +/** @type {function(*, string=)} */ +function assert(condition, text) { + if (!condition) { + abort('Assertion failed: ' + text); + } +} + +// Returns the C function with a specified identifier (for C++, you need to do manual name mangling) +function getCFunc(ident) { + var func = Module['_' + ident]; // closure exported function + assert(func, 'Cannot call unknown function ' + ident + ', make sure it is exported'); + return func; +} + +// C calling interface. +function ccall(ident, returnType, argTypes, args, opts) { + // For fast lookup of conversion functions + var toC = { + 'string': function(str) { + var ret = 0; + if (str !== null && str !== undefined && str !== 0) { // null string + // at most 4 bytes per UTF-8 code point, +1 for the trailing '\0' + var len = (str.length << 2) + 1; + ret = stackAlloc(len); + stringToUTF8(str, ret, len); + } + return ret; + }, + 'array': function(arr) { + var ret = stackAlloc(arr.length); + writeArrayToMemory(arr, ret); + return ret; + } + }; + + function convertReturnValue(ret) { + if (returnType === 'string') return UTF8ToString(ret); + if (returnType === 'boolean') return Boolean(ret); + return ret; + } + + var func = getCFunc(ident); + var cArgs = []; + var stack = 0; + assert(returnType !== 'array', 'Return type should not be "array".'); + if (args) { + for (var i = 0; i < args.length; i++) { + var converter = toC[argTypes[i]]; + if (converter) { + if (stack === 0) stack = stackSave(); + cArgs[i] = converter(args[i]); + } else { + cArgs[i] = args[i]; + } + } + } + var ret = func.apply(null, cArgs); + ret = convertReturnValue(ret); + if (stack !== 0) stackRestore(stack); + return ret; +} + +function cwrap(ident, returnType, argTypes, opts) { + return function() { + return ccall(ident, returnType, argTypes, arguments, opts); + } +} + +/** @type {function(number, number, string, boolean=)} */ +function setValue(ptr, value, type, noSafe) { + type = type || 'i8'; + if (type.charAt(type.length-1) === '*') type = 'i32'; // pointers are 32-bit + switch(type) { + case 'i1': HEAP8[((ptr)>>0)]=value; break; + case 'i8': HEAP8[((ptr)>>0)]=value; break; + case 'i16': HEAP16[((ptr)>>1)]=value; break; + case 'i32': HEAP32[((ptr)>>2)]=value; break; + case 'i64': (tempI64 = [value>>>0,(tempDouble=value,(+(Math_abs(tempDouble))) >= 1.0 ? (tempDouble > 0.0 ? ((Math_min((+(Math_floor((tempDouble)/4294967296.0))), 4294967295.0))|0)>>>0 : (~~((+(Math_ceil((tempDouble - +(((~~(tempDouble)))>>>0))/4294967296.0)))))>>>0) : 0)],HEAP32[((ptr)>>2)]=tempI64[0],HEAP32[(((ptr)+(4))>>2)]=tempI64[1]); break; + case 'float': HEAPF32[((ptr)>>2)]=value; break; + case 'double': HEAPF64[((ptr)>>3)]=value; break; + default: abort('invalid type for setValue: ' + type); + } +} + +var ALLOC_NORMAL = 0; // Tries to use _malloc() +var ALLOC_STACK = 1; // Lives for the duration of the current function call +var ALLOC_DYNAMIC = 2; // Cannot be freed except through sbrk +var ALLOC_NONE = 3; // Do not allocate + +// allocate(): This is for internal use. You can use it yourself as well, but the interface +// is a little tricky (see docs right below). The reason is that it is optimized +// for multiple syntaxes to save space in generated code. So you should +// normally not use allocate(), and instead allocate memory using _malloc(), +// initialize it with setValue(), and so forth. +// @slab: An array of data, or a number. If a number, then the size of the block to allocate, +// in *bytes* (note that this is sometimes confusing: the next parameter does not +// affect this!) +// @types: Either an array of types, one for each byte (or 0 if no type at that position), +// or a single type which is used for the entire block. This only matters if there +// is initial data - if @slab is a number, then this does not matter at all and is +// ignored. +// @allocator: How to allocate memory, see ALLOC_* +/** @type {function((TypedArray|Array|number), string, number, number=)} */ +function allocate(slab, types, allocator, ptr) { + var zeroinit, size; + if (typeof slab === 'number') { + zeroinit = true; + size = slab; + } else { + zeroinit = false; + size = slab.length; + } + + var singleType = typeof types === 'string' ? types : null; + + var ret; + if (allocator == ALLOC_NONE) { + ret = ptr; + } else { + ret = [_malloc, + stackAlloc, + dynamicAlloc][allocator](Math.max(size, singleType ? 1 : types.length)); + } + + if (zeroinit) { + var stop; + ptr = ret; + assert((ret & 3) == 0); + stop = ret + (size & ~3); + for (; ptr < stop; ptr += 4) { + HEAP32[((ptr)>>2)]=0; + } + stop = ret + size; + while (ptr < stop) { + HEAP8[((ptr++)>>0)]=0; + } + return ret; + } + + if (singleType === 'i8') { + if (slab.subarray || slab.slice) { + HEAPU8.set(/** @type {!Uint8Array} */ (slab), ret); + } else { + HEAPU8.set(new Uint8Array(slab), ret); + } + return ret; + } + + var i = 0, type, typeSize, previousType; + while (i < size) { + var curr = slab[i]; + + type = singleType || types[i]; + if (type === 0) { + i++; + continue; + } + assert(type, 'Must know what type to store in allocate!'); + + if (type == 'i64') type = 'i32'; // special case: we have one i32 here, and one i32 later + + setValue(ret+i, curr, type); + + // no need to look up size unless type changes, so cache it + if (previousType !== type) { + typeSize = getNativeTypeSize(type); + previousType = type; + } + i += typeSize; + } + + return ret; +} + +// Allocate memory during any stage of startup - static memory early on, dynamic memory later, malloc when ready +function getMemory(size) { + if (!runtimeInitialized) return dynamicAlloc(size); + return _malloc(size); +} + + + + +/** @type {function(number, number=)} */ +function Pointer_stringify(ptr, length) { + abort("this function has been removed - you should use UTF8ToString(ptr, maxBytesToRead) instead!"); +} + +// Given a pointer 'ptr' to a null-terminated ASCII-encoded string in the emscripten HEAP, returns +// a copy of that string as a Javascript String object. + +function AsciiToString(ptr) { + var str = ''; + while (1) { + var ch = HEAPU8[((ptr++)>>0)]; + if (!ch) return str; + str += String.fromCharCode(ch); + } +} + +// Copies the given Javascript String object 'str' to the emscripten HEAP at address 'outPtr', +// null-terminated and encoded in ASCII form. The copy will require at most str.length+1 bytes of space in the HEAP. + +function stringToAscii(str, outPtr) { + return writeAsciiToMemory(str, outPtr, false); +} + + +// Given a pointer 'ptr' to a null-terminated UTF8-encoded string in the given array that contains uint8 values, returns +// a copy of that string as a Javascript String object. + +var UTF8Decoder = typeof TextDecoder !== 'undefined' ? new TextDecoder('utf8') : undefined; + +/** + * @param {number} idx + * @param {number=} maxBytesToRead + * @return {string} + */ +function UTF8ArrayToString(u8Array, idx, maxBytesToRead) { + var endIdx = idx + maxBytesToRead; + var endPtr = idx; + // TextDecoder needs to know the byte length in advance, it doesn't stop on null terminator by itself. + // Also, use the length info to avoid running tiny strings through TextDecoder, since .subarray() allocates garbage. + // (As a tiny code save trick, compare endPtr against endIdx using a negation, so that undefined means Infinity) + while (u8Array[endPtr] && !(endPtr >= endIdx)) ++endPtr; + + if (endPtr - idx > 16 && u8Array.subarray && UTF8Decoder) { + return UTF8Decoder.decode(u8Array.subarray(idx, endPtr)); + } else { + var str = ''; + // If building with TextDecoder, we have already computed the string length above, so test loop end condition against that + while (idx < endPtr) { + // For UTF8 byte structure, see: + // http://en.wikipedia.org/wiki/UTF-8#Description + // https://www.ietf.org/rfc/rfc2279.txt + // https://tools.ietf.org/html/rfc3629 + var u0 = u8Array[idx++]; + if (!(u0 & 0x80)) { str += String.fromCharCode(u0); continue; } + var u1 = u8Array[idx++] & 63; + if ((u0 & 0xE0) == 0xC0) { str += String.fromCharCode(((u0 & 31) << 6) | u1); continue; } + var u2 = u8Array[idx++] & 63; + if ((u0 & 0xF0) == 0xE0) { + u0 = ((u0 & 15) << 12) | (u1 << 6) | u2; + } else { + if ((u0 & 0xF8) != 0xF0) warnOnce('Invalid UTF-8 leading byte 0x' + u0.toString(16) + ' encountered when deserializing a UTF-8 string on the asm.js/wasm heap to a JS string!'); + u0 = ((u0 & 7) << 18) | (u1 << 12) | (u2 << 6) | (u8Array[idx++] & 63); + } + + if (u0 < 0x10000) { + str += String.fromCharCode(u0); + } else { + var ch = u0 - 0x10000; + str += String.fromCharCode(0xD800 | (ch >> 10), 0xDC00 | (ch & 0x3FF)); + } + } + } + return str; +} + +// Given a pointer 'ptr' to a null-terminated UTF8-encoded string in the emscripten HEAP, returns a +// copy of that string as a Javascript String object. +// maxBytesToRead: an optional length that specifies the maximum number of bytes to read. You can omit +// this parameter to scan the string until the first \0 byte. If maxBytesToRead is +// passed, and the string at [ptr, ptr+maxBytesToReadr[ contains a null byte in the +// middle, then the string will cut short at that byte index (i.e. maxBytesToRead will +// not produce a string of exact length [ptr, ptr+maxBytesToRead[) +// N.B. mixing frequent uses of UTF8ToString() with and without maxBytesToRead may +// throw JS JIT optimizations off, so it is worth to consider consistently using one +// style or the other. +/** + * @param {number} ptr + * @param {number=} maxBytesToRead + * @return {string} + */ +function UTF8ToString(ptr, maxBytesToRead) { + return ptr ? UTF8ArrayToString(HEAPU8, ptr, maxBytesToRead) : ''; +} + +// Copies the given Javascript String object 'str' to the given byte array at address 'outIdx', +// encoded in UTF8 form and null-terminated. The copy will require at most str.length*4+1 bytes of space in the HEAP. +// Use the function lengthBytesUTF8 to compute the exact number of bytes (excluding null terminator) that this function will write. +// Parameters: +// str: the Javascript string to copy. +// outU8Array: the array to copy to. Each index in this array is assumed to be one 8-byte element. +// outIdx: The starting offset in the array to begin the copying. +// maxBytesToWrite: The maximum number of bytes this function can write to the array. +// This count should include the null terminator, +// i.e. if maxBytesToWrite=1, only the null terminator will be written and nothing else. +// maxBytesToWrite=0 does not write any bytes to the output, not even the null terminator. +// Returns the number of bytes written, EXCLUDING the null terminator. + +function stringToUTF8Array(str, outU8Array, outIdx, maxBytesToWrite) { + if (!(maxBytesToWrite > 0)) // Parameter maxBytesToWrite is not optional. Negative values, 0, null, undefined and false each don't write out any bytes. + return 0; + + var startIdx = outIdx; + var endIdx = outIdx + maxBytesToWrite - 1; // -1 for string null terminator. + for (var i = 0; i < str.length; ++i) { + // Gotcha: charCodeAt returns a 16-bit word that is a UTF-16 encoded code unit, not a Unicode code point of the character! So decode UTF16->UTF32->UTF8. + // See http://unicode.org/faq/utf_bom.html#utf16-3 + // For UTF8 byte structure, see http://en.wikipedia.org/wiki/UTF-8#Description and https://www.ietf.org/rfc/rfc2279.txt and https://tools.ietf.org/html/rfc3629 + var u = str.charCodeAt(i); // possibly a lead surrogate + if (u >= 0xD800 && u <= 0xDFFF) { + var u1 = str.charCodeAt(++i); + u = 0x10000 + ((u & 0x3FF) << 10) | (u1 & 0x3FF); + } + if (u <= 0x7F) { + if (outIdx >= endIdx) break; + outU8Array[outIdx++] = u; + } else if (u <= 0x7FF) { + if (outIdx + 1 >= endIdx) break; + outU8Array[outIdx++] = 0xC0 | (u >> 6); + outU8Array[outIdx++] = 0x80 | (u & 63); + } else if (u <= 0xFFFF) { + if (outIdx + 2 >= endIdx) break; + outU8Array[outIdx++] = 0xE0 | (u >> 12); + outU8Array[outIdx++] = 0x80 | ((u >> 6) & 63); + outU8Array[outIdx++] = 0x80 | (u & 63); + } else { + if (outIdx + 3 >= endIdx) break; + if (u >= 0x200000) warnOnce('Invalid Unicode code point 0x' + u.toString(16) + ' encountered when serializing a JS string to an UTF-8 string on the asm.js/wasm heap! (Valid unicode code points should be in range 0-0x1FFFFF).'); + outU8Array[outIdx++] = 0xF0 | (u >> 18); + outU8Array[outIdx++] = 0x80 | ((u >> 12) & 63); + outU8Array[outIdx++] = 0x80 | ((u >> 6) & 63); + outU8Array[outIdx++] = 0x80 | (u & 63); + } + } + // Null-terminate the pointer to the buffer. + outU8Array[outIdx] = 0; + return outIdx - startIdx; +} + +// Copies the given Javascript String object 'str' to the emscripten HEAP at address 'outPtr', +// null-terminated and encoded in UTF8 form. The copy will require at most str.length*4+1 bytes of space in the HEAP. +// Use the function lengthBytesUTF8 to compute the exact number of bytes (excluding null terminator) that this function will write. +// Returns the number of bytes written, EXCLUDING the null terminator. + +function stringToUTF8(str, outPtr, maxBytesToWrite) { + assert(typeof maxBytesToWrite == 'number', 'stringToUTF8(str, outPtr, maxBytesToWrite) is missing the third parameter that specifies the length of the output buffer!'); + return stringToUTF8Array(str, HEAPU8,outPtr, maxBytesToWrite); +} + +// Returns the number of bytes the given Javascript string takes if encoded as a UTF8 byte array, EXCLUDING the null terminator byte. +function lengthBytesUTF8(str) { + var len = 0; + for (var i = 0; i < str.length; ++i) { + // Gotcha: charCodeAt returns a 16-bit word that is a UTF-16 encoded code unit, not a Unicode code point of the character! So decode UTF16->UTF32->UTF8. + // See http://unicode.org/faq/utf_bom.html#utf16-3 + var u = str.charCodeAt(i); // possibly a lead surrogate + if (u >= 0xD800 && u <= 0xDFFF) u = 0x10000 + ((u & 0x3FF) << 10) | (str.charCodeAt(++i) & 0x3FF); + if (u <= 0x7F) ++len; + else if (u <= 0x7FF) len += 2; + else if (u <= 0xFFFF) len += 3; + else len += 4; + } + return len; +} + + +// Given a pointer 'ptr' to a null-terminated UTF16LE-encoded string in the emscripten HEAP, returns +// a copy of that string as a Javascript String object. + +var UTF16Decoder = typeof TextDecoder !== 'undefined' ? new TextDecoder('utf-16le') : undefined; +function UTF16ToString(ptr) { + assert(ptr % 2 == 0, 'Pointer passed to UTF16ToString must be aligned to two bytes!'); + var endPtr = ptr; + // TextDecoder needs to know the byte length in advance, it doesn't stop on null terminator by itself. + // Also, use the length info to avoid running tiny strings through TextDecoder, since .subarray() allocates garbage. + var idx = endPtr >> 1; + while (HEAP16[idx]) ++idx; + endPtr = idx << 1; + + if (endPtr - ptr > 32 && UTF16Decoder) { + return UTF16Decoder.decode(HEAPU8.subarray(ptr, endPtr)); + } else { + var i = 0; + + var str = ''; + while (1) { + var codeUnit = HEAP16[(((ptr)+(i*2))>>1)]; + if (codeUnit == 0) return str; + ++i; + // fromCharCode constructs a character from a UTF-16 code unit, so we can pass the UTF16 string right through. + str += String.fromCharCode(codeUnit); + } + } +} + +// Copies the given Javascript String object 'str' to the emscripten HEAP at address 'outPtr', +// null-terminated and encoded in UTF16 form. The copy will require at most str.length*4+2 bytes of space in the HEAP. +// Use the function lengthBytesUTF16() to compute the exact number of bytes (excluding null terminator) that this function will write. +// Parameters: +// str: the Javascript string to copy. +// outPtr: Byte address in Emscripten HEAP where to write the string to. +// maxBytesToWrite: The maximum number of bytes this function can write to the array. This count should include the null +// terminator, i.e. if maxBytesToWrite=2, only the null terminator will be written and nothing else. +// maxBytesToWrite<2 does not write any bytes to the output, not even the null terminator. +// Returns the number of bytes written, EXCLUDING the null terminator. + +function stringToUTF16(str, outPtr, maxBytesToWrite) { + assert(outPtr % 2 == 0, 'Pointer passed to stringToUTF16 must be aligned to two bytes!'); + assert(typeof maxBytesToWrite == 'number', 'stringToUTF16(str, outPtr, maxBytesToWrite) is missing the third parameter that specifies the length of the output buffer!'); + // Backwards compatibility: if max bytes is not specified, assume unsafe unbounded write is allowed. + if (maxBytesToWrite === undefined) { + maxBytesToWrite = 0x7FFFFFFF; + } + if (maxBytesToWrite < 2) return 0; + maxBytesToWrite -= 2; // Null terminator. + var startPtr = outPtr; + var numCharsToWrite = (maxBytesToWrite < str.length*2) ? (maxBytesToWrite / 2) : str.length; + for (var i = 0; i < numCharsToWrite; ++i) { + // charCodeAt returns a UTF-16 encoded code unit, so it can be directly written to the HEAP. + var codeUnit = str.charCodeAt(i); // possibly a lead surrogate + HEAP16[((outPtr)>>1)]=codeUnit; + outPtr += 2; + } + // Null-terminate the pointer to the HEAP. + HEAP16[((outPtr)>>1)]=0; + return outPtr - startPtr; +} + +// Returns the number of bytes the given Javascript string takes if encoded as a UTF16 byte array, EXCLUDING the null terminator byte. + +function lengthBytesUTF16(str) { + return str.length*2; +} + +function UTF32ToString(ptr) { + assert(ptr % 4 == 0, 'Pointer passed to UTF32ToString must be aligned to four bytes!'); + var i = 0; + + var str = ''; + while (1) { + var utf32 = HEAP32[(((ptr)+(i*4))>>2)]; + if (utf32 == 0) + return str; + ++i; + // Gotcha: fromCharCode constructs a character from a UTF-16 encoded code (pair), not from a Unicode code point! So encode the code point to UTF-16 for constructing. + // See http://unicode.org/faq/utf_bom.html#utf16-3 + if (utf32 >= 0x10000) { + var ch = utf32 - 0x10000; + str += String.fromCharCode(0xD800 | (ch >> 10), 0xDC00 | (ch & 0x3FF)); + } else { + str += String.fromCharCode(utf32); + } + } +} + +// Copies the given Javascript String object 'str' to the emscripten HEAP at address 'outPtr', +// null-terminated and encoded in UTF32 form. The copy will require at most str.length*4+4 bytes of space in the HEAP. +// Use the function lengthBytesUTF32() to compute the exact number of bytes (excluding null terminator) that this function will write. +// Parameters: +// str: the Javascript string to copy. +// outPtr: Byte address in Emscripten HEAP where to write the string to. +// maxBytesToWrite: The maximum number of bytes this function can write to the array. This count should include the null +// terminator, i.e. if maxBytesToWrite=4, only the null terminator will be written and nothing else. +// maxBytesToWrite<4 does not write any bytes to the output, not even the null terminator. +// Returns the number of bytes written, EXCLUDING the null terminator. + +function stringToUTF32(str, outPtr, maxBytesToWrite) { + assert(outPtr % 4 == 0, 'Pointer passed to stringToUTF32 must be aligned to four bytes!'); + assert(typeof maxBytesToWrite == 'number', 'stringToUTF32(str, outPtr, maxBytesToWrite) is missing the third parameter that specifies the length of the output buffer!'); + // Backwards compatibility: if max bytes is not specified, assume unsafe unbounded write is allowed. + if (maxBytesToWrite === undefined) { + maxBytesToWrite = 0x7FFFFFFF; + } + if (maxBytesToWrite < 4) return 0; + var startPtr = outPtr; + var endPtr = startPtr + maxBytesToWrite - 4; + for (var i = 0; i < str.length; ++i) { + // Gotcha: charCodeAt returns a 16-bit word that is a UTF-16 encoded code unit, not a Unicode code point of the character! We must decode the string to UTF-32 to the heap. + // See http://unicode.org/faq/utf_bom.html#utf16-3 + var codeUnit = str.charCodeAt(i); // possibly a lead surrogate + if (codeUnit >= 0xD800 && codeUnit <= 0xDFFF) { + var trailSurrogate = str.charCodeAt(++i); + codeUnit = 0x10000 + ((codeUnit & 0x3FF) << 10) | (trailSurrogate & 0x3FF); + } + HEAP32[((outPtr)>>2)]=codeUnit; + outPtr += 4; + if (outPtr + 4 > endPtr) break; + } + // Null-terminate the pointer to the HEAP. + HEAP32[((outPtr)>>2)]=0; + return outPtr - startPtr; +} + +// Returns the number of bytes the given Javascript string takes if encoded as a UTF16 byte array, EXCLUDING the null terminator byte. + +function lengthBytesUTF32(str) { + var len = 0; + for (var i = 0; i < str.length; ++i) { + // Gotcha: charCodeAt returns a 16-bit word that is a UTF-16 encoded code unit, not a Unicode code point of the character! We must decode the string to UTF-32 to the heap. + // See http://unicode.org/faq/utf_bom.html#utf16-3 + var codeUnit = str.charCodeAt(i); + if (codeUnit >= 0xD800 && codeUnit <= 0xDFFF) ++i; // possibly a lead surrogate, so skip over the tail surrogate. + len += 4; + } + + return len; +} + +// Allocate heap space for a JS string, and write it there. +// It is the responsibility of the caller to free() that memory. +function allocateUTF8(str) { + var size = lengthBytesUTF8(str) + 1; + var ret = _malloc(size); + if (ret) stringToUTF8Array(str, HEAP8, ret, size); + return ret; +} + +// Allocate stack space for a JS string, and write it there. +function allocateUTF8OnStack(str) { + var size = lengthBytesUTF8(str) + 1; + var ret = stackAlloc(size); + stringToUTF8Array(str, HEAP8, ret, size); + return ret; +} + +// Deprecated: This function should not be called because it is unsafe and does not provide +// a maximum length limit of how many bytes it is allowed to write. Prefer calling the +// function stringToUTF8Array() instead, which takes in a maximum length that can be used +// to be secure from out of bounds writes. +/** @deprecated */ +function writeStringToMemory(string, buffer, dontAddNull) { + warnOnce('writeStringToMemory is deprecated and should not be called! Use stringToUTF8() instead!'); + + var /** @type {number} */ lastChar, /** @type {number} */ end; + if (dontAddNull) { + // stringToUTF8Array always appends null. If we don't want to do that, remember the + // character that existed at the location where the null will be placed, and restore + // that after the write (below). + end = buffer + lengthBytesUTF8(string); + lastChar = HEAP8[end]; + } + stringToUTF8(string, buffer, Infinity); + if (dontAddNull) HEAP8[end] = lastChar; // Restore the value under the null character. +} + +function writeArrayToMemory(array, buffer) { + assert(array.length >= 0, 'writeArrayToMemory array must have a length (should be an array or typed array)') + HEAP8.set(array, buffer); +} + +function writeAsciiToMemory(str, buffer, dontAddNull) { + for (var i = 0; i < str.length; ++i) { + assert(str.charCodeAt(i) === str.charCodeAt(i)&0xff); + HEAP8[((buffer++)>>0)]=str.charCodeAt(i); + } + // Null-terminate the pointer to the HEAP. + if (!dontAddNull) HEAP8[((buffer)>>0)]=0; +} + + + + + +function demangle(func) { + warnOnce('warning: build with -s DEMANGLE_SUPPORT=1 to link in libcxxabi demangling'); + return func; +} + +function demangleAll(text) { + var regex = + /__Z[\w\d_]+/g; + return text.replace(regex, + function(x) { + var y = demangle(x); + return x === y ? x : (y + ' [' + x + ']'); + }); +} + +function jsStackTrace() { + var err = new Error(); + if (!err.stack) { + // IE10+ special cases: It does have callstack info, but it is only populated if an Error object is thrown, + // so try that as a special-case. + try { + throw new Error(0); + } catch(e) { + err = e; + } + if (!err.stack) { + return '(no stack trace available)'; + } + } + return err.stack.toString(); +} + +function stackTrace() { + var js = jsStackTrace(); + if (Module['extraStackTrace']) js += '\n' + Module['extraStackTrace'](); + return demangleAll(js); +} + + + +// Memory management + +var PAGE_SIZE = 16384; +var WASM_PAGE_SIZE = 65536; +var ASMJS_PAGE_SIZE = 16777216; + +function alignUp(x, multiple) { + if (x % multiple > 0) { + x += multiple - (x % multiple); + } + return x; +} + +var HEAP, +/** @type {ArrayBuffer} */ + buffer, +/** @type {Int8Array} */ + HEAP8, +/** @type {Uint8Array} */ + HEAPU8, +/** @type {Int16Array} */ + HEAP16, +/** @type {Uint16Array} */ + HEAPU16, +/** @type {Int32Array} */ + HEAP32, +/** @type {Uint32Array} */ + HEAPU32, +/** @type {Float32Array} */ + HEAPF32, +/** @type {Float64Array} */ + HEAPF64; + +function updateGlobalBufferViews() { + Module['HEAP8'] = HEAP8 = new Int8Array(buffer); + Module['HEAP16'] = HEAP16 = new Int16Array(buffer); + Module['HEAP32'] = HEAP32 = new Int32Array(buffer); + Module['HEAPU8'] = HEAPU8 = new Uint8Array(buffer); + Module['HEAPU16'] = HEAPU16 = new Uint16Array(buffer); + Module['HEAPU32'] = HEAPU32 = new Uint32Array(buffer); + Module['HEAPF32'] = HEAPF32 = new Float32Array(buffer); + Module['HEAPF64'] = HEAPF64 = new Float64Array(buffer); +} + + +var STATIC_BASE = 1024, + STACK_BASE = 6176, + STACKTOP = STACK_BASE, + STACK_MAX = 5249056, + DYNAMIC_BASE = 5249056, + DYNAMICTOP_PTR = 5920; + +assert(STACK_BASE % 16 === 0, 'stack must start aligned'); +assert(DYNAMIC_BASE % 16 === 0, 'heap must start aligned'); + + + +var TOTAL_STACK = 5242880; +if (Module['TOTAL_STACK']) assert(TOTAL_STACK === Module['TOTAL_STACK'], 'the stack size can no longer be determined at runtime') + +var INITIAL_TOTAL_MEMORY = Module['TOTAL_MEMORY'] || 16777216; +if (INITIAL_TOTAL_MEMORY < TOTAL_STACK) err('TOTAL_MEMORY should be larger than TOTAL_STACK, was ' + INITIAL_TOTAL_MEMORY + '! (TOTAL_STACK=' + TOTAL_STACK + ')'); + +// Initialize the runtime's memory +// check for full engine support (use string 'subarray' to avoid closure compiler confusion) +assert(typeof Int32Array !== 'undefined' && typeof Float64Array !== 'undefined' && Int32Array.prototype.subarray !== undefined && Int32Array.prototype.set !== undefined, + 'JS engine does not provide full typed array support'); + + + + + + + +// Use a provided buffer, if there is one, or else allocate a new one +if (Module['buffer']) { + buffer = Module['buffer']; + assert(buffer.byteLength === INITIAL_TOTAL_MEMORY, 'provided buffer should be ' + INITIAL_TOTAL_MEMORY + ' bytes, but it is ' + buffer.byteLength); +} else { + // Use a WebAssembly memory where available + if (typeof WebAssembly === 'object' && typeof WebAssembly.Memory === 'function') { + assert(INITIAL_TOTAL_MEMORY % WASM_PAGE_SIZE === 0); + wasmMemory = new WebAssembly.Memory({ 'initial': INITIAL_TOTAL_MEMORY / WASM_PAGE_SIZE, 'maximum': INITIAL_TOTAL_MEMORY / WASM_PAGE_SIZE }); + buffer = wasmMemory.buffer; + } else + { + buffer = new ArrayBuffer(INITIAL_TOTAL_MEMORY); + } + assert(buffer.byteLength === INITIAL_TOTAL_MEMORY); +} +updateGlobalBufferViews(); + + +HEAP32[DYNAMICTOP_PTR>>2] = DYNAMIC_BASE; + + +// Initializes the stack cookie. Called at the startup of main and at the startup of each thread in pthreads mode. +function writeStackCookie() { + assert((STACK_MAX & 3) == 0); + HEAPU32[(STACK_MAX >> 2)-1] = 0x02135467; + HEAPU32[(STACK_MAX >> 2)-2] = 0x89BACDFE; +} + +function checkStackCookie() { + if (HEAPU32[(STACK_MAX >> 2)-1] != 0x02135467 || HEAPU32[(STACK_MAX >> 2)-2] != 0x89BACDFE) { + abort('Stack overflow! Stack cookie has been overwritten, expected hex dwords 0x89BACDFE and 0x02135467, but received 0x' + HEAPU32[(STACK_MAX >> 2)-2].toString(16) + ' ' + HEAPU32[(STACK_MAX >> 2)-1].toString(16)); + } + // Also test the global address 0 for integrity. + if (HEAP32[0] !== 0x63736d65 /* 'emsc' */) throw 'Runtime error: The application has corrupted its heap memory area (address zero)!'; +} + +function abortStackOverflow(allocSize) { + abort('Stack overflow! Attempted to allocate ' + allocSize + ' bytes on the stack, but stack has only ' + (STACK_MAX - stackSave() + allocSize) + ' bytes available!'); +} + + + HEAP32[0] = 0x63736d65; /* 'emsc' */ + + + +// Endianness check (note: assumes compiler arch was little-endian) +HEAP16[1] = 0x6373; +if (HEAPU8[2] !== 0x73 || HEAPU8[3] !== 0x63) throw 'Runtime error: expected the system to be little-endian!'; + +function callRuntimeCallbacks(callbacks) { + while(callbacks.length > 0) { + var callback = callbacks.shift(); + if (typeof callback == 'function') { + callback(); + continue; + } + var func = callback.func; + if (typeof func === 'number') { + if (callback.arg === undefined) { + Module['dynCall_v'](func); + } else { + Module['dynCall_vi'](func, callback.arg); + } + } else { + func(callback.arg === undefined ? null : callback.arg); + } + } +} + +var __ATPRERUN__ = []; // functions called before the runtime is initialized +var __ATINIT__ = []; // functions called during startup +var __ATMAIN__ = []; // functions called when main() is to be run +var __ATEXIT__ = []; // functions called during shutdown +var __ATPOSTRUN__ = []; // functions called after the main() is called + +var runtimeInitialized = false; +var runtimeExited = false; + + +function preRun() { + // compatibility - merge in anything from Module['preRun'] at this time + if (Module['preRun']) { + if (typeof Module['preRun'] == 'function') Module['preRun'] = [Module['preRun']]; + while (Module['preRun'].length) { + addOnPreRun(Module['preRun'].shift()); + } + } + callRuntimeCallbacks(__ATPRERUN__); +} + +function ensureInitRuntime() { + checkStackCookie(); + if (runtimeInitialized) return; + runtimeInitialized = true; + SOCKFS.root = FS.mount(SOCKFS, {}, null); +if (!Module["noFSInit"] && !FS.init.initialized) FS.init(); +TTY.init(); + callRuntimeCallbacks(__ATINIT__); +} + +function preMain() { + checkStackCookie(); + FS.ignorePermissions = false; + callRuntimeCallbacks(__ATMAIN__); +} + +function exitRuntime() { + checkStackCookie(); + runtimeExited = true; +} + +function postRun() { + checkStackCookie(); + // compatibility - merge in anything from Module['postRun'] at this time + if (Module['postRun']) { + if (typeof Module['postRun'] == 'function') Module['postRun'] = [Module['postRun']]; + while (Module['postRun'].length) { + addOnPostRun(Module['postRun'].shift()); + } + } + callRuntimeCallbacks(__ATPOSTRUN__); +} + +function addOnPreRun(cb) { + __ATPRERUN__.unshift(cb); +} + +function addOnInit(cb) { + __ATINIT__.unshift(cb); +} + +function addOnPreMain(cb) { + __ATMAIN__.unshift(cb); +} + +function addOnExit(cb) { +} + +function addOnPostRun(cb) { + __ATPOSTRUN__.unshift(cb); +} + +function unSign(value, bits, ignore) { + if (value >= 0) { + return value; + } + return bits <= 32 ? 2*Math.abs(1 << (bits-1)) + value // Need some trickery, since if bits == 32, we are right at the limit of the bits JS uses in bitshifts + : Math.pow(2, bits) + value; +} +function reSign(value, bits, ignore) { + if (value <= 0) { + return value; + } + var half = bits <= 32 ? Math.abs(1 << (bits-1)) // abs is needed if bits == 32 + : Math.pow(2, bits-1); + if (value >= half && (bits <= 32 || value > half)) { // for huge values, we can hit the precision limit and always get true here. so don't do that + // but, in general there is no perfect solution here. With 64-bit ints, we get rounding and errors + // TODO: In i64 mode 1, resign the two parts separately and safely + value = -2*half + value; // Cannot bitshift half, as it may be at the limit of the bits JS uses in bitshifts + } + return value; +} + + +assert(Math.imul, 'This browser does not support Math.imul(), build with LEGACY_VM_SUPPORT or POLYFILL_OLD_MATH_FUNCTIONS to add in a polyfill'); +assert(Math.fround, 'This browser does not support Math.fround(), build with LEGACY_VM_SUPPORT or POLYFILL_OLD_MATH_FUNCTIONS to add in a polyfill'); +assert(Math.clz32, 'This browser does not support Math.clz32(), build with LEGACY_VM_SUPPORT or POLYFILL_OLD_MATH_FUNCTIONS to add in a polyfill'); +assert(Math.trunc, 'This browser does not support Math.trunc(), build with LEGACY_VM_SUPPORT or POLYFILL_OLD_MATH_FUNCTIONS to add in a polyfill'); + +var Math_abs = Math.abs; +var Math_cos = Math.cos; +var Math_sin = Math.sin; +var Math_tan = Math.tan; +var Math_acos = Math.acos; +var Math_asin = Math.asin; +var Math_atan = Math.atan; +var Math_atan2 = Math.atan2; +var Math_exp = Math.exp; +var Math_log = Math.log; +var Math_sqrt = Math.sqrt; +var Math_ceil = Math.ceil; +var Math_floor = Math.floor; +var Math_pow = Math.pow; +var Math_imul = Math.imul; +var Math_fround = Math.fround; +var Math_round = Math.round; +var Math_min = Math.min; +var Math_max = Math.max; +var Math_clz32 = Math.clz32; +var Math_trunc = Math.trunc; + + + +// A counter of dependencies for calling run(). If we need to +// do asynchronous work before running, increment this and +// decrement it. Incrementing must happen in a place like +// Module.preRun (used by emcc to add file preloading). +// Note that you can add dependencies in preRun, even though +// it happens right before run - run will be postponed until +// the dependencies are met. +var runDependencies = 0; +var runDependencyWatcher = null; +var dependenciesFulfilled = null; // overridden to take different actions when all run dependencies are fulfilled +var runDependencyTracking = {}; + +function getUniqueRunDependency(id) { + var orig = id; + while (1) { + if (!runDependencyTracking[id]) return id; + id = orig + Math.random(); + } + return id; +} + +function addRunDependency(id) { + runDependencies++; + if (Module['monitorRunDependencies']) { + Module['monitorRunDependencies'](runDependencies); + } + if (id) { + assert(!runDependencyTracking[id]); + runDependencyTracking[id] = 1; + if (runDependencyWatcher === null && typeof setInterval !== 'undefined') { + // Check for missing dependencies every few seconds + runDependencyWatcher = setInterval(function() { + if (ABORT) { + clearInterval(runDependencyWatcher); + runDependencyWatcher = null; + return; + } + var shown = false; + for (var dep in runDependencyTracking) { + if (!shown) { + shown = true; + err('still waiting on run dependencies:'); + } + err('dependency: ' + dep); + } + if (shown) { + err('(end of list)'); + } + }, 10000); + } + } else { + err('warning: run dependency added without ID'); + } +} + +function removeRunDependency(id) { + runDependencies--; + if (Module['monitorRunDependencies']) { + Module['monitorRunDependencies'](runDependencies); + } + if (id) { + assert(runDependencyTracking[id]); + delete runDependencyTracking[id]; + } else { + err('warning: run dependency removed without ID'); + } + if (runDependencies == 0) { + if (runDependencyWatcher !== null) { + clearInterval(runDependencyWatcher); + runDependencyWatcher = null; + } + if (dependenciesFulfilled) { + var callback = dependenciesFulfilled; + dependenciesFulfilled = null; + callback(); // can add another dependenciesFulfilled + } + } +} + +Module["preloadedImages"] = {}; // maps url to image data +Module["preloadedAudios"] = {}; // maps url to audio data + + +var memoryInitializer = null; + + + + + + +// Copyright 2017 The Emscripten Authors. All rights reserved. +// Emscripten is available under two separate licenses, the MIT license and the +// University of Illinois/NCSA Open Source License. Both these licenses can be +// found in the LICENSE file. + +// Prefix of data URIs emitted by SINGLE_FILE and related options. +var dataURIPrefix = 'data:application/octet-stream;base64,'; + +// Indicates whether filename is a base64 data URI. +function isDataURI(filename) { + return String.prototype.startsWith ? + filename.startsWith(dataURIPrefix) : + filename.indexOf(dataURIPrefix) === 0; +} + + + + +var wasmBinaryFile = 'polyfill.wasm'; +if (!isDataURI(wasmBinaryFile)) { + wasmBinaryFile = locateFile(wasmBinaryFile); +} + +function getBinary() { + try { + if (Module['wasmBinary']) { + return new Uint8Array(Module['wasmBinary']); + } + if (Module['readBinary']) { + return Module['readBinary'](wasmBinaryFile); + } else { + throw "both async and sync fetching of the wasm failed"; + } + } + catch (err) { + abort(err); + } +} + +function getBinaryPromise() { + // if we don't have the binary yet, and have the Fetch api, use that + // in some environments, like Electron's render process, Fetch api may be present, but have a different context than expected, let's only use it on the Web + if (!Module['wasmBinary'] && (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) && typeof fetch === 'function') { + return fetch(wasmBinaryFile, { credentials: 'same-origin' }).then(function(response) { + if (!response['ok']) { + throw "failed to load wasm binary file at '" + wasmBinaryFile + "'"; + } + return response['arrayBuffer'](); + }).catch(function () { + return getBinary(); + }); + } + // Otherwise, getBinary should be able to get it synchronously + return new Promise(function(resolve, reject) { + resolve(getBinary()); + }); +} + +// Create the wasm instance. +// Receives the wasm imports, returns the exports. +function createWasm(env) { + // prepare imports + var info = { + 'env': env + , + 'global': { + 'NaN': NaN, + 'Infinity': Infinity + }, + 'global.Math': Math, + 'asm2wasm': asm2wasmImports + }; + // Load the wasm module and create an instance of using native support in the JS engine. + // handle a generated wasm instance, receiving its exports and + // performing other necessary setup + function receiveInstance(instance, module) { + var exports = instance.exports; + Module['asm'] = exports; + removeRunDependency('wasm-instantiate'); + } + addRunDependency('wasm-instantiate'); + + // User shell pages can write their own Module.instantiateWasm = function(imports, successCallback) callback + // to manually instantiate the Wasm module themselves. This allows pages to run the instantiation parallel + // to any other async startup actions they are performing. + if (Module['instantiateWasm']) { + try { + return Module['instantiateWasm'](info, receiveInstance); + } catch(e) { + err('Module.instantiateWasm callback failed with error: ' + e); + return false; + } + } + + // Async compilation can be confusing when an error on the page overwrites Module + // (for example, if the order of elements is wrong, and the one defining Module is + // later), so we save Module and check it later. + var trueModule = Module; + function receiveInstantiatedSource(output) { + // 'output' is a WebAssemblyInstantiatedSource object which has both the module and instance. + // receiveInstance() will swap in the exports (to Module.asm) so they can be called + assert(Module === trueModule, 'the Module object should not be replaced during async compilation - perhaps the order of HTML elements is wrong?'); + trueModule = null; + // TODO: Due to Closure regression https://github.com/google/closure-compiler/issues/3193, the above line no longer optimizes out down to the following line. + // When the regression is fixed, can restore the above USE_PTHREADS-enabled path. + receiveInstance(output['instance']); + } + function instantiateArrayBuffer(receiver) { + getBinaryPromise().then(function(binary) { + return WebAssembly.instantiate(binary, info); + }).then(receiver, function(reason) { + err('failed to asynchronously prepare wasm: ' + reason); + abort(reason); + }); + } + // Prefer streaming instantiation if available. + if (!Module['wasmBinary'] && + typeof WebAssembly.instantiateStreaming === 'function' && + !isDataURI(wasmBinaryFile) && + typeof fetch === 'function') { + WebAssembly.instantiateStreaming(fetch(wasmBinaryFile, { credentials: 'same-origin' }), info) + .then(receiveInstantiatedSource, function(reason) { + // We expect the most common failure cause to be a bad MIME type for the binary, + // in which case falling back to ArrayBuffer instantiation should work. + err('wasm streaming compile failed: ' + reason); + err('falling back to ArrayBuffer instantiation'); + instantiateArrayBuffer(receiveInstantiatedSource); + }); + } else { + instantiateArrayBuffer(receiveInstantiatedSource); + } + return {}; // no exports yet; we'll fill them in later +} + +// Provide an "asm.js function" for the application, called to "link" the asm.js module. We instantiate +// the wasm module at that time, and it receives imports and provides exports and so forth, the app +// doesn't need to care that it is wasm or asm.js. + +Module['asm'] = function(global, env, providedBuffer) { + // memory was already allocated (so js could use the buffer) + env['memory'] = wasmMemory + ; + // import table + env['table'] = wasmTable = new WebAssembly.Table({ + 'initial': 18, + 'maximum': 18, + 'element': 'anyfunc' + }); + env['__memory_base'] = 1024; // tell the memory segments where to place themselves + env['__table_base'] = 0; // table starts at 0 by default (even in dynamic linking, for the main module) + + var exports = createWasm(env); + assert(exports, 'binaryen setup failed (no wasm support?)'); + return exports; +}; + +// === Body === + +var ASM_CONSTS = [function() { const imports = { wasi_unstable: WASIPolyfill }; let file = document.getElementById('input').files[0]; let file_with_mime_type = file.slice(0, file.size, 'application/wasm'); let response = new Response(file_with_mime_type); WebAssembly.instantiateStreaming(response, imports) .then(obj => { setInstance(obj.instance); try { obj.instance.exports._start(); } catch (e) { if (e instanceof WASIExit) { handleWASIExit(e); } else { } } }) .catch(error => { console.log('error! ' + error); }); }]; + +function _emscripten_asm_const_i(code) { + return ASM_CONSTS[code](); +} + + + + +// STATICTOP = STATIC_BASE + 5152; +/* global initializers */ /*__ATINIT__.push();*/ + + + + + + + + +/* no memory initializer */ +var tempDoublePtr = 6160 +assert(tempDoublePtr % 8 == 0); + +function copyTempFloat(ptr) { // functions, because inlining this code increases code size too much + HEAP8[tempDoublePtr] = HEAP8[ptr]; + HEAP8[tempDoublePtr+1] = HEAP8[ptr+1]; + HEAP8[tempDoublePtr+2] = HEAP8[ptr+2]; + HEAP8[tempDoublePtr+3] = HEAP8[ptr+3]; +} + +function copyTempDouble(ptr) { + HEAP8[tempDoublePtr] = HEAP8[ptr]; + HEAP8[tempDoublePtr+1] = HEAP8[ptr+1]; + HEAP8[tempDoublePtr+2] = HEAP8[ptr+2]; + HEAP8[tempDoublePtr+3] = HEAP8[ptr+3]; + HEAP8[tempDoublePtr+4] = HEAP8[ptr+4]; + HEAP8[tempDoublePtr+5] = HEAP8[ptr+5]; + HEAP8[tempDoublePtr+6] = HEAP8[ptr+6]; + HEAP8[tempDoublePtr+7] = HEAP8[ptr+7]; +} + +// {{PRE_LIBRARY}} + + + + function _exit(status) { + // void _exit(int status); + // http://pubs.opengroup.org/onlinepubs/000095399/functions/exit.html + exit(status); + }function __Exit(a0 + /*``*/) { + return _exit(a0); + } + + function ___assert_fail(condition, filename, line, func) { + abort('Assertion failed: ' + UTF8ToString(condition) + ', at: ' + [filename ? UTF8ToString(filename) : 'unknown filename', line, func ? UTF8ToString(func) : 'unknown function']); + } + + function ___lock() {} + + + + + function ___setErrNo(value) { + if (Module['___errno_location']) HEAP32[((Module['___errno_location']())>>2)]=value; + else err('failed to set errno from JS'); + return value; + } + + var PATH={splitPath:function (filename) { + var splitPathRe = /^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/; + return splitPathRe.exec(filename).slice(1); + },normalizeArray:function (parts, allowAboveRoot) { + // if the path tries to go above the root, `up` ends up > 0 + var up = 0; + for (var i = parts.length - 1; i >= 0; i--) { + var last = parts[i]; + if (last === '.') { + parts.splice(i, 1); + } else if (last === '..') { + parts.splice(i, 1); + up++; + } else if (up) { + parts.splice(i, 1); + up--; + } + } + // if the path is allowed to go above the root, restore leading ..s + if (allowAboveRoot) { + for (; up; up--) { + parts.unshift('..'); + } + } + return parts; + },normalize:function (path) { + var isAbsolute = path.charAt(0) === '/', + trailingSlash = path.substr(-1) === '/'; + // Normalize the path + path = PATH.normalizeArray(path.split('/').filter(function(p) { + return !!p; + }), !isAbsolute).join('/'); + if (!path && !isAbsolute) { + path = '.'; + } + if (path && trailingSlash) { + path += '/'; + } + return (isAbsolute ? '/' : '') + path; + },dirname:function (path) { + var result = PATH.splitPath(path), + root = result[0], + dir = result[1]; + if (!root && !dir) { + // No dirname whatsoever + return '.'; + } + if (dir) { + // It has a dirname, strip trailing slash + dir = dir.substr(0, dir.length - 1); + } + return root + dir; + },basename:function (path) { + // EMSCRIPTEN return '/'' for '/', not an empty string + if (path === '/') return '/'; + var lastSlash = path.lastIndexOf('/'); + if (lastSlash === -1) return path; + return path.substr(lastSlash+1); + },extname:function (path) { + return PATH.splitPath(path)[3]; + },join:function () { + var paths = Array.prototype.slice.call(arguments, 0); + return PATH.normalize(paths.join('/')); + },join2:function (l, r) { + return PATH.normalize(l + '/' + r); + },resolve:function () { + var resolvedPath = '', + resolvedAbsolute = false; + for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) { + var path = (i >= 0) ? arguments[i] : FS.cwd(); + // Skip empty and invalid entries + if (typeof path !== 'string') { + throw new TypeError('Arguments to path.resolve must be strings'); + } else if (!path) { + return ''; // an invalid portion invalidates the whole thing + } + resolvedPath = path + '/' + resolvedPath; + resolvedAbsolute = path.charAt(0) === '/'; + } + // At this point the path should be resolved to a full absolute path, but + // handle relative paths to be safe (might happen when process.cwd() fails) + resolvedPath = PATH.normalizeArray(resolvedPath.split('/').filter(function(p) { + return !!p; + }), !resolvedAbsolute).join('/'); + return ((resolvedAbsolute ? '/' : '') + resolvedPath) || '.'; + },relative:function (from, to) { + from = PATH.resolve(from).substr(1); + to = PATH.resolve(to).substr(1); + function trim(arr) { + var start = 0; + for (; start < arr.length; start++) { + if (arr[start] !== '') break; + } + var end = arr.length - 1; + for (; end >= 0; end--) { + if (arr[end] !== '') break; + } + if (start > end) return []; + return arr.slice(start, end - start + 1); + } + var fromParts = trim(from.split('/')); + var toParts = trim(to.split('/')); + var length = Math.min(fromParts.length, toParts.length); + var samePartsLength = length; + for (var i = 0; i < length; i++) { + if (fromParts[i] !== toParts[i]) { + samePartsLength = i; + break; + } + } + var outputParts = []; + for (var i = samePartsLength; i < fromParts.length; i++) { + outputParts.push('..'); + } + outputParts = outputParts.concat(toParts.slice(samePartsLength)); + return outputParts.join('/'); + }}; + + var TTY={ttys:[],init:function () { + // https://github.com/emscripten-core/emscripten/pull/1555 + // if (ENVIRONMENT_IS_NODE) { + // // currently, FS.init does not distinguish if process.stdin is a file or TTY + // // device, it always assumes it's a TTY device. because of this, we're forcing + // // process.stdin to UTF8 encoding to at least make stdin reading compatible + // // with text files until FS.init can be refactored. + // process['stdin']['setEncoding']('utf8'); + // } + },shutdown:function () { + // https://github.com/emscripten-core/emscripten/pull/1555 + // if (ENVIRONMENT_IS_NODE) { + // // inolen: any idea as to why node -e 'process.stdin.read()' wouldn't exit immediately (with process.stdin being a tty)? + // // isaacs: because now it's reading from the stream, you've expressed interest in it, so that read() kicks off a _read() which creates a ReadReq operation + // // inolen: I thought read() in that case was a synchronous operation that just grabbed some amount of buffered data if it exists? + // // isaacs: it is. but it also triggers a _read() call, which calls readStart() on the handle + // // isaacs: do process.stdin.pause() and i'd think it'd probably close the pending call + // process['stdin']['pause'](); + // } + },register:function (dev, ops) { + TTY.ttys[dev] = { input: [], output: [], ops: ops }; + FS.registerDevice(dev, TTY.stream_ops); + },stream_ops:{open:function (stream) { + var tty = TTY.ttys[stream.node.rdev]; + if (!tty) { + throw new FS.ErrnoError(ERRNO_CODES.ENODEV); + } + stream.tty = tty; + stream.seekable = false; + },close:function (stream) { + // flush any pending line data + stream.tty.ops.flush(stream.tty); + },flush:function (stream) { + stream.tty.ops.flush(stream.tty); + },read:function (stream, buffer, offset, length, pos /* ignored */) { + if (!stream.tty || !stream.tty.ops.get_char) { + throw new FS.ErrnoError(ERRNO_CODES.ENXIO); + } + var bytesRead = 0; + for (var i = 0; i < length; i++) { + var result; + try { + result = stream.tty.ops.get_char(stream.tty); + } catch (e) { + throw new FS.ErrnoError(ERRNO_CODES.EIO); + } + if (result === undefined && bytesRead === 0) { + throw new FS.ErrnoError(ERRNO_CODES.EAGAIN); + } + if (result === null || result === undefined) break; + bytesRead++; + buffer[offset+i] = result; + } + if (bytesRead) { + stream.node.timestamp = Date.now(); + } + return bytesRead; + },write:function (stream, buffer, offset, length, pos) { + if (!stream.tty || !stream.tty.ops.put_char) { + throw new FS.ErrnoError(ERRNO_CODES.ENXIO); + } + try { + for (var i = 0; i < length; i++) { + stream.tty.ops.put_char(stream.tty, buffer[offset+i]); + } + } catch (e) { + throw new FS.ErrnoError(ERRNO_CODES.EIO); + } + if (length) { + stream.node.timestamp = Date.now(); + } + return i; + }},default_tty_ops:{get_char:function (tty) { + if (!tty.input.length) { + var result = null; + if (ENVIRONMENT_IS_NODE) { + // we will read data by chunks of BUFSIZE + var BUFSIZE = 256; + var buf = new Buffer(BUFSIZE); + var bytesRead = 0; + + var isPosixPlatform = (process.platform != 'win32'); // Node doesn't offer a direct check, so test by exclusion + + var fd = process.stdin.fd; + if (isPosixPlatform) { + // Linux and Mac cannot use process.stdin.fd (which isn't set up as sync) + var usingDevice = false; + try { + fd = fs.openSync('/dev/stdin', 'r'); + usingDevice = true; + } catch (e) {} + } + + try { + bytesRead = fs.readSync(fd, buf, 0, BUFSIZE, null); + } catch(e) { + // Cross-platform differences: on Windows, reading EOF throws an exception, but on other OSes, + // reading EOF returns 0. Uniformize behavior by treating the EOF exception to return 0. + if (e.toString().indexOf('EOF') != -1) bytesRead = 0; + else throw e; + } + + if (usingDevice) { fs.closeSync(fd); } + if (bytesRead > 0) { + result = buf.slice(0, bytesRead).toString('utf-8'); + } else { + result = null; + } + } else + if (typeof window != 'undefined' && + typeof window.prompt == 'function') { + // Browser. + result = window.prompt('Input: '); // returns null on cancel + if (result !== null) { + result += '\n'; + } + } else if (typeof readline == 'function') { + // Command line. + result = readline(); + if (result !== null) { + result += '\n'; + } + } + if (!result) { + return null; + } + tty.input = intArrayFromString(result, true); + } + return tty.input.shift(); + },put_char:function (tty, val) { + if (val === null || val === 10) { + out(UTF8ArrayToString(tty.output, 0)); + tty.output = []; + } else { + if (val != 0) tty.output.push(val); // val == 0 would cut text output off in the middle. + } + },flush:function (tty) { + if (tty.output && tty.output.length > 0) { + out(UTF8ArrayToString(tty.output, 0)); + tty.output = []; + } + }},default_tty1_ops:{put_char:function (tty, val) { + if (val === null || val === 10) { + err(UTF8ArrayToString(tty.output, 0)); + tty.output = []; + } else { + if (val != 0) tty.output.push(val); + } + },flush:function (tty) { + if (tty.output && tty.output.length > 0) { + err(UTF8ArrayToString(tty.output, 0)); + tty.output = []; + } + }}}; + + var MEMFS={ops_table:null,mount:function (mount) { + return MEMFS.createNode(null, '/', 16384 | 511 /* 0777 */, 0); + },createNode:function (parent, name, mode, dev) { + if (FS.isBlkdev(mode) || FS.isFIFO(mode)) { + // no supported + throw new FS.ErrnoError(ERRNO_CODES.EPERM); + } + if (!MEMFS.ops_table) { + MEMFS.ops_table = { + dir: { + node: { + getattr: MEMFS.node_ops.getattr, + setattr: MEMFS.node_ops.setattr, + lookup: MEMFS.node_ops.lookup, + mknod: MEMFS.node_ops.mknod, + rename: MEMFS.node_ops.rename, + unlink: MEMFS.node_ops.unlink, + rmdir: MEMFS.node_ops.rmdir, + readdir: MEMFS.node_ops.readdir, + symlink: MEMFS.node_ops.symlink + }, + stream: { + llseek: MEMFS.stream_ops.llseek + } + }, + file: { + node: { + getattr: MEMFS.node_ops.getattr, + setattr: MEMFS.node_ops.setattr + }, + stream: { + llseek: MEMFS.stream_ops.llseek, + read: MEMFS.stream_ops.read, + write: MEMFS.stream_ops.write, + allocate: MEMFS.stream_ops.allocate, + mmap: MEMFS.stream_ops.mmap, + msync: MEMFS.stream_ops.msync + } + }, + link: { + node: { + getattr: MEMFS.node_ops.getattr, + setattr: MEMFS.node_ops.setattr, + readlink: MEMFS.node_ops.readlink + }, + stream: {} + }, + chrdev: { + node: { + getattr: MEMFS.node_ops.getattr, + setattr: MEMFS.node_ops.setattr + }, + stream: FS.chrdev_stream_ops + } + }; + } + var node = FS.createNode(parent, name, mode, dev); + if (FS.isDir(node.mode)) { + node.node_ops = MEMFS.ops_table.dir.node; + node.stream_ops = MEMFS.ops_table.dir.stream; + node.contents = {}; + } else if (FS.isFile(node.mode)) { + node.node_ops = MEMFS.ops_table.file.node; + node.stream_ops = MEMFS.ops_table.file.stream; + node.usedBytes = 0; // The actual number of bytes used in the typed array, as opposed to contents.length which gives the whole capacity. + // When the byte data of the file is populated, this will point to either a typed array, or a normal JS array. Typed arrays are preferred + // for performance, and used by default. However, typed arrays are not resizable like normal JS arrays are, so there is a small disk size + // penalty involved for appending file writes that continuously grow a file similar to std::vector capacity vs used -scheme. + node.contents = null; + } else if (FS.isLink(node.mode)) { + node.node_ops = MEMFS.ops_table.link.node; + node.stream_ops = MEMFS.ops_table.link.stream; + } else if (FS.isChrdev(node.mode)) { + node.node_ops = MEMFS.ops_table.chrdev.node; + node.stream_ops = MEMFS.ops_table.chrdev.stream; + } + node.timestamp = Date.now(); + // add the new node to the parent + if (parent) { + parent.contents[name] = node; + } + return node; + },getFileDataAsRegularArray:function (node) { + if (node.contents && node.contents.subarray) { + var arr = []; + for (var i = 0; i < node.usedBytes; ++i) arr.push(node.contents[i]); + return arr; // Returns a copy of the original data. + } + return node.contents; // No-op, the file contents are already in a JS array. Return as-is. + },getFileDataAsTypedArray:function (node) { + if (!node.contents) return new Uint8Array; + if (node.contents.subarray) return node.contents.subarray(0, node.usedBytes); // Make sure to not return excess unused bytes. + return new Uint8Array(node.contents); + },expandFileStorage:function (node, newCapacity) { + var prevCapacity = node.contents ? node.contents.length : 0; + if (prevCapacity >= newCapacity) return; // No need to expand, the storage was already large enough. + // Don't expand strictly to the given requested limit if it's only a very small increase, but instead geometrically grow capacity. + // For small filesizes (<1MB), perform size*2 geometric increase, but for large sizes, do a much more conservative size*1.125 increase to + // avoid overshooting the allocation cap by a very large margin. + var CAPACITY_DOUBLING_MAX = 1024 * 1024; + newCapacity = Math.max(newCapacity, (prevCapacity * (prevCapacity < CAPACITY_DOUBLING_MAX ? 2.0 : 1.125)) | 0); + if (prevCapacity != 0) newCapacity = Math.max(newCapacity, 256); // At minimum allocate 256b for each file when expanding. + var oldContents = node.contents; + node.contents = new Uint8Array(newCapacity); // Allocate new storage. + if (node.usedBytes > 0) node.contents.set(oldContents.subarray(0, node.usedBytes), 0); // Copy old data over to the new storage. + return; + },resizeFileStorage:function (node, newSize) { + if (node.usedBytes == newSize) return; + if (newSize == 0) { + node.contents = null; // Fully decommit when requesting a resize to zero. + node.usedBytes = 0; + return; + } + if (!node.contents || node.contents.subarray) { // Resize a typed array if that is being used as the backing store. + var oldContents = node.contents; + node.contents = new Uint8Array(new ArrayBuffer(newSize)); // Allocate new storage. + if (oldContents) { + node.contents.set(oldContents.subarray(0, Math.min(newSize, node.usedBytes))); // Copy old data over to the new storage. + } + node.usedBytes = newSize; + return; + } + // Backing with a JS array. + if (!node.contents) node.contents = []; + if (node.contents.length > newSize) node.contents.length = newSize; + else while (node.contents.length < newSize) node.contents.push(0); + node.usedBytes = newSize; + },node_ops:{getattr:function (node) { + var attr = {}; + // device numbers reuse inode numbers. + attr.dev = FS.isChrdev(node.mode) ? node.id : 1; + attr.ino = node.id; + attr.mode = node.mode; + attr.nlink = 1; + attr.uid = 0; + attr.gid = 0; + attr.rdev = node.rdev; + if (FS.isDir(node.mode)) { + attr.size = 4096; + } else if (FS.isFile(node.mode)) { + attr.size = node.usedBytes; + } else if (FS.isLink(node.mode)) { + attr.size = node.link.length; + } else { + attr.size = 0; + } + attr.atime = new Date(node.timestamp); + attr.mtime = new Date(node.timestamp); + attr.ctime = new Date(node.timestamp); + // NOTE: In our implementation, st_blocks = Math.ceil(st_size/st_blksize), + // but this is not required by the standard. + attr.blksize = 4096; + attr.blocks = Math.ceil(attr.size / attr.blksize); + return attr; + },setattr:function (node, attr) { + if (attr.mode !== undefined) { + node.mode = attr.mode; + } + if (attr.timestamp !== undefined) { + node.timestamp = attr.timestamp; + } + if (attr.size !== undefined) { + MEMFS.resizeFileStorage(node, attr.size); + } + },lookup:function (parent, name) { + throw FS.genericErrors[ERRNO_CODES.ENOENT]; + },mknod:function (parent, name, mode, dev) { + return MEMFS.createNode(parent, name, mode, dev); + },rename:function (old_node, new_dir, new_name) { + // if we're overwriting a directory at new_name, make sure it's empty. + if (FS.isDir(old_node.mode)) { + var new_node; + try { + new_node = FS.lookupNode(new_dir, new_name); + } catch (e) { + } + if (new_node) { + for (var i in new_node.contents) { + throw new FS.ErrnoError(ERRNO_CODES.ENOTEMPTY); + } + } + } + // do the internal rewiring + delete old_node.parent.contents[old_node.name]; + old_node.name = new_name; + new_dir.contents[new_name] = old_node; + old_node.parent = new_dir; + },unlink:function (parent, name) { + delete parent.contents[name]; + },rmdir:function (parent, name) { + var node = FS.lookupNode(parent, name); + for (var i in node.contents) { + throw new FS.ErrnoError(ERRNO_CODES.ENOTEMPTY); + } + delete parent.contents[name]; + },readdir:function (node) { + var entries = ['.', '..'] + for (var key in node.contents) { + if (!node.contents.hasOwnProperty(key)) { + continue; + } + entries.push(key); + } + return entries; + },symlink:function (parent, newname, oldpath) { + var node = MEMFS.createNode(parent, newname, 511 /* 0777 */ | 40960, 0); + node.link = oldpath; + return node; + },readlink:function (node) { + if (!FS.isLink(node.mode)) { + throw new FS.ErrnoError(ERRNO_CODES.EINVAL); + } + return node.link; + }},stream_ops:{read:function (stream, buffer, offset, length, position) { + var contents = stream.node.contents; + if (position >= stream.node.usedBytes) return 0; + var size = Math.min(stream.node.usedBytes - position, length); + assert(size >= 0); + if (size > 8 && contents.subarray) { // non-trivial, and typed array + buffer.set(contents.subarray(position, position + size), offset); + } else { + for (var i = 0; i < size; i++) buffer[offset + i] = contents[position + i]; + } + return size; + },write:function (stream, buffer, offset, length, position, canOwn) { + + if (!length) return 0; + var node = stream.node; + node.timestamp = Date.now(); + + if (buffer.subarray && (!node.contents || node.contents.subarray)) { // This write is from a typed array to a typed array? + if (canOwn) { + assert(position === 0, 'canOwn must imply no weird position inside the file'); + node.contents = buffer.subarray(offset, offset + length); + node.usedBytes = length; + return length; + } else if (node.usedBytes === 0 && position === 0) { // If this is a simple first write to an empty file, do a fast set since we don't need to care about old data. + node.contents = new Uint8Array(buffer.subarray(offset, offset + length)); + node.usedBytes = length; + return length; + } else if (position + length <= node.usedBytes) { // Writing to an already allocated and used subrange of the file? + node.contents.set(buffer.subarray(offset, offset + length), position); + return length; + } + } + + // Appending to an existing file and we need to reallocate, or source data did not come as a typed array. + MEMFS.expandFileStorage(node, position+length); + if (node.contents.subarray && buffer.subarray) node.contents.set(buffer.subarray(offset, offset + length), position); // Use typed array write if available. + else { + for (var i = 0; i < length; i++) { + node.contents[position + i] = buffer[offset + i]; // Or fall back to manual write if not. + } + } + node.usedBytes = Math.max(node.usedBytes, position+length); + return length; + },llseek:function (stream, offset, whence) { + var position = offset; + if (whence === 1) { // SEEK_CUR. + position += stream.position; + } else if (whence === 2) { // SEEK_END. + if (FS.isFile(stream.node.mode)) { + position += stream.node.usedBytes; + } + } + if (position < 0) { + throw new FS.ErrnoError(ERRNO_CODES.EINVAL); + } + return position; + },allocate:function (stream, offset, length) { + MEMFS.expandFileStorage(stream.node, offset + length); + stream.node.usedBytes = Math.max(stream.node.usedBytes, offset + length); + },mmap:function (stream, buffer, offset, length, position, prot, flags) { + if (!FS.isFile(stream.node.mode)) { + throw new FS.ErrnoError(ERRNO_CODES.ENODEV); + } + var ptr; + var allocated; + var contents = stream.node.contents; + // Only make a new copy when MAP_PRIVATE is specified. + if ( !(flags & 2) && + (contents.buffer === buffer || contents.buffer === buffer.buffer) ) { + // We can't emulate MAP_SHARED when the file is not backed by the buffer + // we're mapping to (e.g. the HEAP buffer). + allocated = false; + ptr = contents.byteOffset; + } else { + // Try to avoid unnecessary slices. + if (position > 0 || position + length < stream.node.usedBytes) { + if (contents.subarray) { + contents = contents.subarray(position, position + length); + } else { + contents = Array.prototype.slice.call(contents, position, position + length); + } + } + allocated = true; + ptr = _malloc(length); + if (!ptr) { + throw new FS.ErrnoError(ERRNO_CODES.ENOMEM); + } + buffer.set(contents, ptr); + } + return { ptr: ptr, allocated: allocated }; + },msync:function (stream, buffer, offset, length, mmapFlags) { + if (!FS.isFile(stream.node.mode)) { + throw new FS.ErrnoError(ERRNO_CODES.ENODEV); + } + if (mmapFlags & 2) { + // MAP_PRIVATE calls need not to be synced back to underlying fs + return 0; + } + + var bytesWritten = MEMFS.stream_ops.write(stream, buffer, 0, length, offset, false); + // should we check if bytesWritten and length are the same? + return 0; + }}}; + + var IDBFS={dbs:{},indexedDB:function () { + if (typeof indexedDB !== 'undefined') return indexedDB; + var ret = null; + if (typeof window === 'object') ret = window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB; + assert(ret, 'IDBFS used, but indexedDB not supported'); + return ret; + },DB_VERSION:21,DB_STORE_NAME:"FILE_DATA",mount:function (mount) { + // reuse all of the core MEMFS functionality + return MEMFS.mount.apply(null, arguments); + },syncfs:function (mount, populate, callback) { + IDBFS.getLocalSet(mount, function(err, local) { + if (err) return callback(err); + + IDBFS.getRemoteSet(mount, function(err, remote) { + if (err) return callback(err); + + var src = populate ? remote : local; + var dst = populate ? local : remote; + + IDBFS.reconcile(src, dst, callback); + }); + }); + },getDB:function (name, callback) { + // check the cache first + var db = IDBFS.dbs[name]; + if (db) { + return callback(null, db); + } + + var req; + try { + req = IDBFS.indexedDB().open(name, IDBFS.DB_VERSION); + } catch (e) { + return callback(e); + } + if (!req) { + return callback("Unable to connect to IndexedDB"); + } + req.onupgradeneeded = function(e) { + var db = e.target.result; + var transaction = e.target.transaction; + + var fileStore; + + if (db.objectStoreNames.contains(IDBFS.DB_STORE_NAME)) { + fileStore = transaction.objectStore(IDBFS.DB_STORE_NAME); + } else { + fileStore = db.createObjectStore(IDBFS.DB_STORE_NAME); + } + + if (!fileStore.indexNames.contains('timestamp')) { + fileStore.createIndex('timestamp', 'timestamp', { unique: false }); + } + }; + req.onsuccess = function() { + db = req.result; + + // add to the cache + IDBFS.dbs[name] = db; + callback(null, db); + }; + req.onerror = function(e) { + callback(this.error); + e.preventDefault(); + }; + },getLocalSet:function (mount, callback) { + var entries = {}; + + function isRealDir(p) { + return p !== '.' && p !== '..'; + }; + function toAbsolute(root) { + return function(p) { + return PATH.join2(root, p); + } + }; + + var check = FS.readdir(mount.mountpoint).filter(isRealDir).map(toAbsolute(mount.mountpoint)); + + while (check.length) { + var path = check.pop(); + var stat; + + try { + stat = FS.stat(path); + } catch (e) { + return callback(e); + } + + if (FS.isDir(stat.mode)) { + check.push.apply(check, FS.readdir(path).filter(isRealDir).map(toAbsolute(path))); + } + + entries[path] = { timestamp: stat.mtime }; + } + + return callback(null, { type: 'local', entries: entries }); + },getRemoteSet:function (mount, callback) { + var entries = {}; + + IDBFS.getDB(mount.mountpoint, function(err, db) { + if (err) return callback(err); + + try { + var transaction = db.transaction([IDBFS.DB_STORE_NAME], 'readonly'); + transaction.onerror = function(e) { + callback(this.error); + e.preventDefault(); + }; + + var store = transaction.objectStore(IDBFS.DB_STORE_NAME); + var index = store.index('timestamp'); + + index.openKeyCursor().onsuccess = function(event) { + var cursor = event.target.result; + + if (!cursor) { + return callback(null, { type: 'remote', db: db, entries: entries }); + } + + entries[cursor.primaryKey] = { timestamp: cursor.key }; + + cursor.continue(); + }; + } catch (e) { + return callback(e); + } + }); + },loadLocalEntry:function (path, callback) { + var stat, node; + + try { + var lookup = FS.lookupPath(path); + node = lookup.node; + stat = FS.stat(path); + } catch (e) { + return callback(e); + } + + if (FS.isDir(stat.mode)) { + return callback(null, { timestamp: stat.mtime, mode: stat.mode }); + } else if (FS.isFile(stat.mode)) { + // Performance consideration: storing a normal JavaScript array to a IndexedDB is much slower than storing a typed array. + // Therefore always convert the file contents to a typed array first before writing the data to IndexedDB. + node.contents = MEMFS.getFileDataAsTypedArray(node); + return callback(null, { timestamp: stat.mtime, mode: stat.mode, contents: node.contents }); + } else { + return callback(new Error('node type not supported')); + } + },storeLocalEntry:function (path, entry, callback) { + try { + if (FS.isDir(entry.mode)) { + FS.mkdir(path, entry.mode); + } else if (FS.isFile(entry.mode)) { + FS.writeFile(path, entry.contents, { canOwn: true }); + } else { + return callback(new Error('node type not supported')); + } + + FS.chmod(path, entry.mode); + FS.utime(path, entry.timestamp, entry.timestamp); + } catch (e) { + return callback(e); + } + + callback(null); + },removeLocalEntry:function (path, callback) { + try { + var lookup = FS.lookupPath(path); + var stat = FS.stat(path); + + if (FS.isDir(stat.mode)) { + FS.rmdir(path); + } else if (FS.isFile(stat.mode)) { + FS.unlink(path); + } + } catch (e) { + return callback(e); + } + + callback(null); + },loadRemoteEntry:function (store, path, callback) { + var req = store.get(path); + req.onsuccess = function(event) { callback(null, event.target.result); }; + req.onerror = function(e) { + callback(this.error); + e.preventDefault(); + }; + },storeRemoteEntry:function (store, path, entry, callback) { + var req = store.put(entry, path); + req.onsuccess = function() { callback(null); }; + req.onerror = function(e) { + callback(this.error); + e.preventDefault(); + }; + },removeRemoteEntry:function (store, path, callback) { + var req = store.delete(path); + req.onsuccess = function() { callback(null); }; + req.onerror = function(e) { + callback(this.error); + e.preventDefault(); + }; + },reconcile:function (src, dst, callback) { + var total = 0; + + var create = []; + Object.keys(src.entries).forEach(function (key) { + var e = src.entries[key]; + var e2 = dst.entries[key]; + if (!e2 || e.timestamp > e2.timestamp) { + create.push(key); + total++; + } + }); + + var remove = []; + Object.keys(dst.entries).forEach(function (key) { + var e = dst.entries[key]; + var e2 = src.entries[key]; + if (!e2) { + remove.push(key); + total++; + } + }); + + if (!total) { + return callback(null); + } + + var errored = false; + var completed = 0; + var db = src.type === 'remote' ? src.db : dst.db; + var transaction = db.transaction([IDBFS.DB_STORE_NAME], 'readwrite'); + var store = transaction.objectStore(IDBFS.DB_STORE_NAME); + + function done(err) { + if (err) { + if (!done.errored) { + done.errored = true; + return callback(err); + } + return; + } + if (++completed >= total) { + return callback(null); + } + }; + + transaction.onerror = function(e) { + done(this.error); + e.preventDefault(); + }; + + // sort paths in ascending order so directory entries are created + // before the files inside them + create.sort().forEach(function (path) { + if (dst.type === 'local') { + IDBFS.loadRemoteEntry(store, path, function (err, entry) { + if (err) return done(err); + IDBFS.storeLocalEntry(path, entry, done); + }); + } else { + IDBFS.loadLocalEntry(path, function (err, entry) { + if (err) return done(err); + IDBFS.storeRemoteEntry(store, path, entry, done); + }); + } + }); + + // sort paths in descending order so files are deleted before their + // parent directories + remove.sort().reverse().forEach(function(path) { + if (dst.type === 'local') { + IDBFS.removeLocalEntry(path, done); + } else { + IDBFS.removeRemoteEntry(store, path, done); + } + }); + }}; + + var NODEFS={isWindows:false,staticInit:function () { + NODEFS.isWindows = !!process.platform.match(/^win/); + var flags = process["binding"]("constants"); + // Node.js 4 compatibility: it has no namespaces for constants + if (flags["fs"]) { + flags = flags["fs"]; + } + NODEFS.flagsForNodeMap = { + "1024": flags["O_APPEND"], + "64": flags["O_CREAT"], + "128": flags["O_EXCL"], + "0": flags["O_RDONLY"], + "2": flags["O_RDWR"], + "4096": flags["O_SYNC"], + "512": flags["O_TRUNC"], + "1": flags["O_WRONLY"] + }; + },bufferFrom:function (arrayBuffer) { + // Node.js < 4.5 compatibility: Buffer.from does not support ArrayBuffer + // Buffer.from before 4.5 was just a method inherited from Uint8Array + // Buffer.alloc has been added with Buffer.from together, so check it instead + return Buffer.alloc ? Buffer.from(arrayBuffer) : new Buffer(arrayBuffer); + },mount:function (mount) { + assert(ENVIRONMENT_IS_NODE); + return NODEFS.createNode(null, '/', NODEFS.getMode(mount.opts.root), 0); + },createNode:function (parent, name, mode, dev) { + if (!FS.isDir(mode) && !FS.isFile(mode) && !FS.isLink(mode)) { + throw new FS.ErrnoError(ERRNO_CODES.EINVAL); + } + var node = FS.createNode(parent, name, mode); + node.node_ops = NODEFS.node_ops; + node.stream_ops = NODEFS.stream_ops; + return node; + },getMode:function (path) { + var stat; + try { + stat = fs.lstatSync(path); + if (NODEFS.isWindows) { + // Node.js on Windows never represents permission bit 'x', so + // propagate read bits to execute bits + stat.mode = stat.mode | ((stat.mode & 292) >> 2); + } + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + return stat.mode; + },realPath:function (node) { + var parts = []; + while (node.parent !== node) { + parts.push(node.name); + node = node.parent; + } + parts.push(node.mount.opts.root); + parts.reverse(); + return PATH.join.apply(null, parts); + },flagsForNode:function (flags) { + flags &= ~0x200000 /*O_PATH*/; // Ignore this flag from musl, otherwise node.js fails to open the file. + flags &= ~0x800 /*O_NONBLOCK*/; // Ignore this flag from musl, otherwise node.js fails to open the file. + flags &= ~0x8000 /*O_LARGEFILE*/; // Ignore this flag from musl, otherwise node.js fails to open the file. + flags &= ~0x80000 /*O_CLOEXEC*/; // Some applications may pass it; it makes no sense for a single process. + var newFlags = 0; + for (var k in NODEFS.flagsForNodeMap) { + if (flags & k) { + newFlags |= NODEFS.flagsForNodeMap[k]; + flags ^= k; + } + } + + if (!flags) { + return newFlags; + } else { + throw new FS.ErrnoError(ERRNO_CODES.EINVAL); + } + },node_ops:{getattr:function (node) { + var path = NODEFS.realPath(node); + var stat; + try { + stat = fs.lstatSync(path); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + // node.js v0.10.20 doesn't report blksize and blocks on Windows. Fake them with default blksize of 4096. + // See http://support.microsoft.com/kb/140365 + if (NODEFS.isWindows && !stat.blksize) { + stat.blksize = 4096; + } + if (NODEFS.isWindows && !stat.blocks) { + stat.blocks = (stat.size+stat.blksize-1)/stat.blksize|0; + } + return { + dev: stat.dev, + ino: stat.ino, + mode: stat.mode, + nlink: stat.nlink, + uid: stat.uid, + gid: stat.gid, + rdev: stat.rdev, + size: stat.size, + atime: stat.atime, + mtime: stat.mtime, + ctime: stat.ctime, + blksize: stat.blksize, + blocks: stat.blocks + }; + },setattr:function (node, attr) { + var path = NODEFS.realPath(node); + try { + if (attr.mode !== undefined) { + fs.chmodSync(path, attr.mode); + // update the common node structure mode as well + node.mode = attr.mode; + } + if (attr.timestamp !== undefined) { + var date = new Date(attr.timestamp); + fs.utimesSync(path, date, date); + } + if (attr.size !== undefined) { + fs.truncateSync(path, attr.size); + } + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + },lookup:function (parent, name) { + var path = PATH.join2(NODEFS.realPath(parent), name); + var mode = NODEFS.getMode(path); + return NODEFS.createNode(parent, name, mode); + },mknod:function (parent, name, mode, dev) { + var node = NODEFS.createNode(parent, name, mode, dev); + // create the backing node for this in the fs root as well + var path = NODEFS.realPath(node); + try { + if (FS.isDir(node.mode)) { + fs.mkdirSync(path, node.mode); + } else { + fs.writeFileSync(path, '', { mode: node.mode }); + } + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + return node; + },rename:function (oldNode, newDir, newName) { + var oldPath = NODEFS.realPath(oldNode); + var newPath = PATH.join2(NODEFS.realPath(newDir), newName); + try { + fs.renameSync(oldPath, newPath); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + },unlink:function (parent, name) { + var path = PATH.join2(NODEFS.realPath(parent), name); + try { + fs.unlinkSync(path); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + },rmdir:function (parent, name) { + var path = PATH.join2(NODEFS.realPath(parent), name); + try { + fs.rmdirSync(path); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + },readdir:function (node) { + var path = NODEFS.realPath(node); + try { + return fs.readdirSync(path); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + },symlink:function (parent, newName, oldPath) { + var newPath = PATH.join2(NODEFS.realPath(parent), newName); + try { + fs.symlinkSync(oldPath, newPath); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + },readlink:function (node) { + var path = NODEFS.realPath(node); + try { + path = fs.readlinkSync(path); + path = NODEJS_PATH.relative(NODEJS_PATH.resolve(node.mount.opts.root), path); + return path; + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }},stream_ops:{open:function (stream) { + var path = NODEFS.realPath(stream.node); + try { + if (FS.isFile(stream.node.mode)) { + stream.nfd = fs.openSync(path, NODEFS.flagsForNode(stream.flags)); + } + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + },close:function (stream) { + try { + if (FS.isFile(stream.node.mode) && stream.nfd) { + fs.closeSync(stream.nfd); + } + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + },read:function (stream, buffer, offset, length, position) { + // Node.js < 6 compatibility: node errors on 0 length reads + if (length === 0) return 0; + try { + return fs.readSync(stream.nfd, NODEFS.bufferFrom(buffer.buffer), offset, length, position); + } catch (e) { + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + },write:function (stream, buffer, offset, length, position) { + try { + return fs.writeSync(stream.nfd, NODEFS.bufferFrom(buffer.buffer), offset, length, position); + } catch (e) { + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + },llseek:function (stream, offset, whence) { + var position = offset; + if (whence === 1) { // SEEK_CUR. + position += stream.position; + } else if (whence === 2) { // SEEK_END. + if (FS.isFile(stream.node.mode)) { + try { + var stat = fs.fstatSync(stream.nfd); + position += stat.size; + } catch (e) { + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + } + } + + if (position < 0) { + throw new FS.ErrnoError(ERRNO_CODES.EINVAL); + } + + return position; + }}}; + + var WORKERFS={DIR_MODE:16895,FILE_MODE:33279,reader:null,mount:function (mount) { + assert(ENVIRONMENT_IS_WORKER); + if (!WORKERFS.reader) WORKERFS.reader = new FileReaderSync(); + var root = WORKERFS.createNode(null, '/', WORKERFS.DIR_MODE, 0); + var createdParents = {}; + function ensureParent(path) { + // return the parent node, creating subdirs as necessary + var parts = path.split('/'); + var parent = root; + for (var i = 0; i < parts.length-1; i++) { + var curr = parts.slice(0, i+1).join('/'); + // Issue 4254: Using curr as a node name will prevent the node + // from being found in FS.nameTable when FS.open is called on + // a path which holds a child of this node, + // given that all FS functions assume node names + // are just their corresponding parts within their given path, + // rather than incremental aggregates which include their parent's + // directories. + if (!createdParents[curr]) { + createdParents[curr] = WORKERFS.createNode(parent, parts[i], WORKERFS.DIR_MODE, 0); + } + parent = createdParents[curr]; + } + return parent; + } + function base(path) { + var parts = path.split('/'); + return parts[parts.length-1]; + } + // We also accept FileList here, by using Array.prototype + Array.prototype.forEach.call(mount.opts["files"] || [], function(file) { + WORKERFS.createNode(ensureParent(file.name), base(file.name), WORKERFS.FILE_MODE, 0, file, file.lastModifiedDate); + }); + (mount.opts["blobs"] || []).forEach(function(obj) { + WORKERFS.createNode(ensureParent(obj["name"]), base(obj["name"]), WORKERFS.FILE_MODE, 0, obj["data"]); + }); + (mount.opts["packages"] || []).forEach(function(pack) { + pack['metadata'].files.forEach(function(file) { + var name = file.filename.substr(1); // remove initial slash + WORKERFS.createNode(ensureParent(name), base(name), WORKERFS.FILE_MODE, 0, pack['blob'].slice(file.start, file.end)); + }); + }); + return root; + },createNode:function (parent, name, mode, dev, contents, mtime) { + var node = FS.createNode(parent, name, mode); + node.mode = mode; + node.node_ops = WORKERFS.node_ops; + node.stream_ops = WORKERFS.stream_ops; + node.timestamp = (mtime || new Date).getTime(); + assert(WORKERFS.FILE_MODE !== WORKERFS.DIR_MODE); + if (mode === WORKERFS.FILE_MODE) { + node.size = contents.size; + node.contents = contents; + } else { + node.size = 4096; + node.contents = {}; + } + if (parent) { + parent.contents[name] = node; + } + return node; + },node_ops:{getattr:function (node) { + return { + dev: 1, + ino: undefined, + mode: node.mode, + nlink: 1, + uid: 0, + gid: 0, + rdev: undefined, + size: node.size, + atime: new Date(node.timestamp), + mtime: new Date(node.timestamp), + ctime: new Date(node.timestamp), + blksize: 4096, + blocks: Math.ceil(node.size / 4096), + }; + },setattr:function (node, attr) { + if (attr.mode !== undefined) { + node.mode = attr.mode; + } + if (attr.timestamp !== undefined) { + node.timestamp = attr.timestamp; + } + },lookup:function (parent, name) { + throw new FS.ErrnoError(ERRNO_CODES.ENOENT); + },mknod:function (parent, name, mode, dev) { + throw new FS.ErrnoError(ERRNO_CODES.EPERM); + },rename:function (oldNode, newDir, newName) { + throw new FS.ErrnoError(ERRNO_CODES.EPERM); + },unlink:function (parent, name) { + throw new FS.ErrnoError(ERRNO_CODES.EPERM); + },rmdir:function (parent, name) { + throw new FS.ErrnoError(ERRNO_CODES.EPERM); + },readdir:function (node) { + var entries = ['.', '..']; + for (var key in node.contents) { + if (!node.contents.hasOwnProperty(key)) { + continue; + } + entries.push(key); + } + return entries; + },symlink:function (parent, newName, oldPath) { + throw new FS.ErrnoError(ERRNO_CODES.EPERM); + },readlink:function (node) { + throw new FS.ErrnoError(ERRNO_CODES.EPERM); + }},stream_ops:{read:function (stream, buffer, offset, length, position) { + if (position >= stream.node.size) return 0; + var chunk = stream.node.contents.slice(position, position + length); + var ab = WORKERFS.reader.readAsArrayBuffer(chunk); + buffer.set(new Uint8Array(ab), offset); + return chunk.size; + },write:function (stream, buffer, offset, length, position) { + throw new FS.ErrnoError(ERRNO_CODES.EIO); + },llseek:function (stream, offset, whence) { + var position = offset; + if (whence === 1) { // SEEK_CUR. + position += stream.position; + } else if (whence === 2) { // SEEK_END. + if (FS.isFile(stream.node.mode)) { + position += stream.node.size; + } + } + if (position < 0) { + throw new FS.ErrnoError(ERRNO_CODES.EINVAL); + } + return position; + }}}; + + var ERRNO_MESSAGES={0:"Success",1:"Not super-user",2:"No such file or directory",3:"No such process",4:"Interrupted system call",5:"I/O error",6:"No such device or address",7:"Arg list too long",8:"Exec format error",9:"Bad file number",10:"No children",11:"No more processes",12:"Not enough core",13:"Permission denied",14:"Bad address",15:"Block device required",16:"Mount device busy",17:"File exists",18:"Cross-device link",19:"No such device",20:"Not a directory",21:"Is a directory",22:"Invalid argument",23:"Too many open files in system",24:"Too many open files",25:"Not a typewriter",26:"Text file busy",27:"File too large",28:"No space left on device",29:"Illegal seek",30:"Read only file system",31:"Too many links",32:"Broken pipe",33:"Math arg out of domain of func",34:"Math result not representable",35:"File locking deadlock error",36:"File or path name too long",37:"No record locks available",38:"Function not implemented",39:"Directory not empty",40:"Too many symbolic links",42:"No message of desired type",43:"Identifier removed",44:"Channel number out of range",45:"Level 2 not synchronized",46:"Level 3 halted",47:"Level 3 reset",48:"Link number out of range",49:"Protocol driver not attached",50:"No CSI structure available",51:"Level 2 halted",52:"Invalid exchange",53:"Invalid request descriptor",54:"Exchange full",55:"No anode",56:"Invalid request code",57:"Invalid slot",59:"Bad font file fmt",60:"Device not a stream",61:"No data (for no delay io)",62:"Timer expired",63:"Out of streams resources",64:"Machine is not on the network",65:"Package not installed",66:"The object is remote",67:"The link has been severed",68:"Advertise error",69:"Srmount error",70:"Communication error on send",71:"Protocol error",72:"Multihop attempted",73:"Cross mount point (not really error)",74:"Trying to read unreadable message",75:"Value too large for defined data type",76:"Given log. name not unique",77:"f.d. invalid for this operation",78:"Remote address changed",79:"Can access a needed shared lib",80:"Accessing a corrupted shared lib",81:".lib section in a.out corrupted",82:"Attempting to link in too many libs",83:"Attempting to exec a shared library",84:"Illegal byte sequence",86:"Streams pipe error",87:"Too many users",88:"Socket operation on non-socket",89:"Destination address required",90:"Message too long",91:"Protocol wrong type for socket",92:"Protocol not available",93:"Unknown protocol",94:"Socket type not supported",95:"Not supported",96:"Protocol family not supported",97:"Address family not supported by protocol family",98:"Address already in use",99:"Address not available",100:"Network interface is not configured",101:"Network is unreachable",102:"Connection reset by network",103:"Connection aborted",104:"Connection reset by peer",105:"No buffer space available",106:"Socket is already connected",107:"Socket is not connected",108:"Can't send after socket shutdown",109:"Too many references",110:"Connection timed out",111:"Connection refused",112:"Host is down",113:"Host is unreachable",114:"Socket already connected",115:"Connection already in progress",116:"Stale file handle",122:"Quota exceeded",123:"No medium (in tape drive)",125:"Operation canceled",130:"Previous owner died",131:"State not recoverable"}; + + var ERRNO_CODES={EPERM:1,ENOENT:2,ESRCH:3,EINTR:4,EIO:5,ENXIO:6,E2BIG:7,ENOEXEC:8,EBADF:9,ECHILD:10,EAGAIN:11,EWOULDBLOCK:11,ENOMEM:12,EACCES:13,EFAULT:14,ENOTBLK:15,EBUSY:16,EEXIST:17,EXDEV:18,ENODEV:19,ENOTDIR:20,EISDIR:21,EINVAL:22,ENFILE:23,EMFILE:24,ENOTTY:25,ETXTBSY:26,EFBIG:27,ENOSPC:28,ESPIPE:29,EROFS:30,EMLINK:31,EPIPE:32,EDOM:33,ERANGE:34,ENOMSG:42,EIDRM:43,ECHRNG:44,EL2NSYNC:45,EL3HLT:46,EL3RST:47,ELNRNG:48,EUNATCH:49,ENOCSI:50,EL2HLT:51,EDEADLK:35,ENOLCK:37,EBADE:52,EBADR:53,EXFULL:54,ENOANO:55,EBADRQC:56,EBADSLT:57,EDEADLOCK:35,EBFONT:59,ENOSTR:60,ENODATA:61,ETIME:62,ENOSR:63,ENONET:64,ENOPKG:65,EREMOTE:66,ENOLINK:67,EADV:68,ESRMNT:69,ECOMM:70,EPROTO:71,EMULTIHOP:72,EDOTDOT:73,EBADMSG:74,ENOTUNIQ:76,EBADFD:77,EREMCHG:78,ELIBACC:79,ELIBBAD:80,ELIBSCN:81,ELIBMAX:82,ELIBEXEC:83,ENOSYS:38,ENOTEMPTY:39,ENAMETOOLONG:36,ELOOP:40,EOPNOTSUPP:95,EPFNOSUPPORT:96,ECONNRESET:104,ENOBUFS:105,EAFNOSUPPORT:97,EPROTOTYPE:91,ENOTSOCK:88,ENOPROTOOPT:92,ESHUTDOWN:108,ECONNREFUSED:111,EADDRINUSE:98,ECONNABORTED:103,ENETUNREACH:101,ENETDOWN:100,ETIMEDOUT:110,EHOSTDOWN:112,EHOSTUNREACH:113,EINPROGRESS:115,EALREADY:114,EDESTADDRREQ:89,EMSGSIZE:90,EPROTONOSUPPORT:93,ESOCKTNOSUPPORT:94,EADDRNOTAVAIL:99,ENETRESET:102,EISCONN:106,ENOTCONN:107,ETOOMANYREFS:109,EUSERS:87,EDQUOT:122,ESTALE:116,ENOTSUP:95,ENOMEDIUM:123,EILSEQ:84,EOVERFLOW:75,ECANCELED:125,ENOTRECOVERABLE:131,EOWNERDEAD:130,ESTRPIPE:86}; + + var _stdin=5936; + + var _stdout=5952; + + var _stderr=5968;var FS={root:null,mounts:[],devices:{},streams:[],nextInode:1,nameTable:null,currentPath:"/",initialized:false,ignorePermissions:true,trackingDelegate:{},tracking:{openFlags:{READ:1,WRITE:2}},ErrnoError:null,genericErrors:{},filesystems:null,syncFSRequests:0,handleFSError:function (e) { + if (!(e instanceof FS.ErrnoError)) throw e + ' : ' + stackTrace(); + return ___setErrNo(e.errno); + },lookupPath:function (path, opts) { + path = PATH.resolve(FS.cwd(), path); + opts = opts || {}; + + if (!path) return { path: '', node: null }; + + var defaults = { + follow_mount: true, + recurse_count: 0 + }; + for (var key in defaults) { + if (opts[key] === undefined) { + opts[key] = defaults[key]; + } + } + + if (opts.recurse_count > 8) { // max recursive lookup of 8 + throw new FS.ErrnoError(40); + } + + // split the path + var parts = PATH.normalizeArray(path.split('/').filter(function(p) { + return !!p; + }), false); + + // start at the root + var current = FS.root; + var current_path = '/'; + + for (var i = 0; i < parts.length; i++) { + var islast = (i === parts.length-1); + if (islast && opts.parent) { + // stop resolving + break; + } + + current = FS.lookupNode(current, parts[i]); + current_path = PATH.join2(current_path, parts[i]); + + // jump to the mount's root node if this is a mountpoint + if (FS.isMountpoint(current)) { + if (!islast || (islast && opts.follow_mount)) { + current = current.mounted.root; + } + } + + // by default, lookupPath will not follow a symlink if it is the final path component. + // setting opts.follow = true will override this behavior. + if (!islast || opts.follow) { + var count = 0; + while (FS.isLink(current.mode)) { + var link = FS.readlink(current_path); + current_path = PATH.resolve(PATH.dirname(current_path), link); + + var lookup = FS.lookupPath(current_path, { recurse_count: opts.recurse_count }); + current = lookup.node; + + if (count++ > 40) { // limit max consecutive symlinks to 40 (SYMLOOP_MAX). + throw new FS.ErrnoError(40); + } + } + } + } + + return { path: current_path, node: current }; + },getPath:function (node) { + var path; + while (true) { + if (FS.isRoot(node)) { + var mount = node.mount.mountpoint; + if (!path) return mount; + return mount[mount.length-1] !== '/' ? mount + '/' + path : mount + path; + } + path = path ? node.name + '/' + path : node.name; + node = node.parent; + } + },hashName:function (parentid, name) { + var hash = 0; + + + for (var i = 0; i < name.length; i++) { + hash = ((hash << 5) - hash + name.charCodeAt(i)) | 0; + } + return ((parentid + hash) >>> 0) % FS.nameTable.length; + },hashAddNode:function (node) { + var hash = FS.hashName(node.parent.id, node.name); + node.name_next = FS.nameTable[hash]; + FS.nameTable[hash] = node; + },hashRemoveNode:function (node) { + var hash = FS.hashName(node.parent.id, node.name); + if (FS.nameTable[hash] === node) { + FS.nameTable[hash] = node.name_next; + } else { + var current = FS.nameTable[hash]; + while (current) { + if (current.name_next === node) { + current.name_next = node.name_next; + break; + } + current = current.name_next; + } + } + },lookupNode:function (parent, name) { + var err = FS.mayLookup(parent); + if (err) { + throw new FS.ErrnoError(err, parent); + } + var hash = FS.hashName(parent.id, name); + for (var node = FS.nameTable[hash]; node; node = node.name_next) { + var nodeName = node.name; + if (node.parent.id === parent.id && nodeName === name) { + return node; + } + } + // if we failed to find it in the cache, call into the VFS + return FS.lookup(parent, name); + },createNode:function (parent, name, mode, rdev) { + if (!FS.FSNode) { + FS.FSNode = function(parent, name, mode, rdev) { + if (!parent) { + parent = this; // root node sets parent to itself + } + this.parent = parent; + this.mount = parent.mount; + this.mounted = null; + this.id = FS.nextInode++; + this.name = name; + this.mode = mode; + this.node_ops = {}; + this.stream_ops = {}; + this.rdev = rdev; + }; + + FS.FSNode.prototype = {}; + + // compatibility + var readMode = 292 | 73; + var writeMode = 146; + + // NOTE we must use Object.defineProperties instead of individual calls to + // Object.defineProperty in order to make closure compiler happy + Object.defineProperties(FS.FSNode.prototype, { + read: { + get: function() { return (this.mode & readMode) === readMode; }, + set: function(val) { val ? this.mode |= readMode : this.mode &= ~readMode; } + }, + write: { + get: function() { return (this.mode & writeMode) === writeMode; }, + set: function(val) { val ? this.mode |= writeMode : this.mode &= ~writeMode; } + }, + isFolder: { + get: function() { return FS.isDir(this.mode); } + }, + isDevice: { + get: function() { return FS.isChrdev(this.mode); } + } + }); + } + + var node = new FS.FSNode(parent, name, mode, rdev); + + FS.hashAddNode(node); + + return node; + },destroyNode:function (node) { + FS.hashRemoveNode(node); + },isRoot:function (node) { + return node === node.parent; + },isMountpoint:function (node) { + return !!node.mounted; + },isFile:function (mode) { + return (mode & 61440) === 32768; + },isDir:function (mode) { + return (mode & 61440) === 16384; + },isLink:function (mode) { + return (mode & 61440) === 40960; + },isChrdev:function (mode) { + return (mode & 61440) === 8192; + },isBlkdev:function (mode) { + return (mode & 61440) === 24576; + },isFIFO:function (mode) { + return (mode & 61440) === 4096; + },isSocket:function (mode) { + return (mode & 49152) === 49152; + },flagModes:{"r":0,"rs":1052672,"r+":2,"w":577,"wx":705,"xw":705,"w+":578,"wx+":706,"xw+":706,"a":1089,"ax":1217,"xa":1217,"a+":1090,"ax+":1218,"xa+":1218},modeStringToFlags:function (str) { + var flags = FS.flagModes[str]; + if (typeof flags === 'undefined') { + throw new Error('Unknown file open mode: ' + str); + } + return flags; + },flagsToPermissionString:function (flag) { + var perms = ['r', 'w', 'rw'][flag & 3]; + if ((flag & 512)) { + perms += 'w'; + } + return perms; + },nodePermissions:function (node, perms) { + if (FS.ignorePermissions) { + return 0; + } + // return 0 if any user, group or owner bits are set. + if (perms.indexOf('r') !== -1 && !(node.mode & 292)) { + return 13; + } else if (perms.indexOf('w') !== -1 && !(node.mode & 146)) { + return 13; + } else if (perms.indexOf('x') !== -1 && !(node.mode & 73)) { + return 13; + } + return 0; + },mayLookup:function (dir) { + var err = FS.nodePermissions(dir, 'x'); + if (err) return err; + if (!dir.node_ops.lookup) return 13; + return 0; + },mayCreate:function (dir, name) { + try { + var node = FS.lookupNode(dir, name); + return 17; + } catch (e) { + } + return FS.nodePermissions(dir, 'wx'); + },mayDelete:function (dir, name, isdir) { + var node; + try { + node = FS.lookupNode(dir, name); + } catch (e) { + return e.errno; + } + var err = FS.nodePermissions(dir, 'wx'); + if (err) { + return err; + } + if (isdir) { + if (!FS.isDir(node.mode)) { + return 20; + } + if (FS.isRoot(node) || FS.getPath(node) === FS.cwd()) { + return 16; + } + } else { + if (FS.isDir(node.mode)) { + return 21; + } + } + return 0; + },mayOpen:function (node, flags) { + if (!node) { + return 2; + } + if (FS.isLink(node.mode)) { + return 40; + } else if (FS.isDir(node.mode)) { + if (FS.flagsToPermissionString(flags) !== 'r' || // opening for write + (flags & 512)) { // TODO: check for O_SEARCH? (== search for dir only) + return 21; + } + } + return FS.nodePermissions(node, FS.flagsToPermissionString(flags)); + },MAX_OPEN_FDS:4096,nextfd:function (fd_start, fd_end) { + fd_start = fd_start || 0; + fd_end = fd_end || FS.MAX_OPEN_FDS; + for (var fd = fd_start; fd <= fd_end; fd++) { + if (!FS.streams[fd]) { + return fd; + } + } + throw new FS.ErrnoError(24); + },getStream:function (fd) { + return FS.streams[fd]; + },createStream:function (stream, fd_start, fd_end) { + if (!FS.FSStream) { + FS.FSStream = function(){}; + FS.FSStream.prototype = {}; + // compatibility + Object.defineProperties(FS.FSStream.prototype, { + object: { + get: function() { return this.node; }, + set: function(val) { this.node = val; } + }, + isRead: { + get: function() { return (this.flags & 2097155) !== 1; } + }, + isWrite: { + get: function() { return (this.flags & 2097155) !== 0; } + }, + isAppend: { + get: function() { return (this.flags & 1024); } + } + }); + } + // clone it, so we can return an instance of FSStream + var newStream = new FS.FSStream(); + for (var p in stream) { + newStream[p] = stream[p]; + } + stream = newStream; + var fd = FS.nextfd(fd_start, fd_end); + stream.fd = fd; + FS.streams[fd] = stream; + return stream; + },closeStream:function (fd) { + FS.streams[fd] = null; + },chrdev_stream_ops:{open:function (stream) { + var device = FS.getDevice(stream.node.rdev); + // override node's stream ops with the device's + stream.stream_ops = device.stream_ops; + // forward the open call + if (stream.stream_ops.open) { + stream.stream_ops.open(stream); + } + },llseek:function () { + throw new FS.ErrnoError(29); + }},major:function (dev) { + return ((dev) >> 8); + },minor:function (dev) { + return ((dev) & 0xff); + },makedev:function (ma, mi) { + return ((ma) << 8 | (mi)); + },registerDevice:function (dev, ops) { + FS.devices[dev] = { stream_ops: ops }; + },getDevice:function (dev) { + return FS.devices[dev]; + },getMounts:function (mount) { + var mounts = []; + var check = [mount]; + + while (check.length) { + var m = check.pop(); + + mounts.push(m); + + check.push.apply(check, m.mounts); + } + + return mounts; + },syncfs:function (populate, callback) { + if (typeof(populate) === 'function') { + callback = populate; + populate = false; + } + + FS.syncFSRequests++; + + if (FS.syncFSRequests > 1) { + console.log('warning: ' + FS.syncFSRequests + ' FS.syncfs operations in flight at once, probably just doing extra work'); + } + + var mounts = FS.getMounts(FS.root.mount); + var completed = 0; + + function doCallback(err) { + assert(FS.syncFSRequests > 0); + FS.syncFSRequests--; + return callback(err); + } + + function done(err) { + if (err) { + if (!done.errored) { + done.errored = true; + return doCallback(err); + } + return; + } + if (++completed >= mounts.length) { + doCallback(null); + } + }; + + // sync all mounts + mounts.forEach(function (mount) { + if (!mount.type.syncfs) { + return done(null); + } + mount.type.syncfs(mount, populate, done); + }); + },mount:function (type, opts, mountpoint) { + var root = mountpoint === '/'; + var pseudo = !mountpoint; + var node; + + if (root && FS.root) { + throw new FS.ErrnoError(16); + } else if (!root && !pseudo) { + var lookup = FS.lookupPath(mountpoint, { follow_mount: false }); + + mountpoint = lookup.path; // use the absolute path + node = lookup.node; + + if (FS.isMountpoint(node)) { + throw new FS.ErrnoError(16); + } + + if (!FS.isDir(node.mode)) { + throw new FS.ErrnoError(20); + } + } + + var mount = { + type: type, + opts: opts, + mountpoint: mountpoint, + mounts: [] + }; + + // create a root node for the fs + var mountRoot = type.mount(mount); + mountRoot.mount = mount; + mount.root = mountRoot; + + if (root) { + FS.root = mountRoot; + } else if (node) { + // set as a mountpoint + node.mounted = mount; + + // add the new mount to the current mount's children + if (node.mount) { + node.mount.mounts.push(mount); + } + } + + return mountRoot; + },unmount:function (mountpoint) { + var lookup = FS.lookupPath(mountpoint, { follow_mount: false }); + + if (!FS.isMountpoint(lookup.node)) { + throw new FS.ErrnoError(22); + } + + // destroy the nodes for this mount, and all its child mounts + var node = lookup.node; + var mount = node.mounted; + var mounts = FS.getMounts(mount); + + Object.keys(FS.nameTable).forEach(function (hash) { + var current = FS.nameTable[hash]; + + while (current) { + var next = current.name_next; + + if (mounts.indexOf(current.mount) !== -1) { + FS.destroyNode(current); + } + + current = next; + } + }); + + // no longer a mountpoint + node.mounted = null; + + // remove this mount from the child mounts + var idx = node.mount.mounts.indexOf(mount); + assert(idx !== -1); + node.mount.mounts.splice(idx, 1); + },lookup:function (parent, name) { + return parent.node_ops.lookup(parent, name); + },mknod:function (path, mode, dev) { + var lookup = FS.lookupPath(path, { parent: true }); + var parent = lookup.node; + var name = PATH.basename(path); + if (!name || name === '.' || name === '..') { + throw new FS.ErrnoError(22); + } + var err = FS.mayCreate(parent, name); + if (err) { + throw new FS.ErrnoError(err); + } + if (!parent.node_ops.mknod) { + throw new FS.ErrnoError(1); + } + return parent.node_ops.mknod(parent, name, mode, dev); + },create:function (path, mode) { + mode = mode !== undefined ? mode : 438 /* 0666 */; + mode &= 4095; + mode |= 32768; + return FS.mknod(path, mode, 0); + },mkdir:function (path, mode) { + mode = mode !== undefined ? mode : 511 /* 0777 */; + mode &= 511 | 512; + mode |= 16384; + return FS.mknod(path, mode, 0); + },mkdirTree:function (path, mode) { + var dirs = path.split('/'); + var d = ''; + for (var i = 0; i < dirs.length; ++i) { + if (!dirs[i]) continue; + d += '/' + dirs[i]; + try { + FS.mkdir(d, mode); + } catch(e) { + if (e.errno != 17) throw e; + } + } + },mkdev:function (path, mode, dev) { + if (typeof(dev) === 'undefined') { + dev = mode; + mode = 438 /* 0666 */; + } + mode |= 8192; + return FS.mknod(path, mode, dev); + },symlink:function (oldpath, newpath) { + if (!PATH.resolve(oldpath)) { + throw new FS.ErrnoError(2); + } + var lookup = FS.lookupPath(newpath, { parent: true }); + var parent = lookup.node; + if (!parent) { + throw new FS.ErrnoError(2); + } + var newname = PATH.basename(newpath); + var err = FS.mayCreate(parent, newname); + if (err) { + throw new FS.ErrnoError(err); + } + if (!parent.node_ops.symlink) { + throw new FS.ErrnoError(1); + } + return parent.node_ops.symlink(parent, newname, oldpath); + },rename:function (old_path, new_path) { + var old_dirname = PATH.dirname(old_path); + var new_dirname = PATH.dirname(new_path); + var old_name = PATH.basename(old_path); + var new_name = PATH.basename(new_path); + // parents must exist + var lookup, old_dir, new_dir; + try { + lookup = FS.lookupPath(old_path, { parent: true }); + old_dir = lookup.node; + lookup = FS.lookupPath(new_path, { parent: true }); + new_dir = lookup.node; + } catch (e) { + throw new FS.ErrnoError(16); + } + if (!old_dir || !new_dir) throw new FS.ErrnoError(2); + // need to be part of the same mount + if (old_dir.mount !== new_dir.mount) { + throw new FS.ErrnoError(18); + } + // source must exist + var old_node = FS.lookupNode(old_dir, old_name); + // old path should not be an ancestor of the new path + var relative = PATH.relative(old_path, new_dirname); + if (relative.charAt(0) !== '.') { + throw new FS.ErrnoError(22); + } + // new path should not be an ancestor of the old path + relative = PATH.relative(new_path, old_dirname); + if (relative.charAt(0) !== '.') { + throw new FS.ErrnoError(39); + } + // see if the new path already exists + var new_node; + try { + new_node = FS.lookupNode(new_dir, new_name); + } catch (e) { + // not fatal + } + // early out if nothing needs to change + if (old_node === new_node) { + return; + } + // we'll need to delete the old entry + var isdir = FS.isDir(old_node.mode); + var err = FS.mayDelete(old_dir, old_name, isdir); + if (err) { + throw new FS.ErrnoError(err); + } + // need delete permissions if we'll be overwriting. + // need create permissions if new doesn't already exist. + err = new_node ? + FS.mayDelete(new_dir, new_name, isdir) : + FS.mayCreate(new_dir, new_name); + if (err) { + throw new FS.ErrnoError(err); + } + if (!old_dir.node_ops.rename) { + throw new FS.ErrnoError(1); + } + if (FS.isMountpoint(old_node) || (new_node && FS.isMountpoint(new_node))) { + throw new FS.ErrnoError(16); + } + // if we are going to change the parent, check write permissions + if (new_dir !== old_dir) { + err = FS.nodePermissions(old_dir, 'w'); + if (err) { + throw new FS.ErrnoError(err); + } + } + try { + if (FS.trackingDelegate['willMovePath']) { + FS.trackingDelegate['willMovePath'](old_path, new_path); + } + } catch(e) { + console.log("FS.trackingDelegate['willMovePath']('"+old_path+"', '"+new_path+"') threw an exception: " + e.message); + } + // remove the node from the lookup hash + FS.hashRemoveNode(old_node); + // do the underlying fs rename + try { + old_dir.node_ops.rename(old_node, new_dir, new_name); + } catch (e) { + throw e; + } finally { + // add the node back to the hash (in case node_ops.rename + // changed its name) + FS.hashAddNode(old_node); + } + try { + if (FS.trackingDelegate['onMovePath']) FS.trackingDelegate['onMovePath'](old_path, new_path); + } catch(e) { + console.log("FS.trackingDelegate['onMovePath']('"+old_path+"', '"+new_path+"') threw an exception: " + e.message); + } + },rmdir:function (path) { + var lookup = FS.lookupPath(path, { parent: true }); + var parent = lookup.node; + var name = PATH.basename(path); + var node = FS.lookupNode(parent, name); + var err = FS.mayDelete(parent, name, true); + if (err) { + throw new FS.ErrnoError(err); + } + if (!parent.node_ops.rmdir) { + throw new FS.ErrnoError(1); + } + if (FS.isMountpoint(node)) { + throw new FS.ErrnoError(16); + } + try { + if (FS.trackingDelegate['willDeletePath']) { + FS.trackingDelegate['willDeletePath'](path); + } + } catch(e) { + console.log("FS.trackingDelegate['willDeletePath']('"+path+"') threw an exception: " + e.message); + } + parent.node_ops.rmdir(parent, name); + FS.destroyNode(node); + try { + if (FS.trackingDelegate['onDeletePath']) FS.trackingDelegate['onDeletePath'](path); + } catch(e) { + console.log("FS.trackingDelegate['onDeletePath']('"+path+"') threw an exception: " + e.message); + } + },readdir:function (path) { + var lookup = FS.lookupPath(path, { follow: true }); + var node = lookup.node; + if (!node.node_ops.readdir) { + throw new FS.ErrnoError(20); + } + return node.node_ops.readdir(node); + },unlink:function (path) { + var lookup = FS.lookupPath(path, { parent: true }); + var parent = lookup.node; + var name = PATH.basename(path); + var node = FS.lookupNode(parent, name); + var err = FS.mayDelete(parent, name, false); + if (err) { + // According to POSIX, we should map EISDIR to EPERM, but + // we instead do what Linux does (and we must, as we use + // the musl linux libc). + throw new FS.ErrnoError(err); + } + if (!parent.node_ops.unlink) { + throw new FS.ErrnoError(1); + } + if (FS.isMountpoint(node)) { + throw new FS.ErrnoError(16); + } + try { + if (FS.trackingDelegate['willDeletePath']) { + FS.trackingDelegate['willDeletePath'](path); + } + } catch(e) { + console.log("FS.trackingDelegate['willDeletePath']('"+path+"') threw an exception: " + e.message); + } + parent.node_ops.unlink(parent, name); + FS.destroyNode(node); + try { + if (FS.trackingDelegate['onDeletePath']) FS.trackingDelegate['onDeletePath'](path); + } catch(e) { + console.log("FS.trackingDelegate['onDeletePath']('"+path+"') threw an exception: " + e.message); + } + },readlink:function (path) { + var lookup = FS.lookupPath(path); + var link = lookup.node; + if (!link) { + throw new FS.ErrnoError(2); + } + if (!link.node_ops.readlink) { + throw new FS.ErrnoError(22); + } + return PATH.resolve(FS.getPath(link.parent), link.node_ops.readlink(link)); + },stat:function (path, dontFollow) { + var lookup = FS.lookupPath(path, { follow: !dontFollow }); + var node = lookup.node; + if (!node) { + throw new FS.ErrnoError(2); + } + if (!node.node_ops.getattr) { + throw new FS.ErrnoError(1); + } + return node.node_ops.getattr(node); + },lstat:function (path) { + return FS.stat(path, true); + },chmod:function (path, mode, dontFollow) { + var node; + if (typeof path === 'string') { + var lookup = FS.lookupPath(path, { follow: !dontFollow }); + node = lookup.node; + } else { + node = path; + } + if (!node.node_ops.setattr) { + throw new FS.ErrnoError(1); + } + node.node_ops.setattr(node, { + mode: (mode & 4095) | (node.mode & ~4095), + timestamp: Date.now() + }); + },lchmod:function (path, mode) { + FS.chmod(path, mode, true); + },fchmod:function (fd, mode) { + var stream = FS.getStream(fd); + if (!stream) { + throw new FS.ErrnoError(9); + } + FS.chmod(stream.node, mode); + },chown:function (path, uid, gid, dontFollow) { + var node; + if (typeof path === 'string') { + var lookup = FS.lookupPath(path, { follow: !dontFollow }); + node = lookup.node; + } else { + node = path; + } + if (!node.node_ops.setattr) { + throw new FS.ErrnoError(1); + } + node.node_ops.setattr(node, { + timestamp: Date.now() + // we ignore the uid / gid for now + }); + },lchown:function (path, uid, gid) { + FS.chown(path, uid, gid, true); + },fchown:function (fd, uid, gid) { + var stream = FS.getStream(fd); + if (!stream) { + throw new FS.ErrnoError(9); + } + FS.chown(stream.node, uid, gid); + },truncate:function (path, len) { + if (len < 0) { + throw new FS.ErrnoError(22); + } + var node; + if (typeof path === 'string') { + var lookup = FS.lookupPath(path, { follow: true }); + node = lookup.node; + } else { + node = path; + } + if (!node.node_ops.setattr) { + throw new FS.ErrnoError(1); + } + if (FS.isDir(node.mode)) { + throw new FS.ErrnoError(21); + } + if (!FS.isFile(node.mode)) { + throw new FS.ErrnoError(22); + } + var err = FS.nodePermissions(node, 'w'); + if (err) { + throw new FS.ErrnoError(err); + } + node.node_ops.setattr(node, { + size: len, + timestamp: Date.now() + }); + },ftruncate:function (fd, len) { + var stream = FS.getStream(fd); + if (!stream) { + throw new FS.ErrnoError(9); + } + if ((stream.flags & 2097155) === 0) { + throw new FS.ErrnoError(22); + } + FS.truncate(stream.node, len); + },utime:function (path, atime, mtime) { + var lookup = FS.lookupPath(path, { follow: true }); + var node = lookup.node; + node.node_ops.setattr(node, { + timestamp: Math.max(atime, mtime) + }); + },open:function (path, flags, mode, fd_start, fd_end) { + if (path === "") { + throw new FS.ErrnoError(2); + } + flags = typeof flags === 'string' ? FS.modeStringToFlags(flags) : flags; + mode = typeof mode === 'undefined' ? 438 /* 0666 */ : mode; + if ((flags & 64)) { + mode = (mode & 4095) | 32768; + } else { + mode = 0; + } + var node; + if (typeof path === 'object') { + node = path; + } else { + path = PATH.normalize(path); + try { + var lookup = FS.lookupPath(path, { + follow: !(flags & 131072) + }); + node = lookup.node; + } catch (e) { + // ignore + } + } + // perhaps we need to create the node + var created = false; + if ((flags & 64)) { + if (node) { + // if O_CREAT and O_EXCL are set, error out if the node already exists + if ((flags & 128)) { + throw new FS.ErrnoError(17); + } + } else { + // node doesn't exist, try to create it + node = FS.mknod(path, mode, 0); + created = true; + } + } + if (!node) { + throw new FS.ErrnoError(2); + } + // can't truncate a device + if (FS.isChrdev(node.mode)) { + flags &= ~512; + } + // if asked only for a directory, then this must be one + if ((flags & 65536) && !FS.isDir(node.mode)) { + throw new FS.ErrnoError(20); + } + // check permissions, if this is not a file we just created now (it is ok to + // create and write to a file with read-only permissions; it is read-only + // for later use) + if (!created) { + var err = FS.mayOpen(node, flags); + if (err) { + throw new FS.ErrnoError(err); + } + } + // do truncation if necessary + if ((flags & 512)) { + FS.truncate(node, 0); + } + // we've already handled these, don't pass down to the underlying vfs + flags &= ~(128 | 512); + + // register the stream with the filesystem + var stream = FS.createStream({ + node: node, + path: FS.getPath(node), // we want the absolute path to the node + flags: flags, + seekable: true, + position: 0, + stream_ops: node.stream_ops, + // used by the file family libc calls (fopen, fwrite, ferror, etc.) + ungotten: [], + error: false + }, fd_start, fd_end); + // call the new stream's open function + if (stream.stream_ops.open) { + stream.stream_ops.open(stream); + } + if (Module['logReadFiles'] && !(flags & 1)) { + if (!FS.readFiles) FS.readFiles = {}; + if (!(path in FS.readFiles)) { + FS.readFiles[path] = 1; + console.log("FS.trackingDelegate error on read file: " + path); + } + } + try { + if (FS.trackingDelegate['onOpenFile']) { + var trackingFlags = 0; + if ((flags & 2097155) !== 1) { + trackingFlags |= FS.tracking.openFlags.READ; + } + if ((flags & 2097155) !== 0) { + trackingFlags |= FS.tracking.openFlags.WRITE; + } + FS.trackingDelegate['onOpenFile'](path, trackingFlags); + } + } catch(e) { + console.log("FS.trackingDelegate['onOpenFile']('"+path+"', flags) threw an exception: " + e.message); + } + return stream; + },close:function (stream) { + if (FS.isClosed(stream)) { + throw new FS.ErrnoError(9); + } + if (stream.getdents) stream.getdents = null; // free readdir state + try { + if (stream.stream_ops.close) { + stream.stream_ops.close(stream); + } + } catch (e) { + throw e; + } finally { + FS.closeStream(stream.fd); + } + stream.fd = null; + },isClosed:function (stream) { + return stream.fd === null; + },llseek:function (stream, offset, whence) { + if (FS.isClosed(stream)) { + throw new FS.ErrnoError(9); + } + if (!stream.seekable || !stream.stream_ops.llseek) { + throw new FS.ErrnoError(29); + } + if (whence != 0 /* SEEK_SET */ && whence != 1 /* SEEK_CUR */ && whence != 2 /* SEEK_END */) { + throw new FS.ErrnoError(22); + } + stream.position = stream.stream_ops.llseek(stream, offset, whence); + stream.ungotten = []; + return stream.position; + },read:function (stream, buffer, offset, length, position) { + if (length < 0 || position < 0) { + throw new FS.ErrnoError(22); + } + if (FS.isClosed(stream)) { + throw new FS.ErrnoError(9); + } + if ((stream.flags & 2097155) === 1) { + throw new FS.ErrnoError(9); + } + if (FS.isDir(stream.node.mode)) { + throw new FS.ErrnoError(21); + } + if (!stream.stream_ops.read) { + throw new FS.ErrnoError(22); + } + var seeking = typeof position !== 'undefined'; + if (!seeking) { + position = stream.position; + } else if (!stream.seekable) { + throw new FS.ErrnoError(29); + } + var bytesRead = stream.stream_ops.read(stream, buffer, offset, length, position); + if (!seeking) stream.position += bytesRead; + return bytesRead; + },write:function (stream, buffer, offset, length, position, canOwn) { + if (length < 0 || position < 0) { + throw new FS.ErrnoError(22); + } + if (FS.isClosed(stream)) { + throw new FS.ErrnoError(9); + } + if ((stream.flags & 2097155) === 0) { + throw new FS.ErrnoError(9); + } + if (FS.isDir(stream.node.mode)) { + throw new FS.ErrnoError(21); + } + if (!stream.stream_ops.write) { + throw new FS.ErrnoError(22); + } + if (stream.flags & 1024) { + // seek to the end before writing in append mode + FS.llseek(stream, 0, 2); + } + var seeking = typeof position !== 'undefined'; + if (!seeking) { + position = stream.position; + } else if (!stream.seekable) { + throw new FS.ErrnoError(29); + } + var bytesWritten = stream.stream_ops.write(stream, buffer, offset, length, position, canOwn); + if (!seeking) stream.position += bytesWritten; + try { + if (stream.path && FS.trackingDelegate['onWriteToFile']) FS.trackingDelegate['onWriteToFile'](stream.path); + } catch(e) { + console.log("FS.trackingDelegate['onWriteToFile']('"+stream.path+"') threw an exception: " + e.message); + } + return bytesWritten; + },allocate:function (stream, offset, length) { + if (FS.isClosed(stream)) { + throw new FS.ErrnoError(9); + } + if (offset < 0 || length <= 0) { + throw new FS.ErrnoError(22); + } + if ((stream.flags & 2097155) === 0) { + throw new FS.ErrnoError(9); + } + if (!FS.isFile(stream.node.mode) && !FS.isDir(stream.node.mode)) { + throw new FS.ErrnoError(19); + } + if (!stream.stream_ops.allocate) { + throw new FS.ErrnoError(95); + } + stream.stream_ops.allocate(stream, offset, length); + },mmap:function (stream, buffer, offset, length, position, prot, flags) { + // TODO if PROT is PROT_WRITE, make sure we have write access + if ((stream.flags & 2097155) === 1) { + throw new FS.ErrnoError(13); + } + if (!stream.stream_ops.mmap) { + throw new FS.ErrnoError(19); + } + return stream.stream_ops.mmap(stream, buffer, offset, length, position, prot, flags); + },msync:function (stream, buffer, offset, length, mmapFlags) { + if (!stream || !stream.stream_ops.msync) { + return 0; + } + return stream.stream_ops.msync(stream, buffer, offset, length, mmapFlags); + },munmap:function (stream) { + return 0; + },ioctl:function (stream, cmd, arg) { + if (!stream.stream_ops.ioctl) { + throw new FS.ErrnoError(25); + } + return stream.stream_ops.ioctl(stream, cmd, arg); + },readFile:function (path, opts) { + opts = opts || {}; + opts.flags = opts.flags || 'r'; + opts.encoding = opts.encoding || 'binary'; + if (opts.encoding !== 'utf8' && opts.encoding !== 'binary') { + throw new Error('Invalid encoding type "' + opts.encoding + '"'); + } + var ret; + var stream = FS.open(path, opts.flags); + var stat = FS.stat(path); + var length = stat.size; + var buf = new Uint8Array(length); + FS.read(stream, buf, 0, length, 0); + if (opts.encoding === 'utf8') { + ret = UTF8ArrayToString(buf, 0); + } else if (opts.encoding === 'binary') { + ret = buf; + } + FS.close(stream); + return ret; + },writeFile:function (path, data, opts) { + opts = opts || {}; + opts.flags = opts.flags || 'w'; + var stream = FS.open(path, opts.flags, opts.mode); + if (typeof data === 'string') { + var buf = new Uint8Array(lengthBytesUTF8(data)+1); + var actualNumBytes = stringToUTF8Array(data, buf, 0, buf.length); + FS.write(stream, buf, 0, actualNumBytes, undefined, opts.canOwn); + } else if (ArrayBuffer.isView(data)) { + FS.write(stream, data, 0, data.byteLength, undefined, opts.canOwn); + } else { + throw new Error('Unsupported data type'); + } + FS.close(stream); + },cwd:function () { + return FS.currentPath; + },chdir:function (path) { + var lookup = FS.lookupPath(path, { follow: true }); + if (lookup.node === null) { + throw new FS.ErrnoError(2); + } + if (!FS.isDir(lookup.node.mode)) { + throw new FS.ErrnoError(20); + } + var err = FS.nodePermissions(lookup.node, 'x'); + if (err) { + throw new FS.ErrnoError(err); + } + FS.currentPath = lookup.path; + },createDefaultDirectories:function () { + FS.mkdir('/tmp'); + FS.mkdir('/home'); + FS.mkdir('/home/web_user'); + },createDefaultDevices:function () { + // create /dev + FS.mkdir('/dev'); + // setup /dev/null + FS.registerDevice(FS.makedev(1, 3), { + read: function() { return 0; }, + write: function(stream, buffer, offset, length, pos) { return length; } + }); + FS.mkdev('/dev/null', FS.makedev(1, 3)); + // setup /dev/tty and /dev/tty1 + // stderr needs to print output using Module['printErr'] + // so we register a second tty just for it. + TTY.register(FS.makedev(5, 0), TTY.default_tty_ops); + TTY.register(FS.makedev(6, 0), TTY.default_tty1_ops); + FS.mkdev('/dev/tty', FS.makedev(5, 0)); + FS.mkdev('/dev/tty1', FS.makedev(6, 0)); + // setup /dev/[u]random + var random_device; + if (typeof crypto === 'object' && typeof crypto['getRandomValues'] === 'function') { + // for modern web browsers + var randomBuffer = new Uint8Array(1); + random_device = function() { crypto.getRandomValues(randomBuffer); return randomBuffer[0]; }; + } else + if (ENVIRONMENT_IS_NODE) { + // for nodejs with or without crypto support included + try { + var crypto_module = require('crypto'); + // nodejs has crypto support + random_device = function() { return crypto_module['randomBytes'](1)[0]; }; + } catch (e) { + // nodejs doesn't have crypto support + } + } else + {} + if (!random_device) { + // we couldn't find a proper implementation, as Math.random() is not suitable for /dev/random, see emscripten-core/emscripten/pull/7096 + random_device = function() { abort("no cryptographic support found for random_device. consider polyfilling it if you want to use something insecure like Math.random(), e.g. put this in a --pre-js: var crypto = { getRandomValues: function(array) { for (var i = 0; i < array.length; i++) array[i] = (Math.random()*256)|0 } };"); }; + } + FS.createDevice('/dev', 'random', random_device); + FS.createDevice('/dev', 'urandom', random_device); + // we're not going to emulate the actual shm device, + // just create the tmp dirs that reside in it commonly + FS.mkdir('/dev/shm'); + FS.mkdir('/dev/shm/tmp'); + },createSpecialDirectories:function () { + // create /proc/self/fd which allows /proc/self/fd/6 => readlink gives the name of the stream for fd 6 (see test_unistd_ttyname) + FS.mkdir('/proc'); + FS.mkdir('/proc/self'); + FS.mkdir('/proc/self/fd'); + FS.mount({ + mount: function() { + var node = FS.createNode('/proc/self', 'fd', 16384 | 511 /* 0777 */, 73); + node.node_ops = { + lookup: function(parent, name) { + var fd = +name; + var stream = FS.getStream(fd); + if (!stream) throw new FS.ErrnoError(9); + var ret = { + parent: null, + mount: { mountpoint: 'fake' }, + node_ops: { readlink: function() { return stream.path } } + }; + ret.parent = ret; // make it look like a simple root node + return ret; + } + }; + return node; + } + }, {}, '/proc/self/fd'); + },createStandardStreams:function () { + // TODO deprecate the old functionality of a single + // input / output callback and that utilizes FS.createDevice + // and instead require a unique set of stream ops + + // by default, we symlink the standard streams to the + // default tty devices. however, if the standard streams + // have been overwritten we create a unique device for + // them instead. + if (Module['stdin']) { + FS.createDevice('/dev', 'stdin', Module['stdin']); + } else { + FS.symlink('/dev/tty', '/dev/stdin'); + } + if (Module['stdout']) { + FS.createDevice('/dev', 'stdout', null, Module['stdout']); + } else { + FS.symlink('/dev/tty', '/dev/stdout'); + } + if (Module['stderr']) { + FS.createDevice('/dev', 'stderr', null, Module['stderr']); + } else { + FS.symlink('/dev/tty1', '/dev/stderr'); + } + + // open default streams for the stdin, stdout and stderr devices + var stdin = FS.open('/dev/stdin', 'r'); + var stdout = FS.open('/dev/stdout', 'w'); + var stderr = FS.open('/dev/stderr', 'w'); + assert(stdin.fd === 0, 'invalid handle for stdin (' + stdin.fd + ')'); + assert(stdout.fd === 1, 'invalid handle for stdout (' + stdout.fd + ')'); + assert(stderr.fd === 2, 'invalid handle for stderr (' + stderr.fd + ')'); + },ensureErrnoError:function () { + if (FS.ErrnoError) return; + FS.ErrnoError = function ErrnoError(errno, node) { + this.node = node; + this.setErrno = function(errno) { + this.errno = errno; + for (var key in ERRNO_CODES) { + if (ERRNO_CODES[key] === errno) { + this.code = key; + break; + } + } + }; + this.setErrno(errno); + this.message = ERRNO_MESSAGES[errno]; + // Node.js compatibility: assigning on this.stack fails on Node 4 (but fixed on Node 8) + if (this.stack) Object.defineProperty(this, "stack", { value: (new Error).stack, writable: true }); + if (this.stack) this.stack = demangleAll(this.stack); + }; + FS.ErrnoError.prototype = new Error(); + FS.ErrnoError.prototype.constructor = FS.ErrnoError; + // Some errors may happen quite a bit, to avoid overhead we reuse them (and suffer a lack of stack info) + [2].forEach(function(code) { + FS.genericErrors[code] = new FS.ErrnoError(code); + FS.genericErrors[code].stack = ''; + }); + },staticInit:function () { + FS.ensureErrnoError(); + + FS.nameTable = new Array(4096); + + FS.mount(MEMFS, {}, '/'); + + FS.createDefaultDirectories(); + FS.createDefaultDevices(); + FS.createSpecialDirectories(); + + FS.filesystems = { + 'MEMFS': MEMFS, + 'IDBFS': IDBFS, + 'NODEFS': NODEFS, + 'WORKERFS': WORKERFS, + }; + },init:function (input, output, error) { + assert(!FS.init.initialized, 'FS.init was previously called. If you want to initialize later with custom parameters, remove any earlier calls (note that one is automatically added to the generated code)'); + FS.init.initialized = true; + + FS.ensureErrnoError(); + + // Allow Module.stdin etc. to provide defaults, if none explicitly passed to us here + Module['stdin'] = input || Module['stdin']; + Module['stdout'] = output || Module['stdout']; + Module['stderr'] = error || Module['stderr']; + + FS.createStandardStreams(); + },quit:function () { + FS.init.initialized = false; + // force-flush all streams, so we get musl std streams printed out + var fflush = Module['_fflush']; + if (fflush) fflush(0); + // close all of our streams + for (var i = 0; i < FS.streams.length; i++) { + var stream = FS.streams[i]; + if (!stream) { + continue; + } + FS.close(stream); + } + },getMode:function (canRead, canWrite) { + var mode = 0; + if (canRead) mode |= 292 | 73; + if (canWrite) mode |= 146; + return mode; + },joinPath:function (parts, forceRelative) { + var path = PATH.join.apply(null, parts); + if (forceRelative && path[0] == '/') path = path.substr(1); + return path; + },absolutePath:function (relative, base) { + return PATH.resolve(base, relative); + },standardizePath:function (path) { + return PATH.normalize(path); + },findObject:function (path, dontResolveLastLink) { + var ret = FS.analyzePath(path, dontResolveLastLink); + if (ret.exists) { + return ret.object; + } else { + ___setErrNo(ret.error); + return null; + } + },analyzePath:function (path, dontResolveLastLink) { + // operate from within the context of the symlink's target + try { + var lookup = FS.lookupPath(path, { follow: !dontResolveLastLink }); + path = lookup.path; + } catch (e) { + } + var ret = { + isRoot: false, exists: false, error: 0, name: null, path: null, object: null, + parentExists: false, parentPath: null, parentObject: null + }; + try { + var lookup = FS.lookupPath(path, { parent: true }); + ret.parentExists = true; + ret.parentPath = lookup.path; + ret.parentObject = lookup.node; + ret.name = PATH.basename(path); + lookup = FS.lookupPath(path, { follow: !dontResolveLastLink }); + ret.exists = true; + ret.path = lookup.path; + ret.object = lookup.node; + ret.name = lookup.node.name; + ret.isRoot = lookup.path === '/'; + } catch (e) { + ret.error = e.errno; + }; + return ret; + },createFolder:function (parent, name, canRead, canWrite) { + var path = PATH.join2(typeof parent === 'string' ? parent : FS.getPath(parent), name); + var mode = FS.getMode(canRead, canWrite); + return FS.mkdir(path, mode); + },createPath:function (parent, path, canRead, canWrite) { + parent = typeof parent === 'string' ? parent : FS.getPath(parent); + var parts = path.split('/').reverse(); + while (parts.length) { + var part = parts.pop(); + if (!part) continue; + var current = PATH.join2(parent, part); + try { + FS.mkdir(current); + } catch (e) { + // ignore EEXIST + } + parent = current; + } + return current; + },createFile:function (parent, name, properties, canRead, canWrite) { + var path = PATH.join2(typeof parent === 'string' ? parent : FS.getPath(parent), name); + var mode = FS.getMode(canRead, canWrite); + return FS.create(path, mode); + },createDataFile:function (parent, name, data, canRead, canWrite, canOwn) { + var path = name ? PATH.join2(typeof parent === 'string' ? parent : FS.getPath(parent), name) : parent; + var mode = FS.getMode(canRead, canWrite); + var node = FS.create(path, mode); + if (data) { + if (typeof data === 'string') { + var arr = new Array(data.length); + for (var i = 0, len = data.length; i < len; ++i) arr[i] = data.charCodeAt(i); + data = arr; + } + // make sure we can write to the file + FS.chmod(node, mode | 146); + var stream = FS.open(node, 'w'); + FS.write(stream, data, 0, data.length, 0, canOwn); + FS.close(stream); + FS.chmod(node, mode); + } + return node; + },createDevice:function (parent, name, input, output) { + var path = PATH.join2(typeof parent === 'string' ? parent : FS.getPath(parent), name); + var mode = FS.getMode(!!input, !!output); + if (!FS.createDevice.major) FS.createDevice.major = 64; + var dev = FS.makedev(FS.createDevice.major++, 0); + // Create a fake device that a set of stream ops to emulate + // the old behavior. + FS.registerDevice(dev, { + open: function(stream) { + stream.seekable = false; + }, + close: function(stream) { + // flush any pending line data + if (output && output.buffer && output.buffer.length) { + output(10); + } + }, + read: function(stream, buffer, offset, length, pos /* ignored */) { + var bytesRead = 0; + for (var i = 0; i < length; i++) { + var result; + try { + result = input(); + } catch (e) { + throw new FS.ErrnoError(5); + } + if (result === undefined && bytesRead === 0) { + throw new FS.ErrnoError(11); + } + if (result === null || result === undefined) break; + bytesRead++; + buffer[offset+i] = result; + } + if (bytesRead) { + stream.node.timestamp = Date.now(); + } + return bytesRead; + }, + write: function(stream, buffer, offset, length, pos) { + for (var i = 0; i < length; i++) { + try { + output(buffer[offset+i]); + } catch (e) { + throw new FS.ErrnoError(5); + } + } + if (length) { + stream.node.timestamp = Date.now(); + } + return i; + } + }); + return FS.mkdev(path, mode, dev); + },createLink:function (parent, name, target, canRead, canWrite) { + var path = PATH.join2(typeof parent === 'string' ? parent : FS.getPath(parent), name); + return FS.symlink(target, path); + },forceLoadFile:function (obj) { + if (obj.isDevice || obj.isFolder || obj.link || obj.contents) return true; + var success = true; + if (typeof XMLHttpRequest !== 'undefined') { + throw new Error("Lazy loading should have been performed (contents set) in createLazyFile, but it was not. Lazy loading only works in web workers. Use --embed-file or --preload-file in emcc on the main thread."); + } else if (Module['read']) { + // Command-line. + try { + // WARNING: Can't read binary files in V8's d8 or tracemonkey's js, as + // read() will try to parse UTF8. + obj.contents = intArrayFromString(Module['read'](obj.url), true); + obj.usedBytes = obj.contents.length; + } catch (e) { + success = false; + } + } else { + throw new Error('Cannot load without read() or XMLHttpRequest.'); + } + if (!success) ___setErrNo(5); + return success; + },createLazyFile:function (parent, name, url, canRead, canWrite) { + // Lazy chunked Uint8Array (implements get and length from Uint8Array). Actual getting is abstracted away for eventual reuse. + function LazyUint8Array() { + this.lengthKnown = false; + this.chunks = []; // Loaded chunks. Index is the chunk number + } + LazyUint8Array.prototype.get = function LazyUint8Array_get(idx) { + if (idx > this.length-1 || idx < 0) { + return undefined; + } + var chunkOffset = idx % this.chunkSize; + var chunkNum = (idx / this.chunkSize)|0; + return this.getter(chunkNum)[chunkOffset]; + } + LazyUint8Array.prototype.setDataGetter = function LazyUint8Array_setDataGetter(getter) { + this.getter = getter; + } + LazyUint8Array.prototype.cacheLength = function LazyUint8Array_cacheLength() { + // Find length + var xhr = new XMLHttpRequest(); + xhr.open('HEAD', url, false); + xhr.send(null); + if (!(xhr.status >= 200 && xhr.status < 300 || xhr.status === 304)) throw new Error("Couldn't load " + url + ". Status: " + xhr.status); + var datalength = Number(xhr.getResponseHeader("Content-length")); + var header; + var hasByteServing = (header = xhr.getResponseHeader("Accept-Ranges")) && header === "bytes"; + var usesGzip = (header = xhr.getResponseHeader("Content-Encoding")) && header === "gzip"; + + var chunkSize = 1024*1024; // Chunk size in bytes + + if (!hasByteServing) chunkSize = datalength; + + // Function to get a range from the remote URL. + var doXHR = (function(from, to) { + if (from > to) throw new Error("invalid range (" + from + ", " + to + ") or no bytes requested!"); + if (to > datalength-1) throw new Error("only " + datalength + " bytes available! programmer error!"); + + // TODO: Use mozResponseArrayBuffer, responseStream, etc. if available. + var xhr = new XMLHttpRequest(); + xhr.open('GET', url, false); + if (datalength !== chunkSize) xhr.setRequestHeader("Range", "bytes=" + from + "-" + to); + + // Some hints to the browser that we want binary data. + if (typeof Uint8Array != 'undefined') xhr.responseType = 'arraybuffer'; + if (xhr.overrideMimeType) { + xhr.overrideMimeType('text/plain; charset=x-user-defined'); + } + + xhr.send(null); + if (!(xhr.status >= 200 && xhr.status < 300 || xhr.status === 304)) throw new Error("Couldn't load " + url + ". Status: " + xhr.status); + if (xhr.response !== undefined) { + return new Uint8Array(xhr.response || []); + } else { + return intArrayFromString(xhr.responseText || '', true); + } + }); + var lazyArray = this; + lazyArray.setDataGetter(function(chunkNum) { + var start = chunkNum * chunkSize; + var end = (chunkNum+1) * chunkSize - 1; // including this byte + end = Math.min(end, datalength-1); // if datalength-1 is selected, this is the last block + if (typeof(lazyArray.chunks[chunkNum]) === "undefined") { + lazyArray.chunks[chunkNum] = doXHR(start, end); + } + if (typeof(lazyArray.chunks[chunkNum]) === "undefined") throw new Error("doXHR failed!"); + return lazyArray.chunks[chunkNum]; + }); + + if (usesGzip || !datalength) { + // if the server uses gzip or doesn't supply the length, we have to download the whole file to get the (uncompressed) length + chunkSize = datalength = 1; // this will force getter(0)/doXHR do download the whole file + datalength = this.getter(0).length; + chunkSize = datalength; + console.log("LazyFiles on gzip forces download of the whole file when length is accessed"); + } + + this._length = datalength; + this._chunkSize = chunkSize; + this.lengthKnown = true; + } + if (typeof XMLHttpRequest !== 'undefined') { + if (!ENVIRONMENT_IS_WORKER) throw 'Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc'; + var lazyArray = new LazyUint8Array(); + Object.defineProperties(lazyArray, { + length: { + get: function() { + if(!this.lengthKnown) { + this.cacheLength(); + } + return this._length; + } + }, + chunkSize: { + get: function() { + if(!this.lengthKnown) { + this.cacheLength(); + } + return this._chunkSize; + } + } + }); + + var properties = { isDevice: false, contents: lazyArray }; + } else { + var properties = { isDevice: false, url: url }; + } + + var node = FS.createFile(parent, name, properties, canRead, canWrite); + // This is a total hack, but I want to get this lazy file code out of the + // core of MEMFS. If we want to keep this lazy file concept I feel it should + // be its own thin LAZYFS proxying calls to MEMFS. + if (properties.contents) { + node.contents = properties.contents; + } else if (properties.url) { + node.contents = null; + node.url = properties.url; + } + // Add a function that defers querying the file size until it is asked the first time. + Object.defineProperties(node, { + usedBytes: { + get: function() { return this.contents.length; } + } + }); + // override each stream op with one that tries to force load the lazy file first + var stream_ops = {}; + var keys = Object.keys(node.stream_ops); + keys.forEach(function(key) { + var fn = node.stream_ops[key]; + stream_ops[key] = function forceLoadLazyFile() { + if (!FS.forceLoadFile(node)) { + throw new FS.ErrnoError(5); + } + return fn.apply(null, arguments); + }; + }); + // use a custom read function + stream_ops.read = function stream_ops_read(stream, buffer, offset, length, position) { + if (!FS.forceLoadFile(node)) { + throw new FS.ErrnoError(5); + } + var contents = stream.node.contents; + if (position >= contents.length) + return 0; + var size = Math.min(contents.length - position, length); + assert(size >= 0); + if (contents.slice) { // normal array + for (var i = 0; i < size; i++) { + buffer[offset + i] = contents[position + i]; + } + } else { + for (var i = 0; i < size; i++) { // LazyUint8Array from sync binary XHR + buffer[offset + i] = contents.get(position + i); + } + } + return size; + }; + node.stream_ops = stream_ops; + return node; + },createPreloadedFile:function (parent, name, url, canRead, canWrite, onload, onerror, dontCreateFile, canOwn, preFinish) { + Browser.init(); // XXX perhaps this method should move onto Browser? + // TODO we should allow people to just pass in a complete filename instead + // of parent and name being that we just join them anyways + var fullname = name ? PATH.resolve(PATH.join2(parent, name)) : parent; + var dep = getUniqueRunDependency('cp ' + fullname); // might have several active requests for the same fullname + function processData(byteArray) { + function finish(byteArray) { + if (preFinish) preFinish(); + if (!dontCreateFile) { + FS.createDataFile(parent, name, byteArray, canRead, canWrite, canOwn); + } + if (onload) onload(); + removeRunDependency(dep); + } + var handled = false; + Module['preloadPlugins'].forEach(function(plugin) { + if (handled) return; + if (plugin['canHandle'](fullname)) { + plugin['handle'](byteArray, fullname, finish, function() { + if (onerror) onerror(); + removeRunDependency(dep); + }); + handled = true; + } + }); + if (!handled) finish(byteArray); + } + addRunDependency(dep); + if (typeof url == 'string') { + Browser.asyncLoad(url, function(byteArray) { + processData(byteArray); + }, onerror); + } else { + processData(url); + } + },indexedDB:function () { + return window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB; + },DB_NAME:function () { + return 'EM_FS_' + window.location.pathname; + },DB_VERSION:20,DB_STORE_NAME:"FILE_DATA",saveFilesToDB:function (paths, onload, onerror) { + onload = onload || function(){}; + onerror = onerror || function(){}; + var indexedDB = FS.indexedDB(); + try { + var openRequest = indexedDB.open(FS.DB_NAME(), FS.DB_VERSION); + } catch (e) { + return onerror(e); + } + openRequest.onupgradeneeded = function openRequest_onupgradeneeded() { + console.log('creating db'); + var db = openRequest.result; + db.createObjectStore(FS.DB_STORE_NAME); + }; + openRequest.onsuccess = function openRequest_onsuccess() { + var db = openRequest.result; + var transaction = db.transaction([FS.DB_STORE_NAME], 'readwrite'); + var files = transaction.objectStore(FS.DB_STORE_NAME); + var ok = 0, fail = 0, total = paths.length; + function finish() { + if (fail == 0) onload(); else onerror(); + } + paths.forEach(function(path) { + var putRequest = files.put(FS.analyzePath(path).object.contents, path); + putRequest.onsuccess = function putRequest_onsuccess() { ok++; if (ok + fail == total) finish() }; + putRequest.onerror = function putRequest_onerror() { fail++; if (ok + fail == total) finish() }; + }); + transaction.onerror = onerror; + }; + openRequest.onerror = onerror; + },loadFilesFromDB:function (paths, onload, onerror) { + onload = onload || function(){}; + onerror = onerror || function(){}; + var indexedDB = FS.indexedDB(); + try { + var openRequest = indexedDB.open(FS.DB_NAME(), FS.DB_VERSION); + } catch (e) { + return onerror(e); + } + openRequest.onupgradeneeded = onerror; // no database to load from + openRequest.onsuccess = function openRequest_onsuccess() { + var db = openRequest.result; + try { + var transaction = db.transaction([FS.DB_STORE_NAME], 'readonly'); + } catch(e) { + onerror(e); + return; + } + var files = transaction.objectStore(FS.DB_STORE_NAME); + var ok = 0, fail = 0, total = paths.length; + function finish() { + if (fail == 0) onload(); else onerror(); + } + paths.forEach(function(path) { + var getRequest = files.get(path); + getRequest.onsuccess = function getRequest_onsuccess() { + if (FS.analyzePath(path).exists) { + FS.unlink(path); + } + FS.createDataFile(PATH.dirname(path), PATH.basename(path), getRequest.result, true, true, true); + ok++; + if (ok + fail == total) finish(); + }; + getRequest.onerror = function getRequest_onerror() { fail++; if (ok + fail == total) finish() }; + }); + transaction.onerror = onerror; + }; + openRequest.onerror = onerror; + }};var SOCKFS={mount:function (mount) { + // If Module['websocket'] has already been defined (e.g. for configuring + // the subprotocol/url) use that, if not initialise it to a new object. + Module['websocket'] = (Module['websocket'] && + ('object' === typeof Module['websocket'])) ? Module['websocket'] : {}; + + // Add the Event registration mechanism to the exported websocket configuration + // object so we can register network callbacks from native JavaScript too. + // For more documentation see system/include/emscripten/emscripten.h + Module['websocket']._callbacks = {}; + Module['websocket']['on'] = function(event, callback) { + if ('function' === typeof callback) { + this._callbacks[event] = callback; + } + return this; + }; + + Module['websocket'].emit = function(event, param) { + if ('function' === typeof this._callbacks[event]) { + this._callbacks[event].call(this, param); + } + }; + + // If debug is enabled register simple default logging callbacks for each Event. + + return FS.createNode(null, '/', 16384 | 511 /* 0777 */, 0); + },createSocket:function (family, type, protocol) { + var streaming = type == 1; + if (protocol) { + assert(streaming == (protocol == 6)); // if SOCK_STREAM, must be tcp + } + + // create our internal socket structure + var sock = { + family: family, + type: type, + protocol: protocol, + server: null, + error: null, // Used in getsockopt for SOL_SOCKET/SO_ERROR test + peers: {}, + pending: [], + recv_queue: [], + sock_ops: SOCKFS.websocket_sock_ops + }; + + // create the filesystem node to store the socket structure + var name = SOCKFS.nextname(); + var node = FS.createNode(SOCKFS.root, name, 49152, 0); + node.sock = sock; + + // and the wrapping stream that enables library functions such + // as read and write to indirectly interact with the socket + var stream = FS.createStream({ + path: name, + node: node, + flags: FS.modeStringToFlags('r+'), + seekable: false, + stream_ops: SOCKFS.stream_ops + }); + + // map the new stream to the socket structure (sockets have a 1:1 + // relationship with a stream) + sock.stream = stream; + + return sock; + },getSocket:function (fd) { + var stream = FS.getStream(fd); + if (!stream || !FS.isSocket(stream.node.mode)) { + return null; + } + return stream.node.sock; + },stream_ops:{poll:function (stream) { + var sock = stream.node.sock; + return sock.sock_ops.poll(sock); + },ioctl:function (stream, request, varargs) { + var sock = stream.node.sock; + return sock.sock_ops.ioctl(sock, request, varargs); + },read:function (stream, buffer, offset, length, position /* ignored */) { + var sock = stream.node.sock; + var msg = sock.sock_ops.recvmsg(sock, length); + if (!msg) { + // socket is closed + return 0; + } + buffer.set(msg.buffer, offset); + return msg.buffer.length; + },write:function (stream, buffer, offset, length, position /* ignored */) { + var sock = stream.node.sock; + return sock.sock_ops.sendmsg(sock, buffer, offset, length); + },close:function (stream) { + var sock = stream.node.sock; + sock.sock_ops.close(sock); + }},nextname:function () { + if (!SOCKFS.nextname.current) { + SOCKFS.nextname.current = 0; + } + return 'socket[' + (SOCKFS.nextname.current++) + ']'; + },websocket_sock_ops:{createPeer:function (sock, addr, port) { + var ws; + + if (typeof addr === 'object') { + ws = addr; + addr = null; + port = null; + } + + if (ws) { + // for sockets that've already connected (e.g. we're the server) + // we can inspect the _socket property for the address + if (ws._socket) { + addr = ws._socket.remoteAddress; + port = ws._socket.remotePort; + } + // if we're just now initializing a connection to the remote, + // inspect the url property + else { + var result = /ws[s]?:\/\/([^:]+):(\d+)/.exec(ws.url); + if (!result) { + throw new Error('WebSocket URL must be in the format ws(s)://address:port'); + } + addr = result[1]; + port = parseInt(result[2], 10); + } + } else { + // create the actual websocket object and connect + try { + // runtimeConfig gets set to true if WebSocket runtime configuration is available. + var runtimeConfig = (Module['websocket'] && ('object' === typeof Module['websocket'])); + + // The default value is 'ws://' the replace is needed because the compiler replaces '//' comments with '#' + // comments without checking context, so we'd end up with ws:#, the replace swaps the '#' for '//' again. + var url = 'ws:#'.replace('#', '//'); + + if (runtimeConfig) { + if ('string' === typeof Module['websocket']['url']) { + url = Module['websocket']['url']; // Fetch runtime WebSocket URL config. + } + } + + if (url === 'ws://' || url === 'wss://') { // Is the supplied URL config just a prefix, if so complete it. + var parts = addr.split('/'); + url = url + parts[0] + ":" + port + "/" + parts.slice(1).join('/'); + } + + // Make the WebSocket subprotocol (Sec-WebSocket-Protocol) default to binary if no configuration is set. + var subProtocols = 'binary'; // The default value is 'binary' + + if (runtimeConfig) { + if ('string' === typeof Module['websocket']['subprotocol']) { + subProtocols = Module['websocket']['subprotocol']; // Fetch runtime WebSocket subprotocol config. + } + } + + // The regex trims the string (removes spaces at the beginning and end, then splits the string by + // , into an Array. Whitespace removal is important for Websockify and ws. + subProtocols = subProtocols.replace(/^ +| +$/g,"").split(/ *, */); + + // The node ws library API for specifying optional subprotocol is slightly different than the browser's. + var opts = ENVIRONMENT_IS_NODE ? {'protocol': subProtocols.toString()} : subProtocols; + + // some webservers (azure) does not support subprotocol header + if (runtimeConfig && null === Module['websocket']['subprotocol']) { + subProtocols = 'null'; + opts = undefined; + } + + // If node we use the ws library. + var WebSocketConstructor; + if (ENVIRONMENT_IS_NODE) { + WebSocketConstructor = require('ws'); + } else + if (ENVIRONMENT_IS_WEB) { + WebSocketConstructor = window['WebSocket']; + } else + { + WebSocketConstructor = WebSocket; + } + ws = new WebSocketConstructor(url, opts); + ws.binaryType = 'arraybuffer'; + } catch (e) { + throw new FS.ErrnoError(ERRNO_CODES.EHOSTUNREACH); + } + } + + + var peer = { + addr: addr, + port: port, + socket: ws, + dgram_send_queue: [] + }; + + SOCKFS.websocket_sock_ops.addPeer(sock, peer); + SOCKFS.websocket_sock_ops.handlePeerEvents(sock, peer); + + // if this is a bound dgram socket, send the port number first to allow + // us to override the ephemeral port reported to us by remotePort on the + // remote end. + if (sock.type === 2 && typeof sock.sport !== 'undefined') { + peer.dgram_send_queue.push(new Uint8Array([ + 255, 255, 255, 255, + 'p'.charCodeAt(0), 'o'.charCodeAt(0), 'r'.charCodeAt(0), 't'.charCodeAt(0), + ((sock.sport & 0xff00) >> 8) , (sock.sport & 0xff) + ])); + } + + return peer; + },getPeer:function (sock, addr, port) { + return sock.peers[addr + ':' + port]; + },addPeer:function (sock, peer) { + sock.peers[peer.addr + ':' + peer.port] = peer; + },removePeer:function (sock, peer) { + delete sock.peers[peer.addr + ':' + peer.port]; + },handlePeerEvents:function (sock, peer) { + var first = true; + + var handleOpen = function () { + + Module['websocket'].emit('open', sock.stream.fd); + + try { + var queued = peer.dgram_send_queue.shift(); + while (queued) { + peer.socket.send(queued); + queued = peer.dgram_send_queue.shift(); + } + } catch (e) { + // not much we can do here in the way of proper error handling as we've already + // lied and said this data was sent. shut it down. + peer.socket.close(); + } + }; + + function handleMessage(data) { + assert(typeof data !== 'string' && data.byteLength !== undefined); // must receive an ArrayBuffer + + // An empty ArrayBuffer will emit a pseudo disconnect event + // as recv/recvmsg will return zero which indicates that a socket + // has performed a shutdown although the connection has not been disconnected yet. + if (data.byteLength == 0) { + return; + } + data = new Uint8Array(data); // make a typed array view on the array buffer + + + // if this is the port message, override the peer's port with it + var wasfirst = first; + first = false; + if (wasfirst && + data.length === 10 && + data[0] === 255 && data[1] === 255 && data[2] === 255 && data[3] === 255 && + data[4] === 'p'.charCodeAt(0) && data[5] === 'o'.charCodeAt(0) && data[6] === 'r'.charCodeAt(0) && data[7] === 't'.charCodeAt(0)) { + // update the peer's port and it's key in the peer map + var newport = ((data[8] << 8) | data[9]); + SOCKFS.websocket_sock_ops.removePeer(sock, peer); + peer.port = newport; + SOCKFS.websocket_sock_ops.addPeer(sock, peer); + return; + } + + sock.recv_queue.push({ addr: peer.addr, port: peer.port, data: data }); + Module['websocket'].emit('message', sock.stream.fd); + }; + + if (ENVIRONMENT_IS_NODE) { + peer.socket.on('open', handleOpen); + peer.socket.on('message', function(data, flags) { + if (!flags.binary) { + return; + } + handleMessage((new Uint8Array(data)).buffer); // copy from node Buffer -> ArrayBuffer + }); + peer.socket.on('close', function() { + Module['websocket'].emit('close', sock.stream.fd); + }); + peer.socket.on('error', function(error) { + // Although the ws library may pass errors that may be more descriptive than + // ECONNREFUSED they are not necessarily the expected error code e.g. + // ENOTFOUND on getaddrinfo seems to be node.js specific, so using ECONNREFUSED + // is still probably the most useful thing to do. + sock.error = ERRNO_CODES.ECONNREFUSED; // Used in getsockopt for SOL_SOCKET/SO_ERROR test. + Module['websocket'].emit('error', [sock.stream.fd, sock.error, 'ECONNREFUSED: Connection refused']); + // don't throw + }); + } else { + peer.socket.onopen = handleOpen; + peer.socket.onclose = function() { + Module['websocket'].emit('close', sock.stream.fd); + }; + peer.socket.onmessage = function peer_socket_onmessage(event) { + handleMessage(event.data); + }; + peer.socket.onerror = function(error) { + // The WebSocket spec only allows a 'simple event' to be thrown on error, + // so we only really know as much as ECONNREFUSED. + sock.error = ERRNO_CODES.ECONNREFUSED; // Used in getsockopt for SOL_SOCKET/SO_ERROR test. + Module['websocket'].emit('error', [sock.stream.fd, sock.error, 'ECONNREFUSED: Connection refused']); + }; + } + },poll:function (sock) { + if (sock.type === 1 && sock.server) { + // listen sockets should only say they're available for reading + // if there are pending clients. + return sock.pending.length ? (64 | 1) : 0; + } + + var mask = 0; + var dest = sock.type === 1 ? // we only care about the socket state for connection-based sockets + SOCKFS.websocket_sock_ops.getPeer(sock, sock.daddr, sock.dport) : + null; + + if (sock.recv_queue.length || + !dest || // connection-less sockets are always ready to read + (dest && dest.socket.readyState === dest.socket.CLOSING) || + (dest && dest.socket.readyState === dest.socket.CLOSED)) { // let recv return 0 once closed + mask |= (64 | 1); + } + + if (!dest || // connection-less sockets are always ready to write + (dest && dest.socket.readyState === dest.socket.OPEN)) { + mask |= 4; + } + + if ((dest && dest.socket.readyState === dest.socket.CLOSING) || + (dest && dest.socket.readyState === dest.socket.CLOSED)) { + mask |= 16; + } + + return mask; + },ioctl:function (sock, request, arg) { + switch (request) { + case 21531: + var bytes = 0; + if (sock.recv_queue.length) { + bytes = sock.recv_queue[0].data.length; + } + HEAP32[((arg)>>2)]=bytes; + return 0; + default: + return ERRNO_CODES.EINVAL; + } + },close:function (sock) { + // if we've spawned a listen server, close it + if (sock.server) { + try { + sock.server.close(); + } catch (e) { + } + sock.server = null; + } + // close any peer connections + var peers = Object.keys(sock.peers); + for (var i = 0; i < peers.length; i++) { + var peer = sock.peers[peers[i]]; + try { + peer.socket.close(); + } catch (e) { + } + SOCKFS.websocket_sock_ops.removePeer(sock, peer); + } + return 0; + },bind:function (sock, addr, port) { + if (typeof sock.saddr !== 'undefined' || typeof sock.sport !== 'undefined') { + throw new FS.ErrnoError(ERRNO_CODES.EINVAL); // already bound + } + sock.saddr = addr; + sock.sport = port; + // in order to emulate dgram sockets, we need to launch a listen server when + // binding on a connection-less socket + // note: this is only required on the server side + if (sock.type === 2) { + // close the existing server if it exists + if (sock.server) { + sock.server.close(); + sock.server = null; + } + // swallow error operation not supported error that occurs when binding in the + // browser where this isn't supported + try { + sock.sock_ops.listen(sock, 0); + } catch (e) { + if (!(e instanceof FS.ErrnoError)) throw e; + if (e.errno !== ERRNO_CODES.EOPNOTSUPP) throw e; + } + } + },connect:function (sock, addr, port) { + if (sock.server) { + throw new FS.ErrnoError(ERRNO_CODES.EOPNOTSUPP); + } + + // TODO autobind + // if (!sock.addr && sock.type == 2) { + // } + + // early out if we're already connected / in the middle of connecting + if (typeof sock.daddr !== 'undefined' && typeof sock.dport !== 'undefined') { + var dest = SOCKFS.websocket_sock_ops.getPeer(sock, sock.daddr, sock.dport); + if (dest) { + if (dest.socket.readyState === dest.socket.CONNECTING) { + throw new FS.ErrnoError(ERRNO_CODES.EALREADY); + } else { + throw new FS.ErrnoError(ERRNO_CODES.EISCONN); + } + } + } + + // add the socket to our peer list and set our + // destination address / port to match + var peer = SOCKFS.websocket_sock_ops.createPeer(sock, addr, port); + sock.daddr = peer.addr; + sock.dport = peer.port; + + // always "fail" in non-blocking mode + throw new FS.ErrnoError(ERRNO_CODES.EINPROGRESS); + },listen:function (sock, backlog) { + if (!ENVIRONMENT_IS_NODE) { + throw new FS.ErrnoError(ERRNO_CODES.EOPNOTSUPP); + } + if (sock.server) { + throw new FS.ErrnoError(ERRNO_CODES.EINVAL); // already listening + } + var WebSocketServer = require('ws').Server; + var host = sock.saddr; + sock.server = new WebSocketServer({ + host: host, + port: sock.sport + // TODO support backlog + }); + Module['websocket'].emit('listen', sock.stream.fd); // Send Event with listen fd. + + sock.server.on('connection', function(ws) { + if (sock.type === 1) { + var newsock = SOCKFS.createSocket(sock.family, sock.type, sock.protocol); + + // create a peer on the new socket + var peer = SOCKFS.websocket_sock_ops.createPeer(newsock, ws); + newsock.daddr = peer.addr; + newsock.dport = peer.port; + + // push to queue for accept to pick up + sock.pending.push(newsock); + Module['websocket'].emit('connection', newsock.stream.fd); + } else { + // create a peer on the listen socket so calling sendto + // with the listen socket and an address will resolve + // to the correct client + SOCKFS.websocket_sock_ops.createPeer(sock, ws); + Module['websocket'].emit('connection', sock.stream.fd); + } + }); + sock.server.on('closed', function() { + Module['websocket'].emit('close', sock.stream.fd); + sock.server = null; + }); + sock.server.on('error', function(error) { + // Although the ws library may pass errors that may be more descriptive than + // ECONNREFUSED they are not necessarily the expected error code e.g. + // ENOTFOUND on getaddrinfo seems to be node.js specific, so using EHOSTUNREACH + // is still probably the most useful thing to do. This error shouldn't + // occur in a well written app as errors should get trapped in the compiled + // app's own getaddrinfo call. + sock.error = ERRNO_CODES.EHOSTUNREACH; // Used in getsockopt for SOL_SOCKET/SO_ERROR test. + Module['websocket'].emit('error', [sock.stream.fd, sock.error, 'EHOSTUNREACH: Host is unreachable']); + // don't throw + }); + },accept:function (listensock) { + if (!listensock.server) { + throw new FS.ErrnoError(ERRNO_CODES.EINVAL); + } + var newsock = listensock.pending.shift(); + newsock.stream.flags = listensock.stream.flags; + return newsock; + },getname:function (sock, peer) { + var addr, port; + if (peer) { + if (sock.daddr === undefined || sock.dport === undefined) { + throw new FS.ErrnoError(ERRNO_CODES.ENOTCONN); + } + addr = sock.daddr; + port = sock.dport; + } else { + // TODO saddr and sport will be set for bind()'d UDP sockets, but what + // should we be returning for TCP sockets that've been connect()'d? + addr = sock.saddr || 0; + port = sock.sport || 0; + } + return { addr: addr, port: port }; + },sendmsg:function (sock, buffer, offset, length, addr, port) { + if (sock.type === 2) { + // connection-less sockets will honor the message address, + // and otherwise fall back to the bound destination address + if (addr === undefined || port === undefined) { + addr = sock.daddr; + port = sock.dport; + } + // if there was no address to fall back to, error out + if (addr === undefined || port === undefined) { + throw new FS.ErrnoError(ERRNO_CODES.EDESTADDRREQ); + } + } else { + // connection-based sockets will only use the bound + addr = sock.daddr; + port = sock.dport; + } + + // find the peer for the destination address + var dest = SOCKFS.websocket_sock_ops.getPeer(sock, addr, port); + + // early out if not connected with a connection-based socket + if (sock.type === 1) { + if (!dest || dest.socket.readyState === dest.socket.CLOSING || dest.socket.readyState === dest.socket.CLOSED) { + throw new FS.ErrnoError(ERRNO_CODES.ENOTCONN); + } else if (dest.socket.readyState === dest.socket.CONNECTING) { + throw new FS.ErrnoError(ERRNO_CODES.EAGAIN); + } + } + + // create a copy of the incoming data to send, as the WebSocket API + // doesn't work entirely with an ArrayBufferView, it'll just send + // the entire underlying buffer + if (ArrayBuffer.isView(buffer)) { + offset += buffer.byteOffset; + buffer = buffer.buffer; + } + + var data; + data = buffer.slice(offset, offset + length); + + // if we're emulating a connection-less dgram socket and don't have + // a cached connection, queue the buffer to send upon connect and + // lie, saying the data was sent now. + if (sock.type === 2) { + if (!dest || dest.socket.readyState !== dest.socket.OPEN) { + // if we're not connected, open a new connection + if (!dest || dest.socket.readyState === dest.socket.CLOSING || dest.socket.readyState === dest.socket.CLOSED) { + dest = SOCKFS.websocket_sock_ops.createPeer(sock, addr, port); + } + dest.dgram_send_queue.push(data); + return length; + } + } + + try { + // send the actual data + dest.socket.send(data); + return length; + } catch (e) { + throw new FS.ErrnoError(ERRNO_CODES.EINVAL); + } + },recvmsg:function (sock, length) { + // http://pubs.opengroup.org/onlinepubs/7908799/xns/recvmsg.html + if (sock.type === 1 && sock.server) { + // tcp servers should not be recv()'ing on the listen socket + throw new FS.ErrnoError(ERRNO_CODES.ENOTCONN); + } + + var queued = sock.recv_queue.shift(); + if (!queued) { + if (sock.type === 1) { + var dest = SOCKFS.websocket_sock_ops.getPeer(sock, sock.daddr, sock.dport); + + if (!dest) { + // if we have a destination address but are not connected, error out + throw new FS.ErrnoError(ERRNO_CODES.ENOTCONN); + } + else if (dest.socket.readyState === dest.socket.CLOSING || dest.socket.readyState === dest.socket.CLOSED) { + // return null if the socket has closed + return null; + } + else { + // else, our socket is in a valid state but truly has nothing available + throw new FS.ErrnoError(ERRNO_CODES.EAGAIN); + } + } else { + throw new FS.ErrnoError(ERRNO_CODES.EAGAIN); + } + } + + // queued.data will be an ArrayBuffer if it's unadulterated, but if it's + // requeued TCP data it'll be an ArrayBufferView + var queuedLength = queued.data.byteLength || queued.data.length; + var queuedOffset = queued.data.byteOffset || 0; + var queuedBuffer = queued.data.buffer || queued.data; + var bytesRead = Math.min(length, queuedLength); + var res = { + buffer: new Uint8Array(queuedBuffer, queuedOffset, bytesRead), + addr: queued.addr, + port: queued.port + }; + + + // push back any unread data for TCP connections + if (sock.type === 1 && bytesRead < queuedLength) { + var bytesRemaining = queuedLength - bytesRead; + queued.data = new Uint8Array(queuedBuffer, queuedOffset + bytesRead, bytesRemaining); + sock.recv_queue.unshift(queued); + } + + return res; + }}}; + + + function __inet_pton4_raw(str) { + var b = str.split('.'); + for (var i = 0; i < 4; i++) { + var tmp = Number(b[i]); + if (isNaN(tmp)) return null; + b[i] = tmp; + } + return (b[0] | (b[1] << 8) | (b[2] << 16) | (b[3] << 24)) >>> 0; + } + + + function _htons() { + err('missing function: htons'); abort(-1); + }function __inet_pton6_raw(str) { + var words; + var w, offset, z, i; + /* http://home.deds.nl/~aeron/regex/ */ + var valid6regx = /^((?=.*::)(?!.*::.+::)(::)?([\dA-F]{1,4}:(:|\b)|){5}|([\dA-F]{1,4}:){6})((([\dA-F]{1,4}((?!\3)::|:\b|$))|(?!\2\3)){2}|(((2[0-4]|1\d|[1-9])?\d|25[0-5])\.?\b){4})$/i + var parts = []; + if (!valid6regx.test(str)) { + return null; + } + if (str === "::") { + return [0, 0, 0, 0, 0, 0, 0, 0]; + } + // Z placeholder to keep track of zeros when splitting the string on ":" + if (str.indexOf("::") === 0) { + str = str.replace("::", "Z:"); // leading zeros case + } else { + str = str.replace("::", ":Z:"); + } + + if (str.indexOf(".") > 0) { + // parse IPv4 embedded stress + str = str.replace(new RegExp('[.]', 'g'), ":"); + words = str.split(":"); + words[words.length-4] = parseInt(words[words.length-4]) + parseInt(words[words.length-3])*256; + words[words.length-3] = parseInt(words[words.length-2]) + parseInt(words[words.length-1])*256; + words = words.slice(0, words.length-2); + } else { + words = str.split(":"); + } + + offset = 0; z = 0; + for (w=0; w < words.length; w++) { + if (typeof words[w] === 'string') { + if (words[w] === 'Z') { + // compressed zeros - write appropriate number of zero words + for (z = 0; z < (8 - words.length+1); z++) { + parts[w+z] = 0; + } + offset = z-1; + } else { + // parse hex to field to 16-bit value and write it in network byte-order + parts[w+offset] = _htons(parseInt(words[w],16)); + } + } else { + // parsed IPv4 words + parts[w+offset] = words[w]; + } + } + return [ + (parts[1] << 16) | parts[0], + (parts[3] << 16) | parts[2], + (parts[5] << 16) | parts[4], + (parts[7] << 16) | parts[6] + ]; + }var DNS={address_map:{id:1,addrs:{},names:{}},lookup_name:function (name) { + // If the name is already a valid ipv4 / ipv6 address, don't generate a fake one. + var res = __inet_pton4_raw(name); + if (res !== null) { + return name; + } + res = __inet_pton6_raw(name); + if (res !== null) { + return name; + } + + // See if this name is already mapped. + var addr; + + if (DNS.address_map.addrs[name]) { + addr = DNS.address_map.addrs[name]; + } else { + var id = DNS.address_map.id++; + assert(id < 65535, 'exceeded max address mappings of 65535'); + + addr = '172.29.' + (id & 0xff) + '.' + (id & 0xff00); + + DNS.address_map.names[addr] = name; + DNS.address_map.addrs[name] = addr; + } + + return addr; + },lookup_addr:function (addr) { + if (DNS.address_map.names[addr]) { + return DNS.address_map.names[addr]; + } + + return null; + }}; + + + var Sockets={BUFFER_SIZE:10240,MAX_BUFFER_SIZE:10485760,nextFd:1,fds:{},nextport:1,maxport:65535,peer:null,connections:{},portmap:{},localAddr:4261412874,addrPool:[33554442,50331658,67108874,83886090,100663306,117440522,134217738,150994954,167772170,184549386,201326602,218103818,234881034]}; + + function __inet_ntop4_raw(addr) { + return (addr & 0xff) + '.' + ((addr >> 8) & 0xff) + '.' + ((addr >> 16) & 0xff) + '.' + ((addr >> 24) & 0xff) + } + + function __inet_ntop6_raw(ints) { + // ref: http://www.ietf.org/rfc/rfc2373.txt - section 2.5.4 + // Format for IPv4 compatible and mapped 128-bit IPv6 Addresses + // 128-bits are split into eight 16-bit words + // stored in network byte order (big-endian) + // | 80 bits | 16 | 32 bits | + // +-----------------------------------------------------------------+ + // | 10 bytes | 2 | 4 bytes | + // +--------------------------------------+--------------------------+ + // + 5 words | 1 | 2 words | + // +--------------------------------------+--------------------------+ + // |0000..............................0000|0000| IPv4 ADDRESS | (compatible) + // +--------------------------------------+----+---------------------+ + // |0000..............................0000|FFFF| IPv4 ADDRESS | (mapped) + // +--------------------------------------+----+---------------------+ + var str = ""; + var word = 0; + var longest = 0; + var lastzero = 0; + var zstart = 0; + var len = 0; + var i = 0; + var parts = [ + ints[0] & 0xffff, + (ints[0] >> 16), + ints[1] & 0xffff, + (ints[1] >> 16), + ints[2] & 0xffff, + (ints[2] >> 16), + ints[3] & 0xffff, + (ints[3] >> 16) + ]; + + // Handle IPv4-compatible, IPv4-mapped, loopback and any/unspecified addresses + + var hasipv4 = true; + var v4part = ""; + // check if the 10 high-order bytes are all zeros (first 5 words) + for (i = 0; i < 5; i++) { + if (parts[i] !== 0) { hasipv4 = false; break; } + } + + if (hasipv4) { + // low-order 32-bits store an IPv4 address (bytes 13 to 16) (last 2 words) + v4part = __inet_ntop4_raw(parts[6] | (parts[7] << 16)); + // IPv4-mapped IPv6 address if 16-bit value (bytes 11 and 12) == 0xFFFF (6th word) + if (parts[5] === -1) { + str = "::ffff:"; + str += v4part; + return str; + } + // IPv4-compatible IPv6 address if 16-bit value (bytes 11 and 12) == 0x0000 (6th word) + if (parts[5] === 0) { + str = "::"; + //special case IPv6 addresses + if(v4part === "0.0.0.0") v4part = ""; // any/unspecified address + if(v4part === "0.0.0.1") v4part = "1";// loopback address + str += v4part; + return str; + } + } + + // Handle all other IPv6 addresses + + // first run to find the longest contiguous zero words + for (word = 0; word < 8; word++) { + if (parts[word] === 0) { + if (word - lastzero > 1) { + len = 0; + } + lastzero = word; + len++; + } + if (len > longest) { + longest = len; + zstart = word - longest + 1; + } + } + + for (word = 0; word < 8; word++) { + if (longest > 1) { + // compress contiguous zeros - to produce "::" + if (parts[word] === 0 && word >= zstart && word < (zstart + longest) ) { + if (word === zstart) { + str += ":"; + if (zstart === 0) str += ":"; //leading zeros case + } + continue; + } + } + // converts 16-bit words from big-endian to little-endian before converting to hex string + str += Number(_ntohs(parts[word] & 0xffff)).toString(16); + str += word < 7 ? ":" : ""; + } + return str; + }function __read_sockaddr(sa, salen) { + // family / port offsets are common to both sockaddr_in and sockaddr_in6 + var family = HEAP16[((sa)>>1)]; + var port = _ntohs(HEAP16[(((sa)+(2))>>1)]); + var addr; + + switch (family) { + case 2: + if (salen !== 16) { + return { errno: 22 }; + } + addr = HEAP32[(((sa)+(4))>>2)]; + addr = __inet_ntop4_raw(addr); + break; + case 10: + if (salen !== 28) { + return { errno: 22 }; + } + addr = [ + HEAP32[(((sa)+(8))>>2)], + HEAP32[(((sa)+(12))>>2)], + HEAP32[(((sa)+(16))>>2)], + HEAP32[(((sa)+(20))>>2)] + ]; + addr = __inet_ntop6_raw(addr); + break; + default: + return { errno: 97 }; + } + + return { family: family, addr: addr, port: port }; + } + + function __write_sockaddr(sa, family, addr, port) { + switch (family) { + case 2: + addr = __inet_pton4_raw(addr); + HEAP16[((sa)>>1)]=family; + HEAP32[(((sa)+(4))>>2)]=addr; + HEAP16[(((sa)+(2))>>1)]=_htons(port); + break; + case 10: + addr = __inet_pton6_raw(addr); + HEAP32[((sa)>>2)]=family; + HEAP32[(((sa)+(8))>>2)]=addr[0]; + HEAP32[(((sa)+(12))>>2)]=addr[1]; + HEAP32[(((sa)+(16))>>2)]=addr[2]; + HEAP32[(((sa)+(20))>>2)]=addr[3]; + HEAP16[(((sa)+(2))>>1)]=_htons(port); + HEAP32[(((sa)+(4))>>2)]=0; + HEAP32[(((sa)+(24))>>2)]=0; + break; + default: + return { errno: 97 }; + } + // kind of lame, but let's match _read_sockaddr's interface + return {}; + } + + var SYSCALLS={DEFAULT_POLLMASK:5,mappings:{},umask:511,calculateAt:function (dirfd, path) { + if (path[0] !== '/') { + // relative path + var dir; + if (dirfd === -100) { + dir = FS.cwd(); + } else { + var dirstream = FS.getStream(dirfd); + if (!dirstream) throw new FS.ErrnoError(ERRNO_CODES.EBADF); + dir = dirstream.path; + } + path = PATH.join2(dir, path); + } + return path; + },doStat:function (func, path, buf) { + try { + var stat = func(path); + } catch (e) { + if (e && e.node && PATH.normalize(path) !== PATH.normalize(FS.getPath(e.node))) { + // an error occurred while trying to look up the path; we should just report ENOTDIR + return -ERRNO_CODES.ENOTDIR; + } + throw e; + } + HEAP32[((buf)>>2)]=stat.dev; + HEAP32[(((buf)+(4))>>2)]=0; + HEAP32[(((buf)+(8))>>2)]=stat.ino; + HEAP32[(((buf)+(12))>>2)]=stat.mode; + HEAP32[(((buf)+(16))>>2)]=stat.nlink; + HEAP32[(((buf)+(20))>>2)]=stat.uid; + HEAP32[(((buf)+(24))>>2)]=stat.gid; + HEAP32[(((buf)+(28))>>2)]=stat.rdev; + HEAP32[(((buf)+(32))>>2)]=0; + HEAP32[(((buf)+(36))>>2)]=stat.size; + HEAP32[(((buf)+(40))>>2)]=4096; + HEAP32[(((buf)+(44))>>2)]=stat.blocks; + HEAP32[(((buf)+(48))>>2)]=(stat.atime.getTime() / 1000)|0; + HEAP32[(((buf)+(52))>>2)]=0; + HEAP32[(((buf)+(56))>>2)]=(stat.mtime.getTime() / 1000)|0; + HEAP32[(((buf)+(60))>>2)]=0; + HEAP32[(((buf)+(64))>>2)]=(stat.ctime.getTime() / 1000)|0; + HEAP32[(((buf)+(68))>>2)]=0; + HEAP32[(((buf)+(72))>>2)]=stat.ino; + return 0; + },doMsync:function (addr, stream, len, flags) { + var buffer = new Uint8Array(HEAPU8.subarray(addr, addr + len)); + FS.msync(stream, buffer, 0, len, flags); + },doMkdir:function (path, mode) { + // remove a trailing slash, if one - /a/b/ has basename of '', but + // we want to create b in the context of this function + path = PATH.normalize(path); + if (path[path.length-1] === '/') path = path.substr(0, path.length-1); + FS.mkdir(path, mode, 0); + return 0; + },doMknod:function (path, mode, dev) { + // we don't want this in the JS API as it uses mknod to create all nodes. + switch (mode & 61440) { + case 32768: + case 8192: + case 24576: + case 4096: + case 49152: + break; + default: return -ERRNO_CODES.EINVAL; + } + FS.mknod(path, mode, dev); + return 0; + },doReadlink:function (path, buf, bufsize) { + if (bufsize <= 0) return -ERRNO_CODES.EINVAL; + var ret = FS.readlink(path); + + var len = Math.min(bufsize, lengthBytesUTF8(ret)); + var endChar = HEAP8[buf+len]; + stringToUTF8(ret, buf, bufsize+1); + // readlink is one of the rare functions that write out a C string, but does never append a null to the output buffer(!) + // stringToUTF8() always appends a null byte, so restore the character under the null byte after the write. + HEAP8[buf+len] = endChar; + + return len; + },doAccess:function (path, amode) { + if (amode & ~7) { + // need a valid mode + return -ERRNO_CODES.EINVAL; + } + var node; + var lookup = FS.lookupPath(path, { follow: true }); + node = lookup.node; + var perms = ''; + if (amode & 4) perms += 'r'; + if (amode & 2) perms += 'w'; + if (amode & 1) perms += 'x'; + if (perms /* otherwise, they've just passed F_OK */ && FS.nodePermissions(node, perms)) { + return -ERRNO_CODES.EACCES; + } + return 0; + },doDup:function (path, flags, suggestFD) { + var suggest = FS.getStream(suggestFD); + if (suggest) FS.close(suggest); + return FS.open(path, flags, 0, suggestFD, suggestFD).fd; + },doReadv:function (stream, iov, iovcnt, offset) { + var ret = 0; + for (var i = 0; i < iovcnt; i++) { + var ptr = HEAP32[(((iov)+(i*8))>>2)]; + var len = HEAP32[(((iov)+(i*8 + 4))>>2)]; + var curr = FS.read(stream, HEAP8,ptr, len, offset); + if (curr < 0) return -1; + ret += curr; + if (curr < len) break; // nothing more to read + } + return ret; + },doWritev:function (stream, iov, iovcnt, offset) { + var ret = 0; + for (var i = 0; i < iovcnt; i++) { + var ptr = HEAP32[(((iov)+(i*8))>>2)]; + var len = HEAP32[(((iov)+(i*8 + 4))>>2)]; + var curr = FS.write(stream, HEAP8,ptr, len, offset); + if (curr < 0) return -1; + ret += curr; + } + return ret; + },varargs:0,get:function (varargs) { + SYSCALLS.varargs += 4; + var ret = HEAP32[(((SYSCALLS.varargs)-(4))>>2)]; + return ret; + },getStr:function () { + var ret = UTF8ToString(SYSCALLS.get()); + return ret; + },getStreamFromFD:function () { + var stream = FS.getStream(SYSCALLS.get()); + if (!stream) throw new FS.ErrnoError(ERRNO_CODES.EBADF); + return stream; + },getSocketFromFD:function () { + var socket = SOCKFS.getSocket(SYSCALLS.get()); + if (!socket) throw new FS.ErrnoError(ERRNO_CODES.EBADF); + return socket; + },getSocketAddress:function (allowNull) { + var addrp = SYSCALLS.get(), addrlen = SYSCALLS.get(); + if (allowNull && addrp === 0) return null; + var info = __read_sockaddr(addrp, addrlen); + if (info.errno) throw new FS.ErrnoError(info.errno); + info.addr = DNS.lookup_addr(info.addr) || info.addr; + return info; + },get64:function () { + var low = SYSCALLS.get(), high = SYSCALLS.get(); + if (low >= 0) assert(high === 0); + else assert(high === -1); + return low; + },getZero:function () { + assert(SYSCALLS.get() === 0); + }};function ___syscall102(which, varargs) {SYSCALLS.varargs = varargs; + try { + // socketcall + var call = SYSCALLS.get(), socketvararg = SYSCALLS.get(); + // socketcalls pass the rest of the arguments in a struct + SYSCALLS.varargs = socketvararg; + switch (call) { + case 1: { // socket + var domain = SYSCALLS.get(), type = SYSCALLS.get(), protocol = SYSCALLS.get(); + var sock = SOCKFS.createSocket(domain, type, protocol); + assert(sock.stream.fd < 64); // XXX ? select() assumes socket fd values are in 0..63 + return sock.stream.fd; + } + case 2: { // bind + var sock = SYSCALLS.getSocketFromFD(), info = SYSCALLS.getSocketAddress(); + sock.sock_ops.bind(sock, info.addr, info.port); + return 0; + } + case 3: { // connect + var sock = SYSCALLS.getSocketFromFD(), info = SYSCALLS.getSocketAddress(); + sock.sock_ops.connect(sock, info.addr, info.port); + return 0; + } + case 4: { // listen + var sock = SYSCALLS.getSocketFromFD(), backlog = SYSCALLS.get(); + sock.sock_ops.listen(sock, backlog); + return 0; + } + case 5: { // accept + var sock = SYSCALLS.getSocketFromFD(), addr = SYSCALLS.get(), addrlen = SYSCALLS.get(); + var newsock = sock.sock_ops.accept(sock); + if (addr) { + var res = __write_sockaddr(addr, newsock.family, DNS.lookup_name(newsock.daddr), newsock.dport); + assert(!res.errno); + } + return newsock.stream.fd; + } + case 6: { // getsockname + var sock = SYSCALLS.getSocketFromFD(), addr = SYSCALLS.get(), addrlen = SYSCALLS.get(); + // TODO: sock.saddr should never be undefined, see TODO in websocket_sock_ops.getname + var res = __write_sockaddr(addr, sock.family, DNS.lookup_name(sock.saddr || '0.0.0.0'), sock.sport); + assert(!res.errno); + return 0; + } + case 7: { // getpeername + var sock = SYSCALLS.getSocketFromFD(), addr = SYSCALLS.get(), addrlen = SYSCALLS.get(); + if (!sock.daddr) { + return -ERRNO_CODES.ENOTCONN; // The socket is not connected. + } + var res = __write_sockaddr(addr, sock.family, DNS.lookup_name(sock.daddr), sock.dport); + assert(!res.errno); + return 0; + } + case 11: { // sendto + var sock = SYSCALLS.getSocketFromFD(), message = SYSCALLS.get(), length = SYSCALLS.get(), flags = SYSCALLS.get(), dest = SYSCALLS.getSocketAddress(true); + if (!dest) { + // send, no address provided + return FS.write(sock.stream, HEAP8,message, length); + } else { + // sendto an address + return sock.sock_ops.sendmsg(sock, HEAP8,message, length, dest.addr, dest.port); + } + } + case 12: { // recvfrom + var sock = SYSCALLS.getSocketFromFD(), buf = SYSCALLS.get(), len = SYSCALLS.get(), flags = SYSCALLS.get(), addr = SYSCALLS.get(), addrlen = SYSCALLS.get(); + var msg = sock.sock_ops.recvmsg(sock, len); + if (!msg) return 0; // socket is closed + if (addr) { + var res = __write_sockaddr(addr, sock.family, DNS.lookup_name(msg.addr), msg.port); + assert(!res.errno); + } + HEAPU8.set(msg.buffer, buf); + return msg.buffer.byteLength; + } + case 14: { // setsockopt + return -ERRNO_CODES.ENOPROTOOPT; // The option is unknown at the level indicated. + } + case 15: { // getsockopt + var sock = SYSCALLS.getSocketFromFD(), level = SYSCALLS.get(), optname = SYSCALLS.get(), optval = SYSCALLS.get(), optlen = SYSCALLS.get(); + // Minimal getsockopt aimed at resolving https://github.com/emscripten-core/emscripten/issues/2211 + // so only supports SOL_SOCKET with SO_ERROR. + if (level === 1) { + if (optname === 4) { + HEAP32[((optval)>>2)]=sock.error; + HEAP32[((optlen)>>2)]=4; + sock.error = null; // Clear the error (The SO_ERROR option obtains and then clears this field). + return 0; + } + } + return -ERRNO_CODES.ENOPROTOOPT; // The option is unknown at the level indicated. + } + case 16: { // sendmsg + var sock = SYSCALLS.getSocketFromFD(), message = SYSCALLS.get(), flags = SYSCALLS.get(); + var iov = HEAP32[(((message)+(8))>>2)]; + var num = HEAP32[(((message)+(12))>>2)]; + // read the address and port to send to + var addr, port; + var name = HEAP32[((message)>>2)]; + var namelen = HEAP32[(((message)+(4))>>2)]; + if (name) { + var info = __read_sockaddr(name, namelen); + if (info.errno) return -info.errno; + port = info.port; + addr = DNS.lookup_addr(info.addr) || info.addr; + } + // concatenate scatter-gather arrays into one message buffer + var total = 0; + for (var i = 0; i < num; i++) { + total += HEAP32[(((iov)+((8 * i) + 4))>>2)]; + } + var view = new Uint8Array(total); + var offset = 0; + for (var i = 0; i < num; i++) { + var iovbase = HEAP32[(((iov)+((8 * i) + 0))>>2)]; + var iovlen = HEAP32[(((iov)+((8 * i) + 4))>>2)]; + for (var j = 0; j < iovlen; j++) { + view[offset++] = HEAP8[(((iovbase)+(j))>>0)]; + } + } + // write the buffer + return sock.sock_ops.sendmsg(sock, view, 0, total, addr, port); + } + case 17: { // recvmsg + var sock = SYSCALLS.getSocketFromFD(), message = SYSCALLS.get(), flags = SYSCALLS.get(); + var iov = HEAP32[(((message)+(8))>>2)]; + var num = HEAP32[(((message)+(12))>>2)]; + // get the total amount of data we can read across all arrays + var total = 0; + for (var i = 0; i < num; i++) { + total += HEAP32[(((iov)+((8 * i) + 4))>>2)]; + } + // try to read total data + var msg = sock.sock_ops.recvmsg(sock, total); + if (!msg) return 0; // socket is closed + + // TODO honor flags: + // MSG_OOB + // Requests out-of-band data. The significance and semantics of out-of-band data are protocol-specific. + // MSG_PEEK + // Peeks at the incoming message. + // MSG_WAITALL + // Requests that the function block until the full amount of data requested can be returned. The function may return a smaller amount of data if a signal is caught, if the connection is terminated, if MSG_PEEK was specified, or if an error is pending for the socket. + + // write the source address out + var name = HEAP32[((message)>>2)]; + if (name) { + var res = __write_sockaddr(name, sock.family, DNS.lookup_name(msg.addr), msg.port); + assert(!res.errno); + } + // write the buffer out to the scatter-gather arrays + var bytesRead = 0; + var bytesRemaining = msg.buffer.byteLength; + for (var i = 0; bytesRemaining > 0 && i < num; i++) { + var iovbase = HEAP32[(((iov)+((8 * i) + 0))>>2)]; + var iovlen = HEAP32[(((iov)+((8 * i) + 4))>>2)]; + if (!iovlen) { + continue; + } + var length = Math.min(iovlen, bytesRemaining); + var buf = msg.buffer.subarray(bytesRead, bytesRead + length); + HEAPU8.set(buf, iovbase + bytesRead); + bytesRead += length; + bytesRemaining -= length; + } + + // TODO set msghdr.msg_flags + // MSG_EOR + // End of record was received (if supported by the protocol). + // MSG_OOB + // Out-of-band data was received. + // MSG_TRUNC + // Normal data was truncated. + // MSG_CTRUNC + + return bytesRead; + } + default: abort('unsupported socketcall syscall ' + call); + } + } catch (e) { + if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e); + return -e.errno; + } + } + + function ___syscall118(which, varargs) {SYSCALLS.varargs = varargs; + try { + // fsync + var stream = SYSCALLS.getStreamFromFD(); + return 0; // we can't do anything synchronously; the in-memory FS is already synced to + } catch (e) { + if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e); + return -e.errno; + } + } + + function ___syscall140(which, varargs) {SYSCALLS.varargs = varargs; + try { + // llseek + var stream = SYSCALLS.getStreamFromFD(), offset_high = SYSCALLS.get(), offset_low = SYSCALLS.get(), result = SYSCALLS.get(), whence = SYSCALLS.get(); + // NOTE: offset_high is unused - Emscripten's off_t is 32-bit + var offset = offset_low; + FS.llseek(stream, offset, whence); + HEAP32[((result)>>2)]=stream.position; + if (stream.getdents && offset === 0 && whence === 0) stream.getdents = null; // reset readdir state + return 0; + } catch (e) { + if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e); + return -e.errno; + } + } + + function ___syscall145(which, varargs) {SYSCALLS.varargs = varargs; + try { + // readv + var stream = SYSCALLS.getStreamFromFD(), iov = SYSCALLS.get(), iovcnt = SYSCALLS.get(); + return SYSCALLS.doReadv(stream, iov, iovcnt); + } catch (e) { + if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e); + return -e.errno; + } + } + + function ___syscall146(which, varargs) {SYSCALLS.varargs = varargs; + try { + // writev + var stream = SYSCALLS.getStreamFromFD(), iov = SYSCALLS.get(), iovcnt = SYSCALLS.get(); + return SYSCALLS.doWritev(stream, iov, iovcnt); + } catch (e) { + if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e); + return -e.errno; + } + } + + function ___syscall148(which, varargs) {SYSCALLS.varargs = varargs; + try { + // fdatasync + var stream = SYSCALLS.getStreamFromFD(); + return 0; // we can't do anything synchronously; the in-memory FS is already synced to + } catch (e) { + if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e); + return -e.errno; + } + } + + function ___syscall168(which, varargs) {SYSCALLS.varargs = varargs; + try { + // poll + var fds = SYSCALLS.get(), nfds = SYSCALLS.get(), timeout = SYSCALLS.get(); + var nonzero = 0; + for (var i = 0; i < nfds; i++) { + var pollfd = fds + 8 * i; + var fd = HEAP32[((pollfd)>>2)]; + var events = HEAP16[(((pollfd)+(4))>>1)]; + var mask = 32; + var stream = FS.getStream(fd); + if (stream) { + mask = SYSCALLS.DEFAULT_POLLMASK; + if (stream.stream_ops.poll) { + mask = stream.stream_ops.poll(stream); + } + } + mask &= events | 8 | 16; + if (mask) nonzero++; + HEAP16[(((pollfd)+(6))>>1)]=mask; + } + return nonzero; + } catch (e) { + if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e); + return -e.errno; + } + } + + function ___syscall194(which, varargs) {SYSCALLS.varargs = varargs; + try { + // ftruncate64 + var fd = SYSCALLS.get(), zero = SYSCALLS.getZero(), length = SYSCALLS.get64(); + FS.ftruncate(fd, length); + return 0; + } catch (e) { + if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e); + return -e.errno; + } + } + + function ___syscall195(which, varargs) {SYSCALLS.varargs = varargs; + try { + // SYS_stat64 + var path = SYSCALLS.getStr(), buf = SYSCALLS.get(); + return SYSCALLS.doStat(FS.stat, path, buf); + } catch (e) { + if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e); + return -e.errno; + } + } + + function ___syscall197(which, varargs) {SYSCALLS.varargs = varargs; + try { + // SYS_fstat64 + var stream = SYSCALLS.getStreamFromFD(), buf = SYSCALLS.get(); + return SYSCALLS.doStat(FS.stat, stream.path, buf); + } catch (e) { + if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e); + return -e.errno; + } + } + + function ___syscall220(which, varargs) {SYSCALLS.varargs = varargs; + try { + // SYS_getdents64 + var stream = SYSCALLS.getStreamFromFD(), dirp = SYSCALLS.get(), count = SYSCALLS.get(); + if (!stream.getdents) { + stream.getdents = FS.readdir(stream.path); + } + var pos = 0; + while (stream.getdents.length > 0 && pos + 268 <= count) { + var id; + var type; + var name = stream.getdents.pop(); + if (name[0] === '.') { + id = 1; + type = 4; // DT_DIR + } else { + var child = FS.lookupNode(stream.node, name); + id = child.id; + type = FS.isChrdev(child.mode) ? 2 : // DT_CHR, character device. + FS.isDir(child.mode) ? 4 : // DT_DIR, directory. + FS.isLink(child.mode) ? 10 : // DT_LNK, symbolic link. + 8; // DT_REG, regular file. + } + HEAP32[((dirp + pos)>>2)]=id; + HEAP32[(((dirp + pos)+(4))>>2)]=stream.position; + HEAP16[(((dirp + pos)+(8))>>1)]=268; + HEAP8[(((dirp + pos)+(10))>>0)]=type; + stringToUTF8(name, dirp + pos + 11, 256); + pos += 268; + } + return pos; + } catch (e) { + if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e); + return -e.errno; + } + } + + function ___syscall221(which, varargs) {SYSCALLS.varargs = varargs; + try { + // fcntl64 + var stream = SYSCALLS.getStreamFromFD(), cmd = SYSCALLS.get(); + switch (cmd) { + case 0: { + var arg = SYSCALLS.get(); + if (arg < 0) { + return -ERRNO_CODES.EINVAL; + } + var newStream; + newStream = FS.open(stream.path, stream.flags, 0, arg); + return newStream.fd; + } + case 1: + case 2: + return 0; // FD_CLOEXEC makes no sense for a single process. + case 3: + return stream.flags; + case 4: { + var arg = SYSCALLS.get(); + stream.flags |= arg; + return 0; + } + case 12: + /* case 12: Currently in musl F_GETLK64 has same value as F_GETLK, so omitted to avoid duplicate case blocks. If that changes, uncomment this */ { + + var arg = SYSCALLS.get(); + var offset = 0; + // We're always unlocked. + HEAP16[(((arg)+(offset))>>1)]=2; + return 0; + } + case 13: + case 14: + /* case 13: Currently in musl F_SETLK64 has same value as F_SETLK, so omitted to avoid duplicate case blocks. If that changes, uncomment this */ + /* case 14: Currently in musl F_SETLKW64 has same value as F_SETLKW, so omitted to avoid duplicate case blocks. If that changes, uncomment this */ + + + return 0; // Pretend that the locking is successful. + case 16: + case 8: + return -ERRNO_CODES.EINVAL; // These are for sockets. We don't have them fully implemented yet. + case 9: + // musl trusts getown return values, due to a bug where they must be, as they overlap with errors. just return -1 here, so fnctl() returns that, and we set errno ourselves. + ___setErrNo(ERRNO_CODES.EINVAL); + return -1; + default: { + return -ERRNO_CODES.EINVAL; + } + } + } catch (e) { + if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e); + return -e.errno; + } + } + + function ___syscall272(which, varargs) {SYSCALLS.varargs = varargs; + try { + // fadvise64_64 + return 0; // your advice is important to us (but we can't use it) + } catch (e) { + if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e); + return -e.errno; + } + } + + function ___syscall295(which, varargs) {SYSCALLS.varargs = varargs; + try { + // openat + var dirfd = SYSCALLS.get(), path = SYSCALLS.getStr(), flags = SYSCALLS.get(), mode = SYSCALLS.get(); + path = SYSCALLS.calculateAt(dirfd, path); + return FS.open(path, flags, mode).fd; + } catch (e) { + if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e); + return -e.errno; + } + } + + function ___syscall296(which, varargs) {SYSCALLS.varargs = varargs; + try { + // mkdirat + var dirfd = SYSCALLS.get(), path = SYSCALLS.getStr(), mode = SYSCALLS.get(); + path = SYSCALLS.calculateAt(dirfd, path); + return SYSCALLS.doMkdir(path, mode); + } catch (e) { + if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e); + return -e.errno; + } + } + + function ___syscall3(which, varargs) {SYSCALLS.varargs = varargs; + try { + // read + var stream = SYSCALLS.getStreamFromFD(), buf = SYSCALLS.get(), count = SYSCALLS.get(); + return FS.read(stream, HEAP8,buf, count); + } catch (e) { + if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e); + return -e.errno; + } + } + + function ___syscall300(which, varargs) {SYSCALLS.varargs = varargs; + try { + // fstatat64 + var dirfd = SYSCALLS.get(), path = SYSCALLS.getStr(), buf = SYSCALLS.get(), flags = SYSCALLS.get(); + var nofollow = flags & 256; + flags = flags & (~256); + assert(!flags, flags); + path = SYSCALLS.calculateAt(dirfd, path); + return SYSCALLS.doStat(nofollow ? FS.lstat : FS.stat, path, buf); + } catch (e) { + if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e); + return -e.errno; + } + } + + function ___syscall301(which, varargs) {SYSCALLS.varargs = varargs; + try { + // unlinkat + var dirfd = SYSCALLS.get(), path = SYSCALLS.getStr(), flags = SYSCALLS.get(); + path = SYSCALLS.calculateAt(dirfd, path); + if (flags === 0) { + FS.unlink(path); + } else if (flags === 512) { + FS.rmdir(path); + } else { + abort('Invalid flags passed to unlinkat'); + } + return 0; + } catch (e) { + if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e); + return -e.errno; + } + } + + function ___syscall302(which, varargs) {SYSCALLS.varargs = varargs; + try { + // renameat + var olddirfd = SYSCALLS.get(), oldpath = SYSCALLS.getStr(), newdirfd = SYSCALLS.get(), newpath = SYSCALLS.getStr(); + oldpath = SYSCALLS.calculateAt(olddirfd, oldpath); + newpath = SYSCALLS.calculateAt(newdirfd, newpath); + FS.rename(oldpath, newpath); + return 0; + } catch (e) { + if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e); + return -e.errno; + } + } + + function ___syscall303(which, varargs) {SYSCALLS.varargs = varargs; + try { + // linkat + return -ERRNO_CODES.EMLINK; // no hardlinks for us + } catch (e) { + if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e); + return -e.errno; + } + } + + function ___syscall304(which, varargs) {SYSCALLS.varargs = varargs; + try { + // symlinkat + var target = SYSCALLS.get(), newdirfd = SYSCALLS.get(), linkpath = SYSCALLS.get(); + linkpath = SYSCALLS.calculateAt(newdirfd, linkpath); + FS.symlink(target, linkpath); + return 0; + } catch (e) { + if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e); + return -e.errno; + } + } + + function ___syscall305(which, varargs) {SYSCALLS.varargs = varargs; + try { + // readlinkat + var dirfd = SYSCALLS.get(), path = SYSCALLS.getStr(), buf = SYSCALLS.get(), bufsize = SYSCALLS.get(); + path = SYSCALLS.calculateAt(dirfd, path); + return SYSCALLS.doReadlink(path, buf, bufsize); + } catch (e) { + if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e); + return -e.errno; + } + } + + function ___syscall320(which, varargs) {SYSCALLS.varargs = varargs; + try { + // utimensat + var dirfd = SYSCALLS.get(), path = SYSCALLS.getStr(), times = SYSCALLS.get(), flags = SYSCALLS.get(); + assert(flags === 0); + path = SYSCALLS.calculateAt(dirfd, path); + var seconds = HEAP32[((times)>>2)]; + var nanoseconds = HEAP32[(((times)+(4))>>2)]; + var atime = (seconds*1000) + (nanoseconds/(1000*1000)); + times += 8; + seconds = HEAP32[((times)>>2)]; + nanoseconds = HEAP32[(((times)+(4))>>2)]; + var mtime = (seconds*1000) + (nanoseconds/(1000*1000)); + FS.utime(path, atime, mtime); + return 0; + } catch (e) { + if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e); + return -e.errno; + } + } + + function ___syscall324(which, varargs) {SYSCALLS.varargs = varargs; + try { + // fallocate + var stream = SYSCALLS.getStreamFromFD(), mode = SYSCALLS.get(), offset = SYSCALLS.get64(), len = SYSCALLS.get64(); + assert(mode === 0); + FS.allocate(stream, offset, len); + return 0; + } catch (e) { + if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e); + return -e.errno; + } + } + + function ___syscall333(which, varargs) {SYSCALLS.varargs = varargs; + try { + // preadv + var stream = SYSCALLS.getStreamFromFD(), iov = SYSCALLS.get(), iovcnt = SYSCALLS.get(), offset = SYSCALLS.get(); + return SYSCALLS.doReadv(stream, iov, iovcnt, offset); + } catch (e) { + if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e); + return -e.errno; + } + } + + function ___syscall334(which, varargs) {SYSCALLS.varargs = varargs; + try { + // pwritev + var stream = SYSCALLS.getStreamFromFD(), iov = SYSCALLS.get(), iovcnt = SYSCALLS.get(), offset = SYSCALLS.get(); + return SYSCALLS.doWritev(stream, iov, iovcnt, offset); + } catch (e) { + if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e); + return -e.errno; + } + } + + function ___syscall5(which, varargs) {SYSCALLS.varargs = varargs; + try { + // open + var pathname = SYSCALLS.getStr(), flags = SYSCALLS.get(), mode = SYSCALLS.get() // optional TODO + var stream = FS.open(pathname, flags, mode); + return stream.fd; + } catch (e) { + if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e); + return -e.errno; + } + } + + function ___syscall54(which, varargs) {SYSCALLS.varargs = varargs; + try { + // ioctl + var stream = SYSCALLS.getStreamFromFD(), op = SYSCALLS.get(); + switch (op) { + case 21509: + case 21505: { + if (!stream.tty) return -ERRNO_CODES.ENOTTY; + return 0; + } + case 21510: + case 21511: + case 21512: + case 21506: + case 21507: + case 21508: { + if (!stream.tty) return -ERRNO_CODES.ENOTTY; + return 0; // no-op, not actually adjusting terminal settings + } + case 21519: { + if (!stream.tty) return -ERRNO_CODES.ENOTTY; + var argp = SYSCALLS.get(); + HEAP32[((argp)>>2)]=0; + return 0; + } + case 21520: { + if (!stream.tty) return -ERRNO_CODES.ENOTTY; + return -ERRNO_CODES.EINVAL; // not supported + } + case 21531: { + var argp = SYSCALLS.get(); + return FS.ioctl(stream, op, argp); + } + case 21523: { + // TODO: in theory we should write to the winsize struct that gets + // passed in, but for now musl doesn't read anything on it + if (!stream.tty) return -ERRNO_CODES.ENOTTY; + return 0; + } + case 21524: { + // TODO: technically, this ioctl call should change the window size. + // but, since emscripten doesn't have any concept of a terminal window + // yet, we'll just silently throw it away as we do TIOCGWINSZ + if (!stream.tty) return -ERRNO_CODES.ENOTTY; + return 0; + } + default: abort('bad ioctl syscall ' + op); + } + } catch (e) { + if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e); + return -e.errno; + } + } + + function ___syscall6(which, varargs) {SYSCALLS.varargs = varargs; + try { + // close + var stream = SYSCALLS.getStreamFromFD(); + FS.close(stream); + return 0; + } catch (e) { + if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e); + return -e.errno; + } + } + + function ___unlock() {} + + function _abort() { + Module['abort'](); + } + + + function _emscripten_get_now_res() { // return resolution of get_now, in nanoseconds + if (ENVIRONMENT_IS_NODE) { + return 1; // nanoseconds + } else + if (typeof dateNow !== 'undefined') { + return 1000; // microseconds (1/1000 of a millisecond) + } else + if (typeof performance === 'object' && performance && typeof performance['now'] === 'function') { + return 1000; // microseconds (1/1000 of a millisecond) + } else { + return 1000*1000; // milliseconds + } + } + + + function _emscripten_get_now() { abort() }function _emscripten_get_now_is_monotonic() { + // return whether emscripten_get_now is guaranteed monotonic; the Date.now + // implementation is not :( + return (0 + || ENVIRONMENT_IS_NODE + || (typeof dateNow !== 'undefined') + || (typeof performance === 'object' && performance && typeof performance['now'] === 'function') + ); + }function _clock_getres(clk_id, res) { + // int clock_getres(clockid_t clk_id, struct timespec *res); + var nsec; + if (clk_id === 0) { + nsec = 1000 * 1000; // educated guess that it's milliseconds + } else if (clk_id === 1 && _emscripten_get_now_is_monotonic()) { + nsec = _emscripten_get_now_res(); + } else { + ___setErrNo(22); + return -1; + } + HEAP32[((res)>>2)]=(nsec/1000000000)|0; + HEAP32[(((res)+(4))>>2)]=nsec // resolution is nanoseconds + return 0; + } + + function _clock_gettime(clk_id, tp) { + // int clock_gettime(clockid_t clk_id, struct timespec *tp); + var now; + if (clk_id === 0) { + now = Date.now(); + } else if (clk_id === 1 && _emscripten_get_now_is_monotonic()) { + now = _emscripten_get_now(); + } else { + ___setErrNo(22); + return -1; + } + HEAP32[((tp)>>2)]=(now/1000)|0; // seconds + HEAP32[(((tp)+(4))>>2)]=((now % 1000)*1000*1000)|0; // nanoseconds + return 0; + } + + var _emscripten_asm_const_int=true; + + function _emscripten_get_heap_size() { + return HEAP8.length; + } + + + function abortOnCannotGrowMemory(requestedSize) { + abort('Cannot enlarge memory arrays to size ' + requestedSize + ' bytes (OOM). Either (1) compile with -s TOTAL_MEMORY=X with X higher than the current value ' + HEAP8.length + ', (2) compile with -s ALLOW_MEMORY_GROWTH=1 which allows increasing the size at runtime, or (3) if you want malloc to return NULL (0) instead of this abort, compile with -s ABORTING_MALLOC=0 '); + }function _emscripten_resize_heap(requestedSize) { + abortOnCannotGrowMemory(requestedSize); + } + + function _llvm_trap() { + abort('trap!'); + } + + + function _emscripten_memcpy_big(dest, src, num) { + HEAPU8.set(HEAPU8.subarray(src, src+num), dest); + } + + + + + + + function _usleep(useconds) { + // int usleep(useconds_t useconds); + // http://pubs.opengroup.org/onlinepubs/000095399/functions/usleep.html + // We're single-threaded, so use a busy loop. Super-ugly. + var msec = useconds / 1000; + if ((ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) && self['performance'] && self['performance']['now']) { + var start = self['performance']['now'](); + while (self['performance']['now']() - start < msec) { + // Do nothing. + } + } else { + var start = Date.now(); + while (Date.now() - start < msec) { + // Do nothing. + } + } + return 0; + }function _nanosleep(rqtp, rmtp) { + // int nanosleep(const struct timespec *rqtp, struct timespec *rmtp); + var seconds = HEAP32[((rqtp)>>2)]; + var nanoseconds = HEAP32[(((rqtp)+(4))>>2)]; + if (rmtp !== 0) { + HEAP32[((rmtp)>>2)]=0; + HEAP32[(((rmtp)+(4))>>2)]=0; + } + return _usleep((seconds * 1e6) + (nanoseconds / 1000)); + } + + function _pthread_cond_destroy() { return 0; } + + function _pthread_cond_init() { return 0; } + + function _pthread_cond_timedwait() { return 0; } + + function _pthread_rwlock_init() { return 0; } + + function _pthread_rwlock_rdlock() { return 0; } + + function _pthread_rwlock_unlock() { return 0; } + + function _pthread_rwlock_wrlock() { return 0; } + + function _raise(sig) { + err('Calling stub instead of raise()'); + ___setErrNo(ERRNO_CODES.ENOSYS); + warnOnce('raise() returning an error as we do not support it'); + return -1; + } + + + + function _sched_yield() { + return 0; + } +FS.staticInit();; +if (ENVIRONMENT_IS_NODE) { var fs = require("fs"); var NODEJS_PATH = require("path"); NODEFS.staticInit(); }; +if (ENVIRONMENT_IS_NODE) { + _emscripten_get_now = function _emscripten_get_now_actual() { + var t = process['hrtime'](); + return t[0] * 1e3 + t[1] / 1e6; + }; + } else if (typeof dateNow !== 'undefined') { + _emscripten_get_now = dateNow; + } else if (typeof performance === 'object' && performance && typeof performance['now'] === 'function') { + _emscripten_get_now = function() { return performance['now'](); }; + } else { + _emscripten_get_now = Date.now; + }; +var ASSERTIONS = true; + +// Copyright 2017 The Emscripten Authors. All rights reserved. +// Emscripten is available under two separate licenses, the MIT license and the +// University of Illinois/NCSA Open Source License. Both these licenses can be +// found in the LICENSE file. + +/** @type {function(string, boolean=, number=)} */ +function intArrayFromString(stringy, dontAddNull, length) { + var len = length > 0 ? length : lengthBytesUTF8(stringy)+1; + var u8array = new Array(len); + var numBytesWritten = stringToUTF8Array(stringy, u8array, 0, u8array.length); + if (dontAddNull) u8array.length = numBytesWritten; + return u8array; +} + +function intArrayToString(array) { + var ret = []; + for (var i = 0; i < array.length; i++) { + var chr = array[i]; + if (chr > 0xFF) { + if (ASSERTIONS) { + assert(false, 'Character code ' + chr + ' (' + String.fromCharCode(chr) + ') at offset ' + i + ' not in 0x00-0xFF.'); + } + chr &= 0xFF; + } + ret.push(String.fromCharCode(chr)); + } + return ret.join(''); +} + + +// ASM_LIBRARY EXTERN PRIMITIVES: Int8Array,Int32Array + + +function nullFunc_ii(x) { err("Invalid function pointer called with signature 'ii'. Perhaps this is an invalid value (e.g. caused by calling a virtual method on a NULL pointer)? Or calling a function with an incorrect type, which will fail? (it is worth building your source files with -Werror (warnings are errors), as warnings can indicate undefined behavior which can cause this)"); err("Build with ASSERTIONS=2 for more info.");abort(x) } + +function nullFunc_iiii(x) { err("Invalid function pointer called with signature 'iiii'. Perhaps this is an invalid value (e.g. caused by calling a virtual method on a NULL pointer)? Or calling a function with an incorrect type, which will fail? (it is worth building your source files with -Werror (warnings are errors), as warnings can indicate undefined behavior which can cause this)"); err("Build with ASSERTIONS=2 for more info.");abort(x) } + +function nullFunc_v(x) { err("Invalid function pointer called with signature 'v'. Perhaps this is an invalid value (e.g. caused by calling a virtual method on a NULL pointer)? Or calling a function with an incorrect type, which will fail? (it is worth building your source files with -Werror (warnings are errors), as warnings can indicate undefined behavior which can cause this)"); err("Build with ASSERTIONS=2 for more info.");abort(x) } + +var asmGlobalArg = {} + +var asmLibraryArg = { + "abort": abort, + "setTempRet0": setTempRet0, + "getTempRet0": getTempRet0, + "abortStackOverflow": abortStackOverflow, + "nullFunc_ii": nullFunc_ii, + "nullFunc_iiii": nullFunc_iiii, + "nullFunc_v": nullFunc_v, + "__Exit": __Exit, + "___assert_fail": ___assert_fail, + "___lock": ___lock, + "___setErrNo": ___setErrNo, + "___syscall102": ___syscall102, + "___syscall118": ___syscall118, + "___syscall140": ___syscall140, + "___syscall145": ___syscall145, + "___syscall146": ___syscall146, + "___syscall148": ___syscall148, + "___syscall168": ___syscall168, + "___syscall194": ___syscall194, + "___syscall195": ___syscall195, + "___syscall197": ___syscall197, + "___syscall220": ___syscall220, + "___syscall221": ___syscall221, + "___syscall272": ___syscall272, + "___syscall295": ___syscall295, + "___syscall296": ___syscall296, + "___syscall3": ___syscall3, + "___syscall300": ___syscall300, + "___syscall301": ___syscall301, + "___syscall302": ___syscall302, + "___syscall303": ___syscall303, + "___syscall304": ___syscall304, + "___syscall305": ___syscall305, + "___syscall320": ___syscall320, + "___syscall324": ___syscall324, + "___syscall333": ___syscall333, + "___syscall334": ___syscall334, + "___syscall5": ___syscall5, + "___syscall54": ___syscall54, + "___syscall6": ___syscall6, + "___unlock": ___unlock, + "__inet_ntop4_raw": __inet_ntop4_raw, + "__inet_ntop6_raw": __inet_ntop6_raw, + "__inet_pton4_raw": __inet_pton4_raw, + "__inet_pton6_raw": __inet_pton6_raw, + "__read_sockaddr": __read_sockaddr, + "__write_sockaddr": __write_sockaddr, + "_abort": _abort, + "_clock_getres": _clock_getres, + "_clock_gettime": _clock_gettime, + "_emscripten_asm_const_i": _emscripten_asm_const_i, + "_emscripten_get_heap_size": _emscripten_get_heap_size, + "_emscripten_get_now": _emscripten_get_now, + "_emscripten_get_now_is_monotonic": _emscripten_get_now_is_monotonic, + "_emscripten_get_now_res": _emscripten_get_now_res, + "_emscripten_memcpy_big": _emscripten_memcpy_big, + "_emscripten_resize_heap": _emscripten_resize_heap, + "_exit": _exit, + "_htons": _htons, + "_llvm_trap": _llvm_trap, + "_nanosleep": _nanosleep, + "_pthread_cond_destroy": _pthread_cond_destroy, + "_pthread_cond_init": _pthread_cond_init, + "_pthread_cond_timedwait": _pthread_cond_timedwait, + "_pthread_rwlock_init": _pthread_rwlock_init, + "_pthread_rwlock_rdlock": _pthread_rwlock_rdlock, + "_pthread_rwlock_unlock": _pthread_rwlock_unlock, + "_pthread_rwlock_wrlock": _pthread_rwlock_wrlock, + "_raise": _raise, + "_sched_yield": _sched_yield, + "_usleep": _usleep, + "abortOnCannotGrowMemory": abortOnCannotGrowMemory, + "tempDoublePtr": tempDoublePtr, + "DYNAMICTOP_PTR": DYNAMICTOP_PTR +} +// EMSCRIPTEN_START_ASM +var asm =Module["asm"]// EMSCRIPTEN_END_ASM +(asmGlobalArg, asmLibraryArg, buffer); + +var real____errno_location = asm["___errno_location"]; asm["___errno_location"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return real____errno_location.apply(null, arguments); +}; + +var real____wasi_args_get = asm["___wasi_args_get"]; asm["___wasi_args_get"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return real____wasi_args_get.apply(null, arguments); +}; + +var real____wasi_args_sizes_get = asm["___wasi_args_sizes_get"]; asm["___wasi_args_sizes_get"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return real____wasi_args_sizes_get.apply(null, arguments); +}; + +var real____wasi_clock_res_get = asm["___wasi_clock_res_get"]; asm["___wasi_clock_res_get"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return real____wasi_clock_res_get.apply(null, arguments); +}; + +var real____wasi_clock_time_get = asm["___wasi_clock_time_get"]; asm["___wasi_clock_time_get"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return real____wasi_clock_time_get.apply(null, arguments); +}; + +var real____wasi_environ_get = asm["___wasi_environ_get"]; asm["___wasi_environ_get"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return real____wasi_environ_get.apply(null, arguments); +}; + +var real____wasi_environ_sizes_get = asm["___wasi_environ_sizes_get"]; asm["___wasi_environ_sizes_get"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return real____wasi_environ_sizes_get.apply(null, arguments); +}; + +var real____wasi_fd_advise = asm["___wasi_fd_advise"]; asm["___wasi_fd_advise"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return real____wasi_fd_advise.apply(null, arguments); +}; + +var real____wasi_fd_allocate = asm["___wasi_fd_allocate"]; asm["___wasi_fd_allocate"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return real____wasi_fd_allocate.apply(null, arguments); +}; + +var real____wasi_fd_close = asm["___wasi_fd_close"]; asm["___wasi_fd_close"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return real____wasi_fd_close.apply(null, arguments); +}; + +var real____wasi_fd_datasync = asm["___wasi_fd_datasync"]; asm["___wasi_fd_datasync"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return real____wasi_fd_datasync.apply(null, arguments); +}; + +var real____wasi_fd_fdstat_get = asm["___wasi_fd_fdstat_get"]; asm["___wasi_fd_fdstat_get"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return real____wasi_fd_fdstat_get.apply(null, arguments); +}; + +var real____wasi_fd_fdstat_set_flags = asm["___wasi_fd_fdstat_set_flags"]; asm["___wasi_fd_fdstat_set_flags"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return real____wasi_fd_fdstat_set_flags.apply(null, arguments); +}; + +var real____wasi_fd_fdstat_set_rights = asm["___wasi_fd_fdstat_set_rights"]; asm["___wasi_fd_fdstat_set_rights"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return real____wasi_fd_fdstat_set_rights.apply(null, arguments); +}; + +var real____wasi_fd_filestat_get = asm["___wasi_fd_filestat_get"]; asm["___wasi_fd_filestat_get"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return real____wasi_fd_filestat_get.apply(null, arguments); +}; + +var real____wasi_fd_filestat_set_size = asm["___wasi_fd_filestat_set_size"]; asm["___wasi_fd_filestat_set_size"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return real____wasi_fd_filestat_set_size.apply(null, arguments); +}; + +var real____wasi_fd_filestat_set_times = asm["___wasi_fd_filestat_set_times"]; asm["___wasi_fd_filestat_set_times"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return real____wasi_fd_filestat_set_times.apply(null, arguments); +}; + +var real____wasi_fd_pread = asm["___wasi_fd_pread"]; asm["___wasi_fd_pread"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return real____wasi_fd_pread.apply(null, arguments); +}; + +var real____wasi_fd_prestat_dir_name = asm["___wasi_fd_prestat_dir_name"]; asm["___wasi_fd_prestat_dir_name"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return real____wasi_fd_prestat_dir_name.apply(null, arguments); +}; + +var real____wasi_fd_prestat_get = asm["___wasi_fd_prestat_get"]; asm["___wasi_fd_prestat_get"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return real____wasi_fd_prestat_get.apply(null, arguments); +}; + +var real____wasi_fd_pwrite = asm["___wasi_fd_pwrite"]; asm["___wasi_fd_pwrite"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return real____wasi_fd_pwrite.apply(null, arguments); +}; + +var real____wasi_fd_read = asm["___wasi_fd_read"]; asm["___wasi_fd_read"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return real____wasi_fd_read.apply(null, arguments); +}; + +var real____wasi_fd_readdir = asm["___wasi_fd_readdir"]; asm["___wasi_fd_readdir"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return real____wasi_fd_readdir.apply(null, arguments); +}; + +var real____wasi_fd_renumber = asm["___wasi_fd_renumber"]; asm["___wasi_fd_renumber"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return real____wasi_fd_renumber.apply(null, arguments); +}; + +var real____wasi_fd_seek = asm["___wasi_fd_seek"]; asm["___wasi_fd_seek"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return real____wasi_fd_seek.apply(null, arguments); +}; + +var real____wasi_fd_sync = asm["___wasi_fd_sync"]; asm["___wasi_fd_sync"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return real____wasi_fd_sync.apply(null, arguments); +}; + +var real____wasi_fd_tell = asm["___wasi_fd_tell"]; asm["___wasi_fd_tell"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return real____wasi_fd_tell.apply(null, arguments); +}; + +var real____wasi_fd_write = asm["___wasi_fd_write"]; asm["___wasi_fd_write"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return real____wasi_fd_write.apply(null, arguments); +}; + +var real____wasi_path_create_directory = asm["___wasi_path_create_directory"]; asm["___wasi_path_create_directory"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return real____wasi_path_create_directory.apply(null, arguments); +}; + +var real____wasi_path_filestat_get = asm["___wasi_path_filestat_get"]; asm["___wasi_path_filestat_get"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return real____wasi_path_filestat_get.apply(null, arguments); +}; + +var real____wasi_path_filestat_set_times = asm["___wasi_path_filestat_set_times"]; asm["___wasi_path_filestat_set_times"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return real____wasi_path_filestat_set_times.apply(null, arguments); +}; + +var real____wasi_path_link = asm["___wasi_path_link"]; asm["___wasi_path_link"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return real____wasi_path_link.apply(null, arguments); +}; + +var real____wasi_path_open = asm["___wasi_path_open"]; asm["___wasi_path_open"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return real____wasi_path_open.apply(null, arguments); +}; + +var real____wasi_path_readlink = asm["___wasi_path_readlink"]; asm["___wasi_path_readlink"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return real____wasi_path_readlink.apply(null, arguments); +}; + +var real____wasi_path_remove_directory = asm["___wasi_path_remove_directory"]; asm["___wasi_path_remove_directory"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return real____wasi_path_remove_directory.apply(null, arguments); +}; + +var real____wasi_path_rename = asm["___wasi_path_rename"]; asm["___wasi_path_rename"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return real____wasi_path_rename.apply(null, arguments); +}; + +var real____wasi_path_symlink = asm["___wasi_path_symlink"]; asm["___wasi_path_symlink"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return real____wasi_path_symlink.apply(null, arguments); +}; + +var real____wasi_path_unlink_file = asm["___wasi_path_unlink_file"]; asm["___wasi_path_unlink_file"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return real____wasi_path_unlink_file.apply(null, arguments); +}; + +var real____wasi_poll_oneoff = asm["___wasi_poll_oneoff"]; asm["___wasi_poll_oneoff"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return real____wasi_poll_oneoff.apply(null, arguments); +}; + +var real____wasi_proc_exit = asm["___wasi_proc_exit"]; asm["___wasi_proc_exit"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return real____wasi_proc_exit.apply(null, arguments); +}; + +var real____wasi_proc_raise = asm["___wasi_proc_raise"]; asm["___wasi_proc_raise"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return real____wasi_proc_raise.apply(null, arguments); +}; + +var real____wasi_random_get = asm["___wasi_random_get"]; asm["___wasi_random_get"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return real____wasi_random_get.apply(null, arguments); +}; + +var real____wasi_sched_yield = asm["___wasi_sched_yield"]; asm["___wasi_sched_yield"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return real____wasi_sched_yield.apply(null, arguments); +}; + +var real____wasi_sock_recv = asm["___wasi_sock_recv"]; asm["___wasi_sock_recv"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return real____wasi_sock_recv.apply(null, arguments); +}; + +var real____wasi_sock_send = asm["___wasi_sock_send"]; asm["___wasi_sock_send"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return real____wasi_sock_send.apply(null, arguments); +}; + +var real____wasi_sock_shutdown = asm["___wasi_sock_shutdown"]; asm["___wasi_sock_shutdown"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return real____wasi_sock_shutdown.apply(null, arguments); +}; + +var real__fflush = asm["_fflush"]; asm["_fflush"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return real__fflush.apply(null, arguments); +}; + +var real__free = asm["_free"]; asm["_free"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return real__free.apply(null, arguments); +}; + +var real__handleFiles = asm["_handleFiles"]; asm["_handleFiles"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return real__handleFiles.apply(null, arguments); +}; + +var real__main = asm["_main"]; asm["_main"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return real__main.apply(null, arguments); +}; + +var real__malloc = asm["_malloc"]; asm["_malloc"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return real__malloc.apply(null, arguments); +}; + +var real__sbrk = asm["_sbrk"]; asm["_sbrk"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return real__sbrk.apply(null, arguments); +}; + +var real_establishStackSpace = asm["establishStackSpace"]; asm["establishStackSpace"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return real_establishStackSpace.apply(null, arguments); +}; + +var real_stackAlloc = asm["stackAlloc"]; asm["stackAlloc"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return real_stackAlloc.apply(null, arguments); +}; + +var real_stackRestore = asm["stackRestore"]; asm["stackRestore"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return real_stackRestore.apply(null, arguments); +}; + +var real_stackSave = asm["stackSave"]; asm["stackSave"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return real_stackSave.apply(null, arguments); +}; +Module["asm"] = asm; +var ___errno_location = Module["___errno_location"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return Module["asm"]["___errno_location"].apply(null, arguments) }; +var ___wasi_args_get = Module["___wasi_args_get"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return Module["asm"]["___wasi_args_get"].apply(null, arguments) }; +var ___wasi_args_sizes_get = Module["___wasi_args_sizes_get"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return Module["asm"]["___wasi_args_sizes_get"].apply(null, arguments) }; +var ___wasi_clock_res_get = Module["___wasi_clock_res_get"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return Module["asm"]["___wasi_clock_res_get"].apply(null, arguments) }; +var ___wasi_clock_time_get = Module["___wasi_clock_time_get"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return Module["asm"]["___wasi_clock_time_get"].apply(null, arguments) }; +var ___wasi_environ_get = Module["___wasi_environ_get"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return Module["asm"]["___wasi_environ_get"].apply(null, arguments) }; +var ___wasi_environ_sizes_get = Module["___wasi_environ_sizes_get"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return Module["asm"]["___wasi_environ_sizes_get"].apply(null, arguments) }; +var ___wasi_fd_advise = Module["___wasi_fd_advise"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return Module["asm"]["___wasi_fd_advise"].apply(null, arguments) }; +var ___wasi_fd_allocate = Module["___wasi_fd_allocate"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return Module["asm"]["___wasi_fd_allocate"].apply(null, arguments) }; +var ___wasi_fd_close = Module["___wasi_fd_close"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return Module["asm"]["___wasi_fd_close"].apply(null, arguments) }; +var ___wasi_fd_datasync = Module["___wasi_fd_datasync"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return Module["asm"]["___wasi_fd_datasync"].apply(null, arguments) }; +var ___wasi_fd_fdstat_get = Module["___wasi_fd_fdstat_get"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return Module["asm"]["___wasi_fd_fdstat_get"].apply(null, arguments) }; +var ___wasi_fd_fdstat_set_flags = Module["___wasi_fd_fdstat_set_flags"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return Module["asm"]["___wasi_fd_fdstat_set_flags"].apply(null, arguments) }; +var ___wasi_fd_fdstat_set_rights = Module["___wasi_fd_fdstat_set_rights"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return Module["asm"]["___wasi_fd_fdstat_set_rights"].apply(null, arguments) }; +var ___wasi_fd_filestat_get = Module["___wasi_fd_filestat_get"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return Module["asm"]["___wasi_fd_filestat_get"].apply(null, arguments) }; +var ___wasi_fd_filestat_set_size = Module["___wasi_fd_filestat_set_size"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return Module["asm"]["___wasi_fd_filestat_set_size"].apply(null, arguments) }; +var ___wasi_fd_filestat_set_times = Module["___wasi_fd_filestat_set_times"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return Module["asm"]["___wasi_fd_filestat_set_times"].apply(null, arguments) }; +var ___wasi_fd_pread = Module["___wasi_fd_pread"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return Module["asm"]["___wasi_fd_pread"].apply(null, arguments) }; +var ___wasi_fd_prestat_dir_name = Module["___wasi_fd_prestat_dir_name"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return Module["asm"]["___wasi_fd_prestat_dir_name"].apply(null, arguments) }; +var ___wasi_fd_prestat_get = Module["___wasi_fd_prestat_get"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return Module["asm"]["___wasi_fd_prestat_get"].apply(null, arguments) }; +var ___wasi_fd_pwrite = Module["___wasi_fd_pwrite"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return Module["asm"]["___wasi_fd_pwrite"].apply(null, arguments) }; +var ___wasi_fd_read = Module["___wasi_fd_read"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return Module["asm"]["___wasi_fd_read"].apply(null, arguments) }; +var ___wasi_fd_readdir = Module["___wasi_fd_readdir"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return Module["asm"]["___wasi_fd_readdir"].apply(null, arguments) }; +var ___wasi_fd_renumber = Module["___wasi_fd_renumber"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return Module["asm"]["___wasi_fd_renumber"].apply(null, arguments) }; +var ___wasi_fd_seek = Module["___wasi_fd_seek"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return Module["asm"]["___wasi_fd_seek"].apply(null, arguments) }; +var ___wasi_fd_sync = Module["___wasi_fd_sync"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return Module["asm"]["___wasi_fd_sync"].apply(null, arguments) }; +var ___wasi_fd_tell = Module["___wasi_fd_tell"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return Module["asm"]["___wasi_fd_tell"].apply(null, arguments) }; +var ___wasi_fd_write = Module["___wasi_fd_write"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return Module["asm"]["___wasi_fd_write"].apply(null, arguments) }; +var ___wasi_path_create_directory = Module["___wasi_path_create_directory"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return Module["asm"]["___wasi_path_create_directory"].apply(null, arguments) }; +var ___wasi_path_filestat_get = Module["___wasi_path_filestat_get"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return Module["asm"]["___wasi_path_filestat_get"].apply(null, arguments) }; +var ___wasi_path_filestat_set_times = Module["___wasi_path_filestat_set_times"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return Module["asm"]["___wasi_path_filestat_set_times"].apply(null, arguments) }; +var ___wasi_path_link = Module["___wasi_path_link"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return Module["asm"]["___wasi_path_link"].apply(null, arguments) }; +var ___wasi_path_open = Module["___wasi_path_open"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return Module["asm"]["___wasi_path_open"].apply(null, arguments) }; +var ___wasi_path_readlink = Module["___wasi_path_readlink"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return Module["asm"]["___wasi_path_readlink"].apply(null, arguments) }; +var ___wasi_path_remove_directory = Module["___wasi_path_remove_directory"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return Module["asm"]["___wasi_path_remove_directory"].apply(null, arguments) }; +var ___wasi_path_rename = Module["___wasi_path_rename"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return Module["asm"]["___wasi_path_rename"].apply(null, arguments) }; +var ___wasi_path_symlink = Module["___wasi_path_symlink"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return Module["asm"]["___wasi_path_symlink"].apply(null, arguments) }; +var ___wasi_path_unlink_file = Module["___wasi_path_unlink_file"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return Module["asm"]["___wasi_path_unlink_file"].apply(null, arguments) }; +var ___wasi_poll_oneoff = Module["___wasi_poll_oneoff"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return Module["asm"]["___wasi_poll_oneoff"].apply(null, arguments) }; +var ___wasi_proc_exit = Module["___wasi_proc_exit"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return Module["asm"]["___wasi_proc_exit"].apply(null, arguments) }; +var ___wasi_proc_raise = Module["___wasi_proc_raise"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return Module["asm"]["___wasi_proc_raise"].apply(null, arguments) }; +var ___wasi_random_get = Module["___wasi_random_get"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return Module["asm"]["___wasi_random_get"].apply(null, arguments) }; +var ___wasi_sched_yield = Module["___wasi_sched_yield"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return Module["asm"]["___wasi_sched_yield"].apply(null, arguments) }; +var ___wasi_sock_recv = Module["___wasi_sock_recv"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return Module["asm"]["___wasi_sock_recv"].apply(null, arguments) }; +var ___wasi_sock_send = Module["___wasi_sock_send"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return Module["asm"]["___wasi_sock_send"].apply(null, arguments) }; +var ___wasi_sock_shutdown = Module["___wasi_sock_shutdown"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return Module["asm"]["___wasi_sock_shutdown"].apply(null, arguments) }; +var _fflush = Module["_fflush"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return Module["asm"]["_fflush"].apply(null, arguments) }; +var _free = Module["_free"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return Module["asm"]["_free"].apply(null, arguments) }; +var _handleFiles = Module["_handleFiles"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return Module["asm"]["_handleFiles"].apply(null, arguments) }; +var _main = Module["_main"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return Module["asm"]["_main"].apply(null, arguments) }; +var _malloc = Module["_malloc"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return Module["asm"]["_malloc"].apply(null, arguments) }; +var _memcpy = Module["_memcpy"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return Module["asm"]["_memcpy"].apply(null, arguments) }; +var _memset = Module["_memset"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return Module["asm"]["_memset"].apply(null, arguments) }; +var _sbrk = Module["_sbrk"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return Module["asm"]["_sbrk"].apply(null, arguments) }; +var establishStackSpace = Module["establishStackSpace"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return Module["asm"]["establishStackSpace"].apply(null, arguments) }; +var stackAlloc = Module["stackAlloc"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return Module["asm"]["stackAlloc"].apply(null, arguments) }; +var stackRestore = Module["stackRestore"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return Module["asm"]["stackRestore"].apply(null, arguments) }; +var stackSave = Module["stackSave"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return Module["asm"]["stackSave"].apply(null, arguments) }; +var dynCall_ii = Module["dynCall_ii"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return Module["asm"]["dynCall_ii"].apply(null, arguments) }; +var dynCall_iiii = Module["dynCall_iiii"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return Module["asm"]["dynCall_iiii"].apply(null, arguments) }; +var dynCall_v = Module["dynCall_v"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return Module["asm"]["dynCall_v"].apply(null, arguments) }; +; + + + +// === Auto-generated postamble setup entry stuff === + +Module['asm'] = asm; + +if (!Module["intArrayFromString"]) Module["intArrayFromString"] = function() { abort("'intArrayFromString' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Module["intArrayToString"]) Module["intArrayToString"] = function() { abort("'intArrayToString' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Module["ccall"]) Module["ccall"] = function() { abort("'ccall' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Module["cwrap"]) Module["cwrap"] = function() { abort("'cwrap' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Module["setValue"]) Module["setValue"] = function() { abort("'setValue' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Module["getValue"]) Module["getValue"] = function() { abort("'getValue' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Module["allocate"]) Module["allocate"] = function() { abort("'allocate' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Module["getMemory"]) Module["getMemory"] = function() { abort("'getMemory' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you") }; +if (!Module["AsciiToString"]) Module["AsciiToString"] = function() { abort("'AsciiToString' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Module["stringToAscii"]) Module["stringToAscii"] = function() { abort("'stringToAscii' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Module["UTF8ArrayToString"]) Module["UTF8ArrayToString"] = function() { abort("'UTF8ArrayToString' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Module["UTF8ToString"]) Module["UTF8ToString"] = function() { abort("'UTF8ToString' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Module["stringToUTF8Array"]) Module["stringToUTF8Array"] = function() { abort("'stringToUTF8Array' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Module["stringToUTF8"]) Module["stringToUTF8"] = function() { abort("'stringToUTF8' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Module["lengthBytesUTF8"]) Module["lengthBytesUTF8"] = function() { abort("'lengthBytesUTF8' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Module["UTF16ToString"]) Module["UTF16ToString"] = function() { abort("'UTF16ToString' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Module["stringToUTF16"]) Module["stringToUTF16"] = function() { abort("'stringToUTF16' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Module["lengthBytesUTF16"]) Module["lengthBytesUTF16"] = function() { abort("'lengthBytesUTF16' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Module["UTF32ToString"]) Module["UTF32ToString"] = function() { abort("'UTF32ToString' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Module["stringToUTF32"]) Module["stringToUTF32"] = function() { abort("'stringToUTF32' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Module["lengthBytesUTF32"]) Module["lengthBytesUTF32"] = function() { abort("'lengthBytesUTF32' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Module["allocateUTF8"]) Module["allocateUTF8"] = function() { abort("'allocateUTF8' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Module["stackTrace"]) Module["stackTrace"] = function() { abort("'stackTrace' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Module["addOnPreRun"]) Module["addOnPreRun"] = function() { abort("'addOnPreRun' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Module["addOnInit"]) Module["addOnInit"] = function() { abort("'addOnInit' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Module["addOnPreMain"]) Module["addOnPreMain"] = function() { abort("'addOnPreMain' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Module["addOnExit"]) Module["addOnExit"] = function() { abort("'addOnExit' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Module["addOnPostRun"]) Module["addOnPostRun"] = function() { abort("'addOnPostRun' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Module["writeStringToMemory"]) Module["writeStringToMemory"] = function() { abort("'writeStringToMemory' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Module["writeArrayToMemory"]) Module["writeArrayToMemory"] = function() { abort("'writeArrayToMemory' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Module["writeAsciiToMemory"]) Module["writeAsciiToMemory"] = function() { abort("'writeAsciiToMemory' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Module["addRunDependency"]) Module["addRunDependency"] = function() { abort("'addRunDependency' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you") }; +if (!Module["removeRunDependency"]) Module["removeRunDependency"] = function() { abort("'removeRunDependency' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you") }; +if (!Module["ENV"]) Module["ENV"] = function() { abort("'ENV' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Module["FS"]) Module["FS"] = function() { abort("'FS' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Module["FS_createFolder"]) Module["FS_createFolder"] = function() { abort("'FS_createFolder' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you") }; +if (!Module["FS_createPath"]) Module["FS_createPath"] = function() { abort("'FS_createPath' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you") }; +if (!Module["FS_createDataFile"]) Module["FS_createDataFile"] = function() { abort("'FS_createDataFile' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you") }; +if (!Module["FS_createPreloadedFile"]) Module["FS_createPreloadedFile"] = function() { abort("'FS_createPreloadedFile' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you") }; +if (!Module["FS_createLazyFile"]) Module["FS_createLazyFile"] = function() { abort("'FS_createLazyFile' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you") }; +if (!Module["FS_createLink"]) Module["FS_createLink"] = function() { abort("'FS_createLink' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you") }; +if (!Module["FS_createDevice"]) Module["FS_createDevice"] = function() { abort("'FS_createDevice' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you") }; +if (!Module["FS_unlink"]) Module["FS_unlink"] = function() { abort("'FS_unlink' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you") }; +if (!Module["GL"]) Module["GL"] = function() { abort("'GL' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Module["dynamicAlloc"]) Module["dynamicAlloc"] = function() { abort("'dynamicAlloc' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Module["warnOnce"]) Module["warnOnce"] = function() { abort("'warnOnce' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Module["loadDynamicLibrary"]) Module["loadDynamicLibrary"] = function() { abort("'loadDynamicLibrary' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Module["loadWebAssemblyModule"]) Module["loadWebAssemblyModule"] = function() { abort("'loadWebAssemblyModule' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Module["getLEB"]) Module["getLEB"] = function() { abort("'getLEB' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Module["getFunctionTables"]) Module["getFunctionTables"] = function() { abort("'getFunctionTables' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Module["alignFunctionTables"]) Module["alignFunctionTables"] = function() { abort("'alignFunctionTables' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Module["registerFunctions"]) Module["registerFunctions"] = function() { abort("'registerFunctions' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Module["addFunction"]) Module["addFunction"] = function() { abort("'addFunction' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Module["removeFunction"]) Module["removeFunction"] = function() { abort("'removeFunction' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Module["getFuncWrapper"]) Module["getFuncWrapper"] = function() { abort("'getFuncWrapper' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Module["prettyPrint"]) Module["prettyPrint"] = function() { abort("'prettyPrint' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Module["makeBigInt"]) Module["makeBigInt"] = function() { abort("'makeBigInt' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Module["dynCall"]) Module["dynCall"] = function() { abort("'dynCall' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Module["getCompilerSetting"]) Module["getCompilerSetting"] = function() { abort("'getCompilerSetting' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Module["stackSave"]) Module["stackSave"] = function() { abort("'stackSave' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Module["stackRestore"]) Module["stackRestore"] = function() { abort("'stackRestore' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Module["stackAlloc"]) Module["stackAlloc"] = function() { abort("'stackAlloc' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Module["establishStackSpace"]) Module["establishStackSpace"] = function() { abort("'establishStackSpace' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Module["print"]) Module["print"] = function() { abort("'print' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Module["printErr"]) Module["printErr"] = function() { abort("'printErr' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Module["getTempRet0"]) Module["getTempRet0"] = function() { abort("'getTempRet0' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Module["setTempRet0"]) Module["setTempRet0"] = function() { abort("'setTempRet0' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Module["Pointer_stringify"]) Module["Pointer_stringify"] = function() { abort("'Pointer_stringify' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") };if (!Module["ALLOC_NORMAL"]) Object.defineProperty(Module, "ALLOC_NORMAL", { get: function() { abort("'ALLOC_NORMAL' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") } }); +if (!Module["ALLOC_STACK"]) Object.defineProperty(Module, "ALLOC_STACK", { get: function() { abort("'ALLOC_STACK' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") } }); +if (!Module["ALLOC_DYNAMIC"]) Object.defineProperty(Module, "ALLOC_DYNAMIC", { get: function() { abort("'ALLOC_DYNAMIC' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") } }); +if (!Module["ALLOC_NONE"]) Object.defineProperty(Module, "ALLOC_NONE", { get: function() { abort("'ALLOC_NONE' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") } }); + + + + +/** + * @constructor + * @extends {Error} + * @this {ExitStatus} + */ +function ExitStatus(status) { + this.name = "ExitStatus"; + this.message = "Program terminated with exit(" + status + ")"; + this.status = status; +}; +ExitStatus.prototype = new Error(); +ExitStatus.prototype.constructor = ExitStatus; + +var calledMain = false; + +dependenciesFulfilled = function runCaller() { + // If run has never been called, and we should call run (INVOKE_RUN is true, and Module.noInitialRun is not false) + if (!Module['calledRun']) run(); + if (!Module['calledRun']) dependenciesFulfilled = runCaller; // try this again later, after new deps are fulfilled +} + +Module['callMain'] = function callMain(args) { + assert(runDependencies == 0, 'cannot call main when async dependencies remain! (listen on Module["onRuntimeInitialized"])'); + assert(__ATPRERUN__.length == 0, 'cannot call main when preRun functions remain to be called'); + + args = args || []; + + ensureInitRuntime(); + + var argc = args.length+1; + var argv = stackAlloc((argc + 1) * 4); + HEAP32[argv >> 2] = allocateUTF8OnStack(Module['thisProgram']); + for (var i = 1; i < argc; i++) { + HEAP32[(argv >> 2) + i] = allocateUTF8OnStack(args[i - 1]); + } + HEAP32[(argv >> 2) + argc] = 0; + + + try { + + var ret = Module['_main'](argc, argv, 0); + + + // if we're not running an evented main loop, it's time to exit + exit(ret, /* implicit = */ true); + } + catch(e) { + if (e instanceof ExitStatus) { + // exit() throws this once it's done to make sure execution + // has been stopped completely + return; + } else if (e == 'SimulateInfiniteLoop') { + // running an evented main loop, don't immediately exit + Module['noExitRuntime'] = true; + return; + } else { + var toLog = e; + if (e && typeof e === 'object' && e.stack) { + toLog = [e, e.stack]; + } + err('exception thrown: ' + toLog); + Module['quit'](1, e); + } + } finally { + calledMain = true; + } +} + + + + +/** @type {function(Array=)} */ +function run(args) { + args = args || Module['arguments']; + + if (runDependencies > 0) { + return; + } + + writeStackCookie(); + + preRun(); + + if (runDependencies > 0) return; // a preRun added a dependency, run will be called later + if (Module['calledRun']) return; // run may have just been called through dependencies being fulfilled just in this very frame + + function doRun() { + if (Module['calledRun']) return; // run may have just been called while the async setStatus time below was happening + Module['calledRun'] = true; + + if (ABORT) return; + + ensureInitRuntime(); + + preMain(); + + if (Module['onRuntimeInitialized']) Module['onRuntimeInitialized'](); + + if (Module['_main'] && shouldRunNow) Module['callMain'](args); + + postRun(); + } + + if (Module['setStatus']) { + Module['setStatus']('Running...'); + setTimeout(function() { + setTimeout(function() { + Module['setStatus'](''); + }, 1); + doRun(); + }, 1); + } else { + doRun(); + } + checkStackCookie(); +} +Module['run'] = run; + +function checkUnflushedContent() { + // Compiler settings do not allow exiting the runtime, so flushing + // the streams is not possible. but in ASSERTIONS mode we check + // if there was something to flush, and if so tell the user they + // should request that the runtime be exitable. + // Normally we would not even include flush() at all, but in ASSERTIONS + // builds we do so just for this check, and here we see if there is any + // content to flush, that is, we check if there would have been + // something a non-ASSERTIONS build would have not seen. + // How we flush the streams depends on whether we are in FILESYSTEM=0 + // mode (which has its own special function for this; otherwise, all + // the code is inside libc) + var print = out; + var printErr = err; + var has = false; + out = err = function(x) { + has = true; + } + try { // it doesn't matter if it fails + var flush = Module['_fflush']; + if (flush) flush(0); + // also flush in the JS FS layer + var hasFS = true; + if (hasFS) { + ['stdout', 'stderr'].forEach(function(name) { + var info = FS.analyzePath('/dev/' + name); + if (!info) return; + var stream = info.object; + var rdev = stream.rdev; + var tty = TTY.ttys[rdev]; + if (tty && tty.output && tty.output.length) { + has = true; + } + }); + } + } catch(e) {} + out = print; + err = printErr; + if (has) { + warnOnce('stdio streams had content in them that was not flushed. you should set EXIT_RUNTIME to 1 (see the FAQ), or make sure to emit a newline when you printf etc.'); + } +} + +function exit(status, implicit) { + checkUnflushedContent(); + + // if this is just main exit-ing implicitly, and the status is 0, then we + // don't need to do anything here and can just leave. if the status is + // non-zero, though, then we need to report it. + // (we may have warned about this earlier, if a situation justifies doing so) + if (implicit && Module['noExitRuntime'] && status === 0) { + return; + } + + if (Module['noExitRuntime']) { + // if exit() was called, we may warn the user if the runtime isn't actually being shut down + if (!implicit) { + err('exit(' + status + ') called, but EXIT_RUNTIME is not set, so halting execution but not exiting the runtime or preventing further async execution (build with EXIT_RUNTIME=1, if you want a true shutdown)'); + } + } else { + + ABORT = true; + EXITSTATUS = status; + + exitRuntime(); + + if (Module['onExit']) Module['onExit'](status); + } + + Module['quit'](status, new ExitStatus(status)); +} + +var abortDecorators = []; + +function abort(what) { + if (Module['onAbort']) { + Module['onAbort'](what); + } + + if (what !== undefined) { + out(what); + err(what); + what = JSON.stringify(what) + } else { + what = ''; + } + + ABORT = true; + EXITSTATUS = 1; + + var extra = ''; + var output = 'abort(' + what + ') at ' + stackTrace() + extra; + if (abortDecorators) { + abortDecorators.forEach(function(decorator) { + output = decorator(output, what); + }); + } + throw output; +} +Module['abort'] = abort; + +if (Module['preInit']) { + if (typeof Module['preInit'] == 'function') Module['preInit'] = [Module['preInit']]; + while (Module['preInit'].length > 0) { + Module['preInit'].pop()(); + } +} + +// shouldRunNow refers to calling main(), not run(). +var shouldRunNow = true; +if (Module['noInitialRun']) { + shouldRunNow = false; +} + + Module["noExitRuntime"] = true; + +run(); + + + + + +// {{MODULE_ADDITIONS}} + + + + diff --git a/backends/conrod_crayon/tools/polyfill.wasm b/backends/conrod_crayon/tools/polyfill.wasm new file mode 100644 index 0000000000000000000000000000000000000000..56aed638cc49cfe05704a8786bc3563513e8b45d GIT binary patch literal 75469 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 { + console.log("rust_wasm_syscall", index, data); + // See https://github.com/rust-lang/rust/blob/master/src/libstd/sys/wasm/mod.rs + switch (index) { + case 6: + return 1; + default: + return 0; + } + } +}; +const instantiateStreaming = WebAssembly.instantiateStreaming; +WebAssembly.instantiateStreaming = (source, importObject) => + instantiateStreaming(source, { + ...importObject, + env + }); +const instantiate = WebAssembly.instantiate; +WebAssembly.instantiate = (bufferSource, importObject) => + instantiate(bufferSource, { + ...importObject, + env + }); + +Promise.all([ + init("./dist/native_bg.wasm") +]).then(function(){ +console.log("done"); +}); + +// vim: set ts=2 sw=2 et: diff --git a/backends/conrod_crayon/tools/wasm-template/package-lock.json b/backends/conrod_crayon/tools/wasm-template/package-lock.json index 93e371f8f..73f209b54 100644 --- a/backends/conrod_crayon/tools/wasm-template/package-lock.json +++ b/backends/conrod_crayon/tools/wasm-template/package-lock.json @@ -2,17 +2,6 @@ "requires": true, "lockfileVersion": 1, "dependencies": { - "@wasm-tool/wasm-pack-plugin": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/@wasm-tool/wasm-pack-plugin/-/wasm-pack-plugin-0.2.5.tgz", - "integrity": "sha512-wTKezDG2PS2aeNE5NH90UZ6ViuKUmEZZW4hDHmxc/tY2b8sMzFffyu9GtcEBh/1O7LDvVqWwbFiRbAHp+gbPnw==", - "dev": true, - "requires": { - "chalk": "^2.4.1", - "command-exists": "^1.2.7", - "watchpack": "^1.6.0" - } - }, "@webassemblyjs/ast": { "version": "1.8.5", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.8.5.tgz", @@ -205,6 +194,7 @@ "version": "1.3.5", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", + "dev": true, "requires": { "mime-types": "~2.1.18", "negotiator": "0.6.1" @@ -496,6 +486,7 @@ "version": "1.18.3", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz", "integrity": "sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ=", + "dev": true, "requires": { "bytes": "3.0.0", "content-type": "~1.0.4", @@ -691,7 +682,8 @@ "bytes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", + "dev": true }, "cacache": { "version": "11.3.2", @@ -904,12 +896,6 @@ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true }, - "command-exists": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/command-exists/-/command-exists-1.2.8.tgz", - "integrity": "sha512-PM54PkseWbiiD/mMsbvW351/u+dafwTJ0ye2qB60G1aGQP9j3xK2gmMDc+R34L3nDtx4qMCitXT75mkbkGJDLw==", - "dev": true - }, "commander": { "version": "2.17.1", "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", @@ -1034,22 +1020,26 @@ "content-disposition": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", - "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=" + "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=", + "dev": true }, "content-type": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha1-4TjMdeBAxyexlm/l5fjJruJW/js=" + "integrity": "sha1-4TjMdeBAxyexlm/l5fjJruJW/js=", + "dev": true }, "cookie": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", - "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" + "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=", + "dev": true }, "cookie-signature": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", + "dev": true }, "copy-concurrently": { "version": "1.0.5", @@ -1180,6 +1170,7 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", + "dev": true, "requires": { "ms": "2.0.0" } @@ -1308,7 +1299,8 @@ "depd": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true }, "des.js": { "version": "1.0.0", @@ -1323,7 +1315,8 @@ "destroy": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", + "dev": true }, "detect-file": { "version": "1.0.0", @@ -1478,7 +1471,8 @@ "ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", + "dev": true }, "elliptic": { "version": "6.4.1", @@ -1504,7 +1498,8 @@ "encodeurl": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "dev": true }, "end-of-stream": { "version": "1.4.1", @@ -1568,7 +1563,8 @@ "escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", + "dev": true }, "escape-string-regexp": { "version": "1.0.5", @@ -1604,7 +1600,8 @@ "etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "dev": true }, "eventemitter3": { "version": "3.1.0", @@ -1700,6 +1697,7 @@ "version": "4.16.4", "resolved": "https://registry.npmjs.org/express/-/express-4.16.4.tgz", "integrity": "sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg==", + "dev": true, "requires": { "accepts": "~1.3.5", "array-flatten": "1.1.1", @@ -1736,7 +1734,8 @@ "array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", + "dev": true } } }, @@ -1880,6 +1879,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", "integrity": "sha1-7r9O2EAHnIP0JJA4ydcDAIMBsQU=", + "dev": true, "requires": { "debug": "2.6.9", "encodeurl": "~1.0.2", @@ -2010,7 +2010,8 @@ "forwarded": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", - "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", + "dev": true }, "fragment-cache": { "version": "0.2.1", @@ -2024,7 +2025,8 @@ "fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "dev": true }, "from2": { "version": "2.3.0", @@ -2962,6 +2964,7 @@ "version": "1.6.3", "resolved": "http://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "dev": true, "requires": { "depd": "~1.1.2", "inherits": "2.0.3", @@ -3008,6 +3011,7 @@ "version": "0.4.23", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", "integrity": "sha1-KXhx9jvlB63Pv8pxXQzQ7thOmmM=", + "dev": true, "requires": { "safer-buffer": ">= 2.1.2 < 3" } @@ -3113,7 +3117,8 @@ "inherits": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true }, "ini": { "version": "1.3.5", @@ -3166,7 +3171,8 @@ "ipaddr.js": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.8.0.tgz", - "integrity": "sha1-6qM9bd16zo9/b+DJygRA5wZzix4=" + "integrity": "sha1-6qM9bd16zo9/b+DJygRA5wZzix4=", + "dev": true }, "is-accessor-descriptor": { "version": "0.1.6", @@ -3547,7 +3553,8 @@ "media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "dev": true }, "mem": { "version": "4.0.0", @@ -3605,12 +3612,14 @@ "merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", + "dev": true }, "methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "dev": true }, "micromatch": { "version": "3.1.10", @@ -3646,17 +3655,20 @@ "mime": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", - "integrity": "sha1-Eh+evEnjdm8xGnbh+hyAA8SwOqY=" + "integrity": "sha1-Eh+evEnjdm8xGnbh+hyAA8SwOqY=", + "dev": true }, "mime-db": { "version": "1.37.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.37.0.tgz", - "integrity": "sha1-C2oM5v2+lXbiXx8tL96IMNwK0Ng=" + "integrity": "sha1-C2oM5v2+lXbiXx8tL96IMNwK0Ng=", + "dev": true }, "mime-types": { "version": "2.1.21", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.21.tgz", "integrity": "sha1-KJlaoey3cHQv5q5+WPkYHHRLP5Y=", + "dev": true, "requires": { "mime-db": "~1.37.0" } @@ -3759,7 +3771,8 @@ "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true }, "multicast-dns": { "version": "6.2.3", @@ -3806,7 +3819,8 @@ "negotiator": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", - "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" + "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=", + "dev": true }, "neo-async": { "version": "2.6.0", @@ -4029,6 +4043,7 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dev": true, "requires": { "ee-first": "1.1.1" } @@ -4212,7 +4227,8 @@ "parseurl": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", - "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=" + "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=", + "dev": true }, "pascalcase": { "version": "0.1.1", @@ -4259,7 +4275,8 @@ "path-to-regexp": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", + "dev": true }, "pbkdf2": { "version": "3.0.17", @@ -4353,6 +4370,7 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.4.tgz", "integrity": "sha1-7PxzO/Iv+Mb0B/onUye5q2fki5M=", + "dev": true, "requires": { "forwarded": "~0.1.2", "ipaddr.js": "1.8.0" @@ -4420,7 +4438,8 @@ "qs": { "version": "6.5.2", "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha1-yzroBuh0BERYTvFUzo7pjUA/PjY=" + "integrity": "sha1-yzroBuh0BERYTvFUzo7pjUA/PjY=", + "dev": true }, "querystring": { "version": "0.2.0", @@ -4462,12 +4481,14 @@ "range-parser": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", - "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=" + "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=", + "dev": true }, "raw-body": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz", "integrity": "sha1-GzJOzmtXBuFThVvBFIxlu39uoMM=", + "dev": true, "requires": { "bytes": "3.0.0", "http-errors": "1.6.3", @@ -4663,7 +4684,8 @@ "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha1-mR7GnSluAxN0fVm9/St0XDX4go0=" + "integrity": "sha1-mR7GnSluAxN0fVm9/St0XDX4go0=", + "dev": true }, "safe-regex": { "version": "1.1.0", @@ -4677,7 +4699,8 @@ "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha1-RPoWGwGHuVSd2Eu5GAL5vYOFzWo=" + "integrity": "sha1-RPoWGwGHuVSd2Eu5GAL5vYOFzWo=", + "dev": true }, "schema-utils": { "version": "1.0.0", @@ -4715,6 +4738,7 @@ "version": "0.16.2", "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", "integrity": "sha1-bsyh4PjBVtFBWXVZhI32RzCmu8E=", + "dev": true, "requires": { "debug": "2.6.9", "depd": "~1.1.2", @@ -4756,6 +4780,7 @@ "version": "1.13.2", "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", "integrity": "sha1-CV6Ecv1bRiN9tQzkhqQ/S4bGzsE=", + "dev": true, "requires": { "encodeurl": "~1.0.2", "escape-html": "~1.0.3", @@ -4801,7 +4826,8 @@ "setprototypeof": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha1-0L2FU2iHtv58DYGMuWLZ2RxU5lY=" + "integrity": "sha1-0L2FU2iHtv58DYGMuWLZ2RxU5lY=", + "dev": true }, "sha.js": { "version": "2.4.11", @@ -5161,7 +5187,8 @@ "statuses": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", - "integrity": "sha1-u3PURtonlhBu/MG2AaJT1sRr0Ic=" + "integrity": "sha1-u3PURtonlhBu/MG2AaJT1sRr0Ic=", + "dev": true }, "stream-browserify": { "version": "2.0.2", @@ -5489,6 +5516,7 @@ "version": "1.6.16", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz", "integrity": "sha1-+JzjQVQcZysl7nrjxz3uOyvlAZQ=", + "dev": true, "requires": { "media-typer": "0.3.0", "mime-types": "~2.1.18" @@ -5566,7 +5594,8 @@ "unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "dev": true }, "unset-value": { "version": "1.0.0", @@ -5709,7 +5738,8 @@ "utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "dev": true }, "uuid": { "version": "3.3.2", @@ -5726,7 +5756,8 @@ "vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "dev": true }, "vm-browserify": { "version": "0.0.4", diff --git a/backends/conrod_crayon/tools/wasm-template/package.json b/backends/conrod_crayon/tools/wasm-template/package.json index 9cd8308a2..e4ca83d99 100644 --- a/backends/conrod_crayon/tools/wasm-template/package.json +++ b/backends/conrod_crayon/tools/wasm-template/package.json @@ -4,15 +4,10 @@ "serve": "webpack-dev-server -p" }, "devDependencies": { - "@wasm-tool/wasm-pack-plugin": "0.2.5", "html-webpack-plugin": "^3.2.0", "text-encoding": "^0.7.0", "webpack": "^4.29.6", "webpack-cli": "^3.2.3", - "webpack-dev-server": "^3.2.1", - "webpack-dev-middleware": "^3.6.1" - }, - "dependencies": { - "express": "^4.16.4" + "webpack-dev-server": "^3.2.1" } } diff --git a/backends/conrod_crayon/tools/wasm-template/run.1.sh b/backends/conrod_crayon/tools/wasm-template/run.1.sh index dd156ec15..e47c81a2d 100755 --- a/backends/conrod_crayon/tools/wasm-template/run.1.sh +++ b/backends/conrod_crayon/tools/wasm-template/run.1.sh @@ -2,12 +2,12 @@ SCRIPT_DIR=$(dirname "$0") BASE_DIR=$SCRIPT_DIR/../../../../ set -e -cargo build --example $1 --target wasm32-unknown-unknown +cargo +nightly build --example $1 --target wasm32-unknown-wasi +rm -rf $SCRIPT_DIR/dist mkdir $SCRIPT_DIR/dist mkdir $SCRIPT_DIR/dist/intermediate -cp $BASE_DIR/target/wasm32-unknown-unknown/debug/examples/$1.wasm $SCRIPT_DIR/dist/intermediate/native.wasm +cp $BASE_DIR/target/wasm32-unknown-wasi/debug/examples/$1.wasm $SCRIPT_DIR/dist/intermediate/native.wasm wasm-bindgen $SCRIPT_DIR/dist/intermediate/native.wasm --out-dir $SCRIPT_DIR/dist --no-typescript -wasm-opt -O3 -o optimized.wasm $SCRIPT_DIR/dist/native_bg.wasm && -mv optimized.wasm $SCRIPT_DIR/dist/native_bg.wasm - +cp ../polyfill.js $SCRIPT_DIR/dist/polyfill.js +cp ../polyfill.wasm $SCRIPT_DIR/dist/polyfill.wasm cd $SCRIPT_DIR \ No newline at end of file diff --git a/backends/conrod_crayon/tools/wasm-template/run.2.sh b/backends/conrod_crayon/tools/wasm-template/run.2.sh new file mode 100755 index 000000000..ce1a14919 --- /dev/null +++ b/backends/conrod_crayon/tools/wasm-template/run.2.sh @@ -0,0 +1,11 @@ +SCRIPT_DIR=$(dirname "$0") +BASE_DIR=$SCRIPT_DIR/../../../../ + +set -e +xargo build --example $1 --target wasm32-unknown-unknown +rm -rf $SCRIPT_DIR/dist +mkdir $SCRIPT_DIR/dist +mkdir $SCRIPT_DIR/dist/intermediate +cp $BASE_DIR/target/wasm32-unknown-unknown/debug/examples/$1.wasm $SCRIPT_DIR/dist/intermediate/native.wasm +wasm-bindgen --target web $SCRIPT_DIR/dist/intermediate/native.wasm --out-dir $SCRIPT_DIR/dist --no-typescript +cd $SCRIPT_DIR \ No newline at end of file diff --git a/backends/conrod_crayon/tools/wasm-template/run.sh b/backends/conrod_crayon/tools/wasm-template/run.sh index e9e276adb..fb1351846 100755 --- a/backends/conrod_crayon/tools/wasm-template/run.sh +++ b/backends/conrod_crayon/tools/wasm-template/run.sh @@ -2,7 +2,7 @@ SCRIPT_DIR=$(dirname "$0") BASE_DIR=$SCRIPT_DIR/../../../../ set -e -cargo build --example $1 --target wasm32-unknown-unknown +xargo build --example $1 --target wasm32-unknown-unknown rm -rf $SCRIPT_DIR/dist mkdir $SCRIPT_DIR/dist mkdir $SCRIPT_DIR/dist/intermediate diff --git a/t.txt b/t.txt index 3e5f1aa03..7750bf2fe 100644 --- a/t.txt +++ b/t.txt @@ -1,6 +1,11 @@ -> Vertex { pos: [-0.3314286, 0.032653093], uv: [0.0014285714, 0.036734693], color: [0.25415218, 0.76052463, 0.034339808, 1.0] }, Vertex { pos: [-0.3314286, 0.10204077], uv: [0.0014285714, 0.0020408162], color: [0.25415218, 0.76052463, 0.034339808, 1.0] }, Vertex { pos: [-0.3, 0.10204077], uv: [0.017142856, 0.0020408162], color: [0.25415218, 0.76052463, 0.034339808, 1.0] }, Vertex { pos: [-0.3, 0.10204077], uv: [0.017142856, 0.0020408162], color: [0.25415218, 0.76052463, 0.034339808, 1.0] }, Vertex { pos: [-0.3, 0.032653093], uv: [0.017142856, 0.036734693], color: [0.25415218, 0.76052463, 0.034339808, 1.0] }, Vertex { pos: [-0.3314286, 0.032653093], uv: [0.0014285714, 0.036734693], color: [0.25415218, 0.76052463, 0.034339808, 1.0] }] -(Rect { min: Point { x: 0.0014285714, y: 0.0020408162 }, max: Point { x: 0.017142856, y: 0.036734693 } }, Rect { min: Point { x: 234, y: 220 }, max: Point { x: 245, y: 237 } }) -> Vertex { pos: [-0.3314286, 0.032652974], uv: [0.0014306152, 0.036809817], color: [0.25415218, 0.76052463, 0.034339808, 1.0] }, Vertex { pos: [-0.3314286, 0.10204077], uv: [0.0014306152, 0.0020449897], color: [0.25415218, 0.76052463, 0.034339808, 1.0] }, Vertex { pos: [-0.3, 0.10204077], uv: [0.017167382, 0.0020449897], color: [0.25415218, 0.76052463, 0.034339808, 1.0] }, Vertex { pos: [-0.3, 0.10204077], uv: [0.017167382, 0.0020449897], color: [0.25415218, 0.76052463, 0.034339808, 1.0] }, Vertex { pos: [-0.3, 0.032652974], uv: [0.017167382, 0.036809817], color: [0.25415218, 0.76052463, 0.034339808, 1.0] }, Vertex { pos: [-0.3314286, 0.032652974], uv: [0.0014306152, 0.036809817], color: [0.25415218, 0.76052463, 0.034339808, 1.0] }] - min: Point { x: -0.3314286, y: 0.106122375 }, max: Point { x: -0.3, y: 0.028571367 } } - - www.arewewebyet.org \ No newline at end of file +Ft@http://localhost:8080/2.index.js:1:17622 +__wbg_new_59cb74e423758ede@http://localhost:8080/index.js:1:15967 +console_error_panic_hook::Error::new::hce71d1bffc638a0a@http://localhost:8080/8434eb05ac5fcc2e8cda.module.wasm:wasm-function[11033]:0x565f41 +console_error_panic_hook::hook_impl::had064aee99cdcd99@http://localhost:8080/8434eb05ac5fcc2e8cda.module.wasm:wasm-function[4034]:0x3f83c7 +console_error_panic_hook::hook::hfe3e8b789503c05c@http://localhost:8080/8434eb05ac5fcc2e8cda.module.wasm:wasm-function[20382]:0x6277bd +core::ops::function::Fn::call::h70db32678ee792a0@http://localhost:8080/8434eb05ac5fcc2e8cda.module.wasm:wasm-function[18412]:0x609d34 +std::panicking::rust_panic_with_hook::h5d8808384a53a826@http://localhost:8080/8434eb05ac5fcc2e8cda.module.wasm:wasm-function[5773]:0x48333b +std::panicking::begin_panic::h2d913a1addbca25c@http://localhost:8080/8434eb05ac5fcc2e8cda.module.wasm:wasm-function[22371]:0x640079 +std::sys::wasm::TimeSysCall::perform::h259f94c872aa209b@http://localhost:8080/8434eb05ac5fcc2e8cda.module.wasm:wasm-function[23932]:0x64d183 +std::sys::wasm::time::Instant::now::hfac796bd8f165e83@http://localhost:8080/8434eb05ac5fcc2e8cda.module.wasm:wasm-function[24112]:0x64d9fa +std::time::Instant::now::hb25be8 \ No newline at end of file From 875d860d388ff810046f1499e07e2c6bf11e3160 Mon Sep 17 00:00:00 2001 From: alanpoon Date: Thu, 9 May 2019 21:39:45 +0800 Subject: [PATCH 41/64] some changes to polygon --- Cargo.toml | 3 +- backends/conrod_crayon/tools/polyfill.js | 8049 ----------------- backends/conrod_crayon/tools/polyfill.wasm | Bin 75469 -> 0 bytes .../tools/wasm-template/index.js | 3 +- .../tools/wasm-template/index1.js | 38 + .../tools/wasm-template/package-lock.json | 54 +- .../tools/wasm-template/package.json | 3 + .../tools/wasm-template/run.1.sh | 2 +- .../tools/wasm-template/webpack.config.js | 6 +- backends/conrod_glium/src/lib.rs | 12 +- backends/conrod_svg/Cargo.toml | 23 + backends/conrod_svg/src/lib.rs | 0 conrod_core/Cargo.toml | 1 + conrod_core/src/lib.rs | 1 + conrod_core/src/render.rs | 2 + .../src/widget/primitive/shape/polygon.rs | 37 +- 16 files changed, 136 insertions(+), 8098 deletions(-) delete mode 100644 backends/conrod_crayon/tools/polyfill.js delete mode 100644 backends/conrod_crayon/tools/polyfill.wasm create mode 100644 backends/conrod_crayon/tools/wasm-template/index1.js create mode 100644 backends/conrod_svg/Cargo.toml create mode 100644 backends/conrod_svg/src/lib.rs diff --git a/Cargo.toml b/Cargo.toml index ee6d6f583..dceb94069 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -9,5 +9,6 @@ members = [ "backends/conrod_piston", "backends/conrod_vulkano", "backends/conrod_ggez", - "backends/conrod_crayon" + "backends/conrod_crayon", + "backends/conrod_svg", ] diff --git a/backends/conrod_crayon/tools/polyfill.js b/backends/conrod_crayon/tools/polyfill.js deleted file mode 100644 index 881093c91..000000000 --- a/backends/conrod_crayon/tools/polyfill.js +++ /dev/null @@ -1,8049 +0,0 @@ -// Copyright 2010 The Emscripten Authors. All rights reserved. -// Emscripten is available under two separate licenses, the MIT license and the -// University of Illinois/NCSA Open Source License. Both these licenses can be -// found in the LICENSE file. - -// The Module object: Our interface to the outside world. We import -// and export values on it. There are various ways Module can be used: -// 1. Not defined. We create it here -// 2. A function parameter, function(Module) { ..generated code.. } -// 3. pre-run appended it, var Module = {}; ..generated code.. -// 4. External script tag defines var Module. -// We need to check if Module already exists (e.g. case 3 above). -// Substitution will be replaced with actual code on later stage of the build, -// this way Closure Compiler will not mangle it (e.g. case 4. above). -// Note that if you want to run closure, and also to use Module -// after the generated code, you will need to define var Module = {}; -// before the code. Then that object will be used in the code, and you -// can continue to use Module afterwards as well. -var Module = typeof Module !== 'undefined' ? Module : {}; - -// --pre-jses are emitted after the Module integration code, so that they can -// refer to Module (if they choose; they can also define Module) -// To implement `proc_exit`, we define a custom exception object -// that we can throw to unwind the stack and carry the exit value. -function WASIExit(return_value, message, fileName, lineNumber) { - let instance = new Error(message, fileName, lineNumber); - instance.return_value = return_value; - Object.setPrototypeOf(instance, Object.getPrototypeOf(this)); - if (Error.captureStackTrace) { - Error.captureStackTrace(instance, WASIExit); - } - return instance; -} - -WASIExit.prototype = Object.create(Error.prototype, { - constructor: { - value: Error, - enumerable: false, - writable: true, - configurable: true - } -}); - -if (Object.setPrototypeOf) { - Object.setPrototypeOf(WASIExit, Error); -} else { - WASIExit.__proto__ = Error; -} - -function handleWASIExit(e) { - if (e.return_value != 0) { - console.log('program exited with non-zero exit status ' + e.return_value); - } -} - -// The current guest wasm instance. -var currentInstance; - -// There are two heaps in play, the guest heap, which belongs to the WASI-using -// program, and the host heap, which belongs to the Emscripten-compiled polyfill -// library. The following declare support for the guest heap in a similar manner -// to Emscripten's heap. - -var GUEST_HEAP, -/** @type {ArrayBuffer} */ - GUEST_buffer, -/** @type {Int8Array} */ - GUEST_HEAP8, -/** @type {Uint8Array} */ - GUEST_HEAPU8, -/** @type {Int16Array} */ - GUEST_HEAP16, -/** @type {Uint16Array} */ - GUEST_HEAPU16, -/** @type {Int32Array} */ - GUEST_HEAP32, -/** @type {Uint32Array} */ - GUEST_HEAPU32, -/** @type {Float32Array} */ - GUEST_HEAPF32, -/** @type {Float64Array} */ - GUEST_HEAPF64; - -function setInstance(instance) { - currentInstance = instance; - updateGuestBuffer(); -} - -/// We call updateGuestBuffer any time the guest's memory may have changed, -/// such as when creating a new instance, or after calling _malloc. -function updateGuestBuffer() { - var buf = currentInstance.exports.memory.buffer; - Module['GUEST_buffer'] = GUEST_buffer = buf; - Module['GUEST_HEAP8'] = GUEST_HEAP8 = new Int8Array(GUEST_buffer); - Module['GUEST_HEAP16'] = GUEST_HEAP16 = new Int16Array(GUEST_buffer); - Module['GUEST_HEAP32'] = GUEST_HEAP32 = new Int32Array(GUEST_buffer); - Module['GUEST_HEAPU8'] = GUEST_HEAPU8 = new Uint8Array(GUEST_buffer); - Module['GUEST_HEAPU16'] = GUEST_HEAPU16 = new Uint16Array(GUEST_buffer); - Module['GUEST_HEAPU32'] = GUEST_HEAPU32 = new Uint32Array(GUEST_buffer); - Module['GUEST_HEAPF32'] = GUEST_HEAPF32 = new Float32Array(GUEST_buffer); - Module['GUEST_HEAPF64'] = GUEST_HEAPF64 = new Float64Array(GUEST_buffer); -} - -function copyin_bytes(src, len) { - let dst = _malloc(len); - updateGuestBuffer(); - - for (let i = 0; i < len; ++i) { - HEAP8[dst + i] = GUEST_HEAP8[src + i]; - } - return dst; -} - -function copyout_bytes(dst, src, len) { - updateGuestBuffer(); - - for (let i = 0; i < len; ++i) { - GUEST_HEAP8[dst + i] = HEAP8[src + i]; - } - _free(src); -} - -function copyout_i32(dst, src) { - updateGuestBuffer(); - - GUEST_HEAP32[dst>>2] = HEAP32[src>>2]; - _free(src); -} - -function copyout_i64(dst, src) { - updateGuestBuffer(); - - GUEST_HEAP32[dst>>2] = HEAP32[src>>2]; - GUEST_HEAP32[(dst + 4)>>2] = HEAP32[(src + 4)>>2]; - _free(src); -} - -function translate_ciovs(iovs, iovs_len) { - host_iovs = _malloc(8 * iovs_len); - updateGuestBuffer(); - - for (let i = 0; i < iovs_len; ++i) { - let ptr = GUEST_HEAP32[(iovs + i * 8 + 0) >> 2]; - let len = GUEST_HEAP32[(iovs + i * 8 + 4) >> 2]; - let buf = copyin_bytes(ptr, len); - HEAP32[(host_iovs + i * 8 + 0)>>2] = buf; - HEAP32[(host_iovs + i * 8 + 4)>>2] = len; - } - return host_iovs; -} - -function free_ciovs(host_iovs, iovs_len) { - for (let i = 0; i < iovs_len; ++i) { - let buf = HEAP32[(host_iovs + i * 8 + 0) >> 2]; - _free(buf); - } - _free(host_iovs); -} - -function translate_iovs(iovs, iovs_len) { - host_iovs = _malloc(8 * iovs_len); - updateGuestBuffer(); - - for (let i = 0; i < iovs_len; ++i) { - let len = GUEST_HEAP32[(iovs + i * 8 + 4) >> 2]; - let buf = _malloc(len); - updateGuestBuffer(); - HEAP32[(host_iovs + i * 8 + 0)>>2] = buf; - HEAP32[(host_iovs + i * 8 + 4)>>2] = len; - } - return host_iovs; -} - -function free_iovs(host_iovs, iovs_len, iovs) { - updateGuestBuffer(); - for (let i = 0; i < iovs_len; ++i) { - let buf = HEAP32[(host_iovs + i * 8 + 0) >> 2]; - let len = HEAP32[(host_iovs + i * 8 + 4) >> 2]; - let ptr = GUEST_HEAP32[(host_iovs + i * 8 + 0) >> 2]; - copyout_bytes(ptr, buf, len); - } - _free(host_iovs); -} - -var WASIPolyfill = { - -args_get: function(argv, argv_buf) { - return 0; -}, - -args_sizes_get: function(argc, argv_buf_size) { - updateGuestBuffer(); - - // TODO: Implement command-line arguments. - GUEST_HEAP32[(argc) >> 2] = 0; - GUEST_HEAP32[(argv_buf_size) >> 2] = 0; - return 0; -}, - -clock_res_get: function(clock_id, resolution) { - let host_resolution = _malloc(8); - let ret = ___wasi_clock_res_get(clock_id, host_resolution); - copyout_i64(resolution, host_resolution); - return ret; -}, - -clock_time_get: function(clock_id, precision, time) { - let host_time = _malloc(8); - let ret = ___wasi_clock_time_get(clock_id, precision, host_time); - copyout_i64(time, host_time); - return ret; -}, - -environ_get: function(environ, environ_buf) { - return 0; -}, - -environ_sizes_get: function(environ_size, environ_buf_size) { - updateGuestBuffer(); - - // TODO: Implement environment variables. - GUEST_HEAP32[(environ_size) >> 2] = 0; - GUEST_HEAP32[(environ_buf_size) >> 2] = 0; - return 0; -}, - -fd_prestat_get: function(fd, buf) { - let host_buf = _malloc(8); // sizeof __wasi_prestat_t - let ret = ___wasi_fd_prestat_get(fd, host_buf); - copyout_bytes(buf, host_buf, 8); - return ret; -}, - -fd_prestat_dir_name: function(fd, path, path_len) { - let host_buf = _malloc(path_len); - let ret = ___wasi_fd_prestat_get(fd, host_buf, path_len); - copyout_bytes(buf, host_buf, path_len); - return ret; -}, - -fd_close: function(fd) { - return ___wasi_fd_close(fd); -}, - -fd_datasync: function(fd) { - return ___wasi_fd_datasync(fd); -}, - -fd_pread: function(fd, iovs, iovs_len, offset, nread) { - let host_iovs = translate_iovs(iovs, iovs_len); - let host_nread = _malloc(4); - let ret = ___wasi_fd_pread(fd, host_iovs, iovs_len, offset, host_nread); - copyout_i32(nread, host_nread); - free_iovs(host_iovs, iovs_len); - return ret; -}, - -fd_pwrite: function(fd, iovs, iovs_len, offset, nwritten) { - let host_iovs = translate_ciovs(iovs, iovs_len); - let host_nwritten = _malloc(4); - let ret = ___wasi_fd_pwrite(fd, host_iovs, iovs_len, offset, host_nwritten); - copyout_i32(nwritten, host_nwritten); - free_ciovs(host_iovs, iovs_len); - return ret; -}, - -fd_read: function(fd, iovs, iovs_len, nread) { - let host_iovs = translate_iovs(iovs, iovs_len); - let host_nread = _malloc(4); - let ret = ___wasi_fd_read(fd, host_iovs, iovs_len, host_nread); - copyout_i32(nread, host_nread); - free_iovs(host_iovs, iovs_len); - return ret; -}, - -fd_renumber: function(from, to) { - return ___wasi_fd_renumber(from, to); -}, - -fd_seek: function(fd, offset, whence, newoffset) { - let host_newoffset = _malloc(8); - let ret = ___wasi_fd_seek(fd, offset, whence, host_newoffset); - copyout_i64(newoffset, host_newoffset); - return ret; -}, - -fd_tell: function(fd, newoffset) { - let host_newoffset = _malloc(8); - let ret = ___wasi_fd_seek(fd, host_newoffset); - copyout_i64(newoffset, host_newoffset); - return ret; -}, - -fd_fdstat_get: function(fd, buf) { - let host_buf = _malloc(24); // sizeof __wasi_fdstat_t - let ret = ___wasi_fd_fdstat_get(fd, host_buf); - copyout_bytes(buf, host_buf, 24); - return ret; -}, - -fd_fdstat_set_flags: function(fd, flags) { - return ___wasi_fd_fdstat_set_flags(fd, flags); -}, - -fd_fdstat_set_rights: function(fd, fs_rights_base, fs_rights_inheriting) { - return ___wasi_fd_fdstat_set_rights(fd, fs_rights_base, fs_rights_inheriting); -}, - -fd_sync: function(fd) { - return ___wasi_fd_sync(fd); -}, - -fd_write: function(fd, iovs, iovs_len, nwritten) { - let host_iovs = translate_ciovs(iovs, iovs_len); - let host_nwritten = _malloc(4); - let ret = ___wasi_fd_write(fd, host_iovs, iovs_len, host_nwritten); - copyout_i32(nwritten, host_nwritten); - free_ciovs(host_iovs, iovs_len); - return ret; -}, - -fd_advise: function(fd, offset, len, advice) { - return ___wasi_fd_advise(fd, offset, len, advice); -}, - -fd_allocate: function(fd, offset, len) { - return ___wasi_fd_allocate(fd, offset, len); -}, - -path_create_directory: function(fd, path, path_len) { - let host_path = copyin_bytes(path, path_len); - let ret = ___wasi_path_create_directory(fd, host_path, path_len); - _free(host_path); - return ret; -}, - -path_link: function(fd0, path0, path_len0, fd1, path1, path_len1) { - let host_path0 = copyin_bytes(path0, path_len0); - let host_path1 = copyin_bytes(path1, path_len1); - let ret = ___wasi_path_link(fd, host_path0, path_len0, fd1, host_path1, path1_len); - _free(host_path1); - _free(host_path0); - return ret; -}, - -path_open: function(dirfd, dirflags, path, path_len, oflags, fs_rights_base, fs_rights_inheriting, fs_flags, fd) { - let host_path = copyin_bytes(path, path_len); - let host_fd = _malloc(4); - let ret = ___wasi_path_open(dirfd, dirflags, host_path, path_len, oflags, fs_rights_base, fs_rights_inheriting, fs_flags, host_fd); - copyout_i32(fd, host_fd); - _free(host_path); - return ret; -}, - -fd_readdir: function(fd, buf, buf_len, cookie, buf_used) { - let host_buf = _malloc(buf_len); - let host_buf_used = _malloc(4); - let ret = ___wasi_fd_readdir(fd, buf, buf_len, cookie, host_buf_used); - copyout_i32(buf_used, host_buf_used); - copyout_bytes(buf, host_buf, buf_len); - return ret; -}, - -path_readlink: function(fd, path, path_len, buf, buf_len, buf_used) { - let host_path = copyin_bytes(path, path_len); - let host_buf = _malloc(buf_len); - let host_buf_used = _malloc(4); - let ret = ___wasi_path_readlink(fd, path, path_len, buf, buf_len, host_buf_used); - copyout_i32(buf_used, host_buf_used); - copyout_bytes(buf, host_buf, buf_len); - _free(host_path); - return ret; -}, - -path_rename: function(fd0, path0, path_len0, fd1, path1, path_len1) { - let host_path0 = copyin_bytes(path0, path_len0); - let host_path1 = copyin_bytes(path1, path_len1); - let ret = ___wasi_path_rename(fd, host_path0, path_len0, fd1, host_path1, path1_len); - _free(host_path1); - _free(host_path0); - return ret; -}, - -fd_filestat_get: function(fd, buf) { - let host_buf = _malloc(56); // sizeof __wasi_filestat_t - let ret = ___wasi_fd_filestat_get(host_buf); - copyout_bytes(buf, host_buf, 56); - return ret; -}, - -fd_filestat_set_size: function(fd, size) { - return ___wasi_fd_filestat_set_size(fd, size); -}, - -fd_filestat_set_times: function(fd, st_atim, st_mtim, fstflags) { - return ___wasi_fd_filestat_set_times(fd, st_atim, st_mtim, fstflags); -}, - -path_filestat_get: function(fd, path, path_len, buf) { - let host_path = copyin_bytes(path, path_len); - let host_buf = _malloc(56); // sizeof __wasi_filestat_t - let ret = ___wasi_path_filestat_get(fd, host_path, path_len, host_buf); - copyout_bytes(buf, host_buf, 56); - _free(host_path); - return ret; -}, - -path_filestat_set_times: function(fd, path, path_len, st_atim, st_mtim, flags) { - let host_path = copyin_bytes(path, path_len); - let ret = ___wasi_path_filestat_set_times(fd, host_path, st_atim, st_mtim, fstflags); - _free(host_path); - return ret; -}, - -path_symlink: function(path0, path_len0, fd, path1, path_len1) { - let host_path0 = copyin_bytes(path0, path0_len); - let host_path1 = copyin_bytes(path1, path1_len); - let ret = ___wasi_path_symlink(host_path0, path_len0, fd, host_path1, path_len1); - _free(host_path1); - _free(host_path0); - return ret; -}, - -path_unlink_file: function(fd, path, path_len, flags) { - let host_path = copyin_bytes(path, path_len); - let ret = ___wasi_path_unlink_file(fd, host_path, path_len, flags); - _free(host_path); - return ret; -}, - -path_remove_directory: function(fd, path, path_len, flags) { - let host_path = copyin_bytes(path, path_len); - let ret = ___wasi_path_remove_directory(fd, host_path, path_len, flags); - _free(host_path); - return ret; -}, - -poll_oneoff: function(in_, out, nsubscriptions, nevents) { - let host_in = copyin_bytes(in_, nsubscriptions * 56); // sizeof __wasi_subscription_t - let host_out = _malloc(nsubscriptions * 32); // sizeof __wasi_event_t - let host_nevents = _malloc(4); - let ret = ___wasi_poll_oneoff(host_in, host_out, host_nevents); - copyout_bytes(out, host_out, nsubscriptions * 32); - copyout_i32(nevents, host_nevents); - _free(host_in); - return ret; -}, - -proc_exit: function(rval) { - let message; - if (rval == 0) { - message = "success"; - } else { - message = "error code " + rval; - } - throw new WASIExit(rval, message); -}, - -proc_raise: function(sig) { - if (sig == 18 || // SIGSTOP - sig == 19 || // SIGTSTP - sig == 20 || // SIGTTIN - sig == 21 || // SIGTTOU - sig == 22 || // SIGURG - sig == 16 || // SIGCHLD - sig == 13) // SIGPIPE - { - return 0; - } - - let message = "raised signal " + sig; - throw new WASIExit(128 + sig, message); -}, - -random_get: function(buf, buf_len) { - let host_buf = _malloc(buf_len); - let ret = __wasi_random_get(host_buf, buf_len); - copyout_bytes(buf, host_buf, buf_len); - return ret; -}, - -sched_yield: function() { - return __wasi_sched_yield(); -}, - -sock_recv: function(sock, ri_data, ri_data_len, ri_flags, ro_datalen, ro_flags) { - let host_ri_data = translate_iovs(ri_data, ri_data_len); - let host_ro_datalen = _malloc(4); - let ret = ___wasi_sock_recv(sock, host_ri_data, ri_data_len, ri_flags, host_ro_data, ro_flags); - copyout_i32(ro_datalen, host_ro_datalen); - free_iovs(host_ri_data, ri_data_len); - return ret; -}, - -sock_send: function(sock, si_data, si_data_len, si_flags, so_datalen) { - let host_si_data = translate_ciovs(si_data, si_data_len); - let host_so_datalen = _malloc(4); - let ret = ___wasi_sock_send(sock, host_si_data, si_data_len, si_flags, host_so_datalen); - copyout_i32(so_datalen, host_so_datalen); - free_ciovs(host_si_data, si_data_len); - return ret; -}, - -sock_shutdown: function(sock, how) { - return __wasi_sock_shutdown(sock, how); -} - -}; - - - -// Sometimes an existing Module object exists with properties -// meant to overwrite the default module functionality. Here -// we collect those properties and reapply _after_ we configure -// the current environment's defaults to avoid having to be so -// defensive during initialization. -var moduleOverrides = {}; -var key; -for (key in Module) { - if (Module.hasOwnProperty(key)) { - moduleOverrides[key] = Module[key]; - } -} - -Module['arguments'] = []; -Module['thisProgram'] = './this.program'; -Module['quit'] = function(status, toThrow) { - throw toThrow; -}; -Module['preRun'] = []; -Module['postRun'] = []; - -// Determine the runtime environment we are in. You can customize this by -// setting the ENVIRONMENT setting at compile time (see settings.js). - -var ENVIRONMENT_IS_WEB = false; -var ENVIRONMENT_IS_WORKER = false; -var ENVIRONMENT_IS_NODE = false; -var ENVIRONMENT_IS_SHELL = false; -ENVIRONMENT_IS_WEB = typeof window === 'object'; -ENVIRONMENT_IS_WORKER = typeof importScripts === 'function'; -ENVIRONMENT_IS_NODE = typeof process === 'object' && typeof require === 'function' && !ENVIRONMENT_IS_WEB && !ENVIRONMENT_IS_WORKER; -ENVIRONMENT_IS_SHELL = !ENVIRONMENT_IS_WEB && !ENVIRONMENT_IS_NODE && !ENVIRONMENT_IS_WORKER; - -if (Module['ENVIRONMENT']) { - throw new Error('Module.ENVIRONMENT has been deprecated. To force the environment, use the ENVIRONMENT compile-time option (for example, -s ENVIRONMENT=web or -s ENVIRONMENT=node)'); -} - - -// Three configurations we can be running in: -// 1) We could be the application main() thread running in the main JS UI thread. (ENVIRONMENT_IS_WORKER == false and ENVIRONMENT_IS_PTHREAD == false) -// 2) We could be the application main() thread proxied to worker. (with Emscripten -s PROXY_TO_WORKER=1) (ENVIRONMENT_IS_WORKER == true, ENVIRONMENT_IS_PTHREAD == false) -// 3) We could be an application pthread running in a worker. (ENVIRONMENT_IS_WORKER == true and ENVIRONMENT_IS_PTHREAD == true) - - - - -// `/` should be present at the end if `scriptDirectory` is not empty -var scriptDirectory = ''; -function locateFile(path) { - if (Module['locateFile']) { - return Module['locateFile'](path, scriptDirectory); - } else { - return scriptDirectory + path; - } -} - -if (ENVIRONMENT_IS_NODE) { - scriptDirectory = __dirname + '/'; - - // Expose functionality in the same simple way that the shells work - // Note that we pollute the global namespace here, otherwise we break in node - var nodeFS; - var nodePath; - - Module['read'] = function shell_read(filename, binary) { - var ret; - if (!nodeFS) nodeFS = require('fs'); - if (!nodePath) nodePath = require('path'); - filename = nodePath['normalize'](filename); - ret = nodeFS['readFileSync'](filename); - return binary ? ret : ret.toString(); - }; - - Module['readBinary'] = function readBinary(filename) { - var ret = Module['read'](filename, true); - if (!ret.buffer) { - ret = new Uint8Array(ret); - } - assert(ret.buffer); - return ret; - }; - - if (process['argv'].length > 1) { - Module['thisProgram'] = process['argv'][1].replace(/\\/g, '/'); - } - - Module['arguments'] = process['argv'].slice(2); - - if (typeof module !== 'undefined') { - module['exports'] = Module; - } - - process['on']('uncaughtException', function(ex) { - // suppress ExitStatus exceptions from showing an error - if (!(ex instanceof ExitStatus)) { - throw ex; - } - }); - // Currently node will swallow unhandled rejections, but this behavior is - // deprecated, and in the future it will exit with error status. - process['on']('unhandledRejection', abort); - - Module['quit'] = function(status) { - process['exit'](status); - }; - - Module['inspect'] = function () { return '[Emscripten Module object]'; }; -} else -if (ENVIRONMENT_IS_SHELL) { - - - if (typeof read != 'undefined') { - Module['read'] = function shell_read(f) { - return read(f); - }; - } - - Module['readBinary'] = function readBinary(f) { - var data; - if (typeof readbuffer === 'function') { - return new Uint8Array(readbuffer(f)); - } - data = read(f, 'binary'); - assert(typeof data === 'object'); - return data; - }; - - if (typeof scriptArgs != 'undefined') { - Module['arguments'] = scriptArgs; - } else if (typeof arguments != 'undefined') { - Module['arguments'] = arguments; - } - - if (typeof quit === 'function') { - Module['quit'] = function(status) { - quit(status); - } - } -} else -if (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) { - if (ENVIRONMENT_IS_WORKER) { // Check worker, not web, since window could be polyfilled - scriptDirectory = self.location.href; - } else if (document.currentScript) { // web - scriptDirectory = document.currentScript.src; - } - // blob urls look like blob:http://site.com/etc/etc and we cannot infer anything from them. - // otherwise, slice off the final part of the url to find the script directory. - // if scriptDirectory does not contain a slash, lastIndexOf will return -1, - // and scriptDirectory will correctly be replaced with an empty string. - if (scriptDirectory.indexOf('blob:') !== 0) { - scriptDirectory = scriptDirectory.substr(0, scriptDirectory.lastIndexOf('/')+1); - } else { - scriptDirectory = ''; - } - - - Module['read'] = function shell_read(url) { - var xhr = new XMLHttpRequest(); - xhr.open('GET', url, false); - xhr.send(null); - return xhr.responseText; - }; - - if (ENVIRONMENT_IS_WORKER) { - Module['readBinary'] = function readBinary(url) { - var xhr = new XMLHttpRequest(); - xhr.open('GET', url, false); - xhr.responseType = 'arraybuffer'; - xhr.send(null); - return new Uint8Array(xhr.response); - }; - } - - Module['readAsync'] = function readAsync(url, onload, onerror) { - var xhr = new XMLHttpRequest(); - xhr.open('GET', url, true); - xhr.responseType = 'arraybuffer'; - xhr.onload = function xhr_onload() { - if (xhr.status == 200 || (xhr.status == 0 && xhr.response)) { // file URLs can return 0 - onload(xhr.response); - return; - } - onerror(); - }; - xhr.onerror = onerror; - xhr.send(null); - }; - - Module['setWindowTitle'] = function(title) { document.title = title }; -} else -{ - throw new Error('environment detection error'); -} - -// Set up the out() and err() hooks, which are how we can print to stdout or -// stderr, respectively. -// If the user provided Module.print or printErr, use that. Otherwise, -// console.log is checked first, as 'print' on the web will open a print dialogue -// printErr is preferable to console.warn (works better in shells) -// bind(console) is necessary to fix IE/Edge closed dev tools panel behavior. -var out = Module['print'] || (typeof console !== 'undefined' ? console.log.bind(console) : (typeof print !== 'undefined' ? print : null)); -var err = Module['printErr'] || (typeof printErr !== 'undefined' ? printErr : ((typeof console !== 'undefined' && console.warn.bind(console)) || out)); - -// Merge back in the overrides -for (key in moduleOverrides) { - if (moduleOverrides.hasOwnProperty(key)) { - Module[key] = moduleOverrides[key]; - } -} -// Free the object hierarchy contained in the overrides, this lets the GC -// reclaim data used e.g. in memoryInitializerRequest, which is a large typed array. -moduleOverrides = undefined; - -// perform assertions in shell.js after we set up out() and err(), as otherwise if an assertion fails it cannot print the message -assert(typeof Module['memoryInitializerPrefixURL'] === 'undefined', 'Module.memoryInitializerPrefixURL option was removed, use Module.locateFile instead'); -assert(typeof Module['pthreadMainPrefixURL'] === 'undefined', 'Module.pthreadMainPrefixURL option was removed, use Module.locateFile instead'); -assert(typeof Module['cdInitializerPrefixURL'] === 'undefined', 'Module.cdInitializerPrefixURL option was removed, use Module.locateFile instead'); -assert(typeof Module['filePackagePrefixURL'] === 'undefined', 'Module.filePackagePrefixURL option was removed, use Module.locateFile instead'); - - - -// Copyright 2017 The Emscripten Authors. All rights reserved. -// Emscripten is available under two separate licenses, the MIT license and the -// University of Illinois/NCSA Open Source License. Both these licenses can be -// found in the LICENSE file. - -// {{PREAMBLE_ADDITIONS}} - -var STACK_ALIGN = 16; - -// stack management, and other functionality that is provided by the compiled code, -// should not be used before it is ready -stackSave = stackRestore = stackAlloc = function() { - abort('cannot use the stack before compiled code is ready to run, and has provided stack access'); -}; - -function staticAlloc(size) { - abort('staticAlloc is no longer available at runtime; instead, perform static allocations at compile time (using makeStaticAlloc)'); -} - -function dynamicAlloc(size) { - assert(DYNAMICTOP_PTR); - var ret = HEAP32[DYNAMICTOP_PTR>>2]; - var end = (ret + size + 15) & -16; - if (end <= _emscripten_get_heap_size()) { - HEAP32[DYNAMICTOP_PTR>>2] = end; - } else { - return 0; - } - return ret; -} - -function alignMemory(size, factor) { - if (!factor) factor = STACK_ALIGN; // stack alignment (16-byte) by default - return Math.ceil(size / factor) * factor; -} - -function getNativeTypeSize(type) { - switch (type) { - case 'i1': case 'i8': return 1; - case 'i16': return 2; - case 'i32': return 4; - case 'i64': return 8; - case 'float': return 4; - case 'double': return 8; - default: { - if (type[type.length-1] === '*') { - return 4; // A pointer - } else if (type[0] === 'i') { - var bits = parseInt(type.substr(1)); - assert(bits % 8 === 0, 'getNativeTypeSize invalid bits ' + bits + ', type ' + type); - return bits / 8; - } else { - return 0; - } - } - } -} - -function warnOnce(text) { - if (!warnOnce.shown) warnOnce.shown = {}; - if (!warnOnce.shown[text]) { - warnOnce.shown[text] = 1; - err(text); - } -} - -var asm2wasmImports = { // special asm2wasm imports - "f64-rem": function(x, y) { - return x % y; - }, - "debugger": function() { - debugger; - } -}; - - - -var jsCallStartIndex = 1; -var functionPointers = new Array(0); - -// Wraps a JS function as a wasm function with a given signature. -// In the future, we may get a WebAssembly.Function constructor. Until then, -// we create a wasm module that takes the JS function as an import with a given -// signature, and re-exports that as a wasm function. -function convertJsFunctionToWasm(func, sig) { - // The module is static, with the exception of the type section, which is - // generated based on the signature passed in. - var typeSection = [ - 0x01, // id: section, - 0x00, // length: 0 (placeholder) - 0x01, // count: 1 - 0x60, // form: func - ]; - var sigRet = sig.slice(0, 1); - var sigParam = sig.slice(1); - var typeCodes = { - 'i': 0x7f, // i32 - 'j': 0x7e, // i64 - 'f': 0x7d, // f32 - 'd': 0x7c, // f64 - }; - - // Parameters, length + signatures - typeSection.push(sigParam.length); - for (var i = 0; i < sigParam.length; ++i) { - typeSection.push(typeCodes[sigParam[i]]); - } - - // Return values, length + signatures - // With no multi-return in MVP, either 0 (void) or 1 (anything else) - if (sigRet == 'v') { - typeSection.push(0x00); - } else { - typeSection = typeSection.concat([0x01, typeCodes[sigRet]]); - } - - // Write the overall length of the type section back into the section header - // (excepting the 2 bytes for the section id and length) - typeSection[1] = typeSection.length - 2; - - // Rest of the module is static - var bytes = new Uint8Array([ - 0x00, 0x61, 0x73, 0x6d, // magic ("\0asm") - 0x01, 0x00, 0x00, 0x00, // version: 1 - ].concat(typeSection, [ - 0x02, 0x07, // import section - // (import "e" "f" (func 0 (type 0))) - 0x01, 0x01, 0x65, 0x01, 0x66, 0x00, 0x00, - 0x07, 0x05, // export section - // (export "f" (func 0 (type 0))) - 0x01, 0x01, 0x66, 0x00, 0x00, - ])); - - // We can compile this wasm module synchronously because it is very small. - // This accepts an import (at "e.f"), that it reroutes to an export (at "f") - var module = new WebAssembly.Module(bytes); - var instance = new WebAssembly.Instance(module, { - e: { - f: func - } - }); - var wrappedFunc = instance.exports.f; - return wrappedFunc; -} - -// Add a wasm function to the table. -function addFunctionWasm(func, sig) { - var table = wasmTable; - var ret = table.length; - - // Grow the table - try { - table.grow(1); - } catch (err) { - if (!err instanceof RangeError) { - throw err; - } - throw 'Unable to grow wasm table. Use a higher value for RESERVED_FUNCTION_POINTERS or set ALLOW_TABLE_GROWTH.'; - } - - // Insert new element - try { - // Attempting to call this with JS function will cause of table.set() to fail - table.set(ret, func); - } catch (err) { - if (!err instanceof TypeError) { - throw err; - } - assert(typeof sig !== 'undefined', 'Missing signature argument to addFunction'); - var wrapped = convertJsFunctionToWasm(func, sig); - table.set(ret, wrapped); - } - - return ret; -} - -function removeFunctionWasm(index) { - // TODO(sbc): Look into implementing this to allow re-using of table slots -} - -// 'sig' parameter is required for the llvm backend but only when func is not -// already a WebAssembly function. -function addFunction(func, sig) { - - - var base = 0; - for (var i = base; i < base + 0; i++) { - if (!functionPointers[i]) { - functionPointers[i] = func; - return jsCallStartIndex + i; - } - } - throw 'Finished up all reserved function pointers. Use a higher value for RESERVED_FUNCTION_POINTERS.'; - -} - -function removeFunction(index) { - - functionPointers[index-jsCallStartIndex] = null; -} - -var funcWrappers = {}; - -function getFuncWrapper(func, sig) { - if (!func) return; // on null pointer, return undefined - assert(sig); - if (!funcWrappers[sig]) { - funcWrappers[sig] = {}; - } - var sigCache = funcWrappers[sig]; - if (!sigCache[func]) { - // optimize away arguments usage in common cases - if (sig.length === 1) { - sigCache[func] = function dynCall_wrapper() { - return dynCall(sig, func); - }; - } else if (sig.length === 2) { - sigCache[func] = function dynCall_wrapper(arg) { - return dynCall(sig, func, [arg]); - }; - } else { - // general case - sigCache[func] = function dynCall_wrapper() { - return dynCall(sig, func, Array.prototype.slice.call(arguments)); - }; - } - } - return sigCache[func]; -} - - -function makeBigInt(low, high, unsigned) { - return unsigned ? ((+((low>>>0)))+((+((high>>>0)))*4294967296.0)) : ((+((low>>>0)))+((+((high|0)))*4294967296.0)); -} - -function dynCall(sig, ptr, args) { - if (args && args.length) { - assert(args.length == sig.length-1); - assert(('dynCall_' + sig) in Module, 'bad function pointer type - no table for sig \'' + sig + '\''); - return Module['dynCall_' + sig].apply(null, [ptr].concat(args)); - } else { - assert(sig.length == 1); - assert(('dynCall_' + sig) in Module, 'bad function pointer type - no table for sig \'' + sig + '\''); - return Module['dynCall_' + sig].call(null, ptr); - } -} - -var tempRet0 = 0; - -var setTempRet0 = function(value) { - tempRet0 = value; -} - -var getTempRet0 = function() { - return tempRet0; -} - -function getCompilerSetting(name) { - throw 'You must build with -s RETAIN_COMPILER_SETTINGS=1 for getCompilerSetting or emscripten_get_compiler_setting to work'; -} - -var Runtime = { - // helpful errors - getTempRet0: function() { abort('getTempRet0() is now a top-level function, after removing the Runtime object. Remove "Runtime."') }, - staticAlloc: function() { abort('staticAlloc() is now a top-level function, after removing the Runtime object. Remove "Runtime."') }, - stackAlloc: function() { abort('stackAlloc() is now a top-level function, after removing the Runtime object. Remove "Runtime."') }, -}; - -// The address globals begin at. Very low in memory, for code size and optimization opportunities. -// Above 0 is static memory, starting with globals. -// Then the stack. -// Then 'dynamic' memory for sbrk. -var GLOBAL_BASE = 1024; - - - - -// === Preamble library stuff === - -// Documentation for the public APIs defined in this file must be updated in: -// site/source/docs/api_reference/preamble.js.rst -// A prebuilt local version of the documentation is available at: -// site/build/text/docs/api_reference/preamble.js.txt -// You can also build docs locally as HTML or other formats in site/ -// An online HTML version (which may be of a different version of Emscripten) -// is up at http://kripken.github.io/emscripten-site/docs/api_reference/preamble.js.html - - -if (typeof WebAssembly !== 'object') { - abort('No WebAssembly support found. Build with -s WASM=0 to target JavaScript instead.'); -} - - -/** @type {function(number, string, boolean=)} */ -function getValue(ptr, type, noSafe) { - type = type || 'i8'; - if (type.charAt(type.length-1) === '*') type = 'i32'; // pointers are 32-bit - switch(type) { - case 'i1': return HEAP8[((ptr)>>0)]; - case 'i8': return HEAP8[((ptr)>>0)]; - case 'i16': return HEAP16[((ptr)>>1)]; - case 'i32': return HEAP32[((ptr)>>2)]; - case 'i64': return HEAP32[((ptr)>>2)]; - case 'float': return HEAPF32[((ptr)>>2)]; - case 'double': return HEAPF64[((ptr)>>3)]; - default: abort('invalid type for getValue: ' + type); - } - return null; -} - - - - -// Wasm globals - -var wasmMemory; - -// Potentially used for direct table calls. -var wasmTable; - - -//======================================== -// Runtime essentials -//======================================== - -// whether we are quitting the application. no code should run after this. -// set in exit() and abort() -var ABORT = false; - -// set by exit() and abort(). Passed to 'onExit' handler. -// NOTE: This is also used as the process return code code in shell environments -// but only when noExitRuntime is false. -var EXITSTATUS = 0; - -/** @type {function(*, string=)} */ -function assert(condition, text) { - if (!condition) { - abort('Assertion failed: ' + text); - } -} - -// Returns the C function with a specified identifier (for C++, you need to do manual name mangling) -function getCFunc(ident) { - var func = Module['_' + ident]; // closure exported function - assert(func, 'Cannot call unknown function ' + ident + ', make sure it is exported'); - return func; -} - -// C calling interface. -function ccall(ident, returnType, argTypes, args, opts) { - // For fast lookup of conversion functions - var toC = { - 'string': function(str) { - var ret = 0; - if (str !== null && str !== undefined && str !== 0) { // null string - // at most 4 bytes per UTF-8 code point, +1 for the trailing '\0' - var len = (str.length << 2) + 1; - ret = stackAlloc(len); - stringToUTF8(str, ret, len); - } - return ret; - }, - 'array': function(arr) { - var ret = stackAlloc(arr.length); - writeArrayToMemory(arr, ret); - return ret; - } - }; - - function convertReturnValue(ret) { - if (returnType === 'string') return UTF8ToString(ret); - if (returnType === 'boolean') return Boolean(ret); - return ret; - } - - var func = getCFunc(ident); - var cArgs = []; - var stack = 0; - assert(returnType !== 'array', 'Return type should not be "array".'); - if (args) { - for (var i = 0; i < args.length; i++) { - var converter = toC[argTypes[i]]; - if (converter) { - if (stack === 0) stack = stackSave(); - cArgs[i] = converter(args[i]); - } else { - cArgs[i] = args[i]; - } - } - } - var ret = func.apply(null, cArgs); - ret = convertReturnValue(ret); - if (stack !== 0) stackRestore(stack); - return ret; -} - -function cwrap(ident, returnType, argTypes, opts) { - return function() { - return ccall(ident, returnType, argTypes, arguments, opts); - } -} - -/** @type {function(number, number, string, boolean=)} */ -function setValue(ptr, value, type, noSafe) { - type = type || 'i8'; - if (type.charAt(type.length-1) === '*') type = 'i32'; // pointers are 32-bit - switch(type) { - case 'i1': HEAP8[((ptr)>>0)]=value; break; - case 'i8': HEAP8[((ptr)>>0)]=value; break; - case 'i16': HEAP16[((ptr)>>1)]=value; break; - case 'i32': HEAP32[((ptr)>>2)]=value; break; - case 'i64': (tempI64 = [value>>>0,(tempDouble=value,(+(Math_abs(tempDouble))) >= 1.0 ? (tempDouble > 0.0 ? ((Math_min((+(Math_floor((tempDouble)/4294967296.0))), 4294967295.0))|0)>>>0 : (~~((+(Math_ceil((tempDouble - +(((~~(tempDouble)))>>>0))/4294967296.0)))))>>>0) : 0)],HEAP32[((ptr)>>2)]=tempI64[0],HEAP32[(((ptr)+(4))>>2)]=tempI64[1]); break; - case 'float': HEAPF32[((ptr)>>2)]=value; break; - case 'double': HEAPF64[((ptr)>>3)]=value; break; - default: abort('invalid type for setValue: ' + type); - } -} - -var ALLOC_NORMAL = 0; // Tries to use _malloc() -var ALLOC_STACK = 1; // Lives for the duration of the current function call -var ALLOC_DYNAMIC = 2; // Cannot be freed except through sbrk -var ALLOC_NONE = 3; // Do not allocate - -// allocate(): This is for internal use. You can use it yourself as well, but the interface -// is a little tricky (see docs right below). The reason is that it is optimized -// for multiple syntaxes to save space in generated code. So you should -// normally not use allocate(), and instead allocate memory using _malloc(), -// initialize it with setValue(), and so forth. -// @slab: An array of data, or a number. If a number, then the size of the block to allocate, -// in *bytes* (note that this is sometimes confusing: the next parameter does not -// affect this!) -// @types: Either an array of types, one for each byte (or 0 if no type at that position), -// or a single type which is used for the entire block. This only matters if there -// is initial data - if @slab is a number, then this does not matter at all and is -// ignored. -// @allocator: How to allocate memory, see ALLOC_* -/** @type {function((TypedArray|Array|number), string, number, number=)} */ -function allocate(slab, types, allocator, ptr) { - var zeroinit, size; - if (typeof slab === 'number') { - zeroinit = true; - size = slab; - } else { - zeroinit = false; - size = slab.length; - } - - var singleType = typeof types === 'string' ? types : null; - - var ret; - if (allocator == ALLOC_NONE) { - ret = ptr; - } else { - ret = [_malloc, - stackAlloc, - dynamicAlloc][allocator](Math.max(size, singleType ? 1 : types.length)); - } - - if (zeroinit) { - var stop; - ptr = ret; - assert((ret & 3) == 0); - stop = ret + (size & ~3); - for (; ptr < stop; ptr += 4) { - HEAP32[((ptr)>>2)]=0; - } - stop = ret + size; - while (ptr < stop) { - HEAP8[((ptr++)>>0)]=0; - } - return ret; - } - - if (singleType === 'i8') { - if (slab.subarray || slab.slice) { - HEAPU8.set(/** @type {!Uint8Array} */ (slab), ret); - } else { - HEAPU8.set(new Uint8Array(slab), ret); - } - return ret; - } - - var i = 0, type, typeSize, previousType; - while (i < size) { - var curr = slab[i]; - - type = singleType || types[i]; - if (type === 0) { - i++; - continue; - } - assert(type, 'Must know what type to store in allocate!'); - - if (type == 'i64') type = 'i32'; // special case: we have one i32 here, and one i32 later - - setValue(ret+i, curr, type); - - // no need to look up size unless type changes, so cache it - if (previousType !== type) { - typeSize = getNativeTypeSize(type); - previousType = type; - } - i += typeSize; - } - - return ret; -} - -// Allocate memory during any stage of startup - static memory early on, dynamic memory later, malloc when ready -function getMemory(size) { - if (!runtimeInitialized) return dynamicAlloc(size); - return _malloc(size); -} - - - - -/** @type {function(number, number=)} */ -function Pointer_stringify(ptr, length) { - abort("this function has been removed - you should use UTF8ToString(ptr, maxBytesToRead) instead!"); -} - -// Given a pointer 'ptr' to a null-terminated ASCII-encoded string in the emscripten HEAP, returns -// a copy of that string as a Javascript String object. - -function AsciiToString(ptr) { - var str = ''; - while (1) { - var ch = HEAPU8[((ptr++)>>0)]; - if (!ch) return str; - str += String.fromCharCode(ch); - } -} - -// Copies the given Javascript String object 'str' to the emscripten HEAP at address 'outPtr', -// null-terminated and encoded in ASCII form. The copy will require at most str.length+1 bytes of space in the HEAP. - -function stringToAscii(str, outPtr) { - return writeAsciiToMemory(str, outPtr, false); -} - - -// Given a pointer 'ptr' to a null-terminated UTF8-encoded string in the given array that contains uint8 values, returns -// a copy of that string as a Javascript String object. - -var UTF8Decoder = typeof TextDecoder !== 'undefined' ? new TextDecoder('utf8') : undefined; - -/** - * @param {number} idx - * @param {number=} maxBytesToRead - * @return {string} - */ -function UTF8ArrayToString(u8Array, idx, maxBytesToRead) { - var endIdx = idx + maxBytesToRead; - var endPtr = idx; - // TextDecoder needs to know the byte length in advance, it doesn't stop on null terminator by itself. - // Also, use the length info to avoid running tiny strings through TextDecoder, since .subarray() allocates garbage. - // (As a tiny code save trick, compare endPtr against endIdx using a negation, so that undefined means Infinity) - while (u8Array[endPtr] && !(endPtr >= endIdx)) ++endPtr; - - if (endPtr - idx > 16 && u8Array.subarray && UTF8Decoder) { - return UTF8Decoder.decode(u8Array.subarray(idx, endPtr)); - } else { - var str = ''; - // If building with TextDecoder, we have already computed the string length above, so test loop end condition against that - while (idx < endPtr) { - // For UTF8 byte structure, see: - // http://en.wikipedia.org/wiki/UTF-8#Description - // https://www.ietf.org/rfc/rfc2279.txt - // https://tools.ietf.org/html/rfc3629 - var u0 = u8Array[idx++]; - if (!(u0 & 0x80)) { str += String.fromCharCode(u0); continue; } - var u1 = u8Array[idx++] & 63; - if ((u0 & 0xE0) == 0xC0) { str += String.fromCharCode(((u0 & 31) << 6) | u1); continue; } - var u2 = u8Array[idx++] & 63; - if ((u0 & 0xF0) == 0xE0) { - u0 = ((u0 & 15) << 12) | (u1 << 6) | u2; - } else { - if ((u0 & 0xF8) != 0xF0) warnOnce('Invalid UTF-8 leading byte 0x' + u0.toString(16) + ' encountered when deserializing a UTF-8 string on the asm.js/wasm heap to a JS string!'); - u0 = ((u0 & 7) << 18) | (u1 << 12) | (u2 << 6) | (u8Array[idx++] & 63); - } - - if (u0 < 0x10000) { - str += String.fromCharCode(u0); - } else { - var ch = u0 - 0x10000; - str += String.fromCharCode(0xD800 | (ch >> 10), 0xDC00 | (ch & 0x3FF)); - } - } - } - return str; -} - -// Given a pointer 'ptr' to a null-terminated UTF8-encoded string in the emscripten HEAP, returns a -// copy of that string as a Javascript String object. -// maxBytesToRead: an optional length that specifies the maximum number of bytes to read. You can omit -// this parameter to scan the string until the first \0 byte. If maxBytesToRead is -// passed, and the string at [ptr, ptr+maxBytesToReadr[ contains a null byte in the -// middle, then the string will cut short at that byte index (i.e. maxBytesToRead will -// not produce a string of exact length [ptr, ptr+maxBytesToRead[) -// N.B. mixing frequent uses of UTF8ToString() with and without maxBytesToRead may -// throw JS JIT optimizations off, so it is worth to consider consistently using one -// style or the other. -/** - * @param {number} ptr - * @param {number=} maxBytesToRead - * @return {string} - */ -function UTF8ToString(ptr, maxBytesToRead) { - return ptr ? UTF8ArrayToString(HEAPU8, ptr, maxBytesToRead) : ''; -} - -// Copies the given Javascript String object 'str' to the given byte array at address 'outIdx', -// encoded in UTF8 form and null-terminated. The copy will require at most str.length*4+1 bytes of space in the HEAP. -// Use the function lengthBytesUTF8 to compute the exact number of bytes (excluding null terminator) that this function will write. -// Parameters: -// str: the Javascript string to copy. -// outU8Array: the array to copy to. Each index in this array is assumed to be one 8-byte element. -// outIdx: The starting offset in the array to begin the copying. -// maxBytesToWrite: The maximum number of bytes this function can write to the array. -// This count should include the null terminator, -// i.e. if maxBytesToWrite=1, only the null terminator will be written and nothing else. -// maxBytesToWrite=0 does not write any bytes to the output, not even the null terminator. -// Returns the number of bytes written, EXCLUDING the null terminator. - -function stringToUTF8Array(str, outU8Array, outIdx, maxBytesToWrite) { - if (!(maxBytesToWrite > 0)) // Parameter maxBytesToWrite is not optional. Negative values, 0, null, undefined and false each don't write out any bytes. - return 0; - - var startIdx = outIdx; - var endIdx = outIdx + maxBytesToWrite - 1; // -1 for string null terminator. - for (var i = 0; i < str.length; ++i) { - // Gotcha: charCodeAt returns a 16-bit word that is a UTF-16 encoded code unit, not a Unicode code point of the character! So decode UTF16->UTF32->UTF8. - // See http://unicode.org/faq/utf_bom.html#utf16-3 - // For UTF8 byte structure, see http://en.wikipedia.org/wiki/UTF-8#Description and https://www.ietf.org/rfc/rfc2279.txt and https://tools.ietf.org/html/rfc3629 - var u = str.charCodeAt(i); // possibly a lead surrogate - if (u >= 0xD800 && u <= 0xDFFF) { - var u1 = str.charCodeAt(++i); - u = 0x10000 + ((u & 0x3FF) << 10) | (u1 & 0x3FF); - } - if (u <= 0x7F) { - if (outIdx >= endIdx) break; - outU8Array[outIdx++] = u; - } else if (u <= 0x7FF) { - if (outIdx + 1 >= endIdx) break; - outU8Array[outIdx++] = 0xC0 | (u >> 6); - outU8Array[outIdx++] = 0x80 | (u & 63); - } else if (u <= 0xFFFF) { - if (outIdx + 2 >= endIdx) break; - outU8Array[outIdx++] = 0xE0 | (u >> 12); - outU8Array[outIdx++] = 0x80 | ((u >> 6) & 63); - outU8Array[outIdx++] = 0x80 | (u & 63); - } else { - if (outIdx + 3 >= endIdx) break; - if (u >= 0x200000) warnOnce('Invalid Unicode code point 0x' + u.toString(16) + ' encountered when serializing a JS string to an UTF-8 string on the asm.js/wasm heap! (Valid unicode code points should be in range 0-0x1FFFFF).'); - outU8Array[outIdx++] = 0xF0 | (u >> 18); - outU8Array[outIdx++] = 0x80 | ((u >> 12) & 63); - outU8Array[outIdx++] = 0x80 | ((u >> 6) & 63); - outU8Array[outIdx++] = 0x80 | (u & 63); - } - } - // Null-terminate the pointer to the buffer. - outU8Array[outIdx] = 0; - return outIdx - startIdx; -} - -// Copies the given Javascript String object 'str' to the emscripten HEAP at address 'outPtr', -// null-terminated and encoded in UTF8 form. The copy will require at most str.length*4+1 bytes of space in the HEAP. -// Use the function lengthBytesUTF8 to compute the exact number of bytes (excluding null terminator) that this function will write. -// Returns the number of bytes written, EXCLUDING the null terminator. - -function stringToUTF8(str, outPtr, maxBytesToWrite) { - assert(typeof maxBytesToWrite == 'number', 'stringToUTF8(str, outPtr, maxBytesToWrite) is missing the third parameter that specifies the length of the output buffer!'); - return stringToUTF8Array(str, HEAPU8,outPtr, maxBytesToWrite); -} - -// Returns the number of bytes the given Javascript string takes if encoded as a UTF8 byte array, EXCLUDING the null terminator byte. -function lengthBytesUTF8(str) { - var len = 0; - for (var i = 0; i < str.length; ++i) { - // Gotcha: charCodeAt returns a 16-bit word that is a UTF-16 encoded code unit, not a Unicode code point of the character! So decode UTF16->UTF32->UTF8. - // See http://unicode.org/faq/utf_bom.html#utf16-3 - var u = str.charCodeAt(i); // possibly a lead surrogate - if (u >= 0xD800 && u <= 0xDFFF) u = 0x10000 + ((u & 0x3FF) << 10) | (str.charCodeAt(++i) & 0x3FF); - if (u <= 0x7F) ++len; - else if (u <= 0x7FF) len += 2; - else if (u <= 0xFFFF) len += 3; - else len += 4; - } - return len; -} - - -// Given a pointer 'ptr' to a null-terminated UTF16LE-encoded string in the emscripten HEAP, returns -// a copy of that string as a Javascript String object. - -var UTF16Decoder = typeof TextDecoder !== 'undefined' ? new TextDecoder('utf-16le') : undefined; -function UTF16ToString(ptr) { - assert(ptr % 2 == 0, 'Pointer passed to UTF16ToString must be aligned to two bytes!'); - var endPtr = ptr; - // TextDecoder needs to know the byte length in advance, it doesn't stop on null terminator by itself. - // Also, use the length info to avoid running tiny strings through TextDecoder, since .subarray() allocates garbage. - var idx = endPtr >> 1; - while (HEAP16[idx]) ++idx; - endPtr = idx << 1; - - if (endPtr - ptr > 32 && UTF16Decoder) { - return UTF16Decoder.decode(HEAPU8.subarray(ptr, endPtr)); - } else { - var i = 0; - - var str = ''; - while (1) { - var codeUnit = HEAP16[(((ptr)+(i*2))>>1)]; - if (codeUnit == 0) return str; - ++i; - // fromCharCode constructs a character from a UTF-16 code unit, so we can pass the UTF16 string right through. - str += String.fromCharCode(codeUnit); - } - } -} - -// Copies the given Javascript String object 'str' to the emscripten HEAP at address 'outPtr', -// null-terminated and encoded in UTF16 form. The copy will require at most str.length*4+2 bytes of space in the HEAP. -// Use the function lengthBytesUTF16() to compute the exact number of bytes (excluding null terminator) that this function will write. -// Parameters: -// str: the Javascript string to copy. -// outPtr: Byte address in Emscripten HEAP where to write the string to. -// maxBytesToWrite: The maximum number of bytes this function can write to the array. This count should include the null -// terminator, i.e. if maxBytesToWrite=2, only the null terminator will be written and nothing else. -// maxBytesToWrite<2 does not write any bytes to the output, not even the null terminator. -// Returns the number of bytes written, EXCLUDING the null terminator. - -function stringToUTF16(str, outPtr, maxBytesToWrite) { - assert(outPtr % 2 == 0, 'Pointer passed to stringToUTF16 must be aligned to two bytes!'); - assert(typeof maxBytesToWrite == 'number', 'stringToUTF16(str, outPtr, maxBytesToWrite) is missing the third parameter that specifies the length of the output buffer!'); - // Backwards compatibility: if max bytes is not specified, assume unsafe unbounded write is allowed. - if (maxBytesToWrite === undefined) { - maxBytesToWrite = 0x7FFFFFFF; - } - if (maxBytesToWrite < 2) return 0; - maxBytesToWrite -= 2; // Null terminator. - var startPtr = outPtr; - var numCharsToWrite = (maxBytesToWrite < str.length*2) ? (maxBytesToWrite / 2) : str.length; - for (var i = 0; i < numCharsToWrite; ++i) { - // charCodeAt returns a UTF-16 encoded code unit, so it can be directly written to the HEAP. - var codeUnit = str.charCodeAt(i); // possibly a lead surrogate - HEAP16[((outPtr)>>1)]=codeUnit; - outPtr += 2; - } - // Null-terminate the pointer to the HEAP. - HEAP16[((outPtr)>>1)]=0; - return outPtr - startPtr; -} - -// Returns the number of bytes the given Javascript string takes if encoded as a UTF16 byte array, EXCLUDING the null terminator byte. - -function lengthBytesUTF16(str) { - return str.length*2; -} - -function UTF32ToString(ptr) { - assert(ptr % 4 == 0, 'Pointer passed to UTF32ToString must be aligned to four bytes!'); - var i = 0; - - var str = ''; - while (1) { - var utf32 = HEAP32[(((ptr)+(i*4))>>2)]; - if (utf32 == 0) - return str; - ++i; - // Gotcha: fromCharCode constructs a character from a UTF-16 encoded code (pair), not from a Unicode code point! So encode the code point to UTF-16 for constructing. - // See http://unicode.org/faq/utf_bom.html#utf16-3 - if (utf32 >= 0x10000) { - var ch = utf32 - 0x10000; - str += String.fromCharCode(0xD800 | (ch >> 10), 0xDC00 | (ch & 0x3FF)); - } else { - str += String.fromCharCode(utf32); - } - } -} - -// Copies the given Javascript String object 'str' to the emscripten HEAP at address 'outPtr', -// null-terminated and encoded in UTF32 form. The copy will require at most str.length*4+4 bytes of space in the HEAP. -// Use the function lengthBytesUTF32() to compute the exact number of bytes (excluding null terminator) that this function will write. -// Parameters: -// str: the Javascript string to copy. -// outPtr: Byte address in Emscripten HEAP where to write the string to. -// maxBytesToWrite: The maximum number of bytes this function can write to the array. This count should include the null -// terminator, i.e. if maxBytesToWrite=4, only the null terminator will be written and nothing else. -// maxBytesToWrite<4 does not write any bytes to the output, not even the null terminator. -// Returns the number of bytes written, EXCLUDING the null terminator. - -function stringToUTF32(str, outPtr, maxBytesToWrite) { - assert(outPtr % 4 == 0, 'Pointer passed to stringToUTF32 must be aligned to four bytes!'); - assert(typeof maxBytesToWrite == 'number', 'stringToUTF32(str, outPtr, maxBytesToWrite) is missing the third parameter that specifies the length of the output buffer!'); - // Backwards compatibility: if max bytes is not specified, assume unsafe unbounded write is allowed. - if (maxBytesToWrite === undefined) { - maxBytesToWrite = 0x7FFFFFFF; - } - if (maxBytesToWrite < 4) return 0; - var startPtr = outPtr; - var endPtr = startPtr + maxBytesToWrite - 4; - for (var i = 0; i < str.length; ++i) { - // Gotcha: charCodeAt returns a 16-bit word that is a UTF-16 encoded code unit, not a Unicode code point of the character! We must decode the string to UTF-32 to the heap. - // See http://unicode.org/faq/utf_bom.html#utf16-3 - var codeUnit = str.charCodeAt(i); // possibly a lead surrogate - if (codeUnit >= 0xD800 && codeUnit <= 0xDFFF) { - var trailSurrogate = str.charCodeAt(++i); - codeUnit = 0x10000 + ((codeUnit & 0x3FF) << 10) | (trailSurrogate & 0x3FF); - } - HEAP32[((outPtr)>>2)]=codeUnit; - outPtr += 4; - if (outPtr + 4 > endPtr) break; - } - // Null-terminate the pointer to the HEAP. - HEAP32[((outPtr)>>2)]=0; - return outPtr - startPtr; -} - -// Returns the number of bytes the given Javascript string takes if encoded as a UTF16 byte array, EXCLUDING the null terminator byte. - -function lengthBytesUTF32(str) { - var len = 0; - for (var i = 0; i < str.length; ++i) { - // Gotcha: charCodeAt returns a 16-bit word that is a UTF-16 encoded code unit, not a Unicode code point of the character! We must decode the string to UTF-32 to the heap. - // See http://unicode.org/faq/utf_bom.html#utf16-3 - var codeUnit = str.charCodeAt(i); - if (codeUnit >= 0xD800 && codeUnit <= 0xDFFF) ++i; // possibly a lead surrogate, so skip over the tail surrogate. - len += 4; - } - - return len; -} - -// Allocate heap space for a JS string, and write it there. -// It is the responsibility of the caller to free() that memory. -function allocateUTF8(str) { - var size = lengthBytesUTF8(str) + 1; - var ret = _malloc(size); - if (ret) stringToUTF8Array(str, HEAP8, ret, size); - return ret; -} - -// Allocate stack space for a JS string, and write it there. -function allocateUTF8OnStack(str) { - var size = lengthBytesUTF8(str) + 1; - var ret = stackAlloc(size); - stringToUTF8Array(str, HEAP8, ret, size); - return ret; -} - -// Deprecated: This function should not be called because it is unsafe and does not provide -// a maximum length limit of how many bytes it is allowed to write. Prefer calling the -// function stringToUTF8Array() instead, which takes in a maximum length that can be used -// to be secure from out of bounds writes. -/** @deprecated */ -function writeStringToMemory(string, buffer, dontAddNull) { - warnOnce('writeStringToMemory is deprecated and should not be called! Use stringToUTF8() instead!'); - - var /** @type {number} */ lastChar, /** @type {number} */ end; - if (dontAddNull) { - // stringToUTF8Array always appends null. If we don't want to do that, remember the - // character that existed at the location where the null will be placed, and restore - // that after the write (below). - end = buffer + lengthBytesUTF8(string); - lastChar = HEAP8[end]; - } - stringToUTF8(string, buffer, Infinity); - if (dontAddNull) HEAP8[end] = lastChar; // Restore the value under the null character. -} - -function writeArrayToMemory(array, buffer) { - assert(array.length >= 0, 'writeArrayToMemory array must have a length (should be an array or typed array)') - HEAP8.set(array, buffer); -} - -function writeAsciiToMemory(str, buffer, dontAddNull) { - for (var i = 0; i < str.length; ++i) { - assert(str.charCodeAt(i) === str.charCodeAt(i)&0xff); - HEAP8[((buffer++)>>0)]=str.charCodeAt(i); - } - // Null-terminate the pointer to the HEAP. - if (!dontAddNull) HEAP8[((buffer)>>0)]=0; -} - - - - - -function demangle(func) { - warnOnce('warning: build with -s DEMANGLE_SUPPORT=1 to link in libcxxabi demangling'); - return func; -} - -function demangleAll(text) { - var regex = - /__Z[\w\d_]+/g; - return text.replace(regex, - function(x) { - var y = demangle(x); - return x === y ? x : (y + ' [' + x + ']'); - }); -} - -function jsStackTrace() { - var err = new Error(); - if (!err.stack) { - // IE10+ special cases: It does have callstack info, but it is only populated if an Error object is thrown, - // so try that as a special-case. - try { - throw new Error(0); - } catch(e) { - err = e; - } - if (!err.stack) { - return '(no stack trace available)'; - } - } - return err.stack.toString(); -} - -function stackTrace() { - var js = jsStackTrace(); - if (Module['extraStackTrace']) js += '\n' + Module['extraStackTrace'](); - return demangleAll(js); -} - - - -// Memory management - -var PAGE_SIZE = 16384; -var WASM_PAGE_SIZE = 65536; -var ASMJS_PAGE_SIZE = 16777216; - -function alignUp(x, multiple) { - if (x % multiple > 0) { - x += multiple - (x % multiple); - } - return x; -} - -var HEAP, -/** @type {ArrayBuffer} */ - buffer, -/** @type {Int8Array} */ - HEAP8, -/** @type {Uint8Array} */ - HEAPU8, -/** @type {Int16Array} */ - HEAP16, -/** @type {Uint16Array} */ - HEAPU16, -/** @type {Int32Array} */ - HEAP32, -/** @type {Uint32Array} */ - HEAPU32, -/** @type {Float32Array} */ - HEAPF32, -/** @type {Float64Array} */ - HEAPF64; - -function updateGlobalBufferViews() { - Module['HEAP8'] = HEAP8 = new Int8Array(buffer); - Module['HEAP16'] = HEAP16 = new Int16Array(buffer); - Module['HEAP32'] = HEAP32 = new Int32Array(buffer); - Module['HEAPU8'] = HEAPU8 = new Uint8Array(buffer); - Module['HEAPU16'] = HEAPU16 = new Uint16Array(buffer); - Module['HEAPU32'] = HEAPU32 = new Uint32Array(buffer); - Module['HEAPF32'] = HEAPF32 = new Float32Array(buffer); - Module['HEAPF64'] = HEAPF64 = new Float64Array(buffer); -} - - -var STATIC_BASE = 1024, - STACK_BASE = 6176, - STACKTOP = STACK_BASE, - STACK_MAX = 5249056, - DYNAMIC_BASE = 5249056, - DYNAMICTOP_PTR = 5920; - -assert(STACK_BASE % 16 === 0, 'stack must start aligned'); -assert(DYNAMIC_BASE % 16 === 0, 'heap must start aligned'); - - - -var TOTAL_STACK = 5242880; -if (Module['TOTAL_STACK']) assert(TOTAL_STACK === Module['TOTAL_STACK'], 'the stack size can no longer be determined at runtime') - -var INITIAL_TOTAL_MEMORY = Module['TOTAL_MEMORY'] || 16777216; -if (INITIAL_TOTAL_MEMORY < TOTAL_STACK) err('TOTAL_MEMORY should be larger than TOTAL_STACK, was ' + INITIAL_TOTAL_MEMORY + '! (TOTAL_STACK=' + TOTAL_STACK + ')'); - -// Initialize the runtime's memory -// check for full engine support (use string 'subarray' to avoid closure compiler confusion) -assert(typeof Int32Array !== 'undefined' && typeof Float64Array !== 'undefined' && Int32Array.prototype.subarray !== undefined && Int32Array.prototype.set !== undefined, - 'JS engine does not provide full typed array support'); - - - - - - - -// Use a provided buffer, if there is one, or else allocate a new one -if (Module['buffer']) { - buffer = Module['buffer']; - assert(buffer.byteLength === INITIAL_TOTAL_MEMORY, 'provided buffer should be ' + INITIAL_TOTAL_MEMORY + ' bytes, but it is ' + buffer.byteLength); -} else { - // Use a WebAssembly memory where available - if (typeof WebAssembly === 'object' && typeof WebAssembly.Memory === 'function') { - assert(INITIAL_TOTAL_MEMORY % WASM_PAGE_SIZE === 0); - wasmMemory = new WebAssembly.Memory({ 'initial': INITIAL_TOTAL_MEMORY / WASM_PAGE_SIZE, 'maximum': INITIAL_TOTAL_MEMORY / WASM_PAGE_SIZE }); - buffer = wasmMemory.buffer; - } else - { - buffer = new ArrayBuffer(INITIAL_TOTAL_MEMORY); - } - assert(buffer.byteLength === INITIAL_TOTAL_MEMORY); -} -updateGlobalBufferViews(); - - -HEAP32[DYNAMICTOP_PTR>>2] = DYNAMIC_BASE; - - -// Initializes the stack cookie. Called at the startup of main and at the startup of each thread in pthreads mode. -function writeStackCookie() { - assert((STACK_MAX & 3) == 0); - HEAPU32[(STACK_MAX >> 2)-1] = 0x02135467; - HEAPU32[(STACK_MAX >> 2)-2] = 0x89BACDFE; -} - -function checkStackCookie() { - if (HEAPU32[(STACK_MAX >> 2)-1] != 0x02135467 || HEAPU32[(STACK_MAX >> 2)-2] != 0x89BACDFE) { - abort('Stack overflow! Stack cookie has been overwritten, expected hex dwords 0x89BACDFE and 0x02135467, but received 0x' + HEAPU32[(STACK_MAX >> 2)-2].toString(16) + ' ' + HEAPU32[(STACK_MAX >> 2)-1].toString(16)); - } - // Also test the global address 0 for integrity. - if (HEAP32[0] !== 0x63736d65 /* 'emsc' */) throw 'Runtime error: The application has corrupted its heap memory area (address zero)!'; -} - -function abortStackOverflow(allocSize) { - abort('Stack overflow! Attempted to allocate ' + allocSize + ' bytes on the stack, but stack has only ' + (STACK_MAX - stackSave() + allocSize) + ' bytes available!'); -} - - - HEAP32[0] = 0x63736d65; /* 'emsc' */ - - - -// Endianness check (note: assumes compiler arch was little-endian) -HEAP16[1] = 0x6373; -if (HEAPU8[2] !== 0x73 || HEAPU8[3] !== 0x63) throw 'Runtime error: expected the system to be little-endian!'; - -function callRuntimeCallbacks(callbacks) { - while(callbacks.length > 0) { - var callback = callbacks.shift(); - if (typeof callback == 'function') { - callback(); - continue; - } - var func = callback.func; - if (typeof func === 'number') { - if (callback.arg === undefined) { - Module['dynCall_v'](func); - } else { - Module['dynCall_vi'](func, callback.arg); - } - } else { - func(callback.arg === undefined ? null : callback.arg); - } - } -} - -var __ATPRERUN__ = []; // functions called before the runtime is initialized -var __ATINIT__ = []; // functions called during startup -var __ATMAIN__ = []; // functions called when main() is to be run -var __ATEXIT__ = []; // functions called during shutdown -var __ATPOSTRUN__ = []; // functions called after the main() is called - -var runtimeInitialized = false; -var runtimeExited = false; - - -function preRun() { - // compatibility - merge in anything from Module['preRun'] at this time - if (Module['preRun']) { - if (typeof Module['preRun'] == 'function') Module['preRun'] = [Module['preRun']]; - while (Module['preRun'].length) { - addOnPreRun(Module['preRun'].shift()); - } - } - callRuntimeCallbacks(__ATPRERUN__); -} - -function ensureInitRuntime() { - checkStackCookie(); - if (runtimeInitialized) return; - runtimeInitialized = true; - SOCKFS.root = FS.mount(SOCKFS, {}, null); -if (!Module["noFSInit"] && !FS.init.initialized) FS.init(); -TTY.init(); - callRuntimeCallbacks(__ATINIT__); -} - -function preMain() { - checkStackCookie(); - FS.ignorePermissions = false; - callRuntimeCallbacks(__ATMAIN__); -} - -function exitRuntime() { - checkStackCookie(); - runtimeExited = true; -} - -function postRun() { - checkStackCookie(); - // compatibility - merge in anything from Module['postRun'] at this time - if (Module['postRun']) { - if (typeof Module['postRun'] == 'function') Module['postRun'] = [Module['postRun']]; - while (Module['postRun'].length) { - addOnPostRun(Module['postRun'].shift()); - } - } - callRuntimeCallbacks(__ATPOSTRUN__); -} - -function addOnPreRun(cb) { - __ATPRERUN__.unshift(cb); -} - -function addOnInit(cb) { - __ATINIT__.unshift(cb); -} - -function addOnPreMain(cb) { - __ATMAIN__.unshift(cb); -} - -function addOnExit(cb) { -} - -function addOnPostRun(cb) { - __ATPOSTRUN__.unshift(cb); -} - -function unSign(value, bits, ignore) { - if (value >= 0) { - return value; - } - return bits <= 32 ? 2*Math.abs(1 << (bits-1)) + value // Need some trickery, since if bits == 32, we are right at the limit of the bits JS uses in bitshifts - : Math.pow(2, bits) + value; -} -function reSign(value, bits, ignore) { - if (value <= 0) { - return value; - } - var half = bits <= 32 ? Math.abs(1 << (bits-1)) // abs is needed if bits == 32 - : Math.pow(2, bits-1); - if (value >= half && (bits <= 32 || value > half)) { // for huge values, we can hit the precision limit and always get true here. so don't do that - // but, in general there is no perfect solution here. With 64-bit ints, we get rounding and errors - // TODO: In i64 mode 1, resign the two parts separately and safely - value = -2*half + value; // Cannot bitshift half, as it may be at the limit of the bits JS uses in bitshifts - } - return value; -} - - -assert(Math.imul, 'This browser does not support Math.imul(), build with LEGACY_VM_SUPPORT or POLYFILL_OLD_MATH_FUNCTIONS to add in a polyfill'); -assert(Math.fround, 'This browser does not support Math.fround(), build with LEGACY_VM_SUPPORT or POLYFILL_OLD_MATH_FUNCTIONS to add in a polyfill'); -assert(Math.clz32, 'This browser does not support Math.clz32(), build with LEGACY_VM_SUPPORT or POLYFILL_OLD_MATH_FUNCTIONS to add in a polyfill'); -assert(Math.trunc, 'This browser does not support Math.trunc(), build with LEGACY_VM_SUPPORT or POLYFILL_OLD_MATH_FUNCTIONS to add in a polyfill'); - -var Math_abs = Math.abs; -var Math_cos = Math.cos; -var Math_sin = Math.sin; -var Math_tan = Math.tan; -var Math_acos = Math.acos; -var Math_asin = Math.asin; -var Math_atan = Math.atan; -var Math_atan2 = Math.atan2; -var Math_exp = Math.exp; -var Math_log = Math.log; -var Math_sqrt = Math.sqrt; -var Math_ceil = Math.ceil; -var Math_floor = Math.floor; -var Math_pow = Math.pow; -var Math_imul = Math.imul; -var Math_fround = Math.fround; -var Math_round = Math.round; -var Math_min = Math.min; -var Math_max = Math.max; -var Math_clz32 = Math.clz32; -var Math_trunc = Math.trunc; - - - -// A counter of dependencies for calling run(). If we need to -// do asynchronous work before running, increment this and -// decrement it. Incrementing must happen in a place like -// Module.preRun (used by emcc to add file preloading). -// Note that you can add dependencies in preRun, even though -// it happens right before run - run will be postponed until -// the dependencies are met. -var runDependencies = 0; -var runDependencyWatcher = null; -var dependenciesFulfilled = null; // overridden to take different actions when all run dependencies are fulfilled -var runDependencyTracking = {}; - -function getUniqueRunDependency(id) { - var orig = id; - while (1) { - if (!runDependencyTracking[id]) return id; - id = orig + Math.random(); - } - return id; -} - -function addRunDependency(id) { - runDependencies++; - if (Module['monitorRunDependencies']) { - Module['monitorRunDependencies'](runDependencies); - } - if (id) { - assert(!runDependencyTracking[id]); - runDependencyTracking[id] = 1; - if (runDependencyWatcher === null && typeof setInterval !== 'undefined') { - // Check for missing dependencies every few seconds - runDependencyWatcher = setInterval(function() { - if (ABORT) { - clearInterval(runDependencyWatcher); - runDependencyWatcher = null; - return; - } - var shown = false; - for (var dep in runDependencyTracking) { - if (!shown) { - shown = true; - err('still waiting on run dependencies:'); - } - err('dependency: ' + dep); - } - if (shown) { - err('(end of list)'); - } - }, 10000); - } - } else { - err('warning: run dependency added without ID'); - } -} - -function removeRunDependency(id) { - runDependencies--; - if (Module['monitorRunDependencies']) { - Module['monitorRunDependencies'](runDependencies); - } - if (id) { - assert(runDependencyTracking[id]); - delete runDependencyTracking[id]; - } else { - err('warning: run dependency removed without ID'); - } - if (runDependencies == 0) { - if (runDependencyWatcher !== null) { - clearInterval(runDependencyWatcher); - runDependencyWatcher = null; - } - if (dependenciesFulfilled) { - var callback = dependenciesFulfilled; - dependenciesFulfilled = null; - callback(); // can add another dependenciesFulfilled - } - } -} - -Module["preloadedImages"] = {}; // maps url to image data -Module["preloadedAudios"] = {}; // maps url to audio data - - -var memoryInitializer = null; - - - - - - -// Copyright 2017 The Emscripten Authors. All rights reserved. -// Emscripten is available under two separate licenses, the MIT license and the -// University of Illinois/NCSA Open Source License. Both these licenses can be -// found in the LICENSE file. - -// Prefix of data URIs emitted by SINGLE_FILE and related options. -var dataURIPrefix = 'data:application/octet-stream;base64,'; - -// Indicates whether filename is a base64 data URI. -function isDataURI(filename) { - return String.prototype.startsWith ? - filename.startsWith(dataURIPrefix) : - filename.indexOf(dataURIPrefix) === 0; -} - - - - -var wasmBinaryFile = 'polyfill.wasm'; -if (!isDataURI(wasmBinaryFile)) { - wasmBinaryFile = locateFile(wasmBinaryFile); -} - -function getBinary() { - try { - if (Module['wasmBinary']) { - return new Uint8Array(Module['wasmBinary']); - } - if (Module['readBinary']) { - return Module['readBinary'](wasmBinaryFile); - } else { - throw "both async and sync fetching of the wasm failed"; - } - } - catch (err) { - abort(err); - } -} - -function getBinaryPromise() { - // if we don't have the binary yet, and have the Fetch api, use that - // in some environments, like Electron's render process, Fetch api may be present, but have a different context than expected, let's only use it on the Web - if (!Module['wasmBinary'] && (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) && typeof fetch === 'function') { - return fetch(wasmBinaryFile, { credentials: 'same-origin' }).then(function(response) { - if (!response['ok']) { - throw "failed to load wasm binary file at '" + wasmBinaryFile + "'"; - } - return response['arrayBuffer'](); - }).catch(function () { - return getBinary(); - }); - } - // Otherwise, getBinary should be able to get it synchronously - return new Promise(function(resolve, reject) { - resolve(getBinary()); - }); -} - -// Create the wasm instance. -// Receives the wasm imports, returns the exports. -function createWasm(env) { - // prepare imports - var info = { - 'env': env - , - 'global': { - 'NaN': NaN, - 'Infinity': Infinity - }, - 'global.Math': Math, - 'asm2wasm': asm2wasmImports - }; - // Load the wasm module and create an instance of using native support in the JS engine. - // handle a generated wasm instance, receiving its exports and - // performing other necessary setup - function receiveInstance(instance, module) { - var exports = instance.exports; - Module['asm'] = exports; - removeRunDependency('wasm-instantiate'); - } - addRunDependency('wasm-instantiate'); - - // User shell pages can write their own Module.instantiateWasm = function(imports, successCallback) callback - // to manually instantiate the Wasm module themselves. This allows pages to run the instantiation parallel - // to any other async startup actions they are performing. - if (Module['instantiateWasm']) { - try { - return Module['instantiateWasm'](info, receiveInstance); - } catch(e) { - err('Module.instantiateWasm callback failed with error: ' + e); - return false; - } - } - - // Async compilation can be confusing when an error on the page overwrites Module - // (for example, if the order of elements is wrong, and the one defining Module is - // later), so we save Module and check it later. - var trueModule = Module; - function receiveInstantiatedSource(output) { - // 'output' is a WebAssemblyInstantiatedSource object which has both the module and instance. - // receiveInstance() will swap in the exports (to Module.asm) so they can be called - assert(Module === trueModule, 'the Module object should not be replaced during async compilation - perhaps the order of HTML elements is wrong?'); - trueModule = null; - // TODO: Due to Closure regression https://github.com/google/closure-compiler/issues/3193, the above line no longer optimizes out down to the following line. - // When the regression is fixed, can restore the above USE_PTHREADS-enabled path. - receiveInstance(output['instance']); - } - function instantiateArrayBuffer(receiver) { - getBinaryPromise().then(function(binary) { - return WebAssembly.instantiate(binary, info); - }).then(receiver, function(reason) { - err('failed to asynchronously prepare wasm: ' + reason); - abort(reason); - }); - } - // Prefer streaming instantiation if available. - if (!Module['wasmBinary'] && - typeof WebAssembly.instantiateStreaming === 'function' && - !isDataURI(wasmBinaryFile) && - typeof fetch === 'function') { - WebAssembly.instantiateStreaming(fetch(wasmBinaryFile, { credentials: 'same-origin' }), info) - .then(receiveInstantiatedSource, function(reason) { - // We expect the most common failure cause to be a bad MIME type for the binary, - // in which case falling back to ArrayBuffer instantiation should work. - err('wasm streaming compile failed: ' + reason); - err('falling back to ArrayBuffer instantiation'); - instantiateArrayBuffer(receiveInstantiatedSource); - }); - } else { - instantiateArrayBuffer(receiveInstantiatedSource); - } - return {}; // no exports yet; we'll fill them in later -} - -// Provide an "asm.js function" for the application, called to "link" the asm.js module. We instantiate -// the wasm module at that time, and it receives imports and provides exports and so forth, the app -// doesn't need to care that it is wasm or asm.js. - -Module['asm'] = function(global, env, providedBuffer) { - // memory was already allocated (so js could use the buffer) - env['memory'] = wasmMemory - ; - // import table - env['table'] = wasmTable = new WebAssembly.Table({ - 'initial': 18, - 'maximum': 18, - 'element': 'anyfunc' - }); - env['__memory_base'] = 1024; // tell the memory segments where to place themselves - env['__table_base'] = 0; // table starts at 0 by default (even in dynamic linking, for the main module) - - var exports = createWasm(env); - assert(exports, 'binaryen setup failed (no wasm support?)'); - return exports; -}; - -// === Body === - -var ASM_CONSTS = [function() { const imports = { wasi_unstable: WASIPolyfill }; let file = document.getElementById('input').files[0]; let file_with_mime_type = file.slice(0, file.size, 'application/wasm'); let response = new Response(file_with_mime_type); WebAssembly.instantiateStreaming(response, imports) .then(obj => { setInstance(obj.instance); try { obj.instance.exports._start(); } catch (e) { if (e instanceof WASIExit) { handleWASIExit(e); } else { } } }) .catch(error => { console.log('error! ' + error); }); }]; - -function _emscripten_asm_const_i(code) { - return ASM_CONSTS[code](); -} - - - - -// STATICTOP = STATIC_BASE + 5152; -/* global initializers */ /*__ATINIT__.push();*/ - - - - - - - - -/* no memory initializer */ -var tempDoublePtr = 6160 -assert(tempDoublePtr % 8 == 0); - -function copyTempFloat(ptr) { // functions, because inlining this code increases code size too much - HEAP8[tempDoublePtr] = HEAP8[ptr]; - HEAP8[tempDoublePtr+1] = HEAP8[ptr+1]; - HEAP8[tempDoublePtr+2] = HEAP8[ptr+2]; - HEAP8[tempDoublePtr+3] = HEAP8[ptr+3]; -} - -function copyTempDouble(ptr) { - HEAP8[tempDoublePtr] = HEAP8[ptr]; - HEAP8[tempDoublePtr+1] = HEAP8[ptr+1]; - HEAP8[tempDoublePtr+2] = HEAP8[ptr+2]; - HEAP8[tempDoublePtr+3] = HEAP8[ptr+3]; - HEAP8[tempDoublePtr+4] = HEAP8[ptr+4]; - HEAP8[tempDoublePtr+5] = HEAP8[ptr+5]; - HEAP8[tempDoublePtr+6] = HEAP8[ptr+6]; - HEAP8[tempDoublePtr+7] = HEAP8[ptr+7]; -} - -// {{PRE_LIBRARY}} - - - - function _exit(status) { - // void _exit(int status); - // http://pubs.opengroup.org/onlinepubs/000095399/functions/exit.html - exit(status); - }function __Exit(a0 - /*``*/) { - return _exit(a0); - } - - function ___assert_fail(condition, filename, line, func) { - abort('Assertion failed: ' + UTF8ToString(condition) + ', at: ' + [filename ? UTF8ToString(filename) : 'unknown filename', line, func ? UTF8ToString(func) : 'unknown function']); - } - - function ___lock() {} - - - - - function ___setErrNo(value) { - if (Module['___errno_location']) HEAP32[((Module['___errno_location']())>>2)]=value; - else err('failed to set errno from JS'); - return value; - } - - var PATH={splitPath:function (filename) { - var splitPathRe = /^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/; - return splitPathRe.exec(filename).slice(1); - },normalizeArray:function (parts, allowAboveRoot) { - // if the path tries to go above the root, `up` ends up > 0 - var up = 0; - for (var i = parts.length - 1; i >= 0; i--) { - var last = parts[i]; - if (last === '.') { - parts.splice(i, 1); - } else if (last === '..') { - parts.splice(i, 1); - up++; - } else if (up) { - parts.splice(i, 1); - up--; - } - } - // if the path is allowed to go above the root, restore leading ..s - if (allowAboveRoot) { - for (; up; up--) { - parts.unshift('..'); - } - } - return parts; - },normalize:function (path) { - var isAbsolute = path.charAt(0) === '/', - trailingSlash = path.substr(-1) === '/'; - // Normalize the path - path = PATH.normalizeArray(path.split('/').filter(function(p) { - return !!p; - }), !isAbsolute).join('/'); - if (!path && !isAbsolute) { - path = '.'; - } - if (path && trailingSlash) { - path += '/'; - } - return (isAbsolute ? '/' : '') + path; - },dirname:function (path) { - var result = PATH.splitPath(path), - root = result[0], - dir = result[1]; - if (!root && !dir) { - // No dirname whatsoever - return '.'; - } - if (dir) { - // It has a dirname, strip trailing slash - dir = dir.substr(0, dir.length - 1); - } - return root + dir; - },basename:function (path) { - // EMSCRIPTEN return '/'' for '/', not an empty string - if (path === '/') return '/'; - var lastSlash = path.lastIndexOf('/'); - if (lastSlash === -1) return path; - return path.substr(lastSlash+1); - },extname:function (path) { - return PATH.splitPath(path)[3]; - },join:function () { - var paths = Array.prototype.slice.call(arguments, 0); - return PATH.normalize(paths.join('/')); - },join2:function (l, r) { - return PATH.normalize(l + '/' + r); - },resolve:function () { - var resolvedPath = '', - resolvedAbsolute = false; - for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) { - var path = (i >= 0) ? arguments[i] : FS.cwd(); - // Skip empty and invalid entries - if (typeof path !== 'string') { - throw new TypeError('Arguments to path.resolve must be strings'); - } else if (!path) { - return ''; // an invalid portion invalidates the whole thing - } - resolvedPath = path + '/' + resolvedPath; - resolvedAbsolute = path.charAt(0) === '/'; - } - // At this point the path should be resolved to a full absolute path, but - // handle relative paths to be safe (might happen when process.cwd() fails) - resolvedPath = PATH.normalizeArray(resolvedPath.split('/').filter(function(p) { - return !!p; - }), !resolvedAbsolute).join('/'); - return ((resolvedAbsolute ? '/' : '') + resolvedPath) || '.'; - },relative:function (from, to) { - from = PATH.resolve(from).substr(1); - to = PATH.resolve(to).substr(1); - function trim(arr) { - var start = 0; - for (; start < arr.length; start++) { - if (arr[start] !== '') break; - } - var end = arr.length - 1; - for (; end >= 0; end--) { - if (arr[end] !== '') break; - } - if (start > end) return []; - return arr.slice(start, end - start + 1); - } - var fromParts = trim(from.split('/')); - var toParts = trim(to.split('/')); - var length = Math.min(fromParts.length, toParts.length); - var samePartsLength = length; - for (var i = 0; i < length; i++) { - if (fromParts[i] !== toParts[i]) { - samePartsLength = i; - break; - } - } - var outputParts = []; - for (var i = samePartsLength; i < fromParts.length; i++) { - outputParts.push('..'); - } - outputParts = outputParts.concat(toParts.slice(samePartsLength)); - return outputParts.join('/'); - }}; - - var TTY={ttys:[],init:function () { - // https://github.com/emscripten-core/emscripten/pull/1555 - // if (ENVIRONMENT_IS_NODE) { - // // currently, FS.init does not distinguish if process.stdin is a file or TTY - // // device, it always assumes it's a TTY device. because of this, we're forcing - // // process.stdin to UTF8 encoding to at least make stdin reading compatible - // // with text files until FS.init can be refactored. - // process['stdin']['setEncoding']('utf8'); - // } - },shutdown:function () { - // https://github.com/emscripten-core/emscripten/pull/1555 - // if (ENVIRONMENT_IS_NODE) { - // // inolen: any idea as to why node -e 'process.stdin.read()' wouldn't exit immediately (with process.stdin being a tty)? - // // isaacs: because now it's reading from the stream, you've expressed interest in it, so that read() kicks off a _read() which creates a ReadReq operation - // // inolen: I thought read() in that case was a synchronous operation that just grabbed some amount of buffered data if it exists? - // // isaacs: it is. but it also triggers a _read() call, which calls readStart() on the handle - // // isaacs: do process.stdin.pause() and i'd think it'd probably close the pending call - // process['stdin']['pause'](); - // } - },register:function (dev, ops) { - TTY.ttys[dev] = { input: [], output: [], ops: ops }; - FS.registerDevice(dev, TTY.stream_ops); - },stream_ops:{open:function (stream) { - var tty = TTY.ttys[stream.node.rdev]; - if (!tty) { - throw new FS.ErrnoError(ERRNO_CODES.ENODEV); - } - stream.tty = tty; - stream.seekable = false; - },close:function (stream) { - // flush any pending line data - stream.tty.ops.flush(stream.tty); - },flush:function (stream) { - stream.tty.ops.flush(stream.tty); - },read:function (stream, buffer, offset, length, pos /* ignored */) { - if (!stream.tty || !stream.tty.ops.get_char) { - throw new FS.ErrnoError(ERRNO_CODES.ENXIO); - } - var bytesRead = 0; - for (var i = 0; i < length; i++) { - var result; - try { - result = stream.tty.ops.get_char(stream.tty); - } catch (e) { - throw new FS.ErrnoError(ERRNO_CODES.EIO); - } - if (result === undefined && bytesRead === 0) { - throw new FS.ErrnoError(ERRNO_CODES.EAGAIN); - } - if (result === null || result === undefined) break; - bytesRead++; - buffer[offset+i] = result; - } - if (bytesRead) { - stream.node.timestamp = Date.now(); - } - return bytesRead; - },write:function (stream, buffer, offset, length, pos) { - if (!stream.tty || !stream.tty.ops.put_char) { - throw new FS.ErrnoError(ERRNO_CODES.ENXIO); - } - try { - for (var i = 0; i < length; i++) { - stream.tty.ops.put_char(stream.tty, buffer[offset+i]); - } - } catch (e) { - throw new FS.ErrnoError(ERRNO_CODES.EIO); - } - if (length) { - stream.node.timestamp = Date.now(); - } - return i; - }},default_tty_ops:{get_char:function (tty) { - if (!tty.input.length) { - var result = null; - if (ENVIRONMENT_IS_NODE) { - // we will read data by chunks of BUFSIZE - var BUFSIZE = 256; - var buf = new Buffer(BUFSIZE); - var bytesRead = 0; - - var isPosixPlatform = (process.platform != 'win32'); // Node doesn't offer a direct check, so test by exclusion - - var fd = process.stdin.fd; - if (isPosixPlatform) { - // Linux and Mac cannot use process.stdin.fd (which isn't set up as sync) - var usingDevice = false; - try { - fd = fs.openSync('/dev/stdin', 'r'); - usingDevice = true; - } catch (e) {} - } - - try { - bytesRead = fs.readSync(fd, buf, 0, BUFSIZE, null); - } catch(e) { - // Cross-platform differences: on Windows, reading EOF throws an exception, but on other OSes, - // reading EOF returns 0. Uniformize behavior by treating the EOF exception to return 0. - if (e.toString().indexOf('EOF') != -1) bytesRead = 0; - else throw e; - } - - if (usingDevice) { fs.closeSync(fd); } - if (bytesRead > 0) { - result = buf.slice(0, bytesRead).toString('utf-8'); - } else { - result = null; - } - } else - if (typeof window != 'undefined' && - typeof window.prompt == 'function') { - // Browser. - result = window.prompt('Input: '); // returns null on cancel - if (result !== null) { - result += '\n'; - } - } else if (typeof readline == 'function') { - // Command line. - result = readline(); - if (result !== null) { - result += '\n'; - } - } - if (!result) { - return null; - } - tty.input = intArrayFromString(result, true); - } - return tty.input.shift(); - },put_char:function (tty, val) { - if (val === null || val === 10) { - out(UTF8ArrayToString(tty.output, 0)); - tty.output = []; - } else { - if (val != 0) tty.output.push(val); // val == 0 would cut text output off in the middle. - } - },flush:function (tty) { - if (tty.output && tty.output.length > 0) { - out(UTF8ArrayToString(tty.output, 0)); - tty.output = []; - } - }},default_tty1_ops:{put_char:function (tty, val) { - if (val === null || val === 10) { - err(UTF8ArrayToString(tty.output, 0)); - tty.output = []; - } else { - if (val != 0) tty.output.push(val); - } - },flush:function (tty) { - if (tty.output && tty.output.length > 0) { - err(UTF8ArrayToString(tty.output, 0)); - tty.output = []; - } - }}}; - - var MEMFS={ops_table:null,mount:function (mount) { - return MEMFS.createNode(null, '/', 16384 | 511 /* 0777 */, 0); - },createNode:function (parent, name, mode, dev) { - if (FS.isBlkdev(mode) || FS.isFIFO(mode)) { - // no supported - throw new FS.ErrnoError(ERRNO_CODES.EPERM); - } - if (!MEMFS.ops_table) { - MEMFS.ops_table = { - dir: { - node: { - getattr: MEMFS.node_ops.getattr, - setattr: MEMFS.node_ops.setattr, - lookup: MEMFS.node_ops.lookup, - mknod: MEMFS.node_ops.mknod, - rename: MEMFS.node_ops.rename, - unlink: MEMFS.node_ops.unlink, - rmdir: MEMFS.node_ops.rmdir, - readdir: MEMFS.node_ops.readdir, - symlink: MEMFS.node_ops.symlink - }, - stream: { - llseek: MEMFS.stream_ops.llseek - } - }, - file: { - node: { - getattr: MEMFS.node_ops.getattr, - setattr: MEMFS.node_ops.setattr - }, - stream: { - llseek: MEMFS.stream_ops.llseek, - read: MEMFS.stream_ops.read, - write: MEMFS.stream_ops.write, - allocate: MEMFS.stream_ops.allocate, - mmap: MEMFS.stream_ops.mmap, - msync: MEMFS.stream_ops.msync - } - }, - link: { - node: { - getattr: MEMFS.node_ops.getattr, - setattr: MEMFS.node_ops.setattr, - readlink: MEMFS.node_ops.readlink - }, - stream: {} - }, - chrdev: { - node: { - getattr: MEMFS.node_ops.getattr, - setattr: MEMFS.node_ops.setattr - }, - stream: FS.chrdev_stream_ops - } - }; - } - var node = FS.createNode(parent, name, mode, dev); - if (FS.isDir(node.mode)) { - node.node_ops = MEMFS.ops_table.dir.node; - node.stream_ops = MEMFS.ops_table.dir.stream; - node.contents = {}; - } else if (FS.isFile(node.mode)) { - node.node_ops = MEMFS.ops_table.file.node; - node.stream_ops = MEMFS.ops_table.file.stream; - node.usedBytes = 0; // The actual number of bytes used in the typed array, as opposed to contents.length which gives the whole capacity. - // When the byte data of the file is populated, this will point to either a typed array, or a normal JS array. Typed arrays are preferred - // for performance, and used by default. However, typed arrays are not resizable like normal JS arrays are, so there is a small disk size - // penalty involved for appending file writes that continuously grow a file similar to std::vector capacity vs used -scheme. - node.contents = null; - } else if (FS.isLink(node.mode)) { - node.node_ops = MEMFS.ops_table.link.node; - node.stream_ops = MEMFS.ops_table.link.stream; - } else if (FS.isChrdev(node.mode)) { - node.node_ops = MEMFS.ops_table.chrdev.node; - node.stream_ops = MEMFS.ops_table.chrdev.stream; - } - node.timestamp = Date.now(); - // add the new node to the parent - if (parent) { - parent.contents[name] = node; - } - return node; - },getFileDataAsRegularArray:function (node) { - if (node.contents && node.contents.subarray) { - var arr = []; - for (var i = 0; i < node.usedBytes; ++i) arr.push(node.contents[i]); - return arr; // Returns a copy of the original data. - } - return node.contents; // No-op, the file contents are already in a JS array. Return as-is. - },getFileDataAsTypedArray:function (node) { - if (!node.contents) return new Uint8Array; - if (node.contents.subarray) return node.contents.subarray(0, node.usedBytes); // Make sure to not return excess unused bytes. - return new Uint8Array(node.contents); - },expandFileStorage:function (node, newCapacity) { - var prevCapacity = node.contents ? node.contents.length : 0; - if (prevCapacity >= newCapacity) return; // No need to expand, the storage was already large enough. - // Don't expand strictly to the given requested limit if it's only a very small increase, but instead geometrically grow capacity. - // For small filesizes (<1MB), perform size*2 geometric increase, but for large sizes, do a much more conservative size*1.125 increase to - // avoid overshooting the allocation cap by a very large margin. - var CAPACITY_DOUBLING_MAX = 1024 * 1024; - newCapacity = Math.max(newCapacity, (prevCapacity * (prevCapacity < CAPACITY_DOUBLING_MAX ? 2.0 : 1.125)) | 0); - if (prevCapacity != 0) newCapacity = Math.max(newCapacity, 256); // At minimum allocate 256b for each file when expanding. - var oldContents = node.contents; - node.contents = new Uint8Array(newCapacity); // Allocate new storage. - if (node.usedBytes > 0) node.contents.set(oldContents.subarray(0, node.usedBytes), 0); // Copy old data over to the new storage. - return; - },resizeFileStorage:function (node, newSize) { - if (node.usedBytes == newSize) return; - if (newSize == 0) { - node.contents = null; // Fully decommit when requesting a resize to zero. - node.usedBytes = 0; - return; - } - if (!node.contents || node.contents.subarray) { // Resize a typed array if that is being used as the backing store. - var oldContents = node.contents; - node.contents = new Uint8Array(new ArrayBuffer(newSize)); // Allocate new storage. - if (oldContents) { - node.contents.set(oldContents.subarray(0, Math.min(newSize, node.usedBytes))); // Copy old data over to the new storage. - } - node.usedBytes = newSize; - return; - } - // Backing with a JS array. - if (!node.contents) node.contents = []; - if (node.contents.length > newSize) node.contents.length = newSize; - else while (node.contents.length < newSize) node.contents.push(0); - node.usedBytes = newSize; - },node_ops:{getattr:function (node) { - var attr = {}; - // device numbers reuse inode numbers. - attr.dev = FS.isChrdev(node.mode) ? node.id : 1; - attr.ino = node.id; - attr.mode = node.mode; - attr.nlink = 1; - attr.uid = 0; - attr.gid = 0; - attr.rdev = node.rdev; - if (FS.isDir(node.mode)) { - attr.size = 4096; - } else if (FS.isFile(node.mode)) { - attr.size = node.usedBytes; - } else if (FS.isLink(node.mode)) { - attr.size = node.link.length; - } else { - attr.size = 0; - } - attr.atime = new Date(node.timestamp); - attr.mtime = new Date(node.timestamp); - attr.ctime = new Date(node.timestamp); - // NOTE: In our implementation, st_blocks = Math.ceil(st_size/st_blksize), - // but this is not required by the standard. - attr.blksize = 4096; - attr.blocks = Math.ceil(attr.size / attr.blksize); - return attr; - },setattr:function (node, attr) { - if (attr.mode !== undefined) { - node.mode = attr.mode; - } - if (attr.timestamp !== undefined) { - node.timestamp = attr.timestamp; - } - if (attr.size !== undefined) { - MEMFS.resizeFileStorage(node, attr.size); - } - },lookup:function (parent, name) { - throw FS.genericErrors[ERRNO_CODES.ENOENT]; - },mknod:function (parent, name, mode, dev) { - return MEMFS.createNode(parent, name, mode, dev); - },rename:function (old_node, new_dir, new_name) { - // if we're overwriting a directory at new_name, make sure it's empty. - if (FS.isDir(old_node.mode)) { - var new_node; - try { - new_node = FS.lookupNode(new_dir, new_name); - } catch (e) { - } - if (new_node) { - for (var i in new_node.contents) { - throw new FS.ErrnoError(ERRNO_CODES.ENOTEMPTY); - } - } - } - // do the internal rewiring - delete old_node.parent.contents[old_node.name]; - old_node.name = new_name; - new_dir.contents[new_name] = old_node; - old_node.parent = new_dir; - },unlink:function (parent, name) { - delete parent.contents[name]; - },rmdir:function (parent, name) { - var node = FS.lookupNode(parent, name); - for (var i in node.contents) { - throw new FS.ErrnoError(ERRNO_CODES.ENOTEMPTY); - } - delete parent.contents[name]; - },readdir:function (node) { - var entries = ['.', '..'] - for (var key in node.contents) { - if (!node.contents.hasOwnProperty(key)) { - continue; - } - entries.push(key); - } - return entries; - },symlink:function (parent, newname, oldpath) { - var node = MEMFS.createNode(parent, newname, 511 /* 0777 */ | 40960, 0); - node.link = oldpath; - return node; - },readlink:function (node) { - if (!FS.isLink(node.mode)) { - throw new FS.ErrnoError(ERRNO_CODES.EINVAL); - } - return node.link; - }},stream_ops:{read:function (stream, buffer, offset, length, position) { - var contents = stream.node.contents; - if (position >= stream.node.usedBytes) return 0; - var size = Math.min(stream.node.usedBytes - position, length); - assert(size >= 0); - if (size > 8 && contents.subarray) { // non-trivial, and typed array - buffer.set(contents.subarray(position, position + size), offset); - } else { - for (var i = 0; i < size; i++) buffer[offset + i] = contents[position + i]; - } - return size; - },write:function (stream, buffer, offset, length, position, canOwn) { - - if (!length) return 0; - var node = stream.node; - node.timestamp = Date.now(); - - if (buffer.subarray && (!node.contents || node.contents.subarray)) { // This write is from a typed array to a typed array? - if (canOwn) { - assert(position === 0, 'canOwn must imply no weird position inside the file'); - node.contents = buffer.subarray(offset, offset + length); - node.usedBytes = length; - return length; - } else if (node.usedBytes === 0 && position === 0) { // If this is a simple first write to an empty file, do a fast set since we don't need to care about old data. - node.contents = new Uint8Array(buffer.subarray(offset, offset + length)); - node.usedBytes = length; - return length; - } else if (position + length <= node.usedBytes) { // Writing to an already allocated and used subrange of the file? - node.contents.set(buffer.subarray(offset, offset + length), position); - return length; - } - } - - // Appending to an existing file and we need to reallocate, or source data did not come as a typed array. - MEMFS.expandFileStorage(node, position+length); - if (node.contents.subarray && buffer.subarray) node.contents.set(buffer.subarray(offset, offset + length), position); // Use typed array write if available. - else { - for (var i = 0; i < length; i++) { - node.contents[position + i] = buffer[offset + i]; // Or fall back to manual write if not. - } - } - node.usedBytes = Math.max(node.usedBytes, position+length); - return length; - },llseek:function (stream, offset, whence) { - var position = offset; - if (whence === 1) { // SEEK_CUR. - position += stream.position; - } else if (whence === 2) { // SEEK_END. - if (FS.isFile(stream.node.mode)) { - position += stream.node.usedBytes; - } - } - if (position < 0) { - throw new FS.ErrnoError(ERRNO_CODES.EINVAL); - } - return position; - },allocate:function (stream, offset, length) { - MEMFS.expandFileStorage(stream.node, offset + length); - stream.node.usedBytes = Math.max(stream.node.usedBytes, offset + length); - },mmap:function (stream, buffer, offset, length, position, prot, flags) { - if (!FS.isFile(stream.node.mode)) { - throw new FS.ErrnoError(ERRNO_CODES.ENODEV); - } - var ptr; - var allocated; - var contents = stream.node.contents; - // Only make a new copy when MAP_PRIVATE is specified. - if ( !(flags & 2) && - (contents.buffer === buffer || contents.buffer === buffer.buffer) ) { - // We can't emulate MAP_SHARED when the file is not backed by the buffer - // we're mapping to (e.g. the HEAP buffer). - allocated = false; - ptr = contents.byteOffset; - } else { - // Try to avoid unnecessary slices. - if (position > 0 || position + length < stream.node.usedBytes) { - if (contents.subarray) { - contents = contents.subarray(position, position + length); - } else { - contents = Array.prototype.slice.call(contents, position, position + length); - } - } - allocated = true; - ptr = _malloc(length); - if (!ptr) { - throw new FS.ErrnoError(ERRNO_CODES.ENOMEM); - } - buffer.set(contents, ptr); - } - return { ptr: ptr, allocated: allocated }; - },msync:function (stream, buffer, offset, length, mmapFlags) { - if (!FS.isFile(stream.node.mode)) { - throw new FS.ErrnoError(ERRNO_CODES.ENODEV); - } - if (mmapFlags & 2) { - // MAP_PRIVATE calls need not to be synced back to underlying fs - return 0; - } - - var bytesWritten = MEMFS.stream_ops.write(stream, buffer, 0, length, offset, false); - // should we check if bytesWritten and length are the same? - return 0; - }}}; - - var IDBFS={dbs:{},indexedDB:function () { - if (typeof indexedDB !== 'undefined') return indexedDB; - var ret = null; - if (typeof window === 'object') ret = window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB; - assert(ret, 'IDBFS used, but indexedDB not supported'); - return ret; - },DB_VERSION:21,DB_STORE_NAME:"FILE_DATA",mount:function (mount) { - // reuse all of the core MEMFS functionality - return MEMFS.mount.apply(null, arguments); - },syncfs:function (mount, populate, callback) { - IDBFS.getLocalSet(mount, function(err, local) { - if (err) return callback(err); - - IDBFS.getRemoteSet(mount, function(err, remote) { - if (err) return callback(err); - - var src = populate ? remote : local; - var dst = populate ? local : remote; - - IDBFS.reconcile(src, dst, callback); - }); - }); - },getDB:function (name, callback) { - // check the cache first - var db = IDBFS.dbs[name]; - if (db) { - return callback(null, db); - } - - var req; - try { - req = IDBFS.indexedDB().open(name, IDBFS.DB_VERSION); - } catch (e) { - return callback(e); - } - if (!req) { - return callback("Unable to connect to IndexedDB"); - } - req.onupgradeneeded = function(e) { - var db = e.target.result; - var transaction = e.target.transaction; - - var fileStore; - - if (db.objectStoreNames.contains(IDBFS.DB_STORE_NAME)) { - fileStore = transaction.objectStore(IDBFS.DB_STORE_NAME); - } else { - fileStore = db.createObjectStore(IDBFS.DB_STORE_NAME); - } - - if (!fileStore.indexNames.contains('timestamp')) { - fileStore.createIndex('timestamp', 'timestamp', { unique: false }); - } - }; - req.onsuccess = function() { - db = req.result; - - // add to the cache - IDBFS.dbs[name] = db; - callback(null, db); - }; - req.onerror = function(e) { - callback(this.error); - e.preventDefault(); - }; - },getLocalSet:function (mount, callback) { - var entries = {}; - - function isRealDir(p) { - return p !== '.' && p !== '..'; - }; - function toAbsolute(root) { - return function(p) { - return PATH.join2(root, p); - } - }; - - var check = FS.readdir(mount.mountpoint).filter(isRealDir).map(toAbsolute(mount.mountpoint)); - - while (check.length) { - var path = check.pop(); - var stat; - - try { - stat = FS.stat(path); - } catch (e) { - return callback(e); - } - - if (FS.isDir(stat.mode)) { - check.push.apply(check, FS.readdir(path).filter(isRealDir).map(toAbsolute(path))); - } - - entries[path] = { timestamp: stat.mtime }; - } - - return callback(null, { type: 'local', entries: entries }); - },getRemoteSet:function (mount, callback) { - var entries = {}; - - IDBFS.getDB(mount.mountpoint, function(err, db) { - if (err) return callback(err); - - try { - var transaction = db.transaction([IDBFS.DB_STORE_NAME], 'readonly'); - transaction.onerror = function(e) { - callback(this.error); - e.preventDefault(); - }; - - var store = transaction.objectStore(IDBFS.DB_STORE_NAME); - var index = store.index('timestamp'); - - index.openKeyCursor().onsuccess = function(event) { - var cursor = event.target.result; - - if (!cursor) { - return callback(null, { type: 'remote', db: db, entries: entries }); - } - - entries[cursor.primaryKey] = { timestamp: cursor.key }; - - cursor.continue(); - }; - } catch (e) { - return callback(e); - } - }); - },loadLocalEntry:function (path, callback) { - var stat, node; - - try { - var lookup = FS.lookupPath(path); - node = lookup.node; - stat = FS.stat(path); - } catch (e) { - return callback(e); - } - - if (FS.isDir(stat.mode)) { - return callback(null, { timestamp: stat.mtime, mode: stat.mode }); - } else if (FS.isFile(stat.mode)) { - // Performance consideration: storing a normal JavaScript array to a IndexedDB is much slower than storing a typed array. - // Therefore always convert the file contents to a typed array first before writing the data to IndexedDB. - node.contents = MEMFS.getFileDataAsTypedArray(node); - return callback(null, { timestamp: stat.mtime, mode: stat.mode, contents: node.contents }); - } else { - return callback(new Error('node type not supported')); - } - },storeLocalEntry:function (path, entry, callback) { - try { - if (FS.isDir(entry.mode)) { - FS.mkdir(path, entry.mode); - } else if (FS.isFile(entry.mode)) { - FS.writeFile(path, entry.contents, { canOwn: true }); - } else { - return callback(new Error('node type not supported')); - } - - FS.chmod(path, entry.mode); - FS.utime(path, entry.timestamp, entry.timestamp); - } catch (e) { - return callback(e); - } - - callback(null); - },removeLocalEntry:function (path, callback) { - try { - var lookup = FS.lookupPath(path); - var stat = FS.stat(path); - - if (FS.isDir(stat.mode)) { - FS.rmdir(path); - } else if (FS.isFile(stat.mode)) { - FS.unlink(path); - } - } catch (e) { - return callback(e); - } - - callback(null); - },loadRemoteEntry:function (store, path, callback) { - var req = store.get(path); - req.onsuccess = function(event) { callback(null, event.target.result); }; - req.onerror = function(e) { - callback(this.error); - e.preventDefault(); - }; - },storeRemoteEntry:function (store, path, entry, callback) { - var req = store.put(entry, path); - req.onsuccess = function() { callback(null); }; - req.onerror = function(e) { - callback(this.error); - e.preventDefault(); - }; - },removeRemoteEntry:function (store, path, callback) { - var req = store.delete(path); - req.onsuccess = function() { callback(null); }; - req.onerror = function(e) { - callback(this.error); - e.preventDefault(); - }; - },reconcile:function (src, dst, callback) { - var total = 0; - - var create = []; - Object.keys(src.entries).forEach(function (key) { - var e = src.entries[key]; - var e2 = dst.entries[key]; - if (!e2 || e.timestamp > e2.timestamp) { - create.push(key); - total++; - } - }); - - var remove = []; - Object.keys(dst.entries).forEach(function (key) { - var e = dst.entries[key]; - var e2 = src.entries[key]; - if (!e2) { - remove.push(key); - total++; - } - }); - - if (!total) { - return callback(null); - } - - var errored = false; - var completed = 0; - var db = src.type === 'remote' ? src.db : dst.db; - var transaction = db.transaction([IDBFS.DB_STORE_NAME], 'readwrite'); - var store = transaction.objectStore(IDBFS.DB_STORE_NAME); - - function done(err) { - if (err) { - if (!done.errored) { - done.errored = true; - return callback(err); - } - return; - } - if (++completed >= total) { - return callback(null); - } - }; - - transaction.onerror = function(e) { - done(this.error); - e.preventDefault(); - }; - - // sort paths in ascending order so directory entries are created - // before the files inside them - create.sort().forEach(function (path) { - if (dst.type === 'local') { - IDBFS.loadRemoteEntry(store, path, function (err, entry) { - if (err) return done(err); - IDBFS.storeLocalEntry(path, entry, done); - }); - } else { - IDBFS.loadLocalEntry(path, function (err, entry) { - if (err) return done(err); - IDBFS.storeRemoteEntry(store, path, entry, done); - }); - } - }); - - // sort paths in descending order so files are deleted before their - // parent directories - remove.sort().reverse().forEach(function(path) { - if (dst.type === 'local') { - IDBFS.removeLocalEntry(path, done); - } else { - IDBFS.removeRemoteEntry(store, path, done); - } - }); - }}; - - var NODEFS={isWindows:false,staticInit:function () { - NODEFS.isWindows = !!process.platform.match(/^win/); - var flags = process["binding"]("constants"); - // Node.js 4 compatibility: it has no namespaces for constants - if (flags["fs"]) { - flags = flags["fs"]; - } - NODEFS.flagsForNodeMap = { - "1024": flags["O_APPEND"], - "64": flags["O_CREAT"], - "128": flags["O_EXCL"], - "0": flags["O_RDONLY"], - "2": flags["O_RDWR"], - "4096": flags["O_SYNC"], - "512": flags["O_TRUNC"], - "1": flags["O_WRONLY"] - }; - },bufferFrom:function (arrayBuffer) { - // Node.js < 4.5 compatibility: Buffer.from does not support ArrayBuffer - // Buffer.from before 4.5 was just a method inherited from Uint8Array - // Buffer.alloc has been added with Buffer.from together, so check it instead - return Buffer.alloc ? Buffer.from(arrayBuffer) : new Buffer(arrayBuffer); - },mount:function (mount) { - assert(ENVIRONMENT_IS_NODE); - return NODEFS.createNode(null, '/', NODEFS.getMode(mount.opts.root), 0); - },createNode:function (parent, name, mode, dev) { - if (!FS.isDir(mode) && !FS.isFile(mode) && !FS.isLink(mode)) { - throw new FS.ErrnoError(ERRNO_CODES.EINVAL); - } - var node = FS.createNode(parent, name, mode); - node.node_ops = NODEFS.node_ops; - node.stream_ops = NODEFS.stream_ops; - return node; - },getMode:function (path) { - var stat; - try { - stat = fs.lstatSync(path); - if (NODEFS.isWindows) { - // Node.js on Windows never represents permission bit 'x', so - // propagate read bits to execute bits - stat.mode = stat.mode | ((stat.mode & 292) >> 2); - } - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - return stat.mode; - },realPath:function (node) { - var parts = []; - while (node.parent !== node) { - parts.push(node.name); - node = node.parent; - } - parts.push(node.mount.opts.root); - parts.reverse(); - return PATH.join.apply(null, parts); - },flagsForNode:function (flags) { - flags &= ~0x200000 /*O_PATH*/; // Ignore this flag from musl, otherwise node.js fails to open the file. - flags &= ~0x800 /*O_NONBLOCK*/; // Ignore this flag from musl, otherwise node.js fails to open the file. - flags &= ~0x8000 /*O_LARGEFILE*/; // Ignore this flag from musl, otherwise node.js fails to open the file. - flags &= ~0x80000 /*O_CLOEXEC*/; // Some applications may pass it; it makes no sense for a single process. - var newFlags = 0; - for (var k in NODEFS.flagsForNodeMap) { - if (flags & k) { - newFlags |= NODEFS.flagsForNodeMap[k]; - flags ^= k; - } - } - - if (!flags) { - return newFlags; - } else { - throw new FS.ErrnoError(ERRNO_CODES.EINVAL); - } - },node_ops:{getattr:function (node) { - var path = NODEFS.realPath(node); - var stat; - try { - stat = fs.lstatSync(path); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - // node.js v0.10.20 doesn't report blksize and blocks on Windows. Fake them with default blksize of 4096. - // See http://support.microsoft.com/kb/140365 - if (NODEFS.isWindows && !stat.blksize) { - stat.blksize = 4096; - } - if (NODEFS.isWindows && !stat.blocks) { - stat.blocks = (stat.size+stat.blksize-1)/stat.blksize|0; - } - return { - dev: stat.dev, - ino: stat.ino, - mode: stat.mode, - nlink: stat.nlink, - uid: stat.uid, - gid: stat.gid, - rdev: stat.rdev, - size: stat.size, - atime: stat.atime, - mtime: stat.mtime, - ctime: stat.ctime, - blksize: stat.blksize, - blocks: stat.blocks - }; - },setattr:function (node, attr) { - var path = NODEFS.realPath(node); - try { - if (attr.mode !== undefined) { - fs.chmodSync(path, attr.mode); - // update the common node structure mode as well - node.mode = attr.mode; - } - if (attr.timestamp !== undefined) { - var date = new Date(attr.timestamp); - fs.utimesSync(path, date, date); - } - if (attr.size !== undefined) { - fs.truncateSync(path, attr.size); - } - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - },lookup:function (parent, name) { - var path = PATH.join2(NODEFS.realPath(parent), name); - var mode = NODEFS.getMode(path); - return NODEFS.createNode(parent, name, mode); - },mknod:function (parent, name, mode, dev) { - var node = NODEFS.createNode(parent, name, mode, dev); - // create the backing node for this in the fs root as well - var path = NODEFS.realPath(node); - try { - if (FS.isDir(node.mode)) { - fs.mkdirSync(path, node.mode); - } else { - fs.writeFileSync(path, '', { mode: node.mode }); - } - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - return node; - },rename:function (oldNode, newDir, newName) { - var oldPath = NODEFS.realPath(oldNode); - var newPath = PATH.join2(NODEFS.realPath(newDir), newName); - try { - fs.renameSync(oldPath, newPath); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - },unlink:function (parent, name) { - var path = PATH.join2(NODEFS.realPath(parent), name); - try { - fs.unlinkSync(path); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - },rmdir:function (parent, name) { - var path = PATH.join2(NODEFS.realPath(parent), name); - try { - fs.rmdirSync(path); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - },readdir:function (node) { - var path = NODEFS.realPath(node); - try { - return fs.readdirSync(path); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - },symlink:function (parent, newName, oldPath) { - var newPath = PATH.join2(NODEFS.realPath(parent), newName); - try { - fs.symlinkSync(oldPath, newPath); - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - },readlink:function (node) { - var path = NODEFS.realPath(node); - try { - path = fs.readlinkSync(path); - path = NODEJS_PATH.relative(NODEJS_PATH.resolve(node.mount.opts.root), path); - return path; - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }},stream_ops:{open:function (stream) { - var path = NODEFS.realPath(stream.node); - try { - if (FS.isFile(stream.node.mode)) { - stream.nfd = fs.openSync(path, NODEFS.flagsForNode(stream.flags)); - } - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - },close:function (stream) { - try { - if (FS.isFile(stream.node.mode) && stream.nfd) { - fs.closeSync(stream.nfd); - } - } catch (e) { - if (!e.code) throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - },read:function (stream, buffer, offset, length, position) { - // Node.js < 6 compatibility: node errors on 0 length reads - if (length === 0) return 0; - try { - return fs.readSync(stream.nfd, NODEFS.bufferFrom(buffer.buffer), offset, length, position); - } catch (e) { - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - },write:function (stream, buffer, offset, length, position) { - try { - return fs.writeSync(stream.nfd, NODEFS.bufferFrom(buffer.buffer), offset, length, position); - } catch (e) { - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - },llseek:function (stream, offset, whence) { - var position = offset; - if (whence === 1) { // SEEK_CUR. - position += stream.position; - } else if (whence === 2) { // SEEK_END. - if (FS.isFile(stream.node.mode)) { - try { - var stat = fs.fstatSync(stream.nfd); - position += stat.size; - } catch (e) { - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - } - } - - if (position < 0) { - throw new FS.ErrnoError(ERRNO_CODES.EINVAL); - } - - return position; - }}}; - - var WORKERFS={DIR_MODE:16895,FILE_MODE:33279,reader:null,mount:function (mount) { - assert(ENVIRONMENT_IS_WORKER); - if (!WORKERFS.reader) WORKERFS.reader = new FileReaderSync(); - var root = WORKERFS.createNode(null, '/', WORKERFS.DIR_MODE, 0); - var createdParents = {}; - function ensureParent(path) { - // return the parent node, creating subdirs as necessary - var parts = path.split('/'); - var parent = root; - for (var i = 0; i < parts.length-1; i++) { - var curr = parts.slice(0, i+1).join('/'); - // Issue 4254: Using curr as a node name will prevent the node - // from being found in FS.nameTable when FS.open is called on - // a path which holds a child of this node, - // given that all FS functions assume node names - // are just their corresponding parts within their given path, - // rather than incremental aggregates which include their parent's - // directories. - if (!createdParents[curr]) { - createdParents[curr] = WORKERFS.createNode(parent, parts[i], WORKERFS.DIR_MODE, 0); - } - parent = createdParents[curr]; - } - return parent; - } - function base(path) { - var parts = path.split('/'); - return parts[parts.length-1]; - } - // We also accept FileList here, by using Array.prototype - Array.prototype.forEach.call(mount.opts["files"] || [], function(file) { - WORKERFS.createNode(ensureParent(file.name), base(file.name), WORKERFS.FILE_MODE, 0, file, file.lastModifiedDate); - }); - (mount.opts["blobs"] || []).forEach(function(obj) { - WORKERFS.createNode(ensureParent(obj["name"]), base(obj["name"]), WORKERFS.FILE_MODE, 0, obj["data"]); - }); - (mount.opts["packages"] || []).forEach(function(pack) { - pack['metadata'].files.forEach(function(file) { - var name = file.filename.substr(1); // remove initial slash - WORKERFS.createNode(ensureParent(name), base(name), WORKERFS.FILE_MODE, 0, pack['blob'].slice(file.start, file.end)); - }); - }); - return root; - },createNode:function (parent, name, mode, dev, contents, mtime) { - var node = FS.createNode(parent, name, mode); - node.mode = mode; - node.node_ops = WORKERFS.node_ops; - node.stream_ops = WORKERFS.stream_ops; - node.timestamp = (mtime || new Date).getTime(); - assert(WORKERFS.FILE_MODE !== WORKERFS.DIR_MODE); - if (mode === WORKERFS.FILE_MODE) { - node.size = contents.size; - node.contents = contents; - } else { - node.size = 4096; - node.contents = {}; - } - if (parent) { - parent.contents[name] = node; - } - return node; - },node_ops:{getattr:function (node) { - return { - dev: 1, - ino: undefined, - mode: node.mode, - nlink: 1, - uid: 0, - gid: 0, - rdev: undefined, - size: node.size, - atime: new Date(node.timestamp), - mtime: new Date(node.timestamp), - ctime: new Date(node.timestamp), - blksize: 4096, - blocks: Math.ceil(node.size / 4096), - }; - },setattr:function (node, attr) { - if (attr.mode !== undefined) { - node.mode = attr.mode; - } - if (attr.timestamp !== undefined) { - node.timestamp = attr.timestamp; - } - },lookup:function (parent, name) { - throw new FS.ErrnoError(ERRNO_CODES.ENOENT); - },mknod:function (parent, name, mode, dev) { - throw new FS.ErrnoError(ERRNO_CODES.EPERM); - },rename:function (oldNode, newDir, newName) { - throw new FS.ErrnoError(ERRNO_CODES.EPERM); - },unlink:function (parent, name) { - throw new FS.ErrnoError(ERRNO_CODES.EPERM); - },rmdir:function (parent, name) { - throw new FS.ErrnoError(ERRNO_CODES.EPERM); - },readdir:function (node) { - var entries = ['.', '..']; - for (var key in node.contents) { - if (!node.contents.hasOwnProperty(key)) { - continue; - } - entries.push(key); - } - return entries; - },symlink:function (parent, newName, oldPath) { - throw new FS.ErrnoError(ERRNO_CODES.EPERM); - },readlink:function (node) { - throw new FS.ErrnoError(ERRNO_CODES.EPERM); - }},stream_ops:{read:function (stream, buffer, offset, length, position) { - if (position >= stream.node.size) return 0; - var chunk = stream.node.contents.slice(position, position + length); - var ab = WORKERFS.reader.readAsArrayBuffer(chunk); - buffer.set(new Uint8Array(ab), offset); - return chunk.size; - },write:function (stream, buffer, offset, length, position) { - throw new FS.ErrnoError(ERRNO_CODES.EIO); - },llseek:function (stream, offset, whence) { - var position = offset; - if (whence === 1) { // SEEK_CUR. - position += stream.position; - } else if (whence === 2) { // SEEK_END. - if (FS.isFile(stream.node.mode)) { - position += stream.node.size; - } - } - if (position < 0) { - throw new FS.ErrnoError(ERRNO_CODES.EINVAL); - } - return position; - }}}; - - var ERRNO_MESSAGES={0:"Success",1:"Not super-user",2:"No such file or directory",3:"No such process",4:"Interrupted system call",5:"I/O error",6:"No such device or address",7:"Arg list too long",8:"Exec format error",9:"Bad file number",10:"No children",11:"No more processes",12:"Not enough core",13:"Permission denied",14:"Bad address",15:"Block device required",16:"Mount device busy",17:"File exists",18:"Cross-device link",19:"No such device",20:"Not a directory",21:"Is a directory",22:"Invalid argument",23:"Too many open files in system",24:"Too many open files",25:"Not a typewriter",26:"Text file busy",27:"File too large",28:"No space left on device",29:"Illegal seek",30:"Read only file system",31:"Too many links",32:"Broken pipe",33:"Math arg out of domain of func",34:"Math result not representable",35:"File locking deadlock error",36:"File or path name too long",37:"No record locks available",38:"Function not implemented",39:"Directory not empty",40:"Too many symbolic links",42:"No message of desired type",43:"Identifier removed",44:"Channel number out of range",45:"Level 2 not synchronized",46:"Level 3 halted",47:"Level 3 reset",48:"Link number out of range",49:"Protocol driver not attached",50:"No CSI structure available",51:"Level 2 halted",52:"Invalid exchange",53:"Invalid request descriptor",54:"Exchange full",55:"No anode",56:"Invalid request code",57:"Invalid slot",59:"Bad font file fmt",60:"Device not a stream",61:"No data (for no delay io)",62:"Timer expired",63:"Out of streams resources",64:"Machine is not on the network",65:"Package not installed",66:"The object is remote",67:"The link has been severed",68:"Advertise error",69:"Srmount error",70:"Communication error on send",71:"Protocol error",72:"Multihop attempted",73:"Cross mount point (not really error)",74:"Trying to read unreadable message",75:"Value too large for defined data type",76:"Given log. name not unique",77:"f.d. invalid for this operation",78:"Remote address changed",79:"Can access a needed shared lib",80:"Accessing a corrupted shared lib",81:".lib section in a.out corrupted",82:"Attempting to link in too many libs",83:"Attempting to exec a shared library",84:"Illegal byte sequence",86:"Streams pipe error",87:"Too many users",88:"Socket operation on non-socket",89:"Destination address required",90:"Message too long",91:"Protocol wrong type for socket",92:"Protocol not available",93:"Unknown protocol",94:"Socket type not supported",95:"Not supported",96:"Protocol family not supported",97:"Address family not supported by protocol family",98:"Address already in use",99:"Address not available",100:"Network interface is not configured",101:"Network is unreachable",102:"Connection reset by network",103:"Connection aborted",104:"Connection reset by peer",105:"No buffer space available",106:"Socket is already connected",107:"Socket is not connected",108:"Can't send after socket shutdown",109:"Too many references",110:"Connection timed out",111:"Connection refused",112:"Host is down",113:"Host is unreachable",114:"Socket already connected",115:"Connection already in progress",116:"Stale file handle",122:"Quota exceeded",123:"No medium (in tape drive)",125:"Operation canceled",130:"Previous owner died",131:"State not recoverable"}; - - var ERRNO_CODES={EPERM:1,ENOENT:2,ESRCH:3,EINTR:4,EIO:5,ENXIO:6,E2BIG:7,ENOEXEC:8,EBADF:9,ECHILD:10,EAGAIN:11,EWOULDBLOCK:11,ENOMEM:12,EACCES:13,EFAULT:14,ENOTBLK:15,EBUSY:16,EEXIST:17,EXDEV:18,ENODEV:19,ENOTDIR:20,EISDIR:21,EINVAL:22,ENFILE:23,EMFILE:24,ENOTTY:25,ETXTBSY:26,EFBIG:27,ENOSPC:28,ESPIPE:29,EROFS:30,EMLINK:31,EPIPE:32,EDOM:33,ERANGE:34,ENOMSG:42,EIDRM:43,ECHRNG:44,EL2NSYNC:45,EL3HLT:46,EL3RST:47,ELNRNG:48,EUNATCH:49,ENOCSI:50,EL2HLT:51,EDEADLK:35,ENOLCK:37,EBADE:52,EBADR:53,EXFULL:54,ENOANO:55,EBADRQC:56,EBADSLT:57,EDEADLOCK:35,EBFONT:59,ENOSTR:60,ENODATA:61,ETIME:62,ENOSR:63,ENONET:64,ENOPKG:65,EREMOTE:66,ENOLINK:67,EADV:68,ESRMNT:69,ECOMM:70,EPROTO:71,EMULTIHOP:72,EDOTDOT:73,EBADMSG:74,ENOTUNIQ:76,EBADFD:77,EREMCHG:78,ELIBACC:79,ELIBBAD:80,ELIBSCN:81,ELIBMAX:82,ELIBEXEC:83,ENOSYS:38,ENOTEMPTY:39,ENAMETOOLONG:36,ELOOP:40,EOPNOTSUPP:95,EPFNOSUPPORT:96,ECONNRESET:104,ENOBUFS:105,EAFNOSUPPORT:97,EPROTOTYPE:91,ENOTSOCK:88,ENOPROTOOPT:92,ESHUTDOWN:108,ECONNREFUSED:111,EADDRINUSE:98,ECONNABORTED:103,ENETUNREACH:101,ENETDOWN:100,ETIMEDOUT:110,EHOSTDOWN:112,EHOSTUNREACH:113,EINPROGRESS:115,EALREADY:114,EDESTADDRREQ:89,EMSGSIZE:90,EPROTONOSUPPORT:93,ESOCKTNOSUPPORT:94,EADDRNOTAVAIL:99,ENETRESET:102,EISCONN:106,ENOTCONN:107,ETOOMANYREFS:109,EUSERS:87,EDQUOT:122,ESTALE:116,ENOTSUP:95,ENOMEDIUM:123,EILSEQ:84,EOVERFLOW:75,ECANCELED:125,ENOTRECOVERABLE:131,EOWNERDEAD:130,ESTRPIPE:86}; - - var _stdin=5936; - - var _stdout=5952; - - var _stderr=5968;var FS={root:null,mounts:[],devices:{},streams:[],nextInode:1,nameTable:null,currentPath:"/",initialized:false,ignorePermissions:true,trackingDelegate:{},tracking:{openFlags:{READ:1,WRITE:2}},ErrnoError:null,genericErrors:{},filesystems:null,syncFSRequests:0,handleFSError:function (e) { - if (!(e instanceof FS.ErrnoError)) throw e + ' : ' + stackTrace(); - return ___setErrNo(e.errno); - },lookupPath:function (path, opts) { - path = PATH.resolve(FS.cwd(), path); - opts = opts || {}; - - if (!path) return { path: '', node: null }; - - var defaults = { - follow_mount: true, - recurse_count: 0 - }; - for (var key in defaults) { - if (opts[key] === undefined) { - opts[key] = defaults[key]; - } - } - - if (opts.recurse_count > 8) { // max recursive lookup of 8 - throw new FS.ErrnoError(40); - } - - // split the path - var parts = PATH.normalizeArray(path.split('/').filter(function(p) { - return !!p; - }), false); - - // start at the root - var current = FS.root; - var current_path = '/'; - - for (var i = 0; i < parts.length; i++) { - var islast = (i === parts.length-1); - if (islast && opts.parent) { - // stop resolving - break; - } - - current = FS.lookupNode(current, parts[i]); - current_path = PATH.join2(current_path, parts[i]); - - // jump to the mount's root node if this is a mountpoint - if (FS.isMountpoint(current)) { - if (!islast || (islast && opts.follow_mount)) { - current = current.mounted.root; - } - } - - // by default, lookupPath will not follow a symlink if it is the final path component. - // setting opts.follow = true will override this behavior. - if (!islast || opts.follow) { - var count = 0; - while (FS.isLink(current.mode)) { - var link = FS.readlink(current_path); - current_path = PATH.resolve(PATH.dirname(current_path), link); - - var lookup = FS.lookupPath(current_path, { recurse_count: opts.recurse_count }); - current = lookup.node; - - if (count++ > 40) { // limit max consecutive symlinks to 40 (SYMLOOP_MAX). - throw new FS.ErrnoError(40); - } - } - } - } - - return { path: current_path, node: current }; - },getPath:function (node) { - var path; - while (true) { - if (FS.isRoot(node)) { - var mount = node.mount.mountpoint; - if (!path) return mount; - return mount[mount.length-1] !== '/' ? mount + '/' + path : mount + path; - } - path = path ? node.name + '/' + path : node.name; - node = node.parent; - } - },hashName:function (parentid, name) { - var hash = 0; - - - for (var i = 0; i < name.length; i++) { - hash = ((hash << 5) - hash + name.charCodeAt(i)) | 0; - } - return ((parentid + hash) >>> 0) % FS.nameTable.length; - },hashAddNode:function (node) { - var hash = FS.hashName(node.parent.id, node.name); - node.name_next = FS.nameTable[hash]; - FS.nameTable[hash] = node; - },hashRemoveNode:function (node) { - var hash = FS.hashName(node.parent.id, node.name); - if (FS.nameTable[hash] === node) { - FS.nameTable[hash] = node.name_next; - } else { - var current = FS.nameTable[hash]; - while (current) { - if (current.name_next === node) { - current.name_next = node.name_next; - break; - } - current = current.name_next; - } - } - },lookupNode:function (parent, name) { - var err = FS.mayLookup(parent); - if (err) { - throw new FS.ErrnoError(err, parent); - } - var hash = FS.hashName(parent.id, name); - for (var node = FS.nameTable[hash]; node; node = node.name_next) { - var nodeName = node.name; - if (node.parent.id === parent.id && nodeName === name) { - return node; - } - } - // if we failed to find it in the cache, call into the VFS - return FS.lookup(parent, name); - },createNode:function (parent, name, mode, rdev) { - if (!FS.FSNode) { - FS.FSNode = function(parent, name, mode, rdev) { - if (!parent) { - parent = this; // root node sets parent to itself - } - this.parent = parent; - this.mount = parent.mount; - this.mounted = null; - this.id = FS.nextInode++; - this.name = name; - this.mode = mode; - this.node_ops = {}; - this.stream_ops = {}; - this.rdev = rdev; - }; - - FS.FSNode.prototype = {}; - - // compatibility - var readMode = 292 | 73; - var writeMode = 146; - - // NOTE we must use Object.defineProperties instead of individual calls to - // Object.defineProperty in order to make closure compiler happy - Object.defineProperties(FS.FSNode.prototype, { - read: { - get: function() { return (this.mode & readMode) === readMode; }, - set: function(val) { val ? this.mode |= readMode : this.mode &= ~readMode; } - }, - write: { - get: function() { return (this.mode & writeMode) === writeMode; }, - set: function(val) { val ? this.mode |= writeMode : this.mode &= ~writeMode; } - }, - isFolder: { - get: function() { return FS.isDir(this.mode); } - }, - isDevice: { - get: function() { return FS.isChrdev(this.mode); } - } - }); - } - - var node = new FS.FSNode(parent, name, mode, rdev); - - FS.hashAddNode(node); - - return node; - },destroyNode:function (node) { - FS.hashRemoveNode(node); - },isRoot:function (node) { - return node === node.parent; - },isMountpoint:function (node) { - return !!node.mounted; - },isFile:function (mode) { - return (mode & 61440) === 32768; - },isDir:function (mode) { - return (mode & 61440) === 16384; - },isLink:function (mode) { - return (mode & 61440) === 40960; - },isChrdev:function (mode) { - return (mode & 61440) === 8192; - },isBlkdev:function (mode) { - return (mode & 61440) === 24576; - },isFIFO:function (mode) { - return (mode & 61440) === 4096; - },isSocket:function (mode) { - return (mode & 49152) === 49152; - },flagModes:{"r":0,"rs":1052672,"r+":2,"w":577,"wx":705,"xw":705,"w+":578,"wx+":706,"xw+":706,"a":1089,"ax":1217,"xa":1217,"a+":1090,"ax+":1218,"xa+":1218},modeStringToFlags:function (str) { - var flags = FS.flagModes[str]; - if (typeof flags === 'undefined') { - throw new Error('Unknown file open mode: ' + str); - } - return flags; - },flagsToPermissionString:function (flag) { - var perms = ['r', 'w', 'rw'][flag & 3]; - if ((flag & 512)) { - perms += 'w'; - } - return perms; - },nodePermissions:function (node, perms) { - if (FS.ignorePermissions) { - return 0; - } - // return 0 if any user, group or owner bits are set. - if (perms.indexOf('r') !== -1 && !(node.mode & 292)) { - return 13; - } else if (perms.indexOf('w') !== -1 && !(node.mode & 146)) { - return 13; - } else if (perms.indexOf('x') !== -1 && !(node.mode & 73)) { - return 13; - } - return 0; - },mayLookup:function (dir) { - var err = FS.nodePermissions(dir, 'x'); - if (err) return err; - if (!dir.node_ops.lookup) return 13; - return 0; - },mayCreate:function (dir, name) { - try { - var node = FS.lookupNode(dir, name); - return 17; - } catch (e) { - } - return FS.nodePermissions(dir, 'wx'); - },mayDelete:function (dir, name, isdir) { - var node; - try { - node = FS.lookupNode(dir, name); - } catch (e) { - return e.errno; - } - var err = FS.nodePermissions(dir, 'wx'); - if (err) { - return err; - } - if (isdir) { - if (!FS.isDir(node.mode)) { - return 20; - } - if (FS.isRoot(node) || FS.getPath(node) === FS.cwd()) { - return 16; - } - } else { - if (FS.isDir(node.mode)) { - return 21; - } - } - return 0; - },mayOpen:function (node, flags) { - if (!node) { - return 2; - } - if (FS.isLink(node.mode)) { - return 40; - } else if (FS.isDir(node.mode)) { - if (FS.flagsToPermissionString(flags) !== 'r' || // opening for write - (flags & 512)) { // TODO: check for O_SEARCH? (== search for dir only) - return 21; - } - } - return FS.nodePermissions(node, FS.flagsToPermissionString(flags)); - },MAX_OPEN_FDS:4096,nextfd:function (fd_start, fd_end) { - fd_start = fd_start || 0; - fd_end = fd_end || FS.MAX_OPEN_FDS; - for (var fd = fd_start; fd <= fd_end; fd++) { - if (!FS.streams[fd]) { - return fd; - } - } - throw new FS.ErrnoError(24); - },getStream:function (fd) { - return FS.streams[fd]; - },createStream:function (stream, fd_start, fd_end) { - if (!FS.FSStream) { - FS.FSStream = function(){}; - FS.FSStream.prototype = {}; - // compatibility - Object.defineProperties(FS.FSStream.prototype, { - object: { - get: function() { return this.node; }, - set: function(val) { this.node = val; } - }, - isRead: { - get: function() { return (this.flags & 2097155) !== 1; } - }, - isWrite: { - get: function() { return (this.flags & 2097155) !== 0; } - }, - isAppend: { - get: function() { return (this.flags & 1024); } - } - }); - } - // clone it, so we can return an instance of FSStream - var newStream = new FS.FSStream(); - for (var p in stream) { - newStream[p] = stream[p]; - } - stream = newStream; - var fd = FS.nextfd(fd_start, fd_end); - stream.fd = fd; - FS.streams[fd] = stream; - return stream; - },closeStream:function (fd) { - FS.streams[fd] = null; - },chrdev_stream_ops:{open:function (stream) { - var device = FS.getDevice(stream.node.rdev); - // override node's stream ops with the device's - stream.stream_ops = device.stream_ops; - // forward the open call - if (stream.stream_ops.open) { - stream.stream_ops.open(stream); - } - },llseek:function () { - throw new FS.ErrnoError(29); - }},major:function (dev) { - return ((dev) >> 8); - },minor:function (dev) { - return ((dev) & 0xff); - },makedev:function (ma, mi) { - return ((ma) << 8 | (mi)); - },registerDevice:function (dev, ops) { - FS.devices[dev] = { stream_ops: ops }; - },getDevice:function (dev) { - return FS.devices[dev]; - },getMounts:function (mount) { - var mounts = []; - var check = [mount]; - - while (check.length) { - var m = check.pop(); - - mounts.push(m); - - check.push.apply(check, m.mounts); - } - - return mounts; - },syncfs:function (populate, callback) { - if (typeof(populate) === 'function') { - callback = populate; - populate = false; - } - - FS.syncFSRequests++; - - if (FS.syncFSRequests > 1) { - console.log('warning: ' + FS.syncFSRequests + ' FS.syncfs operations in flight at once, probably just doing extra work'); - } - - var mounts = FS.getMounts(FS.root.mount); - var completed = 0; - - function doCallback(err) { - assert(FS.syncFSRequests > 0); - FS.syncFSRequests--; - return callback(err); - } - - function done(err) { - if (err) { - if (!done.errored) { - done.errored = true; - return doCallback(err); - } - return; - } - if (++completed >= mounts.length) { - doCallback(null); - } - }; - - // sync all mounts - mounts.forEach(function (mount) { - if (!mount.type.syncfs) { - return done(null); - } - mount.type.syncfs(mount, populate, done); - }); - },mount:function (type, opts, mountpoint) { - var root = mountpoint === '/'; - var pseudo = !mountpoint; - var node; - - if (root && FS.root) { - throw new FS.ErrnoError(16); - } else if (!root && !pseudo) { - var lookup = FS.lookupPath(mountpoint, { follow_mount: false }); - - mountpoint = lookup.path; // use the absolute path - node = lookup.node; - - if (FS.isMountpoint(node)) { - throw new FS.ErrnoError(16); - } - - if (!FS.isDir(node.mode)) { - throw new FS.ErrnoError(20); - } - } - - var mount = { - type: type, - opts: opts, - mountpoint: mountpoint, - mounts: [] - }; - - // create a root node for the fs - var mountRoot = type.mount(mount); - mountRoot.mount = mount; - mount.root = mountRoot; - - if (root) { - FS.root = mountRoot; - } else if (node) { - // set as a mountpoint - node.mounted = mount; - - // add the new mount to the current mount's children - if (node.mount) { - node.mount.mounts.push(mount); - } - } - - return mountRoot; - },unmount:function (mountpoint) { - var lookup = FS.lookupPath(mountpoint, { follow_mount: false }); - - if (!FS.isMountpoint(lookup.node)) { - throw new FS.ErrnoError(22); - } - - // destroy the nodes for this mount, and all its child mounts - var node = lookup.node; - var mount = node.mounted; - var mounts = FS.getMounts(mount); - - Object.keys(FS.nameTable).forEach(function (hash) { - var current = FS.nameTable[hash]; - - while (current) { - var next = current.name_next; - - if (mounts.indexOf(current.mount) !== -1) { - FS.destroyNode(current); - } - - current = next; - } - }); - - // no longer a mountpoint - node.mounted = null; - - // remove this mount from the child mounts - var idx = node.mount.mounts.indexOf(mount); - assert(idx !== -1); - node.mount.mounts.splice(idx, 1); - },lookup:function (parent, name) { - return parent.node_ops.lookup(parent, name); - },mknod:function (path, mode, dev) { - var lookup = FS.lookupPath(path, { parent: true }); - var parent = lookup.node; - var name = PATH.basename(path); - if (!name || name === '.' || name === '..') { - throw new FS.ErrnoError(22); - } - var err = FS.mayCreate(parent, name); - if (err) { - throw new FS.ErrnoError(err); - } - if (!parent.node_ops.mknod) { - throw new FS.ErrnoError(1); - } - return parent.node_ops.mknod(parent, name, mode, dev); - },create:function (path, mode) { - mode = mode !== undefined ? mode : 438 /* 0666 */; - mode &= 4095; - mode |= 32768; - return FS.mknod(path, mode, 0); - },mkdir:function (path, mode) { - mode = mode !== undefined ? mode : 511 /* 0777 */; - mode &= 511 | 512; - mode |= 16384; - return FS.mknod(path, mode, 0); - },mkdirTree:function (path, mode) { - var dirs = path.split('/'); - var d = ''; - for (var i = 0; i < dirs.length; ++i) { - if (!dirs[i]) continue; - d += '/' + dirs[i]; - try { - FS.mkdir(d, mode); - } catch(e) { - if (e.errno != 17) throw e; - } - } - },mkdev:function (path, mode, dev) { - if (typeof(dev) === 'undefined') { - dev = mode; - mode = 438 /* 0666 */; - } - mode |= 8192; - return FS.mknod(path, mode, dev); - },symlink:function (oldpath, newpath) { - if (!PATH.resolve(oldpath)) { - throw new FS.ErrnoError(2); - } - var lookup = FS.lookupPath(newpath, { parent: true }); - var parent = lookup.node; - if (!parent) { - throw new FS.ErrnoError(2); - } - var newname = PATH.basename(newpath); - var err = FS.mayCreate(parent, newname); - if (err) { - throw new FS.ErrnoError(err); - } - if (!parent.node_ops.symlink) { - throw new FS.ErrnoError(1); - } - return parent.node_ops.symlink(parent, newname, oldpath); - },rename:function (old_path, new_path) { - var old_dirname = PATH.dirname(old_path); - var new_dirname = PATH.dirname(new_path); - var old_name = PATH.basename(old_path); - var new_name = PATH.basename(new_path); - // parents must exist - var lookup, old_dir, new_dir; - try { - lookup = FS.lookupPath(old_path, { parent: true }); - old_dir = lookup.node; - lookup = FS.lookupPath(new_path, { parent: true }); - new_dir = lookup.node; - } catch (e) { - throw new FS.ErrnoError(16); - } - if (!old_dir || !new_dir) throw new FS.ErrnoError(2); - // need to be part of the same mount - if (old_dir.mount !== new_dir.mount) { - throw new FS.ErrnoError(18); - } - // source must exist - var old_node = FS.lookupNode(old_dir, old_name); - // old path should not be an ancestor of the new path - var relative = PATH.relative(old_path, new_dirname); - if (relative.charAt(0) !== '.') { - throw new FS.ErrnoError(22); - } - // new path should not be an ancestor of the old path - relative = PATH.relative(new_path, old_dirname); - if (relative.charAt(0) !== '.') { - throw new FS.ErrnoError(39); - } - // see if the new path already exists - var new_node; - try { - new_node = FS.lookupNode(new_dir, new_name); - } catch (e) { - // not fatal - } - // early out if nothing needs to change - if (old_node === new_node) { - return; - } - // we'll need to delete the old entry - var isdir = FS.isDir(old_node.mode); - var err = FS.mayDelete(old_dir, old_name, isdir); - if (err) { - throw new FS.ErrnoError(err); - } - // need delete permissions if we'll be overwriting. - // need create permissions if new doesn't already exist. - err = new_node ? - FS.mayDelete(new_dir, new_name, isdir) : - FS.mayCreate(new_dir, new_name); - if (err) { - throw new FS.ErrnoError(err); - } - if (!old_dir.node_ops.rename) { - throw new FS.ErrnoError(1); - } - if (FS.isMountpoint(old_node) || (new_node && FS.isMountpoint(new_node))) { - throw new FS.ErrnoError(16); - } - // if we are going to change the parent, check write permissions - if (new_dir !== old_dir) { - err = FS.nodePermissions(old_dir, 'w'); - if (err) { - throw new FS.ErrnoError(err); - } - } - try { - if (FS.trackingDelegate['willMovePath']) { - FS.trackingDelegate['willMovePath'](old_path, new_path); - } - } catch(e) { - console.log("FS.trackingDelegate['willMovePath']('"+old_path+"', '"+new_path+"') threw an exception: " + e.message); - } - // remove the node from the lookup hash - FS.hashRemoveNode(old_node); - // do the underlying fs rename - try { - old_dir.node_ops.rename(old_node, new_dir, new_name); - } catch (e) { - throw e; - } finally { - // add the node back to the hash (in case node_ops.rename - // changed its name) - FS.hashAddNode(old_node); - } - try { - if (FS.trackingDelegate['onMovePath']) FS.trackingDelegate['onMovePath'](old_path, new_path); - } catch(e) { - console.log("FS.trackingDelegate['onMovePath']('"+old_path+"', '"+new_path+"') threw an exception: " + e.message); - } - },rmdir:function (path) { - var lookup = FS.lookupPath(path, { parent: true }); - var parent = lookup.node; - var name = PATH.basename(path); - var node = FS.lookupNode(parent, name); - var err = FS.mayDelete(parent, name, true); - if (err) { - throw new FS.ErrnoError(err); - } - if (!parent.node_ops.rmdir) { - throw new FS.ErrnoError(1); - } - if (FS.isMountpoint(node)) { - throw new FS.ErrnoError(16); - } - try { - if (FS.trackingDelegate['willDeletePath']) { - FS.trackingDelegate['willDeletePath'](path); - } - } catch(e) { - console.log("FS.trackingDelegate['willDeletePath']('"+path+"') threw an exception: " + e.message); - } - parent.node_ops.rmdir(parent, name); - FS.destroyNode(node); - try { - if (FS.trackingDelegate['onDeletePath']) FS.trackingDelegate['onDeletePath'](path); - } catch(e) { - console.log("FS.trackingDelegate['onDeletePath']('"+path+"') threw an exception: " + e.message); - } - },readdir:function (path) { - var lookup = FS.lookupPath(path, { follow: true }); - var node = lookup.node; - if (!node.node_ops.readdir) { - throw new FS.ErrnoError(20); - } - return node.node_ops.readdir(node); - },unlink:function (path) { - var lookup = FS.lookupPath(path, { parent: true }); - var parent = lookup.node; - var name = PATH.basename(path); - var node = FS.lookupNode(parent, name); - var err = FS.mayDelete(parent, name, false); - if (err) { - // According to POSIX, we should map EISDIR to EPERM, but - // we instead do what Linux does (and we must, as we use - // the musl linux libc). - throw new FS.ErrnoError(err); - } - if (!parent.node_ops.unlink) { - throw new FS.ErrnoError(1); - } - if (FS.isMountpoint(node)) { - throw new FS.ErrnoError(16); - } - try { - if (FS.trackingDelegate['willDeletePath']) { - FS.trackingDelegate['willDeletePath'](path); - } - } catch(e) { - console.log("FS.trackingDelegate['willDeletePath']('"+path+"') threw an exception: " + e.message); - } - parent.node_ops.unlink(parent, name); - FS.destroyNode(node); - try { - if (FS.trackingDelegate['onDeletePath']) FS.trackingDelegate['onDeletePath'](path); - } catch(e) { - console.log("FS.trackingDelegate['onDeletePath']('"+path+"') threw an exception: " + e.message); - } - },readlink:function (path) { - var lookup = FS.lookupPath(path); - var link = lookup.node; - if (!link) { - throw new FS.ErrnoError(2); - } - if (!link.node_ops.readlink) { - throw new FS.ErrnoError(22); - } - return PATH.resolve(FS.getPath(link.parent), link.node_ops.readlink(link)); - },stat:function (path, dontFollow) { - var lookup = FS.lookupPath(path, { follow: !dontFollow }); - var node = lookup.node; - if (!node) { - throw new FS.ErrnoError(2); - } - if (!node.node_ops.getattr) { - throw new FS.ErrnoError(1); - } - return node.node_ops.getattr(node); - },lstat:function (path) { - return FS.stat(path, true); - },chmod:function (path, mode, dontFollow) { - var node; - if (typeof path === 'string') { - var lookup = FS.lookupPath(path, { follow: !dontFollow }); - node = lookup.node; - } else { - node = path; - } - if (!node.node_ops.setattr) { - throw new FS.ErrnoError(1); - } - node.node_ops.setattr(node, { - mode: (mode & 4095) | (node.mode & ~4095), - timestamp: Date.now() - }); - },lchmod:function (path, mode) { - FS.chmod(path, mode, true); - },fchmod:function (fd, mode) { - var stream = FS.getStream(fd); - if (!stream) { - throw new FS.ErrnoError(9); - } - FS.chmod(stream.node, mode); - },chown:function (path, uid, gid, dontFollow) { - var node; - if (typeof path === 'string') { - var lookup = FS.lookupPath(path, { follow: !dontFollow }); - node = lookup.node; - } else { - node = path; - } - if (!node.node_ops.setattr) { - throw new FS.ErrnoError(1); - } - node.node_ops.setattr(node, { - timestamp: Date.now() - // we ignore the uid / gid for now - }); - },lchown:function (path, uid, gid) { - FS.chown(path, uid, gid, true); - },fchown:function (fd, uid, gid) { - var stream = FS.getStream(fd); - if (!stream) { - throw new FS.ErrnoError(9); - } - FS.chown(stream.node, uid, gid); - },truncate:function (path, len) { - if (len < 0) { - throw new FS.ErrnoError(22); - } - var node; - if (typeof path === 'string') { - var lookup = FS.lookupPath(path, { follow: true }); - node = lookup.node; - } else { - node = path; - } - if (!node.node_ops.setattr) { - throw new FS.ErrnoError(1); - } - if (FS.isDir(node.mode)) { - throw new FS.ErrnoError(21); - } - if (!FS.isFile(node.mode)) { - throw new FS.ErrnoError(22); - } - var err = FS.nodePermissions(node, 'w'); - if (err) { - throw new FS.ErrnoError(err); - } - node.node_ops.setattr(node, { - size: len, - timestamp: Date.now() - }); - },ftruncate:function (fd, len) { - var stream = FS.getStream(fd); - if (!stream) { - throw new FS.ErrnoError(9); - } - if ((stream.flags & 2097155) === 0) { - throw new FS.ErrnoError(22); - } - FS.truncate(stream.node, len); - },utime:function (path, atime, mtime) { - var lookup = FS.lookupPath(path, { follow: true }); - var node = lookup.node; - node.node_ops.setattr(node, { - timestamp: Math.max(atime, mtime) - }); - },open:function (path, flags, mode, fd_start, fd_end) { - if (path === "") { - throw new FS.ErrnoError(2); - } - flags = typeof flags === 'string' ? FS.modeStringToFlags(flags) : flags; - mode = typeof mode === 'undefined' ? 438 /* 0666 */ : mode; - if ((flags & 64)) { - mode = (mode & 4095) | 32768; - } else { - mode = 0; - } - var node; - if (typeof path === 'object') { - node = path; - } else { - path = PATH.normalize(path); - try { - var lookup = FS.lookupPath(path, { - follow: !(flags & 131072) - }); - node = lookup.node; - } catch (e) { - // ignore - } - } - // perhaps we need to create the node - var created = false; - if ((flags & 64)) { - if (node) { - // if O_CREAT and O_EXCL are set, error out if the node already exists - if ((flags & 128)) { - throw new FS.ErrnoError(17); - } - } else { - // node doesn't exist, try to create it - node = FS.mknod(path, mode, 0); - created = true; - } - } - if (!node) { - throw new FS.ErrnoError(2); - } - // can't truncate a device - if (FS.isChrdev(node.mode)) { - flags &= ~512; - } - // if asked only for a directory, then this must be one - if ((flags & 65536) && !FS.isDir(node.mode)) { - throw new FS.ErrnoError(20); - } - // check permissions, if this is not a file we just created now (it is ok to - // create and write to a file with read-only permissions; it is read-only - // for later use) - if (!created) { - var err = FS.mayOpen(node, flags); - if (err) { - throw new FS.ErrnoError(err); - } - } - // do truncation if necessary - if ((flags & 512)) { - FS.truncate(node, 0); - } - // we've already handled these, don't pass down to the underlying vfs - flags &= ~(128 | 512); - - // register the stream with the filesystem - var stream = FS.createStream({ - node: node, - path: FS.getPath(node), // we want the absolute path to the node - flags: flags, - seekable: true, - position: 0, - stream_ops: node.stream_ops, - // used by the file family libc calls (fopen, fwrite, ferror, etc.) - ungotten: [], - error: false - }, fd_start, fd_end); - // call the new stream's open function - if (stream.stream_ops.open) { - stream.stream_ops.open(stream); - } - if (Module['logReadFiles'] && !(flags & 1)) { - if (!FS.readFiles) FS.readFiles = {}; - if (!(path in FS.readFiles)) { - FS.readFiles[path] = 1; - console.log("FS.trackingDelegate error on read file: " + path); - } - } - try { - if (FS.trackingDelegate['onOpenFile']) { - var trackingFlags = 0; - if ((flags & 2097155) !== 1) { - trackingFlags |= FS.tracking.openFlags.READ; - } - if ((flags & 2097155) !== 0) { - trackingFlags |= FS.tracking.openFlags.WRITE; - } - FS.trackingDelegate['onOpenFile'](path, trackingFlags); - } - } catch(e) { - console.log("FS.trackingDelegate['onOpenFile']('"+path+"', flags) threw an exception: " + e.message); - } - return stream; - },close:function (stream) { - if (FS.isClosed(stream)) { - throw new FS.ErrnoError(9); - } - if (stream.getdents) stream.getdents = null; // free readdir state - try { - if (stream.stream_ops.close) { - stream.stream_ops.close(stream); - } - } catch (e) { - throw e; - } finally { - FS.closeStream(stream.fd); - } - stream.fd = null; - },isClosed:function (stream) { - return stream.fd === null; - },llseek:function (stream, offset, whence) { - if (FS.isClosed(stream)) { - throw new FS.ErrnoError(9); - } - if (!stream.seekable || !stream.stream_ops.llseek) { - throw new FS.ErrnoError(29); - } - if (whence != 0 /* SEEK_SET */ && whence != 1 /* SEEK_CUR */ && whence != 2 /* SEEK_END */) { - throw new FS.ErrnoError(22); - } - stream.position = stream.stream_ops.llseek(stream, offset, whence); - stream.ungotten = []; - return stream.position; - },read:function (stream, buffer, offset, length, position) { - if (length < 0 || position < 0) { - throw new FS.ErrnoError(22); - } - if (FS.isClosed(stream)) { - throw new FS.ErrnoError(9); - } - if ((stream.flags & 2097155) === 1) { - throw new FS.ErrnoError(9); - } - if (FS.isDir(stream.node.mode)) { - throw new FS.ErrnoError(21); - } - if (!stream.stream_ops.read) { - throw new FS.ErrnoError(22); - } - var seeking = typeof position !== 'undefined'; - if (!seeking) { - position = stream.position; - } else if (!stream.seekable) { - throw new FS.ErrnoError(29); - } - var bytesRead = stream.stream_ops.read(stream, buffer, offset, length, position); - if (!seeking) stream.position += bytesRead; - return bytesRead; - },write:function (stream, buffer, offset, length, position, canOwn) { - if (length < 0 || position < 0) { - throw new FS.ErrnoError(22); - } - if (FS.isClosed(stream)) { - throw new FS.ErrnoError(9); - } - if ((stream.flags & 2097155) === 0) { - throw new FS.ErrnoError(9); - } - if (FS.isDir(stream.node.mode)) { - throw new FS.ErrnoError(21); - } - if (!stream.stream_ops.write) { - throw new FS.ErrnoError(22); - } - if (stream.flags & 1024) { - // seek to the end before writing in append mode - FS.llseek(stream, 0, 2); - } - var seeking = typeof position !== 'undefined'; - if (!seeking) { - position = stream.position; - } else if (!stream.seekable) { - throw new FS.ErrnoError(29); - } - var bytesWritten = stream.stream_ops.write(stream, buffer, offset, length, position, canOwn); - if (!seeking) stream.position += bytesWritten; - try { - if (stream.path && FS.trackingDelegate['onWriteToFile']) FS.trackingDelegate['onWriteToFile'](stream.path); - } catch(e) { - console.log("FS.trackingDelegate['onWriteToFile']('"+stream.path+"') threw an exception: " + e.message); - } - return bytesWritten; - },allocate:function (stream, offset, length) { - if (FS.isClosed(stream)) { - throw new FS.ErrnoError(9); - } - if (offset < 0 || length <= 0) { - throw new FS.ErrnoError(22); - } - if ((stream.flags & 2097155) === 0) { - throw new FS.ErrnoError(9); - } - if (!FS.isFile(stream.node.mode) && !FS.isDir(stream.node.mode)) { - throw new FS.ErrnoError(19); - } - if (!stream.stream_ops.allocate) { - throw new FS.ErrnoError(95); - } - stream.stream_ops.allocate(stream, offset, length); - },mmap:function (stream, buffer, offset, length, position, prot, flags) { - // TODO if PROT is PROT_WRITE, make sure we have write access - if ((stream.flags & 2097155) === 1) { - throw new FS.ErrnoError(13); - } - if (!stream.stream_ops.mmap) { - throw new FS.ErrnoError(19); - } - return stream.stream_ops.mmap(stream, buffer, offset, length, position, prot, flags); - },msync:function (stream, buffer, offset, length, mmapFlags) { - if (!stream || !stream.stream_ops.msync) { - return 0; - } - return stream.stream_ops.msync(stream, buffer, offset, length, mmapFlags); - },munmap:function (stream) { - return 0; - },ioctl:function (stream, cmd, arg) { - if (!stream.stream_ops.ioctl) { - throw new FS.ErrnoError(25); - } - return stream.stream_ops.ioctl(stream, cmd, arg); - },readFile:function (path, opts) { - opts = opts || {}; - opts.flags = opts.flags || 'r'; - opts.encoding = opts.encoding || 'binary'; - if (opts.encoding !== 'utf8' && opts.encoding !== 'binary') { - throw new Error('Invalid encoding type "' + opts.encoding + '"'); - } - var ret; - var stream = FS.open(path, opts.flags); - var stat = FS.stat(path); - var length = stat.size; - var buf = new Uint8Array(length); - FS.read(stream, buf, 0, length, 0); - if (opts.encoding === 'utf8') { - ret = UTF8ArrayToString(buf, 0); - } else if (opts.encoding === 'binary') { - ret = buf; - } - FS.close(stream); - return ret; - },writeFile:function (path, data, opts) { - opts = opts || {}; - opts.flags = opts.flags || 'w'; - var stream = FS.open(path, opts.flags, opts.mode); - if (typeof data === 'string') { - var buf = new Uint8Array(lengthBytesUTF8(data)+1); - var actualNumBytes = stringToUTF8Array(data, buf, 0, buf.length); - FS.write(stream, buf, 0, actualNumBytes, undefined, opts.canOwn); - } else if (ArrayBuffer.isView(data)) { - FS.write(stream, data, 0, data.byteLength, undefined, opts.canOwn); - } else { - throw new Error('Unsupported data type'); - } - FS.close(stream); - },cwd:function () { - return FS.currentPath; - },chdir:function (path) { - var lookup = FS.lookupPath(path, { follow: true }); - if (lookup.node === null) { - throw new FS.ErrnoError(2); - } - if (!FS.isDir(lookup.node.mode)) { - throw new FS.ErrnoError(20); - } - var err = FS.nodePermissions(lookup.node, 'x'); - if (err) { - throw new FS.ErrnoError(err); - } - FS.currentPath = lookup.path; - },createDefaultDirectories:function () { - FS.mkdir('/tmp'); - FS.mkdir('/home'); - FS.mkdir('/home/web_user'); - },createDefaultDevices:function () { - // create /dev - FS.mkdir('/dev'); - // setup /dev/null - FS.registerDevice(FS.makedev(1, 3), { - read: function() { return 0; }, - write: function(stream, buffer, offset, length, pos) { return length; } - }); - FS.mkdev('/dev/null', FS.makedev(1, 3)); - // setup /dev/tty and /dev/tty1 - // stderr needs to print output using Module['printErr'] - // so we register a second tty just for it. - TTY.register(FS.makedev(5, 0), TTY.default_tty_ops); - TTY.register(FS.makedev(6, 0), TTY.default_tty1_ops); - FS.mkdev('/dev/tty', FS.makedev(5, 0)); - FS.mkdev('/dev/tty1', FS.makedev(6, 0)); - // setup /dev/[u]random - var random_device; - if (typeof crypto === 'object' && typeof crypto['getRandomValues'] === 'function') { - // for modern web browsers - var randomBuffer = new Uint8Array(1); - random_device = function() { crypto.getRandomValues(randomBuffer); return randomBuffer[0]; }; - } else - if (ENVIRONMENT_IS_NODE) { - // for nodejs with or without crypto support included - try { - var crypto_module = require('crypto'); - // nodejs has crypto support - random_device = function() { return crypto_module['randomBytes'](1)[0]; }; - } catch (e) { - // nodejs doesn't have crypto support - } - } else - {} - if (!random_device) { - // we couldn't find a proper implementation, as Math.random() is not suitable for /dev/random, see emscripten-core/emscripten/pull/7096 - random_device = function() { abort("no cryptographic support found for random_device. consider polyfilling it if you want to use something insecure like Math.random(), e.g. put this in a --pre-js: var crypto = { getRandomValues: function(array) { for (var i = 0; i < array.length; i++) array[i] = (Math.random()*256)|0 } };"); }; - } - FS.createDevice('/dev', 'random', random_device); - FS.createDevice('/dev', 'urandom', random_device); - // we're not going to emulate the actual shm device, - // just create the tmp dirs that reside in it commonly - FS.mkdir('/dev/shm'); - FS.mkdir('/dev/shm/tmp'); - },createSpecialDirectories:function () { - // create /proc/self/fd which allows /proc/self/fd/6 => readlink gives the name of the stream for fd 6 (see test_unistd_ttyname) - FS.mkdir('/proc'); - FS.mkdir('/proc/self'); - FS.mkdir('/proc/self/fd'); - FS.mount({ - mount: function() { - var node = FS.createNode('/proc/self', 'fd', 16384 | 511 /* 0777 */, 73); - node.node_ops = { - lookup: function(parent, name) { - var fd = +name; - var stream = FS.getStream(fd); - if (!stream) throw new FS.ErrnoError(9); - var ret = { - parent: null, - mount: { mountpoint: 'fake' }, - node_ops: { readlink: function() { return stream.path } } - }; - ret.parent = ret; // make it look like a simple root node - return ret; - } - }; - return node; - } - }, {}, '/proc/self/fd'); - },createStandardStreams:function () { - // TODO deprecate the old functionality of a single - // input / output callback and that utilizes FS.createDevice - // and instead require a unique set of stream ops - - // by default, we symlink the standard streams to the - // default tty devices. however, if the standard streams - // have been overwritten we create a unique device for - // them instead. - if (Module['stdin']) { - FS.createDevice('/dev', 'stdin', Module['stdin']); - } else { - FS.symlink('/dev/tty', '/dev/stdin'); - } - if (Module['stdout']) { - FS.createDevice('/dev', 'stdout', null, Module['stdout']); - } else { - FS.symlink('/dev/tty', '/dev/stdout'); - } - if (Module['stderr']) { - FS.createDevice('/dev', 'stderr', null, Module['stderr']); - } else { - FS.symlink('/dev/tty1', '/dev/stderr'); - } - - // open default streams for the stdin, stdout and stderr devices - var stdin = FS.open('/dev/stdin', 'r'); - var stdout = FS.open('/dev/stdout', 'w'); - var stderr = FS.open('/dev/stderr', 'w'); - assert(stdin.fd === 0, 'invalid handle for stdin (' + stdin.fd + ')'); - assert(stdout.fd === 1, 'invalid handle for stdout (' + stdout.fd + ')'); - assert(stderr.fd === 2, 'invalid handle for stderr (' + stderr.fd + ')'); - },ensureErrnoError:function () { - if (FS.ErrnoError) return; - FS.ErrnoError = function ErrnoError(errno, node) { - this.node = node; - this.setErrno = function(errno) { - this.errno = errno; - for (var key in ERRNO_CODES) { - if (ERRNO_CODES[key] === errno) { - this.code = key; - break; - } - } - }; - this.setErrno(errno); - this.message = ERRNO_MESSAGES[errno]; - // Node.js compatibility: assigning on this.stack fails on Node 4 (but fixed on Node 8) - if (this.stack) Object.defineProperty(this, "stack", { value: (new Error).stack, writable: true }); - if (this.stack) this.stack = demangleAll(this.stack); - }; - FS.ErrnoError.prototype = new Error(); - FS.ErrnoError.prototype.constructor = FS.ErrnoError; - // Some errors may happen quite a bit, to avoid overhead we reuse them (and suffer a lack of stack info) - [2].forEach(function(code) { - FS.genericErrors[code] = new FS.ErrnoError(code); - FS.genericErrors[code].stack = ''; - }); - },staticInit:function () { - FS.ensureErrnoError(); - - FS.nameTable = new Array(4096); - - FS.mount(MEMFS, {}, '/'); - - FS.createDefaultDirectories(); - FS.createDefaultDevices(); - FS.createSpecialDirectories(); - - FS.filesystems = { - 'MEMFS': MEMFS, - 'IDBFS': IDBFS, - 'NODEFS': NODEFS, - 'WORKERFS': WORKERFS, - }; - },init:function (input, output, error) { - assert(!FS.init.initialized, 'FS.init was previously called. If you want to initialize later with custom parameters, remove any earlier calls (note that one is automatically added to the generated code)'); - FS.init.initialized = true; - - FS.ensureErrnoError(); - - // Allow Module.stdin etc. to provide defaults, if none explicitly passed to us here - Module['stdin'] = input || Module['stdin']; - Module['stdout'] = output || Module['stdout']; - Module['stderr'] = error || Module['stderr']; - - FS.createStandardStreams(); - },quit:function () { - FS.init.initialized = false; - // force-flush all streams, so we get musl std streams printed out - var fflush = Module['_fflush']; - if (fflush) fflush(0); - // close all of our streams - for (var i = 0; i < FS.streams.length; i++) { - var stream = FS.streams[i]; - if (!stream) { - continue; - } - FS.close(stream); - } - },getMode:function (canRead, canWrite) { - var mode = 0; - if (canRead) mode |= 292 | 73; - if (canWrite) mode |= 146; - return mode; - },joinPath:function (parts, forceRelative) { - var path = PATH.join.apply(null, parts); - if (forceRelative && path[0] == '/') path = path.substr(1); - return path; - },absolutePath:function (relative, base) { - return PATH.resolve(base, relative); - },standardizePath:function (path) { - return PATH.normalize(path); - },findObject:function (path, dontResolveLastLink) { - var ret = FS.analyzePath(path, dontResolveLastLink); - if (ret.exists) { - return ret.object; - } else { - ___setErrNo(ret.error); - return null; - } - },analyzePath:function (path, dontResolveLastLink) { - // operate from within the context of the symlink's target - try { - var lookup = FS.lookupPath(path, { follow: !dontResolveLastLink }); - path = lookup.path; - } catch (e) { - } - var ret = { - isRoot: false, exists: false, error: 0, name: null, path: null, object: null, - parentExists: false, parentPath: null, parentObject: null - }; - try { - var lookup = FS.lookupPath(path, { parent: true }); - ret.parentExists = true; - ret.parentPath = lookup.path; - ret.parentObject = lookup.node; - ret.name = PATH.basename(path); - lookup = FS.lookupPath(path, { follow: !dontResolveLastLink }); - ret.exists = true; - ret.path = lookup.path; - ret.object = lookup.node; - ret.name = lookup.node.name; - ret.isRoot = lookup.path === '/'; - } catch (e) { - ret.error = e.errno; - }; - return ret; - },createFolder:function (parent, name, canRead, canWrite) { - var path = PATH.join2(typeof parent === 'string' ? parent : FS.getPath(parent), name); - var mode = FS.getMode(canRead, canWrite); - return FS.mkdir(path, mode); - },createPath:function (parent, path, canRead, canWrite) { - parent = typeof parent === 'string' ? parent : FS.getPath(parent); - var parts = path.split('/').reverse(); - while (parts.length) { - var part = parts.pop(); - if (!part) continue; - var current = PATH.join2(parent, part); - try { - FS.mkdir(current); - } catch (e) { - // ignore EEXIST - } - parent = current; - } - return current; - },createFile:function (parent, name, properties, canRead, canWrite) { - var path = PATH.join2(typeof parent === 'string' ? parent : FS.getPath(parent), name); - var mode = FS.getMode(canRead, canWrite); - return FS.create(path, mode); - },createDataFile:function (parent, name, data, canRead, canWrite, canOwn) { - var path = name ? PATH.join2(typeof parent === 'string' ? parent : FS.getPath(parent), name) : parent; - var mode = FS.getMode(canRead, canWrite); - var node = FS.create(path, mode); - if (data) { - if (typeof data === 'string') { - var arr = new Array(data.length); - for (var i = 0, len = data.length; i < len; ++i) arr[i] = data.charCodeAt(i); - data = arr; - } - // make sure we can write to the file - FS.chmod(node, mode | 146); - var stream = FS.open(node, 'w'); - FS.write(stream, data, 0, data.length, 0, canOwn); - FS.close(stream); - FS.chmod(node, mode); - } - return node; - },createDevice:function (parent, name, input, output) { - var path = PATH.join2(typeof parent === 'string' ? parent : FS.getPath(parent), name); - var mode = FS.getMode(!!input, !!output); - if (!FS.createDevice.major) FS.createDevice.major = 64; - var dev = FS.makedev(FS.createDevice.major++, 0); - // Create a fake device that a set of stream ops to emulate - // the old behavior. - FS.registerDevice(dev, { - open: function(stream) { - stream.seekable = false; - }, - close: function(stream) { - // flush any pending line data - if (output && output.buffer && output.buffer.length) { - output(10); - } - }, - read: function(stream, buffer, offset, length, pos /* ignored */) { - var bytesRead = 0; - for (var i = 0; i < length; i++) { - var result; - try { - result = input(); - } catch (e) { - throw new FS.ErrnoError(5); - } - if (result === undefined && bytesRead === 0) { - throw new FS.ErrnoError(11); - } - if (result === null || result === undefined) break; - bytesRead++; - buffer[offset+i] = result; - } - if (bytesRead) { - stream.node.timestamp = Date.now(); - } - return bytesRead; - }, - write: function(stream, buffer, offset, length, pos) { - for (var i = 0; i < length; i++) { - try { - output(buffer[offset+i]); - } catch (e) { - throw new FS.ErrnoError(5); - } - } - if (length) { - stream.node.timestamp = Date.now(); - } - return i; - } - }); - return FS.mkdev(path, mode, dev); - },createLink:function (parent, name, target, canRead, canWrite) { - var path = PATH.join2(typeof parent === 'string' ? parent : FS.getPath(parent), name); - return FS.symlink(target, path); - },forceLoadFile:function (obj) { - if (obj.isDevice || obj.isFolder || obj.link || obj.contents) return true; - var success = true; - if (typeof XMLHttpRequest !== 'undefined') { - throw new Error("Lazy loading should have been performed (contents set) in createLazyFile, but it was not. Lazy loading only works in web workers. Use --embed-file or --preload-file in emcc on the main thread."); - } else if (Module['read']) { - // Command-line. - try { - // WARNING: Can't read binary files in V8's d8 or tracemonkey's js, as - // read() will try to parse UTF8. - obj.contents = intArrayFromString(Module['read'](obj.url), true); - obj.usedBytes = obj.contents.length; - } catch (e) { - success = false; - } - } else { - throw new Error('Cannot load without read() or XMLHttpRequest.'); - } - if (!success) ___setErrNo(5); - return success; - },createLazyFile:function (parent, name, url, canRead, canWrite) { - // Lazy chunked Uint8Array (implements get and length from Uint8Array). Actual getting is abstracted away for eventual reuse. - function LazyUint8Array() { - this.lengthKnown = false; - this.chunks = []; // Loaded chunks. Index is the chunk number - } - LazyUint8Array.prototype.get = function LazyUint8Array_get(idx) { - if (idx > this.length-1 || idx < 0) { - return undefined; - } - var chunkOffset = idx % this.chunkSize; - var chunkNum = (idx / this.chunkSize)|0; - return this.getter(chunkNum)[chunkOffset]; - } - LazyUint8Array.prototype.setDataGetter = function LazyUint8Array_setDataGetter(getter) { - this.getter = getter; - } - LazyUint8Array.prototype.cacheLength = function LazyUint8Array_cacheLength() { - // Find length - var xhr = new XMLHttpRequest(); - xhr.open('HEAD', url, false); - xhr.send(null); - if (!(xhr.status >= 200 && xhr.status < 300 || xhr.status === 304)) throw new Error("Couldn't load " + url + ". Status: " + xhr.status); - var datalength = Number(xhr.getResponseHeader("Content-length")); - var header; - var hasByteServing = (header = xhr.getResponseHeader("Accept-Ranges")) && header === "bytes"; - var usesGzip = (header = xhr.getResponseHeader("Content-Encoding")) && header === "gzip"; - - var chunkSize = 1024*1024; // Chunk size in bytes - - if (!hasByteServing) chunkSize = datalength; - - // Function to get a range from the remote URL. - var doXHR = (function(from, to) { - if (from > to) throw new Error("invalid range (" + from + ", " + to + ") or no bytes requested!"); - if (to > datalength-1) throw new Error("only " + datalength + " bytes available! programmer error!"); - - // TODO: Use mozResponseArrayBuffer, responseStream, etc. if available. - var xhr = new XMLHttpRequest(); - xhr.open('GET', url, false); - if (datalength !== chunkSize) xhr.setRequestHeader("Range", "bytes=" + from + "-" + to); - - // Some hints to the browser that we want binary data. - if (typeof Uint8Array != 'undefined') xhr.responseType = 'arraybuffer'; - if (xhr.overrideMimeType) { - xhr.overrideMimeType('text/plain; charset=x-user-defined'); - } - - xhr.send(null); - if (!(xhr.status >= 200 && xhr.status < 300 || xhr.status === 304)) throw new Error("Couldn't load " + url + ". Status: " + xhr.status); - if (xhr.response !== undefined) { - return new Uint8Array(xhr.response || []); - } else { - return intArrayFromString(xhr.responseText || '', true); - } - }); - var lazyArray = this; - lazyArray.setDataGetter(function(chunkNum) { - var start = chunkNum * chunkSize; - var end = (chunkNum+1) * chunkSize - 1; // including this byte - end = Math.min(end, datalength-1); // if datalength-1 is selected, this is the last block - if (typeof(lazyArray.chunks[chunkNum]) === "undefined") { - lazyArray.chunks[chunkNum] = doXHR(start, end); - } - if (typeof(lazyArray.chunks[chunkNum]) === "undefined") throw new Error("doXHR failed!"); - return lazyArray.chunks[chunkNum]; - }); - - if (usesGzip || !datalength) { - // if the server uses gzip or doesn't supply the length, we have to download the whole file to get the (uncompressed) length - chunkSize = datalength = 1; // this will force getter(0)/doXHR do download the whole file - datalength = this.getter(0).length; - chunkSize = datalength; - console.log("LazyFiles on gzip forces download of the whole file when length is accessed"); - } - - this._length = datalength; - this._chunkSize = chunkSize; - this.lengthKnown = true; - } - if (typeof XMLHttpRequest !== 'undefined') { - if (!ENVIRONMENT_IS_WORKER) throw 'Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc'; - var lazyArray = new LazyUint8Array(); - Object.defineProperties(lazyArray, { - length: { - get: function() { - if(!this.lengthKnown) { - this.cacheLength(); - } - return this._length; - } - }, - chunkSize: { - get: function() { - if(!this.lengthKnown) { - this.cacheLength(); - } - return this._chunkSize; - } - } - }); - - var properties = { isDevice: false, contents: lazyArray }; - } else { - var properties = { isDevice: false, url: url }; - } - - var node = FS.createFile(parent, name, properties, canRead, canWrite); - // This is a total hack, but I want to get this lazy file code out of the - // core of MEMFS. If we want to keep this lazy file concept I feel it should - // be its own thin LAZYFS proxying calls to MEMFS. - if (properties.contents) { - node.contents = properties.contents; - } else if (properties.url) { - node.contents = null; - node.url = properties.url; - } - // Add a function that defers querying the file size until it is asked the first time. - Object.defineProperties(node, { - usedBytes: { - get: function() { return this.contents.length; } - } - }); - // override each stream op with one that tries to force load the lazy file first - var stream_ops = {}; - var keys = Object.keys(node.stream_ops); - keys.forEach(function(key) { - var fn = node.stream_ops[key]; - stream_ops[key] = function forceLoadLazyFile() { - if (!FS.forceLoadFile(node)) { - throw new FS.ErrnoError(5); - } - return fn.apply(null, arguments); - }; - }); - // use a custom read function - stream_ops.read = function stream_ops_read(stream, buffer, offset, length, position) { - if (!FS.forceLoadFile(node)) { - throw new FS.ErrnoError(5); - } - var contents = stream.node.contents; - if (position >= contents.length) - return 0; - var size = Math.min(contents.length - position, length); - assert(size >= 0); - if (contents.slice) { // normal array - for (var i = 0; i < size; i++) { - buffer[offset + i] = contents[position + i]; - } - } else { - for (var i = 0; i < size; i++) { // LazyUint8Array from sync binary XHR - buffer[offset + i] = contents.get(position + i); - } - } - return size; - }; - node.stream_ops = stream_ops; - return node; - },createPreloadedFile:function (parent, name, url, canRead, canWrite, onload, onerror, dontCreateFile, canOwn, preFinish) { - Browser.init(); // XXX perhaps this method should move onto Browser? - // TODO we should allow people to just pass in a complete filename instead - // of parent and name being that we just join them anyways - var fullname = name ? PATH.resolve(PATH.join2(parent, name)) : parent; - var dep = getUniqueRunDependency('cp ' + fullname); // might have several active requests for the same fullname - function processData(byteArray) { - function finish(byteArray) { - if (preFinish) preFinish(); - if (!dontCreateFile) { - FS.createDataFile(parent, name, byteArray, canRead, canWrite, canOwn); - } - if (onload) onload(); - removeRunDependency(dep); - } - var handled = false; - Module['preloadPlugins'].forEach(function(plugin) { - if (handled) return; - if (plugin['canHandle'](fullname)) { - plugin['handle'](byteArray, fullname, finish, function() { - if (onerror) onerror(); - removeRunDependency(dep); - }); - handled = true; - } - }); - if (!handled) finish(byteArray); - } - addRunDependency(dep); - if (typeof url == 'string') { - Browser.asyncLoad(url, function(byteArray) { - processData(byteArray); - }, onerror); - } else { - processData(url); - } - },indexedDB:function () { - return window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB; - },DB_NAME:function () { - return 'EM_FS_' + window.location.pathname; - },DB_VERSION:20,DB_STORE_NAME:"FILE_DATA",saveFilesToDB:function (paths, onload, onerror) { - onload = onload || function(){}; - onerror = onerror || function(){}; - var indexedDB = FS.indexedDB(); - try { - var openRequest = indexedDB.open(FS.DB_NAME(), FS.DB_VERSION); - } catch (e) { - return onerror(e); - } - openRequest.onupgradeneeded = function openRequest_onupgradeneeded() { - console.log('creating db'); - var db = openRequest.result; - db.createObjectStore(FS.DB_STORE_NAME); - }; - openRequest.onsuccess = function openRequest_onsuccess() { - var db = openRequest.result; - var transaction = db.transaction([FS.DB_STORE_NAME], 'readwrite'); - var files = transaction.objectStore(FS.DB_STORE_NAME); - var ok = 0, fail = 0, total = paths.length; - function finish() { - if (fail == 0) onload(); else onerror(); - } - paths.forEach(function(path) { - var putRequest = files.put(FS.analyzePath(path).object.contents, path); - putRequest.onsuccess = function putRequest_onsuccess() { ok++; if (ok + fail == total) finish() }; - putRequest.onerror = function putRequest_onerror() { fail++; if (ok + fail == total) finish() }; - }); - transaction.onerror = onerror; - }; - openRequest.onerror = onerror; - },loadFilesFromDB:function (paths, onload, onerror) { - onload = onload || function(){}; - onerror = onerror || function(){}; - var indexedDB = FS.indexedDB(); - try { - var openRequest = indexedDB.open(FS.DB_NAME(), FS.DB_VERSION); - } catch (e) { - return onerror(e); - } - openRequest.onupgradeneeded = onerror; // no database to load from - openRequest.onsuccess = function openRequest_onsuccess() { - var db = openRequest.result; - try { - var transaction = db.transaction([FS.DB_STORE_NAME], 'readonly'); - } catch(e) { - onerror(e); - return; - } - var files = transaction.objectStore(FS.DB_STORE_NAME); - var ok = 0, fail = 0, total = paths.length; - function finish() { - if (fail == 0) onload(); else onerror(); - } - paths.forEach(function(path) { - var getRequest = files.get(path); - getRequest.onsuccess = function getRequest_onsuccess() { - if (FS.analyzePath(path).exists) { - FS.unlink(path); - } - FS.createDataFile(PATH.dirname(path), PATH.basename(path), getRequest.result, true, true, true); - ok++; - if (ok + fail == total) finish(); - }; - getRequest.onerror = function getRequest_onerror() { fail++; if (ok + fail == total) finish() }; - }); - transaction.onerror = onerror; - }; - openRequest.onerror = onerror; - }};var SOCKFS={mount:function (mount) { - // If Module['websocket'] has already been defined (e.g. for configuring - // the subprotocol/url) use that, if not initialise it to a new object. - Module['websocket'] = (Module['websocket'] && - ('object' === typeof Module['websocket'])) ? Module['websocket'] : {}; - - // Add the Event registration mechanism to the exported websocket configuration - // object so we can register network callbacks from native JavaScript too. - // For more documentation see system/include/emscripten/emscripten.h - Module['websocket']._callbacks = {}; - Module['websocket']['on'] = function(event, callback) { - if ('function' === typeof callback) { - this._callbacks[event] = callback; - } - return this; - }; - - Module['websocket'].emit = function(event, param) { - if ('function' === typeof this._callbacks[event]) { - this._callbacks[event].call(this, param); - } - }; - - // If debug is enabled register simple default logging callbacks for each Event. - - return FS.createNode(null, '/', 16384 | 511 /* 0777 */, 0); - },createSocket:function (family, type, protocol) { - var streaming = type == 1; - if (protocol) { - assert(streaming == (protocol == 6)); // if SOCK_STREAM, must be tcp - } - - // create our internal socket structure - var sock = { - family: family, - type: type, - protocol: protocol, - server: null, - error: null, // Used in getsockopt for SOL_SOCKET/SO_ERROR test - peers: {}, - pending: [], - recv_queue: [], - sock_ops: SOCKFS.websocket_sock_ops - }; - - // create the filesystem node to store the socket structure - var name = SOCKFS.nextname(); - var node = FS.createNode(SOCKFS.root, name, 49152, 0); - node.sock = sock; - - // and the wrapping stream that enables library functions such - // as read and write to indirectly interact with the socket - var stream = FS.createStream({ - path: name, - node: node, - flags: FS.modeStringToFlags('r+'), - seekable: false, - stream_ops: SOCKFS.stream_ops - }); - - // map the new stream to the socket structure (sockets have a 1:1 - // relationship with a stream) - sock.stream = stream; - - return sock; - },getSocket:function (fd) { - var stream = FS.getStream(fd); - if (!stream || !FS.isSocket(stream.node.mode)) { - return null; - } - return stream.node.sock; - },stream_ops:{poll:function (stream) { - var sock = stream.node.sock; - return sock.sock_ops.poll(sock); - },ioctl:function (stream, request, varargs) { - var sock = stream.node.sock; - return sock.sock_ops.ioctl(sock, request, varargs); - },read:function (stream, buffer, offset, length, position /* ignored */) { - var sock = stream.node.sock; - var msg = sock.sock_ops.recvmsg(sock, length); - if (!msg) { - // socket is closed - return 0; - } - buffer.set(msg.buffer, offset); - return msg.buffer.length; - },write:function (stream, buffer, offset, length, position /* ignored */) { - var sock = stream.node.sock; - return sock.sock_ops.sendmsg(sock, buffer, offset, length); - },close:function (stream) { - var sock = stream.node.sock; - sock.sock_ops.close(sock); - }},nextname:function () { - if (!SOCKFS.nextname.current) { - SOCKFS.nextname.current = 0; - } - return 'socket[' + (SOCKFS.nextname.current++) + ']'; - },websocket_sock_ops:{createPeer:function (sock, addr, port) { - var ws; - - if (typeof addr === 'object') { - ws = addr; - addr = null; - port = null; - } - - if (ws) { - // for sockets that've already connected (e.g. we're the server) - // we can inspect the _socket property for the address - if (ws._socket) { - addr = ws._socket.remoteAddress; - port = ws._socket.remotePort; - } - // if we're just now initializing a connection to the remote, - // inspect the url property - else { - var result = /ws[s]?:\/\/([^:]+):(\d+)/.exec(ws.url); - if (!result) { - throw new Error('WebSocket URL must be in the format ws(s)://address:port'); - } - addr = result[1]; - port = parseInt(result[2], 10); - } - } else { - // create the actual websocket object and connect - try { - // runtimeConfig gets set to true if WebSocket runtime configuration is available. - var runtimeConfig = (Module['websocket'] && ('object' === typeof Module['websocket'])); - - // The default value is 'ws://' the replace is needed because the compiler replaces '//' comments with '#' - // comments without checking context, so we'd end up with ws:#, the replace swaps the '#' for '//' again. - var url = 'ws:#'.replace('#', '//'); - - if (runtimeConfig) { - if ('string' === typeof Module['websocket']['url']) { - url = Module['websocket']['url']; // Fetch runtime WebSocket URL config. - } - } - - if (url === 'ws://' || url === 'wss://') { // Is the supplied URL config just a prefix, if so complete it. - var parts = addr.split('/'); - url = url + parts[0] + ":" + port + "/" + parts.slice(1).join('/'); - } - - // Make the WebSocket subprotocol (Sec-WebSocket-Protocol) default to binary if no configuration is set. - var subProtocols = 'binary'; // The default value is 'binary' - - if (runtimeConfig) { - if ('string' === typeof Module['websocket']['subprotocol']) { - subProtocols = Module['websocket']['subprotocol']; // Fetch runtime WebSocket subprotocol config. - } - } - - // The regex trims the string (removes spaces at the beginning and end, then splits the string by - // , into an Array. Whitespace removal is important for Websockify and ws. - subProtocols = subProtocols.replace(/^ +| +$/g,"").split(/ *, */); - - // The node ws library API for specifying optional subprotocol is slightly different than the browser's. - var opts = ENVIRONMENT_IS_NODE ? {'protocol': subProtocols.toString()} : subProtocols; - - // some webservers (azure) does not support subprotocol header - if (runtimeConfig && null === Module['websocket']['subprotocol']) { - subProtocols = 'null'; - opts = undefined; - } - - // If node we use the ws library. - var WebSocketConstructor; - if (ENVIRONMENT_IS_NODE) { - WebSocketConstructor = require('ws'); - } else - if (ENVIRONMENT_IS_WEB) { - WebSocketConstructor = window['WebSocket']; - } else - { - WebSocketConstructor = WebSocket; - } - ws = new WebSocketConstructor(url, opts); - ws.binaryType = 'arraybuffer'; - } catch (e) { - throw new FS.ErrnoError(ERRNO_CODES.EHOSTUNREACH); - } - } - - - var peer = { - addr: addr, - port: port, - socket: ws, - dgram_send_queue: [] - }; - - SOCKFS.websocket_sock_ops.addPeer(sock, peer); - SOCKFS.websocket_sock_ops.handlePeerEvents(sock, peer); - - // if this is a bound dgram socket, send the port number first to allow - // us to override the ephemeral port reported to us by remotePort on the - // remote end. - if (sock.type === 2 && typeof sock.sport !== 'undefined') { - peer.dgram_send_queue.push(new Uint8Array([ - 255, 255, 255, 255, - 'p'.charCodeAt(0), 'o'.charCodeAt(0), 'r'.charCodeAt(0), 't'.charCodeAt(0), - ((sock.sport & 0xff00) >> 8) , (sock.sport & 0xff) - ])); - } - - return peer; - },getPeer:function (sock, addr, port) { - return sock.peers[addr + ':' + port]; - },addPeer:function (sock, peer) { - sock.peers[peer.addr + ':' + peer.port] = peer; - },removePeer:function (sock, peer) { - delete sock.peers[peer.addr + ':' + peer.port]; - },handlePeerEvents:function (sock, peer) { - var first = true; - - var handleOpen = function () { - - Module['websocket'].emit('open', sock.stream.fd); - - try { - var queued = peer.dgram_send_queue.shift(); - while (queued) { - peer.socket.send(queued); - queued = peer.dgram_send_queue.shift(); - } - } catch (e) { - // not much we can do here in the way of proper error handling as we've already - // lied and said this data was sent. shut it down. - peer.socket.close(); - } - }; - - function handleMessage(data) { - assert(typeof data !== 'string' && data.byteLength !== undefined); // must receive an ArrayBuffer - - // An empty ArrayBuffer will emit a pseudo disconnect event - // as recv/recvmsg will return zero which indicates that a socket - // has performed a shutdown although the connection has not been disconnected yet. - if (data.byteLength == 0) { - return; - } - data = new Uint8Array(data); // make a typed array view on the array buffer - - - // if this is the port message, override the peer's port with it - var wasfirst = first; - first = false; - if (wasfirst && - data.length === 10 && - data[0] === 255 && data[1] === 255 && data[2] === 255 && data[3] === 255 && - data[4] === 'p'.charCodeAt(0) && data[5] === 'o'.charCodeAt(0) && data[6] === 'r'.charCodeAt(0) && data[7] === 't'.charCodeAt(0)) { - // update the peer's port and it's key in the peer map - var newport = ((data[8] << 8) | data[9]); - SOCKFS.websocket_sock_ops.removePeer(sock, peer); - peer.port = newport; - SOCKFS.websocket_sock_ops.addPeer(sock, peer); - return; - } - - sock.recv_queue.push({ addr: peer.addr, port: peer.port, data: data }); - Module['websocket'].emit('message', sock.stream.fd); - }; - - if (ENVIRONMENT_IS_NODE) { - peer.socket.on('open', handleOpen); - peer.socket.on('message', function(data, flags) { - if (!flags.binary) { - return; - } - handleMessage((new Uint8Array(data)).buffer); // copy from node Buffer -> ArrayBuffer - }); - peer.socket.on('close', function() { - Module['websocket'].emit('close', sock.stream.fd); - }); - peer.socket.on('error', function(error) { - // Although the ws library may pass errors that may be more descriptive than - // ECONNREFUSED they are not necessarily the expected error code e.g. - // ENOTFOUND on getaddrinfo seems to be node.js specific, so using ECONNREFUSED - // is still probably the most useful thing to do. - sock.error = ERRNO_CODES.ECONNREFUSED; // Used in getsockopt for SOL_SOCKET/SO_ERROR test. - Module['websocket'].emit('error', [sock.stream.fd, sock.error, 'ECONNREFUSED: Connection refused']); - // don't throw - }); - } else { - peer.socket.onopen = handleOpen; - peer.socket.onclose = function() { - Module['websocket'].emit('close', sock.stream.fd); - }; - peer.socket.onmessage = function peer_socket_onmessage(event) { - handleMessage(event.data); - }; - peer.socket.onerror = function(error) { - // The WebSocket spec only allows a 'simple event' to be thrown on error, - // so we only really know as much as ECONNREFUSED. - sock.error = ERRNO_CODES.ECONNREFUSED; // Used in getsockopt for SOL_SOCKET/SO_ERROR test. - Module['websocket'].emit('error', [sock.stream.fd, sock.error, 'ECONNREFUSED: Connection refused']); - }; - } - },poll:function (sock) { - if (sock.type === 1 && sock.server) { - // listen sockets should only say they're available for reading - // if there are pending clients. - return sock.pending.length ? (64 | 1) : 0; - } - - var mask = 0; - var dest = sock.type === 1 ? // we only care about the socket state for connection-based sockets - SOCKFS.websocket_sock_ops.getPeer(sock, sock.daddr, sock.dport) : - null; - - if (sock.recv_queue.length || - !dest || // connection-less sockets are always ready to read - (dest && dest.socket.readyState === dest.socket.CLOSING) || - (dest && dest.socket.readyState === dest.socket.CLOSED)) { // let recv return 0 once closed - mask |= (64 | 1); - } - - if (!dest || // connection-less sockets are always ready to write - (dest && dest.socket.readyState === dest.socket.OPEN)) { - mask |= 4; - } - - if ((dest && dest.socket.readyState === dest.socket.CLOSING) || - (dest && dest.socket.readyState === dest.socket.CLOSED)) { - mask |= 16; - } - - return mask; - },ioctl:function (sock, request, arg) { - switch (request) { - case 21531: - var bytes = 0; - if (sock.recv_queue.length) { - bytes = sock.recv_queue[0].data.length; - } - HEAP32[((arg)>>2)]=bytes; - return 0; - default: - return ERRNO_CODES.EINVAL; - } - },close:function (sock) { - // if we've spawned a listen server, close it - if (sock.server) { - try { - sock.server.close(); - } catch (e) { - } - sock.server = null; - } - // close any peer connections - var peers = Object.keys(sock.peers); - for (var i = 0; i < peers.length; i++) { - var peer = sock.peers[peers[i]]; - try { - peer.socket.close(); - } catch (e) { - } - SOCKFS.websocket_sock_ops.removePeer(sock, peer); - } - return 0; - },bind:function (sock, addr, port) { - if (typeof sock.saddr !== 'undefined' || typeof sock.sport !== 'undefined') { - throw new FS.ErrnoError(ERRNO_CODES.EINVAL); // already bound - } - sock.saddr = addr; - sock.sport = port; - // in order to emulate dgram sockets, we need to launch a listen server when - // binding on a connection-less socket - // note: this is only required on the server side - if (sock.type === 2) { - // close the existing server if it exists - if (sock.server) { - sock.server.close(); - sock.server = null; - } - // swallow error operation not supported error that occurs when binding in the - // browser where this isn't supported - try { - sock.sock_ops.listen(sock, 0); - } catch (e) { - if (!(e instanceof FS.ErrnoError)) throw e; - if (e.errno !== ERRNO_CODES.EOPNOTSUPP) throw e; - } - } - },connect:function (sock, addr, port) { - if (sock.server) { - throw new FS.ErrnoError(ERRNO_CODES.EOPNOTSUPP); - } - - // TODO autobind - // if (!sock.addr && sock.type == 2) { - // } - - // early out if we're already connected / in the middle of connecting - if (typeof sock.daddr !== 'undefined' && typeof sock.dport !== 'undefined') { - var dest = SOCKFS.websocket_sock_ops.getPeer(sock, sock.daddr, sock.dport); - if (dest) { - if (dest.socket.readyState === dest.socket.CONNECTING) { - throw new FS.ErrnoError(ERRNO_CODES.EALREADY); - } else { - throw new FS.ErrnoError(ERRNO_CODES.EISCONN); - } - } - } - - // add the socket to our peer list and set our - // destination address / port to match - var peer = SOCKFS.websocket_sock_ops.createPeer(sock, addr, port); - sock.daddr = peer.addr; - sock.dport = peer.port; - - // always "fail" in non-blocking mode - throw new FS.ErrnoError(ERRNO_CODES.EINPROGRESS); - },listen:function (sock, backlog) { - if (!ENVIRONMENT_IS_NODE) { - throw new FS.ErrnoError(ERRNO_CODES.EOPNOTSUPP); - } - if (sock.server) { - throw new FS.ErrnoError(ERRNO_CODES.EINVAL); // already listening - } - var WebSocketServer = require('ws').Server; - var host = sock.saddr; - sock.server = new WebSocketServer({ - host: host, - port: sock.sport - // TODO support backlog - }); - Module['websocket'].emit('listen', sock.stream.fd); // Send Event with listen fd. - - sock.server.on('connection', function(ws) { - if (sock.type === 1) { - var newsock = SOCKFS.createSocket(sock.family, sock.type, sock.protocol); - - // create a peer on the new socket - var peer = SOCKFS.websocket_sock_ops.createPeer(newsock, ws); - newsock.daddr = peer.addr; - newsock.dport = peer.port; - - // push to queue for accept to pick up - sock.pending.push(newsock); - Module['websocket'].emit('connection', newsock.stream.fd); - } else { - // create a peer on the listen socket so calling sendto - // with the listen socket and an address will resolve - // to the correct client - SOCKFS.websocket_sock_ops.createPeer(sock, ws); - Module['websocket'].emit('connection', sock.stream.fd); - } - }); - sock.server.on('closed', function() { - Module['websocket'].emit('close', sock.stream.fd); - sock.server = null; - }); - sock.server.on('error', function(error) { - // Although the ws library may pass errors that may be more descriptive than - // ECONNREFUSED they are not necessarily the expected error code e.g. - // ENOTFOUND on getaddrinfo seems to be node.js specific, so using EHOSTUNREACH - // is still probably the most useful thing to do. This error shouldn't - // occur in a well written app as errors should get trapped in the compiled - // app's own getaddrinfo call. - sock.error = ERRNO_CODES.EHOSTUNREACH; // Used in getsockopt for SOL_SOCKET/SO_ERROR test. - Module['websocket'].emit('error', [sock.stream.fd, sock.error, 'EHOSTUNREACH: Host is unreachable']); - // don't throw - }); - },accept:function (listensock) { - if (!listensock.server) { - throw new FS.ErrnoError(ERRNO_CODES.EINVAL); - } - var newsock = listensock.pending.shift(); - newsock.stream.flags = listensock.stream.flags; - return newsock; - },getname:function (sock, peer) { - var addr, port; - if (peer) { - if (sock.daddr === undefined || sock.dport === undefined) { - throw new FS.ErrnoError(ERRNO_CODES.ENOTCONN); - } - addr = sock.daddr; - port = sock.dport; - } else { - // TODO saddr and sport will be set for bind()'d UDP sockets, but what - // should we be returning for TCP sockets that've been connect()'d? - addr = sock.saddr || 0; - port = sock.sport || 0; - } - return { addr: addr, port: port }; - },sendmsg:function (sock, buffer, offset, length, addr, port) { - if (sock.type === 2) { - // connection-less sockets will honor the message address, - // and otherwise fall back to the bound destination address - if (addr === undefined || port === undefined) { - addr = sock.daddr; - port = sock.dport; - } - // if there was no address to fall back to, error out - if (addr === undefined || port === undefined) { - throw new FS.ErrnoError(ERRNO_CODES.EDESTADDRREQ); - } - } else { - // connection-based sockets will only use the bound - addr = sock.daddr; - port = sock.dport; - } - - // find the peer for the destination address - var dest = SOCKFS.websocket_sock_ops.getPeer(sock, addr, port); - - // early out if not connected with a connection-based socket - if (sock.type === 1) { - if (!dest || dest.socket.readyState === dest.socket.CLOSING || dest.socket.readyState === dest.socket.CLOSED) { - throw new FS.ErrnoError(ERRNO_CODES.ENOTCONN); - } else if (dest.socket.readyState === dest.socket.CONNECTING) { - throw new FS.ErrnoError(ERRNO_CODES.EAGAIN); - } - } - - // create a copy of the incoming data to send, as the WebSocket API - // doesn't work entirely with an ArrayBufferView, it'll just send - // the entire underlying buffer - if (ArrayBuffer.isView(buffer)) { - offset += buffer.byteOffset; - buffer = buffer.buffer; - } - - var data; - data = buffer.slice(offset, offset + length); - - // if we're emulating a connection-less dgram socket and don't have - // a cached connection, queue the buffer to send upon connect and - // lie, saying the data was sent now. - if (sock.type === 2) { - if (!dest || dest.socket.readyState !== dest.socket.OPEN) { - // if we're not connected, open a new connection - if (!dest || dest.socket.readyState === dest.socket.CLOSING || dest.socket.readyState === dest.socket.CLOSED) { - dest = SOCKFS.websocket_sock_ops.createPeer(sock, addr, port); - } - dest.dgram_send_queue.push(data); - return length; - } - } - - try { - // send the actual data - dest.socket.send(data); - return length; - } catch (e) { - throw new FS.ErrnoError(ERRNO_CODES.EINVAL); - } - },recvmsg:function (sock, length) { - // http://pubs.opengroup.org/onlinepubs/7908799/xns/recvmsg.html - if (sock.type === 1 && sock.server) { - // tcp servers should not be recv()'ing on the listen socket - throw new FS.ErrnoError(ERRNO_CODES.ENOTCONN); - } - - var queued = sock.recv_queue.shift(); - if (!queued) { - if (sock.type === 1) { - var dest = SOCKFS.websocket_sock_ops.getPeer(sock, sock.daddr, sock.dport); - - if (!dest) { - // if we have a destination address but are not connected, error out - throw new FS.ErrnoError(ERRNO_CODES.ENOTCONN); - } - else if (dest.socket.readyState === dest.socket.CLOSING || dest.socket.readyState === dest.socket.CLOSED) { - // return null if the socket has closed - return null; - } - else { - // else, our socket is in a valid state but truly has nothing available - throw new FS.ErrnoError(ERRNO_CODES.EAGAIN); - } - } else { - throw new FS.ErrnoError(ERRNO_CODES.EAGAIN); - } - } - - // queued.data will be an ArrayBuffer if it's unadulterated, but if it's - // requeued TCP data it'll be an ArrayBufferView - var queuedLength = queued.data.byteLength || queued.data.length; - var queuedOffset = queued.data.byteOffset || 0; - var queuedBuffer = queued.data.buffer || queued.data; - var bytesRead = Math.min(length, queuedLength); - var res = { - buffer: new Uint8Array(queuedBuffer, queuedOffset, bytesRead), - addr: queued.addr, - port: queued.port - }; - - - // push back any unread data for TCP connections - if (sock.type === 1 && bytesRead < queuedLength) { - var bytesRemaining = queuedLength - bytesRead; - queued.data = new Uint8Array(queuedBuffer, queuedOffset + bytesRead, bytesRemaining); - sock.recv_queue.unshift(queued); - } - - return res; - }}}; - - - function __inet_pton4_raw(str) { - var b = str.split('.'); - for (var i = 0; i < 4; i++) { - var tmp = Number(b[i]); - if (isNaN(tmp)) return null; - b[i] = tmp; - } - return (b[0] | (b[1] << 8) | (b[2] << 16) | (b[3] << 24)) >>> 0; - } - - - function _htons() { - err('missing function: htons'); abort(-1); - }function __inet_pton6_raw(str) { - var words; - var w, offset, z, i; - /* http://home.deds.nl/~aeron/regex/ */ - var valid6regx = /^((?=.*::)(?!.*::.+::)(::)?([\dA-F]{1,4}:(:|\b)|){5}|([\dA-F]{1,4}:){6})((([\dA-F]{1,4}((?!\3)::|:\b|$))|(?!\2\3)){2}|(((2[0-4]|1\d|[1-9])?\d|25[0-5])\.?\b){4})$/i - var parts = []; - if (!valid6regx.test(str)) { - return null; - } - if (str === "::") { - return [0, 0, 0, 0, 0, 0, 0, 0]; - } - // Z placeholder to keep track of zeros when splitting the string on ":" - if (str.indexOf("::") === 0) { - str = str.replace("::", "Z:"); // leading zeros case - } else { - str = str.replace("::", ":Z:"); - } - - if (str.indexOf(".") > 0) { - // parse IPv4 embedded stress - str = str.replace(new RegExp('[.]', 'g'), ":"); - words = str.split(":"); - words[words.length-4] = parseInt(words[words.length-4]) + parseInt(words[words.length-3])*256; - words[words.length-3] = parseInt(words[words.length-2]) + parseInt(words[words.length-1])*256; - words = words.slice(0, words.length-2); - } else { - words = str.split(":"); - } - - offset = 0; z = 0; - for (w=0; w < words.length; w++) { - if (typeof words[w] === 'string') { - if (words[w] === 'Z') { - // compressed zeros - write appropriate number of zero words - for (z = 0; z < (8 - words.length+1); z++) { - parts[w+z] = 0; - } - offset = z-1; - } else { - // parse hex to field to 16-bit value and write it in network byte-order - parts[w+offset] = _htons(parseInt(words[w],16)); - } - } else { - // parsed IPv4 words - parts[w+offset] = words[w]; - } - } - return [ - (parts[1] << 16) | parts[0], - (parts[3] << 16) | parts[2], - (parts[5] << 16) | parts[4], - (parts[7] << 16) | parts[6] - ]; - }var DNS={address_map:{id:1,addrs:{},names:{}},lookup_name:function (name) { - // If the name is already a valid ipv4 / ipv6 address, don't generate a fake one. - var res = __inet_pton4_raw(name); - if (res !== null) { - return name; - } - res = __inet_pton6_raw(name); - if (res !== null) { - return name; - } - - // See if this name is already mapped. - var addr; - - if (DNS.address_map.addrs[name]) { - addr = DNS.address_map.addrs[name]; - } else { - var id = DNS.address_map.id++; - assert(id < 65535, 'exceeded max address mappings of 65535'); - - addr = '172.29.' + (id & 0xff) + '.' + (id & 0xff00); - - DNS.address_map.names[addr] = name; - DNS.address_map.addrs[name] = addr; - } - - return addr; - },lookup_addr:function (addr) { - if (DNS.address_map.names[addr]) { - return DNS.address_map.names[addr]; - } - - return null; - }}; - - - var Sockets={BUFFER_SIZE:10240,MAX_BUFFER_SIZE:10485760,nextFd:1,fds:{},nextport:1,maxport:65535,peer:null,connections:{},portmap:{},localAddr:4261412874,addrPool:[33554442,50331658,67108874,83886090,100663306,117440522,134217738,150994954,167772170,184549386,201326602,218103818,234881034]}; - - function __inet_ntop4_raw(addr) { - return (addr & 0xff) + '.' + ((addr >> 8) & 0xff) + '.' + ((addr >> 16) & 0xff) + '.' + ((addr >> 24) & 0xff) - } - - function __inet_ntop6_raw(ints) { - // ref: http://www.ietf.org/rfc/rfc2373.txt - section 2.5.4 - // Format for IPv4 compatible and mapped 128-bit IPv6 Addresses - // 128-bits are split into eight 16-bit words - // stored in network byte order (big-endian) - // | 80 bits | 16 | 32 bits | - // +-----------------------------------------------------------------+ - // | 10 bytes | 2 | 4 bytes | - // +--------------------------------------+--------------------------+ - // + 5 words | 1 | 2 words | - // +--------------------------------------+--------------------------+ - // |0000..............................0000|0000| IPv4 ADDRESS | (compatible) - // +--------------------------------------+----+---------------------+ - // |0000..............................0000|FFFF| IPv4 ADDRESS | (mapped) - // +--------------------------------------+----+---------------------+ - var str = ""; - var word = 0; - var longest = 0; - var lastzero = 0; - var zstart = 0; - var len = 0; - var i = 0; - var parts = [ - ints[0] & 0xffff, - (ints[0] >> 16), - ints[1] & 0xffff, - (ints[1] >> 16), - ints[2] & 0xffff, - (ints[2] >> 16), - ints[3] & 0xffff, - (ints[3] >> 16) - ]; - - // Handle IPv4-compatible, IPv4-mapped, loopback and any/unspecified addresses - - var hasipv4 = true; - var v4part = ""; - // check if the 10 high-order bytes are all zeros (first 5 words) - for (i = 0; i < 5; i++) { - if (parts[i] !== 0) { hasipv4 = false; break; } - } - - if (hasipv4) { - // low-order 32-bits store an IPv4 address (bytes 13 to 16) (last 2 words) - v4part = __inet_ntop4_raw(parts[6] | (parts[7] << 16)); - // IPv4-mapped IPv6 address if 16-bit value (bytes 11 and 12) == 0xFFFF (6th word) - if (parts[5] === -1) { - str = "::ffff:"; - str += v4part; - return str; - } - // IPv4-compatible IPv6 address if 16-bit value (bytes 11 and 12) == 0x0000 (6th word) - if (parts[5] === 0) { - str = "::"; - //special case IPv6 addresses - if(v4part === "0.0.0.0") v4part = ""; // any/unspecified address - if(v4part === "0.0.0.1") v4part = "1";// loopback address - str += v4part; - return str; - } - } - - // Handle all other IPv6 addresses - - // first run to find the longest contiguous zero words - for (word = 0; word < 8; word++) { - if (parts[word] === 0) { - if (word - lastzero > 1) { - len = 0; - } - lastzero = word; - len++; - } - if (len > longest) { - longest = len; - zstart = word - longest + 1; - } - } - - for (word = 0; word < 8; word++) { - if (longest > 1) { - // compress contiguous zeros - to produce "::" - if (parts[word] === 0 && word >= zstart && word < (zstart + longest) ) { - if (word === zstart) { - str += ":"; - if (zstart === 0) str += ":"; //leading zeros case - } - continue; - } - } - // converts 16-bit words from big-endian to little-endian before converting to hex string - str += Number(_ntohs(parts[word] & 0xffff)).toString(16); - str += word < 7 ? ":" : ""; - } - return str; - }function __read_sockaddr(sa, salen) { - // family / port offsets are common to both sockaddr_in and sockaddr_in6 - var family = HEAP16[((sa)>>1)]; - var port = _ntohs(HEAP16[(((sa)+(2))>>1)]); - var addr; - - switch (family) { - case 2: - if (salen !== 16) { - return { errno: 22 }; - } - addr = HEAP32[(((sa)+(4))>>2)]; - addr = __inet_ntop4_raw(addr); - break; - case 10: - if (salen !== 28) { - return { errno: 22 }; - } - addr = [ - HEAP32[(((sa)+(8))>>2)], - HEAP32[(((sa)+(12))>>2)], - HEAP32[(((sa)+(16))>>2)], - HEAP32[(((sa)+(20))>>2)] - ]; - addr = __inet_ntop6_raw(addr); - break; - default: - return { errno: 97 }; - } - - return { family: family, addr: addr, port: port }; - } - - function __write_sockaddr(sa, family, addr, port) { - switch (family) { - case 2: - addr = __inet_pton4_raw(addr); - HEAP16[((sa)>>1)]=family; - HEAP32[(((sa)+(4))>>2)]=addr; - HEAP16[(((sa)+(2))>>1)]=_htons(port); - break; - case 10: - addr = __inet_pton6_raw(addr); - HEAP32[((sa)>>2)]=family; - HEAP32[(((sa)+(8))>>2)]=addr[0]; - HEAP32[(((sa)+(12))>>2)]=addr[1]; - HEAP32[(((sa)+(16))>>2)]=addr[2]; - HEAP32[(((sa)+(20))>>2)]=addr[3]; - HEAP16[(((sa)+(2))>>1)]=_htons(port); - HEAP32[(((sa)+(4))>>2)]=0; - HEAP32[(((sa)+(24))>>2)]=0; - break; - default: - return { errno: 97 }; - } - // kind of lame, but let's match _read_sockaddr's interface - return {}; - } - - var SYSCALLS={DEFAULT_POLLMASK:5,mappings:{},umask:511,calculateAt:function (dirfd, path) { - if (path[0] !== '/') { - // relative path - var dir; - if (dirfd === -100) { - dir = FS.cwd(); - } else { - var dirstream = FS.getStream(dirfd); - if (!dirstream) throw new FS.ErrnoError(ERRNO_CODES.EBADF); - dir = dirstream.path; - } - path = PATH.join2(dir, path); - } - return path; - },doStat:function (func, path, buf) { - try { - var stat = func(path); - } catch (e) { - if (e && e.node && PATH.normalize(path) !== PATH.normalize(FS.getPath(e.node))) { - // an error occurred while trying to look up the path; we should just report ENOTDIR - return -ERRNO_CODES.ENOTDIR; - } - throw e; - } - HEAP32[((buf)>>2)]=stat.dev; - HEAP32[(((buf)+(4))>>2)]=0; - HEAP32[(((buf)+(8))>>2)]=stat.ino; - HEAP32[(((buf)+(12))>>2)]=stat.mode; - HEAP32[(((buf)+(16))>>2)]=stat.nlink; - HEAP32[(((buf)+(20))>>2)]=stat.uid; - HEAP32[(((buf)+(24))>>2)]=stat.gid; - HEAP32[(((buf)+(28))>>2)]=stat.rdev; - HEAP32[(((buf)+(32))>>2)]=0; - HEAP32[(((buf)+(36))>>2)]=stat.size; - HEAP32[(((buf)+(40))>>2)]=4096; - HEAP32[(((buf)+(44))>>2)]=stat.blocks; - HEAP32[(((buf)+(48))>>2)]=(stat.atime.getTime() / 1000)|0; - HEAP32[(((buf)+(52))>>2)]=0; - HEAP32[(((buf)+(56))>>2)]=(stat.mtime.getTime() / 1000)|0; - HEAP32[(((buf)+(60))>>2)]=0; - HEAP32[(((buf)+(64))>>2)]=(stat.ctime.getTime() / 1000)|0; - HEAP32[(((buf)+(68))>>2)]=0; - HEAP32[(((buf)+(72))>>2)]=stat.ino; - return 0; - },doMsync:function (addr, stream, len, flags) { - var buffer = new Uint8Array(HEAPU8.subarray(addr, addr + len)); - FS.msync(stream, buffer, 0, len, flags); - },doMkdir:function (path, mode) { - // remove a trailing slash, if one - /a/b/ has basename of '', but - // we want to create b in the context of this function - path = PATH.normalize(path); - if (path[path.length-1] === '/') path = path.substr(0, path.length-1); - FS.mkdir(path, mode, 0); - return 0; - },doMknod:function (path, mode, dev) { - // we don't want this in the JS API as it uses mknod to create all nodes. - switch (mode & 61440) { - case 32768: - case 8192: - case 24576: - case 4096: - case 49152: - break; - default: return -ERRNO_CODES.EINVAL; - } - FS.mknod(path, mode, dev); - return 0; - },doReadlink:function (path, buf, bufsize) { - if (bufsize <= 0) return -ERRNO_CODES.EINVAL; - var ret = FS.readlink(path); - - var len = Math.min(bufsize, lengthBytesUTF8(ret)); - var endChar = HEAP8[buf+len]; - stringToUTF8(ret, buf, bufsize+1); - // readlink is one of the rare functions that write out a C string, but does never append a null to the output buffer(!) - // stringToUTF8() always appends a null byte, so restore the character under the null byte after the write. - HEAP8[buf+len] = endChar; - - return len; - },doAccess:function (path, amode) { - if (amode & ~7) { - // need a valid mode - return -ERRNO_CODES.EINVAL; - } - var node; - var lookup = FS.lookupPath(path, { follow: true }); - node = lookup.node; - var perms = ''; - if (amode & 4) perms += 'r'; - if (amode & 2) perms += 'w'; - if (amode & 1) perms += 'x'; - if (perms /* otherwise, they've just passed F_OK */ && FS.nodePermissions(node, perms)) { - return -ERRNO_CODES.EACCES; - } - return 0; - },doDup:function (path, flags, suggestFD) { - var suggest = FS.getStream(suggestFD); - if (suggest) FS.close(suggest); - return FS.open(path, flags, 0, suggestFD, suggestFD).fd; - },doReadv:function (stream, iov, iovcnt, offset) { - var ret = 0; - for (var i = 0; i < iovcnt; i++) { - var ptr = HEAP32[(((iov)+(i*8))>>2)]; - var len = HEAP32[(((iov)+(i*8 + 4))>>2)]; - var curr = FS.read(stream, HEAP8,ptr, len, offset); - if (curr < 0) return -1; - ret += curr; - if (curr < len) break; // nothing more to read - } - return ret; - },doWritev:function (stream, iov, iovcnt, offset) { - var ret = 0; - for (var i = 0; i < iovcnt; i++) { - var ptr = HEAP32[(((iov)+(i*8))>>2)]; - var len = HEAP32[(((iov)+(i*8 + 4))>>2)]; - var curr = FS.write(stream, HEAP8,ptr, len, offset); - if (curr < 0) return -1; - ret += curr; - } - return ret; - },varargs:0,get:function (varargs) { - SYSCALLS.varargs += 4; - var ret = HEAP32[(((SYSCALLS.varargs)-(4))>>2)]; - return ret; - },getStr:function () { - var ret = UTF8ToString(SYSCALLS.get()); - return ret; - },getStreamFromFD:function () { - var stream = FS.getStream(SYSCALLS.get()); - if (!stream) throw new FS.ErrnoError(ERRNO_CODES.EBADF); - return stream; - },getSocketFromFD:function () { - var socket = SOCKFS.getSocket(SYSCALLS.get()); - if (!socket) throw new FS.ErrnoError(ERRNO_CODES.EBADF); - return socket; - },getSocketAddress:function (allowNull) { - var addrp = SYSCALLS.get(), addrlen = SYSCALLS.get(); - if (allowNull && addrp === 0) return null; - var info = __read_sockaddr(addrp, addrlen); - if (info.errno) throw new FS.ErrnoError(info.errno); - info.addr = DNS.lookup_addr(info.addr) || info.addr; - return info; - },get64:function () { - var low = SYSCALLS.get(), high = SYSCALLS.get(); - if (low >= 0) assert(high === 0); - else assert(high === -1); - return low; - },getZero:function () { - assert(SYSCALLS.get() === 0); - }};function ___syscall102(which, varargs) {SYSCALLS.varargs = varargs; - try { - // socketcall - var call = SYSCALLS.get(), socketvararg = SYSCALLS.get(); - // socketcalls pass the rest of the arguments in a struct - SYSCALLS.varargs = socketvararg; - switch (call) { - case 1: { // socket - var domain = SYSCALLS.get(), type = SYSCALLS.get(), protocol = SYSCALLS.get(); - var sock = SOCKFS.createSocket(domain, type, protocol); - assert(sock.stream.fd < 64); // XXX ? select() assumes socket fd values are in 0..63 - return sock.stream.fd; - } - case 2: { // bind - var sock = SYSCALLS.getSocketFromFD(), info = SYSCALLS.getSocketAddress(); - sock.sock_ops.bind(sock, info.addr, info.port); - return 0; - } - case 3: { // connect - var sock = SYSCALLS.getSocketFromFD(), info = SYSCALLS.getSocketAddress(); - sock.sock_ops.connect(sock, info.addr, info.port); - return 0; - } - case 4: { // listen - var sock = SYSCALLS.getSocketFromFD(), backlog = SYSCALLS.get(); - sock.sock_ops.listen(sock, backlog); - return 0; - } - case 5: { // accept - var sock = SYSCALLS.getSocketFromFD(), addr = SYSCALLS.get(), addrlen = SYSCALLS.get(); - var newsock = sock.sock_ops.accept(sock); - if (addr) { - var res = __write_sockaddr(addr, newsock.family, DNS.lookup_name(newsock.daddr), newsock.dport); - assert(!res.errno); - } - return newsock.stream.fd; - } - case 6: { // getsockname - var sock = SYSCALLS.getSocketFromFD(), addr = SYSCALLS.get(), addrlen = SYSCALLS.get(); - // TODO: sock.saddr should never be undefined, see TODO in websocket_sock_ops.getname - var res = __write_sockaddr(addr, sock.family, DNS.lookup_name(sock.saddr || '0.0.0.0'), sock.sport); - assert(!res.errno); - return 0; - } - case 7: { // getpeername - var sock = SYSCALLS.getSocketFromFD(), addr = SYSCALLS.get(), addrlen = SYSCALLS.get(); - if (!sock.daddr) { - return -ERRNO_CODES.ENOTCONN; // The socket is not connected. - } - var res = __write_sockaddr(addr, sock.family, DNS.lookup_name(sock.daddr), sock.dport); - assert(!res.errno); - return 0; - } - case 11: { // sendto - var sock = SYSCALLS.getSocketFromFD(), message = SYSCALLS.get(), length = SYSCALLS.get(), flags = SYSCALLS.get(), dest = SYSCALLS.getSocketAddress(true); - if (!dest) { - // send, no address provided - return FS.write(sock.stream, HEAP8,message, length); - } else { - // sendto an address - return sock.sock_ops.sendmsg(sock, HEAP8,message, length, dest.addr, dest.port); - } - } - case 12: { // recvfrom - var sock = SYSCALLS.getSocketFromFD(), buf = SYSCALLS.get(), len = SYSCALLS.get(), flags = SYSCALLS.get(), addr = SYSCALLS.get(), addrlen = SYSCALLS.get(); - var msg = sock.sock_ops.recvmsg(sock, len); - if (!msg) return 0; // socket is closed - if (addr) { - var res = __write_sockaddr(addr, sock.family, DNS.lookup_name(msg.addr), msg.port); - assert(!res.errno); - } - HEAPU8.set(msg.buffer, buf); - return msg.buffer.byteLength; - } - case 14: { // setsockopt - return -ERRNO_CODES.ENOPROTOOPT; // The option is unknown at the level indicated. - } - case 15: { // getsockopt - var sock = SYSCALLS.getSocketFromFD(), level = SYSCALLS.get(), optname = SYSCALLS.get(), optval = SYSCALLS.get(), optlen = SYSCALLS.get(); - // Minimal getsockopt aimed at resolving https://github.com/emscripten-core/emscripten/issues/2211 - // so only supports SOL_SOCKET with SO_ERROR. - if (level === 1) { - if (optname === 4) { - HEAP32[((optval)>>2)]=sock.error; - HEAP32[((optlen)>>2)]=4; - sock.error = null; // Clear the error (The SO_ERROR option obtains and then clears this field). - return 0; - } - } - return -ERRNO_CODES.ENOPROTOOPT; // The option is unknown at the level indicated. - } - case 16: { // sendmsg - var sock = SYSCALLS.getSocketFromFD(), message = SYSCALLS.get(), flags = SYSCALLS.get(); - var iov = HEAP32[(((message)+(8))>>2)]; - var num = HEAP32[(((message)+(12))>>2)]; - // read the address and port to send to - var addr, port; - var name = HEAP32[((message)>>2)]; - var namelen = HEAP32[(((message)+(4))>>2)]; - if (name) { - var info = __read_sockaddr(name, namelen); - if (info.errno) return -info.errno; - port = info.port; - addr = DNS.lookup_addr(info.addr) || info.addr; - } - // concatenate scatter-gather arrays into one message buffer - var total = 0; - for (var i = 0; i < num; i++) { - total += HEAP32[(((iov)+((8 * i) + 4))>>2)]; - } - var view = new Uint8Array(total); - var offset = 0; - for (var i = 0; i < num; i++) { - var iovbase = HEAP32[(((iov)+((8 * i) + 0))>>2)]; - var iovlen = HEAP32[(((iov)+((8 * i) + 4))>>2)]; - for (var j = 0; j < iovlen; j++) { - view[offset++] = HEAP8[(((iovbase)+(j))>>0)]; - } - } - // write the buffer - return sock.sock_ops.sendmsg(sock, view, 0, total, addr, port); - } - case 17: { // recvmsg - var sock = SYSCALLS.getSocketFromFD(), message = SYSCALLS.get(), flags = SYSCALLS.get(); - var iov = HEAP32[(((message)+(8))>>2)]; - var num = HEAP32[(((message)+(12))>>2)]; - // get the total amount of data we can read across all arrays - var total = 0; - for (var i = 0; i < num; i++) { - total += HEAP32[(((iov)+((8 * i) + 4))>>2)]; - } - // try to read total data - var msg = sock.sock_ops.recvmsg(sock, total); - if (!msg) return 0; // socket is closed - - // TODO honor flags: - // MSG_OOB - // Requests out-of-band data. The significance and semantics of out-of-band data are protocol-specific. - // MSG_PEEK - // Peeks at the incoming message. - // MSG_WAITALL - // Requests that the function block until the full amount of data requested can be returned. The function may return a smaller amount of data if a signal is caught, if the connection is terminated, if MSG_PEEK was specified, or if an error is pending for the socket. - - // write the source address out - var name = HEAP32[((message)>>2)]; - if (name) { - var res = __write_sockaddr(name, sock.family, DNS.lookup_name(msg.addr), msg.port); - assert(!res.errno); - } - // write the buffer out to the scatter-gather arrays - var bytesRead = 0; - var bytesRemaining = msg.buffer.byteLength; - for (var i = 0; bytesRemaining > 0 && i < num; i++) { - var iovbase = HEAP32[(((iov)+((8 * i) + 0))>>2)]; - var iovlen = HEAP32[(((iov)+((8 * i) + 4))>>2)]; - if (!iovlen) { - continue; - } - var length = Math.min(iovlen, bytesRemaining); - var buf = msg.buffer.subarray(bytesRead, bytesRead + length); - HEAPU8.set(buf, iovbase + bytesRead); - bytesRead += length; - bytesRemaining -= length; - } - - // TODO set msghdr.msg_flags - // MSG_EOR - // End of record was received (if supported by the protocol). - // MSG_OOB - // Out-of-band data was received. - // MSG_TRUNC - // Normal data was truncated. - // MSG_CTRUNC - - return bytesRead; - } - default: abort('unsupported socketcall syscall ' + call); - } - } catch (e) { - if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e); - return -e.errno; - } - } - - function ___syscall118(which, varargs) {SYSCALLS.varargs = varargs; - try { - // fsync - var stream = SYSCALLS.getStreamFromFD(); - return 0; // we can't do anything synchronously; the in-memory FS is already synced to - } catch (e) { - if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e); - return -e.errno; - } - } - - function ___syscall140(which, varargs) {SYSCALLS.varargs = varargs; - try { - // llseek - var stream = SYSCALLS.getStreamFromFD(), offset_high = SYSCALLS.get(), offset_low = SYSCALLS.get(), result = SYSCALLS.get(), whence = SYSCALLS.get(); - // NOTE: offset_high is unused - Emscripten's off_t is 32-bit - var offset = offset_low; - FS.llseek(stream, offset, whence); - HEAP32[((result)>>2)]=stream.position; - if (stream.getdents && offset === 0 && whence === 0) stream.getdents = null; // reset readdir state - return 0; - } catch (e) { - if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e); - return -e.errno; - } - } - - function ___syscall145(which, varargs) {SYSCALLS.varargs = varargs; - try { - // readv - var stream = SYSCALLS.getStreamFromFD(), iov = SYSCALLS.get(), iovcnt = SYSCALLS.get(); - return SYSCALLS.doReadv(stream, iov, iovcnt); - } catch (e) { - if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e); - return -e.errno; - } - } - - function ___syscall146(which, varargs) {SYSCALLS.varargs = varargs; - try { - // writev - var stream = SYSCALLS.getStreamFromFD(), iov = SYSCALLS.get(), iovcnt = SYSCALLS.get(); - return SYSCALLS.doWritev(stream, iov, iovcnt); - } catch (e) { - if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e); - return -e.errno; - } - } - - function ___syscall148(which, varargs) {SYSCALLS.varargs = varargs; - try { - // fdatasync - var stream = SYSCALLS.getStreamFromFD(); - return 0; // we can't do anything synchronously; the in-memory FS is already synced to - } catch (e) { - if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e); - return -e.errno; - } - } - - function ___syscall168(which, varargs) {SYSCALLS.varargs = varargs; - try { - // poll - var fds = SYSCALLS.get(), nfds = SYSCALLS.get(), timeout = SYSCALLS.get(); - var nonzero = 0; - for (var i = 0; i < nfds; i++) { - var pollfd = fds + 8 * i; - var fd = HEAP32[((pollfd)>>2)]; - var events = HEAP16[(((pollfd)+(4))>>1)]; - var mask = 32; - var stream = FS.getStream(fd); - if (stream) { - mask = SYSCALLS.DEFAULT_POLLMASK; - if (stream.stream_ops.poll) { - mask = stream.stream_ops.poll(stream); - } - } - mask &= events | 8 | 16; - if (mask) nonzero++; - HEAP16[(((pollfd)+(6))>>1)]=mask; - } - return nonzero; - } catch (e) { - if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e); - return -e.errno; - } - } - - function ___syscall194(which, varargs) {SYSCALLS.varargs = varargs; - try { - // ftruncate64 - var fd = SYSCALLS.get(), zero = SYSCALLS.getZero(), length = SYSCALLS.get64(); - FS.ftruncate(fd, length); - return 0; - } catch (e) { - if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e); - return -e.errno; - } - } - - function ___syscall195(which, varargs) {SYSCALLS.varargs = varargs; - try { - // SYS_stat64 - var path = SYSCALLS.getStr(), buf = SYSCALLS.get(); - return SYSCALLS.doStat(FS.stat, path, buf); - } catch (e) { - if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e); - return -e.errno; - } - } - - function ___syscall197(which, varargs) {SYSCALLS.varargs = varargs; - try { - // SYS_fstat64 - var stream = SYSCALLS.getStreamFromFD(), buf = SYSCALLS.get(); - return SYSCALLS.doStat(FS.stat, stream.path, buf); - } catch (e) { - if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e); - return -e.errno; - } - } - - function ___syscall220(which, varargs) {SYSCALLS.varargs = varargs; - try { - // SYS_getdents64 - var stream = SYSCALLS.getStreamFromFD(), dirp = SYSCALLS.get(), count = SYSCALLS.get(); - if (!stream.getdents) { - stream.getdents = FS.readdir(stream.path); - } - var pos = 0; - while (stream.getdents.length > 0 && pos + 268 <= count) { - var id; - var type; - var name = stream.getdents.pop(); - if (name[0] === '.') { - id = 1; - type = 4; // DT_DIR - } else { - var child = FS.lookupNode(stream.node, name); - id = child.id; - type = FS.isChrdev(child.mode) ? 2 : // DT_CHR, character device. - FS.isDir(child.mode) ? 4 : // DT_DIR, directory. - FS.isLink(child.mode) ? 10 : // DT_LNK, symbolic link. - 8; // DT_REG, regular file. - } - HEAP32[((dirp + pos)>>2)]=id; - HEAP32[(((dirp + pos)+(4))>>2)]=stream.position; - HEAP16[(((dirp + pos)+(8))>>1)]=268; - HEAP8[(((dirp + pos)+(10))>>0)]=type; - stringToUTF8(name, dirp + pos + 11, 256); - pos += 268; - } - return pos; - } catch (e) { - if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e); - return -e.errno; - } - } - - function ___syscall221(which, varargs) {SYSCALLS.varargs = varargs; - try { - // fcntl64 - var stream = SYSCALLS.getStreamFromFD(), cmd = SYSCALLS.get(); - switch (cmd) { - case 0: { - var arg = SYSCALLS.get(); - if (arg < 0) { - return -ERRNO_CODES.EINVAL; - } - var newStream; - newStream = FS.open(stream.path, stream.flags, 0, arg); - return newStream.fd; - } - case 1: - case 2: - return 0; // FD_CLOEXEC makes no sense for a single process. - case 3: - return stream.flags; - case 4: { - var arg = SYSCALLS.get(); - stream.flags |= arg; - return 0; - } - case 12: - /* case 12: Currently in musl F_GETLK64 has same value as F_GETLK, so omitted to avoid duplicate case blocks. If that changes, uncomment this */ { - - var arg = SYSCALLS.get(); - var offset = 0; - // We're always unlocked. - HEAP16[(((arg)+(offset))>>1)]=2; - return 0; - } - case 13: - case 14: - /* case 13: Currently in musl F_SETLK64 has same value as F_SETLK, so omitted to avoid duplicate case blocks. If that changes, uncomment this */ - /* case 14: Currently in musl F_SETLKW64 has same value as F_SETLKW, so omitted to avoid duplicate case blocks. If that changes, uncomment this */ - - - return 0; // Pretend that the locking is successful. - case 16: - case 8: - return -ERRNO_CODES.EINVAL; // These are for sockets. We don't have them fully implemented yet. - case 9: - // musl trusts getown return values, due to a bug where they must be, as they overlap with errors. just return -1 here, so fnctl() returns that, and we set errno ourselves. - ___setErrNo(ERRNO_CODES.EINVAL); - return -1; - default: { - return -ERRNO_CODES.EINVAL; - } - } - } catch (e) { - if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e); - return -e.errno; - } - } - - function ___syscall272(which, varargs) {SYSCALLS.varargs = varargs; - try { - // fadvise64_64 - return 0; // your advice is important to us (but we can't use it) - } catch (e) { - if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e); - return -e.errno; - } - } - - function ___syscall295(which, varargs) {SYSCALLS.varargs = varargs; - try { - // openat - var dirfd = SYSCALLS.get(), path = SYSCALLS.getStr(), flags = SYSCALLS.get(), mode = SYSCALLS.get(); - path = SYSCALLS.calculateAt(dirfd, path); - return FS.open(path, flags, mode).fd; - } catch (e) { - if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e); - return -e.errno; - } - } - - function ___syscall296(which, varargs) {SYSCALLS.varargs = varargs; - try { - // mkdirat - var dirfd = SYSCALLS.get(), path = SYSCALLS.getStr(), mode = SYSCALLS.get(); - path = SYSCALLS.calculateAt(dirfd, path); - return SYSCALLS.doMkdir(path, mode); - } catch (e) { - if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e); - return -e.errno; - } - } - - function ___syscall3(which, varargs) {SYSCALLS.varargs = varargs; - try { - // read - var stream = SYSCALLS.getStreamFromFD(), buf = SYSCALLS.get(), count = SYSCALLS.get(); - return FS.read(stream, HEAP8,buf, count); - } catch (e) { - if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e); - return -e.errno; - } - } - - function ___syscall300(which, varargs) {SYSCALLS.varargs = varargs; - try { - // fstatat64 - var dirfd = SYSCALLS.get(), path = SYSCALLS.getStr(), buf = SYSCALLS.get(), flags = SYSCALLS.get(); - var nofollow = flags & 256; - flags = flags & (~256); - assert(!flags, flags); - path = SYSCALLS.calculateAt(dirfd, path); - return SYSCALLS.doStat(nofollow ? FS.lstat : FS.stat, path, buf); - } catch (e) { - if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e); - return -e.errno; - } - } - - function ___syscall301(which, varargs) {SYSCALLS.varargs = varargs; - try { - // unlinkat - var dirfd = SYSCALLS.get(), path = SYSCALLS.getStr(), flags = SYSCALLS.get(); - path = SYSCALLS.calculateAt(dirfd, path); - if (flags === 0) { - FS.unlink(path); - } else if (flags === 512) { - FS.rmdir(path); - } else { - abort('Invalid flags passed to unlinkat'); - } - return 0; - } catch (e) { - if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e); - return -e.errno; - } - } - - function ___syscall302(which, varargs) {SYSCALLS.varargs = varargs; - try { - // renameat - var olddirfd = SYSCALLS.get(), oldpath = SYSCALLS.getStr(), newdirfd = SYSCALLS.get(), newpath = SYSCALLS.getStr(); - oldpath = SYSCALLS.calculateAt(olddirfd, oldpath); - newpath = SYSCALLS.calculateAt(newdirfd, newpath); - FS.rename(oldpath, newpath); - return 0; - } catch (e) { - if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e); - return -e.errno; - } - } - - function ___syscall303(which, varargs) {SYSCALLS.varargs = varargs; - try { - // linkat - return -ERRNO_CODES.EMLINK; // no hardlinks for us - } catch (e) { - if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e); - return -e.errno; - } - } - - function ___syscall304(which, varargs) {SYSCALLS.varargs = varargs; - try { - // symlinkat - var target = SYSCALLS.get(), newdirfd = SYSCALLS.get(), linkpath = SYSCALLS.get(); - linkpath = SYSCALLS.calculateAt(newdirfd, linkpath); - FS.symlink(target, linkpath); - return 0; - } catch (e) { - if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e); - return -e.errno; - } - } - - function ___syscall305(which, varargs) {SYSCALLS.varargs = varargs; - try { - // readlinkat - var dirfd = SYSCALLS.get(), path = SYSCALLS.getStr(), buf = SYSCALLS.get(), bufsize = SYSCALLS.get(); - path = SYSCALLS.calculateAt(dirfd, path); - return SYSCALLS.doReadlink(path, buf, bufsize); - } catch (e) { - if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e); - return -e.errno; - } - } - - function ___syscall320(which, varargs) {SYSCALLS.varargs = varargs; - try { - // utimensat - var dirfd = SYSCALLS.get(), path = SYSCALLS.getStr(), times = SYSCALLS.get(), flags = SYSCALLS.get(); - assert(flags === 0); - path = SYSCALLS.calculateAt(dirfd, path); - var seconds = HEAP32[((times)>>2)]; - var nanoseconds = HEAP32[(((times)+(4))>>2)]; - var atime = (seconds*1000) + (nanoseconds/(1000*1000)); - times += 8; - seconds = HEAP32[((times)>>2)]; - nanoseconds = HEAP32[(((times)+(4))>>2)]; - var mtime = (seconds*1000) + (nanoseconds/(1000*1000)); - FS.utime(path, atime, mtime); - return 0; - } catch (e) { - if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e); - return -e.errno; - } - } - - function ___syscall324(which, varargs) {SYSCALLS.varargs = varargs; - try { - // fallocate - var stream = SYSCALLS.getStreamFromFD(), mode = SYSCALLS.get(), offset = SYSCALLS.get64(), len = SYSCALLS.get64(); - assert(mode === 0); - FS.allocate(stream, offset, len); - return 0; - } catch (e) { - if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e); - return -e.errno; - } - } - - function ___syscall333(which, varargs) {SYSCALLS.varargs = varargs; - try { - // preadv - var stream = SYSCALLS.getStreamFromFD(), iov = SYSCALLS.get(), iovcnt = SYSCALLS.get(), offset = SYSCALLS.get(); - return SYSCALLS.doReadv(stream, iov, iovcnt, offset); - } catch (e) { - if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e); - return -e.errno; - } - } - - function ___syscall334(which, varargs) {SYSCALLS.varargs = varargs; - try { - // pwritev - var stream = SYSCALLS.getStreamFromFD(), iov = SYSCALLS.get(), iovcnt = SYSCALLS.get(), offset = SYSCALLS.get(); - return SYSCALLS.doWritev(stream, iov, iovcnt, offset); - } catch (e) { - if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e); - return -e.errno; - } - } - - function ___syscall5(which, varargs) {SYSCALLS.varargs = varargs; - try { - // open - var pathname = SYSCALLS.getStr(), flags = SYSCALLS.get(), mode = SYSCALLS.get() // optional TODO - var stream = FS.open(pathname, flags, mode); - return stream.fd; - } catch (e) { - if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e); - return -e.errno; - } - } - - function ___syscall54(which, varargs) {SYSCALLS.varargs = varargs; - try { - // ioctl - var stream = SYSCALLS.getStreamFromFD(), op = SYSCALLS.get(); - switch (op) { - case 21509: - case 21505: { - if (!stream.tty) return -ERRNO_CODES.ENOTTY; - return 0; - } - case 21510: - case 21511: - case 21512: - case 21506: - case 21507: - case 21508: { - if (!stream.tty) return -ERRNO_CODES.ENOTTY; - return 0; // no-op, not actually adjusting terminal settings - } - case 21519: { - if (!stream.tty) return -ERRNO_CODES.ENOTTY; - var argp = SYSCALLS.get(); - HEAP32[((argp)>>2)]=0; - return 0; - } - case 21520: { - if (!stream.tty) return -ERRNO_CODES.ENOTTY; - return -ERRNO_CODES.EINVAL; // not supported - } - case 21531: { - var argp = SYSCALLS.get(); - return FS.ioctl(stream, op, argp); - } - case 21523: { - // TODO: in theory we should write to the winsize struct that gets - // passed in, but for now musl doesn't read anything on it - if (!stream.tty) return -ERRNO_CODES.ENOTTY; - return 0; - } - case 21524: { - // TODO: technically, this ioctl call should change the window size. - // but, since emscripten doesn't have any concept of a terminal window - // yet, we'll just silently throw it away as we do TIOCGWINSZ - if (!stream.tty) return -ERRNO_CODES.ENOTTY; - return 0; - } - default: abort('bad ioctl syscall ' + op); - } - } catch (e) { - if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e); - return -e.errno; - } - } - - function ___syscall6(which, varargs) {SYSCALLS.varargs = varargs; - try { - // close - var stream = SYSCALLS.getStreamFromFD(); - FS.close(stream); - return 0; - } catch (e) { - if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e); - return -e.errno; - } - } - - function ___unlock() {} - - function _abort() { - Module['abort'](); - } - - - function _emscripten_get_now_res() { // return resolution of get_now, in nanoseconds - if (ENVIRONMENT_IS_NODE) { - return 1; // nanoseconds - } else - if (typeof dateNow !== 'undefined') { - return 1000; // microseconds (1/1000 of a millisecond) - } else - if (typeof performance === 'object' && performance && typeof performance['now'] === 'function') { - return 1000; // microseconds (1/1000 of a millisecond) - } else { - return 1000*1000; // milliseconds - } - } - - - function _emscripten_get_now() { abort() }function _emscripten_get_now_is_monotonic() { - // return whether emscripten_get_now is guaranteed monotonic; the Date.now - // implementation is not :( - return (0 - || ENVIRONMENT_IS_NODE - || (typeof dateNow !== 'undefined') - || (typeof performance === 'object' && performance && typeof performance['now'] === 'function') - ); - }function _clock_getres(clk_id, res) { - // int clock_getres(clockid_t clk_id, struct timespec *res); - var nsec; - if (clk_id === 0) { - nsec = 1000 * 1000; // educated guess that it's milliseconds - } else if (clk_id === 1 && _emscripten_get_now_is_monotonic()) { - nsec = _emscripten_get_now_res(); - } else { - ___setErrNo(22); - return -1; - } - HEAP32[((res)>>2)]=(nsec/1000000000)|0; - HEAP32[(((res)+(4))>>2)]=nsec // resolution is nanoseconds - return 0; - } - - function _clock_gettime(clk_id, tp) { - // int clock_gettime(clockid_t clk_id, struct timespec *tp); - var now; - if (clk_id === 0) { - now = Date.now(); - } else if (clk_id === 1 && _emscripten_get_now_is_monotonic()) { - now = _emscripten_get_now(); - } else { - ___setErrNo(22); - return -1; - } - HEAP32[((tp)>>2)]=(now/1000)|0; // seconds - HEAP32[(((tp)+(4))>>2)]=((now % 1000)*1000*1000)|0; // nanoseconds - return 0; - } - - var _emscripten_asm_const_int=true; - - function _emscripten_get_heap_size() { - return HEAP8.length; - } - - - function abortOnCannotGrowMemory(requestedSize) { - abort('Cannot enlarge memory arrays to size ' + requestedSize + ' bytes (OOM). Either (1) compile with -s TOTAL_MEMORY=X with X higher than the current value ' + HEAP8.length + ', (2) compile with -s ALLOW_MEMORY_GROWTH=1 which allows increasing the size at runtime, or (3) if you want malloc to return NULL (0) instead of this abort, compile with -s ABORTING_MALLOC=0 '); - }function _emscripten_resize_heap(requestedSize) { - abortOnCannotGrowMemory(requestedSize); - } - - function _llvm_trap() { - abort('trap!'); - } - - - function _emscripten_memcpy_big(dest, src, num) { - HEAPU8.set(HEAPU8.subarray(src, src+num), dest); - } - - - - - - - function _usleep(useconds) { - // int usleep(useconds_t useconds); - // http://pubs.opengroup.org/onlinepubs/000095399/functions/usleep.html - // We're single-threaded, so use a busy loop. Super-ugly. - var msec = useconds / 1000; - if ((ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) && self['performance'] && self['performance']['now']) { - var start = self['performance']['now'](); - while (self['performance']['now']() - start < msec) { - // Do nothing. - } - } else { - var start = Date.now(); - while (Date.now() - start < msec) { - // Do nothing. - } - } - return 0; - }function _nanosleep(rqtp, rmtp) { - // int nanosleep(const struct timespec *rqtp, struct timespec *rmtp); - var seconds = HEAP32[((rqtp)>>2)]; - var nanoseconds = HEAP32[(((rqtp)+(4))>>2)]; - if (rmtp !== 0) { - HEAP32[((rmtp)>>2)]=0; - HEAP32[(((rmtp)+(4))>>2)]=0; - } - return _usleep((seconds * 1e6) + (nanoseconds / 1000)); - } - - function _pthread_cond_destroy() { return 0; } - - function _pthread_cond_init() { return 0; } - - function _pthread_cond_timedwait() { return 0; } - - function _pthread_rwlock_init() { return 0; } - - function _pthread_rwlock_rdlock() { return 0; } - - function _pthread_rwlock_unlock() { return 0; } - - function _pthread_rwlock_wrlock() { return 0; } - - function _raise(sig) { - err('Calling stub instead of raise()'); - ___setErrNo(ERRNO_CODES.ENOSYS); - warnOnce('raise() returning an error as we do not support it'); - return -1; - } - - - - function _sched_yield() { - return 0; - } -FS.staticInit();; -if (ENVIRONMENT_IS_NODE) { var fs = require("fs"); var NODEJS_PATH = require("path"); NODEFS.staticInit(); }; -if (ENVIRONMENT_IS_NODE) { - _emscripten_get_now = function _emscripten_get_now_actual() { - var t = process['hrtime'](); - return t[0] * 1e3 + t[1] / 1e6; - }; - } else if (typeof dateNow !== 'undefined') { - _emscripten_get_now = dateNow; - } else if (typeof performance === 'object' && performance && typeof performance['now'] === 'function') { - _emscripten_get_now = function() { return performance['now'](); }; - } else { - _emscripten_get_now = Date.now; - }; -var ASSERTIONS = true; - -// Copyright 2017 The Emscripten Authors. All rights reserved. -// Emscripten is available under two separate licenses, the MIT license and the -// University of Illinois/NCSA Open Source License. Both these licenses can be -// found in the LICENSE file. - -/** @type {function(string, boolean=, number=)} */ -function intArrayFromString(stringy, dontAddNull, length) { - var len = length > 0 ? length : lengthBytesUTF8(stringy)+1; - var u8array = new Array(len); - var numBytesWritten = stringToUTF8Array(stringy, u8array, 0, u8array.length); - if (dontAddNull) u8array.length = numBytesWritten; - return u8array; -} - -function intArrayToString(array) { - var ret = []; - for (var i = 0; i < array.length; i++) { - var chr = array[i]; - if (chr > 0xFF) { - if (ASSERTIONS) { - assert(false, 'Character code ' + chr + ' (' + String.fromCharCode(chr) + ') at offset ' + i + ' not in 0x00-0xFF.'); - } - chr &= 0xFF; - } - ret.push(String.fromCharCode(chr)); - } - return ret.join(''); -} - - -// ASM_LIBRARY EXTERN PRIMITIVES: Int8Array,Int32Array - - -function nullFunc_ii(x) { err("Invalid function pointer called with signature 'ii'. Perhaps this is an invalid value (e.g. caused by calling a virtual method on a NULL pointer)? Or calling a function with an incorrect type, which will fail? (it is worth building your source files with -Werror (warnings are errors), as warnings can indicate undefined behavior which can cause this)"); err("Build with ASSERTIONS=2 for more info.");abort(x) } - -function nullFunc_iiii(x) { err("Invalid function pointer called with signature 'iiii'. Perhaps this is an invalid value (e.g. caused by calling a virtual method on a NULL pointer)? Or calling a function with an incorrect type, which will fail? (it is worth building your source files with -Werror (warnings are errors), as warnings can indicate undefined behavior which can cause this)"); err("Build with ASSERTIONS=2 for more info.");abort(x) } - -function nullFunc_v(x) { err("Invalid function pointer called with signature 'v'. Perhaps this is an invalid value (e.g. caused by calling a virtual method on a NULL pointer)? Or calling a function with an incorrect type, which will fail? (it is worth building your source files with -Werror (warnings are errors), as warnings can indicate undefined behavior which can cause this)"); err("Build with ASSERTIONS=2 for more info.");abort(x) } - -var asmGlobalArg = {} - -var asmLibraryArg = { - "abort": abort, - "setTempRet0": setTempRet0, - "getTempRet0": getTempRet0, - "abortStackOverflow": abortStackOverflow, - "nullFunc_ii": nullFunc_ii, - "nullFunc_iiii": nullFunc_iiii, - "nullFunc_v": nullFunc_v, - "__Exit": __Exit, - "___assert_fail": ___assert_fail, - "___lock": ___lock, - "___setErrNo": ___setErrNo, - "___syscall102": ___syscall102, - "___syscall118": ___syscall118, - "___syscall140": ___syscall140, - "___syscall145": ___syscall145, - "___syscall146": ___syscall146, - "___syscall148": ___syscall148, - "___syscall168": ___syscall168, - "___syscall194": ___syscall194, - "___syscall195": ___syscall195, - "___syscall197": ___syscall197, - "___syscall220": ___syscall220, - "___syscall221": ___syscall221, - "___syscall272": ___syscall272, - "___syscall295": ___syscall295, - "___syscall296": ___syscall296, - "___syscall3": ___syscall3, - "___syscall300": ___syscall300, - "___syscall301": ___syscall301, - "___syscall302": ___syscall302, - "___syscall303": ___syscall303, - "___syscall304": ___syscall304, - "___syscall305": ___syscall305, - "___syscall320": ___syscall320, - "___syscall324": ___syscall324, - "___syscall333": ___syscall333, - "___syscall334": ___syscall334, - "___syscall5": ___syscall5, - "___syscall54": ___syscall54, - "___syscall6": ___syscall6, - "___unlock": ___unlock, - "__inet_ntop4_raw": __inet_ntop4_raw, - "__inet_ntop6_raw": __inet_ntop6_raw, - "__inet_pton4_raw": __inet_pton4_raw, - "__inet_pton6_raw": __inet_pton6_raw, - "__read_sockaddr": __read_sockaddr, - "__write_sockaddr": __write_sockaddr, - "_abort": _abort, - "_clock_getres": _clock_getres, - "_clock_gettime": _clock_gettime, - "_emscripten_asm_const_i": _emscripten_asm_const_i, - "_emscripten_get_heap_size": _emscripten_get_heap_size, - "_emscripten_get_now": _emscripten_get_now, - "_emscripten_get_now_is_monotonic": _emscripten_get_now_is_monotonic, - "_emscripten_get_now_res": _emscripten_get_now_res, - "_emscripten_memcpy_big": _emscripten_memcpy_big, - "_emscripten_resize_heap": _emscripten_resize_heap, - "_exit": _exit, - "_htons": _htons, - "_llvm_trap": _llvm_trap, - "_nanosleep": _nanosleep, - "_pthread_cond_destroy": _pthread_cond_destroy, - "_pthread_cond_init": _pthread_cond_init, - "_pthread_cond_timedwait": _pthread_cond_timedwait, - "_pthread_rwlock_init": _pthread_rwlock_init, - "_pthread_rwlock_rdlock": _pthread_rwlock_rdlock, - "_pthread_rwlock_unlock": _pthread_rwlock_unlock, - "_pthread_rwlock_wrlock": _pthread_rwlock_wrlock, - "_raise": _raise, - "_sched_yield": _sched_yield, - "_usleep": _usleep, - "abortOnCannotGrowMemory": abortOnCannotGrowMemory, - "tempDoublePtr": tempDoublePtr, - "DYNAMICTOP_PTR": DYNAMICTOP_PTR -} -// EMSCRIPTEN_START_ASM -var asm =Module["asm"]// EMSCRIPTEN_END_ASM -(asmGlobalArg, asmLibraryArg, buffer); - -var real____errno_location = asm["___errno_location"]; asm["___errno_location"] = function() { - assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); - assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); - return real____errno_location.apply(null, arguments); -}; - -var real____wasi_args_get = asm["___wasi_args_get"]; asm["___wasi_args_get"] = function() { - assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); - assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); - return real____wasi_args_get.apply(null, arguments); -}; - -var real____wasi_args_sizes_get = asm["___wasi_args_sizes_get"]; asm["___wasi_args_sizes_get"] = function() { - assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); - assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); - return real____wasi_args_sizes_get.apply(null, arguments); -}; - -var real____wasi_clock_res_get = asm["___wasi_clock_res_get"]; asm["___wasi_clock_res_get"] = function() { - assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); - assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); - return real____wasi_clock_res_get.apply(null, arguments); -}; - -var real____wasi_clock_time_get = asm["___wasi_clock_time_get"]; asm["___wasi_clock_time_get"] = function() { - assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); - assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); - return real____wasi_clock_time_get.apply(null, arguments); -}; - -var real____wasi_environ_get = asm["___wasi_environ_get"]; asm["___wasi_environ_get"] = function() { - assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); - assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); - return real____wasi_environ_get.apply(null, arguments); -}; - -var real____wasi_environ_sizes_get = asm["___wasi_environ_sizes_get"]; asm["___wasi_environ_sizes_get"] = function() { - assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); - assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); - return real____wasi_environ_sizes_get.apply(null, arguments); -}; - -var real____wasi_fd_advise = asm["___wasi_fd_advise"]; asm["___wasi_fd_advise"] = function() { - assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); - assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); - return real____wasi_fd_advise.apply(null, arguments); -}; - -var real____wasi_fd_allocate = asm["___wasi_fd_allocate"]; asm["___wasi_fd_allocate"] = function() { - assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); - assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); - return real____wasi_fd_allocate.apply(null, arguments); -}; - -var real____wasi_fd_close = asm["___wasi_fd_close"]; asm["___wasi_fd_close"] = function() { - assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); - assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); - return real____wasi_fd_close.apply(null, arguments); -}; - -var real____wasi_fd_datasync = asm["___wasi_fd_datasync"]; asm["___wasi_fd_datasync"] = function() { - assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); - assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); - return real____wasi_fd_datasync.apply(null, arguments); -}; - -var real____wasi_fd_fdstat_get = asm["___wasi_fd_fdstat_get"]; asm["___wasi_fd_fdstat_get"] = function() { - assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); - assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); - return real____wasi_fd_fdstat_get.apply(null, arguments); -}; - -var real____wasi_fd_fdstat_set_flags = asm["___wasi_fd_fdstat_set_flags"]; asm["___wasi_fd_fdstat_set_flags"] = function() { - assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); - assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); - return real____wasi_fd_fdstat_set_flags.apply(null, arguments); -}; - -var real____wasi_fd_fdstat_set_rights = asm["___wasi_fd_fdstat_set_rights"]; asm["___wasi_fd_fdstat_set_rights"] = function() { - assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); - assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); - return real____wasi_fd_fdstat_set_rights.apply(null, arguments); -}; - -var real____wasi_fd_filestat_get = asm["___wasi_fd_filestat_get"]; asm["___wasi_fd_filestat_get"] = function() { - assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); - assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); - return real____wasi_fd_filestat_get.apply(null, arguments); -}; - -var real____wasi_fd_filestat_set_size = asm["___wasi_fd_filestat_set_size"]; asm["___wasi_fd_filestat_set_size"] = function() { - assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); - assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); - return real____wasi_fd_filestat_set_size.apply(null, arguments); -}; - -var real____wasi_fd_filestat_set_times = asm["___wasi_fd_filestat_set_times"]; asm["___wasi_fd_filestat_set_times"] = function() { - assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); - assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); - return real____wasi_fd_filestat_set_times.apply(null, arguments); -}; - -var real____wasi_fd_pread = asm["___wasi_fd_pread"]; asm["___wasi_fd_pread"] = function() { - assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); - assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); - return real____wasi_fd_pread.apply(null, arguments); -}; - -var real____wasi_fd_prestat_dir_name = asm["___wasi_fd_prestat_dir_name"]; asm["___wasi_fd_prestat_dir_name"] = function() { - assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); - assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); - return real____wasi_fd_prestat_dir_name.apply(null, arguments); -}; - -var real____wasi_fd_prestat_get = asm["___wasi_fd_prestat_get"]; asm["___wasi_fd_prestat_get"] = function() { - assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); - assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); - return real____wasi_fd_prestat_get.apply(null, arguments); -}; - -var real____wasi_fd_pwrite = asm["___wasi_fd_pwrite"]; asm["___wasi_fd_pwrite"] = function() { - assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); - assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); - return real____wasi_fd_pwrite.apply(null, arguments); -}; - -var real____wasi_fd_read = asm["___wasi_fd_read"]; asm["___wasi_fd_read"] = function() { - assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); - assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); - return real____wasi_fd_read.apply(null, arguments); -}; - -var real____wasi_fd_readdir = asm["___wasi_fd_readdir"]; asm["___wasi_fd_readdir"] = function() { - assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); - assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); - return real____wasi_fd_readdir.apply(null, arguments); -}; - -var real____wasi_fd_renumber = asm["___wasi_fd_renumber"]; asm["___wasi_fd_renumber"] = function() { - assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); - assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); - return real____wasi_fd_renumber.apply(null, arguments); -}; - -var real____wasi_fd_seek = asm["___wasi_fd_seek"]; asm["___wasi_fd_seek"] = function() { - assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); - assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); - return real____wasi_fd_seek.apply(null, arguments); -}; - -var real____wasi_fd_sync = asm["___wasi_fd_sync"]; asm["___wasi_fd_sync"] = function() { - assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); - assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); - return real____wasi_fd_sync.apply(null, arguments); -}; - -var real____wasi_fd_tell = asm["___wasi_fd_tell"]; asm["___wasi_fd_tell"] = function() { - assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); - assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); - return real____wasi_fd_tell.apply(null, arguments); -}; - -var real____wasi_fd_write = asm["___wasi_fd_write"]; asm["___wasi_fd_write"] = function() { - assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); - assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); - return real____wasi_fd_write.apply(null, arguments); -}; - -var real____wasi_path_create_directory = asm["___wasi_path_create_directory"]; asm["___wasi_path_create_directory"] = function() { - assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); - assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); - return real____wasi_path_create_directory.apply(null, arguments); -}; - -var real____wasi_path_filestat_get = asm["___wasi_path_filestat_get"]; asm["___wasi_path_filestat_get"] = function() { - assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); - assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); - return real____wasi_path_filestat_get.apply(null, arguments); -}; - -var real____wasi_path_filestat_set_times = asm["___wasi_path_filestat_set_times"]; asm["___wasi_path_filestat_set_times"] = function() { - assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); - assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); - return real____wasi_path_filestat_set_times.apply(null, arguments); -}; - -var real____wasi_path_link = asm["___wasi_path_link"]; asm["___wasi_path_link"] = function() { - assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); - assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); - return real____wasi_path_link.apply(null, arguments); -}; - -var real____wasi_path_open = asm["___wasi_path_open"]; asm["___wasi_path_open"] = function() { - assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); - assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); - return real____wasi_path_open.apply(null, arguments); -}; - -var real____wasi_path_readlink = asm["___wasi_path_readlink"]; asm["___wasi_path_readlink"] = function() { - assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); - assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); - return real____wasi_path_readlink.apply(null, arguments); -}; - -var real____wasi_path_remove_directory = asm["___wasi_path_remove_directory"]; asm["___wasi_path_remove_directory"] = function() { - assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); - assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); - return real____wasi_path_remove_directory.apply(null, arguments); -}; - -var real____wasi_path_rename = asm["___wasi_path_rename"]; asm["___wasi_path_rename"] = function() { - assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); - assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); - return real____wasi_path_rename.apply(null, arguments); -}; - -var real____wasi_path_symlink = asm["___wasi_path_symlink"]; asm["___wasi_path_symlink"] = function() { - assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); - assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); - return real____wasi_path_symlink.apply(null, arguments); -}; - -var real____wasi_path_unlink_file = asm["___wasi_path_unlink_file"]; asm["___wasi_path_unlink_file"] = function() { - assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); - assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); - return real____wasi_path_unlink_file.apply(null, arguments); -}; - -var real____wasi_poll_oneoff = asm["___wasi_poll_oneoff"]; asm["___wasi_poll_oneoff"] = function() { - assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); - assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); - return real____wasi_poll_oneoff.apply(null, arguments); -}; - -var real____wasi_proc_exit = asm["___wasi_proc_exit"]; asm["___wasi_proc_exit"] = function() { - assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); - assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); - return real____wasi_proc_exit.apply(null, arguments); -}; - -var real____wasi_proc_raise = asm["___wasi_proc_raise"]; asm["___wasi_proc_raise"] = function() { - assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); - assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); - return real____wasi_proc_raise.apply(null, arguments); -}; - -var real____wasi_random_get = asm["___wasi_random_get"]; asm["___wasi_random_get"] = function() { - assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); - assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); - return real____wasi_random_get.apply(null, arguments); -}; - -var real____wasi_sched_yield = asm["___wasi_sched_yield"]; asm["___wasi_sched_yield"] = function() { - assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); - assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); - return real____wasi_sched_yield.apply(null, arguments); -}; - -var real____wasi_sock_recv = asm["___wasi_sock_recv"]; asm["___wasi_sock_recv"] = function() { - assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); - assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); - return real____wasi_sock_recv.apply(null, arguments); -}; - -var real____wasi_sock_send = asm["___wasi_sock_send"]; asm["___wasi_sock_send"] = function() { - assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); - assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); - return real____wasi_sock_send.apply(null, arguments); -}; - -var real____wasi_sock_shutdown = asm["___wasi_sock_shutdown"]; asm["___wasi_sock_shutdown"] = function() { - assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); - assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); - return real____wasi_sock_shutdown.apply(null, arguments); -}; - -var real__fflush = asm["_fflush"]; asm["_fflush"] = function() { - assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); - assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); - return real__fflush.apply(null, arguments); -}; - -var real__free = asm["_free"]; asm["_free"] = function() { - assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); - assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); - return real__free.apply(null, arguments); -}; - -var real__handleFiles = asm["_handleFiles"]; asm["_handleFiles"] = function() { - assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); - assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); - return real__handleFiles.apply(null, arguments); -}; - -var real__main = asm["_main"]; asm["_main"] = function() { - assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); - assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); - return real__main.apply(null, arguments); -}; - -var real__malloc = asm["_malloc"]; asm["_malloc"] = function() { - assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); - assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); - return real__malloc.apply(null, arguments); -}; - -var real__sbrk = asm["_sbrk"]; asm["_sbrk"] = function() { - assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); - assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); - return real__sbrk.apply(null, arguments); -}; - -var real_establishStackSpace = asm["establishStackSpace"]; asm["establishStackSpace"] = function() { - assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); - assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); - return real_establishStackSpace.apply(null, arguments); -}; - -var real_stackAlloc = asm["stackAlloc"]; asm["stackAlloc"] = function() { - assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); - assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); - return real_stackAlloc.apply(null, arguments); -}; - -var real_stackRestore = asm["stackRestore"]; asm["stackRestore"] = function() { - assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); - assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); - return real_stackRestore.apply(null, arguments); -}; - -var real_stackSave = asm["stackSave"]; asm["stackSave"] = function() { - assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); - assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); - return real_stackSave.apply(null, arguments); -}; -Module["asm"] = asm; -var ___errno_location = Module["___errno_location"] = function() { - assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); - assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); - return Module["asm"]["___errno_location"].apply(null, arguments) }; -var ___wasi_args_get = Module["___wasi_args_get"] = function() { - assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); - assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); - return Module["asm"]["___wasi_args_get"].apply(null, arguments) }; -var ___wasi_args_sizes_get = Module["___wasi_args_sizes_get"] = function() { - assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); - assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); - return Module["asm"]["___wasi_args_sizes_get"].apply(null, arguments) }; -var ___wasi_clock_res_get = Module["___wasi_clock_res_get"] = function() { - assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); - assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); - return Module["asm"]["___wasi_clock_res_get"].apply(null, arguments) }; -var ___wasi_clock_time_get = Module["___wasi_clock_time_get"] = function() { - assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); - assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); - return Module["asm"]["___wasi_clock_time_get"].apply(null, arguments) }; -var ___wasi_environ_get = Module["___wasi_environ_get"] = function() { - assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); - assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); - return Module["asm"]["___wasi_environ_get"].apply(null, arguments) }; -var ___wasi_environ_sizes_get = Module["___wasi_environ_sizes_get"] = function() { - assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); - assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); - return Module["asm"]["___wasi_environ_sizes_get"].apply(null, arguments) }; -var ___wasi_fd_advise = Module["___wasi_fd_advise"] = function() { - assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); - assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); - return Module["asm"]["___wasi_fd_advise"].apply(null, arguments) }; -var ___wasi_fd_allocate = Module["___wasi_fd_allocate"] = function() { - assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); - assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); - return Module["asm"]["___wasi_fd_allocate"].apply(null, arguments) }; -var ___wasi_fd_close = Module["___wasi_fd_close"] = function() { - assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); - assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); - return Module["asm"]["___wasi_fd_close"].apply(null, arguments) }; -var ___wasi_fd_datasync = Module["___wasi_fd_datasync"] = function() { - assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); - assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); - return Module["asm"]["___wasi_fd_datasync"].apply(null, arguments) }; -var ___wasi_fd_fdstat_get = Module["___wasi_fd_fdstat_get"] = function() { - assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); - assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); - return Module["asm"]["___wasi_fd_fdstat_get"].apply(null, arguments) }; -var ___wasi_fd_fdstat_set_flags = Module["___wasi_fd_fdstat_set_flags"] = function() { - assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); - assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); - return Module["asm"]["___wasi_fd_fdstat_set_flags"].apply(null, arguments) }; -var ___wasi_fd_fdstat_set_rights = Module["___wasi_fd_fdstat_set_rights"] = function() { - assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); - assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); - return Module["asm"]["___wasi_fd_fdstat_set_rights"].apply(null, arguments) }; -var ___wasi_fd_filestat_get = Module["___wasi_fd_filestat_get"] = function() { - assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); - assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); - return Module["asm"]["___wasi_fd_filestat_get"].apply(null, arguments) }; -var ___wasi_fd_filestat_set_size = Module["___wasi_fd_filestat_set_size"] = function() { - assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); - assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); - return Module["asm"]["___wasi_fd_filestat_set_size"].apply(null, arguments) }; -var ___wasi_fd_filestat_set_times = Module["___wasi_fd_filestat_set_times"] = function() { - assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); - assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); - return Module["asm"]["___wasi_fd_filestat_set_times"].apply(null, arguments) }; -var ___wasi_fd_pread = Module["___wasi_fd_pread"] = function() { - assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); - assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); - return Module["asm"]["___wasi_fd_pread"].apply(null, arguments) }; -var ___wasi_fd_prestat_dir_name = Module["___wasi_fd_prestat_dir_name"] = function() { - assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); - assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); - return Module["asm"]["___wasi_fd_prestat_dir_name"].apply(null, arguments) }; -var ___wasi_fd_prestat_get = Module["___wasi_fd_prestat_get"] = function() { - assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); - assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); - return Module["asm"]["___wasi_fd_prestat_get"].apply(null, arguments) }; -var ___wasi_fd_pwrite = Module["___wasi_fd_pwrite"] = function() { - assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); - assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); - return Module["asm"]["___wasi_fd_pwrite"].apply(null, arguments) }; -var ___wasi_fd_read = Module["___wasi_fd_read"] = function() { - assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); - assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); - return Module["asm"]["___wasi_fd_read"].apply(null, arguments) }; -var ___wasi_fd_readdir = Module["___wasi_fd_readdir"] = function() { - assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); - assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); - return Module["asm"]["___wasi_fd_readdir"].apply(null, arguments) }; -var ___wasi_fd_renumber = Module["___wasi_fd_renumber"] = function() { - assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); - assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); - return Module["asm"]["___wasi_fd_renumber"].apply(null, arguments) }; -var ___wasi_fd_seek = Module["___wasi_fd_seek"] = function() { - assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); - assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); - return Module["asm"]["___wasi_fd_seek"].apply(null, arguments) }; -var ___wasi_fd_sync = Module["___wasi_fd_sync"] = function() { - assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); - assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); - return Module["asm"]["___wasi_fd_sync"].apply(null, arguments) }; -var ___wasi_fd_tell = Module["___wasi_fd_tell"] = function() { - assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); - assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); - return Module["asm"]["___wasi_fd_tell"].apply(null, arguments) }; -var ___wasi_fd_write = Module["___wasi_fd_write"] = function() { - assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); - assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); - return Module["asm"]["___wasi_fd_write"].apply(null, arguments) }; -var ___wasi_path_create_directory = Module["___wasi_path_create_directory"] = function() { - assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); - assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); - return Module["asm"]["___wasi_path_create_directory"].apply(null, arguments) }; -var ___wasi_path_filestat_get = Module["___wasi_path_filestat_get"] = function() { - assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); - assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); - return Module["asm"]["___wasi_path_filestat_get"].apply(null, arguments) }; -var ___wasi_path_filestat_set_times = Module["___wasi_path_filestat_set_times"] = function() { - assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); - assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); - return Module["asm"]["___wasi_path_filestat_set_times"].apply(null, arguments) }; -var ___wasi_path_link = Module["___wasi_path_link"] = function() { - assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); - assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); - return Module["asm"]["___wasi_path_link"].apply(null, arguments) }; -var ___wasi_path_open = Module["___wasi_path_open"] = function() { - assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); - assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); - return Module["asm"]["___wasi_path_open"].apply(null, arguments) }; -var ___wasi_path_readlink = Module["___wasi_path_readlink"] = function() { - assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); - assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); - return Module["asm"]["___wasi_path_readlink"].apply(null, arguments) }; -var ___wasi_path_remove_directory = Module["___wasi_path_remove_directory"] = function() { - assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); - assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); - return Module["asm"]["___wasi_path_remove_directory"].apply(null, arguments) }; -var ___wasi_path_rename = Module["___wasi_path_rename"] = function() { - assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); - assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); - return Module["asm"]["___wasi_path_rename"].apply(null, arguments) }; -var ___wasi_path_symlink = Module["___wasi_path_symlink"] = function() { - assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); - assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); - return Module["asm"]["___wasi_path_symlink"].apply(null, arguments) }; -var ___wasi_path_unlink_file = Module["___wasi_path_unlink_file"] = function() { - assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); - assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); - return Module["asm"]["___wasi_path_unlink_file"].apply(null, arguments) }; -var ___wasi_poll_oneoff = Module["___wasi_poll_oneoff"] = function() { - assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); - assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); - return Module["asm"]["___wasi_poll_oneoff"].apply(null, arguments) }; -var ___wasi_proc_exit = Module["___wasi_proc_exit"] = function() { - assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); - assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); - return Module["asm"]["___wasi_proc_exit"].apply(null, arguments) }; -var ___wasi_proc_raise = Module["___wasi_proc_raise"] = function() { - assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); - assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); - return Module["asm"]["___wasi_proc_raise"].apply(null, arguments) }; -var ___wasi_random_get = Module["___wasi_random_get"] = function() { - assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); - assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); - return Module["asm"]["___wasi_random_get"].apply(null, arguments) }; -var ___wasi_sched_yield = Module["___wasi_sched_yield"] = function() { - assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); - assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); - return Module["asm"]["___wasi_sched_yield"].apply(null, arguments) }; -var ___wasi_sock_recv = Module["___wasi_sock_recv"] = function() { - assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); - assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); - return Module["asm"]["___wasi_sock_recv"].apply(null, arguments) }; -var ___wasi_sock_send = Module["___wasi_sock_send"] = function() { - assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); - assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); - return Module["asm"]["___wasi_sock_send"].apply(null, arguments) }; -var ___wasi_sock_shutdown = Module["___wasi_sock_shutdown"] = function() { - assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); - assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); - return Module["asm"]["___wasi_sock_shutdown"].apply(null, arguments) }; -var _fflush = Module["_fflush"] = function() { - assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); - assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); - return Module["asm"]["_fflush"].apply(null, arguments) }; -var _free = Module["_free"] = function() { - assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); - assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); - return Module["asm"]["_free"].apply(null, arguments) }; -var _handleFiles = Module["_handleFiles"] = function() { - assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); - assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); - return Module["asm"]["_handleFiles"].apply(null, arguments) }; -var _main = Module["_main"] = function() { - assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); - assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); - return Module["asm"]["_main"].apply(null, arguments) }; -var _malloc = Module["_malloc"] = function() { - assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); - assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); - return Module["asm"]["_malloc"].apply(null, arguments) }; -var _memcpy = Module["_memcpy"] = function() { - assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); - assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); - return Module["asm"]["_memcpy"].apply(null, arguments) }; -var _memset = Module["_memset"] = function() { - assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); - assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); - return Module["asm"]["_memset"].apply(null, arguments) }; -var _sbrk = Module["_sbrk"] = function() { - assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); - assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); - return Module["asm"]["_sbrk"].apply(null, arguments) }; -var establishStackSpace = Module["establishStackSpace"] = function() { - assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); - assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); - return Module["asm"]["establishStackSpace"].apply(null, arguments) }; -var stackAlloc = Module["stackAlloc"] = function() { - assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); - assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); - return Module["asm"]["stackAlloc"].apply(null, arguments) }; -var stackRestore = Module["stackRestore"] = function() { - assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); - assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); - return Module["asm"]["stackRestore"].apply(null, arguments) }; -var stackSave = Module["stackSave"] = function() { - assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); - assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); - return Module["asm"]["stackSave"].apply(null, arguments) }; -var dynCall_ii = Module["dynCall_ii"] = function() { - assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); - assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); - return Module["asm"]["dynCall_ii"].apply(null, arguments) }; -var dynCall_iiii = Module["dynCall_iiii"] = function() { - assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); - assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); - return Module["asm"]["dynCall_iiii"].apply(null, arguments) }; -var dynCall_v = Module["dynCall_v"] = function() { - assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); - assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); - return Module["asm"]["dynCall_v"].apply(null, arguments) }; -; - - - -// === Auto-generated postamble setup entry stuff === - -Module['asm'] = asm; - -if (!Module["intArrayFromString"]) Module["intArrayFromString"] = function() { abort("'intArrayFromString' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; -if (!Module["intArrayToString"]) Module["intArrayToString"] = function() { abort("'intArrayToString' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; -if (!Module["ccall"]) Module["ccall"] = function() { abort("'ccall' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; -if (!Module["cwrap"]) Module["cwrap"] = function() { abort("'cwrap' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; -if (!Module["setValue"]) Module["setValue"] = function() { abort("'setValue' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; -if (!Module["getValue"]) Module["getValue"] = function() { abort("'getValue' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; -if (!Module["allocate"]) Module["allocate"] = function() { abort("'allocate' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; -if (!Module["getMemory"]) Module["getMemory"] = function() { abort("'getMemory' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you") }; -if (!Module["AsciiToString"]) Module["AsciiToString"] = function() { abort("'AsciiToString' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; -if (!Module["stringToAscii"]) Module["stringToAscii"] = function() { abort("'stringToAscii' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; -if (!Module["UTF8ArrayToString"]) Module["UTF8ArrayToString"] = function() { abort("'UTF8ArrayToString' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; -if (!Module["UTF8ToString"]) Module["UTF8ToString"] = function() { abort("'UTF8ToString' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; -if (!Module["stringToUTF8Array"]) Module["stringToUTF8Array"] = function() { abort("'stringToUTF8Array' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; -if (!Module["stringToUTF8"]) Module["stringToUTF8"] = function() { abort("'stringToUTF8' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; -if (!Module["lengthBytesUTF8"]) Module["lengthBytesUTF8"] = function() { abort("'lengthBytesUTF8' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; -if (!Module["UTF16ToString"]) Module["UTF16ToString"] = function() { abort("'UTF16ToString' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; -if (!Module["stringToUTF16"]) Module["stringToUTF16"] = function() { abort("'stringToUTF16' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; -if (!Module["lengthBytesUTF16"]) Module["lengthBytesUTF16"] = function() { abort("'lengthBytesUTF16' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; -if (!Module["UTF32ToString"]) Module["UTF32ToString"] = function() { abort("'UTF32ToString' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; -if (!Module["stringToUTF32"]) Module["stringToUTF32"] = function() { abort("'stringToUTF32' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; -if (!Module["lengthBytesUTF32"]) Module["lengthBytesUTF32"] = function() { abort("'lengthBytesUTF32' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; -if (!Module["allocateUTF8"]) Module["allocateUTF8"] = function() { abort("'allocateUTF8' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; -if (!Module["stackTrace"]) Module["stackTrace"] = function() { abort("'stackTrace' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; -if (!Module["addOnPreRun"]) Module["addOnPreRun"] = function() { abort("'addOnPreRun' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; -if (!Module["addOnInit"]) Module["addOnInit"] = function() { abort("'addOnInit' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; -if (!Module["addOnPreMain"]) Module["addOnPreMain"] = function() { abort("'addOnPreMain' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; -if (!Module["addOnExit"]) Module["addOnExit"] = function() { abort("'addOnExit' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; -if (!Module["addOnPostRun"]) Module["addOnPostRun"] = function() { abort("'addOnPostRun' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; -if (!Module["writeStringToMemory"]) Module["writeStringToMemory"] = function() { abort("'writeStringToMemory' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; -if (!Module["writeArrayToMemory"]) Module["writeArrayToMemory"] = function() { abort("'writeArrayToMemory' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; -if (!Module["writeAsciiToMemory"]) Module["writeAsciiToMemory"] = function() { abort("'writeAsciiToMemory' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; -if (!Module["addRunDependency"]) Module["addRunDependency"] = function() { abort("'addRunDependency' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you") }; -if (!Module["removeRunDependency"]) Module["removeRunDependency"] = function() { abort("'removeRunDependency' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you") }; -if (!Module["ENV"]) Module["ENV"] = function() { abort("'ENV' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; -if (!Module["FS"]) Module["FS"] = function() { abort("'FS' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; -if (!Module["FS_createFolder"]) Module["FS_createFolder"] = function() { abort("'FS_createFolder' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you") }; -if (!Module["FS_createPath"]) Module["FS_createPath"] = function() { abort("'FS_createPath' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you") }; -if (!Module["FS_createDataFile"]) Module["FS_createDataFile"] = function() { abort("'FS_createDataFile' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you") }; -if (!Module["FS_createPreloadedFile"]) Module["FS_createPreloadedFile"] = function() { abort("'FS_createPreloadedFile' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you") }; -if (!Module["FS_createLazyFile"]) Module["FS_createLazyFile"] = function() { abort("'FS_createLazyFile' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you") }; -if (!Module["FS_createLink"]) Module["FS_createLink"] = function() { abort("'FS_createLink' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you") }; -if (!Module["FS_createDevice"]) Module["FS_createDevice"] = function() { abort("'FS_createDevice' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you") }; -if (!Module["FS_unlink"]) Module["FS_unlink"] = function() { abort("'FS_unlink' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you") }; -if (!Module["GL"]) Module["GL"] = function() { abort("'GL' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; -if (!Module["dynamicAlloc"]) Module["dynamicAlloc"] = function() { abort("'dynamicAlloc' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; -if (!Module["warnOnce"]) Module["warnOnce"] = function() { abort("'warnOnce' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; -if (!Module["loadDynamicLibrary"]) Module["loadDynamicLibrary"] = function() { abort("'loadDynamicLibrary' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; -if (!Module["loadWebAssemblyModule"]) Module["loadWebAssemblyModule"] = function() { abort("'loadWebAssemblyModule' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; -if (!Module["getLEB"]) Module["getLEB"] = function() { abort("'getLEB' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; -if (!Module["getFunctionTables"]) Module["getFunctionTables"] = function() { abort("'getFunctionTables' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; -if (!Module["alignFunctionTables"]) Module["alignFunctionTables"] = function() { abort("'alignFunctionTables' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; -if (!Module["registerFunctions"]) Module["registerFunctions"] = function() { abort("'registerFunctions' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; -if (!Module["addFunction"]) Module["addFunction"] = function() { abort("'addFunction' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; -if (!Module["removeFunction"]) Module["removeFunction"] = function() { abort("'removeFunction' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; -if (!Module["getFuncWrapper"]) Module["getFuncWrapper"] = function() { abort("'getFuncWrapper' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; -if (!Module["prettyPrint"]) Module["prettyPrint"] = function() { abort("'prettyPrint' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; -if (!Module["makeBigInt"]) Module["makeBigInt"] = function() { abort("'makeBigInt' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; -if (!Module["dynCall"]) Module["dynCall"] = function() { abort("'dynCall' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; -if (!Module["getCompilerSetting"]) Module["getCompilerSetting"] = function() { abort("'getCompilerSetting' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; -if (!Module["stackSave"]) Module["stackSave"] = function() { abort("'stackSave' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; -if (!Module["stackRestore"]) Module["stackRestore"] = function() { abort("'stackRestore' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; -if (!Module["stackAlloc"]) Module["stackAlloc"] = function() { abort("'stackAlloc' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; -if (!Module["establishStackSpace"]) Module["establishStackSpace"] = function() { abort("'establishStackSpace' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; -if (!Module["print"]) Module["print"] = function() { abort("'print' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; -if (!Module["printErr"]) Module["printErr"] = function() { abort("'printErr' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; -if (!Module["getTempRet0"]) Module["getTempRet0"] = function() { abort("'getTempRet0' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; -if (!Module["setTempRet0"]) Module["setTempRet0"] = function() { abort("'setTempRet0' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; -if (!Module["Pointer_stringify"]) Module["Pointer_stringify"] = function() { abort("'Pointer_stringify' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") };if (!Module["ALLOC_NORMAL"]) Object.defineProperty(Module, "ALLOC_NORMAL", { get: function() { abort("'ALLOC_NORMAL' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") } }); -if (!Module["ALLOC_STACK"]) Object.defineProperty(Module, "ALLOC_STACK", { get: function() { abort("'ALLOC_STACK' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") } }); -if (!Module["ALLOC_DYNAMIC"]) Object.defineProperty(Module, "ALLOC_DYNAMIC", { get: function() { abort("'ALLOC_DYNAMIC' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") } }); -if (!Module["ALLOC_NONE"]) Object.defineProperty(Module, "ALLOC_NONE", { get: function() { abort("'ALLOC_NONE' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") } }); - - - - -/** - * @constructor - * @extends {Error} - * @this {ExitStatus} - */ -function ExitStatus(status) { - this.name = "ExitStatus"; - this.message = "Program terminated with exit(" + status + ")"; - this.status = status; -}; -ExitStatus.prototype = new Error(); -ExitStatus.prototype.constructor = ExitStatus; - -var calledMain = false; - -dependenciesFulfilled = function runCaller() { - // If run has never been called, and we should call run (INVOKE_RUN is true, and Module.noInitialRun is not false) - if (!Module['calledRun']) run(); - if (!Module['calledRun']) dependenciesFulfilled = runCaller; // try this again later, after new deps are fulfilled -} - -Module['callMain'] = function callMain(args) { - assert(runDependencies == 0, 'cannot call main when async dependencies remain! (listen on Module["onRuntimeInitialized"])'); - assert(__ATPRERUN__.length == 0, 'cannot call main when preRun functions remain to be called'); - - args = args || []; - - ensureInitRuntime(); - - var argc = args.length+1; - var argv = stackAlloc((argc + 1) * 4); - HEAP32[argv >> 2] = allocateUTF8OnStack(Module['thisProgram']); - for (var i = 1; i < argc; i++) { - HEAP32[(argv >> 2) + i] = allocateUTF8OnStack(args[i - 1]); - } - HEAP32[(argv >> 2) + argc] = 0; - - - try { - - var ret = Module['_main'](argc, argv, 0); - - - // if we're not running an evented main loop, it's time to exit - exit(ret, /* implicit = */ true); - } - catch(e) { - if (e instanceof ExitStatus) { - // exit() throws this once it's done to make sure execution - // has been stopped completely - return; - } else if (e == 'SimulateInfiniteLoop') { - // running an evented main loop, don't immediately exit - Module['noExitRuntime'] = true; - return; - } else { - var toLog = e; - if (e && typeof e === 'object' && e.stack) { - toLog = [e, e.stack]; - } - err('exception thrown: ' + toLog); - Module['quit'](1, e); - } - } finally { - calledMain = true; - } -} - - - - -/** @type {function(Array=)} */ -function run(args) { - args = args || Module['arguments']; - - if (runDependencies > 0) { - return; - } - - writeStackCookie(); - - preRun(); - - if (runDependencies > 0) return; // a preRun added a dependency, run will be called later - if (Module['calledRun']) return; // run may have just been called through dependencies being fulfilled just in this very frame - - function doRun() { - if (Module['calledRun']) return; // run may have just been called while the async setStatus time below was happening - Module['calledRun'] = true; - - if (ABORT) return; - - ensureInitRuntime(); - - preMain(); - - if (Module['onRuntimeInitialized']) Module['onRuntimeInitialized'](); - - if (Module['_main'] && shouldRunNow) Module['callMain'](args); - - postRun(); - } - - if (Module['setStatus']) { - Module['setStatus']('Running...'); - setTimeout(function() { - setTimeout(function() { - Module['setStatus'](''); - }, 1); - doRun(); - }, 1); - } else { - doRun(); - } - checkStackCookie(); -} -Module['run'] = run; - -function checkUnflushedContent() { - // Compiler settings do not allow exiting the runtime, so flushing - // the streams is not possible. but in ASSERTIONS mode we check - // if there was something to flush, and if so tell the user they - // should request that the runtime be exitable. - // Normally we would not even include flush() at all, but in ASSERTIONS - // builds we do so just for this check, and here we see if there is any - // content to flush, that is, we check if there would have been - // something a non-ASSERTIONS build would have not seen. - // How we flush the streams depends on whether we are in FILESYSTEM=0 - // mode (which has its own special function for this; otherwise, all - // the code is inside libc) - var print = out; - var printErr = err; - var has = false; - out = err = function(x) { - has = true; - } - try { // it doesn't matter if it fails - var flush = Module['_fflush']; - if (flush) flush(0); - // also flush in the JS FS layer - var hasFS = true; - if (hasFS) { - ['stdout', 'stderr'].forEach(function(name) { - var info = FS.analyzePath('/dev/' + name); - if (!info) return; - var stream = info.object; - var rdev = stream.rdev; - var tty = TTY.ttys[rdev]; - if (tty && tty.output && tty.output.length) { - has = true; - } - }); - } - } catch(e) {} - out = print; - err = printErr; - if (has) { - warnOnce('stdio streams had content in them that was not flushed. you should set EXIT_RUNTIME to 1 (see the FAQ), or make sure to emit a newline when you printf etc.'); - } -} - -function exit(status, implicit) { - checkUnflushedContent(); - - // if this is just main exit-ing implicitly, and the status is 0, then we - // don't need to do anything here and can just leave. if the status is - // non-zero, though, then we need to report it. - // (we may have warned about this earlier, if a situation justifies doing so) - if (implicit && Module['noExitRuntime'] && status === 0) { - return; - } - - if (Module['noExitRuntime']) { - // if exit() was called, we may warn the user if the runtime isn't actually being shut down - if (!implicit) { - err('exit(' + status + ') called, but EXIT_RUNTIME is not set, so halting execution but not exiting the runtime or preventing further async execution (build with EXIT_RUNTIME=1, if you want a true shutdown)'); - } - } else { - - ABORT = true; - EXITSTATUS = status; - - exitRuntime(); - - if (Module['onExit']) Module['onExit'](status); - } - - Module['quit'](status, new ExitStatus(status)); -} - -var abortDecorators = []; - -function abort(what) { - if (Module['onAbort']) { - Module['onAbort'](what); - } - - if (what !== undefined) { - out(what); - err(what); - what = JSON.stringify(what) - } else { - what = ''; - } - - ABORT = true; - EXITSTATUS = 1; - - var extra = ''; - var output = 'abort(' + what + ') at ' + stackTrace() + extra; - if (abortDecorators) { - abortDecorators.forEach(function(decorator) { - output = decorator(output, what); - }); - } - throw output; -} -Module['abort'] = abort; - -if (Module['preInit']) { - if (typeof Module['preInit'] == 'function') Module['preInit'] = [Module['preInit']]; - while (Module['preInit'].length > 0) { - Module['preInit'].pop()(); - } -} - -// shouldRunNow refers to calling main(), not run(). -var shouldRunNow = true; -if (Module['noInitialRun']) { - shouldRunNow = false; -} - - Module["noExitRuntime"] = true; - -run(); - - - - - -// {{MODULE_ADDITIONS}} - - - - diff --git a/backends/conrod_crayon/tools/polyfill.wasm b/backends/conrod_crayon/tools/polyfill.wasm deleted file mode 100644 index 56aed638cc49cfe05704a8786bc3563513e8b45d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 75469 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 { @@ -30,7 +29,7 @@ WebAssembly.instantiate = (bufferSource, importObject) => Promise.all([ init("./dist/native_bg.wasm") ]).then(function(){ -console.log("done"); + console.log("done"); }); // vim: set ts=2 sw=2 et: diff --git a/backends/conrod_crayon/tools/wasm-template/index1.js b/backends/conrod_crayon/tools/wasm-template/index1.js new file mode 100644 index 000000000..20b20ee13 --- /dev/null +++ b/backends/conrod_crayon/tools/wasm-template/index1.js @@ -0,0 +1,38 @@ + +import wasi_unstable from "./dist/polyfill.js"; +const ws = require("ws"); +import init from "./dist/native" +// FIXME dirty hack for wasm_syscall +for (var p in Module){ + console.log("p",p); +} +const env = { + rust_wasm_syscall: (index, data) => { + console.log("rust_wasm_syscall", index, data); + // See https://github.com/rust-lang/rust/blob/master/src/libstd/sys/wasm/mod.rs + switch (index) { + case 6: + return 1; + default: + return 0; + } + } +}; + +const instantiateStreaming = WebAssembly.instantiateStreaming; +WebAssembly.instantiateStreaming = (source, importObject) => + instantiateStreaming(source, { + ...importObject, + env,ws + }); +const instantiate = WebAssembly.instantiate; +WebAssembly.instantiate = (bufferSource, importObject) => + instantiate(bufferSource, { + ...importObject, + env,ws + }); + // init("./dist/native_bg.wasm") + + + +// vim: set ts=2 sw=2 et: diff --git a/backends/conrod_crayon/tools/wasm-template/package-lock.json b/backends/conrod_crayon/tools/wasm-template/package-lock.json index 73f209b54..e620eb898 100644 --- a/backends/conrod_crayon/tools/wasm-template/package-lock.json +++ b/backends/conrod_crayon/tools/wasm-template/package-lock.json @@ -379,6 +379,11 @@ "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=", "dev": true }, + "async-limiter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz", + "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==" + }, "atob": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", @@ -2108,8 +2113,7 @@ "ansi-regex": { "version": "2.1.1", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "aproba": { "version": "1.2.0", @@ -2130,14 +2134,12 @@ "balanced-match": { "version": "1.0.0", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "brace-expansion": { "version": "1.1.11", "bundled": true, "dev": true, - "optional": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -2152,20 +2154,17 @@ "code-point-at": { "version": "1.1.0", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "concat-map": { "version": "0.0.1", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "console-control-strings": { "version": "1.1.0", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "core-util-is": { "version": "1.0.2", @@ -2282,8 +2281,7 @@ "inherits": { "version": "2.0.3", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "ini": { "version": "1.3.5", @@ -2295,7 +2293,6 @@ "version": "1.0.0", "bundled": true, "dev": true, - "optional": true, "requires": { "number-is-nan": "^1.0.0" } @@ -2310,7 +2307,6 @@ "version": "3.0.4", "bundled": true, "dev": true, - "optional": true, "requires": { "brace-expansion": "^1.1.7" } @@ -2318,14 +2314,12 @@ "minimist": { "version": "0.0.8", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "minipass": { "version": "2.2.4", "bundled": true, "dev": true, - "optional": true, "requires": { "safe-buffer": "^5.1.1", "yallist": "^3.0.0" @@ -2344,7 +2338,6 @@ "version": "0.5.1", "bundled": true, "dev": true, - "optional": true, "requires": { "minimist": "0.0.8" } @@ -2425,8 +2418,7 @@ "number-is-nan": { "version": "1.0.1", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "object-assign": { "version": "4.1.1", @@ -2438,7 +2430,6 @@ "version": "1.4.0", "bundled": true, "dev": true, - "optional": true, "requires": { "wrappy": "1" } @@ -2524,8 +2515,7 @@ "safe-buffer": { "version": "5.1.1", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "safer-buffer": { "version": "2.1.2", @@ -2561,7 +2551,6 @@ "version": "1.0.2", "bundled": true, "dev": true, - "optional": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -2581,7 +2570,6 @@ "version": "3.0.1", "bundled": true, "dev": true, - "optional": true, "requires": { "ansi-regex": "^2.0.0" } @@ -2625,14 +2613,12 @@ "wrappy": { "version": "1.0.2", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "yallist": { "version": "3.0.2", "bundled": true, - "dev": true, - "optional": true + "dev": true } } }, @@ -6131,6 +6117,14 @@ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true }, + "ws": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.0.0.tgz", + "integrity": "sha512-cknCal4k0EAOrh1SHHPPWWh4qm93g1IuGGGwBjWkXmCG7LsDtL8w9w+YVfaF+KSVwiHQKDIMsSLBVftKf9d1pg==", + "requires": { + "async-limiter": "^1.0.0" + } + }, "xregexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-4.0.0.tgz", diff --git a/backends/conrod_crayon/tools/wasm-template/package.json b/backends/conrod_crayon/tools/wasm-template/package.json index e4ca83d99..6ed0231d1 100644 --- a/backends/conrod_crayon/tools/wasm-template/package.json +++ b/backends/conrod_crayon/tools/wasm-template/package.json @@ -9,5 +9,8 @@ "webpack": "^4.29.6", "webpack-cli": "^3.2.3", "webpack-dev-server": "^3.2.1" + }, + "dependencies": { + "ws": "^7.0.0" } } diff --git a/backends/conrod_crayon/tools/wasm-template/run.1.sh b/backends/conrod_crayon/tools/wasm-template/run.1.sh index e47c81a2d..3b0a3ad86 100755 --- a/backends/conrod_crayon/tools/wasm-template/run.1.sh +++ b/backends/conrod_crayon/tools/wasm-template/run.1.sh @@ -7,7 +7,7 @@ rm -rf $SCRIPT_DIR/dist mkdir $SCRIPT_DIR/dist mkdir $SCRIPT_DIR/dist/intermediate cp $BASE_DIR/target/wasm32-unknown-wasi/debug/examples/$1.wasm $SCRIPT_DIR/dist/intermediate/native.wasm -wasm-bindgen $SCRIPT_DIR/dist/intermediate/native.wasm --out-dir $SCRIPT_DIR/dist --no-typescript +wasm-bindgen --target web $SCRIPT_DIR/dist/intermediate/native.wasm --out-dir $SCRIPT_DIR/dist --no-typescript cp ../polyfill.js $SCRIPT_DIR/dist/polyfill.js cp ../polyfill.wasm $SCRIPT_DIR/dist/polyfill.wasm cd $SCRIPT_DIR \ No newline at end of file diff --git a/backends/conrod_crayon/tools/wasm-template/webpack.config.js b/backends/conrod_crayon/tools/wasm-template/webpack.config.js index a909e22ee..0a477b19a 100644 --- a/backends/conrod_crayon/tools/wasm-template/webpack.config.js +++ b/backends/conrod_crayon/tools/wasm-template/webpack.config.js @@ -3,7 +3,7 @@ const HtmlWebpackPlugin = require('html-webpack-plugin'); const webpack = require('webpack'); module.exports = { - entry: './index.js', + entry: './index1.js', output: { path: path.resolve(__dirname, 'dist'), filename: 'index.js', @@ -23,5 +23,9 @@ module.exports = { contentBase: [__dirname, path.join(__dirname, '../../../../assets/crayon')], port: 8080 }, + node: { + fs: "empty" + }, + externals: [ 'utf-8-validate', 'bufferutil'], mode: 'development' }; \ No newline at end of file diff --git a/backends/conrod_glium/src/lib.rs b/backends/conrod_glium/src/lib.rs index b93f3c409..15bd106ff 100644 --- a/backends/conrod_glium/src/lib.rs +++ b/backends/conrod_glium/src/lib.rs @@ -407,7 +407,6 @@ impl GlyphCache { F: glium::backend::Facade, { let (w, h) = facade.get_context().get_framebuffer_dimensions(); - println!("inii {:?}",(w,h)); Self::with_dimensions(facade, w, h) } @@ -514,7 +513,6 @@ impl Renderer { // Framebuffer dimensions and the "dots per inch" factor. let (screen_w, screen_h) = display.get_framebuffer_dimensions(); - println!("dim {:?} {:?}",screen_w,screen_h); let (win_w, win_h) = (screen_w as Scalar, screen_h as Scalar); let half_win_w = win_w / 2.0; let half_win_h = win_h / 2.0; @@ -544,7 +542,7 @@ impl Renderer { height: std::cmp::min(height, screen_h), } }; - + println!("kk"); // Draw each primitive in order of depth. while let Some(primitive) = primitives.next_primitive() { let render::Primitive { kind, scizzor, rect, .. } = primitive; @@ -616,8 +614,9 @@ impl Renderer { mode: MODE_GEOMETRY, } }; - + for triangle in triangles { + println!("t: ({:?},{:?},{:?})",v(triangle[0]).position,v(triangle[1]).position,v(triangle[2]).position); vertices.push(v(triangle[0])); vertices.push(v(triangle[1])); vertices.push(v(triangle[2])); @@ -661,7 +660,6 @@ impl Renderer { // Cache the glyphs on the GPU. cache.cache_queued(|rect, data| { - println!("rect2 {:?}",rect); let w = rect.width(); let h = rect.height(); let glium_rect = glium::Rect { @@ -687,7 +685,6 @@ impl Renderer { // The text cache is only ever created with U8 or U8U8U8 formats. _ => unreachable!(), }; - println!("data {:?} {:?} {:?}",data,w,h); let image = glium::texture::RawImage2d { data: data, width: w, @@ -713,7 +710,6 @@ impl Renderer { let mut l =0; for g in positioned_glyphs { if let Ok(Some((uv_rect, screen_rect))) = cache.rect_for(cache_id, g) { - println!("g {:?} {:?}",cache_id,g); let gl_rect = to_gl_rect(screen_rect); let v = |p, t| Vertex { position: p, @@ -729,7 +725,6 @@ impl Renderer { push_v([gl_rect.max.x, gl_rect.max.y], [uv_rect.max.x, uv_rect.max.y]); push_v([gl_rect.min.x, gl_rect.max.y], [uv_rect.min.x, uv_rect.max.y]); l = l+1; - println!("mm {:?}",(uv_rect, screen_rect)); } } @@ -876,7 +871,6 @@ impl Renderer { // // Only submit the vertices if there is enough for at least one triangle. Draw::Image(image_id, slice) => if slice.len() >= NUM_VERTICES_IN_TRIANGLE { - println!("slice {:?}",slice); let vertex_buffer = glium::VertexBuffer::new(facade, slice).unwrap(); if let Some(image) = image_map.get(&image_id) { let image_uniforms = uniform! { diff --git a/backends/conrod_svg/Cargo.toml b/backends/conrod_svg/Cargo.toml new file mode 100644 index 000000000..20925dfac --- /dev/null +++ b/backends/conrod_svg/Cargo.toml @@ -0,0 +1,23 @@ +[package] +name = "conrod_svg" +version = "0.62.0" +authors = ["Mitchell Nordine "] +keywords = ["ui", "widgets", "gui", "interface", "graphics"] +description = "An easy-to-use, 100% Rust, extensible 2D GUI library." +license = "MIT OR Apache-2.0" +readme = "../../README.md" +repository = "https://github.com/pistondevelopers/conrod.git" +homepage = "https://github.com/pistondevelopers/conrod" +documentation = "https://docs.rs/conrod" +categories = ["gui"] + +[lib] +name = "conrod_svg" +path = "./src/lib.rs" + +[dependencies] +conrod_core = { path = "../../conrod_core", version = "0.63" } +conrod_example_shared = { path = "../conrod_example_shared", version = "0.63" } +svg = "0.5.12" +serde_json = "1.0" +cgmath = "0.16.1" diff --git a/backends/conrod_svg/src/lib.rs b/backends/conrod_svg/src/lib.rs new file mode 100644 index 000000000..e69de29bb diff --git a/conrod_core/Cargo.toml b/conrod_core/Cargo.toml index 357d08ddb..995908d41 100644 --- a/conrod_core/Cargo.toml +++ b/conrod_core/Cargo.toml @@ -24,3 +24,4 @@ fnv = "1.0" num = "0.2" pistoncore-input = "0.24" rusttype = { version = "0.7", features = ["gpu_cache"] } +polygon2 = "0.3" \ No newline at end of file diff --git a/conrod_core/src/lib.rs b/conrod_core/src/lib.rs index ab382b55a..f81dfde2a 100644 --- a/conrod_core/src/lib.rs +++ b/conrod_core/src/lib.rs @@ -14,6 +14,7 @@ extern crate fnv; extern crate num; extern crate input as piston_input; extern crate rusttype; +extern crate polygon2; pub use color::{Color, Colorable}; pub use conrod_derive::*; diff --git a/conrod_core/src/render.rs b/conrod_core/src/render.rs index 6254cfa6a..2e006eefd 100644 --- a/conrod_core/src/render.rs +++ b/conrod_core/src/render.rs @@ -487,6 +487,7 @@ impl<'a> Primitives<'a> { let color = style.get_color(theme); let points = state.points.iter().cloned(); + match *style { ShapeStyle::Fill(_) => { @@ -497,6 +498,7 @@ impl<'a> Primitives<'a> { &triangles[..] }, }; + let kind = PrimitiveKind::TrianglesSingleColor { color: color.to_rgb(), triangles: &triangles, diff --git a/conrod_core/src/widget/primitive/shape/polygon.rs b/conrod_core/src/widget/primitive/shape/polygon.rs index 8d9ecb24f..aa4daf1f4 100644 --- a/conrod_core/src/widget/primitive/shape/polygon.rs +++ b/conrod_core/src/widget/primitive/shape/polygon.rs @@ -6,7 +6,8 @@ use super::Style; use widget; use widget::triangles::Triangle; use utils::{bounding_box_for_points, vec2_add, vec2_sub}; - +use polygon2::{triangulate}; +use std::iter::once; /// A basic, non-interactive, arbitrary **Polygon** widget. /// @@ -232,6 +233,17 @@ impl Widget for Polygon state.update(|state| state.points.truncate(total)), None => (), } + + //let t_s = points.as_slice(); + let triangles = triangulate(&state.points); + println!("triangles {:?}",triangles); + let mut points_k = vec![]; + + for ta in triangles{ + points_k.push([state.points[ta][0],state.points[ta][1]]); + } + println!("kk{:?}",points_k); + state.update(|state| state.points=points_k); } // Check whether or not we need to centre the points. @@ -272,6 +284,7 @@ pub fn triangles(points: I) -> Option> where I: IntoIterator, { let mut points = points.into_iter(); + /* let first = match points.next() { Some(p) => p, None => return None, @@ -280,9 +293,10 @@ pub fn triangles(points: I) -> Option> Some(p) => p, None => return None, }; + */ Some(Triangles { - first: first, - prev: prev, + first: [0.0,0.0], + prev: [0.0,0.0], points: points, }) } @@ -292,11 +306,24 @@ impl Iterator for Triangles { type Item = Triangle; fn next(&mut self) -> Option { - self.points.next().map(|point| { + /*self.points.next().map(|point| { let t = Triangle([self.first, self.prev, point]); self.prev = point; t - }) + })*/ + let first = match self.points.next() { + Some(p) => p, + None => return None, + }; + let prev = match self.points.next() { + Some(p) => p, + None => return None, + }; + let point = match self.points.next() { + Some(p) => p, + None => return None, + }; + Some(Triangle([first, prev, point])) } } From e53fc3a5c6c46bf58349141e2b8c89ba369e2219 Mon Sep 17 00:00:00 2001 From: alanpoon Date: Thu, 30 May 2019 18:22:45 +0800 Subject: [PATCH 42/64] spacebar --- .../tools/wasm-template/package-lock.json | 28 +++- backends/conrod_glium/src/lib.rs | 2 - conrod_core/Cargo.toml | 3 +- conrod_core/src/lib.rs | 1 + conrod_core/src/render.rs | 2 +- conrod_core/src/ui.rs | 7 +- .../src/widget/primitive/shape/polygon.rs | 128 +++++++++++------- 7 files changed, 108 insertions(+), 63 deletions(-) diff --git a/backends/conrod_crayon/tools/wasm-template/package-lock.json b/backends/conrod_crayon/tools/wasm-template/package-lock.json index e620eb898..b0a3e9d08 100644 --- a/backends/conrod_crayon/tools/wasm-template/package-lock.json +++ b/backends/conrod_crayon/tools/wasm-template/package-lock.json @@ -2134,12 +2134,14 @@ "balanced-match": { "version": "1.0.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "brace-expansion": { "version": "1.1.11", "bundled": true, "dev": true, + "optional": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -2154,17 +2156,20 @@ "code-point-at": { "version": "1.1.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "concat-map": { "version": "0.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "console-control-strings": { "version": "1.1.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "core-util-is": { "version": "1.0.2", @@ -2281,7 +2286,8 @@ "inherits": { "version": "2.0.3", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "ini": { "version": "1.3.5", @@ -2293,6 +2299,7 @@ "version": "1.0.0", "bundled": true, "dev": true, + "optional": true, "requires": { "number-is-nan": "^1.0.0" } @@ -2307,6 +2314,7 @@ "version": "3.0.4", "bundled": true, "dev": true, + "optional": true, "requires": { "brace-expansion": "^1.1.7" } @@ -2314,12 +2322,14 @@ "minimist": { "version": "0.0.8", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "minipass": { "version": "2.2.4", "bundled": true, "dev": true, + "optional": true, "requires": { "safe-buffer": "^5.1.1", "yallist": "^3.0.0" @@ -2338,6 +2348,7 @@ "version": "0.5.1", "bundled": true, "dev": true, + "optional": true, "requires": { "minimist": "0.0.8" } @@ -2418,7 +2429,8 @@ "number-is-nan": { "version": "1.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "object-assign": { "version": "4.1.1", @@ -2430,6 +2442,7 @@ "version": "1.4.0", "bundled": true, "dev": true, + "optional": true, "requires": { "wrappy": "1" } @@ -2551,6 +2564,7 @@ "version": "1.0.2", "bundled": true, "dev": true, + "optional": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", diff --git a/backends/conrod_glium/src/lib.rs b/backends/conrod_glium/src/lib.rs index 15bd106ff..e6f64ea63 100644 --- a/backends/conrod_glium/src/lib.rs +++ b/backends/conrod_glium/src/lib.rs @@ -542,7 +542,6 @@ impl Renderer { height: std::cmp::min(height, screen_h), } }; - println!("kk"); // Draw each primitive in order of depth. while let Some(primitive) = primitives.next_primitive() { let render::Primitive { kind, scizzor, rect, .. } = primitive; @@ -616,7 +615,6 @@ impl Renderer { }; for triangle in triangles { - println!("t: ({:?},{:?},{:?})",v(triangle[0]).position,v(triangle[1]).position,v(triangle[2]).position); vertices.push(v(triangle[0])); vertices.push(v(triangle[1])); vertices.push(v(triangle[2])); diff --git a/conrod_core/Cargo.toml b/conrod_core/Cargo.toml index 995908d41..1c3c86ec2 100644 --- a/conrod_core/Cargo.toml +++ b/conrod_core/Cargo.toml @@ -24,4 +24,5 @@ fnv = "1.0" num = "0.2" pistoncore-input = "0.24" rusttype = { version = "0.7", features = ["gpu_cache"] } -polygon2 = "0.3" \ No newline at end of file +polygon2 = {path = "../../rs-polygon2"} +rtriangulate = "0.3.1" \ No newline at end of file diff --git a/conrod_core/src/lib.rs b/conrod_core/src/lib.rs index f81dfde2a..7e0c44f43 100644 --- a/conrod_core/src/lib.rs +++ b/conrod_core/src/lib.rs @@ -15,6 +15,7 @@ extern crate num; extern crate input as piston_input; extern crate rusttype; extern crate polygon2; +extern crate rtriangulate; pub use color::{Color, Colorable}; pub use conrod_derive::*; diff --git a/conrod_core/src/render.rs b/conrod_core/src/render.rs index 2e006eefd..87deb5215 100644 --- a/conrod_core/src/render.rs +++ b/conrod_core/src/render.rs @@ -491,7 +491,7 @@ impl<'a> Primitives<'a> { match *style { ShapeStyle::Fill(_) => { - let triangles = match widget::polygon::triangles(points) { + let triangles = match widget::polygon::triangles(points,state.reflect,state.white_points_index) { None => &[], Some(iter) => { triangles.extend(iter); diff --git a/conrod_core/src/ui.rs b/conrod_core/src/ui.rs index 26fe70453..d126398b0 100644 --- a/conrod_core/src/ui.rs +++ b/conrod_core/src/ui.rs @@ -9,10 +9,9 @@ use std::sync::atomic::{self, AtomicUsize}; use fnv; use text; use theme::Theme; -use utils; use widget::{self, Widget}; use cursor; - +use utils; /// A constructor type for building a `Ui` instance with a set of optional parameters. pub struct UiBuilder { /// The initial dimensions of the window in which the `Ui` exists. @@ -447,7 +446,6 @@ impl Ui { // Keep track of pressed buttons in the current input::State. let xy = self.global_input.current.mouse.xy; - println!("xy {:?}",xy); let widget = self.global_input.current.widget_under_mouse; self.global_input.current.mouse.buttons.press(mouse_button, xy, widget); }, @@ -623,7 +621,7 @@ impl Ui { // 2. `WidgetUncapturesMouse` // 3. `WidgetCapturesMouse` Input::Motion(motion) => { - + // Create a `Motion` event. let move_ = event::Motion { motion: motion, @@ -700,7 +698,6 @@ impl Ui { fn offset_is_at_bound(scroll: &widget::scroll::State, additional_offset: Scalar) -> bool { - use utils; fn approx_eq(a: Scalar, b: Scalar) -> bool { (a - b).abs() < 0.000001 diff --git a/conrod_core/src/widget/primitive/shape/polygon.rs b/conrod_core/src/widget/primitive/shape/polygon.rs index aa4daf1f4..d65cf3c10 100644 --- a/conrod_core/src/widget/primitive/shape/polygon.rs +++ b/conrod_core/src/widget/primitive/shape/polygon.rs @@ -7,8 +7,7 @@ use widget; use widget::triangles::Triangle; use utils::{bounding_box_for_points, vec2_add, vec2_sub}; use polygon2::{triangulate}; -use std::iter::once; - +use rtriangulate; /// A basic, non-interactive, arbitrary **Polygon** widget. /// /// The **Polygon** is described by specifying its corners in order. @@ -26,6 +25,10 @@ pub struct Polygon { pub style: Style, /// Whether or not the points should be automatically centred to the widget position. pub maybe_shift_to_centre_from: Option, + /// reflect y-axis after triangulation + pub reflect:bool, + /// Removes faces formed in these points, white_points_index + pub white_points_index: Option } /// Unique state for the **Polygon**. @@ -35,6 +38,10 @@ pub struct State { kind: Kind, /// An owned version of the points yielded by the **Polygon**'s `points` iterator. pub points: Vec, + /// reflect y-axis after triangulation + pub reflect:bool, + /// Removes faces formed in these points, white_points_index + pub white_points_index: Option } /// Whether the rectangle is drawn as an outline or a filled color. @@ -50,8 +57,6 @@ pub enum Kind { /// edges. #[derive(Clone)] pub struct Triangles { - first: Point, - prev: Point, points: I, } @@ -64,7 +69,9 @@ impl Polygon { points: points, common: widget::CommonBuilder::default(), style: style, + reflect:false, maybe_shift_to_centre_from: None, + white_points_index:None } } @@ -200,6 +207,8 @@ impl Widget for Polygon State { kind: Kind::Fill, points: Vec::new(), + white_points_index:None, + reflect: false } } @@ -215,8 +224,8 @@ impl Widget for Polygon fn update(self, args: widget::UpdateArgs) -> Self::Event { use utils::{iter_diff, IterDiff}; let widget::UpdateArgs { rect, state, style, .. } = args; - let Polygon { points, maybe_shift_to_centre_from, .. } = self; - + let Polygon { points, maybe_shift_to_centre_from,reflect,white_points_index, .. } = self; + // A function that compares the given points iterator to the points currently owned by // `State` and updates only if necessary. fn update_points(state: &mut widget::State, points: I) @@ -233,17 +242,7 @@ impl Widget for Polygon state.update(|state| state.points.truncate(total)), None => (), } - - //let t_s = points.as_slice(); - let triangles = triangulate(&state.points); - println!("triangles {:?}",triangles); - let mut points_k = vec![]; - - for ta in triangles{ - points_k.push([state.points[ta][0],state.points[ta][1]]); - } - println!("kk{:?}",points_k); - state.update(|state| state.points=points_k); + } // Check whether or not we need to centre the points. @@ -251,7 +250,8 @@ impl Widget for Polygon Some(original) => { let xy = rect.xy(); let difference = vec2_sub(xy, original); - update_points(state, points.into_iter().map(|point| vec2_add(point, difference))) + let point_iter = points.into_iter().map(|point| vec2_add(point, difference)); + update_points(state,point_iter) }, None => update_points(state, points), } @@ -264,6 +264,12 @@ impl Widget for Polygon if state.kind != kind { state.update(|state| state.kind = kind); } + if state.reflect != reflect { + state.update(|state| state.reflect = reflect); + } + if state.white_points_index != white_points_index { + state.update(|state| state.white_points_index = white_points_index); + } } } @@ -276,28 +282,69 @@ impl Colorable for Polygon { } } +implPolygon{ + /// Reflect y-axis + pub fn reflect(mut self) ->Self{ + self.reflect = true; + self + } + /// Set White points, Remove faces form in these points + pub fn white_points_index(mut self,white_points_index:usize)->Self + { + self.white_points_index = Some(white_points_index); + self + } +} /// Triangulate the polygon given as a list of `Point`s describing its sides. /// /// Returns `None` if the given iterator yields less than two points. -pub fn triangles(points: I) -> Option> +pub fn triangles(points: I,reflect:bool,white_points_index:Option) -> Option> where I: IntoIterator, { - let mut points = points.into_iter(); - /* - let first = match points.next() { - Some(p) => p, - None => return None, - }; - let prev = match points.next() { - Some(p) => p, - None => return None, - }; - */ + + //let points = points.into_iter(); + points.extend([2.0,2.0]); + let mut points_c = points.into_iter().collect::>(); + let mut points_k = vec![]; + if let None = white_points_index{ + let triangles = triangulate(&points_c); + + let l = if reflect{ + -1.0 + }else{ + 1.0 + }; + for ta in triangles{ + points_k.push([points_c[ta][0],l*points_c[ta][1]]); + } + }else if let Some(white_index) = white_points_index{ + let s = points_c.split_at(white_index-1).clone(); + let subject = s.1; + let clip = s.0; + let det = points_c.iter().map(|t| rtriangulate::TriangulationPoint::new(t[0],t[1])).collect::>>(); + let det_clip = clip.iter().map(|t| rtriangulate::TriangulationPoint::new(t[0],t[1])).collect::>>(); + let subject_triangles = rtriangulate::triangulate(&det).unwrap(); + let clip_triangles = rtriangulate::triangulate(&det_clip).unwrap(); + for i in subject_triangles{ + let mut in_white =false; + let rtriangulate::Triangle(p1,p2,p3) = i; + for y in &clip_triangles{ + let rtriangulate::Triangle(y1,y2,y3) = y; + if p1*p1+p2*p2+p3*p3 == y1*y1+y2*y2+y3*y3{ + in_white = true; + break; + } + } + if !in_white{ + points_k.push(points_c.get(p1.clone()).unwrap().clone()); + points_k.push(points_c.get(p2.clone()).unwrap().clone()); + points_k.push(points_c.get(p3.clone()).unwrap().clone()); + } + } + } Some(Triangles { - first: [0.0,0.0], - prev: [0.0,0.0], - points: points, + points: points_k.into_iter(), }) } @@ -306,24 +353,11 @@ impl Iterator for Triangles { type Item = Triangle; fn next(&mut self) -> Option { - /*self.points.next().map(|point| { - let t = Triangle([self.first, self.prev, point]); - self.prev = point; - t - })*/ - let first = match self.points.next() { - Some(p) => p, - None => return None, - }; - let prev = match self.points.next() { - Some(p) => p, - None => return None, - }; let point = match self.points.next() { Some(p) => p, None => return None, }; - Some(Triangle([first, prev, point])) + Some(Triangle([point])) } } From 3d78edc04c035dd03de75eac040d5b96af2d86a5 Mon Sep 17 00:00:00 2001 From: alanpoon Date: Fri, 31 May 2019 01:23:13 +0800 Subject: [PATCH 43/64] revert back --- conrod_core/Cargo.toml | 4 +- conrod_core/src/lib.rs | 2 - conrod_core/src/render.rs | 2 +- .../src/widget/primitive/shape/polygon.rs | 111 ++++-------------- 4 files changed, 27 insertions(+), 92 deletions(-) diff --git a/conrod_core/Cargo.toml b/conrod_core/Cargo.toml index 1c3c86ec2..f4046cd1e 100644 --- a/conrod_core/Cargo.toml +++ b/conrod_core/Cargo.toml @@ -23,6 +23,4 @@ daggy = "0.5" fnv = "1.0" num = "0.2" pistoncore-input = "0.24" -rusttype = { version = "0.7", features = ["gpu_cache"] } -polygon2 = {path = "../../rs-polygon2"} -rtriangulate = "0.3.1" \ No newline at end of file +rusttype = { version = "0.7", features = ["gpu_cache"] } \ No newline at end of file diff --git a/conrod_core/src/lib.rs b/conrod_core/src/lib.rs index 7e0c44f43..ab382b55a 100644 --- a/conrod_core/src/lib.rs +++ b/conrod_core/src/lib.rs @@ -14,8 +14,6 @@ extern crate fnv; extern crate num; extern crate input as piston_input; extern crate rusttype; -extern crate polygon2; -extern crate rtriangulate; pub use color::{Color, Colorable}; pub use conrod_derive::*; diff --git a/conrod_core/src/render.rs b/conrod_core/src/render.rs index 87deb5215..2e006eefd 100644 --- a/conrod_core/src/render.rs +++ b/conrod_core/src/render.rs @@ -491,7 +491,7 @@ impl<'a> Primitives<'a> { match *style { ShapeStyle::Fill(_) => { - let triangles = match widget::polygon::triangles(points,state.reflect,state.white_points_index) { + let triangles = match widget::polygon::triangles(points) { None => &[], Some(iter) => { triangles.extend(iter); diff --git a/conrod_core/src/widget/primitive/shape/polygon.rs b/conrod_core/src/widget/primitive/shape/polygon.rs index d65cf3c10..8d9ecb24f 100644 --- a/conrod_core/src/widget/primitive/shape/polygon.rs +++ b/conrod_core/src/widget/primitive/shape/polygon.rs @@ -6,8 +6,8 @@ use super::Style; use widget; use widget::triangles::Triangle; use utils::{bounding_box_for_points, vec2_add, vec2_sub}; -use polygon2::{triangulate}; -use rtriangulate; + + /// A basic, non-interactive, arbitrary **Polygon** widget. /// /// The **Polygon** is described by specifying its corners in order. @@ -25,10 +25,6 @@ pub struct Polygon { pub style: Style, /// Whether or not the points should be automatically centred to the widget position. pub maybe_shift_to_centre_from: Option, - /// reflect y-axis after triangulation - pub reflect:bool, - /// Removes faces formed in these points, white_points_index - pub white_points_index: Option } /// Unique state for the **Polygon**. @@ -38,10 +34,6 @@ pub struct State { kind: Kind, /// An owned version of the points yielded by the **Polygon**'s `points` iterator. pub points: Vec, - /// reflect y-axis after triangulation - pub reflect:bool, - /// Removes faces formed in these points, white_points_index - pub white_points_index: Option } /// Whether the rectangle is drawn as an outline or a filled color. @@ -57,6 +49,8 @@ pub enum Kind { /// edges. #[derive(Clone)] pub struct Triangles { + first: Point, + prev: Point, points: I, } @@ -69,9 +63,7 @@ impl Polygon { points: points, common: widget::CommonBuilder::default(), style: style, - reflect:false, maybe_shift_to_centre_from: None, - white_points_index:None } } @@ -207,8 +199,6 @@ impl Widget for Polygon State { kind: Kind::Fill, points: Vec::new(), - white_points_index:None, - reflect: false } } @@ -224,8 +214,8 @@ impl Widget for Polygon fn update(self, args: widget::UpdateArgs) -> Self::Event { use utils::{iter_diff, IterDiff}; let widget::UpdateArgs { rect, state, style, .. } = args; - let Polygon { points, maybe_shift_to_centre_from,reflect,white_points_index, .. } = self; - + let Polygon { points, maybe_shift_to_centre_from, .. } = self; + // A function that compares the given points iterator to the points currently owned by // `State` and updates only if necessary. fn update_points(state: &mut widget::State, points: I) @@ -242,7 +232,6 @@ impl Widget for Polygon state.update(|state| state.points.truncate(total)), None => (), } - } // Check whether or not we need to centre the points. @@ -250,8 +239,7 @@ impl Widget for Polygon Some(original) => { let xy = rect.xy(); let difference = vec2_sub(xy, original); - let point_iter = points.into_iter().map(|point| vec2_add(point, difference)); - update_points(state,point_iter) + update_points(state, points.into_iter().map(|point| vec2_add(point, difference))) }, None => update_points(state, points), } @@ -264,12 +252,6 @@ impl Widget for Polygon if state.kind != kind { state.update(|state| state.kind = kind); } - if state.reflect != reflect { - state.update(|state| state.reflect = reflect); - } - if state.white_points_index != white_points_index { - state.update(|state| state.white_points_index = white_points_index); - } } } @@ -282,69 +264,26 @@ impl Colorable for Polygon { } } -implPolygon{ - /// Reflect y-axis - pub fn reflect(mut self) ->Self{ - self.reflect = true; - self - } - /// Set White points, Remove faces form in these points - pub fn white_points_index(mut self,white_points_index:usize)->Self - { - self.white_points_index = Some(white_points_index); - self - } -} /// Triangulate the polygon given as a list of `Point`s describing its sides. /// /// Returns `None` if the given iterator yields less than two points. -pub fn triangles(points: I,reflect:bool,white_points_index:Option) -> Option> +pub fn triangles(points: I) -> Option> where I: IntoIterator, { - - //let points = points.into_iter(); - points.extend([2.0,2.0]); - let mut points_c = points.into_iter().collect::>(); - let mut points_k = vec![]; - if let None = white_points_index{ - let triangles = triangulate(&points_c); - - let l = if reflect{ - -1.0 - }else{ - 1.0 - }; - for ta in triangles{ - points_k.push([points_c[ta][0],l*points_c[ta][1]]); - } - }else if let Some(white_index) = white_points_index{ - let s = points_c.split_at(white_index-1).clone(); - let subject = s.1; - let clip = s.0; - let det = points_c.iter().map(|t| rtriangulate::TriangulationPoint::new(t[0],t[1])).collect::>>(); - let det_clip = clip.iter().map(|t| rtriangulate::TriangulationPoint::new(t[0],t[1])).collect::>>(); - let subject_triangles = rtriangulate::triangulate(&det).unwrap(); - let clip_triangles = rtriangulate::triangulate(&det_clip).unwrap(); - for i in subject_triangles{ - let mut in_white =false; - let rtriangulate::Triangle(p1,p2,p3) = i; - for y in &clip_triangles{ - let rtriangulate::Triangle(y1,y2,y3) = y; - if p1*p1+p2*p2+p3*p3 == y1*y1+y2*y2+y3*y3{ - in_white = true; - break; - } - } - if !in_white{ - points_k.push(points_c.get(p1.clone()).unwrap().clone()); - points_k.push(points_c.get(p2.clone()).unwrap().clone()); - points_k.push(points_c.get(p3.clone()).unwrap().clone()); - } - } - } + let mut points = points.into_iter(); + let first = match points.next() { + Some(p) => p, + None => return None, + }; + let prev = match points.next() { + Some(p) => p, + None => return None, + }; Some(Triangles { - points: points_k.into_iter(), + first: first, + prev: prev, + points: points, }) } @@ -353,11 +292,11 @@ impl Iterator for Triangles { type Item = Triangle; fn next(&mut self) -> Option { - let point = match self.points.next() { - Some(p) => p, - None => return None, - }; - Some(Triangle([point])) + self.points.next().map(|point| { + let t = Triangle([self.first, self.prev, point]); + self.prev = point; + t + }) } } From 081528d2f80bf0c61372bba0fc8d17a06e61fe05 Mon Sep 17 00:00:00 2001 From: alanpoon Date: Sat, 1 Jun 2019 21:00:54 +0800 Subject: [PATCH 44/64] remove println! --- conrod_core/src/ui.rs | 3 --- 1 file changed, 3 deletions(-) diff --git a/conrod_core/src/ui.rs b/conrod_core/src/ui.rs index d126398b0..c0704e7d9 100644 --- a/conrod_core/src/ui.rs +++ b/conrod_core/src/ui.rs @@ -419,7 +419,6 @@ impl Ui { }; let widget = self.global_input.current.widget_capturing_mouse; let press_event = event::Ui::Press(widget, press).into(); - println!("press"); self.global_input.push_event(press_event); if let MouseButton::Left = mouse_button { @@ -427,7 +426,6 @@ impl Ui { if let Some(idx) = self.global_input.current.widget_capturing_keyboard { if Some(idx) != self.global_input.current.widget_under_mouse { let source = input::Source::Keyboard; - println!("press_O {:?}",idx); let event = event::Ui::WidgetUncapturesInputSource(idx, source); self.global_input.push_event(event.into()); self.global_input.current.widget_capturing_keyboard = None; @@ -436,7 +434,6 @@ impl Ui { // Check to see if we need to capture the keyboard. if let Some(idx) = self.global_input.current.widget_under_mouse { - println!("press_2 {:?}",idx); let source = input::Source::Keyboard; let event = event::Ui::WidgetCapturesInputSource(idx, source); self.global_input.push_event(event.into()); From 1aaa7f3d40446ae9161b9efe643bd71cdc625ba1 Mon Sep 17 00:00:00 2001 From: alanpoon Date: Sun, 9 Jun 2019 23:01:02 +0800 Subject: [PATCH 45/64] try cache --- azure-pipelines.yml | 10 ++++++++++ backends/conrod_crayon/src/events.rs | 25 ++++++++++++++++++++++--- 2 files changed, 32 insertions(+), 3 deletions(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 58a881697..ce0d0e504 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -15,7 +15,17 @@ steps: - script: echo Hello, world! displayName: 'Run a one-line script' - script: cargo install wasm-bindgen-cli +- task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1 + inputs: + keyfile: '**/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' + targetfolder: '**/node_modules, !**/node_modules/**/node_modules' + vstsFeed: '$(ArtifactFeed)' - script: cd backends/conrod_crayon/tools/wasm-template && npm install +- task: 1ESLighthouseEng.PipelineArtifactCaching.SaveCacheV1.SaveCache@1 + inputs: + keyfile: '**/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' + targetfolder: '**/node_modules, !**/node_modules/**/node_modules' + vstsFeed: '$(ArtifactFeed)' - script: cd backends/conrod_crayon/tools/wasm-template && npm ls | grep webpack displayName: webpack version - script: backends/conrod_crayon/tools/wasm-template/run.sh crayon diff --git a/backends/conrod_crayon/src/events.rs b/backends/conrod_crayon/src/events.rs index 943190b2d..c6614ec2c 100644 --- a/backends/conrod_crayon/src/events.rs +++ b/backends/conrod_crayon/src/events.rs @@ -3,11 +3,12 @@ use conrod_core::input::Button::Keyboard; use conrod_core::input::Motion; use conrod_core::Ui; use crayon::prelude::*; - -pub fn convert_event(ui:&mut Ui){ +use std::time::Instant; +pub fn convert_event(ui:&mut Ui)->Option{ let mouse_presses = input::mouse_presses(); let w = ui.win_w; let h = ui.win_h; + let mut action_time = None; for mp in mouse_presses.iter(){ let e = match mp{ crayon::input::mouse::MouseButton::Left => conrod_core::input::state::mouse::Button::Left, @@ -16,6 +17,9 @@ pub fn convert_event(ui:&mut Ui){ crayon::input::mouse::MouseButton::Other(_j) => conrod_core::input::state::mouse::Button::Unknown }; ui.handle_event(Input::Press(conrod_core::input::Button::Mouse(e))); + if let None = action_time{ + action_time = Some(Instant::now()); + } } let mouse_releases = input::mouse_releases(); for mp in mouse_releases.iter(){ @@ -26,18 +30,27 @@ pub fn convert_event(ui:&mut Ui){ crayon::input::mouse::MouseButton::Other(_j) => conrod_core::input::state::mouse::Button::Unknown }; ui.handle_event(Input::Release(conrod_core::input::Button::Mouse(e))); + if let None = action_time{ + action_time = Some(Instant::now()); + } } let key_presses = input::key_presses(); for kp in key_presses.iter(){ let e = key_convert(serde_json::to_string(kp).unwrap()); let ee:conrod_core::input::keyboard::Key = serde_json::from_str(&e).unwrap(); ui.handle_event(Input::Press(Keyboard(ee))); + if let None = action_time{ + action_time = Some(Instant::now()); + } } let key_releases = input::key_releases(); for kp in key_releases.iter(){ let e = key_convert(serde_json::to_string(kp).unwrap()); let ee:conrod_core::input::keyboard::Key = serde_json::from_str(&e).unwrap(); ui.handle_event(Input::Release(Keyboard(ee))); + if let None = action_time{ + action_time = Some(Instant::now()); + } } let j = input::mouse_position(); @@ -45,14 +58,20 @@ pub fn convert_event(ui:&mut Ui){ let j = input::mouse_scroll(); if j.x > 0.0 || j.y >0.0{ ui.handle_event(Input::Motion(Motion::Scroll{x:(j.x as f64)-w/2.0,y:(j.y as f64)-h/2.0})); + if let None = action_time{ + action_time = Some(Instant::now()); + } } for k in input::chars(){ if k != '\u{8}'{ ui.handle_event(Input::Text(k.to_string())); } + if let None = action_time{ + action_time = Some(Instant::now()); + } } - + action_time } pub fn key_convert(j:String)->String{ From 015248d236fb06c20cd0d97cf1b59de0fdc67657 Mon Sep 17 00:00:00 2001 From: alanpoon Date: Mon, 10 Jun 2019 07:47:37 +0800 Subject: [PATCH 46/64] kcache --- azure-pipelines.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index ce0d0e504..eb73401a9 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -12,19 +12,19 @@ pool: steps: - template: ci/azure-install-rust.yml - template: ci/azure-install-node.yml -- script: echo Hello, world! +- script: which cargo displayName: 'Run a one-line script' -- script: cargo install wasm-bindgen-cli - task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1 - inputs: - keyfile: '**/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' - targetfolder: '**/node_modules, !**/node_modules/**/node_modules' + inputs: + keyfile: '**/package-lock.json, !**/node_modules/**/package-lock.json, Cargo.lock, Cargo.lock, Cargo.lock' + targetfolder: '**/node_modules, !**/node_modules/**/node_modules, target/debug/.fingerprint, target/debug/build, target/debug/deps, /usr/local/cargo/registry' vstsFeed: '$(ArtifactFeed)' +- script: cargo install wasm-bindgen-cli - script: cd backends/conrod_crayon/tools/wasm-template && npm install - task: 1ESLighthouseEng.PipelineArtifactCaching.SaveCacheV1.SaveCache@1 inputs: - keyfile: '**/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' - targetfolder: '**/node_modules, !**/node_modules/**/node_modules' + keyfile: '**/package-lock.json, !**/node_modules/**/package-lock.json, Cargo.lock, Cargo.lock, Cargo.lock' + targetfolder: '**/node_modules, !**/node_modules/**/node_modules, target/debug/.fingerprint, target/debug/build, target/debug/deps, /usr/local/cargo/registry' vstsFeed: '$(ArtifactFeed)' - script: cd backends/conrod_crayon/tools/wasm-template && npm ls | grep webpack displayName: webpack version From d32e1bceccbbb9ff552a369f3f946af0c2f24e19 Mon Sep 17 00:00:00 2001 From: alanpoon Date: Mon, 10 Jun 2019 07:50:34 +0800 Subject: [PATCH 47/64] kcache2 --- azure-pipelines.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index eb73401a9..8a3dc3245 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -15,7 +15,7 @@ steps: - script: which cargo displayName: 'Run a one-line script' - task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1 - inputs: + inputs: keyfile: '**/package-lock.json, !**/node_modules/**/package-lock.json, Cargo.lock, Cargo.lock, Cargo.lock' targetfolder: '**/node_modules, !**/node_modules/**/node_modules, target/debug/.fingerprint, target/debug/build, target/debug/deps, /usr/local/cargo/registry' vstsFeed: '$(ArtifactFeed)' From 38bebacd2094a52137957ed1e444fdfee7c9ca89 Mon Sep 17 00:00:00 2001 From: alan poon Date: Mon, 10 Jun 2019 12:55:14 +0800 Subject: [PATCH 48/64] install xargo --- azure-pipelines.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 8a3dc3245..3a8c60ae8 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -20,6 +20,7 @@ steps: targetfolder: '**/node_modules, !**/node_modules/**/node_modules, target/debug/.fingerprint, target/debug/build, target/debug/deps, /usr/local/cargo/registry' vstsFeed: '$(ArtifactFeed)' - script: cargo install wasm-bindgen-cli +- script: cargo install xargo - script: cd backends/conrod_crayon/tools/wasm-template && npm install - task: 1ESLighthouseEng.PipelineArtifactCaching.SaveCacheV1.SaveCache@1 inputs: From eac9de43a112af57f21c1fb0a4791ca39b0bd8e1 Mon Sep 17 00:00:00 2001 From: alanpoon Date: Sat, 15 Jun 2019 14:08:50 +0800 Subject: [PATCH 49/64] added crayon to 0.65 --- backends/conrod_crayon/Cargo.toml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/backends/conrod_crayon/Cargo.toml b/backends/conrod_crayon/Cargo.toml index 5275849e4..105c53044 100644 --- a/backends/conrod_crayon/Cargo.toml +++ b/backends/conrod_crayon/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "conrod_crayon" -version = "0.62.0" +version = "0.65.0" authors = ["Mitchell Nordine "] keywords = ["ui", "widgets", "gui", "interface", "graphics"] description = "An easy-to-use, 100% Rust, extensible 2D GUI library." @@ -16,9 +16,9 @@ name = "conrod_crayon" path = "./src/lib.rs" [dependencies] -conrod_core = { path = "../../conrod_core", version = "0.63" } +conrod_core = { path = "../../conrod_core", version = "0.65" } crayon = { path = "../../../wasm/crayon"} -conrod_example_shared = { path = "../conrod_example_shared", version = "0.63" } +conrod_example_shared = { path = "../conrod_example_shared", version = "0.65" } serde_json = "1.0" crayon_bytes = { path = "../../../wasm/crayon/modules/bytes"} cgmath = "0.16.1" From 0a2a33ff1ab8ef898ae88ae58d5d1f5788dea5bb Mon Sep 17 00:00:00 2001 From: alanpoon Date: Wed, 19 Jun 2019 08:21:30 +0800 Subject: [PATCH 50/64] y --- backends/conrod_crayon/Cargo.toml | 2 +- backends/conrod_crayon/src/events.rs | 2 +- backends/conrod_crayon/src/lib.rs | 8 +++++--- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/backends/conrod_crayon/Cargo.toml b/backends/conrod_crayon/Cargo.toml index 105c53044..18c12c6c1 100644 --- a/backends/conrod_crayon/Cargo.toml +++ b/backends/conrod_crayon/Cargo.toml @@ -22,7 +22,7 @@ conrod_example_shared = { path = "../conrod_example_shared", version = "0.65" } serde_json = "1.0" crayon_bytes = { path = "../../../wasm/crayon/modules/bytes"} cgmath = "0.16.1" - +instant = "0.1" [target.'cfg(target_arch = "wasm32")'.dependencies] wasm-bindgen = "0.2.43" diff --git a/backends/conrod_crayon/src/events.rs b/backends/conrod_crayon/src/events.rs index c6614ec2c..db628f4e7 100644 --- a/backends/conrod_crayon/src/events.rs +++ b/backends/conrod_crayon/src/events.rs @@ -3,7 +3,7 @@ use conrod_core::input::Button::Keyboard; use conrod_core::input::Motion; use conrod_core::Ui; use crayon::prelude::*; -use std::time::Instant; +use instant::Instant; pub fn convert_event(ui:&mut Ui)->Option{ let mouse_presses = input::mouse_presses(); let w = ui.win_w; diff --git a/backends/conrod_crayon/src/lib.rs b/backends/conrod_crayon/src/lib.rs index 4e5702ed8..c98ddc73c 100644 --- a/backends/conrod_crayon/src/lib.rs +++ b/backends/conrod_crayon/src/lib.rs @@ -2,6 +2,7 @@ extern crate crayon; extern crate conrod_core; extern crate serde_json; extern crate cgmath; +extern crate instant; use crayon::impl_vertex; use crayon::prelude::*; use crayon::errors::Result; @@ -80,7 +81,6 @@ impl GlyphCache { /// dimensions. pub fn new(dim:(f64,f64)) -> Result { - println!("inii {:?}",dim); Self::with_dimensions(dim.0 as u32, dim.1 as u32) } @@ -128,9 +128,11 @@ impl Renderer{ .with("tex", UniformVariableType::Texture) .finish(); let mut params = ShaderParams::default(); - params.state.color_blend = Some((crayon::video::assets::shader::Equation::Add, + + params.state.color_blend = Some((crayon::video::assets::shader::Equation::Add, crayon::video::assets::shader::BlendFactor::Value(crayon::video::assets::shader::BlendValue::SourceAlpha), crayon::video::assets::shader::BlendFactor::OneMinusValue(crayon::video::assets::shader::BlendValue::SourceAlpha))); + params.state.color_write = (true,true,true,false); params.attributes = attributes; params.uniforms = uniforms; @@ -140,7 +142,7 @@ impl Renderer{ let shader = video::create_shader(params.clone(), vs, fs).unwrap(); let mut params = SurfaceParams::default(); - params.set_clear(Color::gray(), None, None); + //params.set_clear(Color::transparent(), None, None); let vert:Vec = Vec::new(); let commands:Vec = Vec::new(); let surface = video::create_surface(params).unwrap(); From 92ba6c5512ba68c460e564e9c5b708f35ab6f808 Mon Sep 17 00:00:00 2001 From: alanpoon Date: Fri, 21 Jun 2019 22:40:49 +0800 Subject: [PATCH 51/64] prevents inherent conrod clear color --- backends/conrod_crayon/src/lib.rs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/backends/conrod_crayon/src/lib.rs b/backends/conrod_crayon/src/lib.rs index c98ddc73c..cc68d168e 100644 --- a/backends/conrod_crayon/src/lib.rs +++ b/backends/conrod_crayon/src/lib.rs @@ -132,7 +132,6 @@ impl Renderer{ params.state.color_blend = Some((crayon::video::assets::shader::Equation::Add, crayon::video::assets::shader::BlendFactor::Value(crayon::video::assets::shader::BlendValue::SourceAlpha), crayon::video::assets::shader::BlendFactor::OneMinusValue(crayon::video::assets::shader::BlendValue::SourceAlpha))); - params.state.color_write = (true,true,true,false); params.attributes = attributes; params.uniforms = uniforms; @@ -142,7 +141,7 @@ impl Renderer{ let shader = video::create_shader(params.clone(), vs, fs).unwrap(); let mut params = SurfaceParams::default(); - //params.set_clear(Color::transparent(), None, None); + params.set_clear(None, None, None); let vert:Vec = Vec::new(); let commands:Vec = Vec::new(); let surface = video::create_surface(params).unwrap(); @@ -231,7 +230,6 @@ impl Renderer{ render::PrimitiveKind::Rectangle { color } => { switch_to_plain_state!(); let color = gamma_srgb_to_linear(color.to_fsa()); - let (l, r, b, t) = rect.l_r_b_t(); let v = |x, y| { Vertex::new([vx(x),vy(y)],[0.0,0.0],color,MODE_GEOMETRY) From 0f9b6b20a649de076a32d3786f82669952a479d1 Mon Sep 17 00:00:00 2001 From: alanpoon Date: Wed, 26 Jun 2019 21:01:57 +0800 Subject: [PATCH 52/64] use instant --- backends/conrod_crayon/Cargo.toml | 4 +- backends/conrod_crayon/examples/crayon.rs | 1 - .../tools/wasm-template/index.html | 4 +- .../tools/wasm-template/package-lock.json | 1641 ++++++++--------- .../tools/wasm-template/package.json | 7 +- .../tools/wasm-template/run.3.sh | 11 + .../tools/wasm-template/webpack.config.js | 10 +- backends/conrod_ggez/Cargo.toml | 8 +- backends/conrod_svg/Cargo.toml | 6 +- conrod_core/Cargo.toml | 2 +- conrod_core/src/lib.rs | 1 + conrod_core/src/ui.rs | 1 + 12 files changed, 828 insertions(+), 868 deletions(-) create mode 100755 backends/conrod_crayon/tools/wasm-template/run.3.sh diff --git a/backends/conrod_crayon/Cargo.toml b/backends/conrod_crayon/Cargo.toml index 18c12c6c1..d130beceb 100644 --- a/backends/conrod_crayon/Cargo.toml +++ b/backends/conrod_crayon/Cargo.toml @@ -22,7 +22,7 @@ conrod_example_shared = { path = "../conrod_example_shared", version = "0.65" } serde_json = "1.0" crayon_bytes = { path = "../../../wasm/crayon/modules/bytes"} cgmath = "0.16.1" -instant = "0.1" +instant = {path="../../../wasm/instant", version="0.1.1", features = [ "wasm-bindgen","now" ]} [target.'cfg(target_arch = "wasm32")'.dependencies] -wasm-bindgen = "0.2.43" +wasm-bindgen = "0.2.47" diff --git a/backends/conrod_crayon/examples/crayon.rs b/backends/conrod_crayon/examples/crayon.rs index 5edc02743..b7d64a3bb 100644 --- a/backends/conrod_crayon/examples/crayon.rs +++ b/backends/conrod_crayon/examples/crayon.rs @@ -9,7 +9,6 @@ use crayon_bytes::prelude::*; use crayon::window::device_pixel_ratio; use conrod_crayon::Renderer; use conrod_example_shared::{WIN_W, WIN_H}; -use std::time::SystemTime; use std::collections::HashMap; use conrod_core::{color,Colorable, widget, Widget,Positionable,event::{Input},Sizeable,Labelable}; use conrod_core::text::{Font,FontCollection}; diff --git a/backends/conrod_crayon/tools/wasm-template/index.html b/backends/conrod_crayon/tools/wasm-template/index.html index f05867bc6..3dfae1b3e 100644 --- a/backends/conrod_crayon/tools/wasm-template/index.html +++ b/backends/conrod_crayon/tools/wasm-template/index.html @@ -5,6 +5,8 @@ +

- + \ No newline at end of file diff --git a/backends/conrod_crayon/tools/wasm-template/package-lock.json b/backends/conrod_crayon/tools/wasm-template/package-lock.json index b0a3e9d08..bea3e8cb7 100644 --- a/backends/conrod_crayon/tools/wasm-template/package-lock.json +++ b/backends/conrod_crayon/tools/wasm-template/package-lock.json @@ -2,6 +2,40 @@ "requires": true, "lockfileVersion": 1, "dependencies": { + "@open-wc/webpack-import-meta-loader": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@open-wc/webpack-import-meta-loader/-/webpack-import-meta-loader-0.2.4.tgz", + "integrity": "sha512-QgESyG7BXaGLCLq0+iUOSS8nzZSfpz5wI/whXqpk+BpCj6+jnAqkyIxJ2CfybT1xK0Y1pemRw4t84syZ2JhFkg==" + }, + "@types/events": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz", + "integrity": "sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g==", + "dev": true + }, + "@types/glob": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.1.tgz", + "integrity": "sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w==", + "dev": true, + "requires": { + "@types/events": "*", + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "@types/minimatch": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", + "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", + "dev": true + }, + "@types/node": { + "version": "12.0.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.0.10.tgz", + "integrity": "sha512-LcsGbPomWsad6wmMNv7nBLw7YYYyfdYcz6xryKYQhx89c3XXan+8Q6AJ43G5XDIaklaVkK3mE4fCb0SBvMiPSQ==", + "dev": true + }, "@webassemblyjs/ast": { "version": "1.8.5", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.8.5.tgz", @@ -181,7 +215,7 @@ "@xtuc/ieee754": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha1-7vAUoxRa5Hehy8AM0eVSM23Ot5A=", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", "dev": true }, "@xtuc/long": { @@ -191,13 +225,13 @@ "dev": true }, "accepts": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", - "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", "dev": true, "requires": { - "mime-types": "~2.1.18", - "negotiator": "0.6.1" + "mime-types": "~2.1.24", + "negotiator": "0.6.2" } }, "acorn": { @@ -209,13 +243,13 @@ "acorn-dynamic-import": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-4.0.0.tgz", - "integrity": "sha1-SCIQFAWCo2uDw+NC4c/ryqkkCUg=", + "integrity": "sha512-d3OEjQV4ROpoflsnUA8HozoIR504TFxNivYEUi6uwz0IYhBkTDXGuWlNdMtybRt3nqVx/L6XqMt0FxkXuWKZhw==", "dev": true }, "ajv": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.5.4.tgz", - "integrity": "sha512-4Wyjt8+t6YszqaXnLDfMmG/8AlO5Zbcsy3ATHncCzjW/NoPzAId8AK6749Ybjmdt+kUY1gP60fCu46oDxPv/mg==", + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz", + "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==", "dev": true, "requires": { "fast-deep-equal": "^2.0.1", @@ -225,21 +259,21 @@ } }, "ajv-errors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.0.tgz", - "integrity": "sha1-7PAh+hCP0X37Xms4Py3SM+Mf/Fk=", + "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 }, "ajv-keywords": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.2.0.tgz", - "integrity": "sha1-6GuBnGAs+IIa1jdBNpjx3sAhhHo=", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.0.tgz", + "integrity": "sha512-aUjdRFISbuFOl0EIZc+9e4FfZp0bDZgAdOOf30bJmw8VM9v84SHyVyxDfbWxpGYbdZD/9XoKxfHVNmxPkhwyGw==", "dev": true }, "ansi-colors": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.1.tgz", - "integrity": "sha512-Xt+zb6nqgvV9SWAVp0EG3lRsHcbq5DDgqjPPz6pwgtj6RKz65zGXMNa82oJfOSBA/to6GmRP7Dr+6o+kbApTzQ==", + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", + "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==", "dev": true }, "ansi-html": { @@ -266,17 +300,28 @@ "anymatch": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha1-vLJLTzeTTZqnrBe0ra+J58du8us=", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", "dev": true, "requires": { "micromatch": "^3.1.4", "normalize-path": "^2.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } } }, "aproba": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha1-aALmJk79GMeQobDVF/DyYnvyyUo=", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", "dev": true }, "arr-diff": { @@ -288,7 +333,7 @@ "arr-flatten": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha1-NgSLv/TntH4TZkQxbJlmnqWukfE=", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", "dev": true }, "arr-union": { @@ -327,7 +372,7 @@ "asn1.js": { "version": "4.10.1", "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", - "integrity": "sha1-ucK/WAXx5kqt7tbfOiv6+1pz9aA=", + "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", "dev": true, "requires": { "bn.js": "^4.0.0", @@ -336,11 +381,12 @@ } }, "assert": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz", - "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", + "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", "dev": true, "requires": { + "object-assign": "^4.1.1", "util": "0.10.3" }, "dependencies": { @@ -374,9 +420,9 @@ "dev": true }, "async-each": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", - "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", + "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", "dev": true }, "async-limiter": { @@ -387,7 +433,7 @@ "atob": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha1-bZUX654DDSQ2ZmZR6GvZ9vE1M8k=", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", "dev": true }, "balanced-match": { @@ -399,7 +445,7 @@ "base": { "version": "0.11.2", "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha1-e95c7RRbbVUakNuH+DxVi060io8=", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", "dev": true, "requires": { "cache-base": "^1.0.1", @@ -423,7 +469,7 @@ "is-accessor-descriptor": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "requires": { "kind-of": "^6.0.0" @@ -432,7 +478,7 @@ "is-data-descriptor": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "requires": { "kind-of": "^6.0.0" @@ -441,7 +487,7 @@ "is-descriptor": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, "requires": { "is-accessor-descriptor": "^1.0.0", @@ -454,7 +500,7 @@ "base64-js": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", - "integrity": "sha1-yrHmEY8FEJXli1KBrqjBzSK/wOM=", + "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==", "dev": true }, "batch": { @@ -470,39 +516,47 @@ "dev": true }, "binary-extensions": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.12.0.tgz", - "integrity": "sha1-wteA9T1Fu6gxeokC1M7q86Y4WxQ=", + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", "dev": true }, "bluebird": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.3.tgz", - "integrity": "sha1-fQHG+WFsmlGrD4xUmnnf5uwz76c=", + "version": "3.5.5", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.5.tgz", + "integrity": "sha512-5am6HnnfN+urzt4yfg7IgTbotDjIT/u8AJpEt0sIU9FtXfVeezXAPKswrG+xKUCOYAINpSdgZVDU6QFh+cuH3w==", "dev": true }, "bn.js": { "version": "4.11.8", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", - "integrity": "sha1-LN4J617jQfSEdGuwMJsyU7GxRC8=", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", "dev": true }, "body-parser": { - "version": "1.18.3", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz", - "integrity": "sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ=", + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", "dev": true, "requires": { - "bytes": "3.0.0", + "bytes": "3.1.0", "content-type": "~1.0.4", "debug": "2.6.9", "depd": "~1.1.2", - "http-errors": "~1.6.3", - "iconv-lite": "0.4.23", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", "on-finished": "~2.3.0", - "qs": "6.5.2", - "raw-body": "2.3.3", - "type-is": "~1.6.16" + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" + }, + "dependencies": { + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "dev": true + } } }, "bonjour": { @@ -528,7 +582,7 @@ "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha1-PH/L9SnYcibz0vUrlm/1Jx60Qd0=", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "requires": { "balanced-match": "^1.0.0", @@ -538,7 +592,7 @@ "braces": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha1-WXn9PxTNUxVl5fot8av/8d+u5yk=", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", "dev": true, "requires": { "arr-flatten": "^1.1.0", @@ -573,7 +627,7 @@ "browserify-aes": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "integrity": "sha1-Mmc0ZC9APavDADIJhTu3CtQo70g=", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", "dev": true, "requires": { "buffer-xor": "^1.0.3", @@ -587,7 +641,7 @@ "browserify-cipher": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", - "integrity": "sha1-jWR0wbhwv9q807z8wZNKEOlPFfA=", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", "dev": true, "requires": { "browserify-aes": "^1.0.4", @@ -598,7 +652,7 @@ "browserify-des": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", - "integrity": "sha1-OvTx9Zg5QDVy8cZiBDdfen9wPpw=", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", "dev": true, "requires": { "cipher-base": "^1.0.1", @@ -635,7 +689,7 @@ "browserify-zlib": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", - "integrity": "sha1-KGlFnZqjviRf6P4sofRuLn9U1z8=", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", "dev": true, "requires": { "pako": "~1.0.5" @@ -663,7 +717,7 @@ "buffer-from": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha1-MnE7wCj3XAL9txDXx7zsHyxgcO8=", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", "dev": true }, "buffer-indexof": { @@ -691,39 +745,31 @@ "dev": true }, "cacache": { - "version": "11.3.2", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-11.3.2.tgz", - "integrity": "sha1-LYHjCOPSWMo4Eltna5iyrJzmm/o=", + "version": "11.3.3", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-11.3.3.tgz", + "integrity": "sha512-p8WcneCytvzPxhDvYp31PD039vi77I12W+/KfR9S8AZbaiARFBCpsPJS+9uhWfeBfeAtW7o/4vt3MUqLkbY6nA==", "dev": true, "requires": { - "bluebird": "^3.5.3", + "bluebird": "^3.5.5", "chownr": "^1.1.1", "figgy-pudding": "^3.5.1", - "glob": "^7.1.3", + "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.2", + "rimraf": "^2.6.3", "ssri": "^6.0.1", "unique-filename": "^1.1.1", "y18n": "^4.0.0" - }, - "dependencies": { - "graceful-fs": { - "version": "4.1.15", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", - "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", - "dev": true - } } }, "cache-base": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha1-Cn9GQWgxyLZi7jb+TnxZ129marI=", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", "dev": true, "requires": { "collection-visit": "^1.0.0", @@ -748,9 +794,9 @@ } }, "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true }, "chalk": { @@ -765,36 +811,35 @@ } }, "chokidar": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.4.tgz", - "integrity": "sha1-NW/04rDo5D4yLRijckYLvPOszSY=", + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.6.tgz", + "integrity": "sha512-V2jUo67OKkc6ySiRpJrjlpJKl9kDuG+Xb8VgsGzb+aEouhgS1D0weyPU4lEzdAcsCAvrih2J2BqyXqHWvVLw5g==", "dev": true, "requires": { "anymatch": "^2.0.0", - "async-each": "^1.0.0", - "braces": "^2.3.0", - "fsevents": "^1.2.2", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", "glob-parent": "^3.1.0", - "inherits": "^2.0.1", + "inherits": "^2.0.3", "is-binary-path": "^1.0.0", "is-glob": "^4.0.0", - "lodash.debounce": "^4.0.8", - "normalize-path": "^2.1.1", + "normalize-path": "^3.0.0", "path-is-absolute": "^1.0.0", - "readdirp": "^2.0.0", - "upath": "^1.0.5" + "readdirp": "^2.2.1", + "upath": "^1.1.1" } }, "chownr": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.1.tgz", - "integrity": "sha1-VHJri4//TfBTxCGH6AH7RBLfFJQ=", + "integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==", "dev": true }, "chrome-trace-event": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.0.tgz", - "integrity": "sha1-Rakb0sIMlBHwljtarrmhuV4JzEg=", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz", + "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==", "dev": true, "requires": { "tslib": "^1.9.0" @@ -803,7 +848,7 @@ "cipher-base": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha1-h2Dk7MJy9MNjUy+SbYdKriwTl94=", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", "dev": true, "requires": { "inherits": "^2.0.1", @@ -813,7 +858,7 @@ "class-utils": { "version": "0.3.6", "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha1-+TNprouafOAv1B+q0MqDAzGQxGM=", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", "dev": true, "requires": { "arr-union": "^3.1.0", @@ -845,7 +890,7 @@ "cliui": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", - "integrity": "sha1-NIQi2+gtgAswIu709qwQvy5NG0k=", + "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", "dev": true, "requires": { "string-width": "^2.1.1", @@ -914,39 +959,31 @@ "dev": true }, "component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", "dev": true }, "compressible": { - "version": "2.0.16", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.16.tgz", - "integrity": "sha512-JQfEOdnI7dASwCuSPWIeVYwc/zMsu/+tRhoUvEfXz2gxOA2DNjmG5vhtFdBlhWPPGo+RdT9S3tgc/uH5qgDiiA==", + "version": "2.0.17", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.17.tgz", + "integrity": "sha512-BGHeLCK1GV7j1bSmQQAi26X+GgWcTjLr/0tzSvMCl3LH1w1IJ4PFSPoV5316b30cneTziC+B1a+3OjoSUcQYmw==", "dev": true, "requires": { - "mime-db": ">= 1.38.0 < 2" - }, - "dependencies": { - "mime-db": { - "version": "1.38.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.38.0.tgz", - "integrity": "sha512-bqVioMFFzc2awcdJZIzR3HjZFX20QhilVS7hytkKrv7xFAn8bM1gzc/FOX2awLISvWe0PV8ptFKcon+wZ5qYkg==", - "dev": true - } + "mime-db": ">= 1.40.0 < 2" } }, "compression": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.3.tgz", - "integrity": "sha512-HSjyBG5N1Nnz7tF2+O7A9XUhyjru71/fwgNb7oIsEVHR0WShfs2tIS/EySLgiTe98aOK18YDlMXpzjCXY/n9mg==", + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", "dev": true, "requires": { "accepts": "~1.3.5", "bytes": "3.0.0", - "compressible": "~2.0.14", + "compressible": "~2.0.16", "debug": "2.6.9", - "on-headers": "~1.0.1", + "on-headers": "~1.0.2", "safe-buffer": "5.1.2", "vary": "~1.1.2" } @@ -960,7 +997,7 @@ "concat-stream": { "version": "1.6.2", "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha1-kEvfGUzTEi/Gdcd/xKw9T/D9GjQ=", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", "dev": true, "requires": { "buffer-from": "^1.0.0", @@ -978,7 +1015,7 @@ "readable-stream": { "version": "2.3.6", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha1-sRwn2IuP8fvgcGQ8+UsMea4bCq8=", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { "core-util-is": "~1.0.0", @@ -993,7 +1030,7 @@ "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "requires": { "safe-buffer": "~5.1.0" @@ -1023,21 +1060,24 @@ "dev": true }, "content-disposition": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", - "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=", - "dev": true + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "dev": true, + "requires": { + "safe-buffer": "5.1.2" + } }, "content-type": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha1-4TjMdeBAxyexlm/l5fjJruJW/js=", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", "dev": true }, "cookie": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", - "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=", + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", "dev": true }, "cookie-signature": { @@ -1049,7 +1089,7 @@ "copy-concurrently": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", - "integrity": "sha1-kilzmMrjSTf8r9bsgTnBgFHwteA=", + "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", "dev": true, "requires": { "aproba": "^1.1.1", @@ -1075,7 +1115,7 @@ "create-ecdh": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", - "integrity": "sha1-yREbbzMEXEaX8UR4f5JUzcd8Rf8=", + "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", "dev": true, "requires": { "bn.js": "^4.1.0", @@ -1085,7 +1125,7 @@ "create-hash": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha1-iJB4rxGmN1a8+1m9IhmWvjqe8ZY=", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", "dev": true, "requires": { "cipher-base": "^1.0.1", @@ -1098,7 +1138,7 @@ "create-hmac": { "version": "1.1.7", "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "integrity": "sha1-aRcMeLOrlXFHsriwRXLkfq0iQ/8=", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", "dev": true, "requires": { "cipher-base": "^1.0.3", @@ -1112,7 +1152,7 @@ "cross-spawn": { "version": "6.0.5", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha1-Sl7Hxk364iw6FBJNus3uhG2Ay8Q=", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", "dev": true, "requires": { "nice-try": "^1.0.4", @@ -1125,7 +1165,7 @@ "crypto-browserify": { "version": "3.12.0", "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", - "integrity": "sha1-OWz58xN/A+S45TLFj2mCVOAPgOw=", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", "dev": true, "requires": { "browserify-cipher": "^1.0.0", @@ -1174,20 +1214,17 @@ "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "requires": { "ms": "2.0.0" } }, "decamelize": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-2.0.0.tgz", - "integrity": "sha512-Ikpp5scV3MSYxY39ymh45ZLEecsTdv/Xj2CaQfI8RLMuwi7XvjX9H/fhraiSuU+C5w5NTDu4ZU72xNiZnurBPg==", - "dev": true, - "requires": { - "xregexp": "4.0.0" - } + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true }, "decode-uri-component": { "version": "0.2.0", @@ -1209,32 +1246,6 @@ "requires": { "execa": "^1.0.0", "ip-regex": "^2.1.0" - }, - "dependencies": { - "execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "dev": true, - "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - } - }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - } } }, "define-properties": { @@ -1249,7 +1260,7 @@ "define-property": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha1-1Flono1lS6d+AqgX+HENcCyxbp0=", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", "dev": true, "requires": { "is-descriptor": "^1.0.2", @@ -1259,7 +1270,7 @@ "is-accessor-descriptor": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "requires": { "kind-of": "^6.0.0" @@ -1268,7 +1279,7 @@ "is-data-descriptor": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "requires": { "kind-of": "^6.0.0" @@ -1277,7 +1288,7 @@ "is-descriptor": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, "requires": { "is-accessor-descriptor": "^1.0.0", @@ -1288,17 +1299,18 @@ } }, "del": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/del/-/del-3.0.0.tgz", - "integrity": "sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU=", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", + "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", "dev": true, "requires": { + "@types/glob": "^7.1.1", "globby": "^6.1.0", - "is-path-cwd": "^1.0.0", - "is-path-in-cwd": "^1.0.0", - "p-map": "^1.1.1", - "pify": "^3.0.0", - "rimraf": "^2.2.8" + "is-path-cwd": "^2.0.0", + "is-path-in-cwd": "^2.0.0", + "p-map": "^2.0.0", + "pify": "^4.0.1", + "rimraf": "^2.6.3" } }, "depd": { @@ -1338,7 +1350,7 @@ "diffie-hellman": { "version": "5.0.3", "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", - "integrity": "sha1-QOjumPVaIUlgcUaSHGPhrl89KHU=", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", "dev": true, "requires": { "bn.js": "^4.1.0", @@ -1401,7 +1413,7 @@ "domain-browser": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", - "integrity": "sha1-PTH1AZGmdJ3RN1p/Ui6CPULlTto=", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", "dev": true }, "domelementtype": { @@ -1450,7 +1462,7 @@ "readable-stream": { "version": "2.3.6", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha1-sRwn2IuP8fvgcGQ8+UsMea4bCq8=", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { "core-util-is": "~1.0.0", @@ -1465,7 +1477,7 @@ "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "requires": { "safe-buffer": "~5.1.0" @@ -1482,7 +1494,7 @@ "elliptic": { "version": "6.4.1", "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.1.tgz", - "integrity": "sha1-wtC3d2kRuGcixjLDwGxg8vgZk5o=", + "integrity": "sha512-BsXLz5sqX8OHcsh7CqBMztyXARmGQ3LWPtGjJi6DiJHq5C/qvi9P3OqgswKSDftbu8+IoI/QDTAm2fFnQ9SZSQ==", "dev": true, "requires": { "bn.js": "^4.4.0", @@ -1509,7 +1521,7 @@ "end-of-stream": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", - "integrity": "sha1-7SljTRm6ukY7bOa4CjchPqtx7EM=", + "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", "dev": true, "requires": { "once": "^1.4.0" @@ -1518,7 +1530,7 @@ "enhanced-resolve": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz", - "integrity": "sha1-Qcfgv9/nSsH/4eV61qXGyfN0Kn8=", + "integrity": "sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng==", "dev": true, "requires": { "graceful-fs": "^4.1.2", @@ -1535,7 +1547,7 @@ "errno": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", - "integrity": "sha1-RoTXF3mtOa8Xfj8AeZb3xnyFJhg=", + "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", "dev": true, "requires": { "prr": "~1.0.1" @@ -1578,9 +1590,9 @@ "dev": true }, "eslint-scope": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.2.tgz", - "integrity": "sha512-5q1+B/ogmHl8+paxtOKx38Z8LtWkVGuNt3+GQNErqwLl6ViNp/gdJGMCjZNxZ8j/VYjDNZ2Fo+eQc1TAVPIzbg==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", + "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", "dev": true, "requires": { "esrecurse": "^4.1.0", @@ -1590,7 +1602,7 @@ "esrecurse": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", - "integrity": "sha1-AHo7n9vCs7uH5IeeoZyS/b05Qs8=", + "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", "dev": true, "requires": { "estraverse": "^4.1.0" @@ -1609,15 +1621,15 @@ "dev": true }, "eventemitter3": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.0.tgz", - "integrity": "sha512-ivIvhpq/Y0uSjcHDcOIccjmYjGLcP09MFGE7ysAwkAvkXfpZlC985pH2/ui64DKazbTW/4kN3yqozUxlXzI6cA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.2.tgz", + "integrity": "sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==", "dev": true }, "events": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/events/-/events-3.0.0.tgz", - "integrity": "sha1-mgoN+vYok9krh1uPJpjKQRSXPog=", + "integrity": "sha512-Dc381HFWJzEOhQ+d8pkNon++bk9h6cdAoAj4iE6Q4y6xgTzySWXlKn05/TVNpjnfRqi/X0EpJEJohPjNI3zpVA==", "dev": true }, "eventsource": { @@ -1632,7 +1644,7 @@ "evp_bytestokey": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha1-f8vbGY3HGVlDLv4ThCaE4FJaywI=", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", "dev": true, "requires": { "md5.js": "^1.3.4", @@ -1640,13 +1652,13 @@ } }, "execa": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.10.0.tgz", - "integrity": "sha512-7XOMnz8Ynx1gGo/3hyV9loYNPWM94jG3+3T3Y8tsfSstFmETmENCMU/A/zj8Lyaj1lkgEepKepvd6240tBRvlw==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", "dev": true, "requires": { "cross-spawn": "^6.0.0", - "get-stream": "^3.0.0", + "get-stream": "^4.0.0", "is-stream": "^1.1.0", "npm-run-path": "^2.0.0", "p-finally": "^1.0.0", @@ -1699,39 +1711,39 @@ } }, "express": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/express/-/express-4.16.4.tgz", - "integrity": "sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg==", + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", "dev": true, "requires": { - "accepts": "~1.3.5", + "accepts": "~1.3.7", "array-flatten": "1.1.1", - "body-parser": "1.18.3", - "content-disposition": "0.5.2", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", "content-type": "~1.0.4", - "cookie": "0.3.1", + "cookie": "0.4.0", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "~1.1.2", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", - "finalhandler": "1.1.1", + "finalhandler": "~1.1.2", "fresh": "0.5.2", "merge-descriptors": "1.0.1", "methods": "~1.1.2", "on-finished": "~2.3.0", - "parseurl": "~1.3.2", + "parseurl": "~1.3.3", "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.4", - "qs": "6.5.2", - "range-parser": "~1.2.0", + "proxy-addr": "~2.0.5", + "qs": "6.7.0", + "range-parser": "~1.2.1", "safe-buffer": "5.1.2", - "send": "0.16.2", - "serve-static": "1.13.2", - "setprototypeof": "1.1.0", - "statuses": "~1.4.0", - "type-is": "~1.6.16", + "send": "0.17.1", + "serve-static": "1.14.1", + "setprototypeof": "1.1.1", + "statuses": "~1.5.0", + "type-is": "~1.6.18", "utils-merge": "1.0.1", "vary": "~1.1.2" }, @@ -1757,7 +1769,7 @@ "is-extendable": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "dev": true, "requires": { "is-plain-object": "^2.0.4" @@ -1768,7 +1780,7 @@ "extglob": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha1-rQD+TcYSqSMuhxhxHcXLWrAoVUM=", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", "dev": true, "requires": { "array-unique": "^0.3.2", @@ -1802,7 +1814,7 @@ "is-accessor-descriptor": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "requires": { "kind-of": "^6.0.0" @@ -1811,7 +1823,7 @@ "is-data-descriptor": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "requires": { "kind-of": "^6.0.0" @@ -1820,7 +1832,7 @@ "is-descriptor": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, "requires": { "is-accessor-descriptor": "^1.0.0", @@ -1854,7 +1866,7 @@ "figgy-pudding": { "version": "3.5.1", "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.1.tgz", - "integrity": "sha1-hiRwESkBxyeg5JWoB0S9W6odZ5A=", + "integrity": "sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w==", "dev": true }, "fill-range": { @@ -1881,35 +1893,35 @@ } }, "finalhandler": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", - "integrity": "sha1-7r9O2EAHnIP0JJA4ydcDAIMBsQU=", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", "dev": true, "requires": { "debug": "2.6.9", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "on-finished": "~2.3.0", - "parseurl": "~1.3.2", - "statuses": "~1.4.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", "unpipe": "~1.0.0" } }, "find-cache-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.0.0.tgz", - "integrity": "sha1-TB+u1Z9FGEUw+51/oSOk0EqYRy0=", + "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": "^1.0.0", + "make-dir": "^2.0.0", "pkg-dir": "^3.0.0" } }, "find-up": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha1-SRafHXmTQwZG2mHsxa41XCHJe3M=", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", "dev": true, "requires": { "locate-path": "^3.0.0" @@ -1957,7 +1969,7 @@ "readable-stream": { "version": "2.3.6", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha1-sRwn2IuP8fvgcGQ8+UsMea4bCq8=", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { "core-util-is": "~1.0.0", @@ -1972,7 +1984,7 @@ "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "requires": { "safe-buffer": "~5.1.0" @@ -1999,9 +2011,9 @@ } }, "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true } } @@ -2052,7 +2064,7 @@ "readable-stream": { "version": "2.3.6", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha1-sRwn2IuP8fvgcGQ8+UsMea4bCq8=", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { "core-util-is": "~1.0.0", @@ -2067,7 +2079,7 @@ "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "requires": { "safe-buffer": "~5.1.0" @@ -2094,14 +2106,14 @@ "dev": true }, "fsevents": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.4.tgz", - "integrity": "sha512-z8H8/diyk76B7q5wg+Ud0+CqzcAF3mBBI/bA5ne5zrRUUIvNkJY//D3BqyH571KuAC4Nr7Rw7CjWX4r0y9DvNg==", + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.9.tgz", + "integrity": "sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw==", "dev": true, "optional": true, "requires": { - "nan": "^2.9.2", - "node-pre-gyp": "^0.10.0" + "nan": "^2.12.1", + "node-pre-gyp": "^0.12.0" }, "dependencies": { "abbrev": { @@ -2122,7 +2134,7 @@ "optional": true }, "are-we-there-yet": { - "version": "1.1.4", + "version": "1.1.5", "bundled": true, "dev": true, "optional": true, @@ -2134,21 +2146,19 @@ "balanced-match": { "version": "1.0.0", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "brace-expansion": { "version": "1.1.11", "bundled": true, "dev": true, - "optional": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "chownr": { - "version": "1.0.1", + "version": "1.1.1", "bundled": true, "dev": true, "optional": true @@ -2156,20 +2166,17 @@ "code-point-at": { "version": "1.1.0", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "concat-map": { "version": "0.0.1", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "console-control-strings": { "version": "1.1.0", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "core-util-is": { "version": "1.0.2", @@ -2178,16 +2185,16 @@ "optional": true }, "debug": { - "version": "2.6.9", + "version": "4.1.1", "bundled": true, "dev": true, "optional": true, "requires": { - "ms": "2.0.0" + "ms": "^2.1.1" } }, "deep-extend": { - "version": "0.5.1", + "version": "0.6.0", "bundled": true, "dev": true, "optional": true @@ -2236,7 +2243,7 @@ } }, "glob": { - "version": "7.1.2", + "version": "7.1.3", "bundled": true, "dev": true, "optional": true, @@ -2256,12 +2263,12 @@ "optional": true }, "iconv-lite": { - "version": "0.4.21", + "version": "0.4.24", "bundled": true, "dev": true, "optional": true, "requires": { - "safer-buffer": "^2.1.0" + "safer-buffer": ">= 2.1.2 < 3" } }, "ignore-walk": { @@ -2286,8 +2293,7 @@ "inherits": { "version": "2.0.3", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "ini": { "version": "1.3.5", @@ -2299,7 +2305,6 @@ "version": "1.0.0", "bundled": true, "dev": true, - "optional": true, "requires": { "number-is-nan": "^1.0.0" } @@ -2314,7 +2319,6 @@ "version": "3.0.4", "bundled": true, "dev": true, - "optional": true, "requires": { "brace-expansion": "^1.1.7" } @@ -2322,21 +2326,19 @@ "minimist": { "version": "0.0.8", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "minipass": { - "version": "2.2.4", + "version": "2.3.5", "bundled": true, "dev": true, - "optional": true, "requires": { - "safe-buffer": "^5.1.1", + "safe-buffer": "^5.1.2", "yallist": "^3.0.0" } }, "minizlib": { - "version": "1.1.0", + "version": "1.2.1", "bundled": true, "dev": true, "optional": true, @@ -2348,41 +2350,40 @@ "version": "0.5.1", "bundled": true, "dev": true, - "optional": true, "requires": { "minimist": "0.0.8" } }, "ms": { - "version": "2.0.0", + "version": "2.1.1", "bundled": true, "dev": true, "optional": true }, "needle": { - "version": "2.2.0", + "version": "2.3.0", "bundled": true, "dev": true, "optional": true, "requires": { - "debug": "^2.1.2", + "debug": "^4.1.0", "iconv-lite": "^0.4.4", "sax": "^1.2.4" } }, "node-pre-gyp": { - "version": "0.10.0", + "version": "0.12.0", "bundled": true, "dev": true, "optional": true, "requires": { "detect-libc": "^1.0.2", "mkdirp": "^0.5.1", - "needle": "^2.2.0", + "needle": "^2.2.1", "nopt": "^4.0.1", "npm-packlist": "^1.1.6", "npmlog": "^4.0.2", - "rc": "^1.1.7", + "rc": "^1.2.7", "rimraf": "^2.6.1", "semver": "^5.3.0", "tar": "^4" @@ -2399,13 +2400,13 @@ } }, "npm-bundled": { - "version": "1.0.3", + "version": "1.0.6", "bundled": true, "dev": true, "optional": true }, "npm-packlist": { - "version": "1.1.10", + "version": "1.4.1", "bundled": true, "dev": true, "optional": true, @@ -2429,8 +2430,7 @@ "number-is-nan": { "version": "1.0.1", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "object-assign": { "version": "4.1.1", @@ -2442,7 +2442,6 @@ "version": "1.4.0", "bundled": true, "dev": true, - "optional": true, "requires": { "wrappy": "1" } @@ -2482,12 +2481,12 @@ "optional": true }, "rc": { - "version": "1.2.7", + "version": "1.2.8", "bundled": true, "dev": true, "optional": true, "requires": { - "deep-extend": "^0.5.1", + "deep-extend": "^0.6.0", "ini": "~1.3.0", "minimist": "^1.2.0", "strip-json-comments": "~2.0.1" @@ -2517,16 +2516,16 @@ } }, "rimraf": { - "version": "2.6.2", + "version": "2.6.3", "bundled": true, "dev": true, "optional": true, "requires": { - "glob": "^7.0.5" + "glob": "^7.1.3" } }, "safe-buffer": { - "version": "5.1.1", + "version": "5.1.2", "bundled": true, "dev": true }, @@ -2543,7 +2542,7 @@ "optional": true }, "semver": { - "version": "5.5.0", + "version": "5.7.0", "bundled": true, "dev": true, "optional": true @@ -2564,7 +2563,6 @@ "version": "1.0.2", "bundled": true, "dev": true, - "optional": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -2595,17 +2593,17 @@ "optional": true }, "tar": { - "version": "4.4.1", + "version": "4.4.8", "bundled": true, "dev": true, "optional": true, "requires": { - "chownr": "^1.0.1", + "chownr": "^1.1.1", "fs-minipass": "^1.2.5", - "minipass": "^2.2.4", - "minizlib": "^1.1.0", + "minipass": "^2.3.4", + "minizlib": "^1.1.1", "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.1", + "safe-buffer": "^5.1.2", "yallist": "^3.0.2" } }, @@ -2616,12 +2614,12 @@ "optional": true }, "wide-align": { - "version": "1.1.2", + "version": "1.1.3", "bundled": true, "dev": true, "optional": true, "requires": { - "string-width": "^1.0.2" + "string-width": "^1.0.2 || 2" } }, "wrappy": { @@ -2630,7 +2628,7 @@ "dev": true }, "yallist": { - "version": "3.0.2", + "version": "3.0.3", "bundled": true, "dev": true } @@ -2645,14 +2643,17 @@ "get-caller-file": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", - "integrity": "sha1-+Xj6TJDR3+f/LWvtoqUV5xO9z0o=", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", "dev": true }, "get-stream": { - "version": "3.0.0", - "resolved": "http://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", - "dev": true + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } }, "get-value": { "version": "2.0.6", @@ -2661,9 +2662,9 @@ "dev": true }, "glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha1-OWCDLT8VdBCDQtr9OmezMsCWnfE=", + "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", @@ -2741,9 +2742,9 @@ } }, "graceful-fs": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", + "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", "dev": true }, "handle-thing": { @@ -2818,7 +2819,7 @@ "hash.js": { "version": "1.1.7", "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha1-C6vKU46NTuSg+JiNaIZlN6ADz0I=", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", "dev": true, "requires": { "inherits": "^2.0.3", @@ -2961,21 +2962,22 @@ "dev": true }, "http-errors": { - "version": "1.6.3", - "resolved": "http://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", "dev": true, "requires": { "depd": "~1.1.2", "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" } }, "http-parser-js": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.0.tgz", - "integrity": "sha512-cZdEF7r4gfRIq7ezX9J0T+kQmJNOub71dWbgAXVHDct80TKP4MCETtZQ31xyv38UwgzkWPYF/Xc0ge55dW9Z9w==", + "version": "0.4.10", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.10.tgz", + "integrity": "sha1-ksnBN0w1CF912zWexWzCV8u5P6Q=", "dev": true }, "http-proxy": { @@ -3008,18 +3010,18 @@ "dev": true }, "iconv-lite": { - "version": "0.4.23", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", - "integrity": "sha1-KXhx9jvlB63Pv8pxXQzQ7thOmmM=", + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dev": true, "requires": { "safer-buffer": ">= 2.1.2 < 3" } }, "ieee754": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.12.tgz", - "integrity": "sha1-UL8k5bnIu5ivSWTJQc2wkY2ntgs=", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", "dev": true }, "iferr": { @@ -3031,65 +3033,11 @@ "import-local": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", - "integrity": "sha1-VQcL44pZk88Y72236WH1vuXFoJ0=", + "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", "dev": true, "requires": { "pkg-dir": "^3.0.0", "resolve-cwd": "^2.0.0" - }, - "dependencies": { - "find-up": { - "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" - } - }, - "locate-path": { - "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" - } - }, - "p-limit": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.0.0.tgz", - "integrity": "sha512-fl5s52lI5ahKCernzzIyAP0QAZbGIovtVHGwpcu1Jr/EpzLVDI2myISHwGqK7m8uQFugVWSrbxH7XnhGtvEc+A==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "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" - } - }, - "p-try": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz", - "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==", - "dev": true - }, - "pkg-dir": { - "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" - } - } } }, "imurmurhash": { @@ -3098,12 +3046,6 @@ "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", "dev": true }, - "indexof": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", - "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", - "dev": true - }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -3127,21 +3069,13 @@ "dev": true }, "internal-ip": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.2.0.tgz", - "integrity": "sha512-ZY8Rk+hlvFeuMmG5uH1MXhhdeMntmIaxaInvAmzMq/SHV8rv4Kh+6GiQNNDQd0wZFrcO+FiTBo8lui/osKOyJw==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz", + "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==", "dev": true, "requires": { - "default-gateway": "^4.0.1", + "default-gateway": "^4.2.0", "ipaddr.js": "^1.9.0" - }, - "dependencies": { - "ipaddr.js": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.0.tgz", - "integrity": "sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA==", - "dev": true - } } }, "interpret": { @@ -3153,7 +3087,7 @@ "invert-kv": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", - "integrity": "sha1-c5P1r6Weyf9fZ6J2INEcIm4+7AI=", + "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", "dev": true }, "ip": { @@ -3169,9 +3103,9 @@ "dev": true }, "ipaddr.js": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.8.0.tgz", - "integrity": "sha1-6qM9bd16zo9/b+DJygRA5wZzix4=", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.0.tgz", + "integrity": "sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA==", "dev": true }, "is-accessor-descriptor": { @@ -3206,7 +3140,7 @@ "is-buffer": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha1-76ouqdqg16suoTqXsritUf776L4=", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", "dev": true }, "is-callable": { @@ -3244,7 +3178,7 @@ "is-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha1-Nm2CQN3kh8pRgjsaufB6EKeCUco=", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", "dev": true, "requires": { "is-accessor-descriptor": "^0.1.6", @@ -3255,7 +3189,7 @@ "kind-of": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha1-cpyR4thXt6QZofmqZWhcTDP1hF0=", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", "dev": true } } @@ -3279,9 +3213,9 @@ "dev": true }, "is-glob": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", - "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", + "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" @@ -3308,33 +3242,33 @@ } }, "is-path-cwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", - "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.1.0.tgz", + "integrity": "sha512-Sc5j3/YnM8tDeyCsVeKlm/0p95075DyLmDEIkSgQ7mXkrOX+uTCtmQFm0CYzVyJwcCCmO3k8qfJt17SxQwB5Zw==", "dev": true }, "is-path-in-cwd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", - "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", + "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", "dev": true, "requires": { - "is-path-inside": "^1.0.0" + "is-path-inside": "^2.1.0" } }, "is-path-inside": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", - "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", + "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", "dev": true, "requires": { - "path-is-inside": "^1.0.1" + "path-is-inside": "^1.0.2" } }, "is-plain-object": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha1-LBY7P6+xtgbZ0Xko8FwqHDjgdnc=", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", "dev": true, "requires": { "isobject": "^3.0.1" @@ -3367,7 +3301,7 @@ "is-windows": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha1-0YUOuXkezRjmGCzhKjDzlmNLsZ0=", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", "dev": true }, "is-wsl": { @@ -3397,19 +3331,19 @@ "json-parse-better-errors": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha1-u4Z8+zRQ5pEHwTHRxRS6s9yLyqk=", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", "dev": true }, "json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha1-afaofZUTq4u4/mO9sJecRI5oRmA=", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, "json3": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", - "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz", + "integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==", "dev": true }, "json5": { @@ -3427,13 +3361,13 @@ "kind-of": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha1-ARRrNqYhjmTljzqNZt5df8b20FE=", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", "dev": true }, "lcid": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", - "integrity": "sha1-bvXS32DlL4LrIopMNz6NHzlyU88=", + "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", "dev": true, "requires": { "invert-kv": "^2.0.0" @@ -3442,7 +3376,7 @@ "loader-runner": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", - "integrity": "sha1-7UcGa/5TTX6ExMe5mYwqdWB9k1c=", + "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", "dev": true }, "loader-utils": { @@ -3460,7 +3394,7 @@ "locate-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha1-2+w7OrdZdYBxtY/ln8QYca8hQA4=", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", "dev": true, "requires": { "p-locate": "^3.0.0", @@ -3473,16 +3407,10 @@ "integrity": "sha1-s56mIp72B+zYniyN8SU2iRysm40=", "dev": true }, - "lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=", - "dev": true - }, "loglevel": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.1.tgz", - "integrity": "sha1-4PyVEztu8nbNyIh82vJKpvFW+Po=", + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.3.tgz", + "integrity": "sha512-LoEDv5pgpvWgPF4kNYuIp0qqSJVWak/dML0RY74xlzMZiT9w77teNAwKYKWBTYjlokMirg+o3jBwp+vlLrcfAA==", "dev": true }, "lower-case": { @@ -3494,19 +3422,20 @@ "lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha1-HaJ+ZxAnGUdpXa9oSOhH8B2EuSA=", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dev": true, "requires": { "yallist": "^3.0.2" } }, "make-dir": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", - "integrity": "sha1-ecEDO4BRW9bSTsmTPoYMp17ifww=", + "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": "^3.0.0" + "pify": "^4.0.1", + "semver": "^5.6.0" } }, "mamacro": { @@ -3516,9 +3445,9 @@ "dev": true }, "map-age-cleaner": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.2.tgz", - "integrity": "sha512-UN1dNocxQq44IhJyMI4TU8phc2m9BddacHRPRjKGLYaF0jqd3xLz0jS0skpAU9WgYyoR4gHtUpzytNBS385FWQ==", + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", + "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", "dev": true, "requires": { "p-defer": "^1.0.0" @@ -3542,7 +3471,7 @@ "md5.js": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", - "integrity": "sha1-tdB7jjIW4+J81yjXL3DR5qNCAF8=", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", "dev": true, "requires": { "hash-base": "^3.0.0", @@ -3557,14 +3486,14 @@ "dev": true }, "mem": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-4.0.0.tgz", - "integrity": "sha512-WQxG/5xYc3tMbYLXoXPm81ET2WDULiU5FxbuIoNbJqLOOI8zehXFdZuiUEgfdrU2mVB1pxBZUGlYORSrpuJreA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", + "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", "dev": true, "requires": { "map-age-cleaner": "^0.1.1", - "mimic-fn": "^1.0.0", - "p-is-promise": "^1.1.0" + "mimic-fn": "^2.0.0", + "p-is-promise": "^2.0.0" } }, "memory-fs": { @@ -3601,7 +3530,7 @@ "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "requires": { "safe-buffer": "~5.1.0" @@ -3624,7 +3553,7 @@ "micromatch": { "version": "3.1.10", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha1-cIWbyVyYQJUvNZoGij/En57PrCM=", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", "dev": true, "requires": { "arr-diff": "^4.0.0", @@ -3645,7 +3574,7 @@ "miller-rabin": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha1-8IA1HIZbDcViqEYpZtqlNUPHik0=", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", "dev": true, "requires": { "bn.js": "^4.0.0", @@ -3653,36 +3582,36 @@ } }, "mime": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", - "integrity": "sha1-Eh+evEnjdm8xGnbh+hyAA8SwOqY=", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", "dev": true }, "mime-db": { - "version": "1.37.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.37.0.tgz", - "integrity": "sha1-C2oM5v2+lXbiXx8tL96IMNwK0Ng=", + "version": "1.40.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", + "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==", "dev": true }, "mime-types": { - "version": "2.1.21", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.21.tgz", - "integrity": "sha1-KJlaoey3cHQv5q5+WPkYHHRLP5Y=", + "version": "2.1.24", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", + "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", "dev": true, "requires": { - "mime-db": "~1.37.0" + "mime-db": "1.40.0" } }, "mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha1-ggyGo5M0ZA6ZUWkovQP8qIBX0CI=", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true }, "minimalistic-assert": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha1-LhlN4ERibUoQ5/f7wAznPoPk1cc=", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", "dev": true }, "minimalistic-crypto-utils": { @@ -3694,22 +3623,22 @@ "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, "requires": { "brace-expansion": "^1.1.7" } }, "minimist": { - "version": "0.0.8", - "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true }, "mississippi": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", - "integrity": "sha1-6goykfl+C16HdrNj1fChLZTGcCI=", + "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", "dev": true, "requires": { "concat-stream": "^1.5.0", @@ -3727,7 +3656,7 @@ "mixin-deep": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", - "integrity": "sha1-pJ5yaNzhoNlpjkUybFYm3zVD0P4=", + "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", "dev": true, "requires": { "for-in": "^1.0.2", @@ -3737,7 +3666,7 @@ "is-extendable": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "dev": true, "requires": { "is-plain-object": "^2.0.4" @@ -3752,6 +3681,14 @@ "dev": true, "requires": { "minimist": "0.0.8" + }, + "dependencies": { + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + } } }, "move-concurrently": { @@ -3791,16 +3728,16 @@ "dev": true }, "nan": { - "version": "2.11.1", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.11.1.tgz", - "integrity": "sha512-iji6k87OSXa0CcrLl9z+ZiYSuR2o+c0bGuNmXdrhTQTakxytAFsC56SArGYoiHlJlFoHSnvmhpceZJaXkVuOtA==", + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", + "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", "dev": true, "optional": true }, "nanomatch": { "version": "1.2.13", "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha1-uHqKpPwN6P5r6IiVs4mD/yZb0Rk=", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", "dev": true, "requires": { "arr-diff": "^4.0.0", @@ -3817,21 +3754,21 @@ } }, "negotiator": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", - "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=", + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", "dev": true }, "neo-async": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.0.tgz", - "integrity": "sha1-udFeTXHGdikIZUtRg+04t1M0CDU=", + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", + "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", "dev": true }, "nice-try": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha1-ozeKdpbOfSI+iPybdkvX7xCJ42Y=", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", "dev": true }, "no-case": { @@ -3850,9 +3787,9 @@ "dev": true }, "node-libs-browser": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.0.tgz", - "integrity": "sha1-xy9g2dRt4IqUDe27JfP/ovm7qnc=", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", + "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", "dev": true, "requires": { "assert": "^1.1.1", @@ -3865,7 +3802,7 @@ "events": "^3.0.0", "https-browserify": "^1.0.0", "os-browserify": "^0.3.0", - "path-browserify": "0.0.0", + "path-browserify": "0.0.1", "process": "^0.11.10", "punycode": "^1.2.4", "querystring-es3": "^0.2.0", @@ -3877,7 +3814,7 @@ "tty-browserify": "0.0.0", "url": "^0.11.0", "util": "^0.11.0", - "vm-browserify": "0.0.4" + "vm-browserify": "^1.0.1" }, "dependencies": { "isarray": { @@ -3895,7 +3832,7 @@ "readable-stream": { "version": "2.3.6", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha1-sRwn2IuP8fvgcGQ8+UsMea4bCq8=", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { "core-util-is": "~1.0.0", @@ -3910,7 +3847,7 @@ "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "requires": { "safe-buffer": "~5.1.0" @@ -3921,7 +3858,7 @@ "string_decoder": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.2.0.tgz", - "integrity": "sha1-/obnOLGVRK/nBGkkOyoe6SQOro0=", + "integrity": "sha512-6YqyX6ZWEYguAxgZzHGL7SsCeGx3V2TtOTqZz1xSTSWnqsbWwbptafNyvf/ACquZUXV3DANr5BDIwNYe1mN42w==", "dev": true, "requires": { "safe-buffer": "~5.1.0" @@ -3930,13 +3867,10 @@ } }, "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "requires": { - "remove-trailing-separator": "^1.0.1" - } + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true }, "npm-run-path": { "version": "2.0.2", @@ -4064,9 +3998,9 @@ } }, "opn": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/opn/-/opn-5.4.0.tgz", - "integrity": "sha512-YF9MNdVy/0qvJvDtunAOzFw9iasOQHpVthTCvGzxt61Il64AYSGdK+rYwld7NAfk9qJ7dt+hymBNSc9LNYS+Sw==", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", + "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==", "dev": true, "requires": { "is-wsl": "^1.1.0" @@ -4088,12 +4022,12 @@ "dev": true }, "os-locale": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.0.1.tgz", - "integrity": "sha512-7g5e7dmXPtzcP4bgsZ8ixDVqA7oWYuEz4lOSujeWyliPai4gfVDiFIcwBg3aGCPnmSGfzOKTK3ccPn0CKv3DBw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", + "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", "dev": true, "requires": { - "execa": "^0.10.0", + "execa": "^1.0.0", "lcid": "^2.0.0", "mem": "^4.0.0" } @@ -4111,9 +4045,9 @@ "dev": true }, "p-is-promise": { - "version": "1.1.0", - "resolved": "http://registry.npmjs.org/p-is-promise/-/p-is-promise-1.1.0.tgz", - "integrity": "sha1-nJRWmJ6fZYgBewQ01WCXZ1w9oF4=", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", + "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==", "dev": true }, "p-limit": { @@ -4128,22 +4062,31 @@ "p-locate": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha1-Mi1poFwCZLJZl9n0DNiokasAZKQ=", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", "dev": true, "requires": { "p-limit": "^2.0.0" } }, "p-map": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz", - "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", "dev": true }, + "p-retry": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-3.0.1.tgz", + "integrity": "sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==", + "dev": true, + "requires": { + "retry": "^0.12.0" + } + }, "p-try": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz", - "integrity": "sha1-hQgLuHxkaI+keZb+j3376CEXYLE=", + "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 }, "pako": { @@ -4172,7 +4115,7 @@ "readable-stream": { "version": "2.3.6", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha1-sRwn2IuP8fvgcGQ8+UsMea4bCq8=", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { "core-util-is": "~1.0.0", @@ -4187,7 +4130,7 @@ "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "requires": { "safe-buffer": "~5.1.0" @@ -4225,9 +4168,9 @@ "dev": true }, "parseurl": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", - "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", "dev": true }, "pascalcase": { @@ -4237,9 +4180,9 @@ "dev": true }, "path-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", - "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=", + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", + "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", "dev": true }, "path-dirname": { @@ -4281,7 +4224,7 @@ "pbkdf2": { "version": "3.0.17", "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", - "integrity": "sha1-l2wgZTBhexTrsyEUI597CTNuk6Y=", + "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", "dev": true, "requires": { "create-hash": "^1.1.2", @@ -4292,9 +4235,9 @@ } }, "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", "dev": true }, "pinkie": { @@ -4315,7 +4258,7 @@ "pkg-dir": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha1-J0kCDyOe2ZCIGx9xIQ1R62UjvqM=", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", "dev": true, "requires": { "find-up": "^3.0.0" @@ -4338,6 +4281,12 @@ "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", "dev": true }, + "prettier": { + "version": "1.18.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.18.2.tgz", + "integrity": "sha512-OeHeMc0JhFE9idD4ZdtNibzY0+TPHSpSSb9h8FqtP+YnoZZ1sl8Vc9b1sasjfymH3SonAF4QcA2+mzHPhMvIiw==", + "dev": true + }, "pretty-error": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.1.tgz", @@ -4355,9 +4304,9 @@ "dev": true }, "process-nextick-args": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha1-o31zL0JxtKsa0HDTVQjoKQeI/6o=", + "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 }, "promise-inflight": { @@ -4367,13 +4316,13 @@ "dev": true }, "proxy-addr": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.4.tgz", - "integrity": "sha1-7PxzO/Iv+Mb0B/onUye5q2fki5M=", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.5.tgz", + "integrity": "sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ==", "dev": true, "requires": { "forwarded": "~0.1.2", - "ipaddr.js": "1.8.0" + "ipaddr.js": "1.9.0" } }, "prr": { @@ -4385,7 +4334,7 @@ "public-encrypt": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", - "integrity": "sha1-T8ydd6B+SLp1J+fL4N4z0HATMeA=", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", "dev": true, "requires": { "bn.js": "^4.1.0", @@ -4399,7 +4348,7 @@ "pump": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha1-tKIRaBW94vTh6mAjVOjHVWUQemQ=", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", "dev": true, "requires": { "end-of-stream": "^1.1.0", @@ -4409,7 +4358,7 @@ "pumpify": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", - "integrity": "sha1-NlE74karJ1cLGjdKXOJ4v9dDcM4=", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", "dev": true, "requires": { "duplexify": "^3.6.0", @@ -4420,7 +4369,7 @@ "pump": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", - "integrity": "sha1-Ejma3W5M91Jtlzy8i1zi4pCLOQk=", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", "dev": true, "requires": { "end-of-stream": "^1.1.0", @@ -4432,13 +4381,13 @@ "punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha1-tYsBCsQMIsVldhbI0sLALHv0eew=", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", "dev": true }, "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha1-yzroBuh0BERYTvFUzo7pjUA/PjY=", + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", "dev": true }, "querystring": { @@ -4454,9 +4403,9 @@ "dev": true }, "querystringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.1.0.tgz", - "integrity": "sha512-sluvZZ1YiTLD5jsqZcDmFyV2EwToyXZBfpoVOmktMmW+VEnhgakFHnasVph65fOjGPTWN0Nw3+XQaSeMayr0kg==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.1.1.tgz", + "integrity": "sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA==", "dev": true }, "randombytes": { @@ -4471,7 +4420,7 @@ "randomfill": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", - "integrity": "sha1-ySGW/IarQr6YPxvzF3giSTHWFFg=", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", "dev": true, "requires": { "randombytes": "^2.0.5", @@ -4479,21 +4428,29 @@ } }, "range-parser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", - "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", "dev": true }, "raw-body": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz", - "integrity": "sha1-GzJOzmtXBuFThVvBFIxlu39uoMM=", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", "dev": true, "requires": { - "bytes": "3.0.0", - "http-errors": "1.6.3", - "iconv-lite": "0.4.23", + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", "unpipe": "1.0.0" + }, + "dependencies": { + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "dev": true + } } }, "readable-stream": { @@ -4511,7 +4468,7 @@ "readdirp": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha1-DodiKjMlqjPokihcr4tOhGUppSU=", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", "dev": true, "requires": { "graceful-fs": "^4.1.11", @@ -4543,7 +4500,7 @@ "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "requires": { "safe-buffer": "~5.1.0" @@ -4554,7 +4511,7 @@ "regex-not": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha1-H07OJ+ALC2XgJHpoEOaoXYOldSw=", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", "dev": true, "requires": { "extend-shallow": "^3.0.2", @@ -4589,7 +4546,7 @@ "repeat-element": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", - "integrity": "sha1-eC4NglwMWjuzlzH4Tv7mt0Lmsc4=", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", "dev": true }, "repeat-string": { @@ -4650,22 +4607,28 @@ "ret": { "version": "0.1.15", "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha1-uKSCXVvbH8P29Twrwz+BOIaBx7w=", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true + }, + "retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", "dev": true }, "rimraf": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", - "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", "dev": true, "requires": { - "glob": "^7.0.5" + "glob": "^7.1.3" } }, "ripemd160": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha1-ocGm9iR1FXe6XQeRTLyShQWFiQw=", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", "dev": true, "requires": { "hash-base": "^3.0.0", @@ -4684,7 +4647,7 @@ "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha1-mR7GnSluAxN0fVm9/St0XDX4go0=", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "dev": true }, "safe-regex": { @@ -4699,7 +4662,7 @@ "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha1-RPoWGwGHuVSd2Eu5GAL5vYOFzWo=", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "dev": true }, "schema-utils": { @@ -4729,15 +4692,15 @@ } }, "semver": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", - "integrity": "sha1-fnQlb7qknHWqfHogXMInmcrIAAQ=", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", "dev": true }, "send": { - "version": "0.16.2", - "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", - "integrity": "sha1-bsyh4PjBVtFBWXVZhI32RzCmu8E=", + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", "dev": true, "requires": { "debug": "2.6.9", @@ -4747,18 +4710,26 @@ "escape-html": "~1.0.3", "etag": "~1.8.1", "fresh": "0.5.2", - "http-errors": "~1.6.2", - "mime": "1.4.1", - "ms": "2.0.0", + "http-errors": "~1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", "on-finished": "~2.3.0", - "range-parser": "~1.2.0", - "statuses": "~1.4.0" + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "dependencies": { + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + } } }, "serialize-javascript": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.6.1.tgz", - "integrity": "sha1-TR9pfsSUKahHym9EKip1USbE2Hk=", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.7.0.tgz", + "integrity": "sha512-ke8UG8ulpFOxO8f8gRYabHQe/ZntKlcig2Mp+8+URDP1D8vJZ0KUt7LYo07q25Z/+JVSgpr/cui9PIp5H6/+nA==", "dev": true }, "serve-index": { @@ -4774,18 +4745,38 @@ "http-errors": "~1.6.2", "mime-types": "~2.1.17", "parseurl": "~1.3.2" + }, + "dependencies": { + "http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + } + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + } } }, "serve-static": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", - "integrity": "sha1-CV6Ecv1bRiN9tQzkhqQ/S4bGzsE=", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", + "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", "dev": true, "requires": { "encodeurl": "~1.0.2", "escape-html": "~1.0.3", - "parseurl": "~1.3.2", - "send": "0.16.2" + "parseurl": "~1.3.3", + "send": "0.17.1" } }, "set-blocking": { @@ -4797,7 +4788,7 @@ "set-value": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", - "integrity": "sha1-ca5KiPD+77v1LR6mBPP7MV67YnQ=", + "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", "dev": true, "requires": { "extend-shallow": "^2.0.1", @@ -4824,15 +4815,15 @@ "dev": true }, "setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha1-0L2FU2iHtv58DYGMuWLZ2RxU5lY=", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", "dev": true }, "sha.js": { "version": "2.4.11", "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha1-N6XPC4HsvGlD3hCbopYNGyZYSuc=", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", "dev": true, "requires": { "inherits": "^2.0.1", @@ -4863,7 +4854,7 @@ "snapdragon": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha1-ZJIufFZbDhQgS6GqfWlkJ40lGC0=", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", "dev": true, "requires": { "base": "^0.11.1", @@ -4905,7 +4896,7 @@ "snapdragon-node": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha1-bBdfhv8UvbByRWPo88GwIaKGhTs=", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", "dev": true, "requires": { "define-property": "^1.0.0", @@ -4925,7 +4916,7 @@ "is-accessor-descriptor": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "requires": { "kind-of": "^6.0.0" @@ -4934,7 +4925,7 @@ "is-data-descriptor": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "requires": { "kind-of": "^6.0.0" @@ -4943,7 +4934,7 @@ "is-descriptor": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, "requires": { "is-accessor-descriptor": "^1.0.0", @@ -4956,7 +4947,7 @@ "snapdragon-util": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha1-+VZHlIbyrNeXAGk/b3uAXkWrVuI=", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", "dev": true, "requires": { "kind-of": "^3.2.0" @@ -5007,18 +4998,18 @@ } }, "faye-websocket": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.1.tgz", - "integrity": "sha1-8O/hjE9W5PQK/H4Gxxn9XuYYjzg=", + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.3.tgz", + "integrity": "sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA==", "dev": true, "requires": { "websocket-driver": ">=0.5.1" } }, "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true } } @@ -5026,7 +5017,7 @@ "source-list-map": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", - "integrity": "sha1-OZO9hzv8SEecyp6jpUeDXHwVSzQ=", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", "dev": true }, "source-map": { @@ -5038,7 +5029,7 @@ "source-map-resolve": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", - "integrity": "sha1-cuLMNAlVQ+Q7LGKyxMENSpBU8lk=", + "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", "dev": true, "requires": { "atob": "^2.1.1", @@ -5049,9 +5040,9 @@ } }, "source-map-support": { - "version": "0.5.10", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.10.tgz", - "integrity": "sha1-IhQIC8nVGDJRHuK6uW48L5NTEgw=", + "version": "0.5.12", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.12.tgz", + "integrity": "sha512-4h2Pbvyy15EE02G+JOZpUCmqWJuqrs+sEkzewTm++BPi7Hvn/HwcqLAcNxYAyI0x13CpPPn+kMjl+hplXMHITQ==", "dev": true, "requires": { "buffer-from": "^1.0.0", @@ -5087,9 +5078,9 @@ } }, "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true } } @@ -5118,15 +5109,15 @@ } }, "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, "readable-stream": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.2.0.tgz", - "integrity": "sha512-RV20kLjdmpZuTF1INEb9IA3L68Nmi+Ri7ppZqo78wj//Pn62fCoJyV9zalccNzDD/OuJpMG4f+pfMl8+L6QdGw==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", + "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", "dev": true, "requires": { "inherits": "^2.0.3", @@ -5148,7 +5139,7 @@ "split-string": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha1-fLCd2jqGWFcFxks5pkZgOGguj+I=", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", "dev": true, "requires": { "extend-shallow": "^3.0.0" @@ -5157,7 +5148,7 @@ "ssri": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", - "integrity": "sha1-KjxBso3UW2K2Nnbst0ABJlrp7dg=", + "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", "dev": true, "requires": { "figgy-pudding": "^3.5.1" @@ -5185,15 +5176,15 @@ } }, "statuses": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", - "integrity": "sha1-u3PURtonlhBu/MG2AaJT1sRr0Ic=", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", "dev": true }, "stream-browserify": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", - "integrity": "sha1-h1IdOKRKp+6RzhzSpH3wy0ndZgs=", + "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", "dev": true, "requires": { "inherits": "~2.0.1", @@ -5209,7 +5200,7 @@ "readable-stream": { "version": "2.3.6", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha1-sRwn2IuP8fvgcGQ8+UsMea4bCq8=", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { "core-util-is": "~1.0.0", @@ -5224,7 +5215,7 @@ "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "requires": { "safe-buffer": "~5.1.0" @@ -5235,7 +5226,7 @@ "stream-each": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", - "integrity": "sha1-6+J6DDibBPvMIzZClS4Qcxr6m64=", + "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", "dev": true, "requires": { "end-of-stream": "^1.1.0", @@ -5245,7 +5236,7 @@ "stream-http": { "version": "2.8.3", "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", - "integrity": "sha1-stJCRpKIpaJ+xP6JM6z2I95lFPw=", + "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", "dev": true, "requires": { "builtin-status-codes": "^3.0.0", @@ -5264,7 +5255,7 @@ "readable-stream": { "version": "2.3.6", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha1-sRwn2IuP8fvgcGQ8+UsMea4bCq8=", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { "core-util-is": "~1.0.0", @@ -5279,7 +5270,7 @@ "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "requires": { "safe-buffer": "~5.1.0" @@ -5296,7 +5287,7 @@ "string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha1-q5Pyeo3BPSjKyBXEYhQ6bZASrp4=", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "dev": true, "requires": { "is-fullwidth-code-point": "^2.0.0", @@ -5357,30 +5348,68 @@ "dev": true }, "terser": { - "version": "3.16.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-3.16.1.tgz", - "integrity": "sha512-JDJjgleBROeek2iBcSNzOHLKsB/MdDf+E/BOAJ0Tk9r7p9/fVobfv7LMJ/g/k3v9SXdmjZnIlFd5nfn/Rt0Xow==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.0.0.tgz", + "integrity": "sha512-dOapGTU0hETFl1tCo4t56FN+2jffoKyER9qBGoUFyZ6y7WLoKT0bF+lAYi6B6YsILcGF3q1C2FBh8QcKSCgkgA==", "dev": true, "requires": { - "commander": "~2.17.1", + "commander": "^2.19.0", "source-map": "~0.6.1", - "source-map-support": "~0.5.9" + "source-map-support": "~0.5.10" + }, + "dependencies": { + "commander": { + "version": "2.20.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz", + "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==", + "dev": true + } } }, "terser-webpack-plugin": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.2.3.tgz", - "integrity": "sha512-GOK7q85oAb/5kE12fMuLdn2btOS9OBZn4VsecpHDywoUC/jLhSAKOiYo0ezx7ss2EXPMzyEWFoE0s1WLE+4+oA==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.3.0.tgz", + "integrity": "sha512-W2YWmxPjjkUcOWa4pBEv4OP4er1aeQJlSo2UhtCFQCuRXEHjOFscO8VyWHj9JLlA0RzQb8Y2/Ta78XZvT54uGg==", "dev": true, "requires": { - "cacache": "^11.0.2", + "cacache": "^11.3.2", "find-cache-dir": "^2.0.0", + "is-wsl": "^1.1.0", + "loader-utils": "^1.2.3", "schema-utils": "^1.0.0", - "serialize-javascript": "^1.4.0", + "serialize-javascript": "^1.7.0", "source-map": "^0.6.1", - "terser": "^3.16.1", - "webpack-sources": "^1.1.0", - "worker-farm": "^1.5.2" + "terser": "^4.0.0", + "webpack-sources": "^1.3.0", + "worker-farm": "^1.7.0" + }, + "dependencies": { + "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 + }, + "json5": { + "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" + } + }, + "loader-utils": { + "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", + "json5": "^1.0.1" + } + } } }, "text-encoding": { @@ -5392,7 +5421,7 @@ "through2": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha1-AcHjnrMdB8t9A6lqcIIyYLIxMs0=", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", "dev": true, "requires": { "readable-stream": "~2.3.6", @@ -5408,7 +5437,7 @@ "readable-stream": { "version": "2.3.6", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha1-sRwn2IuP8fvgcGQ8+UsMea4bCq8=", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { "core-util-is": "~1.0.0", @@ -5423,7 +5452,7 @@ "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "requires": { "safe-buffer": "~5.1.0" @@ -5440,7 +5469,7 @@ "timers-browserify": { "version": "2.0.10", "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.10.tgz", - "integrity": "sha1-HSjj0qrfHVpZlsTp+VYBzQU0gK4=", + "integrity": "sha512-YvC1SV1XdOUaL6gx5CoGroT3Gu49pK9+TZ38ErPldOWW4j49GI1HKs9DV+KGq/w6y+LZ72W1c8cKz2vzY+qpzg==", "dev": true, "requires": { "setimmediate": "^1.0.4" @@ -5475,7 +5504,7 @@ "to-regex": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha1-E8/dmzNlUvMLUfM6iuG0Knp1mc4=", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", "dev": true, "requires": { "define-property": "^2.0.2", @@ -5494,6 +5523,12 @@ "repeat-string": "^1.6.1" } }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", + "dev": true + }, "toposort": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/toposort/-/toposort-1.0.7.tgz", @@ -5501,9 +5536,9 @@ "dev": true }, "tslib": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", - "integrity": "sha1-1+TdeSRdhUKMTX5IIqeZF5VMooY=", + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", + "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==", "dev": true }, "tty-browserify": { @@ -5513,13 +5548,13 @@ "dev": true }, "type-is": { - "version": "1.6.16", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz", - "integrity": "sha1-+JzjQVQcZysl7nrjxz3uOyvlAZQ=", + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", "dev": true, "requires": { "media-typer": "0.3.0", - "mime-types": "~2.1.18" + "mime-types": "~2.1.24" } }, "typedarray": { @@ -5576,16 +5611,16 @@ "unique-filename": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", - "integrity": "sha1-HWl2k2mtoFgxA6HmrodoG1ZXMjA=", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", "dev": true, "requires": { "unique-slug": "^2.0.0" } }, "unique-slug": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.1.tgz", - "integrity": "sha1-Xp7cbRzo+yZNsYpQfvm9hURFHKY=", + "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" @@ -5644,9 +5679,9 @@ } }, "upath": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.0.tgz", - "integrity": "sha1-NSVll+RqWB20eT0M5H+prr/J+r0=", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.2.tgz", + "integrity": "sha512-kXpym8nmDmlCBr7nKdIx8P2jNBa+pBpIUFRnKJ4dr8htyYGJFokkr2ZvERRtUN+9SY+JqXouNgUPtv6JQva/2Q==", "dev": true }, "upper-case": { @@ -5658,7 +5693,7 @@ "uri-js": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", - "integrity": "sha1-lMVA4f93KVbiKZUHwBCupsiDjrA=", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", "dev": true, "requires": { "punycode": "^2.1.0" @@ -5689,25 +5724,25 @@ } }, "url-parse": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.4.tgz", - "integrity": "sha512-/92DTTorg4JjktLNLe6GPS2/RvAd/RGr6LuktmWSMLEOa6rjnlrFXNgSbSmkNvCoL2T028A0a1JaJLzRMlFoHg==", + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.7.tgz", + "integrity": "sha512-d3uaVyzDB9tQoSXFvuSUNFibTd9zxd2bkVrDRvF5TmvWWQwqE4lgYJ5m+x1DbecWkw+LK4RNl2CU1hHuOKPVlg==", "dev": true, "requires": { - "querystringify": "^2.0.0", + "querystringify": "^2.1.1", "requires-port": "^1.0.0" } }, "use": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha1-1QyMrHmhn7wg8pEfVuuXP04QBw8=", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", "dev": true }, "util": { "version": "0.11.1", "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", - "integrity": "sha1-MjZzNyDsZLsn9uJvQhqqLhtYjWE=", + "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", "dev": true, "requires": { "inherits": "2.0.3" @@ -5744,13 +5779,13 @@ "uuid": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha1-G0r0lV6zB3xQHCOHL8ZROBFYcTE=", + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", "dev": true }, "v8-compile-cache": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.0.2.tgz", - "integrity": "sha512-1wFuMUIM16MDJRCrpbpuEPTUGmM5QMUg0cr3KFwra2XgOgFcPGDQHDh3CszSCD2Zewc/dh/pamNEW8CbfDebUw==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.0.3.tgz", + "integrity": "sha512-CNmdbwQMBjwr9Gsmohvm0pbL954tJrNzf6gWL3K+QMQf00PF7ERGrEiLgjuU3mKreLC2MeGhUsNV9ybTbLgd3w==", "dev": true }, "vary": { @@ -5760,18 +5795,15 @@ "dev": true }, "vm-browserify": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", - "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=", - "dev": true, - "requires": { - "indexof": "0.0.1" - } + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.0.tgz", + "integrity": "sha512-iq+S7vZJE60yejDYM0ek6zg308+UZsdtPExWP9VZoCFCz1zkJoXFnAX7aZfd/ZwrkidzdUZL0C/ryW+JwAiIGw==", + "dev": true }, "watchpack": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz", - "integrity": "sha1-S8EsLr6KonenHx0/FNaFx7RGzQA=", + "integrity": "sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==", "dev": true, "requires": { "chokidar": "^2.0.2", @@ -5789,9 +5821,9 @@ } }, "webpack": { - "version": "4.29.6", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.29.6.tgz", - "integrity": "sha512-MwBwpiE1BQpMDkbnUUaW6K8RFZjljJHArC6tWQJoFm0oQtfoSebtg4Y7/QHnJ/SddtjYLHaKGX64CFjG5rehJw==", + "version": "4.35.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.35.0.tgz", + "integrity": "sha512-M5hL3qpVvtr8d4YaJANbAQBc4uT01G33eDpl/psRTBCfjxFTihdhin1NtAKB1ruDwzeVdcsHHV3NX+QsAgOosw==", "dev": true, "requires": { "@webassemblyjs/ast": "1.8.5", @@ -5823,13 +5855,13 @@ "big.js": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha1-ZfCvOC9Xi83HQr2cKB6cstd2gyg=", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", "dev": true }, "json5": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha1-d5+wAYYE+oVOrL9iUhgNg1Q+Pb4=", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", "dev": true, "requires": { "minimist": "^1.2.0" @@ -5838,26 +5870,20 @@ "loader-utils": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", - "integrity": "sha1-H/XcaRHJ8KBiUxpMBLYJQGEIwsc=", + "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", "dev": true, "requires": { "big.js": "^5.2.2", "emojis-list": "^2.0.0", "json5": "^1.0.1" } - }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true } } }, "webpack-cli": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.2.3.tgz", - "integrity": "sha512-Ik3SjV6uJtWIAN5jp5ZuBMWEAaP5E4V78XJ2nI+paFPh8v4HPSwo/myN0r29Xc/6ZKnd2IdrAlpSgNOu2CDQ6Q==", + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.3.4.tgz", + "integrity": "sha512-ubJGQEKMtBSpT+LiL5hXvn2GIOWiRWItR1DGUqJRhwRBeGhpRXjvF5f0erqdRJLErkfqS5/Ldkkedh4AL5Q1ZQ==", "dev": true, "requires": { "chalk": "^2.4.1", @@ -5868,9 +5894,10 @@ "import-local": "^2.0.0", "interpret": "^1.1.0", "loader-utils": "^1.1.0", + "prettier": "^1.17.0", "supports-color": "^5.5.0", "v8-compile-cache": "^2.0.2", - "yargs": "^12.0.4" + "yargs": "^12.0.5" }, "dependencies": { "big.js": { @@ -5879,18 +5906,6 @@ "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", "dev": true }, - "camelcase": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.2.0.tgz", - "integrity": "sha512-IXFsBS2pC+X0j0N/GE7Dm7j3bsEBp+oTpb7F50dwEVX7rf3IgwO9XatnegTsDtniKCUtEJH4fSU6Asw7uoVLfQ==", - "dev": true - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, "json5": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", @@ -5910,101 +5925,66 @@ "emojis-list": "^2.0.0", "json5": "^1.0.1" } - }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - }, - "yargs": { - "version": "12.0.5", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", - "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", - "dev": true, - "requires": { - "cliui": "^4.0.0", - "decamelize": "^1.2.0", - "find-up": "^3.0.0", - "get-caller-file": "^1.0.1", - "os-locale": "^3.0.0", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^2.0.0", - "which-module": "^2.0.0", - "y18n": "^3.2.1 || ^4.0.0", - "yargs-parser": "^11.1.1" - } - }, - "yargs-parser": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", - "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } } } }, "webpack-dev-middleware": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.6.1.tgz", - "integrity": "sha512-XQmemun8QJexMEvNFbD2BIg4eSKrmSIMrTfnl2nql2Sc6OGAYFyb8rwuYrCjl/IiEYYuyTEiimMscu7EXji/Dw==", + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.0.tgz", + "integrity": "sha512-qvDesR1QZRIAZHOE3iQ4CXLZZSQ1lAUsSpnQmlB1PBfoN/xdRjmge3Dok0W4IdaVLJOGJy3sGI4sZHwjRU0PCA==", "dev": true, "requires": { "memory-fs": "^0.4.1", - "mime": "^2.3.1", - "range-parser": "^1.0.3", + "mime": "^2.4.2", + "range-parser": "^1.2.1", "webpack-log": "^2.0.0" }, "dependencies": { "mime": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.0.tgz", - "integrity": "sha512-ikBcWwyqXQSHKtciCcctu9YfPbFYZ4+gbHEmE0Q8jzcTYQg5dHCr3g2wwAZjPoJfQVXZq6KXAjpXOTf5/cjT7w==", + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", + "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==", "dev": true } } }, "webpack-dev-server": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.2.1.tgz", - "integrity": "sha512-sjuE4mnmx6JOh9kvSbPYw3u/6uxCLHNWfhWaIPwcXWsvWOPN+nc5baq4i9jui3oOBRXGonK9+OI0jVkaz6/rCw==", + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.7.2.tgz", + "integrity": "sha512-mjWtrKJW2T9SsjJ4/dxDC2fkFVUw8jlpemDERqV0ZJIkjjjamR2AbQlr3oz+j4JLhYCHImHnXZK5H06P2wvUew==", "dev": true, "requires": { "ansi-html": "0.0.7", "bonjour": "^3.5.0", - "chokidar": "^2.0.0", - "compression": "^1.5.2", - "connect-history-api-fallback": "^1.3.0", + "chokidar": "^2.1.6", + "compression": "^1.7.4", + "connect-history-api-fallback": "^1.6.0", "debug": "^4.1.1", - "del": "^3.0.0", - "express": "^4.16.2", - "html-entities": "^1.2.0", + "del": "^4.1.1", + "express": "^4.17.1", + "html-entities": "^1.2.1", "http-proxy-middleware": "^0.19.1", "import-local": "^2.0.0", - "internal-ip": "^4.2.0", + "internal-ip": "^4.3.0", "ip": "^1.1.5", - "killable": "^1.0.0", - "loglevel": "^1.4.1", - "opn": "^5.1.0", - "portfinder": "^1.0.9", + "killable": "^1.0.1", + "loglevel": "^1.6.3", + "opn": "^5.5.0", + "p-retry": "^3.0.1", + "portfinder": "^1.0.20", "schema-utils": "^1.0.0", - "selfsigned": "^1.9.1", - "semver": "^5.6.0", - "serve-index": "^1.7.2", + "selfsigned": "^1.10.4", + "semver": "^6.1.1", + "serve-index": "^1.9.1", "sockjs": "0.3.19", "sockjs-client": "1.3.0", "spdy": "^4.0.0", - "strip-ansi": "^3.0.0", + "strip-ansi": "^3.0.1", "supports-color": "^6.1.0", "url": "^0.11.0", - "webpack-dev-middleware": "^3.5.1", + "webpack-dev-middleware": "^3.7.0", "webpack-log": "^2.0.0", - "yargs": "12.0.2" + "yargs": "12.0.5" }, "dependencies": { "debug": { @@ -6017,9 +5997,15 @@ } }, "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "semver": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.1.1.tgz", + "integrity": "sha512-rWYq2e5iYW+fFe/oPPtYJxYgjBm8sC4rmoGdUOgBB7VnwKt6HrL793l2voH1UlsyYZpJ4g0wfjnTEO1s1NP2eQ==", "dev": true }, "supports-color": { @@ -6036,7 +6022,7 @@ "webpack-log": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz", - "integrity": "sha1-W3ko4GN1k/EZ0y9iJ8HgrDHhtH8=", + "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", "dev": true, "requires": { "ansi-colors": "^3.0.0", @@ -6046,7 +6032,7 @@ "webpack-sources": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.3.0.tgz", - "integrity": "sha1-KijcufH0X+lg2PFJMlK17mUw+oU=", + "integrity": "sha512-OiVgSrbGu7NEnEvQJJgdSFPl2qWKkWq5lHMhgiToIiN9w34EBnjYzSYs+VbL5KoYiLNtFFa7BZIKxRED3I32pA==", "dev": true, "requires": { "source-list-map": "^2.0.0", @@ -6054,12 +6040,13 @@ } }, "websocket-driver": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.0.tgz", - "integrity": "sha1-DK+dLXVdk67gSdS90NP+LMoqJOs=", + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.3.tgz", + "integrity": "sha512-bpxWlvbbB459Mlipc5GBzzZwhoZgGEZLuqPaR0INBGnPAY1vdBX6hPnoFXiw+3yWxDuHyQjO2oXTMyS8A5haFg==", "dev": true, "requires": { - "http-parser-js": ">=0.4.0", + "http-parser-js": ">=0.4.0 <0.4.11", + "safe-buffer": ">=5.1.0", "websocket-extensions": ">=0.1.1" } }, @@ -6072,7 +6059,7 @@ "which": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha1-pFBD1U9YBTFtqNYvn1CRjT2nCwo=", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dev": true, "requires": { "isexe": "^2.0.0" @@ -6085,9 +6072,9 @@ "dev": true }, "worker-farm": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.6.0.tgz", - "integrity": "sha1-rsxAWXb6talVJhgIRvDboojzpKA=", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", + "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", "dev": true, "requires": { "errno": "~0.1.7" @@ -6139,12 +6126,6 @@ "async-limiter": "^1.0.0" } }, - "xregexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-4.0.0.tgz", - "integrity": "sha1-5pgYneSd0qGMxWh7BeF8jkOUMCA=", - "dev": true - }, "xtend": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", @@ -6154,23 +6135,23 @@ "y18n": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha1-le+U+F7MgdAHwmThkKEg8KPIVms=", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", "dev": true }, "yallist": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", - "integrity": "sha1-tLBJ4xS+VF486AIjbWzSLNkcPek=", + "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==", "dev": true }, "yargs": { - "version": "12.0.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.2.tgz", - "integrity": "sha512-e7SkEx6N6SIZ5c5H22RTZae61qtn3PYUE8JYbBFlK9sYmh3DMQ6E5ygtaG/2BW0JZi4WGgTR2IV5ChqlqrDGVQ==", + "version": "12.0.5", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", + "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", "dev": true, "requires": { "cliui": "^4.0.0", - "decamelize": "^2.0.0", + "decamelize": "^1.2.0", "find-up": "^3.0.0", "get-caller-file": "^1.0.1", "os-locale": "^3.0.0", @@ -6180,61 +6161,17 @@ "string-width": "^2.0.0", "which-module": "^2.0.0", "y18n": "^3.2.1 || ^4.0.0", - "yargs-parser": "^10.1.0" - }, - "dependencies": { - "find-up": { - "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" - } - }, - "locate-path": { - "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" - } - }, - "p-limit": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.0.0.tgz", - "integrity": "sha512-fl5s52lI5ahKCernzzIyAP0QAZbGIovtVHGwpcu1Jr/EpzLVDI2myISHwGqK7m8uQFugVWSrbxH7XnhGtvEc+A==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "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" - } - }, - "p-try": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz", - "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==", - "dev": true - } + "yargs-parser": "^11.1.1" } }, "yargs-parser": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.1.0.tgz", - "integrity": "sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==", + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", + "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", "dev": true, "requires": { - "camelcase": "^4.1.0" + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" } } } diff --git a/backends/conrod_crayon/tools/wasm-template/package.json b/backends/conrod_crayon/tools/wasm-template/package.json index 6ed0231d1..f85d54ed4 100644 --- a/backends/conrod_crayon/tools/wasm-template/package.json +++ b/backends/conrod_crayon/tools/wasm-template/package.json @@ -6,11 +6,12 @@ "devDependencies": { "html-webpack-plugin": "^3.2.0", "text-encoding": "^0.7.0", - "webpack": "^4.29.6", - "webpack-cli": "^3.2.3", - "webpack-dev-server": "^3.2.1" + "webpack": "^4.35.0", + "webpack-cli": "^3.3.4", + "webpack-dev-server": "^3.7.2" }, "dependencies": { + "@open-wc/webpack-import-meta-loader": "^0.2.4", "ws": "^7.0.0" } } diff --git a/backends/conrod_crayon/tools/wasm-template/run.3.sh b/backends/conrod_crayon/tools/wasm-template/run.3.sh new file mode 100755 index 000000000..40908948e --- /dev/null +++ b/backends/conrod_crayon/tools/wasm-template/run.3.sh @@ -0,0 +1,11 @@ +SCRIPT_DIR=$(dirname "$0") +BASE_DIR=$SCRIPT_DIR/../../../../ + +set -e +cargo build --example $1 --target wasm32-unknown-unknown +rm -rf $SCRIPT_DIR/dist +mkdir $SCRIPT_DIR/dist +mkdir $SCRIPT_DIR/dist/intermediate +cp $BASE_DIR/target/wasm32-unknown-unknown/debug/examples/$1.wasm $SCRIPT_DIR/dist/intermediate/native.wasm +wasm-bindgen --target web $SCRIPT_DIR/dist/intermediate/native.wasm --out-dir $SCRIPT_DIR/dist --no-typescript +cd $SCRIPT_DIR \ No newline at end of file diff --git a/backends/conrod_crayon/tools/wasm-template/webpack.config.js b/backends/conrod_crayon/tools/wasm-template/webpack.config.js index 0a477b19a..510849928 100644 --- a/backends/conrod_crayon/tools/wasm-template/webpack.config.js +++ b/backends/conrod_crayon/tools/wasm-template/webpack.config.js @@ -3,7 +3,7 @@ const HtmlWebpackPlugin = require('html-webpack-plugin'); const webpack = require('webpack'); module.exports = { - entry: './index1.js', + entry: './index.js', output: { path: path.resolve(__dirname, 'dist'), filename: 'index.js', @@ -26,6 +26,14 @@ module.exports = { node: { fs: "empty" }, + module: { + rules: [ + { + test: /\.js$/, + loader: require.resolve('@open-wc/webpack-import-meta-loader'), + }, + ], + }, externals: [ 'utf-8-validate', 'bufferutil'], mode: 'development' }; \ No newline at end of file diff --git a/backends/conrod_ggez/Cargo.toml b/backends/conrod_ggez/Cargo.toml index 6d1a79108..295273bd0 100644 --- a/backends/conrod_ggez/Cargo.toml +++ b/backends/conrod_ggez/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "conrod_ggez" -version = "0.62.0" +version = "0.65.0" authors = ["Mitchell Nordine "] keywords = ["ui", "widgets", "gui", "interface", "graphics"] description = "An easy-to-use, 100% Rust, extensible 2D GUI library." @@ -16,21 +16,21 @@ name = "conrod_ggez" path = "./src/lib.rs" [dependencies] -conrod_core = { path = "../../conrod_core", version = "0.63" } +conrod_core = { path = "../../conrod_core", version = "0.65" } gfx = { version = "0.17" } gfx_core = { version = "0.8" } gfx_device_gl = "0.15" [target.'cfg(not(target_arch = "wasm32"))'.dependencies] ggez = { git = "https://github.com/ozkriff/ggez", rev = "a23153a18" } -conrod_winit = { path = "../conrod_winit", version = "0.63" } +conrod_winit = { path = "../conrod_winit", version = "0.65" } [target.'cfg(target_arch = "wasm32")'.dependencies] good-web-game = { git="https://github.com/not-fl3/good-web-game"} stdweb = "0.4.12" [dev-dependencies] -conrod_example_shared = { path = "../conrod_example_shared", version = "0.63" } +conrod_example_shared = { path = "../conrod_example_shared", version = "0.65" } find_folder = "0.3.0" image = "0.19" petgraph = "0.4" diff --git a/backends/conrod_svg/Cargo.toml b/backends/conrod_svg/Cargo.toml index 20925dfac..e00a6f1d9 100644 --- a/backends/conrod_svg/Cargo.toml +++ b/backends/conrod_svg/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "conrod_svg" -version = "0.62.0" +version = "0.65.0" authors = ["Mitchell Nordine "] keywords = ["ui", "widgets", "gui", "interface", "graphics"] description = "An easy-to-use, 100% Rust, extensible 2D GUI library." @@ -16,8 +16,8 @@ name = "conrod_svg" path = "./src/lib.rs" [dependencies] -conrod_core = { path = "../../conrod_core", version = "0.63" } -conrod_example_shared = { path = "../conrod_example_shared", version = "0.63" } +conrod_core = { path = "../../conrod_core", version = "0.65" } +conrod_example_shared = { path = "../conrod_example_shared", version = "0.65" } svg = "0.5.12" serde_json = "1.0" cgmath = "0.16.1" diff --git a/conrod_core/Cargo.toml b/conrod_core/Cargo.toml index 6a1400ed3..511678120 100644 --- a/conrod_core/Cargo.toml +++ b/conrod_core/Cargo.toml @@ -28,4 +28,4 @@ fnv = "1.0" num = "0.2" pistoncore-input = "0.24" rusttype = { version = "0.7", features = ["gpu_cache"] } -instant = "0.1" +instant = {path="../../wasm/instant", version="0.1.1", features = [ "wasm-bindgen","now" ]} diff --git a/conrod_core/src/lib.rs b/conrod_core/src/lib.rs index ab382b55a..fbbd00326 100644 --- a/conrod_core/src/lib.rs +++ b/conrod_core/src/lib.rs @@ -14,6 +14,7 @@ extern crate fnv; extern crate num; extern crate input as piston_input; extern crate rusttype; +extern crate instant; pub use color::{Color, Colorable}; pub use conrod_derive::*; diff --git a/conrod_core/src/ui.rs b/conrod_core/src/ui.rs index b521cb23c..99e7db606 100644 --- a/conrod_core/src/ui.rs +++ b/conrod_core/src/ui.rs @@ -12,6 +12,7 @@ use theme::Theme; use widget::{self, Widget}; use cursor; use utils; +use instant; /// A constructor type for building a `Ui` instance with a set of optional parameters. pub struct UiBuilder { /// The initial dimensions of the window in which the `Ui` exists. From a9fa917dd19e38158ab97c78d80003ff1c5126e4 Mon Sep 17 00:00:00 2001 From: alanpoon Date: Sun, 30 Jun 2019 21:32:40 +0800 Subject: [PATCH 53/64] change glyph to RGBA8 --- backends/conrod_crayon/src/lib.rs | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/backends/conrod_crayon/src/lib.rs b/backends/conrod_crayon/src/lib.rs index cc68d168e..1b48f262d 100644 --- a/backends/conrod_crayon/src/lib.rs +++ b/backends/conrod_crayon/src/lib.rs @@ -7,7 +7,6 @@ use crayon::impl_vertex; use crayon::prelude::*; use crayon::errors::Result; use crayon::video::assets::texture::*; - pub mod events; use conrod_core::{ Rect, @@ -117,7 +116,6 @@ pub struct Commands<'a> { } impl Renderer{ pub fn new(dim:(f64,f64),dpi_factor: f64)->Self{ - let attributes = AttributeLayoutBuilder::new() .with(Attribute::Position, 2) .with(Attribute::Texcoord0, 2) @@ -132,7 +130,7 @@ impl Renderer{ params.state.color_blend = Some((crayon::video::assets::shader::Equation::Add, crayon::video::assets::shader::BlendFactor::Value(crayon::video::assets::shader::BlendValue::SourceAlpha), crayon::video::assets::shader::BlendFactor::OneMinusValue(crayon::video::assets::shader::BlendValue::SourceAlpha))); - + params.attributes = attributes; params.uniforms = uniforms; //looking for Position @@ -306,7 +304,14 @@ impl Renderer{ let p1 = cgmath::Point2::new(lbwh[0],lbwh[1]); let p2 = cgmath::Point2::new(lbwh[2],lbwh[3]); let rect = crayon::math::aabb::Aabb2::new(p1,p2); - video::update_texture(*texture,rect,data).unwrap(); + let mut new_data:Vec = vec![]; + for j in data.to_vec(){ + new_data.push(j); + for _z in 1..4{ + new_data.push(0); + } + } + video::update_texture(*texture,rect,&new_data).unwrap(); }).unwrap(); @@ -328,6 +333,7 @@ impl Renderer{ if let Ok(Some((uv_rect, screen_rect))) = cache.rect_for(cache_id, g) { let gl_rect = to_gl_rect(screen_rect); + let v = |p:[f32;2],t:[f32;2]| {Vertex::new(p,t,color,MODE_TEXT)}; let mut push_v = |p, t| vertices.push(v(p, t)); push_v([gl_rect.min.x, gl_rect.max.y], [uv_rect.min.x, uv_rect.max.y]); @@ -551,7 +557,7 @@ fn glyph_cache_texture( { // Determine the optimal texture format to use given the opengl version. let mut params = TextureParams::default(); - params.format = TextureFormat::R8; + params.format = TextureFormat::RGBA8; params.hint = TextureHint::Stream; params.dimensions = (width, height).into(); let data_size = params.format.size(params.dimensions) as usize; From bdcc46110e374d0ccfb422b70852e7034fc8b4f6 Mon Sep 17 00:00:00 2001 From: alanpoon Date: Sun, 30 Jun 2019 21:40:25 +0800 Subject: [PATCH 54/64] clean up --- Xargo.toml | 4 -- backends/conrod_crayon/Xargo.toml | 4 -- backends/conrod_crayon/examples/crayon.rs | 41 +++---------------- .../tools/wasm-template/Xargo.toml | 4 -- .../tools/wasm-template/index1.js | 38 ----------------- .../tools/wasm-template/run.1.sh | 13 ------ .../tools/wasm-template/run.2.sh | 11 ----- .../tools/wasm-template/run.3.sh | 11 ----- .../conrod_crayon/tools/wasm-template/run.sh | 5 +-- t.txt | 11 ----- 10 files changed, 8 insertions(+), 134 deletions(-) delete mode 100644 Xargo.toml delete mode 100644 backends/conrod_crayon/Xargo.toml delete mode 100644 backends/conrod_crayon/tools/wasm-template/Xargo.toml delete mode 100644 backends/conrod_crayon/tools/wasm-template/index1.js delete mode 100755 backends/conrod_crayon/tools/wasm-template/run.1.sh delete mode 100755 backends/conrod_crayon/tools/wasm-template/run.2.sh delete mode 100755 backends/conrod_crayon/tools/wasm-template/run.3.sh delete mode 100644 t.txt diff --git a/Xargo.toml b/Xargo.toml deleted file mode 100644 index 7c9918823..000000000 --- a/Xargo.toml +++ /dev/null @@ -1,4 +0,0 @@ -[target.wasm32-unknown-unknown.dependencies.std] -features = [ - "wasm_syscall", -] diff --git a/backends/conrod_crayon/Xargo.toml b/backends/conrod_crayon/Xargo.toml deleted file mode 100644 index 7c9918823..000000000 --- a/backends/conrod_crayon/Xargo.toml +++ /dev/null @@ -1,4 +0,0 @@ -[target.wasm32-unknown-unknown.dependencies.std] -features = [ - "wasm_syscall", -] diff --git a/backends/conrod_crayon/examples/crayon.rs b/backends/conrod_crayon/examples/crayon.rs index b7d64a3bb..225bdee92 100644 --- a/backends/conrod_crayon/examples/crayon.rs +++ b/backends/conrod_crayon/examples/crayon.rs @@ -1,3 +1,4 @@ +//Resources to be build by crayon-cli tool extern crate crayon; extern crate conrod_crayon; extern crate conrod_example_shared; @@ -42,24 +43,17 @@ struct Window { time: f32, resources: WindowResources } -//crayon_bytes = { git = "https://github.com/alanpoon/crayon.git", branch ="textedit"} -//crayon = { git = "https://github.com/alanpoon/crayon.git", branch ="textedit"} + impl Window { pub fn build(resources: &WindowResources) -> CrResult { let mut ui = conrod_core::UiBuilder::new([WIN_W as f64, WIN_H as f64]) - // .theme(conrod_example_shared::theme()) .build(); - //let ids = conrod_example_shared::Ids::new(ui.widget_id_generator()); - let ids = Ids::new(ui.widget_id_generator()); let mut image_map: conrod_core::image::Map = conrod_core::image::Map::new(); - let rust_logo = image_map.insert(load_rust_logo()); - dbg!("l"); - // Demonstration app state that we'll control with our conrod GUI. + let rust_logo = image_map.insert(load_crate_logo()); let app = conrod_example_shared::DemoApp::new(rust_logo); let dpi_factor = device_pixel_ratio(); - println!("dpi {:?}",dpi_factor); let renderer = conrod_crayon::Renderer::new((WIN_W as f64,WIN_H as f64), dpi_factor as f64); let f = ui.fonts.insert(load_bold(resources.b)); ui.theme.font_id = Some(f); @@ -87,16 +81,6 @@ impl Window { impl Drop for Window { fn drop(&mut self) { - /*video::delete_render_texture(self.texture); - - video::delete_mesh(self.pass.mesh); - video::delete_shader(self.pass.shader); - video::delete_surface(self.pass.surface); - - video::delete_mesh(self.post_effect.mesh); - video::delete_shader(self.post_effect.shader); - video::delete_surface(self.post_effect.surface); - */ } } @@ -107,12 +91,7 @@ impl LifecycleListener for Window { let mut ui = &mut self.ui.set_widgets(); const LOGO_SIDE: conrod_core::Scalar = 306.0; - /* - widget::Image::new(self.app.rust_logo) - .w_h(LOGO_SIDE, LOGO_SIDE) - .middle() - .set(self.ids.canvas, ui); - */ + widget::Canvas::new() .scroll_kids_vertically() .color(color::BLUE) @@ -127,21 +106,13 @@ impl LifecycleListener for Window { .center_justify() .line_spacing(2.5) .set(self.ids.text,ui){ - println!("aa{:?}",edit.clone()); self.text = edit; } - - //widget::Scrollbar::y_axis(self.ids.canvas).auto_hide(true).set(self.ids.scrollbar, ui); - /* - widget::Rectangle::fill_with([80.0, 80.0],color::ORANGE) - .middle() - .set(self.ids.text, ui); - */ + } let dpi_factor = device_pixel_ratio() as f64; - //let dpi_factor =1.16; let primitives = self.ui.draw(); let dims = (WIN_W as f64 * dpi_factor, WIN_H as f64 * dpi_factor); self.renderer.fill(dims,dpi_factor as f64,primitives,&self.image_map); @@ -150,7 +121,7 @@ impl LifecycleListener for Window { Ok(()) } } -fn load_rust_logo() -> TextureHandle { +fn load_crate_logo() -> TextureHandle { video::create_texture_from("res:crate.bmp").unwrap() } fn load_bold(handle:BytesHandle) ->Font{ diff --git a/backends/conrod_crayon/tools/wasm-template/Xargo.toml b/backends/conrod_crayon/tools/wasm-template/Xargo.toml deleted file mode 100644 index ca5786a24..000000000 --- a/backends/conrod_crayon/tools/wasm-template/Xargo.toml +++ /dev/null @@ -1,4 +0,0 @@ -[dependencies.std] -features = [ - "wasm_syscall", -] diff --git a/backends/conrod_crayon/tools/wasm-template/index1.js b/backends/conrod_crayon/tools/wasm-template/index1.js deleted file mode 100644 index 20b20ee13..000000000 --- a/backends/conrod_crayon/tools/wasm-template/index1.js +++ /dev/null @@ -1,38 +0,0 @@ - -import wasi_unstable from "./dist/polyfill.js"; -const ws = require("ws"); -import init from "./dist/native" -// FIXME dirty hack for wasm_syscall -for (var p in Module){ - console.log("p",p); -} -const env = { - rust_wasm_syscall: (index, data) => { - console.log("rust_wasm_syscall", index, data); - // See https://github.com/rust-lang/rust/blob/master/src/libstd/sys/wasm/mod.rs - switch (index) { - case 6: - return 1; - default: - return 0; - } - } -}; - -const instantiateStreaming = WebAssembly.instantiateStreaming; -WebAssembly.instantiateStreaming = (source, importObject) => - instantiateStreaming(source, { - ...importObject, - env,ws - }); -const instantiate = WebAssembly.instantiate; -WebAssembly.instantiate = (bufferSource, importObject) => - instantiate(bufferSource, { - ...importObject, - env,ws - }); - // init("./dist/native_bg.wasm") - - - -// vim: set ts=2 sw=2 et: diff --git a/backends/conrod_crayon/tools/wasm-template/run.1.sh b/backends/conrod_crayon/tools/wasm-template/run.1.sh deleted file mode 100755 index 3b0a3ad86..000000000 --- a/backends/conrod_crayon/tools/wasm-template/run.1.sh +++ /dev/null @@ -1,13 +0,0 @@ -SCRIPT_DIR=$(dirname "$0") -BASE_DIR=$SCRIPT_DIR/../../../../ - -set -e -cargo +nightly build --example $1 --target wasm32-unknown-wasi -rm -rf $SCRIPT_DIR/dist -mkdir $SCRIPT_DIR/dist -mkdir $SCRIPT_DIR/dist/intermediate -cp $BASE_DIR/target/wasm32-unknown-wasi/debug/examples/$1.wasm $SCRIPT_DIR/dist/intermediate/native.wasm -wasm-bindgen --target web $SCRIPT_DIR/dist/intermediate/native.wasm --out-dir $SCRIPT_DIR/dist --no-typescript -cp ../polyfill.js $SCRIPT_DIR/dist/polyfill.js -cp ../polyfill.wasm $SCRIPT_DIR/dist/polyfill.wasm -cd $SCRIPT_DIR \ No newline at end of file diff --git a/backends/conrod_crayon/tools/wasm-template/run.2.sh b/backends/conrod_crayon/tools/wasm-template/run.2.sh deleted file mode 100755 index ce1a14919..000000000 --- a/backends/conrod_crayon/tools/wasm-template/run.2.sh +++ /dev/null @@ -1,11 +0,0 @@ -SCRIPT_DIR=$(dirname "$0") -BASE_DIR=$SCRIPT_DIR/../../../../ - -set -e -xargo build --example $1 --target wasm32-unknown-unknown -rm -rf $SCRIPT_DIR/dist -mkdir $SCRIPT_DIR/dist -mkdir $SCRIPT_DIR/dist/intermediate -cp $BASE_DIR/target/wasm32-unknown-unknown/debug/examples/$1.wasm $SCRIPT_DIR/dist/intermediate/native.wasm -wasm-bindgen --target web $SCRIPT_DIR/dist/intermediate/native.wasm --out-dir $SCRIPT_DIR/dist --no-typescript -cd $SCRIPT_DIR \ No newline at end of file diff --git a/backends/conrod_crayon/tools/wasm-template/run.3.sh b/backends/conrod_crayon/tools/wasm-template/run.3.sh deleted file mode 100755 index 40908948e..000000000 --- a/backends/conrod_crayon/tools/wasm-template/run.3.sh +++ /dev/null @@ -1,11 +0,0 @@ -SCRIPT_DIR=$(dirname "$0") -BASE_DIR=$SCRIPT_DIR/../../../../ - -set -e -cargo build --example $1 --target wasm32-unknown-unknown -rm -rf $SCRIPT_DIR/dist -mkdir $SCRIPT_DIR/dist -mkdir $SCRIPT_DIR/dist/intermediate -cp $BASE_DIR/target/wasm32-unknown-unknown/debug/examples/$1.wasm $SCRIPT_DIR/dist/intermediate/native.wasm -wasm-bindgen --target web $SCRIPT_DIR/dist/intermediate/native.wasm --out-dir $SCRIPT_DIR/dist --no-typescript -cd $SCRIPT_DIR \ No newline at end of file diff --git a/backends/conrod_crayon/tools/wasm-template/run.sh b/backends/conrod_crayon/tools/wasm-template/run.sh index fb1351846..40908948e 100755 --- a/backends/conrod_crayon/tools/wasm-template/run.sh +++ b/backends/conrod_crayon/tools/wasm-template/run.sh @@ -2,11 +2,10 @@ SCRIPT_DIR=$(dirname "$0") BASE_DIR=$SCRIPT_DIR/../../../../ set -e -xargo build --example $1 --target wasm32-unknown-unknown +cargo build --example $1 --target wasm32-unknown-unknown rm -rf $SCRIPT_DIR/dist mkdir $SCRIPT_DIR/dist mkdir $SCRIPT_DIR/dist/intermediate cp $BASE_DIR/target/wasm32-unknown-unknown/debug/examples/$1.wasm $SCRIPT_DIR/dist/intermediate/native.wasm -wasm-bindgen $SCRIPT_DIR/dist/intermediate/native.wasm --out-dir $SCRIPT_DIR/dist --no-typescript - +wasm-bindgen --target web $SCRIPT_DIR/dist/intermediate/native.wasm --out-dir $SCRIPT_DIR/dist --no-typescript cd $SCRIPT_DIR \ No newline at end of file diff --git a/t.txt b/t.txt deleted file mode 100644 index 7750bf2fe..000000000 --- a/t.txt +++ /dev/null @@ -1,11 +0,0 @@ -Ft@http://localhost:8080/2.index.js:1:17622 -__wbg_new_59cb74e423758ede@http://localhost:8080/index.js:1:15967 -console_error_panic_hook::Error::new::hce71d1bffc638a0a@http://localhost:8080/8434eb05ac5fcc2e8cda.module.wasm:wasm-function[11033]:0x565f41 -console_error_panic_hook::hook_impl::had064aee99cdcd99@http://localhost:8080/8434eb05ac5fcc2e8cda.module.wasm:wasm-function[4034]:0x3f83c7 -console_error_panic_hook::hook::hfe3e8b789503c05c@http://localhost:8080/8434eb05ac5fcc2e8cda.module.wasm:wasm-function[20382]:0x6277bd -core::ops::function::Fn::call::h70db32678ee792a0@http://localhost:8080/8434eb05ac5fcc2e8cda.module.wasm:wasm-function[18412]:0x609d34 -std::panicking::rust_panic_with_hook::h5d8808384a53a826@http://localhost:8080/8434eb05ac5fcc2e8cda.module.wasm:wasm-function[5773]:0x48333b -std::panicking::begin_panic::h2d913a1addbca25c@http://localhost:8080/8434eb05ac5fcc2e8cda.module.wasm:wasm-function[22371]:0x640079 -std::sys::wasm::TimeSysCall::perform::h259f94c872aa209b@http://localhost:8080/8434eb05ac5fcc2e8cda.module.wasm:wasm-function[23932]:0x64d183 -std::sys::wasm::time::Instant::now::hfac796bd8f165e83@http://localhost:8080/8434eb05ac5fcc2e8cda.module.wasm:wasm-function[24112]:0x64d9fa -std::time::Instant::now::hb25be8 \ No newline at end of file From b57f67e10bb3e6cd03ed7f1035d5091354da8822 Mon Sep 17 00:00:00 2001 From: alanpoon Date: Sun, 30 Jun 2019 21:46:45 +0800 Subject: [PATCH 55/64] update gitignore --- .gitignore | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 9f3c00dd2..8cb14af60 100644 --- a/.gitignore +++ b/.gitignore @@ -20,5 +20,7 @@ target/ /.rust/ rusti.sh /examples/**/target - +assets/crayon/resources Cargo.lock +*/**/dist +*/**/node_modules \ No newline at end of file From 435fcdfd536dfbb8ef845b3f160caf44008001d8 Mon Sep 17 00:00:00 2001 From: alanpoon Date: Sun, 30 Jun 2019 23:01:44 +0800 Subject: [PATCH 56/64] crayon_init --- .gitignore | 5 +- Cargo.toml | 1 + assets/crayon/assets/Oswald-Heavy.ttf | Bin 0 -> 74596 bytes assets/crayon/assets/cornell_box.obj | 118 + assets/crayon/assets/crate.bmp | Bin 0 -> 66614 bytes assets/crayon/assets/music.mp3 | Bin 0 -> 261067 bytes assets/crayon/assets/sfx.ogg | Bin 0 -> 18441 bytes assets/crayon/workspace.toml | 40 + backends/conrod_crayon/Cargo.toml | 28 + backends/conrod_crayon/examples/crayon.rs | 144 + backends/conrod_crayon/src/events.rs | 80 + backends/conrod_crayon/src/lib.rs | 569 ++ backends/conrod_crayon/src/shaders/conrod.fs | 25 + backends/conrod_crayon/src/shaders/conrod.vs | 18 + .../conrod_crayon/tools/profiler/README.md | 8 + backends/conrod_crayon/tools/profiler/run.sh | 17 + .../tools/profiler/scripts/cddl1.txt | 384 + .../tools/profiler/scripts/flamegraph.pl | 1125 +++ .../tools/profiler/scripts/stackcollapse.pl | 109 + .../tools/wasm-template/README.md | 8 + .../conrod_crayon/tools/wasm-template/app.js | 14 + .../conrod_crayon/tools/wasm-template/env.js | 17 + .../tools/wasm-template/index.html | 12 + .../tools/wasm-template/index.js | 35 + .../tools/wasm-template/package-lock.json | 6192 +++++++++++++++++ .../tools/wasm-template/package.json | 17 + .../conrod_crayon/tools/wasm-template/run.sh | 11 + .../tools/wasm-template/webpack.config.js | 39 + 28 files changed, 9015 insertions(+), 1 deletion(-) create mode 100644 assets/crayon/assets/Oswald-Heavy.ttf create mode 100644 assets/crayon/assets/cornell_box.obj create mode 100755 assets/crayon/assets/crate.bmp create mode 100644 assets/crayon/assets/music.mp3 create mode 100644 assets/crayon/assets/sfx.ogg create mode 100644 assets/crayon/workspace.toml create mode 100644 backends/conrod_crayon/Cargo.toml create mode 100644 backends/conrod_crayon/examples/crayon.rs create mode 100644 backends/conrod_crayon/src/events.rs create mode 100644 backends/conrod_crayon/src/lib.rs create mode 100644 backends/conrod_crayon/src/shaders/conrod.fs create mode 100644 backends/conrod_crayon/src/shaders/conrod.vs create mode 100644 backends/conrod_crayon/tools/profiler/README.md create mode 100755 backends/conrod_crayon/tools/profiler/run.sh create mode 100644 backends/conrod_crayon/tools/profiler/scripts/cddl1.txt create mode 100755 backends/conrod_crayon/tools/profiler/scripts/flamegraph.pl create mode 100755 backends/conrod_crayon/tools/profiler/scripts/stackcollapse.pl create mode 100644 backends/conrod_crayon/tools/wasm-template/README.md create mode 100644 backends/conrod_crayon/tools/wasm-template/app.js create mode 100644 backends/conrod_crayon/tools/wasm-template/env.js create mode 100644 backends/conrod_crayon/tools/wasm-template/index.html create mode 100644 backends/conrod_crayon/tools/wasm-template/index.js create mode 100644 backends/conrod_crayon/tools/wasm-template/package-lock.json create mode 100644 backends/conrod_crayon/tools/wasm-template/package.json create mode 100755 backends/conrod_crayon/tools/wasm-template/run.sh create mode 100644 backends/conrod_crayon/tools/wasm-template/webpack.config.js diff --git a/.gitignore b/.gitignore index 9f3c00dd2..3f279feb9 100644 --- a/.gitignore +++ b/.gitignore @@ -20,5 +20,8 @@ target/ /.rust/ rusti.sh /examples/**/target - Cargo.lock +*/**/dist +*/**/node_modules +assets/crayon/resources +**.meta.toml \ No newline at end of file diff --git a/Cargo.toml b/Cargo.toml index bf624ff20..e3e94c751 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -8,4 +8,5 @@ members = [ "backends/conrod_glium", "backends/conrod_piston", "backends/conrod_vulkano", + "backends/conrod_crayon", ] diff --git a/assets/crayon/assets/Oswald-Heavy.ttf b/assets/crayon/assets/Oswald-Heavy.ttf new file mode 100644 index 0000000000000000000000000000000000000000..0db6cf0529f592dca8cc3d314a5d11f9e9c064d6 GIT binary patch literal 74596 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 RMBo_MKkt(JNQU*r@L%R>>VW_N literal 0 HcmV?d00001 diff --git a/assets/crayon/assets/cornell_box.obj b/assets/crayon/assets/cornell_box.obj new file mode 100644 index 000000000..fb00a8ddd --- /dev/null +++ b/assets/crayon/assets/cornell_box.obj @@ -0,0 +1,118 @@ +# The original Cornell Box in OBJ format. +# Note that the real box is not a perfect cube, so +# the faces are imperfect in this data set. +# +# Created by Guedis Cardenas and Morgan McGuire at Williams College, 2011 +# Released into the Public Domain. +# +# http://graphics.cs.williams.edu/data +# http://www.graphics.cornell.edu/online/box/data.html +# + +## Object floor +v -1.01 0.00 0.99 +v 1.00 0.00 0.99 +v 1.00 0.00 -1.04 +v -0.99 0.00 -1.04 + +g floor +usemtl floor +f -4 -3 -2 -1 + +## Object backwall +v -0.99 0.00 -1.04 +v 1.00 0.00 -1.04 +v 1.00 1.99 -1.04 +v -1.02 1.99 -1.04 + +## Object shortBox +g shortBox +usemtl shortBox + +# Top Face +v 0.53 0.60 0.75 +v 0.70 0.60 0.17 +v 0.13 0.60 0.00 +v -0.05 0.60 0.57 +f -4 -3 -2 -1 + +# Left Face +v -0.05 0.00 0.57 +v -0.05 0.60 0.57 +v 0.13 0.60 0.00 +v 0.13 0.00 0.00 +f -4 -3 -2 -1 + +# Front Face +v 0.53 0.00 0.75 +v 0.53 0.60 0.75 +v -0.05 0.60 0.57 +v -0.05 0.00 0.57 +f -4 -3 -2 -1 + +# Right Face +v 0.70 0.00 0.17 +v 0.70 0.60 0.17 +v 0.53 0.60 0.75 +v 0.53 0.00 0.75 +f -4 -3 -2 -1 + +# Back Face +v 0.13 0.00 0.00 +v 0.13 0.60 0.00 +v 0.70 0.60 0.17 +v 0.70 0.00 0.17 +f -4 -3 -2 -1 + +# Bottom Face +v 0.53 0.00 0.75 +v 0.70 0.00 0.17 +v 0.13 0.00 0.00 +v -0.05 0.00 0.57 +f -12 -11 -10 -9 + +## Object tallBox +g tallBox +usemtl tallBox + +# Top Face +v -0.53 1.20 0.09 +v 0.04 1.20 -0.09 +v -0.14 1.20 -0.67 +v -0.71 1.20 -0.49 +f -4 -3 -2 -1 + +# Left Face +v -0.53 0.00 0.09 +v -0.53 1.20 0.09 +v -0.71 1.20 -0.49 +v -0.71 0.00 -0.49 +f -4 -3 -2 -1 + +# Back Face +v -0.71 0.00 -0.49 +v -0.71 1.20 -0.49 +v -0.14 1.20 -0.67 +v -0.14 0.00 -0.67 +f -4 -3 -2 -1 + +# Right Face +v -0.14 0.00 -0.67 +v -0.14 1.20 -0.67 +v 0.04 1.20 -0.09 +v 0.04 0.00 -0.09 +f -4 -3 -2 -1 + +# Front Face +v 0.04 0.00 -0.09 +v 0.04 1.20 -0.09 +v -0.53 1.20 0.09 +v -0.53 0.00 0.09 +f -4 -3 -2 -1 + +# Bottom Face +v -0.53 0.00 0.09 +v 0.04 0.00 -0.09 +v -0.14 0.00 -0.67 +v -0.71 0.00 -0.49 +f -8 -7 -6 -5 \ No newline at end of file diff --git a/assets/crayon/assets/crate.bmp b/assets/crayon/assets/crate.bmp new file mode 100755 index 0000000000000000000000000000000000000000..73fe985a835b40e4bbf09019a9af75399c5d6a2e GIT binary patch literal 66614 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%0DD*gaGAb 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 V^g|5vz5IV)&lB{s|4**xe*wUOQS1N! literal 0 HcmV?d00001 diff --git a/assets/crayon/assets/sfx.ogg b/assets/crayon/assets/sfx.ogg new file mode 100644 index 0000000000000000000000000000000000000000..4ffaee5a01ac042905f244c2b784c65090143755 GIT binary patch literal 18441 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 literal 0 HcmV?d00001 diff --git a/assets/crayon/workspace.toml b/assets/crayon/workspace.toml new file mode 100644 index 000000000..b1ac920d8 --- /dev/null +++ b/assets/crayon/workspace.toml @@ -0,0 +1,40 @@ +[assets] +source = 'assets' +destination = 'resources' + +[[assets.importers]] +type = 'Texture' +extensions = [ + '.png', + '.jpg', + '.jpeg', + '.bmp', + '.tga', + '.psd', # Yes, we do supports .PSD files. +] + +[[assets.importers]] +type = 'Transmission' +extensions = [ + '.obj', + '.blend', + '.fbx', + '.gltf', + '.dae', + '.3ds', +] + +[[assets.importers]] +type = 'Audio' +extensions = [ + '.mp3', + '.wav', + '.ogg', +] + +[[assets.importers]] +type = 'Bytes' +extensions = [ + '.ttf', + '.otf', +] \ No newline at end of file diff --git a/backends/conrod_crayon/Cargo.toml b/backends/conrod_crayon/Cargo.toml new file mode 100644 index 000000000..ef17055b8 --- /dev/null +++ b/backends/conrod_crayon/Cargo.toml @@ -0,0 +1,28 @@ +[package] +name = "conrod_crayon" +version = "0.65.0" +authors = ["Mitchell Nordine "] +keywords = ["ui", "widgets", "gui", "interface", "graphics"] +description = "An easy-to-use, 100% Rust, extensible 2D GUI library." +license = "MIT OR Apache-2.0" +readme = "../../README.md" +repository = "https://github.com/pistondevelopers/conrod.git" +homepage = "https://github.com/pistondevelopers/conrod" +documentation = "https://docs.rs/conrod" +categories = ["gui"] + +[lib] +name = "conrod_crayon" +path = "./src/lib.rs" + +[dependencies] +conrod_core = { path = "../../conrod_core", version = "0.65" } +crayon = { git = "https://github.com/alanpoon/crayon", branch="textedit"} +conrod_example_shared = { path = "../conrod_example_shared", version = "0.65" } +serde_json = "1.0" +crayon_bytes = { git = "https://github.com/alanpoon/crayon", branch="textedit"} +cgmath = "0.16.1" +instant = {git="https://github.com/alanpoon/instant", branch="window_performance", version="0.1.1", features = [ "wasm-bindgen","now" ]} +[target.'cfg(target_arch = "wasm32")'.dependencies] +wasm-bindgen = "0.2.47" + diff --git a/backends/conrod_crayon/examples/crayon.rs b/backends/conrod_crayon/examples/crayon.rs new file mode 100644 index 000000000..225bdee92 --- /dev/null +++ b/backends/conrod_crayon/examples/crayon.rs @@ -0,0 +1,144 @@ +//Resources to be build by crayon-cli tool +extern crate crayon; +extern crate conrod_crayon; +extern crate conrod_example_shared; +#[macro_use] extern crate conrod_core; +extern crate crayon_bytes; + +use crayon::prelude::*; +use crayon_bytes::prelude::*; +use crayon::window::device_pixel_ratio; +use conrod_crayon::Renderer; +use conrod_example_shared::{WIN_W, WIN_H}; +use std::collections::HashMap; +use conrod_core::{color,Colorable, widget, Widget,Positionable,event::{Input},Sizeable,Labelable}; +use conrod_core::text::{Font,FontCollection}; +#[derive(Debug, Clone, Copy)] +struct WindowResources { + b: BytesHandle, +} + +impl WindowResources { + pub fn new() -> CrResult { + crayon_bytes::setup()?; + Ok(WindowResources { + b: crayon_bytes::create_bytes_from("res:Oswald-Heavy.ttf")?, + }) + } +} +impl LatchProbe for WindowResources { + fn is_set(&self) -> bool { + crayon_bytes::state(self.b) != ResourceState::NotReady + } +} +widget_ids!(struct Ids { text,canvas,scrollbar }); +struct Window { + text:String, + renderer: Renderer, + app: conrod_example_shared::DemoApp, + ui: conrod_core::Ui, + ids: Ids, + image_map: conrod_core::image::Map, + batch: CommandBuffer, + time: f32, + resources: WindowResources +} + +impl Window { + pub fn build(resources: &WindowResources) -> CrResult { + + let mut ui = conrod_core::UiBuilder::new([WIN_W as f64, WIN_H as f64]) + .build(); + let ids = Ids::new(ui.widget_id_generator()); + let mut image_map: conrod_core::image::Map = conrod_core::image::Map::new(); + let rust_logo = image_map.insert(load_crate_logo()); + let app = conrod_example_shared::DemoApp::new(rust_logo); + let dpi_factor = device_pixel_ratio(); + let renderer = conrod_crayon::Renderer::new((WIN_W as f64,WIN_H as f64), dpi_factor as f64); + let f = ui.fonts.insert(load_bold(resources.b)); + ui.theme.font_id = Some(f); + let mut demo_text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. \ + Mauris aliquet porttitor tellus vel euismod. Integer lobortis volutpat bibendum. Nulla \ + finibus odio nec elit condimentum, rhoncus fermentum purus lacinia. Interdum et malesuada \ + fames ac ante ipsum primis in faucibus. Cras rhoncus nisi nec dolor bibendum pellentesque. \ + Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. \ + Quisque commodo nibh hendrerit nunc sollicitudin sodales. Cras vitae tempus ipsum. Nam \ + magna est, efficitur suscipit dolor eu, consectetur consectetur urna.".to_owned(); + Ok(Window { + app:app, + text: demo_text, + ui:ui, + ids:ids, + image_map:image_map, + renderer:renderer, + batch: CommandBuffer::new(), + time: 0.0, + resources: *resources + }) + } +} + +impl Drop for Window { + fn drop(&mut self) { + + } +} + +impl LifecycleListener for Window { + fn on_update(&mut self) -> CrResult<()> { + conrod_crayon::events::convert_event(&mut self.ui); + { + let mut ui = &mut self.ui.set_widgets(); + + const LOGO_SIDE: conrod_core::Scalar = 306.0; + + widget::Canvas::new() + .scroll_kids_vertically() + .color(color::BLUE) + .set(self.ids.canvas, ui); + + + for edit in widget::TextEdit::new(&self.text) + .color(color::WHITE) + .font_size(20) + .padded_w_of(self.ids.canvas, 20.0) + .mid_top_of(self.ids.canvas) + .center_justify() + .line_spacing(2.5) + .set(self.ids.text,ui){ + self.text = edit; + + } + + } + + let dpi_factor = device_pixel_ratio() as f64; + let primitives = self.ui.draw(); + let dims = (WIN_W as f64 * dpi_factor, WIN_H as f64 * dpi_factor); + self.renderer.fill(dims,dpi_factor as f64,primitives,&self.image_map); + self.renderer.draw(&mut self.batch,&self.image_map); + + Ok(()) + } +} +fn load_crate_logo() -> TextureHandle { + video::create_texture_from("res:crate.bmp").unwrap() +} +fn load_bold(handle:BytesHandle) ->Font{ + FontCollection::from_bytes(crayon_bytes::create_bytes(handle).unwrap()).unwrap().into_font().unwrap() +} +main!({ + #[cfg(not(target_arch = "wasm32"))] + let res = format!("file://{}/../../assets/crayon/resources/", env!("CARGO_MANIFEST_DIR").replace("\\","/")); + #[cfg(target_arch = "wasm32")] + let res = format!("http://localhost:8080/resources/"); + let mut params = Params::default(); + params.window.title = "CR: RenderTexture".into(); + params.window.size = (WIN_W as u32, WIN_H as u32).into(); + params.res.shortcuts.add("res:", res).unwrap(); + params.res.dirs.push("res:".into()); + crayon::application::setup(params,|| { + let resources = WindowResources::new()?; + Ok(Launcher::new(resources, |r| Window::build(r))) + }).unwrap(); +}); \ No newline at end of file diff --git a/backends/conrod_crayon/src/events.rs b/backends/conrod_crayon/src/events.rs new file mode 100644 index 000000000..db628f4e7 --- /dev/null +++ b/backends/conrod_crayon/src/events.rs @@ -0,0 +1,80 @@ +use conrod_core::event::Input; +use conrod_core::input::Button::Keyboard; +use conrod_core::input::Motion; +use conrod_core::Ui; +use crayon::prelude::*; +use instant::Instant; +pub fn convert_event(ui:&mut Ui)->Option{ + let mouse_presses = input::mouse_presses(); + let w = ui.win_w; + let h = ui.win_h; + let mut action_time = None; + for mp in mouse_presses.iter(){ + let e = match mp{ + crayon::input::mouse::MouseButton::Left => conrod_core::input::state::mouse::Button::Left, + crayon::input::mouse::MouseButton::Right => conrod_core::input::state::mouse::Button::Right, + crayon::input::mouse::MouseButton::Middle => conrod_core::input::state::mouse::Button::Middle, + crayon::input::mouse::MouseButton::Other(_j) => conrod_core::input::state::mouse::Button::Unknown + }; + ui.handle_event(Input::Press(conrod_core::input::Button::Mouse(e))); + if let None = action_time{ + action_time = Some(Instant::now()); + } + } + let mouse_releases = input::mouse_releases(); + for mp in mouse_releases.iter(){ + let e = match mp{ + crayon::input::mouse::MouseButton::Left => conrod_core::input::state::mouse::Button::Left, + crayon::input::mouse::MouseButton::Right => conrod_core::input::state::mouse::Button::Right, + crayon::input::mouse::MouseButton::Middle => conrod_core::input::state::mouse::Button::Middle, + crayon::input::mouse::MouseButton::Other(_j) => conrod_core::input::state::mouse::Button::Unknown + }; + ui.handle_event(Input::Release(conrod_core::input::Button::Mouse(e))); + if let None = action_time{ + action_time = Some(Instant::now()); + } + } + let key_presses = input::key_presses(); + for kp in key_presses.iter(){ + let e = key_convert(serde_json::to_string(kp).unwrap()); + let ee:conrod_core::input::keyboard::Key = serde_json::from_str(&e).unwrap(); + ui.handle_event(Input::Press(Keyboard(ee))); + if let None = action_time{ + action_time = Some(Instant::now()); + } + } + let key_releases = input::key_releases(); + for kp in key_releases.iter(){ + let e = key_convert(serde_json::to_string(kp).unwrap()); + let ee:conrod_core::input::keyboard::Key = serde_json::from_str(&e).unwrap(); + ui.handle_event(Input::Release(Keyboard(ee))); + if let None = action_time{ + action_time = Some(Instant::now()); + } + } + + let j = input::mouse_position(); + ui.handle_event(Input::Motion(Motion::MouseCursor{x:(j.x as f64)-w/2.0,y:(j.y as f64)-h/2.0})); + let j = input::mouse_scroll(); + if j.x > 0.0 || j.y >0.0{ + ui.handle_event(Input::Motion(Motion::Scroll{x:(j.x as f64)-w/2.0,y:(j.y as f64)-h/2.0})); + if let None = action_time{ + action_time = Some(Instant::now()); + } + } + + for k in input::chars(){ + if k != '\u{8}'{ + ui.handle_event(Input::Text(k.to_string())); + } + if let None = action_time{ + action_time = Some(Instant::now()); + } + } + action_time +} + +pub fn key_convert(j:String)->String{ + j.replace("Key","D").replace("Control","Ctrl").replace("LBracket","LeftBracket").replace("RBracket","RightBracket") + .replace("Subtract","Minus").replace("Add","Plus").replace("Back","Backspace").replace("Backspaceslash","Backslash") +} diff --git a/backends/conrod_crayon/src/lib.rs b/backends/conrod_crayon/src/lib.rs new file mode 100644 index 000000000..1b48f262d --- /dev/null +++ b/backends/conrod_crayon/src/lib.rs @@ -0,0 +1,569 @@ +extern crate crayon; +extern crate conrod_core; +extern crate serde_json; +extern crate cgmath; +extern crate instant; +use crayon::impl_vertex; +use crayon::prelude::*; +use crayon::errors::Result; +use crayon::video::assets::texture::*; +pub mod events; +use conrod_core::{ + Rect, + Scalar, + color, + image, + render, + text, +}; + +impl_vertex! { + Vertex { + pos => [Position; Float; 2; false], + uv =>[Texcoord0; Float; 2; false], + color =>[Color0; Float; 4; true], + mode =>[Weight; Float; 1; false], + } +} + +/// Draw text from the text cache texture `tex` in the fragment shader. +pub const MODE_TEXT: f32 = 0.0; +/// Draw an image from the texture at `tex` in the fragment shader. +pub const MODE_IMAGE: f32 = 1.0; +/// Ignore `tex` and draw simple, colored 2D geometry. +pub const MODE_GEOMETRY: f32 = 2.0; +/// A `Command` describing a step in the drawing process. +#[derive(Clone, Debug)] +pub enum Command<'a> { + /// Draw to the target. + Draw(DrawE<'a>), + /// Update the scizzor within the `glium::DrawParameters`. + Scizzor(SurfaceScissor), +} +enum PreparedCommand { + Image(image::Id, std::ops::Range), + Plain(std::ops::Range), + Scizzor(SurfaceScissor), +} +/// A rusttype `GlyphCache` along with a `glium::texture::Texture2d` for caching text on the `GPU`. +pub struct GlyphCache { + cache: text::GlyphCache<'static>, + texture: TextureHandle, +} + +impl GlyphCache { + /// Construct a **GlyphCache** with the given texture dimensions. + /// + /// When calling `GlyphCache::new`, the `get_framebuffer_dimensions` method is used to produce + /// the width and height. However, often creating a texture the size of the screen might not be + /// large enough to cache the necessary text for an application. The following constant + /// multiplier is used to ensure plenty of room in the cache. + pub fn with_dimensions( + width: u32, + height: u32, + ) -> Result + { + // First, the rusttype `Cache` which performs the logic for rendering and laying out glyphs + // in the cache. + let cache = rusttype_glyph_cache(width, height); + + // Now the texture to which glyphs will be rendered. + let texture = glyph_cache_texture(width, height)?; + + Ok(GlyphCache { + cache: cache, + texture: texture, + }) + } + + /// Construct a `GlyphCache` with a size equal to the given `Display`'s current framebuffer + /// dimensions. + pub fn new(dim:(f64,f64)) -> Result + { + Self::with_dimensions(dim.0 as u32, dim.1 as u32) + } + + /// The texture used to cache the glyphs on the GPU. + pub fn texture(&self) -> &TextureHandle { + &self.texture + } +} + +pub struct Renderer { + glyph_cache: GlyphCache, + vertices: Vec, + shader: ShaderHandle, + surface: SurfaceHandle, + //rendered_texture:RenderTextureHandle, + commands: Vec, +} +/// A `Command` for drawing to the target. +/// +/// Each variant describes how to draw the contents of the vertex buffer. +#[derive(Clone, Debug)] +pub enum DrawE<'a> { + /// A range of vertices representing triangles textured with the image in the + /// image_map at the given `widget::Id`. + Image(image::Id, &'a [Vertex]), + /// A range of vertices representing plain triangles. + Plain(&'a [Vertex]), + Test, +} + +pub struct Commands<'a> { + commands: std::slice::Iter<'a, PreparedCommand>, + vertices: &'a [Vertex], +} +impl Renderer{ + pub fn new(dim:(f64,f64),dpi_factor: f64)->Self{ + let attributes = AttributeLayoutBuilder::new() + .with(Attribute::Position, 2) + .with(Attribute::Texcoord0, 2) + .with(Attribute::Color0, 4) + .with(Attribute::Weight,1) + .finish(); + let uniforms = UniformVariableLayout::build() + .with("tex", UniformVariableType::Texture) + .finish(); + let mut params = ShaderParams::default(); + + params.state.color_blend = Some((crayon::video::assets::shader::Equation::Add, + crayon::video::assets::shader::BlendFactor::Value(crayon::video::assets::shader::BlendValue::SourceAlpha), + crayon::video::assets::shader::BlendFactor::OneMinusValue(crayon::video::assets::shader::BlendValue::SourceAlpha))); + + params.attributes = attributes; + params.uniforms = uniforms; + //looking for Position + let vs = include_str!("shaders/conrod.vs").to_owned(); + let fs = include_str!("shaders/conrod.fs").to_owned(); + let shader = video::create_shader(params.clone(), vs, fs).unwrap(); + + let mut params = SurfaceParams::default(); + params.set_clear(None, None, None); + let vert:Vec = Vec::new(); + let commands:Vec = Vec::new(); + let surface = video::create_surface(params).unwrap(); + + Renderer{ + glyph_cache:GlyphCache::new((dim.0 * dpi_factor,dim.1 * dpi_factor)).unwrap(), + vertices: vert, + shader:shader, + surface:surface, + commands: commands + } + } + + pub fn commands(&self) -> Commands { + let Renderer { ref commands, ref vertices, .. } = *self; + Commands { + commands: commands.iter(), + vertices: vertices, + } + } + pub fn fill

(&mut self,dims: (f64, f64),dpi_factor: f64,mut primitives: P, image_map:&conrod_core::image::Map )where P: render::PrimitiveWalker{ + let (screen_w, screen_h) = dims; + let half_win_w = screen_w / 2.0; + let half_win_h = screen_h / 2.0; + let Renderer { ref mut vertices,shader,surface,ref mut commands, ref mut glyph_cache,..} = *self; + commands.clear(); + vertices.clear(); + let mut current_scissor =SurfaceScissor::Enable{ + position: Vector2{x:0,y:0}, + size: Vector2{x:screen_w as u32,y:screen_h as u32} + }; + enum State { + Image { image_id: image::Id, start: usize }, + Plain { start: usize }, + } + let mut current_state = State::Plain { start: 0 }; + macro_rules! switch_to_plain_state { + () => { + match current_state { + State::Plain { .. } => (), + State::Image { image_id, start } => { + commands.push(PreparedCommand::Image(image_id, start..vertices.len())); + current_state = State::Plain { start: vertices.len() }; + }, + } + }; + } + let rect_to_crayon_rect = |rect: Rect| { + let (w, h) = rect.w_h(); + let left = (rect.left() * dpi_factor + half_win_w) as i32; + let bottom = (rect.bottom() * dpi_factor + half_win_h) as i32; + let width = (w * dpi_factor) as u32; + let height = (h * dpi_factor) as u32; + SurfaceScissor::Enable{ + position: Vector2{x:std::cmp::max(left, 0),y:std::cmp::max(bottom, 0)}, + size: Vector2{x:std::cmp::min(width, screen_w as u32),y: std::cmp::min(height, screen_h as u32)} + } + }; + + let vx = |x: f64| (x * dpi_factor / half_win_w) as f32; + let vy = |y: f64| (y * dpi_factor / half_win_h) as f32; + + while let Some(primitive) = primitives.next_primitive() { + let render::Primitive { kind, scizzor, rect, .. } = primitive; + + let new_scissor = rect_to_crayon_rect(scizzor); + if new_scissor != current_scissor { + // Finish the current command. + match current_state { + State::Plain { start } => + commands.push(PreparedCommand::Plain(start..vertices.len())), + State::Image { image_id, start } => + commands.push(PreparedCommand::Image(image_id, start..vertices.len())), + } + + // Update the scizzor and produce a command. + current_scissor = new_scissor; + commands.push(PreparedCommand::Scizzor(current_scissor)); + + // Set the state back to plain drawing. + current_state = State::Plain { start: vertices.len() }; + } + + match kind { + + render::PrimitiveKind::Rectangle { color } => { + switch_to_plain_state!(); + let color = gamma_srgb_to_linear(color.to_fsa()); + let (l, r, b, t) = rect.l_r_b_t(); + let v = |x, y| { + Vertex::new([vx(x),vy(y)],[0.0,0.0],color,MODE_GEOMETRY) + }; + + let mut push_v = |x, y| vertices.push(v(x, y)); + + // Bottom left triangle. + push_v(l, t); + push_v(r, b); + push_v(l, b); + + // Top right triangle. + push_v(l, t); + push_v(r, b); + push_v(r, t); + + }, + + render::PrimitiveKind::TrianglesSingleColor { color, triangles } => { + if triangles.is_empty() { + continue; + } + + switch_to_plain_state!(); + + let color = gamma_srgb_to_linear(color.into()); + + let v = |p: [Scalar; 2]| { + Vertex::new([vx(p[0]), vy(p[1])],[0.0,0.0],color,MODE_GEOMETRY) + }; + + for triangle in triangles { + vertices.push(v(triangle[0])); + vertices.push(v(triangle[1])); + vertices.push(v(triangle[2])); + } + }, + + render::PrimitiveKind::TrianglesMultiColor { triangles } => { + if triangles.is_empty() { + continue; + } + + switch_to_plain_state!(); + + let v = |(p, c): ([Scalar; 2], color::Rgba)| { + Vertex::new([vx(p[0]), vy(p[1])],[0.0,0.0],gamma_srgb_to_linear(c.into()),MODE_GEOMETRY) + }; + + for triangle in triangles { + vertices.push(v(triangle[0])); + vertices.push(v(triangle[1])); + vertices.push(v(triangle[2])); + } + }, + render::PrimitiveKind::Text { color, text, font_id } => { + switch_to_plain_state!(); + + let positioned_glyphs = text.positioned_glyphs(dpi_factor as f32); + + let GlyphCache { ref mut cache, ref mut texture } = *glyph_cache; + + // Queue the glyphs to be cached. + for glyph in positioned_glyphs.iter() { + cache.queue_glyph(font_id.index(), glyph.clone()); + } + + // Cache the glyphs on the GPU. + cache.cache_queued(|rect, data| { + let width = rect.width(); + let height = rect.height(); + let lbwh = [rect.min.x,rect.min.y,rect.max.x,rect.max.y]; + let p1 = cgmath::Point2::new(lbwh[0],lbwh[1]); + let p2 = cgmath::Point2::new(lbwh[2],lbwh[3]); + let rect = crayon::math::aabb::Aabb2::new(p1,p2); + let mut new_data:Vec = vec![]; + for j in data.to_vec(){ + new_data.push(j); + for _z in 1..4{ + new_data.push(0); + } + } + video::update_texture(*texture,rect,&new_data).unwrap(); + + }).unwrap(); + + let color = gamma_srgb_to_linear(color.to_fsa()); + let cache_id = font_id.index(); + + let origin = text::rt::point(0.0, 0.0); + let to_gl_rect = |screen_rect: text::rt::Rect| text::rt::Rect { + min: origin + + (text::rt::vector(screen_rect.min.x as f32 / screen_w as f32 - 0.5, + 1.0 - screen_rect.min.y as f32 / screen_h as f32 - 0.5)) * 2.0, + max: origin + + (text::rt::vector(screen_rect.max.x as f32 / screen_w as f32 - 0.5, + 1.0 - screen_rect.max.y as f32 / screen_h as f32 - 0.5)) * 2.0 + }; + let mut l =0; + for g in positioned_glyphs { + + if let Ok(Some((uv_rect, screen_rect))) = cache.rect_for(cache_id, g) { + + let gl_rect = to_gl_rect(screen_rect); + + let v = |p:[f32;2],t:[f32;2]| {Vertex::new(p,t,color,MODE_TEXT)}; + let mut push_v = |p, t| vertices.push(v(p, t)); + push_v([gl_rect.min.x, gl_rect.max.y], [uv_rect.min.x, uv_rect.max.y]); + push_v([gl_rect.min.x, gl_rect.min.y], [uv_rect.min.x, uv_rect.min.y]); + push_v([gl_rect.max.x, gl_rect.min.y], [uv_rect.max.x, uv_rect.min.y]); + push_v([gl_rect.max.x, gl_rect.min.y], [uv_rect.max.x, uv_rect.min.y]); + push_v([gl_rect.max.x, gl_rect.max.y], [uv_rect.max.x, uv_rect.max.y]); + push_v([gl_rect.min.x, gl_rect.max.y], [uv_rect.min.x, uv_rect.max.y]); + l = l+1; + + } + } + + }, + render::PrimitiveKind::Image { image_id, color, source_rect } => { + // Switch to the `Image` state for this image if we're not in it already. + let new_image_id = image_id; + match current_state { + + // If we're already in the drawing mode for this image, we're done. + State::Image { image_id, .. } if image_id == new_image_id => (), + + // If we were in the `Plain` drawing state, switch to Image drawing state. + State::Plain { start } => { + commands.push(PreparedCommand::Plain(start..vertices.len())); + current_state = State::Image { + image_id: new_image_id, + start: vertices.len(), + }; + }, + + // If we were drawing a different image, switch state to draw *this* image. + State::Image { image_id, start } => { + commands.push(PreparedCommand::Image(image_id, start..vertices.len())); + current_state = State::Image { + image_id: new_image_id, + start: vertices.len(), + }; + }, + } + + let color = color.unwrap_or(color::WHITE).to_fsa(); + + if let Some(&image) = image_map.get(&image_id) { + let mut image_w:f64 = 100.0; + let mut image_h:f64 = 100.0; + if let Some(image_param) = video::texture(image){ + image_w = image_param.dimensions.x as f64; + image_h = image_param.dimensions.y as f64; + } + + // Get the sides of the source rectangle as uv coordinates. + // + // Texture coordinates range: + // - left to right: 0.0 to 1.0 + // - bottom to top: 0.0 to 1.0 + let (uv_l, uv_r, uv_b, uv_t) = match source_rect { + Some(src_rect) => { + let (l, r, b, t) = src_rect.l_r_b_t(); + ((l / image_w) as f32, + (r / image_w) as f32, + (b / image_h) as f32, + (t / image_h) as f32) + }, + + None => (0.0, 1.0 , 0.0, 1.0), + }; + + let v = |x, y, t| { + // Convert from conrod Scalar range to GL range -1.0 to 1.0. + let x = (x * dpi_factor as Scalar / half_win_w) as f32; + let y = (y * dpi_factor as Scalar / half_win_h) as f32; + Vertex::new([x, y],t,color,MODE_IMAGE) + }; + + let mut push_v = |x, y, t| vertices.push(v(x, y, t)); + + let (l, r, b, t) = rect.l_r_b_t(); + + // Bottom left triangle. + push_v(l, t, [uv_l, uv_t]); + push_v(r, b, [uv_r, uv_b]); + push_v(l, b, [uv_l, uv_b]); + + // Top right triangle. + push_v(l, t, [uv_l, uv_t]); + push_v(r, b, [uv_r, uv_b]); + push_v(r, t, [uv_r, uv_t]); + } + }, + render::PrimitiveKind::Other(_) => (), + _=>{} + } + } + // Enter the final command. + + match current_state { + State::Plain { start } => + commands.push(PreparedCommand::Plain(start..vertices.len())), + State::Image { image_id, start } => + commands.push(PreparedCommand::Image(image_id, start..vertices.len())), + } + + } + pub fn draw(&self,batch: &mut CommandBuffer,image_map:&conrod_core::image::Map){ + const NUM_VERTICES_IN_TRIANGLE: usize = 3; + let uniform =self.glyph_cache.texture(); //can use rendertexture + + for command in self.commands() { + match command { + Command::Scizzor(scizzor) => { + batch.update_scissor(scizzor) + }, + + // Draw to the target with the given `draw` command. + Command::Draw(draw) => match draw { + DrawE::Plain(slice) => if slice.len() >= NUM_VERTICES_IN_TRIANGLE { + let mut idxes:Vec = vec![]; + for i in 0..slice.len(){ + idxes.push(i as u16); + } + + let mut params = MeshParams::default(); + params.num_verts = slice.len(); + params.num_idxes = slice.len(); + params.primitive = MeshPrimitive::Triangles; + params.layout = Vertex::layout(); + let data = MeshData { + vptr: Vertex::encode(&slice[..]).into(), + iptr: IndexFormat::encode(&idxes).into(), + }; + let mesh = video::create_mesh(params.clone(), Some(data)).unwrap(); + let mut dc = Draw::new(self.shader, mesh); + dc.set_uniform_variable("tex", *uniform); + batch.draw(dc); + batch.submit(self.surface).unwrap(); + + }, + // Draw an image whose texture data lies within the `image_map` at the + // given `id`. + // + // Only submit the vertices if there is enough for at least one triangle. + DrawE::Image(image_id, slice) => if slice.len() >= NUM_VERTICES_IN_TRIANGLE { + if let Some(&image) = image_map.get(&image_id) { + + let mut idxes:Vec = vec![]; + for i in 0..slice.len(){ + idxes.push(i as u16); + } + + let mut params = MeshParams::default(); + params.num_verts = slice.len(); + params.num_idxes = slice.len(); + params.primitive = MeshPrimitive::Triangles; + params.layout = Vertex::layout(); + let data = MeshData { + vptr: Vertex::encode(&slice[..]).into(), + iptr: IndexFormat::encode(&idxes).into(), + }; + + let mesh = video::create_mesh(params, Some(data)).unwrap(); + let mut dc = Draw::new(self.shader, mesh); + dc.set_uniform_variable("tex", image); + batch.draw(dc); + batch.submit(self.surface).unwrap() + } + }, + + _=>{ + + } + } + } + } + + + } +} + +fn gamma_srgb_to_linear(c: [f32; 4]) -> [f32; 4] { + fn component(f: f32) -> f32 { + // Taken from https://github.com/PistonDevelopers/graphics/src/color.rs#L42 + if f <= 0.04045 { + f / 12.92 + } else { + ((f + 0.055) / 1.055).powf(2.4) + } + } + [component(c[0]), component(c[1]), component(c[2]), c[3]] +} + +impl<'a> Iterator for Commands<'a> { + type Item = Command<'a>; + fn next(&mut self) -> Option { + let Commands { ref mut commands, ref vertices } = *self; + commands.next().map(|command| match *command { + PreparedCommand::Scizzor(scizzor) => Command::Scizzor(scizzor), + PreparedCommand::Plain(ref range) => + Command::Draw(DrawE::Plain(&vertices[range.clone()])), + PreparedCommand::Image(id, ref range) => + Command::Draw(DrawE::Image(id, &vertices[range.clone()])), + }) + } +} +// Creating the rusttype glyph cache used within a `GlyphCache`. +fn rusttype_glyph_cache(w: u32, h: u32) -> text::GlyphCache<'static> { + const SCALE_TOLERANCE: f32 = 0.1; + const POSITION_TOLERANCE: f32 = 0.1; + text::GlyphCache::builder() + .dimensions(w, h) + .scale_tolerance(SCALE_TOLERANCE) + .position_tolerance(POSITION_TOLERANCE) + .build() +} + +// Create the texture used within a `GlyphCache` of the given size. +fn glyph_cache_texture( + width: u32, + height: u32, +) -> Result +{ + // Determine the optimal texture format to use given the opengl version. + let mut params = TextureParams::default(); + params.format = TextureFormat::RGBA8; + params.hint = TextureHint::Stream; + params.dimensions = (width, height).into(); + let data_size = params.format.size(params.dimensions) as usize; + let bytes = vec![]; + let data = TextureData{ + bytes:bytes + }; + video::create_texture(params,data) +} \ No newline at end of file diff --git a/backends/conrod_crayon/src/shaders/conrod.fs b/backends/conrod_crayon/src/shaders/conrod.fs new file mode 100644 index 000000000..dcfe0d916 --- /dev/null +++ b/backends/conrod_crayon/src/shaders/conrod.fs @@ -0,0 +1,25 @@ +#version 300 es +precision mediump float; +uniform sampler2D tex; + +in float v_mode; +in vec2 v_tex_coords; +in vec4 v_color; + +out vec4 f_color; + +void main() { + // Text + + if (v_mode < 0.1 ) { + f_color = v_color * vec4(1.0, 1.0, 1.0, texture(tex, v_tex_coords).r); + + // Image + } else if (v_mode < 1.1) { + f_color = texture(tex, v_tex_coords); + + // 2D Geometry + } else if (v_mode < 2.1){ + f_color = v_color; + } +} \ No newline at end of file diff --git a/backends/conrod_crayon/src/shaders/conrod.vs b/backends/conrod_crayon/src/shaders/conrod.vs new file mode 100644 index 000000000..843834625 --- /dev/null +++ b/backends/conrod_crayon/src/shaders/conrod.vs @@ -0,0 +1,18 @@ +#version 300 es +precision mediump float; + +in vec2 Position; +in vec2 Texcoord0; +in vec4 Color0; +in float Weight; + +out vec4 v_color; +out vec2 v_tex_coords; +out float v_mode; + +void main() { + gl_Position = vec4(Position, 0.0, 1.0); + v_tex_coords = Texcoord0; + v_color = Color0; + v_mode = Weight; +} \ No newline at end of file diff --git a/backends/conrod_crayon/tools/profiler/README.md b/backends/conrod_crayon/tools/profiler/README.md new file mode 100644 index 000000000..eb30f5812 --- /dev/null +++ b/backends/conrod_crayon/tools/profiler/README.md @@ -0,0 +1,8 @@ +# Profiler + +This script is a simple wrapper of [dtrace](http://dtrace.org/) and [flamegraph](https://github.com/brendangregg/FlameGraph). + +```sh +$ # Notes that dtrace requires additional privileges. +$ sudo ./tools/profiler/run.sh target/release/saturn out.svg +``` \ No newline at end of file diff --git a/backends/conrod_crayon/tools/profiler/run.sh b/backends/conrod_crayon/tools/profiler/run.sh new file mode 100755 index 000000000..a1e6e3752 --- /dev/null +++ b/backends/conrod_crayon/tools/profiler/run.sh @@ -0,0 +1,17 @@ +USAGE="Usage: sudo ./tools/profiler/run.sh [EXECUTABLE_FILE] [OUT_FILE]" + +if [ "$#" -ne 2 ]; then + echo $USAGE + exit 1 +fi + +EXECUTABLE_FILE=$1 +OUT_FILE=$2 +SCRIPT_FILE="$( cd "$(dirname "$0")" ; pwd -P )" +NAME=$(basename $EXECUTABLE_FILE) + +set -e +rm -f out.stacks +dtrace -c $EXECUTABLE_FILE -o out.stacks -n "profile-30 /execname == \"${NAME}\"/ { @[ustack(1000)] = count(); }" +$SCRIPT_FILE/scripts/stackcollapse.pl out.stacks | $SCRIPT_FILE/scripts/flamegraph.pl > $OUT_FILE +rm -f out.stacks \ No newline at end of file diff --git a/backends/conrod_crayon/tools/profiler/scripts/cddl1.txt b/backends/conrod_crayon/tools/profiler/scripts/cddl1.txt new file mode 100644 index 000000000..da23621dc --- /dev/null +++ b/backends/conrod_crayon/tools/profiler/scripts/cddl1.txt @@ -0,0 +1,384 @@ +Unless otherwise noted, all files in this distribution are released +under the Common Development and Distribution License (CDDL). +Exceptions are noted within the associated source files. + +-------------------------------------------------------------------- + + +COMMON DEVELOPMENT AND DISTRIBUTION LICENSE Version 1.0 + +1. Definitions. + + 1.1. "Contributor" means each individual or entity that creates + or contributes to the creation of Modifications. + + 1.2. "Contributor Version" means the combination of the Original + Software, prior Modifications used by a Contributor (if any), + and the Modifications made by that particular Contributor. + + 1.3. "Covered Software" means (a) the Original Software, or (b) + Modifications, or (c) the combination of files containing + Original Software with files containing Modifications, in + each case including portions thereof. + + 1.4. "Executable" means the Covered Software in any form other + than Source Code. + + 1.5. "Initial Developer" means the individual or entity that first + makes Original Software available under this License. + + 1.6. "Larger Work" means a work which combines Covered Software or + portions thereof with code not governed by the terms of this + License. + + 1.7. "License" means this document. + + 1.8. "Licensable" means having the right to grant, to the maximum + extent possible, whether at the time of the initial grant or + subsequently acquired, any and all of the rights conveyed + herein. + + 1.9. "Modifications" means the Source Code and Executable form of + any of the following: + + A. Any file that results from an addition to, deletion from or + modification of the contents of a file containing Original + Software or previous Modifications; + + B. Any new file that contains any part of the Original + Software or previous Modifications; or + + C. Any new file that is contributed or otherwise made + available under the terms of this License. + + 1.10. "Original Software" means the Source Code and Executable + form of computer software code that is originally released + under this License. + + 1.11. "Patent Claims" means any patent claim(s), now owned or + hereafter acquired, including without limitation, method, + process, and apparatus claims, in any patent Licensable by + grantor. + + 1.12. "Source Code" means (a) the common form of computer software + code in which modifications are made and (b) associated + documentation included in or with such code. + + 1.13. "You" (or "Your") means an individual or a legal entity + exercising rights under, and complying with all of the terms + of, this License. For legal entities, "You" includes any + entity which controls, is controlled by, or is under common + control with You. For purposes of this definition, + "control" means (a) the power, direct or indirect, to cause + the direction or management of such entity, whether by + contract or otherwise, or (b) ownership of more than fifty + percent (50%) of the outstanding shares or beneficial + ownership of such entity. + +2. License Grants. + + 2.1. The Initial Developer Grant. + + Conditioned upon Your compliance with Section 3.1 below and + subject to third party intellectual property claims, the Initial + Developer hereby grants You a world-wide, royalty-free, + non-exclusive license: + + (a) under intellectual property rights (other than patent or + trademark) Licensable by Initial Developer, to use, + reproduce, modify, display, perform, sublicense and + distribute the Original Software (or portions thereof), + with or without Modifications, and/or as part of a Larger + Work; and + + (b) under Patent Claims infringed by the making, using or + selling of Original Software, to make, have made, use, + practice, sell, and offer for sale, and/or otherwise + dispose of the Original Software (or portions thereof). + + (c) The licenses granted in Sections 2.1(a) and (b) are + effective on the date Initial Developer first distributes + or otherwise makes the Original Software available to a + third party under the terms of this License. + + (d) Notwithstanding Section 2.1(b) above, no patent license is + granted: (1) for code that You delete from the Original + Software, or (2) for infringements caused by: (i) the + modification of the Original Software, or (ii) the + combination of the Original Software with other software + or devices. + + 2.2. Contributor Grant. + + Conditioned upon Your compliance with Section 3.1 below and + subject to third party intellectual property claims, each + Contributor hereby grants You a world-wide, royalty-free, + non-exclusive license: + + (a) under intellectual property rights (other than patent or + trademark) Licensable by Contributor to use, reproduce, + modify, display, perform, sublicense and distribute the + Modifications created by such Contributor (or portions + thereof), either on an unmodified basis, with other + Modifications, as Covered Software and/or as part of a + Larger Work; and + + (b) under Patent Claims infringed by the making, using, or + selling of Modifications made by that Contributor either + alone and/or in combination with its Contributor Version + (or portions of such combination), to make, use, sell, + offer for sale, have made, and/or otherwise dispose of: + (1) Modifications made by that Contributor (or portions + thereof); and (2) the combination of Modifications made by + that Contributor with its Contributor Version (or portions + of such combination). + + (c) The licenses granted in Sections 2.2(a) and 2.2(b) are + effective on the date Contributor first distributes or + otherwise makes the Modifications available to a third + party. + + (d) Notwithstanding Section 2.2(b) above, no patent license is + granted: (1) for any code that Contributor has deleted + from the Contributor Version; (2) for infringements caused + by: (i) third party modifications of Contributor Version, + or (ii) the combination of Modifications made by that + Contributor with other software (except as part of the + Contributor Version) or other devices; or (3) under Patent + Claims infringed by Covered Software in the absence of + Modifications made by that Contributor. + +3. Distribution Obligations. + + 3.1. Availability of Source Code. + + Any Covered Software that You distribute or otherwise make + available in Executable form must also be made available in Source + Code form and that Source Code form must be distributed only under + the terms of this License. You must include a copy of this + License with every copy of the Source Code form of the Covered + Software You distribute or otherwise make available. You must + inform recipients of any such Covered Software in Executable form + as to how they can obtain such Covered Software in Source Code + form in a reasonable manner on or through a medium customarily + used for software exchange. + + 3.2. Modifications. + + The Modifications that You create or to which You contribute are + governed by the terms of this License. You represent that You + believe Your Modifications are Your original creation(s) and/or + You have sufficient rights to grant the rights conveyed by this + License. + + 3.3. Required Notices. + + You must include a notice in each of Your Modifications that + identifies You as the Contributor of the Modification. You may + not remove or alter any copyright, patent or trademark notices + contained within the Covered Software, or any notices of licensing + or any descriptive text giving attribution to any Contributor or + the Initial Developer. + + 3.4. Application of Additional Terms. + + You may not offer or impose any terms on any Covered Software in + Source Code form that alters or restricts the applicable version + of this License or the recipients' rights hereunder. You may + choose to offer, and to charge a fee for, warranty, support, + indemnity or liability obligations to one or more recipients of + Covered Software. However, you may do so only on Your own behalf, + and not on behalf of the Initial Developer or any Contributor. + You must make it absolutely clear that any such warranty, support, + indemnity or liability obligation is offered by You alone, and You + hereby agree to indemnify the Initial Developer and every + Contributor for any liability incurred by the Initial Developer or + such Contributor as a result of warranty, support, indemnity or + liability terms You offer. + + 3.5. Distribution of Executable Versions. + + You may distribute the Executable form of the Covered Software + under the terms of this License or under the terms of a license of + Your choice, which may contain terms different from this License, + provided that You are in compliance with the terms of this License + and that the license for the Executable form does not attempt to + limit or alter the recipient's rights in the Source Code form from + the rights set forth in this License. If You distribute the + Covered Software in Executable form under a different license, You + must make it absolutely clear that any terms which differ from + this License are offered by You alone, not by the Initial + Developer or Contributor. You hereby agree to indemnify the + Initial Developer and every Contributor for any liability incurred + by the Initial Developer or such Contributor as a result of any + such terms You offer. + + 3.6. Larger Works. + + You may create a Larger Work by combining Covered Software with + other code not governed by the terms of this License and + distribute the Larger Work as a single product. In such a case, + You must make sure the requirements of this License are fulfilled + for the Covered Software. + +4. Versions of the License. + + 4.1. New Versions. + + Sun Microsystems, Inc. is the initial license steward and may + publish revised and/or new versions of this License from time to + time. Each version will be given a distinguishing version number. + Except as provided in Section 4.3, no one other than the license + steward has the right to modify this License. + + 4.2. Effect of New Versions. + + You may always continue to use, distribute or otherwise make the + Covered Software available under the terms of the version of the + License under which You originally received the Covered Software. + If the Initial Developer includes a notice in the Original + Software prohibiting it from being distributed or otherwise made + available under any subsequent version of the License, You must + distribute and make the Covered Software available under the terms + of the version of the License under which You originally received + the Covered Software. Otherwise, You may also choose to use, + distribute or otherwise make the Covered Software available under + the terms of any subsequent version of the License published by + the license steward. + + 4.3. Modified Versions. + + When You are an Initial Developer and You want to create a new + license for Your Original Software, You may create and use a + modified version of this License if You: (a) rename the license + and remove any references to the name of the license steward + (except to note that the license differs from this License); and + (b) otherwise make it clear that the license contains terms which + differ from this License. + +5. DISCLAIMER OF WARRANTY. + + COVERED SOFTWARE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" + BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, + INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE COVERED + SOFTWARE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR + PURPOSE OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND + PERFORMANCE OF THE COVERED SOFTWARE IS WITH YOU. SHOULD ANY + COVERED SOFTWARE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE + INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY + NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF + WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF + ANY COVERED SOFTWARE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS + DISCLAIMER. + +6. TERMINATION. + + 6.1. This License and the rights granted hereunder will terminate + automatically if You fail to comply with terms herein and fail to + cure such breach within 30 days of becoming aware of the breach. + Provisions which, by their nature, must remain in effect beyond + the termination of this License shall survive. + + 6.2. If You assert a patent infringement claim (excluding + declaratory judgment actions) against Initial Developer or a + Contributor (the Initial Developer or Contributor against whom You + assert such claim is referred to as "Participant") alleging that + the Participant Software (meaning the Contributor Version where + the Participant is a Contributor or the Original Software where + the Participant is the Initial Developer) directly or indirectly + infringes any patent, then any and all rights granted directly or + indirectly to You by such Participant, the Initial Developer (if + the Initial Developer is not the Participant) and all Contributors + under Sections 2.1 and/or 2.2 of this License shall, upon 60 days + notice from Participant terminate prospectively and automatically + at the expiration of such 60 day notice period, unless if within + such 60 day period You withdraw Your claim with respect to the + Participant Software against such Participant either unilaterally + or pursuant to a written agreement with Participant. + + 6.3. In the event of termination under Sections 6.1 or 6.2 above, + all end user licenses that have been validly granted by You or any + distributor hereunder prior to termination (excluding licenses + granted to You by any distributor) shall survive termination. + +7. LIMITATION OF LIABILITY. + + UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT + (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE + INITIAL DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF + COVERED SOFTWARE, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE + LIABLE TO ANY PERSON FOR ANY INDIRECT, SPECIAL, INCIDENTAL, OR + CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT + LIMITATION, DAMAGES FOR LOST PROFITS, LOSS OF GOODWILL, WORK + STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER + COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN + INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF + LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL + INJURY RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT + APPLICABLE LAW PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO + NOT ALLOW THE EXCLUSION OR LIMITATION OF INCIDENTAL OR + CONSEQUENTIAL DAMAGES, SO THIS EXCLUSION AND LIMITATION MAY NOT + APPLY TO YOU. + +8. U.S. GOVERNMENT END USERS. + + The Covered Software is a "commercial item," as that term is + defined in 48 C.F.R. 2.101 (Oct. 1995), consisting of "commercial + computer software" (as that term is defined at 48 + C.F.R. 252.227-7014(a)(1)) and "commercial computer software + documentation" as such terms are used in 48 C.F.R. 12.212 + (Sept. 1995). Consistent with 48 C.F.R. 12.212 and 48 + C.F.R. 227.7202-1 through 227.7202-4 (June 1995), all + U.S. Government End Users acquire Covered Software with only those + rights set forth herein. This U.S. Government Rights clause is in + lieu of, and supersedes, any other FAR, DFAR, or other clause or + provision that addresses Government rights in computer software + under this License. + +9. MISCELLANEOUS. + + This License represents the complete agreement concerning subject + matter hereof. If any provision of this License is held to be + unenforceable, such provision shall be reformed only to the extent + necessary to make it enforceable. This License shall be governed + by the law of the jurisdiction specified in a notice contained + within the Original Software (except to the extent applicable law, + if any, provides otherwise), excluding such jurisdiction's + conflict-of-law provisions. Any litigation relating to this + License shall be subject to the jurisdiction of the courts located + in the jurisdiction and venue specified in a notice contained + within the Original Software, with the losing party responsible + for costs, including, without limitation, court costs and + reasonable attorneys' fees and expenses. The application of the + United Nations Convention on Contracts for the International Sale + of Goods is expressly excluded. Any law or regulation which + provides that the language of a contract shall be construed + against the drafter shall not apply to this License. You agree + that You alone are responsible for compliance with the United + States export administration regulations (and the export control + laws and regulation of any other countries) when You use, + distribute or otherwise make available any Covered Software. + +10. RESPONSIBILITY FOR CLAIMS. + + As between Initial Developer and the Contributors, each party is + responsible for claims and damages arising, directly or + indirectly, out of its utilization of rights under this License + and You agree to work with Initial Developer and Contributors to + distribute such responsibility on an equitable basis. Nothing + herein is intended or shall be deemed to constitute any admission + of liability. + +-------------------------------------------------------------------- + +NOTICE PURSUANT TO SECTION 9 OF THE COMMON DEVELOPMENT AND +DISTRIBUTION LICENSE (CDDL) + +For Covered Software in this distribution, this License shall +be governed by the laws of the State of California (excluding +conflict-of-law provisions). + +Any litigation relating to this License shall be subject to the +jurisdiction of the Federal Courts of the Northern District of +California and the state courts of the State of California, with +venue lying in Santa Clara County, California. diff --git a/backends/conrod_crayon/tools/profiler/scripts/flamegraph.pl b/backends/conrod_crayon/tools/profiler/scripts/flamegraph.pl new file mode 100755 index 000000000..ac3819ccf --- /dev/null +++ b/backends/conrod_crayon/tools/profiler/scripts/flamegraph.pl @@ -0,0 +1,1125 @@ +#!/usr/bin/perl -w +# +# flamegraph.pl flame stack grapher. +# +# This takes stack samples and renders a call graph, allowing hot functions +# and codepaths to be quickly identified. Stack samples can be generated using +# tools such as DTrace, perf, SystemTap, and Instruments. +# +# USAGE: ./flamegraph.pl [options] input.txt > graph.svg +# +# grep funcA input.txt | ./flamegraph.pl [options] > graph.svg +# +# Then open the resulting .svg in a web browser, for interactivity: mouse-over +# frames for info, click to zoom, and ctrl-F to search. +# +# Options are listed in the usage message (--help). +# +# The input is stack frames and sample counts formatted as single lines. Each +# frame in the stack is semicolon separated, with a space and count at the end +# of the line. These can be generated for Linux perf script output using +# stackcollapse-perf.pl, for DTrace using stackcollapse.pl, and for other tools +# using the other stackcollapse programs. Example input: +# +# swapper;start_kernel;rest_init;cpu_idle;default_idle;native_safe_halt 1 +# +# An optional extra column of counts can be provided to generate a differential +# flame graph of the counts, colored red for more, and blue for less. This +# can be useful when using flame graphs for non-regression testing. +# See the header comment in the difffolded.pl program for instructions. +# +# The input functions can optionally have annotations at the end of each +# function name, following a precedent by some tools (Linux perf's _[k]): +# _[k] for kernel +# _[i] for inlined +# _[j] for jit +# _[w] for waker +# Some of the stackcollapse programs support adding these annotations, eg, +# stackcollapse-perf.pl --kernel --jit. They are used merely for colors by +# some palettes, eg, flamegraph.pl --color=java. +# +# The output flame graph shows relative presence of functions in stack samples. +# The ordering on the x-axis has no meaning; since the data is samples, time +# order of events is not known. The order used sorts function names +# alphabetically. +# +# While intended to process stack samples, this can also process stack traces. +# For example, tracing stacks for memory allocation, or resource usage. You +# can use --title to set the title to reflect the content, and --countname +# to change "samples" to "bytes" etc. +# +# There are a few different palettes, selectable using --color. By default, +# the colors are selected at random (except for differentials). Functions +# called "-" will be printed gray, which can be used for stack separators (eg, +# between user and kernel stacks). +# +# HISTORY +# +# This was inspired by Neelakanth Nadgir's excellent function_call_graph.rb +# program, which visualized function entry and return trace events. As Neel +# wrote: "The output displayed is inspired by Roch's CallStackAnalyzer which +# was in turn inspired by the work on vftrace by Jan Boerhout". See: +# https://blogs.oracle.com/realneel/entry/visualizing_callstacks_via_dtrace_and +# +# Copyright 2016 Netflix, Inc. +# Copyright 2011 Joyent, Inc. All rights reserved. +# Copyright 2011 Brendan Gregg. All rights reserved. +# +# CDDL HEADER START +# +# The contents of this file are subject to the terms of the +# Common Development and Distribution License (the "License"). +# You may not use this file except in compliance with the License. +# +# You can obtain a copy of the license at docs/cddl1.txt or +# http://opensource.org/licenses/CDDL-1.0. +# See the License for the specific language governing permissions +# and limitations under the License. +# +# When distributing Covered Code, include this CDDL HEADER in each +# file and include the License file at docs/cddl1.txt. +# If applicable, add the following below this CDDL HEADER, with the +# fields enclosed by brackets "[]" replaced with your own identifying +# information: Portions Copyright [yyyy] [name of copyright owner] +# +# CDDL HEADER END +# +# 11-Oct-2014 Adrien Mahieux Added zoom. +# 21-Nov-2013 Shawn Sterling Added consistent palette file option +# 17-Mar-2013 Tim Bunce Added options and more tunables. +# 15-Dec-2011 Dave Pacheco Support for frames with whitespace. +# 10-Sep-2011 Brendan Gregg Created this. + +use strict; + +use Getopt::Long; + +use open qw(:std :utf8); + +# tunables +my $encoding; +my $fonttype = "Verdana"; +my $imagewidth = 1200; # max width, pixels +my $frameheight = 16; # max height is dynamic +my $fontsize = 12; # base text size +my $fontwidth = 0.59; # avg width relative to fontsize +my $minwidth = 0.1; # min function width, pixels +my $nametype = "Function:"; # what are the names in the data? +my $countname = "samples"; # what are the counts in the data? +my $colors = "hot"; # color theme +my $bgcolor1 = "#eeeeee"; # background color gradient start +my $bgcolor2 = "#eeeeb0"; # background color gradient stop +my $nameattrfile; # file holding function attributes +my $timemax; # (override the) sum of the counts +my $factor = 1; # factor to scale counts by +my $hash = 0; # color by function name +my $palette = 0; # if we use consistent palettes (default off) +my %palette_map; # palette map hash +my $pal_file = "palette.map"; # palette map file name +my $stackreverse = 0; # reverse stack order, switching merge end +my $inverted = 0; # icicle graph +my $negate = 0; # switch differential hues +my $titletext = ""; # centered heading +my $titledefault = "Flame Graph"; # overwritten by --title +my $titleinverted = "Icicle Graph"; # " " +my $searchcolor = "rgb(230,0,230)"; # color for search highlighting +my $notestext = ""; # embedded notes in SVG +my $subtitletext = ""; # second level title (optional) +my $help = 0; + +sub usage { + die < outfile.svg\n + --title TEXT # change title text + --subtitle TEXT # second level title (optional) + --width NUM # width of image (default 1200) + --height NUM # height of each frame (default 16) + --minwidth NUM # omit smaller functions (default 0.1 pixels) + --fonttype FONT # font type (default "Verdana") + --fontsize NUM # font size (default 12) + --countname TEXT # count type label (default "samples") + --nametype TEXT # name type label (default "Function:") + --colors PALETTE # set color palette. choices are: hot (default), mem, + # io, wakeup, chain, java, js, perl, red, green, blue, + # aqua, yellow, purple, orange + --hash # colors are keyed by function name hash + --cp # use consistent palette (palette.map) + --reverse # generate stack-reversed flame graph + --inverted # icicle graph + --negate # switch differential hues (blue<->red) + --notes TEXT # add notes comment in SVG (for debugging) + --help # this message + + eg, + $0 --title="Flame Graph: malloc()" trace.txt > graph.svg +USAGE_END +} + +GetOptions( + 'fonttype=s' => \$fonttype, + 'width=i' => \$imagewidth, + 'height=i' => \$frameheight, + 'encoding=s' => \$encoding, + 'fontsize=f' => \$fontsize, + 'fontwidth=f' => \$fontwidth, + 'minwidth=f' => \$minwidth, + 'title=s' => \$titletext, + 'subtitle=s' => \$subtitletext, + 'nametype=s' => \$nametype, + 'countname=s' => \$countname, + 'nameattr=s' => \$nameattrfile, + 'total=s' => \$timemax, + 'factor=f' => \$factor, + 'colors=s' => \$colors, + 'hash' => \$hash, + 'cp' => \$palette, + 'reverse' => \$stackreverse, + 'inverted' => \$inverted, + 'negate' => \$negate, + 'notes=s' => \$notestext, + 'help' => \$help, +) or usage(); +$help && usage(); + +# internals +my $ypad1 = $fontsize * 3; # pad top, include title +my $ypad2 = $fontsize * 2 + 10; # pad bottom, include labels +my $ypad3 = $fontsize * 2; # pad top, include subtitle (optional) +my $xpad = 10; # pad lefm and right +my $framepad = 1; # vertical padding for frames +my $depthmax = 0; +my %Events; +my %nameattr; + +if ($titletext eq "") { + unless ($inverted) { + $titletext = $titledefault; + } else { + $titletext = $titleinverted; + } +} + +if ($nameattrfile) { + # The name-attribute file format is a function name followed by a tab then + # a sequence of tab separated name=value pairs. + open my $attrfh, $nameattrfile or die "Can't read $nameattrfile: $!\n"; + while (<$attrfh>) { + chomp; + my ($funcname, $attrstr) = split /\t/, $_, 2; + die "Invalid format in $nameattrfile" unless defined $attrstr; + $nameattr{$funcname} = { map { split /=/, $_, 2 } split /\t/, $attrstr }; + } +} + +if ($notestext =~ /[<>]/) { + die "Notes string can't contain < or >" +} + +# background colors: +# - yellow gradient: default (hot, java, js, perl) +# - blue gradient: mem, chain +# - gray gradient: io, wakeup, flat colors (red, green, blue, ...) +if ($colors eq "mem" or $colors eq "chain") { + $bgcolor1 = "#eeeeee"; $bgcolor2 = "#e0e0ff"; +} +if ($colors =~ /^(io|wakeup|red|green|blue|aqua|yellow|purple|orange)$/) { + $bgcolor1 = "#f8f8f8"; $bgcolor2 = "#e8e8e8"; +} + +# SVG functions +{ package SVG; + sub new { + my $class = shift; + my $self = {}; + bless ($self, $class); + return $self; + } + + sub header { + my ($self, $w, $h) = @_; + my $enc_attr = ''; + if (defined $encoding) { + $enc_attr = qq{ encoding="$encoding"}; + } + $self->{svg} .= < + + + + +SVG + } + + sub include { + my ($self, $content) = @_; + $self->{svg} .= $content; + } + + sub colorAllocate { + my ($self, $r, $g, $b) = @_; + return "rgb($r,$g,$b)"; + } + + sub group_start { + my ($self, $attr) = @_; + + my @g_attr = map { + exists $attr->{$_} ? sprintf(qq/$_="%s"/, $attr->{$_}) : () + } qw(class style onmouseover onmouseout onclick); + push @g_attr, $attr->{g_extra} if $attr->{g_extra}; + $self->{svg} .= sprintf qq/\n/, join(' ', @g_attr); + + $self->{svg} .= sprintf qq/%s<\/title>/, $attr->{title} + if $attr->{title}; # should be first element within g container + + if ($attr->{href}) { + my @a_attr; + push @a_attr, sprintf qq/xlink:href="%s"/, $attr->{href} if $attr->{href}; + # default target=_top else links will open within SVG + push @a_attr, sprintf qq/target="%s"/, $attr->{target} || "_top"; + push @a_attr, $attr->{a_extra} if $attr->{a_extra}; + $self->{svg} .= sprintf qq//, join(' ', @a_attr); + } + } + + sub group_end { + my ($self, $attr) = @_; + $self->{svg} .= qq/<\/a>\n/ if $attr->{href}; + $self->{svg} .= qq/<\/g>\n/; + } + + sub filledRectangle { + my ($self, $x1, $y1, $x2, $y2, $fill, $extra) = @_; + $x1 = sprintf "%0.1f", $x1; + $x2 = sprintf "%0.1f", $x2; + my $w = sprintf "%0.1f", $x2 - $x1; + my $h = sprintf "%0.1f", $y2 - $y1; + $extra = defined $extra ? $extra : ""; + $self->{svg} .= qq/\n/; + } + + sub stringTTF { + my ($self, $color, $font, $size, $angle, $x, $y, $str, $loc, $extra) = @_; + $x = sprintf "%0.2f", $x; + $loc = defined $loc ? $loc : "left"; + $extra = defined $extra ? $extra : ""; + $self->{svg} .= qq/$str<\/text>\n/; + } + + sub svg { + my $self = shift; + return "$self->{svg}\n"; + } + 1; +} + +sub namehash { + # Generate a vector hash for the name string, weighting early over + # later characters. We want to pick the same colors for function + # names across different flame graphs. + my $name = shift; + my $vector = 0; + my $weight = 1; + my $max = 1; + my $mod = 10; + # if module name present, trunc to 1st char + $name =~ s/.(.*?)`//; + foreach my $c (split //, $name) { + my $i = (ord $c) % $mod; + $vector += ($i / ($mod++ - 1)) * $weight; + $max += 1 * $weight; + $weight *= 0.70; + last if $mod > 12; + } + return (1 - $vector / $max) +} + +sub color { + my ($type, $hash, $name) = @_; + my ($v1, $v2, $v3); + + if ($hash) { + $v1 = namehash($name); + $v2 = $v3 = namehash(scalar reverse $name); + } else { + $v1 = rand(1); + $v2 = rand(1); + $v3 = rand(1); + } + + # theme palettes + if (defined $type and $type eq "hot") { + my $r = 205 + int(50 * $v3); + my $g = 0 + int(230 * $v1); + my $b = 0 + int(55 * $v2); + return "rgb($r,$g,$b)"; + } + if (defined $type and $type eq "mem") { + my $r = 0; + my $g = 190 + int(50 * $v2); + my $b = 0 + int(210 * $v1); + return "rgb($r,$g,$b)"; + } + if (defined $type and $type eq "io") { + my $r = 80 + int(60 * $v1); + my $g = $r; + my $b = 190 + int(55 * $v2); + return "rgb($r,$g,$b)"; + } + + # multi palettes + if (defined $type and $type eq "java") { + # Handle both annotations (_[j], _[i], ...; which are + # accurate), as well as input that lacks any annotations, as + # best as possible. Without annotations, we get a little hacky + # and match on java|org|com, etc. + if ($name =~ m:_\[j\]$:) { # jit annotation + $type = "green"; + } elsif ($name =~ m:_\[i\]$:) { # inline annotation + $type = "aqua"; + } elsif ($name =~ m:^L?(java|org|com|io|sun)/:) { # Java + $type = "green"; + } elsif ($name =~ m:_\[k\]$:) { # kernel annotation + $type = "orange"; + } elsif ($name =~ /::/) { # C++ + $type = "yellow"; + } else { # system + $type = "red"; + } + # fall-through to color palettes + } + if (defined $type and $type eq "perl") { + if ($name =~ /::/) { # C++ + $type = "yellow"; + } elsif ($name =~ m:Perl: or $name =~ m:\.pl:) { # Perl + $type = "green"; + } elsif ($name =~ m:_\[k\]$:) { # kernel + $type = "orange"; + } else { # system + $type = "red"; + } + # fall-through to color palettes + } + if (defined $type and $type eq "js") { + # Handle both annotations (_[j], _[i], ...; which are + # accurate), as well as input that lacks any annotations, as + # best as possible. Without annotations, we get a little hacky, + # and match on a "/" with a ".js", etc. + if ($name =~ m:_\[j\]$:) { # jit annotation + if ($name =~ m:/:) { + $type = "green"; # source + } else { + $type = "aqua"; # builtin + } + } elsif ($name =~ /::/) { # C++ + $type = "yellow"; + } elsif ($name =~ m:/.*\.js:) { # JavaScript (match "/" in path) + $type = "green"; + } elsif ($name =~ m/:/) { # JavaScript (match ":" in builtin) + $type = "aqua"; + } elsif ($name =~ m/^ $/) { # Missing symbol + $type = "green"; + } elsif ($name =~ m:_\[k\]:) { # kernel + $type = "orange"; + } else { # system + $type = "red"; + } + # fall-through to color palettes + } + if (defined $type and $type eq "wakeup") { + $type = "aqua"; + # fall-through to color palettes + } + if (defined $type and $type eq "chain") { + if ($name =~ m:_\[w\]:) { # waker + $type = "aqua" + } else { # off-CPU + $type = "blue"; + } + # fall-through to color palettes + } + + # color palettes + if (defined $type and $type eq "red") { + my $r = 200 + int(55 * $v1); + my $x = 50 + int(80 * $v1); + return "rgb($r,$x,$x)"; + } + if (defined $type and $type eq "green") { + my $g = 200 + int(55 * $v1); + my $x = 50 + int(60 * $v1); + return "rgb($x,$g,$x)"; + } + if (defined $type and $type eq "blue") { + my $b = 205 + int(50 * $v1); + my $x = 80 + int(60 * $v1); + return "rgb($x,$x,$b)"; + } + if (defined $type and $type eq "yellow") { + my $x = 175 + int(55 * $v1); + my $b = 50 + int(20 * $v1); + return "rgb($x,$x,$b)"; + } + if (defined $type and $type eq "purple") { + my $x = 190 + int(65 * $v1); + my $g = 80 + int(60 * $v1); + return "rgb($x,$g,$x)"; + } + if (defined $type and $type eq "aqua") { + my $r = 50 + int(60 * $v1); + my $g = 165 + int(55 * $v1); + my $b = 165 + int(55 * $v1); + return "rgb($r,$g,$b)"; + } + if (defined $type and $type eq "orange") { + my $r = 190 + int(65 * $v1); + my $g = 90 + int(65 * $v1); + return "rgb($r,$g,0)"; + } + + return "rgb(0,0,0)"; +} + +sub color_scale { + my ($value, $max) = @_; + my ($r, $g, $b) = (255, 255, 255); + $value = -$value if $negate; + if ($value > 0) { + $g = $b = int(210 * ($max - $value) / $max); + } elsif ($value < 0) { + $r = $g = int(210 * ($max + $value) / $max); + } + return "rgb($r,$g,$b)"; +} + +sub color_map { + my ($colors, $func) = @_; + if (exists $palette_map{$func}) { + return $palette_map{$func}; + } else { + $palette_map{$func} = color($colors, $hash, $func); + return $palette_map{$func}; + } +} + +sub write_palette { + open(FILE, ">$pal_file"); + foreach my $key (sort keys %palette_map) { + print FILE $key."->".$palette_map{$key}."\n"; + } + close(FILE); +} + +sub read_palette { + if (-e $pal_file) { + open(FILE, $pal_file) or die "can't open file $pal_file: $!"; + while ( my $line = ) { + chomp($line); + (my $key, my $value) = split("->",$line); + $palette_map{$key}=$value; + } + close(FILE) + } +} + +my %Node; # Hash of merged frame data +my %Tmp; + +# flow() merges two stacks, storing the merged frames and value data in %Node. +sub flow { + my ($last, $this, $v, $d) = @_; + + my $len_a = @$last - 1; + my $len_b = @$this - 1; + + my $i = 0; + my $len_same; + for (; $i <= $len_a; $i++) { + last if $i > $len_b; + last if $last->[$i] ne $this->[$i]; + } + $len_same = $i; + + for ($i = $len_a; $i >= $len_same; $i--) { + my $k = "$last->[$i];$i"; + # a unique ID is constructed from "func;depth;etime"; + # func-depth isn't unique, it may be repeated later. + $Node{"$k;$v"}->{stime} = delete $Tmp{$k}->{stime}; + if (defined $Tmp{$k}->{delta}) { + $Node{"$k;$v"}->{delta} = delete $Tmp{$k}->{delta}; + } + delete $Tmp{$k}; + } + + for ($i = $len_same; $i <= $len_b; $i++) { + my $k = "$this->[$i];$i"; + $Tmp{$k}->{stime} = $v; + if (defined $d) { + $Tmp{$k}->{delta} += $i == $len_b ? $d : 0; + } + } + + return $this; +} + +# parse input +my @Data; +my $last = []; +my $time = 0; +my $delta = undef; +my $ignored = 0; +my $line; +my $maxdelta = 1; + +# reverse if needed +foreach (<>) { + chomp; + $line = $_; + if ($stackreverse) { + # there may be an extra samples column for differentials + # XXX todo: redo these REs as one. It's repeated below. + my($stack, $samples) = (/^(.*)\s+?(\d+(?:\.\d*)?)$/); + my $samples2 = undef; + if ($stack =~ /^(.*)\s+?(\d+(?:\.\d*)?)$/) { + $samples2 = $samples; + ($stack, $samples) = $stack =~ (/^(.*)\s+?(\d+(?:\.\d*)?)$/); + unshift @Data, join(";", reverse split(";", $stack)) . " $samples $samples2"; + } else { + unshift @Data, join(";", reverse split(";", $stack)) . " $samples"; + } + } else { + unshift @Data, $line; + } +} + +# process and merge frames +foreach (sort @Data) { + chomp; + # process: folded_stack count + # eg: func_a;func_b;func_c 31 + my ($stack, $samples) = (/^(.*)\s+?(\d+(?:\.\d*)?)$/); + unless (defined $samples and defined $stack) { + ++$ignored; + next; + } + + # there may be an extra samples column for differentials: + my $samples2 = undef; + if ($stack =~ /^(.*)\s+?(\d+(?:\.\d*)?)$/) { + $samples2 = $samples; + ($stack, $samples) = $stack =~ (/^(.*)\s+?(\d+(?:\.\d*)?)$/); + } + $delta = undef; + if (defined $samples2) { + $delta = $samples2 - $samples; + $maxdelta = abs($delta) if abs($delta) > $maxdelta; + } + + # for chain graphs, annotate waker frames with "_[w]", for later + # coloring. This is a hack, but has a precedent ("_[k]" from perf). + if ($colors eq "chain") { + my @parts = split ";--;", $stack; + my @newparts = (); + $stack = shift @parts; + $stack .= ";--;"; + foreach my $part (@parts) { + $part =~ s/;/_[w];/g; + $part .= "_[w]"; + push @newparts, $part; + } + $stack .= join ";--;", @parts; + } + + # merge frames and populate %Node: + $last = flow($last, [ '', split ";", $stack ], $time, $delta); + + if (defined $samples2) { + $time += $samples2; + } else { + $time += $samples; + } +} +flow($last, [], $time, $delta); + +warn "Ignored $ignored lines with invalid format\n" if $ignored; +unless ($time) { + warn "ERROR: No stack counts found\n"; + my $im = SVG->new(); + # emit an error message SVG, for tools automating flamegraph use + my $imageheight = $fontsize * 5; + $im->header($imagewidth, $imageheight); + $im->stringTTF($im->colorAllocate(0, 0, 0), $fonttype, $fontsize + 2, + 0.0, int($imagewidth / 2), $fontsize * 2, + "ERROR: No valid input provided to flamegraph.pl.", "middle"); + print $im->svg; + exit 2; +} +if ($timemax and $timemax < $time) { + warn "Specified --total $timemax is less than actual total $time, so ignored\n" + if $timemax/$time > 0.02; # only warn is significant (e.g., not rounding etc) + undef $timemax; +} +$timemax ||= $time; + +my $widthpertime = ($imagewidth - 2 * $xpad) / $timemax; +my $minwidth_time = $minwidth / $widthpertime; + +# prune blocks that are too narrow and determine max depth +while (my ($id, $node) = each %Node) { + my ($func, $depth, $etime) = split ";", $id; + my $stime = $node->{stime}; + die "missing start for $id" if not defined $stime; + + if (($etime-$stime) < $minwidth_time) { + delete $Node{$id}; + next; + } + $depthmax = $depth if $depth > $depthmax; +} + +# draw canvas, and embed interactive JavaScript program +my $imageheight = (($depthmax + 1) * $frameheight) + $ypad1 + $ypad2; +$imageheight += $ypad3 if $subtitletext ne ""; +my $im = SVG->new(); +$im->header($imagewidth, $imageheight); +my $inc = < + + + + + + + +INC +$im->include($inc); +$im->filledRectangle(0, 0, $imagewidth, $imageheight, 'url(#background)'); +my ($white, $black, $vvdgrey, $vdgrey, $dgrey) = ( + $im->colorAllocate(255, 255, 255), + $im->colorAllocate(0, 0, 0), + $im->colorAllocate(40, 40, 40), + $im->colorAllocate(160, 160, 160), + $im->colorAllocate(200, 200, 200), + ); +$im->stringTTF($black, $fonttype, $fontsize + 5, 0.0, int($imagewidth / 2), $fontsize * 2, $titletext, "middle"); +if ($subtitletext ne "") { + $im->stringTTF($vdgrey, $fonttype, $fontsize, 0.0, int($imagewidth / 2), $fontsize * 4, $subtitletext, "middle"); +} +$im->stringTTF($black, $fonttype, $fontsize, 0.0, $xpad, $imageheight - ($ypad2 / 2), " ", "", 'id="details"'); +$im->stringTTF($black, $fonttype, $fontsize, 0.0, $xpad, $fontsize * 2, + "Reset Zoom", "", 'id="unzoom" onclick="unzoom()" style="opacity:0.0;cursor:pointer"'); +$im->stringTTF($black, $fonttype, $fontsize, 0.0, $imagewidth - $xpad - 100, + $fontsize * 2, "Search", "", 'id="search" onmouseover="searchover()" onmouseout="searchout()" onclick="search_prompt()" style="opacity:0.1;cursor:pointer"'); +$im->stringTTF($black, $fonttype, $fontsize, 0.0, $imagewidth - $xpad - 100, $imageheight - ($ypad2 / 2), " ", "", 'id="matched"'); + +if ($palette) { + read_palette(); +} + +# draw frames +while (my ($id, $node) = each %Node) { + my ($func, $depth, $etime) = split ";", $id; + my $stime = $node->{stime}; + my $delta = $node->{delta}; + + $etime = $timemax if $func eq "" and $depth == 0; + + my $x1 = $xpad + $stime * $widthpertime; + my $x2 = $xpad + $etime * $widthpertime; + my ($y1, $y2); + unless ($inverted) { + $y1 = $imageheight - $ypad2 - ($depth + 1) * $frameheight + $framepad; + $y2 = $imageheight - $ypad2 - $depth * $frameheight; + } else { + $y1 = $ypad1 + $depth * $frameheight; + $y2 = $ypad1 + ($depth + 1) * $frameheight - $framepad; + } + + my $samples = sprintf "%.0f", ($etime - $stime) * $factor; + (my $samples_txt = $samples) # add commas per perlfaq5 + =~ s/(^[-+]?\d+?(?=(?>(?:\d{3})+)(?!\d))|\G\d{3}(?=\d))/$1,/g; + + my $info; + if ($func eq "" and $depth == 0) { + $info = "all ($samples_txt $countname, 100%)"; + } else { + my $pct = sprintf "%.2f", ((100 * $samples) / ($timemax * $factor)); + my $escaped_func = $func; + # clean up SVG breaking characters: + $escaped_func =~ s/&/&/g; + $escaped_func =~ s//>/g; + $escaped_func =~ s/"/"/g; + $escaped_func =~ s/_\[[kwij]\]$//; # strip any annotation + unless (defined $delta) { + $info = "$escaped_func ($samples_txt $countname, $pct%)"; + } else { + my $d = $negate ? -$delta : $delta; + my $deltapct = sprintf "%.2f", ((100 * $d) / ($timemax * $factor)); + $deltapct = $d > 0 ? "+$deltapct" : $deltapct; + $info = "$escaped_func ($samples_txt $countname, $pct%; $deltapct%)"; + } + } + + my $nameattr = { %{ $nameattr{$func}||{} } }; # shallow clone + $nameattr->{class} ||= "func_g"; + $nameattr->{onmouseover} ||= "s(this)"; + $nameattr->{onmouseout} ||= "c()"; + $nameattr->{onclick} ||= "zoom(this)"; + $nameattr->{title} ||= $info; + $im->group_start($nameattr); + + my $color; + if ($func eq "--") { + $color = $vdgrey; + } elsif ($func eq "-") { + $color = $dgrey; + } elsif (defined $delta) { + $color = color_scale($delta, $maxdelta); + } elsif ($palette) { + $color = color_map($colors, $func); + } else { + $color = color($colors, $hash, $func); + } + $im->filledRectangle($x1, $y1, $x2, $y2, $color, 'rx="2" ry="2"'); + + my $chars = int( ($x2 - $x1) / ($fontsize * $fontwidth)); + my $text = ""; + if ($chars >= 3) { # room for one char plus two dots + $func =~ s/_\[[kwij]\]$//; # strip any annotation + $text = substr $func, 0, $chars; + substr($text, -2, 2) = ".." if $chars < length $func; + $text =~ s/&/&/g; + $text =~ s//>/g; + } + $im->stringTTF($black, $fonttype, $fontsize, 0.0, $x1 + 3, 3 + ($y1 + $y2) / 2, $text, ""); + + $im->group_end($nameattr); +} + +print $im->svg; + +if ($palette) { + write_palette(); +} + +# vim: ts=8 sts=8 sw=8 noexpandtab diff --git a/backends/conrod_crayon/tools/profiler/scripts/stackcollapse.pl b/backends/conrod_crayon/tools/profiler/scripts/stackcollapse.pl new file mode 100755 index 000000000..17144bb62 --- /dev/null +++ b/backends/conrod_crayon/tools/profiler/scripts/stackcollapse.pl @@ -0,0 +1,109 @@ +#!/usr/bin/perl -w +# +# stackcolllapse.pl collapse multiline stacks into single lines. +# +# Parses a multiline stack followed by a number on a separate line, and +# outputs a semicolon separated stack followed by a space and the number. +# If memory addresses (+0xd) are present, they are stripped, and resulting +# identical stacks are colased with their counts summed. +# +# USAGE: ./stackcollapse.pl infile > outfile +# +# Example input: +# +# unix`i86_mwait+0xd +# unix`cpu_idle_mwait+0xf1 +# unix`idle+0x114 +# unix`thread_start+0x8 +# 1641 +# +# Example output: +# +# unix`thread_start;unix`idle;unix`cpu_idle_mwait;unix`i86_mwait 1641 +# +# Input may contain many stacks, and can be generated using DTrace. The +# first few lines of input are skipped (see $headerlines). +# +# Copyright 2011 Joyent, Inc. All rights reserved. +# Copyright 2011 Brendan Gregg. All rights reserved. +# +# CDDL HEADER START +# +# The contents of this file are subject to the terms of the +# Common Development and Distribution License (the "License"). +# You may not use this file except in compliance with the License. +# +# You can obtain a copy of the license at docs/cddl1.txt or +# http://opensource.org/licenses/CDDL-1.0. +# See the License for the specific language governing permissions +# and limitations under the License. +# +# When distributing Covered Code, include this CDDL HEADER in each +# file and include the License file at docs/cddl1.txt. +# If applicable, add the following below this CDDL HEADER, with the +# fields enclosed by brackets "[]" replaced with your own identifying +# information: Portions Copyright [yyyy] [name of copyright owner] +# +# CDDL HEADER END +# +# 14-Aug-2011 Brendan Gregg Created this. + +use strict; + +my $headerlines = 3; # number of input lines to skip +my $includeoffset = 0; # include function offset (except leafs) +my %collapsed; + +sub remember_stack { + my ($stack, $count) = @_; + $collapsed{$stack} += $count; +} + +my $nr = 0; +my @stack; + +foreach (<>) { + next if $nr++ < $headerlines; + chomp; + + if (m/^\s*(\d+)+$/) { + my $count = $1; + my $joined = join(";", @stack); + + # trim leaf offset if these were retained: + $joined =~ s/\+[^+]*$// if $includeoffset; + + remember_stack($joined, $count); + @stack = (); + next; + } + + next if (m/^\s*$/); + + my $frame = $_; + $frame =~ s/^\s*//; + $frame =~ s/\+[^+]*$// unless $includeoffset; + + # Remove arguments from C++ function names: + $frame =~ s/(::.*)[(<].*/$1/; + + $frame = "-" if $frame eq ""; + + my @inline; + for (split /\->/, $frame) { + my $func = $_; + + # Strip out L and ; included in java stacks + $func =~ tr/\;/:/; + $func =~ s/^L//; + $func .= "_[i]" if scalar(@inline) > 0; #inlined + + push @inline, $func; + } + + unshift @stack, @inline; +} + +foreach my $k (sort { $a cmp $b } keys %collapsed) { + print "$k $collapsed{$k}\n"; +} diff --git a/backends/conrod_crayon/tools/wasm-template/README.md b/backends/conrod_crayon/tools/wasm-template/README.md new file mode 100644 index 000000000..8a2ede2da --- /dev/null +++ b/backends/conrod_crayon/tools/wasm-template/README.md @@ -0,0 +1,8 @@ +# Wasm-Template + +```sh +$ cd ./tools/wasm-template +$ npm install +$ cd ../.. +$ ./tools/wasm-template/run.sh crayon +``` \ No newline at end of file diff --git a/backends/conrod_crayon/tools/wasm-template/app.js b/backends/conrod_crayon/tools/wasm-template/app.js new file mode 100644 index 000000000..1b5a899b8 --- /dev/null +++ b/backends/conrod_crayon/tools/wasm-template/app.js @@ -0,0 +1,14 @@ + +var port = process.env.PORT || 8080; +const config = require('./webpack.config.js') +const webpack = require('webpack'); +const middleware = require('webpack-dev-middleware'); +const compiler = webpack(config); +const express = require('express'); +const app = express(); + +app.use(middleware(compiler, { + // webpack-dev-middleware options t +})); + +app.listen(port, () => console.log('Example app listening on port 8080!')) \ No newline at end of file diff --git a/backends/conrod_crayon/tools/wasm-template/env.js b/backends/conrod_crayon/tools/wasm-template/env.js new file mode 100644 index 000000000..da28753ec --- /dev/null +++ b/backends/conrod_crayon/tools/wasm-template/env.js @@ -0,0 +1,17 @@ + +class env{ + constructor(){ + function rust_wasm_syscall (index, data) { + console.log("rust_wasm_syscall", index, data); + // See https://github.com/rust-lang/rust/blob/master/src/libstd/sys/wasm/mod.rs + switch (index) { + case 6: + return 1; + default: + return 0; + } + } + } + +} +export default env; \ No newline at end of file diff --git a/backends/conrod_crayon/tools/wasm-template/index.html b/backends/conrod_crayon/tools/wasm-template/index.html new file mode 100644 index 000000000..3dfae1b3e --- /dev/null +++ b/backends/conrod_crayon/tools/wasm-template/index.html @@ -0,0 +1,12 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/backends/conrod_crayon/tools/wasm-template/index.js b/backends/conrod_crayon/tools/wasm-template/index.js new file mode 100644 index 000000000..2732dc302 --- /dev/null +++ b/backends/conrod_crayon/tools/wasm-template/index.js @@ -0,0 +1,35 @@ +import init from "./dist/native.js"; + +// FIXME dirty hack for wasm_syscall +const env = { + rust_wasm_syscall: (index, data) => { + console.log("rust_wasm_syscall", index, data); + // See https://github.com/rust-lang/rust/blob/master/src/libstd/sys/wasm/mod.rs + switch (index) { + case 6: + return 1; + default: + return 0; + } + } +}; +const instantiateStreaming = WebAssembly.instantiateStreaming; +WebAssembly.instantiateStreaming = (source, importObject) => + instantiateStreaming(source, { + ...importObject, + env + }); +const instantiate = WebAssembly.instantiate; +WebAssembly.instantiate = (bufferSource, importObject) => + instantiate(bufferSource, { + ...importObject, + env + }); + +Promise.all([ + init("./dist/native_bg.wasm") +]).then(function(){ + console.log("done"); +}); + +// vim: set ts=2 sw=2 et: diff --git a/backends/conrod_crayon/tools/wasm-template/package-lock.json b/backends/conrod_crayon/tools/wasm-template/package-lock.json new file mode 100644 index 000000000..e60e2f582 --- /dev/null +++ b/backends/conrod_crayon/tools/wasm-template/package-lock.json @@ -0,0 +1,6192 @@ +{ + "requires": true, + "lockfileVersion": 1, + "dependencies": { + "@open-wc/webpack-import-meta-loader": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@open-wc/webpack-import-meta-loader/-/webpack-import-meta-loader-0.2.4.tgz", + "integrity": "sha512-QgESyG7BXaGLCLq0+iUOSS8nzZSfpz5wI/whXqpk+BpCj6+jnAqkyIxJ2CfybT1xK0Y1pemRw4t84syZ2JhFkg==" + }, + "@types/events": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz", + "integrity": "sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g==", + "dev": true + }, + "@types/glob": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.1.tgz", + "integrity": "sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w==", + "dev": true, + "requires": { + "@types/events": "*", + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "@types/minimatch": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", + "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", + "dev": true + }, + "@types/node": { + "version": "12.0.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.0.10.tgz", + "integrity": "sha512-LcsGbPomWsad6wmMNv7nBLw7YYYyfdYcz6xryKYQhx89c3XXan+8Q6AJ43G5XDIaklaVkK3mE4fCb0SBvMiPSQ==", + "dev": true + }, + "@webassemblyjs/ast": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.8.5.tgz", + "integrity": "sha512-aJMfngIZ65+t71C3y2nBBg5FFG0Okt9m0XEgWZ7Ywgn1oMAT8cNwx00Uv1cQyHtidq0Xn94R4TAywO+LCQ+ZAQ==", + "dev": true, + "requires": { + "@webassemblyjs/helper-module-context": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/wast-parser": "1.8.5" + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.8.5.tgz", + "integrity": "sha512-9p+79WHru1oqBh9ewP9zW95E3XAo+90oth7S5Re3eQnECGq59ly1Ri5tsIipKGpiStHsUYmY3zMLqtk3gTcOtQ==", + "dev": true + }, + "@webassemblyjs/helper-api-error": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.8.5.tgz", + "integrity": "sha512-Za/tnzsvnqdaSPOUXHyKJ2XI7PDX64kWtURyGiJJZKVEdFOsdKUCPTNEVFZq3zJ2R0G5wc2PZ5gvdTRFgm81zA==", + "dev": true + }, + "@webassemblyjs/helper-buffer": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.8.5.tgz", + "integrity": "sha512-Ri2R8nOS0U6G49Q86goFIPNgjyl6+oE1abW1pS84BuhP1Qcr5JqMwRFT3Ah3ADDDYGEgGs1iyb1DGX+kAi/c/Q==", + "dev": true + }, + "@webassemblyjs/helper-code-frame": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.8.5.tgz", + "integrity": "sha512-VQAadSubZIhNpH46IR3yWO4kZZjMxN1opDrzePLdVKAZ+DFjkGD/rf4v1jap744uPVU6yjL/smZbRIIJTOUnKQ==", + "dev": true, + "requires": { + "@webassemblyjs/wast-printer": "1.8.5" + } + }, + "@webassemblyjs/helper-fsm": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.8.5.tgz", + "integrity": "sha512-kRuX/saORcg8se/ft6Q2UbRpZwP4y7YrWsLXPbbmtepKr22i8Z4O3V5QE9DbZK908dh5Xya4Un57SDIKwB9eow==", + "dev": true + }, + "@webassemblyjs/helper-module-context": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.8.5.tgz", + "integrity": "sha512-/O1B236mN7UNEU4t9X7Pj38i4VoU8CcMHyy3l2cV/kIF4U5KoHXDVqcDuOs1ltkac90IM4vZdHc52t1x8Yfs3g==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "mamacro": "^0.0.3" + } + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.8.5.tgz", + "integrity": "sha512-Cu4YMYG3Ddl72CbmpjU/wbP6SACcOPVbHN1dI4VJNJVgFwaKf1ppeFJrwydOG3NDHxVGuCfPlLZNyEdIYlQ6QQ==", + "dev": true + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.8.5.tgz", + "integrity": "sha512-VV083zwR+VTrIWWtgIUpqfvVdK4ff38loRmrdDBgBT8ADXYsEZ5mPQ4Nde90N3UYatHdYoDIFb7oHzMncI02tA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-buffer": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/wasm-gen": "1.8.5" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.8.5.tgz", + "integrity": "sha512-aaCvQYrvKbY/n6wKHb/ylAJr27GglahUO89CcGXMItrOBqRarUMxWLJgxm9PJNuKULwN5n1csT9bYoMeZOGF3g==", + "dev": true, + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.8.5.tgz", + "integrity": "sha512-plYUuUwleLIziknvlP8VpTgO4kqNaH57Y3JnNa6DLpu/sGcP6hbVdfdX5aHAV716pQBKrfuU26BJK29qY37J7A==", + "dev": true, + "requires": { + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/utf8": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.8.5.tgz", + "integrity": "sha512-U7zgftmQriw37tfD934UNInokz6yTmn29inT2cAetAsaU9YeVCveWEwhKL1Mg4yS7q//NGdzy79nlXh3bT8Kjw==", + "dev": true + }, + "@webassemblyjs/wasm-edit": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.8.5.tgz", + "integrity": "sha512-A41EMy8MWw5yvqj7MQzkDjU29K7UJq1VrX2vWLzfpRHt3ISftOXqrtojn7nlPsZ9Ijhp5NwuODuycSvfAO/26Q==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-buffer": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/helper-wasm-section": "1.8.5", + "@webassemblyjs/wasm-gen": "1.8.5", + "@webassemblyjs/wasm-opt": "1.8.5", + "@webassemblyjs/wasm-parser": "1.8.5", + "@webassemblyjs/wast-printer": "1.8.5" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.8.5.tgz", + "integrity": "sha512-BCZBT0LURC0CXDzj5FXSc2FPTsxwp3nWcqXQdOZE4U7h7i8FqtFK5Egia6f9raQLpEKT1VL7zr4r3+QX6zArWg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/ieee754": "1.8.5", + "@webassemblyjs/leb128": "1.8.5", + "@webassemblyjs/utf8": "1.8.5" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.8.5.tgz", + "integrity": "sha512-HKo2mO/Uh9A6ojzu7cjslGaHaUU14LdLbGEKqTR7PBKwT6LdPtLLh9fPY33rmr5wcOMrsWDbbdCHq4hQUdd37Q==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-buffer": "1.8.5", + "@webassemblyjs/wasm-gen": "1.8.5", + "@webassemblyjs/wasm-parser": "1.8.5" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.8.5.tgz", + "integrity": "sha512-pi0SYE9T6tfcMkthwcgCpL0cM9nRYr6/6fjgDtL6q/ZqKHdMWvxitRi5JcZ7RI4SNJJYnYNaWy5UUrHQy998lw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-api-error": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/ieee754": "1.8.5", + "@webassemblyjs/leb128": "1.8.5", + "@webassemblyjs/utf8": "1.8.5" + } + }, + "@webassemblyjs/wast-parser": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.8.5.tgz", + "integrity": "sha512-daXC1FyKWHF1i11obK086QRlsMsY4+tIOKgBqI1lxAnkp9xe9YMcgOxm9kLe+ttjs5aWV2KKE1TWJCN57/Btsg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/floating-point-hex-parser": "1.8.5", + "@webassemblyjs/helper-api-error": "1.8.5", + "@webassemblyjs/helper-code-frame": "1.8.5", + "@webassemblyjs/helper-fsm": "1.8.5", + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.8.5.tgz", + "integrity": "sha512-w0U0pD4EhlnvRyeJzBqaVSJAo9w/ce7/WPogeXLzGkO6hzhr4GnQIZ4W4uUt5b9ooAaXPtnXlj0gzsXEOUNYMg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/wast-parser": "1.8.5", + "@xtuc/long": "4.2.2" + } + }, + "@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true + }, + "@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true + }, + "accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "dev": true, + "requires": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + } + }, + "acorn": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.1.1.tgz", + "integrity": "sha512-jPTiwtOxaHNaAPg/dmrJ/beuzLRnXtB0kQPQ8JpotKJgTB6rX6c8mlf315941pyjBSaPg8NHXS9fhP4u17DpGA==", + "dev": true + }, + "acorn-dynamic-import": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-4.0.0.tgz", + "integrity": "sha512-d3OEjQV4ROpoflsnUA8HozoIR504TFxNivYEUi6uwz0IYhBkTDXGuWlNdMtybRt3nqVx/L6XqMt0FxkXuWKZhw==", + "dev": true + }, + "ajv": { + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz", + "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==", + "dev": true, + "requires": { + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "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 + }, + "ajv-keywords": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.0.tgz", + "integrity": "sha512-aUjdRFISbuFOl0EIZc+9e4FfZp0bDZgAdOOf30bJmw8VM9v84SHyVyxDfbWxpGYbdZD/9XoKxfHVNmxPkhwyGw==", + "dev": true + }, + "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 + }, + "ansi-html": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", + "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=", + "dev": true + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "dev": true + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true + }, + "array-flatten": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", + "dev": true + }, + "array-union": { + "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" + } + }, + "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 + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "asn1.js": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", + "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "assert": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", + "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", + "dev": true, + "requires": { + "object-assign": "^4.1.1", + "util": "0.10.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", + "dev": true + }, + "util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "dev": true, + "requires": { + "inherits": "2.0.1" + } + } + } + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true + }, + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true + }, + "async-each": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", + "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", + "dev": true + }, + "async-limiter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz", + "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==" + }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "base64-js": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", + "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==", + "dev": true + }, + "batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", + "dev": true + }, + "big.js": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", + "integrity": "sha1-pfwpi4G54Nyi5FiCR4S2XFK6WI4=", + "dev": true + }, + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "dev": true + }, + "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 + }, + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", + "dev": true + }, + "body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "dev": true, + "requires": { + "bytes": "3.1.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" + }, + "dependencies": { + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "dev": true + } + } + }, + "bonjour": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", + "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", + "dev": true, + "requires": { + "array-flatten": "^2.1.0", + "deep-equal": "^1.0.1", + "dns-equal": "^1.0.0", + "dns-txt": "^2.0.2", + "multicast-dns": "^6.0.1", + "multicast-dns-service-types": "^1.1.0" + } + }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", + "dev": true + }, + "brace-expansion": { + "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" + } + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", + "dev": true + }, + "browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "dev": true, + "requires": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "dev": true, + "requires": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "browserify-rsa": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "randombytes": "^2.0.1" + } + }, + "browserify-sign": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", + "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", + "dev": true, + "requires": { + "bn.js": "^4.1.1", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.2", + "elliptic": "^6.0.0", + "inherits": "^2.0.1", + "parse-asn1": "^5.0.0" + } + }, + "browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "dev": true, + "requires": { + "pako": "~1.0.5" + } + }, + "buffer": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", + "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", + "dev": true, + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + } + } + }, + "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 + }, + "buffer-indexof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", + "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", + "dev": true + }, + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", + "dev": true + }, + "builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", + "dev": true + }, + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", + "dev": true + }, + "cacache": { + "version": "11.3.3", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-11.3.3.tgz", + "integrity": "sha512-p8WcneCytvzPxhDvYp31PD039vi77I12W+/KfR9S8AZbaiARFBCpsPJS+9uhWfeBfeAtW7o/4vt3MUqLkbY6nA==", + "dev": true, + "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" + } + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + } + }, + "camel-case": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", + "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=", + "dev": true, + "requires": { + "no-case": "^2.2.0", + "upper-case": "^1.1.1" + } + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "chokidar": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.6.tgz", + "integrity": "sha512-V2jUo67OKkc6ySiRpJrjlpJKl9kDuG+Xb8VgsGzb+aEouhgS1D0weyPU4lEzdAcsCAvrih2J2BqyXqHWvVLw5g==", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + } + }, + "chownr": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.1.tgz", + "integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==", + "dev": true + }, + "chrome-trace-event": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz", + "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "clean-css": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.1.tgz", + "integrity": "sha1-LUEe92uFabbQyEBo2r6FsKpeXBc=", + "dev": true, + "requires": { + "source-map": "~0.6.0" + } + }, + "cliui": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", + "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "dev": true, + "requires": { + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "commander": { + "version": "2.17.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", + "integrity": "sha1-vXerfebelCBc6sxy8XFtKfIKd78=", + "dev": true + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "dev": true + }, + "compressible": { + "version": "2.0.17", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.17.tgz", + "integrity": "sha512-BGHeLCK1GV7j1bSmQQAi26X+GgWcTjLr/0tzSvMCl3LH1w1IJ4PFSPoV5316b30cneTziC+B1a+3OjoSUcQYmw==", + "dev": true, + "requires": { + "mime-db": ">= 1.40.0 < 2" + } + }, + "compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "dev": true, + "requires": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + } + }, + "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 + }, + "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", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "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", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "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" + } + } + } + }, + "connect-history-api-fallback": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", + "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", + "dev": true + }, + "console-browserify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", + "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", + "dev": true, + "requires": { + "date-now": "^0.1.4" + } + }, + "constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", + "dev": true + }, + "content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "dev": true, + "requires": { + "safe-buffer": "5.1.2" + } + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "dev": true + }, + "cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", + "dev": true + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", + "dev": true + }, + "copy-concurrently": { + "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", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.0" + } + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true + }, + "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 + }, + "create-ecdh": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", + "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "elliptic": "^6.0.0" + } + }, + "create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "dev": true, + "requires": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "dev": true, + "requires": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + } + }, + "css-select": { + "version": "1.2.0", + "resolved": "http://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", + "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", + "dev": true, + "requires": { + "boolbase": "~1.0.0", + "css-what": "2.1", + "domutils": "1.5.1", + "nth-check": "~1.0.1" + } + }, + "css-what": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.2.tgz", + "integrity": "sha1-wIdtnQSAkn19SSDc1yrzWVZJVU0=", + "dev": true + }, + "cyclist": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-0.2.2.tgz", + "integrity": "sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA=", + "dev": true + }, + "date-now": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", + "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", + "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true + }, + "deep-equal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", + "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=", + "dev": true + }, + "default-gateway": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz", + "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==", + "dev": true, + "requires": { + "execa": "^1.0.0", + "ip-regex": "^2.1.0" + } + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha1-z4jabL7ib+bbcJT2HYcMvYTO6fE=", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "del": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", + "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", + "dev": true, + "requires": { + "@types/glob": "^7.1.1", + "globby": "^6.1.0", + "is-path-cwd": "^2.0.0", + "is-path-in-cwd": "^2.0.0", + "p-map": "^2.0.0", + "pify": "^4.0.1", + "rimraf": "^2.6.3" + } + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true + }, + "des.js": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", + "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", + "dev": true + }, + "detect-file": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", + "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", + "dev": true + }, + "detect-node": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.4.tgz", + "integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==", + "dev": true + }, + "diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + } + }, + "dns-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", + "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=", + "dev": true + }, + "dns-packet": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz", + "integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==", + "dev": true, + "requires": { + "ip": "^1.1.0", + "safe-buffer": "^5.0.1" + } + }, + "dns-txt": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", + "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", + "dev": true, + "requires": { + "buffer-indexof": "^1.0.0" + } + }, + "dom-converter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", + "integrity": "sha1-ZyGp2u4uKTaClVtq/kFncWJ7t2g=", + "dev": true, + "requires": { + "utila": "~0.4" + } + }, + "dom-serializer": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", + "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=", + "dev": true, + "requires": { + "domelementtype": "~1.1.1", + "entities": "~1.1.1" + }, + "dependencies": { + "domelementtype": { + "version": "1.1.3", + "resolved": "http://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz", + "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=", + "dev": true + } + } + }, + "domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", + "dev": true + }, + "domelementtype": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.2.1.tgz", + "integrity": "sha512-SQVCLFS2E7G5CRCMdn6K9bIhRj1bS6QBWZfF0TUPh4V/BbqrQ619IdSS3/izn0FZ+9l+uODzaZjb08fjOfablA==", + "dev": true + }, + "domhandler": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.1.0.tgz", + "integrity": "sha1-0mRvXlf2w7qxHPbLBdPArPdBJZQ=", + "dev": true, + "requires": { + "domelementtype": "1" + } + }, + "domutils": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", + "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", + "dev": true, + "requires": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "duplexify": { + "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", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "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", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "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" + } + } + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", + "dev": true + }, + "elliptic": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.1.tgz", + "integrity": "sha512-BsXLz5sqX8OHcsh7CqBMztyXARmGQ3LWPtGjJi6DiJHq5C/qvi9P3OqgswKSDftbu8+IoI/QDTAm2fFnQ9SZSQ==", + "dev": true, + "requires": { + "bn.js": "^4.4.0", + "brorand": "^1.0.1", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.0" + } + }, + "emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", + "dev": true + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "dev": true + }, + "end-of-stream": { + "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" + } + }, + "enhanced-resolve": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz", + "integrity": "sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.4.0", + "tapable": "^1.0.0" + } + }, + "entities": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", + "integrity": "sha1-vfpzUplmTfr9NFKe1PhSKidf6lY=", + "dev": true + }, + "errno": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", + "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", + "dev": true, + "requires": { + "prr": "~1.0.1" + } + }, + "es-abstract": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.12.0.tgz", + "integrity": "sha512-C8Fx/0jFmV5IPoMOFPA9P9G5NtqW+4cOPit3MIuvR2t7Ag2K15EJTpxnHAYTzL+aYQJIESYeXZmDBfOBE1HcpA==", + "dev": true, + "requires": { + "es-to-primitive": "^1.1.1", + "function-bind": "^1.1.1", + "has": "^1.0.1", + "is-callable": "^1.1.3", + "is-regex": "^1.0.4" + } + }, + "es-to-primitive": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz", + "integrity": "sha1-7fckeAM0VujdqO8J4ArZZQcH83c=", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "eslint-scope": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", + "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "esrecurse": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", + "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "dev": true, + "requires": { + "estraverse": "^4.1.0" + } + }, + "estraverse": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", + "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", + "dev": true + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "dev": true + }, + "eventemitter3": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.2.tgz", + "integrity": "sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==", + "dev": true + }, + "events": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.0.0.tgz", + "integrity": "sha512-Dc381HFWJzEOhQ+d8pkNon++bk9h6cdAoAj4iE6Q4y6xgTzySWXlKn05/TVNpjnfRqi/X0EpJEJohPjNI3zpVA==", + "dev": true + }, + "eventsource": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.0.7.tgz", + "integrity": "sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ==", + "dev": true, + "requires": { + "original": "^1.0.0" + } + }, + "evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dev": true, + "requires": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", + "dev": true, + "requires": { + "homedir-polyfill": "^1.0.1" + } + }, + "express": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "dev": true, + "requires": { + "accepts": "~1.3.7", + "array-flatten": "1.1.1", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", + "content-type": "~1.0.4", + "cookie": "0.4.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.1.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.5", + "qs": "6.7.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.1.2", + "send": "0.17.1", + "serve-static": "1.14.1", + "setprototypeof": "1.1.1", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "dependencies": { + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", + "dev": true + } + } + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "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 + }, + "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 + }, + "faye-websocket": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", + "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", + "dev": true, + "requires": { + "websocket-driver": ">=0.5.1" + } + }, + "figgy-pudding": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.1.tgz", + "integrity": "sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w==", + "dev": true + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "dev": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + } + }, + "find-cache-dir": { + "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", + "pkg-dir": "^3.0.0" + } + }, + "find-up": { + "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" + } + }, + "findup-sync": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz", + "integrity": "sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=", + "dev": true, + "requires": { + "detect-file": "^1.0.0", + "is-glob": "^3.1.0", + "micromatch": "^3.0.4", + "resolve-dir": "^1.0.1" + }, + "dependencies": { + "is-glob": { + "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" + } + } + } + }, + "flush-write-stream": { + "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" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "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", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "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" + } + } + } + }, + "follow-redirects": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.7.0.tgz", + "integrity": "sha512-m/pZQy4Gj287eNy94nivy5wchN3Kp+Q5WgUPNy5lJSZ3sgkVKSYV/ZChMAQVIgx1SqfZ2zBZtPA2YlXIWxxJOQ==", + "dev": true, + "requires": { + "debug": "^3.2.6" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", + "dev": true + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "requires": { + "map-cache": "^0.2.2" + } + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "dev": true + }, + "from2": { + "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" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "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", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "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" + } + } + } + }, + "fs-write-stream-atomic": { + "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", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fsevents": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.9.tgz", + "integrity": "sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw==", + "dev": true, + "optional": true, + "requires": { + "nan": "^2.12.1", + "node-pre-gyp": "^0.12.0" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "dev": true + }, + "aproba": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "chownr": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "debug": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ms": "^2.1.1" + } + }, + "deep-extend": { + "version": "0.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "fs-minipass": { + "version": "1.2.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "glob": { + "version": "7.1.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "iconv-lite": { + "version": "0.4.24", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore-walk": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "ini": { + "version": "1.3.5", + "bundled": true, + "dev": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true, + "dev": true, + "optional": true + }, + "minipass": { + "version": "2.3.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.2.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "needle": { + "version": "2.3.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "debug": "^4.1.0", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.12.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.1", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.2.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npm-bundled": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "optional": true + }, + "npm-packlist": { + "version": "1.4.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "wrappy": "1" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "osenv": { + "version": "0.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "process-nextick-args": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "rc": { + "version": "1.2.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "rimraf": { + "version": "2.6.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.1.2", + "bundled": true, + "dev": true + }, + "safer-buffer": { + "version": "2.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "sax": { + "version": "1.2.4", + "bundled": true, + "dev": true, + "optional": true + }, + "semver": { + "version": "5.7.0", + "bundled": true, + "dev": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "tar": { + "version": "4.4.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.3.4", + "minizlib": "^1.1.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.2" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "wide-align": { + "version": "1.1.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "yallist": { + "version": "3.0.3", + "bundled": true, + "dev": true + } + } + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha1-pWiZ0+o8m6uHS7l3O3xe3pL0iV0=", + "dev": true + }, + "get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", + "dev": true + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true + }, + "glob": { + "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", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "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" + }, + "dependencies": { + "is-glob": { + "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" + } + } + } + }, + "global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "dev": true, + "requires": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + } + }, + "global-prefix": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", + "dev": true, + "requires": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + } + }, + "globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "dev": true, + "requires": { + "array-union": "^1.0.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "graceful-fs": { + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", + "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", + "dev": true + }, + "handle-thing": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.0.tgz", + "integrity": "sha512-d4sze1JNC454Wdo2fkuyzCr6aHcbL6PGGuFAz0Li/NcOm1tCHGnWDRmJP85dh9IhQErTc2svWFEX5xHIOo//kQ==", + "dev": true + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha1-ci18v8H2qoJB8W3YFOAR4fQeh5Y=", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "has-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", + "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", + "dev": true + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "hash-base": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", + "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "he": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", + "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", + "dev": true + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "dev": true, + "requires": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "dev": true, + "requires": { + "parse-passwd": "^1.0.0" + } + }, + "hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "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", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "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" + } + } + } + }, + "html-entities": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.2.1.tgz", + "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=", + "dev": true + }, + "html-minifier": { + "version": "3.5.20", + "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.20.tgz", + "integrity": "sha512-ZmgNLaTp54+HFKkONyLFEfs5dd/ZOtlquKaTnqIWFmx3Av5zG6ZPcV2d0o9XM2fXOTxxIf6eDcwzFFotke/5zA==", + "dev": true, + "requires": { + "camel-case": "3.0.x", + "clean-css": "4.2.x", + "commander": "2.17.x", + "he": "1.1.x", + "param-case": "2.1.x", + "relateurl": "0.2.x", + "uglify-js": "3.4.x" + } + }, + "html-webpack-plugin": { + "version": "3.2.0", + "resolved": "http://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-3.2.0.tgz", + "integrity": "sha1-sBq71yOsqqeze2r0SS69oD2d03s=", + "dev": true, + "requires": { + "html-minifier": "^3.2.3", + "loader-utils": "^0.2.16", + "lodash": "^4.17.3", + "pretty-error": "^2.0.2", + "tapable": "^1.0.0", + "toposort": "^1.0.0", + "util.promisify": "1.0.0" + } + }, + "htmlparser2": { + "version": "3.3.0", + "resolved": "http://registry.npmjs.org/htmlparser2/-/htmlparser2-3.3.0.tgz", + "integrity": "sha1-zHDQWln2VC5D8OaFyYLhTJJKnv4=", + "dev": true, + "requires": { + "domelementtype": "1", + "domhandler": "2.1", + "domutils": "1.1", + "readable-stream": "1.0" + }, + "dependencies": { + "domutils": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.1.6.tgz", + "integrity": "sha1-vdw94Jm5ou+sxRxiPyj0FuzFdIU=", + "dev": true, + "requires": { + "domelementtype": "1" + } + } + } + }, + "http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=", + "dev": true + }, + "http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + } + }, + "http-parser-js": { + "version": "0.4.10", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.10.tgz", + "integrity": "sha1-ksnBN0w1CF912zWexWzCV8u5P6Q=", + "dev": true + }, + "http-proxy": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.17.0.tgz", + "integrity": "sha512-Taqn+3nNvYRfJ3bGvKfBSRwy1v6eePlm3oc/aWVxZp57DQr5Eq3xhKJi7Z4hZpS8PC3H4qI+Yly5EmFacGuA/g==", + "dev": true, + "requires": { + "eventemitter3": "^3.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + } + }, + "http-proxy-middleware": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz", + "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==", + "dev": true, + "requires": { + "http-proxy": "^1.17.0", + "is-glob": "^4.0.0", + "lodash": "^4.17.11", + "micromatch": "^3.1.10" + } + }, + "https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", + "dev": true + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ieee754": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", + "dev": true + }, + "iferr": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", + "dev": true + }, + "import-local": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", + "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", + "dev": true, + "requires": { + "pkg-dir": "^3.0.0", + "resolve-cwd": "^2.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "inflight": { + "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" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "dev": true + }, + "internal-ip": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz", + "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==", + "dev": true, + "requires": { + "default-gateway": "^4.2.0", + "ipaddr.js": "^1.9.0" + } + }, + "interpret": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz", + "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==", + "dev": true + }, + "invert-kv": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", + "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", + "dev": true + }, + "ip": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", + "dev": true + }, + "ip-regex": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", + "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", + "dev": true + }, + "ipaddr.js": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.0.tgz", + "integrity": "sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA==", + "dev": true + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-callable": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", + "integrity": "sha1-HhrfIZ4e62hNaR+dagX/DTCiTXU=", + "dev": true + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-date-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", + "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", + "dev": true + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "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 + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "is-glob": { + "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" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-path-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.1.0.tgz", + "integrity": "sha512-Sc5j3/YnM8tDeyCsVeKlm/0p95075DyLmDEIkSgQ7mXkrOX+uTCtmQFm0CYzVyJwcCCmO3k8qfJt17SxQwB5Zw==", + "dev": true + }, + "is-path-in-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", + "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", + "dev": true, + "requires": { + "is-path-inside": "^2.1.0" + } + }, + "is-path-inside": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", + "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", + "dev": true, + "requires": { + "path-is-inside": "^1.0.2" + } + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "is-regex": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", + "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", + "dev": true, + "requires": { + "has": "^1.0.1" + } + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, + "is-symbol": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", + "integrity": "sha1-oFX2rlcZLK7jKeeoYBGLSXqVDzg=", + "dev": true, + "requires": { + "has-symbols": "^1.0.0" + } + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "dev": true + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "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 + }, + "json3": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz", + "integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==", + "dev": true + }, + "json5": { + "version": "0.5.1", + "resolved": "http://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", + "dev": true + }, + "killable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", + "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + }, + "lcid": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", + "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", + "dev": true, + "requires": { + "invert-kv": "^2.0.0" + } + }, + "loader-runner": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", + "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", + "dev": true + }, + "loader-utils": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", + "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", + "dev": true, + "requires": { + "big.js": "^3.1.3", + "emojis-list": "^2.0.0", + "json5": "^0.5.0", + "object-assign": "^4.0.1" + } + }, + "locate-path": { + "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" + } + }, + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha1-s56mIp72B+zYniyN8SU2iRysm40=", + "dev": true + }, + "loglevel": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.3.tgz", + "integrity": "sha512-LoEDv5pgpvWgPF4kNYuIp0qqSJVWak/dML0RY74xlzMZiT9w77teNAwKYKWBTYjlokMirg+o3jBwp+vlLrcfAA==", + "dev": true + }, + "lower-case": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", + "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=", + "dev": true + }, + "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==", + "dev": true, + "requires": { + "yallist": "^3.0.2" + } + }, + "make-dir": { + "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" + } + }, + "mamacro": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/mamacro/-/mamacro-0.0.3.tgz", + "integrity": "sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA==", + "dev": true + }, + "map-age-cleaner": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", + "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", + "dev": true, + "requires": { + "p-defer": "^1.0.0" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dev": true, + "requires": { + "object-visit": "^1.0.0" + } + }, + "md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "dev": true + }, + "mem": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", + "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", + "dev": true, + "requires": { + "map-age-cleaner": "^0.1.1", + "mimic-fn": "^2.0.0", + "p-is-promise": "^2.0.0" + } + }, + "memory-fs": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "dev": true, + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "http://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", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "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" + } + } + } + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", + "dev": true + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true + }, + "mime-db": { + "version": "1.40.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", + "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==", + "dev": true + }, + "mime-types": { + "version": "2.1.24", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", + "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", + "dev": true, + "requires": { + "mime-db": "1.40.0" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", + "dev": true + }, + "minimatch": { + "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" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "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", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^3.0.0", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + } + }, + "mixin-deep": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", + "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", + "dev": true, + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + }, + "dependencies": { + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + } + } + }, + "move-concurrently": { + "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", + "fs-write-stream-atomic": "^1.0.8", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.3" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "multicast-dns": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", + "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", + "dev": true, + "requires": { + "dns-packet": "^1.3.1", + "thunky": "^1.0.2" + } + }, + "multicast-dns-service-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", + "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", + "dev": true + }, + "nan": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", + "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", + "dev": true, + "optional": true + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + } + }, + "negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", + "dev": true + }, + "neo-async": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", + "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", + "dev": true + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "no-case": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", + "integrity": "sha1-YLgTOWvjmz8SiKTB7V0efSi0ZKw=", + "dev": true, + "requires": { + "lower-case": "^1.1.1" + } + }, + "node-forge": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.7.5.tgz", + "integrity": "sha512-MmbQJ2MTESTjt3Gi/3yG1wGpIMhUfcIypUCGtTizFR9IiccFwxSpfp0vtIZlkFclEqERemxfnSdZEMR9VqqEFQ==", + "dev": true + }, + "node-libs-browser": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", + "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", + "dev": true, + "requires": { + "assert": "^1.1.1", + "browserify-zlib": "^0.2.0", + "buffer": "^4.3.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.11.0", + "domain-browser": "^1.1.1", + "events": "^3.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "0.0.1", + "process": "^0.11.10", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.3.3", + "stream-browserify": "^2.0.1", + "stream-http": "^2.7.2", + "string_decoder": "^1.0.0", + "timers-browserify": "^2.0.4", + "tty-browserify": "0.0.0", + "url": "^0.11.0", + "util": "^0.11.0", + "vm-browserify": "^1.0.1" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + }, + "readable-stream": { + "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", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + }, + "dependencies": { + "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" + } + } + } + }, + "string_decoder": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.2.0.tgz", + "integrity": "sha512-6YqyX6ZWEYguAxgZzHGL7SsCeGx3V2TtOTqZz1xSTSWnqsbWwbptafNyvf/ACquZUXV3DANr5BDIwNYe1mN42w==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "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 + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "requires": { + "path-key": "^2.0.0" + } + }, + "nth-check": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", + "integrity": "sha1-sr0pXDfj3VijvwcAN2Zjuk2c8Fw=", + "dev": true, + "requires": { + "boolbase": "~1.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "object-keys": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.12.tgz", + "integrity": "sha1-CcU4VTd1dTEMymL1W7M0q/97PtI=", + "dev": true + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, + "requires": { + "isobject": "^3.0.0" + } + }, + "object.getownpropertydescriptors": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz", + "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "es-abstract": "^1.5.1" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "dev": true + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } + }, + "on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "dev": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "opn": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", + "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==", + "dev": true, + "requires": { + "is-wsl": "^1.1.0" + } + }, + "original": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz", + "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==", + "dev": true, + "requires": { + "url-parse": "^1.4.3" + } + }, + "os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", + "dev": true + }, + "os-locale": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", + "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", + "dev": true, + "requires": { + "execa": "^1.0.0", + "lcid": "^2.0.0", + "mem": "^4.0.0" + } + }, + "p-defer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", + "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", + "dev": true + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true + }, + "p-is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", + "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==", + "dev": true + }, + "p-limit": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", + "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "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" + } + }, + "p-map": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", + "dev": true + }, + "p-retry": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-3.0.1.tgz", + "integrity": "sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==", + "dev": true, + "requires": { + "retry": "^0.12.0" + } + }, + "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 + }, + "pako": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.10.tgz", + "integrity": "sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw==", + "dev": true + }, + "parallel-transform": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.1.0.tgz", + "integrity": "sha1-1BDwZbBdojCB/NEPKIVMKb2jOwY=", + "dev": true, + "requires": { + "cyclist": "~0.2.2", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "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", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "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" + } + } + } + }, + "param-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", + "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=", + "dev": true, + "requires": { + "no-case": "^2.2.0" + } + }, + "parse-asn1": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.4.tgz", + "integrity": "sha512-Qs5duJcuvNExRfFZ99HDD3z4mAi3r9Wl/FOjEOijlxwCZs7E7mW2vjTpgQ4J8LpTF8x5v+1Vn5UQFejmWT11aw==", + "dev": true, + "requires": { + "asn1.js": "^4.0.0", + "browserify-aes": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" + } + }, + "parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", + "dev": true + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true + }, + "path-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", + "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", + "dev": true + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "dev": true + }, + "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 + }, + "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 + }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "dev": true + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", + "dev": true + }, + "pbkdf2": { + "version": "3.0.17", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", + "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", + "dev": true, + "requires": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "requires": { + "pinkie": "^2.0.0" + } + }, + "pkg-dir": { + "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" + } + }, + "portfinder": { + "version": "1.0.20", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.20.tgz", + "integrity": "sha512-Yxe4mTyDzTd59PZJY4ojZR8F+E5e97iq2ZOHPz3HDgSvYC5siNad2tLooQ5y5QHyQhc3xVqvyk/eNA3wuoa7Sw==", + "dev": true, + "requires": { + "async": "^1.5.2", + "debug": "^2.2.0", + "mkdirp": "0.5.x" + } + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true + }, + "prettier": { + "version": "1.18.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.18.2.tgz", + "integrity": "sha512-OeHeMc0JhFE9idD4ZdtNibzY0+TPHSpSSb9h8FqtP+YnoZZ1sl8Vc9b1sasjfymH3SonAF4QcA2+mzHPhMvIiw==", + "dev": true + }, + "pretty-error": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.1.tgz", + "integrity": "sha1-X0+HyPkeWuPzuoerTPXgOxoX8aM=", + "dev": true, + "requires": { + "renderkid": "^2.0.1", + "utila": "~0.4" + } + }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "dev": true + }, + "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 + }, + "promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", + "dev": true + }, + "proxy-addr": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.5.tgz", + "integrity": "sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ==", + "dev": true, + "requires": { + "forwarded": "~0.1.2", + "ipaddr.js": "1.9.0" + } + }, + "prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", + "dev": true + }, + "public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "pump": { + "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" + } + }, + "pumpify": { + "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", + "pump": "^2.0.0" + }, + "dependencies": { + "pump": { + "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" + } + } + } + }, + "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 + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "dev": true + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "dev": true + }, + "querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", + "dev": true + }, + "querystringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.1.1.tgz", + "integrity": "sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA==", + "dev": true + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "dev": true, + "requires": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true + }, + "raw-body": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "dev": true, + "requires": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "dependencies": { + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "dev": true + } + } + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "http://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", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "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" + } + } + } + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + } + }, + "relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=", + "dev": true + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true + }, + "renderkid": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.2.tgz", + "integrity": "sha1-EtMQ8lU2DAetj94lP2yeneNy0qo=", + "dev": true, + "requires": { + "css-select": "^1.1.0", + "dom-converter": "~0.2", + "htmlparser2": "~3.3.0", + "strip-ansi": "^3.0.0", + "utila": "^0.4.0" + } + }, + "repeat-element": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "dev": true + }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", + "dev": true + }, + "resolve-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "dev": true, + "requires": { + "resolve-from": "^3.0.0" + } + }, + "resolve-dir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", + "dev": true, + "requires": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + } + }, + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "dev": true + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true + }, + "retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", + "dev": true + }, + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "run-queue": { + "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" + } + }, + "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 + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "requires": { + "ret": "~0.1.10" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "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==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + }, + "select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=", + "dev": true + }, + "selfsigned": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.4.tgz", + "integrity": "sha512-9AukTiDmHXGXWtWjembZ5NDmVvP2695EtpgbCsxCa68w3c88B+alqbmZ4O3hZ4VWGXeGWzEVdvqgAJD8DQPCDw==", + "dev": true, + "requires": { + "node-forge": "0.7.5" + } + }, + "semver": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", + "dev": true + }, + "send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "dev": true, + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "dependencies": { + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + } + } + }, + "serialize-javascript": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.7.0.tgz", + "integrity": "sha512-ke8UG8ulpFOxO8f8gRYabHQe/ZntKlcig2Mp+8+URDP1D8vJZ0KUt7LYo07q25Z/+JVSgpr/cui9PIp5H6/+nA==", + "dev": true + }, + "serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", + "dev": true, + "requires": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "dependencies": { + "http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + } + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + } + } + }, + "serve-static": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", + "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "dev": true, + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.1" + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "set-value": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", + "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", + "dev": true + }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", + "dev": true + }, + "sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "dev": true + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "requires": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "requires": { + "kind-of": "^3.2.0" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "sockjs": { + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.19.tgz", + "integrity": "sha512-V48klKZl8T6MzatbLlzzRNhMepEys9Y4oGFpypBFFn1gLI/QQ9HtLLyWJNbPlwGLelOVOEijUbTTJeLLI59jLw==", + "dev": true, + "requires": { + "faye-websocket": "^0.10.0", + "uuid": "^3.0.1" + } + }, + "sockjs-client": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.3.0.tgz", + "integrity": "sha512-R9jxEzhnnrdxLCNln0xg5uGHqMnkhPSTzUZH2eXcR03S/On9Yvoq2wyUZILRUhZCNVu2PmwWVoyuiPz8th8zbg==", + "dev": true, + "requires": { + "debug": "^3.2.5", + "eventsource": "^1.0.7", + "faye-websocket": "~0.11.1", + "inherits": "^2.0.3", + "json3": "^3.3.2", + "url-parse": "^1.4.3" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "faye-websocket": { + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.3.tgz", + "integrity": "sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA==", + "dev": true, + "requires": { + "websocket-driver": ">=0.5.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "source-list-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "dev": true + }, + "source-map-resolve": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", + "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", + "dev": true, + "requires": { + "atob": "^2.1.1", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "source-map-support": { + "version": "0.5.12", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.12.tgz", + "integrity": "sha512-4h2Pbvyy15EE02G+JOZpUCmqWJuqrs+sEkzewTm++BPi7Hvn/HwcqLAcNxYAyI0x13CpPPn+kMjl+hplXMHITQ==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", + "dev": true + }, + "spdy": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.0.tgz", + "integrity": "sha512-ot0oEGT/PGUpzf/6uk4AWLqkq+irlqHXkrdbk51oWONh3bxQmBuljxPNl66zlRRcIJStWq0QkLUCPOPjgjvU0Q==", + "dev": true, + "requires": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "dev": true, + "requires": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "readable-stream": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", + "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "string_decoder": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.2.0.tgz", + "integrity": "sha512-6YqyX6ZWEYguAxgZzHGL7SsCeGx3V2TtOTqZz1xSTSWnqsbWwbptafNyvf/ACquZUXV3DANr5BDIwNYe1mN42w==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.0" + } + }, + "ssri": { + "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" + } + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "dev": true + }, + "stream-browserify": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", + "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", + "dev": true, + "requires": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "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", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "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" + } + } + } + }, + "stream-each": { + "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" + } + }, + "stream-http": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", + "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", + "dev": true, + "requires": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "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", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "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" + } + } + } + }, + "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 + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "tapable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.0.tgz", + "integrity": "sha512-IlqtmLVaZA2qab8epUXbVWRn3aB1imbDMJtjB3nu4X0NqPkcY/JH9ZtCBWKHWPxs8Svi9tyo8w2dBoi07qZbBA==", + "dev": true + }, + "terser": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.0.0.tgz", + "integrity": "sha512-dOapGTU0hETFl1tCo4t56FN+2jffoKyER9qBGoUFyZ6y7WLoKT0bF+lAYi6B6YsILcGF3q1C2FBh8QcKSCgkgA==", + "dev": true, + "requires": { + "commander": "^2.19.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.10" + }, + "dependencies": { + "commander": { + "version": "2.20.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz", + "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==", + "dev": true + } + } + }, + "terser-webpack-plugin": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.3.0.tgz", + "integrity": "sha512-W2YWmxPjjkUcOWa4pBEv4OP4er1aeQJlSo2UhtCFQCuRXEHjOFscO8VyWHj9JLlA0RzQb8Y2/Ta78XZvT54uGg==", + "dev": true, + "requires": { + "cacache": "^11.3.2", + "find-cache-dir": "^2.0.0", + "is-wsl": "^1.1.0", + "loader-utils": "^1.2.3", + "schema-utils": "^1.0.0", + "serialize-javascript": "^1.7.0", + "source-map": "^0.6.1", + "terser": "^4.0.0", + "webpack-sources": "^1.3.0", + "worker-farm": "^1.7.0" + }, + "dependencies": { + "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 + }, + "json5": { + "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" + } + }, + "loader-utils": { + "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", + "json5": "^1.0.1" + } + } + } + }, + "text-encoding": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/text-encoding/-/text-encoding-0.7.0.tgz", + "integrity": "sha1-+JXoNuRZkGJAhmAXmOqY6PNu5kM=", + "dev": true + }, + "through2": { + "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" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "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", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "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" + } + } + } + }, + "thunky": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.0.3.tgz", + "integrity": "sha512-YwT8pjmNcAXBZqrubu22P4FYsh2D4dxRmnWBOL8Jk8bUcRUtc5326kx32tuTmFDAZtLOGEVNl8POAR8j896Iow==", + "dev": true + }, + "timers-browserify": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.10.tgz", + "integrity": "sha512-YvC1SV1XdOUaL6gx5CoGroT3Gu49pK9+TZ38ErPldOWW4j49GI1HKs9DV+KGq/w6y+LZ72W1c8cKz2vzY+qpzg==", + "dev": true, + "requires": { + "setimmediate": "^1.0.4" + } + }, + "to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", + "dev": true + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", + "dev": true + }, + "toposort": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/toposort/-/toposort-1.0.7.tgz", + "integrity": "sha1-LmhELZ9k7HILjMieZEOsbKqVACk=", + "dev": true + }, + "tslib": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", + "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==", + "dev": true + }, + "tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", + "dev": true + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "uglify-js": { + "version": "3.4.9", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.9.tgz", + "integrity": "sha1-rwLxgMEgfXZDLkc+0koo9KeCuuM=", + "dev": true, + "requires": { + "commander": "~2.17.1", + "source-map": "~0.6.1" + } + }, + "union-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", + "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^0.4.3" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "set-value": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", + "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.1", + "to-object-path": "^0.3.0" + } + } + } + }, + "unique-filename": { + "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" + } + }, + "unique-slug": { + "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" + } + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "dev": true + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dev": true, + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + } + } + }, + "upath": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.2.tgz", + "integrity": "sha512-kXpym8nmDmlCBr7nKdIx8P2jNBa+pBpIUFRnKJ4dr8htyYGJFokkr2ZvERRtUN+9SY+JqXouNgUPtv6JQva/2Q==", + "dev": true + }, + "upper-case": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", + "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=", + "dev": true + }, + "uri-js": { + "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" + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true + }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "dev": true, + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "dev": true + } + } + }, + "url-parse": { + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.7.tgz", + "integrity": "sha512-d3uaVyzDB9tQoSXFvuSUNFibTd9zxd2bkVrDRvF5TmvWWQwqE4lgYJ5m+x1DbecWkw+LK4RNl2CU1hHuOKPVlg==", + "dev": true, + "requires": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true + }, + "util": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", + "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", + "dev": true, + "requires": { + "inherits": "2.0.3" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "util.promisify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", + "integrity": "sha1-RA9xZaRZyaFtwUXrjnLzVocJcDA=", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "object.getownpropertydescriptors": "^2.0.3" + } + }, + "utila": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", + "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=", + "dev": true + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "dev": true + }, + "uuid": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", + "dev": true + }, + "v8-compile-cache": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.0.3.tgz", + "integrity": "sha512-CNmdbwQMBjwr9Gsmohvm0pbL954tJrNzf6gWL3K+QMQf00PF7ERGrEiLgjuU3mKreLC2MeGhUsNV9ybTbLgd3w==", + "dev": true + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "dev": true + }, + "vm-browserify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.0.tgz", + "integrity": "sha512-iq+S7vZJE60yejDYM0ek6zg308+UZsdtPExWP9VZoCFCz1zkJoXFnAX7aZfd/ZwrkidzdUZL0C/ryW+JwAiIGw==", + "dev": true + }, + "watchpack": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz", + "integrity": "sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==", + "dev": true, + "requires": { + "chokidar": "^2.0.2", + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0" + } + }, + "wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "dev": true, + "requires": { + "minimalistic-assert": "^1.0.0" + } + }, + "webpack": { + "version": "4.35.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.35.0.tgz", + "integrity": "sha512-M5hL3qpVvtr8d4YaJANbAQBc4uT01G33eDpl/psRTBCfjxFTihdhin1NtAKB1ruDwzeVdcsHHV3NX+QsAgOosw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-module-context": "1.8.5", + "@webassemblyjs/wasm-edit": "1.8.5", + "@webassemblyjs/wasm-parser": "1.8.5", + "acorn": "^6.0.5", + "acorn-dynamic-import": "^4.0.0", + "ajv": "^6.1.0", + "ajv-keywords": "^3.1.0", + "chrome-trace-event": "^1.0.0", + "enhanced-resolve": "^4.1.0", + "eslint-scope": "^4.0.0", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^2.3.0", + "loader-utils": "^1.1.0", + "memory-fs": "~0.4.1", + "micromatch": "^3.1.8", + "mkdirp": "~0.5.0", + "neo-async": "^2.5.0", + "node-libs-browser": "^2.0.0", + "schema-utils": "^1.0.0", + "tapable": "^1.1.0", + "terser-webpack-plugin": "^1.1.0", + "watchpack": "^1.5.0", + "webpack-sources": "^1.3.0" + }, + "dependencies": { + "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 + }, + "json5": { + "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" + } + }, + "loader-utils": { + "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", + "json5": "^1.0.1" + } + } + } + }, + "webpack-cli": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.3.4.tgz", + "integrity": "sha512-ubJGQEKMtBSpT+LiL5hXvn2GIOWiRWItR1DGUqJRhwRBeGhpRXjvF5f0erqdRJLErkfqS5/Ldkkedh4AL5Q1ZQ==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "cross-spawn": "^6.0.5", + "enhanced-resolve": "^4.1.0", + "findup-sync": "^2.0.0", + "global-modules": "^1.0.0", + "import-local": "^2.0.0", + "interpret": "^1.1.0", + "loader-utils": "^1.1.0", + "prettier": "^1.17.0", + "supports-color": "^5.5.0", + "v8-compile-cache": "^2.0.2", + "yargs": "^12.0.5" + }, + "dependencies": { + "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 + }, + "json5": { + "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" + } + }, + "loader-utils": { + "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", + "json5": "^1.0.1" + } + } + } + }, + "webpack-dev-middleware": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.0.tgz", + "integrity": "sha512-qvDesR1QZRIAZHOE3iQ4CXLZZSQ1lAUsSpnQmlB1PBfoN/xdRjmge3Dok0W4IdaVLJOGJy3sGI4sZHwjRU0PCA==", + "dev": true, + "requires": { + "memory-fs": "^0.4.1", + "mime": "^2.4.2", + "range-parser": "^1.2.1", + "webpack-log": "^2.0.0" + }, + "dependencies": { + "mime": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", + "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==", + "dev": true + } + } + }, + "webpack-dev-server": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.7.2.tgz", + "integrity": "sha512-mjWtrKJW2T9SsjJ4/dxDC2fkFVUw8jlpemDERqV0ZJIkjjjamR2AbQlr3oz+j4JLhYCHImHnXZK5H06P2wvUew==", + "dev": true, + "requires": { + "ansi-html": "0.0.7", + "bonjour": "^3.5.0", + "chokidar": "^2.1.6", + "compression": "^1.7.4", + "connect-history-api-fallback": "^1.6.0", + "debug": "^4.1.1", + "del": "^4.1.1", + "express": "^4.17.1", + "html-entities": "^1.2.1", + "http-proxy-middleware": "^0.19.1", + "import-local": "^2.0.0", + "internal-ip": "^4.3.0", + "ip": "^1.1.5", + "killable": "^1.0.1", + "loglevel": "^1.6.3", + "opn": "^5.5.0", + "p-retry": "^3.0.1", + "portfinder": "^1.0.20", + "schema-utils": "^1.0.0", + "selfsigned": "^1.10.4", + "semver": "^6.1.1", + "serve-index": "^1.9.1", + "sockjs": "0.3.19", + "sockjs-client": "1.3.0", + "spdy": "^4.0.0", + "strip-ansi": "^3.0.1", + "supports-color": "^6.1.0", + "url": "^0.11.0", + "webpack-dev-middleware": "^3.7.0", + "webpack-log": "^2.0.0", + "yargs": "12.0.5" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "semver": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.1.1.tgz", + "integrity": "sha512-rWYq2e5iYW+fFe/oPPtYJxYgjBm8sC4rmoGdUOgBB7VnwKt6HrL793l2voH1UlsyYZpJ4g0wfjnTEO1s1NP2eQ==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "webpack-log": { + "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" + } + }, + "webpack-sources": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.3.0.tgz", + "integrity": "sha512-OiVgSrbGu7NEnEvQJJgdSFPl2qWKkWq5lHMhgiToIiN9w34EBnjYzSYs+VbL5KoYiLNtFFa7BZIKxRED3I32pA==", + "dev": true, + "requires": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + } + }, + "websocket-driver": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.3.tgz", + "integrity": "sha512-bpxWlvbbB459Mlipc5GBzzZwhoZgGEZLuqPaR0INBGnPAY1vdBX6hPnoFXiw+3yWxDuHyQjO2oXTMyS8A5haFg==", + "dev": true, + "requires": { + "http-parser-js": ">=0.4.0 <0.4.11", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + } + }, + "websocket-extensions": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz", + "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==", + "dev": true + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "worker-farm": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", + "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", + "dev": true, + "requires": { + "errno": "~0.1.7" + } + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "http://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "ws": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.0.0.tgz", + "integrity": "sha512-cknCal4k0EAOrh1SHHPPWWh4qm93g1IuGGGwBjWkXmCG7LsDtL8w9w+YVfaF+KSVwiHQKDIMsSLBVftKf9d1pg==", + "requires": { + "async-limiter": "^1.0.0" + } + }, + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", + "dev": true + }, + "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==", + "dev": true + }, + "yallist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", + "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==", + "dev": true + }, + "yargs": { + "version": "12.0.5", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", + "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", + "dev": true, + "requires": { + "cliui": "^4.0.0", + "decamelize": "^1.2.0", + "find-up": "^3.0.0", + "get-caller-file": "^1.0.1", + "os-locale": "^3.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1 || ^4.0.0", + "yargs-parser": "^11.1.1" + } + }, + "yargs-parser": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", + "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } +} diff --git a/backends/conrod_crayon/tools/wasm-template/package.json b/backends/conrod_crayon/tools/wasm-template/package.json new file mode 100644 index 000000000..f85d54ed4 --- /dev/null +++ b/backends/conrod_crayon/tools/wasm-template/package.json @@ -0,0 +1,17 @@ +{ + "scripts": { + "build": "webpack -p", + "serve": "webpack-dev-server -p" + }, + "devDependencies": { + "html-webpack-plugin": "^3.2.0", + "text-encoding": "^0.7.0", + "webpack": "^4.35.0", + "webpack-cli": "^3.3.4", + "webpack-dev-server": "^3.7.2" + }, + "dependencies": { + "@open-wc/webpack-import-meta-loader": "^0.2.4", + "ws": "^7.0.0" + } +} diff --git a/backends/conrod_crayon/tools/wasm-template/run.sh b/backends/conrod_crayon/tools/wasm-template/run.sh new file mode 100755 index 000000000..40908948e --- /dev/null +++ b/backends/conrod_crayon/tools/wasm-template/run.sh @@ -0,0 +1,11 @@ +SCRIPT_DIR=$(dirname "$0") +BASE_DIR=$SCRIPT_DIR/../../../../ + +set -e +cargo build --example $1 --target wasm32-unknown-unknown +rm -rf $SCRIPT_DIR/dist +mkdir $SCRIPT_DIR/dist +mkdir $SCRIPT_DIR/dist/intermediate +cp $BASE_DIR/target/wasm32-unknown-unknown/debug/examples/$1.wasm $SCRIPT_DIR/dist/intermediate/native.wasm +wasm-bindgen --target web $SCRIPT_DIR/dist/intermediate/native.wasm --out-dir $SCRIPT_DIR/dist --no-typescript +cd $SCRIPT_DIR \ No newline at end of file diff --git a/backends/conrod_crayon/tools/wasm-template/webpack.config.js b/backends/conrod_crayon/tools/wasm-template/webpack.config.js new file mode 100644 index 000000000..510849928 --- /dev/null +++ b/backends/conrod_crayon/tools/wasm-template/webpack.config.js @@ -0,0 +1,39 @@ +const path = require('path'); +const HtmlWebpackPlugin = require('html-webpack-plugin'); +const webpack = require('webpack'); + +module.exports = { + entry: './index.js', + output: { + path: path.resolve(__dirname, 'dist'), + filename: 'index.js', + }, + plugins: [ + new HtmlWebpackPlugin({ + template: "index.html" + }), + // Have this example work in Edge which doesn't ship `TextEncoder` or + // `TextDecoder` at this time. + new webpack.ProvidePlugin({ + TextDecoder: ['text-encoding', 'TextDecoder'], + TextEncoder: ['text-encoding', 'TextEncoder'] + }) + ], + devServer: { + contentBase: [__dirname, path.join(__dirname, '../../../../assets/crayon')], + port: 8080 + }, + node: { + fs: "empty" + }, + module: { + rules: [ + { + test: /\.js$/, + loader: require.resolve('@open-wc/webpack-import-meta-loader'), + }, + ], + }, + externals: [ 'utf-8-validate', 'bufferutil'], + mode: 'development' +}; \ No newline at end of file From 45d9a1fe963b2d666e8a973649cfbb4e8a99a80e Mon Sep 17 00:00:00 2001 From: alanpoon Date: Tue, 2 Jul 2019 09:59:16 +0800 Subject: [PATCH 57/64] fix conflict --- Cargo.toml | 6 ------ 1 file changed, 6 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index ddf5648ff..e3e94c751 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -8,11 +8,5 @@ members = [ "backends/conrod_glium", "backends/conrod_piston", "backends/conrod_vulkano", -<<<<<<< HEAD - "backends/conrod_ggez", "backends/conrod_crayon", - "backends/conrod_svg", -======= - "backends/conrod_crayon", ->>>>>>> 435fcdfd536dfbb8ef845b3f160caf44008001d8 ] From 4538ae195c9951ba1ca1c6e3865da7a52e3261b6 Mon Sep 17 00:00:00 2001 From: alanpoon Date: Tue, 2 Jul 2019 10:10:05 +0800 Subject: [PATCH 58/64] remove package-lock.json from git --- .../tools/wasm-template/package-lock.json | 6192 ----------------- 1 file changed, 6192 deletions(-) delete mode 100644 backends/conrod_crayon/tools/wasm-template/package-lock.json diff --git a/backends/conrod_crayon/tools/wasm-template/package-lock.json b/backends/conrod_crayon/tools/wasm-template/package-lock.json deleted file mode 100644 index e60e2f582..000000000 --- a/backends/conrod_crayon/tools/wasm-template/package-lock.json +++ /dev/null @@ -1,6192 +0,0 @@ -{ - "requires": true, - "lockfileVersion": 1, - "dependencies": { - "@open-wc/webpack-import-meta-loader": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/@open-wc/webpack-import-meta-loader/-/webpack-import-meta-loader-0.2.4.tgz", - "integrity": "sha512-QgESyG7BXaGLCLq0+iUOSS8nzZSfpz5wI/whXqpk+BpCj6+jnAqkyIxJ2CfybT1xK0Y1pemRw4t84syZ2JhFkg==" - }, - "@types/events": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz", - "integrity": "sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g==", - "dev": true - }, - "@types/glob": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.1.tgz", - "integrity": "sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w==", - "dev": true, - "requires": { - "@types/events": "*", - "@types/minimatch": "*", - "@types/node": "*" - } - }, - "@types/minimatch": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", - "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", - "dev": true - }, - "@types/node": { - "version": "12.0.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.0.10.tgz", - "integrity": "sha512-LcsGbPomWsad6wmMNv7nBLw7YYYyfdYcz6xryKYQhx89c3XXan+8Q6AJ43G5XDIaklaVkK3mE4fCb0SBvMiPSQ==", - "dev": true - }, - "@webassemblyjs/ast": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.8.5.tgz", - "integrity": "sha512-aJMfngIZ65+t71C3y2nBBg5FFG0Okt9m0XEgWZ7Ywgn1oMAT8cNwx00Uv1cQyHtidq0Xn94R4TAywO+LCQ+ZAQ==", - "dev": true, - "requires": { - "@webassemblyjs/helper-module-context": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/wast-parser": "1.8.5" - } - }, - "@webassemblyjs/floating-point-hex-parser": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.8.5.tgz", - "integrity": "sha512-9p+79WHru1oqBh9ewP9zW95E3XAo+90oth7S5Re3eQnECGq59ly1Ri5tsIipKGpiStHsUYmY3zMLqtk3gTcOtQ==", - "dev": true - }, - "@webassemblyjs/helper-api-error": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.8.5.tgz", - "integrity": "sha512-Za/tnzsvnqdaSPOUXHyKJ2XI7PDX64kWtURyGiJJZKVEdFOsdKUCPTNEVFZq3zJ2R0G5wc2PZ5gvdTRFgm81zA==", - "dev": true - }, - "@webassemblyjs/helper-buffer": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.8.5.tgz", - "integrity": "sha512-Ri2R8nOS0U6G49Q86goFIPNgjyl6+oE1abW1pS84BuhP1Qcr5JqMwRFT3Ah3ADDDYGEgGs1iyb1DGX+kAi/c/Q==", - "dev": true - }, - "@webassemblyjs/helper-code-frame": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.8.5.tgz", - "integrity": "sha512-VQAadSubZIhNpH46IR3yWO4kZZjMxN1opDrzePLdVKAZ+DFjkGD/rf4v1jap744uPVU6yjL/smZbRIIJTOUnKQ==", - "dev": true, - "requires": { - "@webassemblyjs/wast-printer": "1.8.5" - } - }, - "@webassemblyjs/helper-fsm": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.8.5.tgz", - "integrity": "sha512-kRuX/saORcg8se/ft6Q2UbRpZwP4y7YrWsLXPbbmtepKr22i8Z4O3V5QE9DbZK908dh5Xya4Un57SDIKwB9eow==", - "dev": true - }, - "@webassemblyjs/helper-module-context": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.8.5.tgz", - "integrity": "sha512-/O1B236mN7UNEU4t9X7Pj38i4VoU8CcMHyy3l2cV/kIF4U5KoHXDVqcDuOs1ltkac90IM4vZdHc52t1x8Yfs3g==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.8.5", - "mamacro": "^0.0.3" - } - }, - "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.8.5.tgz", - "integrity": "sha512-Cu4YMYG3Ddl72CbmpjU/wbP6SACcOPVbHN1dI4VJNJVgFwaKf1ppeFJrwydOG3NDHxVGuCfPlLZNyEdIYlQ6QQ==", - "dev": true - }, - "@webassemblyjs/helper-wasm-section": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.8.5.tgz", - "integrity": "sha512-VV083zwR+VTrIWWtgIUpqfvVdK4ff38loRmrdDBgBT8ADXYsEZ5mPQ4Nde90N3UYatHdYoDIFb7oHzMncI02tA==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-buffer": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/wasm-gen": "1.8.5" - } - }, - "@webassemblyjs/ieee754": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.8.5.tgz", - "integrity": "sha512-aaCvQYrvKbY/n6wKHb/ylAJr27GglahUO89CcGXMItrOBqRarUMxWLJgxm9PJNuKULwN5n1csT9bYoMeZOGF3g==", - "dev": true, - "requires": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "@webassemblyjs/leb128": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.8.5.tgz", - "integrity": "sha512-plYUuUwleLIziknvlP8VpTgO4kqNaH57Y3JnNa6DLpu/sGcP6hbVdfdX5aHAV716pQBKrfuU26BJK29qY37J7A==", - "dev": true, - "requires": { - "@xtuc/long": "4.2.2" - } - }, - "@webassemblyjs/utf8": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.8.5.tgz", - "integrity": "sha512-U7zgftmQriw37tfD934UNInokz6yTmn29inT2cAetAsaU9YeVCveWEwhKL1Mg4yS7q//NGdzy79nlXh3bT8Kjw==", - "dev": true - }, - "@webassemblyjs/wasm-edit": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.8.5.tgz", - "integrity": "sha512-A41EMy8MWw5yvqj7MQzkDjU29K7UJq1VrX2vWLzfpRHt3ISftOXqrtojn7nlPsZ9Ijhp5NwuODuycSvfAO/26Q==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-buffer": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/helper-wasm-section": "1.8.5", - "@webassemblyjs/wasm-gen": "1.8.5", - "@webassemblyjs/wasm-opt": "1.8.5", - "@webassemblyjs/wasm-parser": "1.8.5", - "@webassemblyjs/wast-printer": "1.8.5" - } - }, - "@webassemblyjs/wasm-gen": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.8.5.tgz", - "integrity": "sha512-BCZBT0LURC0CXDzj5FXSc2FPTsxwp3nWcqXQdOZE4U7h7i8FqtFK5Egia6f9raQLpEKT1VL7zr4r3+QX6zArWg==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/ieee754": "1.8.5", - "@webassemblyjs/leb128": "1.8.5", - "@webassemblyjs/utf8": "1.8.5" - } - }, - "@webassemblyjs/wasm-opt": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.8.5.tgz", - "integrity": "sha512-HKo2mO/Uh9A6ojzu7cjslGaHaUU14LdLbGEKqTR7PBKwT6LdPtLLh9fPY33rmr5wcOMrsWDbbdCHq4hQUdd37Q==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-buffer": "1.8.5", - "@webassemblyjs/wasm-gen": "1.8.5", - "@webassemblyjs/wasm-parser": "1.8.5" - } - }, - "@webassemblyjs/wasm-parser": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.8.5.tgz", - "integrity": "sha512-pi0SYE9T6tfcMkthwcgCpL0cM9nRYr6/6fjgDtL6q/ZqKHdMWvxitRi5JcZ7RI4SNJJYnYNaWy5UUrHQy998lw==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-api-error": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/ieee754": "1.8.5", - "@webassemblyjs/leb128": "1.8.5", - "@webassemblyjs/utf8": "1.8.5" - } - }, - "@webassemblyjs/wast-parser": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.8.5.tgz", - "integrity": "sha512-daXC1FyKWHF1i11obK086QRlsMsY4+tIOKgBqI1lxAnkp9xe9YMcgOxm9kLe+ttjs5aWV2KKE1TWJCN57/Btsg==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/floating-point-hex-parser": "1.8.5", - "@webassemblyjs/helper-api-error": "1.8.5", - "@webassemblyjs/helper-code-frame": "1.8.5", - "@webassemblyjs/helper-fsm": "1.8.5", - "@xtuc/long": "4.2.2" - } - }, - "@webassemblyjs/wast-printer": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.8.5.tgz", - "integrity": "sha512-w0U0pD4EhlnvRyeJzBqaVSJAo9w/ce7/WPogeXLzGkO6hzhr4GnQIZ4W4uUt5b9ooAaXPtnXlj0gzsXEOUNYMg==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/wast-parser": "1.8.5", - "@xtuc/long": "4.2.2" - } - }, - "@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true - }, - "@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "dev": true - }, - "accepts": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", - "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", - "dev": true, - "requires": { - "mime-types": "~2.1.24", - "negotiator": "0.6.2" - } - }, - "acorn": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.1.1.tgz", - "integrity": "sha512-jPTiwtOxaHNaAPg/dmrJ/beuzLRnXtB0kQPQ8JpotKJgTB6rX6c8mlf315941pyjBSaPg8NHXS9fhP4u17DpGA==", - "dev": true - }, - "acorn-dynamic-import": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-4.0.0.tgz", - "integrity": "sha512-d3OEjQV4ROpoflsnUA8HozoIR504TFxNivYEUi6uwz0IYhBkTDXGuWlNdMtybRt3nqVx/L6XqMt0FxkXuWKZhw==", - "dev": true - }, - "ajv": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz", - "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==", - "dev": true, - "requires": { - "fast-deep-equal": "^2.0.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "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 - }, - "ajv-keywords": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.0.tgz", - "integrity": "sha512-aUjdRFISbuFOl0EIZc+9e4FfZp0bDZgAdOOf30bJmw8VM9v84SHyVyxDfbWxpGYbdZD/9XoKxfHVNmxPkhwyGw==", - "dev": true - }, - "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 - }, - "ansi-html": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", - "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=", - "dev": true - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "dev": true, - "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - }, - "dependencies": { - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "requires": { - "remove-trailing-separator": "^1.0.1" - } - } - } - }, - "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "dev": true - }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true - }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "dev": true - }, - "arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", - "dev": true - }, - "array-flatten": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", - "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", - "dev": true - }, - "array-union": { - "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" - } - }, - "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 - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true - }, - "asn1.js": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", - "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", - "dev": true, - "requires": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "assert": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", - "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", - "dev": true, - "requires": { - "object-assign": "^4.1.1", - "util": "0.10.3" - }, - "dependencies": { - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - }, - "util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", - "dev": true, - "requires": { - "inherits": "2.0.1" - } - } - } - }, - "assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", - "dev": true - }, - "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", - "dev": true - }, - "async-each": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", - "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", - "dev": true - }, - "async-limiter": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz", - "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==" - }, - "atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "dev": true - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true - }, - "base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "dev": true, - "requires": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "base64-js": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", - "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==", - "dev": true - }, - "batch": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", - "dev": true - }, - "big.js": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", - "integrity": "sha1-pfwpi4G54Nyi5FiCR4S2XFK6WI4=", - "dev": true - }, - "binary-extensions": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", - "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", - "dev": true - }, - "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 - }, - "bn.js": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", - "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", - "dev": true - }, - "body-parser": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", - "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", - "dev": true, - "requires": { - "bytes": "3.1.0", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", - "on-finished": "~2.3.0", - "qs": "6.7.0", - "raw-body": "2.4.0", - "type-is": "~1.6.17" - }, - "dependencies": { - "bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", - "dev": true - } - } - }, - "bonjour": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", - "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", - "dev": true, - "requires": { - "array-flatten": "^2.1.0", - "deep-equal": "^1.0.1", - "dns-equal": "^1.0.0", - "dns-txt": "^2.0.2", - "multicast-dns": "^6.0.1", - "multicast-dns-service-types": "^1.1.0" - } - }, - "boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", - "dev": true - }, - "brace-expansion": { - "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" - } - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", - "dev": true - }, - "browserify-aes": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", - "dev": true, - "requires": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "browserify-cipher": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", - "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", - "dev": true, - "requires": { - "browserify-aes": "^1.0.4", - "browserify-des": "^1.0.0", - "evp_bytestokey": "^1.0.0" - } - }, - "browserify-des": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", - "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", - "dev": true, - "requires": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "browserify-rsa": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", - "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "randombytes": "^2.0.1" - } - }, - "browserify-sign": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", - "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", - "dev": true, - "requires": { - "bn.js": "^4.1.1", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.2", - "elliptic": "^6.0.0", - "inherits": "^2.0.1", - "parse-asn1": "^5.0.0" - } - }, - "browserify-zlib": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", - "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", - "dev": true, - "requires": { - "pako": "~1.0.5" - } - }, - "buffer": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", - "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", - "dev": true, - "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4", - "isarray": "^1.0.0" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - } - } - }, - "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 - }, - "buffer-indexof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", - "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", - "dev": true - }, - "buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", - "dev": true - }, - "builtin-status-codes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", - "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", - "dev": true - }, - "bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", - "dev": true - }, - "cacache": { - "version": "11.3.3", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-11.3.3.tgz", - "integrity": "sha512-p8WcneCytvzPxhDvYp31PD039vi77I12W+/KfR9S8AZbaiARFBCpsPJS+9uhWfeBfeAtW7o/4vt3MUqLkbY6nA==", - "dev": true, - "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" - } - }, - "cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "dev": true, - "requires": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" - } - }, - "camel-case": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", - "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=", - "dev": true, - "requires": { - "no-case": "^2.2.0", - "upper-case": "^1.1.1" - } - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "chokidar": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.6.tgz", - "integrity": "sha512-V2jUo67OKkc6ySiRpJrjlpJKl9kDuG+Xb8VgsGzb+aEouhgS1D0weyPU4lEzdAcsCAvrih2J2BqyXqHWvVLw5g==", - "dev": true, - "requires": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "fsevents": "^1.2.7", - "glob-parent": "^3.1.0", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.1" - } - }, - "chownr": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.1.tgz", - "integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==", - "dev": true - }, - "chrome-trace-event": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz", - "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - }, - "cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "clean-css": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.1.tgz", - "integrity": "sha1-LUEe92uFabbQyEBo2r6FsKpeXBc=", - "dev": true, - "requires": { - "source-map": "~0.6.0" - } - }, - "cliui": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", - "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", - "dev": true, - "requires": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0", - "wrap-ansi": "^2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true - }, - "collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "dev": true, - "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "commander": { - "version": "2.17.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", - "integrity": "sha1-vXerfebelCBc6sxy8XFtKfIKd78=", - "dev": true - }, - "commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", - "dev": true - }, - "component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", - "dev": true - }, - "compressible": { - "version": "2.0.17", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.17.tgz", - "integrity": "sha512-BGHeLCK1GV7j1bSmQQAi26X+GgWcTjLr/0tzSvMCl3LH1w1IJ4PFSPoV5316b30cneTziC+B1a+3OjoSUcQYmw==", - "dev": true, - "requires": { - "mime-db": ">= 1.40.0 < 2" - } - }, - "compression": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", - "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", - "dev": true, - "requires": { - "accepts": "~1.3.5", - "bytes": "3.0.0", - "compressible": "~2.0.16", - "debug": "2.6.9", - "on-headers": "~1.0.2", - "safe-buffer": "5.1.2", - "vary": "~1.1.2" - } - }, - "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 - }, - "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", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "readable-stream": { - "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", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "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" - } - } - } - }, - "connect-history-api-fallback": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", - "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", - "dev": true - }, - "console-browserify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", - "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", - "dev": true, - "requires": { - "date-now": "^0.1.4" - } - }, - "constants-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", - "dev": true - }, - "content-disposition": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", - "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", - "dev": true, - "requires": { - "safe-buffer": "5.1.2" - } - }, - "content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", - "dev": true - }, - "cookie": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", - "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", - "dev": true - }, - "cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", - "dev": true - }, - "copy-concurrently": { - "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", - "iferr": "^0.1.5", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.0" - } - }, - "copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", - "dev": true - }, - "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 - }, - "create-ecdh": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", - "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "elliptic": "^6.0.0" - } - }, - "create-hash": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", - "dev": true, - "requires": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" - } - }, - "create-hmac": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", - "dev": true, - "requires": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "crypto-browserify": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", - "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", - "dev": true, - "requires": { - "browserify-cipher": "^1.0.0", - "browserify-sign": "^4.0.0", - "create-ecdh": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.0", - "diffie-hellman": "^5.0.0", - "inherits": "^2.0.1", - "pbkdf2": "^3.0.3", - "public-encrypt": "^4.0.0", - "randombytes": "^2.0.0", - "randomfill": "^1.0.3" - } - }, - "css-select": { - "version": "1.2.0", - "resolved": "http://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", - "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", - "dev": true, - "requires": { - "boolbase": "~1.0.0", - "css-what": "2.1", - "domutils": "1.5.1", - "nth-check": "~1.0.1" - } - }, - "css-what": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.2.tgz", - "integrity": "sha1-wIdtnQSAkn19SSDc1yrzWVZJVU0=", - "dev": true - }, - "cyclist": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-0.2.2.tgz", - "integrity": "sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA=", - "dev": true - }, - "date-now": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", - "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", - "dev": true - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, - "decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", - "dev": true - }, - "deep-equal": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", - "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=", - "dev": true - }, - "default-gateway": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz", - "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==", - "dev": true, - "requires": { - "execa": "^1.0.0", - "ip-regex": "^2.1.0" - } - }, - "define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha1-z4jabL7ib+bbcJT2HYcMvYTO6fE=", - "dev": true, - "requires": { - "object-keys": "^1.0.12" - } - }, - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, - "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "dependencies": { - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "del": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", - "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", - "dev": true, - "requires": { - "@types/glob": "^7.1.1", - "globby": "^6.1.0", - "is-path-cwd": "^2.0.0", - "is-path-in-cwd": "^2.0.0", - "p-map": "^2.0.0", - "pify": "^4.0.1", - "rimraf": "^2.6.3" - } - }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", - "dev": true - }, - "des.js": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", - "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", - "dev": true - }, - "detect-file": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", - "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", - "dev": true - }, - "detect-node": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.4.tgz", - "integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==", - "dev": true - }, - "diffie-hellman": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", - "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.0" - } - }, - "dns-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", - "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=", - "dev": true - }, - "dns-packet": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz", - "integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==", - "dev": true, - "requires": { - "ip": "^1.1.0", - "safe-buffer": "^5.0.1" - } - }, - "dns-txt": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", - "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", - "dev": true, - "requires": { - "buffer-indexof": "^1.0.0" - } - }, - "dom-converter": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", - "integrity": "sha1-ZyGp2u4uKTaClVtq/kFncWJ7t2g=", - "dev": true, - "requires": { - "utila": "~0.4" - } - }, - "dom-serializer": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", - "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=", - "dev": true, - "requires": { - "domelementtype": "~1.1.1", - "entities": "~1.1.1" - }, - "dependencies": { - "domelementtype": { - "version": "1.1.3", - "resolved": "http://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz", - "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=", - "dev": true - } - } - }, - "domain-browser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", - "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", - "dev": true - }, - "domelementtype": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.2.1.tgz", - "integrity": "sha512-SQVCLFS2E7G5CRCMdn6K9bIhRj1bS6QBWZfF0TUPh4V/BbqrQ619IdSS3/izn0FZ+9l+uODzaZjb08fjOfablA==", - "dev": true - }, - "domhandler": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.1.0.tgz", - "integrity": "sha1-0mRvXlf2w7qxHPbLBdPArPdBJZQ=", - "dev": true, - "requires": { - "domelementtype": "1" - } - }, - "domutils": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", - "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", - "dev": true, - "requires": { - "dom-serializer": "0", - "domelementtype": "1" - } - }, - "duplexify": { - "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", - "readable-stream": "^2.0.0", - "stream-shift": "^1.0.0" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "readable-stream": { - "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", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "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" - } - } - } - }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", - "dev": true - }, - "elliptic": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.1.tgz", - "integrity": "sha512-BsXLz5sqX8OHcsh7CqBMztyXARmGQ3LWPtGjJi6DiJHq5C/qvi9P3OqgswKSDftbu8+IoI/QDTAm2fFnQ9SZSQ==", - "dev": true, - "requires": { - "bn.js": "^4.4.0", - "brorand": "^1.0.1", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.0" - } - }, - "emojis-list": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", - "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", - "dev": true - }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", - "dev": true - }, - "end-of-stream": { - "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" - } - }, - "enhanced-resolve": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz", - "integrity": "sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "memory-fs": "^0.4.0", - "tapable": "^1.0.0" - } - }, - "entities": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", - "integrity": "sha1-vfpzUplmTfr9NFKe1PhSKidf6lY=", - "dev": true - }, - "errno": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", - "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", - "dev": true, - "requires": { - "prr": "~1.0.1" - } - }, - "es-abstract": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.12.0.tgz", - "integrity": "sha512-C8Fx/0jFmV5IPoMOFPA9P9G5NtqW+4cOPit3MIuvR2t7Ag2K15EJTpxnHAYTzL+aYQJIESYeXZmDBfOBE1HcpA==", - "dev": true, - "requires": { - "es-to-primitive": "^1.1.1", - "function-bind": "^1.1.1", - "has": "^1.0.1", - "is-callable": "^1.1.3", - "is-regex": "^1.0.4" - } - }, - "es-to-primitive": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz", - "integrity": "sha1-7fckeAM0VujdqO8J4ArZZQcH83c=", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - }, - "eslint-scope": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", - "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", - "dev": true, - "requires": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - } - }, - "esrecurse": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", - "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", - "dev": true, - "requires": { - "estraverse": "^4.1.0" - } - }, - "estraverse": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", - "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", - "dev": true - }, - "etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", - "dev": true - }, - "eventemitter3": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.2.tgz", - "integrity": "sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==", - "dev": true - }, - "events": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.0.0.tgz", - "integrity": "sha512-Dc381HFWJzEOhQ+d8pkNon++bk9h6cdAoAj4iE6Q4y6xgTzySWXlKn05/TVNpjnfRqi/X0EpJEJohPjNI3zpVA==", - "dev": true - }, - "eventsource": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.0.7.tgz", - "integrity": "sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ==", - "dev": true, - "requires": { - "original": "^1.0.0" - } - }, - "evp_bytestokey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", - "dev": true, - "requires": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" - } - }, - "execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "dev": true, - "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - } - }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dev": true, - "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "expand-tilde": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", - "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", - "dev": true, - "requires": { - "homedir-polyfill": "^1.0.1" - } - }, - "express": { - "version": "4.17.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", - "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", - "dev": true, - "requires": { - "accepts": "~1.3.7", - "array-flatten": "1.1.1", - "body-parser": "1.19.0", - "content-disposition": "0.5.3", - "content-type": "~1.0.4", - "cookie": "0.4.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "~1.1.2", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "~1.1.2", - "fresh": "0.5.2", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.5", - "qs": "6.7.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.1.2", - "send": "0.17.1", - "serve-static": "1.14.1", - "setprototypeof": "1.1.1", - "statuses": "~1.5.0", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "dependencies": { - "array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", - "dev": true - } - } - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "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 - }, - "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 - }, - "faye-websocket": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", - "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", - "dev": true, - "requires": { - "websocket-driver": ">=0.5.1" - } - }, - "figgy-pudding": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.1.tgz", - "integrity": "sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w==", - "dev": true - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", - "dev": true, - "requires": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "statuses": "~1.5.0", - "unpipe": "~1.0.0" - } - }, - "find-cache-dir": { - "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", - "pkg-dir": "^3.0.0" - } - }, - "find-up": { - "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" - } - }, - "findup-sync": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz", - "integrity": "sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=", - "dev": true, - "requires": { - "detect-file": "^1.0.0", - "is-glob": "^3.1.0", - "micromatch": "^3.0.4", - "resolve-dir": "^1.0.1" - }, - "dependencies": { - "is-glob": { - "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" - } - } - } - }, - "flush-write-stream": { - "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" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "readable-stream": { - "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", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "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" - } - } - } - }, - "follow-redirects": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.7.0.tgz", - "integrity": "sha512-m/pZQy4Gj287eNy94nivy5wchN3Kp+Q5WgUPNy5lJSZ3sgkVKSYV/ZChMAQVIgx1SqfZ2zBZtPA2YlXIWxxJOQ==", - "dev": true, - "requires": { - "debug": "^3.2.6" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true - }, - "forwarded": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", - "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", - "dev": true - }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "dev": true, - "requires": { - "map-cache": "^0.2.2" - } - }, - "fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", - "dev": true - }, - "from2": { - "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" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "readable-stream": { - "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", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "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" - } - } - } - }, - "fs-write-stream-atomic": { - "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", - "imurmurhash": "^0.1.4", - "readable-stream": "1 || 2" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "fsevents": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.9.tgz", - "integrity": "sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw==", - "dev": true, - "optional": true, - "requires": { - "nan": "^2.12.1", - "node-pre-gyp": "^0.12.0" - }, - "dependencies": { - "abbrev": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "ansi-regex": { - "version": "2.1.1", - "bundled": true, - "dev": true - }, - "aproba": { - "version": "1.2.0", - "bundled": true, - "dev": true, - "optional": true - }, - "are-we-there-yet": { - "version": "1.1.5", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, - "balanced-match": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "brace-expansion": { - "version": "1.1.11", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "chownr": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "code-point-at": { - "version": "1.1.0", - "bundled": true, - "dev": true, - "optional": true - }, - "concat-map": { - "version": "0.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "console-control-strings": { - "version": "1.1.0", - "bundled": true, - "dev": true, - "optional": true - }, - "core-util-is": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "debug": { - "version": "4.1.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "ms": "^2.1.1" - } - }, - "deep-extend": { - "version": "0.6.0", - "bundled": true, - "dev": true, - "optional": true - }, - "delegates": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "detect-libc": { - "version": "1.0.3", - "bundled": true, - "dev": true, - "optional": true - }, - "fs-minipass": { - "version": "1.2.5", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minipass": "^2.2.1" - } - }, - "fs.realpath": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "gauge": { - "version": "2.7.4", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - } - }, - "glob": { - "version": "7.1.3", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "has-unicode": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "iconv-lite": { - "version": "0.4.24", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ignore-walk": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minimatch": "^3.0.4" - } - }, - "inflight": { - "version": "1.0.6", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.3", - "bundled": true, - "dev": true, - "optional": true - }, - "ini": { - "version": "1.3.5", - "bundled": true, - "dev": true, - "optional": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "isarray": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "minimatch": { - "version": "3.0.4", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "0.0.8", - "bundled": true, - "dev": true, - "optional": true - }, - "minipass": { - "version": "2.3.5", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - } - }, - "minizlib": { - "version": "1.2.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minipass": "^2.2.1" - } - }, - "mkdirp": { - "version": "0.5.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minimist": "0.0.8" - } - }, - "ms": { - "version": "2.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "needle": { - "version": "2.3.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "debug": "^4.1.0", - "iconv-lite": "^0.4.4", - "sax": "^1.2.4" - } - }, - "node-pre-gyp": { - "version": "0.12.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "detect-libc": "^1.0.2", - "mkdirp": "^0.5.1", - "needle": "^2.2.1", - "nopt": "^4.0.1", - "npm-packlist": "^1.1.6", - "npmlog": "^4.0.2", - "rc": "^1.2.7", - "rimraf": "^2.6.1", - "semver": "^5.3.0", - "tar": "^4" - } - }, - "nopt": { - "version": "4.0.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "abbrev": "1", - "osenv": "^0.1.4" - } - }, - "npm-bundled": { - "version": "1.0.6", - "bundled": true, - "dev": true, - "optional": true - }, - "npm-packlist": { - "version": "1.4.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1" - } - }, - "npmlog": { - "version": "4.1.2", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "object-assign": { - "version": "4.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "once": { - "version": "1.4.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "wrappy": "1" - } - }, - "os-homedir": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "os-tmpdir": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "osenv": { - "version": "0.1.5", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "process-nextick-args": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "rc": { - "version": "1.2.8", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "bundled": true, - "dev": true, - "optional": true - } - } - }, - "readable-stream": { - "version": "2.3.6", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "rimraf": { - "version": "2.6.3", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "glob": "^7.1.3" - } - }, - "safe-buffer": { - "version": "5.1.2", - "bundled": true, - "dev": true - }, - "safer-buffer": { - "version": "2.1.2", - "bundled": true, - "dev": true, - "optional": true - }, - "sax": { - "version": "1.2.4", - "bundled": true, - "dev": true, - "optional": true - }, - "semver": { - "version": "5.7.0", - "bundled": true, - "dev": true, - "optional": true - }, - "set-blocking": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "signal-exit": { - "version": "3.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "string-width": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "string_decoder": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "tar": { - "version": "4.4.8", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "chownr": "^1.1.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.3.4", - "minizlib": "^1.1.1", - "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.2", - "yallist": "^3.0.2" - } - }, - "util-deprecate": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "wide-align": { - "version": "1.1.3", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "string-width": "^1.0.2 || 2" - } - }, - "wrappy": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "yallist": { - "version": "3.0.3", - "bundled": true, - "dev": true - } - } - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha1-pWiZ0+o8m6uHS7l3O3xe3pL0iV0=", - "dev": true - }, - "get-caller-file": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", - "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", - "dev": true - }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", - "dev": true - }, - "glob": { - "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", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "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" - }, - "dependencies": { - "is-glob": { - "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" - } - } - } - }, - "global-modules": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", - "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", - "dev": true, - "requires": { - "global-prefix": "^1.0.1", - "is-windows": "^1.0.1", - "resolve-dir": "^1.0.0" - } - }, - "global-prefix": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", - "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", - "dev": true, - "requires": { - "expand-tilde": "^2.0.2", - "homedir-polyfill": "^1.0.1", - "ini": "^1.3.4", - "is-windows": "^1.0.1", - "which": "^1.2.14" - } - }, - "globby": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", - "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", - "dev": true, - "requires": { - "array-union": "^1.0.1", - "glob": "^7.0.3", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - } - } - }, - "graceful-fs": { - "version": "4.1.15", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", - "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", - "dev": true - }, - "handle-thing": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.0.tgz", - "integrity": "sha512-d4sze1JNC454Wdo2fkuyzCr6aHcbL6PGGuFAz0Li/NcOm1tCHGnWDRmJP85dh9IhQErTc2svWFEX5xHIOo//kQ==", - "dev": true - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha1-ci18v8H2qoJB8W3YFOAR4fQeh5Y=", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "has-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", - "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", - "dev": true - }, - "has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "dev": true, - "requires": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - } - }, - "has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "dependencies": { - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "hash-base": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", - "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, - "he": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", - "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", - "dev": true - }, - "hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", - "dev": true, - "requires": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "homedir-polyfill": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", - "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", - "dev": true, - "requires": { - "parse-passwd": "^1.0.0" - } - }, - "hpack.js": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", - "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "obuf": "^1.0.0", - "readable-stream": "^2.0.1", - "wbuf": "^1.1.0" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "readable-stream": { - "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", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "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" - } - } - } - }, - "html-entities": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.2.1.tgz", - "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=", - "dev": true - }, - "html-minifier": { - "version": "3.5.20", - "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.20.tgz", - "integrity": "sha512-ZmgNLaTp54+HFKkONyLFEfs5dd/ZOtlquKaTnqIWFmx3Av5zG6ZPcV2d0o9XM2fXOTxxIf6eDcwzFFotke/5zA==", - "dev": true, - "requires": { - "camel-case": "3.0.x", - "clean-css": "4.2.x", - "commander": "2.17.x", - "he": "1.1.x", - "param-case": "2.1.x", - "relateurl": "0.2.x", - "uglify-js": "3.4.x" - } - }, - "html-webpack-plugin": { - "version": "3.2.0", - "resolved": "http://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-3.2.0.tgz", - "integrity": "sha1-sBq71yOsqqeze2r0SS69oD2d03s=", - "dev": true, - "requires": { - "html-minifier": "^3.2.3", - "loader-utils": "^0.2.16", - "lodash": "^4.17.3", - "pretty-error": "^2.0.2", - "tapable": "^1.0.0", - "toposort": "^1.0.0", - "util.promisify": "1.0.0" - } - }, - "htmlparser2": { - "version": "3.3.0", - "resolved": "http://registry.npmjs.org/htmlparser2/-/htmlparser2-3.3.0.tgz", - "integrity": "sha1-zHDQWln2VC5D8OaFyYLhTJJKnv4=", - "dev": true, - "requires": { - "domelementtype": "1", - "domhandler": "2.1", - "domutils": "1.1", - "readable-stream": "1.0" - }, - "dependencies": { - "domutils": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.1.6.tgz", - "integrity": "sha1-vdw94Jm5ou+sxRxiPyj0FuzFdIU=", - "dev": true, - "requires": { - "domelementtype": "1" - } - } - } - }, - "http-deceiver": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", - "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=", - "dev": true - }, - "http-errors": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", - "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", - "dev": true, - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" - } - }, - "http-parser-js": { - "version": "0.4.10", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.10.tgz", - "integrity": "sha1-ksnBN0w1CF912zWexWzCV8u5P6Q=", - "dev": true - }, - "http-proxy": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.17.0.tgz", - "integrity": "sha512-Taqn+3nNvYRfJ3bGvKfBSRwy1v6eePlm3oc/aWVxZp57DQr5Eq3xhKJi7Z4hZpS8PC3H4qI+Yly5EmFacGuA/g==", - "dev": true, - "requires": { - "eventemitter3": "^3.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" - } - }, - "http-proxy-middleware": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz", - "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==", - "dev": true, - "requires": { - "http-proxy": "^1.17.0", - "is-glob": "^4.0.0", - "lodash": "^4.17.11", - "micromatch": "^3.1.10" - } - }, - "https-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", - "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", - "dev": true - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ieee754": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", - "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", - "dev": true - }, - "iferr": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", - "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", - "dev": true - }, - "import-local": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", - "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", - "dev": true, - "requires": { - "pkg-dir": "^3.0.0", - "resolve-cwd": "^2.0.0" - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "inflight": { - "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" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - }, - "ini": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", - "dev": true - }, - "internal-ip": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz", - "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==", - "dev": true, - "requires": { - "default-gateway": "^4.2.0", - "ipaddr.js": "^1.9.0" - } - }, - "interpret": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz", - "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==", - "dev": true - }, - "invert-kv": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", - "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", - "dev": true - }, - "ip": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", - "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", - "dev": true - }, - "ip-regex": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", - "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", - "dev": true - }, - "ipaddr.js": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.0.tgz", - "integrity": "sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA==", - "dev": true - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", - "dev": true, - "requires": { - "binary-extensions": "^1.0.0" - } - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "is-callable": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", - "integrity": "sha1-HhrfIZ4e62hNaR+dagX/DTCiTXU=", - "dev": true - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-date-object": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", - "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", - "dev": true - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - }, - "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 - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "is-glob": { - "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" - } - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-path-cwd": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.1.0.tgz", - "integrity": "sha512-Sc5j3/YnM8tDeyCsVeKlm/0p95075DyLmDEIkSgQ7mXkrOX+uTCtmQFm0CYzVyJwcCCmO3k8qfJt17SxQwB5Zw==", - "dev": true - }, - "is-path-in-cwd": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", - "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", - "dev": true, - "requires": { - "is-path-inside": "^2.1.0" - } - }, - "is-path-inside": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", - "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", - "dev": true, - "requires": { - "path-is-inside": "^1.0.2" - } - }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, - "is-regex": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", - "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", - "dev": true, - "requires": { - "has": "^1.0.1" - } - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true - }, - "is-symbol": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", - "integrity": "sha1-oFX2rlcZLK7jKeeoYBGLSXqVDzg=", - "dev": true, - "requires": { - "has-symbols": "^1.0.0" - } - }, - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true - }, - "is-wsl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", - "dev": true - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - }, - "json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true - }, - "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 - }, - "json3": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz", - "integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==", - "dev": true - }, - "json5": { - "version": "0.5.1", - "resolved": "http://registry.npmjs.org/json5/-/json5-0.5.1.tgz", - "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", - "dev": true - }, - "killable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", - "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==", - "dev": true - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true - }, - "lcid": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", - "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", - "dev": true, - "requires": { - "invert-kv": "^2.0.0" - } - }, - "loader-runner": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", - "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", - "dev": true - }, - "loader-utils": { - "version": "0.2.17", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", - "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", - "dev": true, - "requires": { - "big.js": "^3.1.3", - "emojis-list": "^2.0.0", - "json5": "^0.5.0", - "object-assign": "^4.0.1" - } - }, - "locate-path": { - "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" - } - }, - "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha1-s56mIp72B+zYniyN8SU2iRysm40=", - "dev": true - }, - "loglevel": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.3.tgz", - "integrity": "sha512-LoEDv5pgpvWgPF4kNYuIp0qqSJVWak/dML0RY74xlzMZiT9w77teNAwKYKWBTYjlokMirg+o3jBwp+vlLrcfAA==", - "dev": true - }, - "lower-case": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", - "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=", - "dev": true - }, - "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==", - "dev": true, - "requires": { - "yallist": "^3.0.2" - } - }, - "make-dir": { - "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" - } - }, - "mamacro": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/mamacro/-/mamacro-0.0.3.tgz", - "integrity": "sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA==", - "dev": true - }, - "map-age-cleaner": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", - "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", - "dev": true, - "requires": { - "p-defer": "^1.0.0" - } - }, - "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", - "dev": true - }, - "map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", - "dev": true, - "requires": { - "object-visit": "^1.0.0" - } - }, - "md5.js": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", - "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", - "dev": true, - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", - "dev": true - }, - "mem": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", - "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", - "dev": true, - "requires": { - "map-age-cleaner": "^0.1.1", - "mimic-fn": "^2.0.0", - "p-is-promise": "^2.0.0" - } - }, - "memory-fs": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", - "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", - "dev": true, - "requires": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "http://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", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "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" - } - } - } - }, - "merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", - "dev": true - }, - "methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", - "dev": true - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - }, - "miller-rabin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", - "dev": true, - "requires": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" - } - }, - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true - }, - "mime-db": { - "version": "1.40.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", - "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==", - "dev": true - }, - "mime-types": { - "version": "2.1.24", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", - "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", - "dev": true, - "requires": { - "mime-db": "1.40.0" - } - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true - }, - "minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "dev": true - }, - "minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", - "dev": true - }, - "minimatch": { - "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" - } - }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - }, - "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", - "end-of-stream": "^1.1.0", - "flush-write-stream": "^1.0.0", - "from2": "^2.1.0", - "parallel-transform": "^1.1.0", - "pump": "^3.0.0", - "pumpify": "^1.3.3", - "stream-each": "^1.1.0", - "through2": "^2.0.0" - } - }, - "mixin-deep": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", - "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", - "dev": true, - "requires": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, - "requires": { - "minimist": "0.0.8" - }, - "dependencies": { - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true - } - } - }, - "move-concurrently": { - "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", - "fs-write-stream-atomic": "^1.0.8", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.3" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "multicast-dns": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", - "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", - "dev": true, - "requires": { - "dns-packet": "^1.3.1", - "thunky": "^1.0.2" - } - }, - "multicast-dns-service-types": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", - "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", - "dev": true - }, - "nan": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", - "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", - "dev": true, - "optional": true - }, - "nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - } - }, - "negotiator": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", - "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", - "dev": true - }, - "neo-async": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", - "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", - "dev": true - }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true - }, - "no-case": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", - "integrity": "sha1-YLgTOWvjmz8SiKTB7V0efSi0ZKw=", - "dev": true, - "requires": { - "lower-case": "^1.1.1" - } - }, - "node-forge": { - "version": "0.7.5", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.7.5.tgz", - "integrity": "sha512-MmbQJ2MTESTjt3Gi/3yG1wGpIMhUfcIypUCGtTizFR9IiccFwxSpfp0vtIZlkFclEqERemxfnSdZEMR9VqqEFQ==", - "dev": true - }, - "node-libs-browser": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", - "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", - "dev": true, - "requires": { - "assert": "^1.1.1", - "browserify-zlib": "^0.2.0", - "buffer": "^4.3.0", - "console-browserify": "^1.1.0", - "constants-browserify": "^1.0.0", - "crypto-browserify": "^3.11.0", - "domain-browser": "^1.1.1", - "events": "^3.0.0", - "https-browserify": "^1.0.0", - "os-browserify": "^0.3.0", - "path-browserify": "0.0.1", - "process": "^0.11.10", - "punycode": "^1.2.4", - "querystring-es3": "^0.2.0", - "readable-stream": "^2.3.3", - "stream-browserify": "^2.0.1", - "stream-http": "^2.7.2", - "string_decoder": "^1.0.0", - "timers-browserify": "^2.0.4", - "tty-browserify": "0.0.0", - "url": "^0.11.0", - "util": "^0.11.0", - "vm-browserify": "^1.0.1" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true - }, - "readable-stream": { - "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", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - }, - "dependencies": { - "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" - } - } - } - }, - "string_decoder": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.2.0.tgz", - "integrity": "sha512-6YqyX6ZWEYguAxgZzHGL7SsCeGx3V2TtOTqZz1xSTSWnqsbWwbptafNyvf/ACquZUXV3DANr5BDIwNYe1mN42w==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "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 - }, - "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "dev": true, - "requires": { - "path-key": "^2.0.0" - } - }, - "nth-check": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", - "integrity": "sha1-sr0pXDfj3VijvwcAN2Zjuk2c8Fw=", - "dev": true, - "requires": { - "boolbase": "~1.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true - }, - "object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", - "dev": true, - "requires": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "object-keys": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.12.tgz", - "integrity": "sha1-CcU4VTd1dTEMymL1W7M0q/97PtI=", - "dev": true - }, - "object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", - "dev": true, - "requires": { - "isobject": "^3.0.0" - } - }, - "object.getownpropertydescriptors": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz", - "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=", - "dev": true, - "requires": { - "define-properties": "^1.1.2", - "es-abstract": "^1.5.1" - } - }, - "object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, - "obuf": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", - "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", - "dev": true - }, - "on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "dev": true, - "requires": { - "ee-first": "1.1.1" - } - }, - "on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", - "dev": true - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "opn": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", - "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==", - "dev": true, - "requires": { - "is-wsl": "^1.1.0" - } - }, - "original": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz", - "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==", - "dev": true, - "requires": { - "url-parse": "^1.4.3" - } - }, - "os-browserify": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", - "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", - "dev": true - }, - "os-locale": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", - "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", - "dev": true, - "requires": { - "execa": "^1.0.0", - "lcid": "^2.0.0", - "mem": "^4.0.0" - } - }, - "p-defer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", - "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", - "dev": true - }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "dev": true - }, - "p-is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", - "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==", - "dev": true - }, - "p-limit": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", - "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "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" - } - }, - "p-map": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", - "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", - "dev": true - }, - "p-retry": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-3.0.1.tgz", - "integrity": "sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==", - "dev": true, - "requires": { - "retry": "^0.12.0" - } - }, - "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 - }, - "pako": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.10.tgz", - "integrity": "sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw==", - "dev": true - }, - "parallel-transform": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.1.0.tgz", - "integrity": "sha1-1BDwZbBdojCB/NEPKIVMKb2jOwY=", - "dev": true, - "requires": { - "cyclist": "~0.2.2", - "inherits": "^2.0.3", - "readable-stream": "^2.1.5" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "readable-stream": { - "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", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "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" - } - } - } - }, - "param-case": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", - "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=", - "dev": true, - "requires": { - "no-case": "^2.2.0" - } - }, - "parse-asn1": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.4.tgz", - "integrity": "sha512-Qs5duJcuvNExRfFZ99HDD3z4mAi3r9Wl/FOjEOijlxwCZs7E7mW2vjTpgQ4J8LpTF8x5v+1Vn5UQFejmWT11aw==", - "dev": true, - "requires": { - "asn1.js": "^4.0.0", - "browserify-aes": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3", - "safe-buffer": "^5.1.1" - } - }, - "parse-passwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", - "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", - "dev": true - }, - "parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "dev": true - }, - "pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", - "dev": true - }, - "path-browserify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", - "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", - "dev": true - }, - "path-dirname": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", - "dev": true - }, - "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 - }, - "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 - }, - "path-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", - "dev": true - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true - }, - "path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", - "dev": true - }, - "pbkdf2": { - "version": "3.0.17", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", - "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", - "dev": true, - "requires": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true - }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "requires": { - "pinkie": "^2.0.0" - } - }, - "pkg-dir": { - "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" - } - }, - "portfinder": { - "version": "1.0.20", - "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.20.tgz", - "integrity": "sha512-Yxe4mTyDzTd59PZJY4ojZR8F+E5e97iq2ZOHPz3HDgSvYC5siNad2tLooQ5y5QHyQhc3xVqvyk/eNA3wuoa7Sw==", - "dev": true, - "requires": { - "async": "^1.5.2", - "debug": "^2.2.0", - "mkdirp": "0.5.x" - } - }, - "posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", - "dev": true - }, - "prettier": { - "version": "1.18.2", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.18.2.tgz", - "integrity": "sha512-OeHeMc0JhFE9idD4ZdtNibzY0+TPHSpSSb9h8FqtP+YnoZZ1sl8Vc9b1sasjfymH3SonAF4QcA2+mzHPhMvIiw==", - "dev": true - }, - "pretty-error": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.1.tgz", - "integrity": "sha1-X0+HyPkeWuPzuoerTPXgOxoX8aM=", - "dev": true, - "requires": { - "renderkid": "^2.0.1", - "utila": "~0.4" - } - }, - "process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", - "dev": true - }, - "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 - }, - "promise-inflight": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", - "dev": true - }, - "proxy-addr": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.5.tgz", - "integrity": "sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ==", - "dev": true, - "requires": { - "forwarded": "~0.1.2", - "ipaddr.js": "1.9.0" - } - }, - "prr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", - "dev": true - }, - "public-encrypt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", - "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "parse-asn1": "^5.0.0", - "randombytes": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "pump": { - "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" - } - }, - "pumpify": { - "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", - "pump": "^2.0.0" - }, - "dependencies": { - "pump": { - "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" - } - } - } - }, - "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 - }, - "qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", - "dev": true - }, - "querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", - "dev": true - }, - "querystring-es3": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", - "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", - "dev": true - }, - "querystringify": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.1.1.tgz", - "integrity": "sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA==", - "dev": true - }, - "randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "requires": { - "safe-buffer": "^5.1.0" - } - }, - "randomfill": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", - "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", - "dev": true, - "requires": { - "randombytes": "^2.0.5", - "safe-buffer": "^5.1.0" - } - }, - "range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "dev": true - }, - "raw-body": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", - "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", - "dev": true, - "requires": { - "bytes": "3.1.0", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "dependencies": { - "bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", - "dev": true - } - } - }, - "readable-stream": { - "version": "1.0.34", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "readdirp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "http://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", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "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" - } - } - } - }, - "regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - } - }, - "relateurl": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", - "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=", - "dev": true - }, - "remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", - "dev": true - }, - "renderkid": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.2.tgz", - "integrity": "sha1-EtMQ8lU2DAetj94lP2yeneNy0qo=", - "dev": true, - "requires": { - "css-select": "^1.1.0", - "dom-converter": "~0.2", - "htmlparser2": "~3.3.0", - "strip-ansi": "^3.0.0", - "utila": "^0.4.0" - } - }, - "repeat-element": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", - "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", - "dev": true - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true - }, - "require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", - "dev": true - }, - "requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", - "dev": true - }, - "resolve-cwd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", - "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", - "dev": true, - "requires": { - "resolve-from": "^3.0.0" - } - }, - "resolve-dir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", - "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", - "dev": true, - "requires": { - "expand-tilde": "^2.0.0", - "global-modules": "^1.0.0" - } - }, - "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", - "dev": true - }, - "resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", - "dev": true - }, - "ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "dev": true - }, - "retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", - "dev": true - }, - "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "ripemd160": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", - "dev": true, - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" - } - }, - "run-queue": { - "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" - } - }, - "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 - }, - "safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "dev": true, - "requires": { - "ret": "~0.1.10" - } - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "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==", - "dev": true, - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - }, - "select-hose": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", - "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=", - "dev": true - }, - "selfsigned": { - "version": "1.10.4", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.4.tgz", - "integrity": "sha512-9AukTiDmHXGXWtWjembZ5NDmVvP2695EtpgbCsxCa68w3c88B+alqbmZ4O3hZ4VWGXeGWzEVdvqgAJD8DQPCDw==", - "dev": true, - "requires": { - "node-forge": "0.7.5" - } - }, - "semver": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", - "dev": true - }, - "send": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", - "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", - "dev": true, - "requires": { - "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "~1.7.2", - "mime": "1.6.0", - "ms": "2.1.1", - "on-finished": "~2.3.0", - "range-parser": "~1.2.1", - "statuses": "~1.5.0" - }, - "dependencies": { - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - } - } - }, - "serialize-javascript": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.7.0.tgz", - "integrity": "sha512-ke8UG8ulpFOxO8f8gRYabHQe/ZntKlcig2Mp+8+URDP1D8vJZ0KUt7LYo07q25Z/+JVSgpr/cui9PIp5H6/+nA==", - "dev": true - }, - "serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", - "dev": true, - "requires": { - "accepts": "~1.3.4", - "batch": "0.6.1", - "debug": "2.6.9", - "escape-html": "~1.0.3", - "http-errors": "~1.6.2", - "mime-types": "~2.1.17", - "parseurl": "~1.3.2" - }, - "dependencies": { - "http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", - "dev": true, - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" - } - }, - "setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", - "dev": true - } - } - }, - "serve-static": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", - "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", - "dev": true, - "requires": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.17.1" - } - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true - }, - "set-value": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", - "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", - "dev": true - }, - "setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", - "dev": true - }, - "sha.js": { - "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true - }, - "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", - "dev": true - }, - "snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "dev": true, - "requires": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "dev": true, - "requires": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "dev": true, - "requires": { - "kind-of": "^3.2.0" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "sockjs": { - "version": "0.3.19", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.19.tgz", - "integrity": "sha512-V48klKZl8T6MzatbLlzzRNhMepEys9Y4oGFpypBFFn1gLI/QQ9HtLLyWJNbPlwGLelOVOEijUbTTJeLLI59jLw==", - "dev": true, - "requires": { - "faye-websocket": "^0.10.0", - "uuid": "^3.0.1" - } - }, - "sockjs-client": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.3.0.tgz", - "integrity": "sha512-R9jxEzhnnrdxLCNln0xg5uGHqMnkhPSTzUZH2eXcR03S/On9Yvoq2wyUZILRUhZCNVu2PmwWVoyuiPz8th8zbg==", - "dev": true, - "requires": { - "debug": "^3.2.5", - "eventsource": "^1.0.7", - "faye-websocket": "~0.11.1", - "inherits": "^2.0.3", - "json3": "^3.3.2", - "url-parse": "^1.4.3" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "faye-websocket": { - "version": "0.11.3", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.3.tgz", - "integrity": "sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA==", - "dev": true, - "requires": { - "websocket-driver": ">=0.5.1" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, - "source-list-map": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", - "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", - "dev": true - }, - "source-map-resolve": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", - "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", - "dev": true, - "requires": { - "atob": "^2.1.1", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" - } - }, - "source-map-support": { - "version": "0.5.12", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.12.tgz", - "integrity": "sha512-4h2Pbvyy15EE02G+JOZpUCmqWJuqrs+sEkzewTm++BPi7Hvn/HwcqLAcNxYAyI0x13CpPPn+kMjl+hplXMHITQ==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "source-map-url": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", - "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", - "dev": true - }, - "spdy": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.0.tgz", - "integrity": "sha512-ot0oEGT/PGUpzf/6uk4AWLqkq+irlqHXkrdbk51oWONh3bxQmBuljxPNl66zlRRcIJStWq0QkLUCPOPjgjvU0Q==", - "dev": true, - "requires": { - "debug": "^4.1.0", - "handle-thing": "^2.0.0", - "http-deceiver": "^1.2.7", - "select-hose": "^2.0.0", - "spdy-transport": "^3.0.0" - }, - "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, - "spdy-transport": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", - "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", - "dev": true, - "requires": { - "debug": "^4.1.0", - "detect-node": "^2.0.4", - "hpack.js": "^2.1.6", - "obuf": "^1.1.2", - "readable-stream": "^3.0.6", - "wbuf": "^1.7.3" - }, - "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "readable-stream": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", - "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "string_decoder": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.2.0.tgz", - "integrity": "sha512-6YqyX6ZWEYguAxgZzHGL7SsCeGx3V2TtOTqZz1xSTSWnqsbWwbptafNyvf/ACquZUXV3DANr5BDIwNYe1mN42w==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.0" - } - }, - "ssri": { - "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" - } - }, - "static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", - "dev": true, - "requires": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", - "dev": true - }, - "stream-browserify": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", - "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", - "dev": true, - "requires": { - "inherits": "~2.0.1", - "readable-stream": "^2.0.2" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "readable-stream": { - "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", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "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" - } - } - } - }, - "stream-each": { - "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" - } - }, - "stream-http": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", - "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", - "dev": true, - "requires": { - "builtin-status-codes": "^3.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.3.6", - "to-arraybuffer": "^1.0.0", - "xtend": "^4.0.0" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "readable-stream": { - "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", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "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" - } - } - } - }, - "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 - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "tapable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.0.tgz", - "integrity": "sha512-IlqtmLVaZA2qab8epUXbVWRn3aB1imbDMJtjB3nu4X0NqPkcY/JH9ZtCBWKHWPxs8Svi9tyo8w2dBoi07qZbBA==", - "dev": true - }, - "terser": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.0.0.tgz", - "integrity": "sha512-dOapGTU0hETFl1tCo4t56FN+2jffoKyER9qBGoUFyZ6y7WLoKT0bF+lAYi6B6YsILcGF3q1C2FBh8QcKSCgkgA==", - "dev": true, - "requires": { - "commander": "^2.19.0", - "source-map": "~0.6.1", - "source-map-support": "~0.5.10" - }, - "dependencies": { - "commander": { - "version": "2.20.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz", - "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==", - "dev": true - } - } - }, - "terser-webpack-plugin": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.3.0.tgz", - "integrity": "sha512-W2YWmxPjjkUcOWa4pBEv4OP4er1aeQJlSo2UhtCFQCuRXEHjOFscO8VyWHj9JLlA0RzQb8Y2/Ta78XZvT54uGg==", - "dev": true, - "requires": { - "cacache": "^11.3.2", - "find-cache-dir": "^2.0.0", - "is-wsl": "^1.1.0", - "loader-utils": "^1.2.3", - "schema-utils": "^1.0.0", - "serialize-javascript": "^1.7.0", - "source-map": "^0.6.1", - "terser": "^4.0.0", - "webpack-sources": "^1.3.0", - "worker-farm": "^1.7.0" - }, - "dependencies": { - "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 - }, - "json5": { - "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" - } - }, - "loader-utils": { - "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", - "json5": "^1.0.1" - } - } - } - }, - "text-encoding": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/text-encoding/-/text-encoding-0.7.0.tgz", - "integrity": "sha1-+JXoNuRZkGJAhmAXmOqY6PNu5kM=", - "dev": true - }, - "through2": { - "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" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "readable-stream": { - "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", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "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" - } - } - } - }, - "thunky": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.0.3.tgz", - "integrity": "sha512-YwT8pjmNcAXBZqrubu22P4FYsh2D4dxRmnWBOL8Jk8bUcRUtc5326kx32tuTmFDAZtLOGEVNl8POAR8j896Iow==", - "dev": true - }, - "timers-browserify": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.10.tgz", - "integrity": "sha512-YvC1SV1XdOUaL6gx5CoGroT3Gu49pK9+TZ38ErPldOWW4j49GI1HKs9DV+KGq/w6y+LZ72W1c8cKz2vzY+qpzg==", - "dev": true, - "requires": { - "setimmediate": "^1.0.4" - } - }, - "to-arraybuffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", - "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", - "dev": true - }, - "to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "dev": true, - "requires": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - }, - "toidentifier": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", - "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", - "dev": true - }, - "toposort": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/toposort/-/toposort-1.0.7.tgz", - "integrity": "sha1-LmhELZ9k7HILjMieZEOsbKqVACk=", - "dev": true - }, - "tslib": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", - "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==", - "dev": true - }, - "tty-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", - "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", - "dev": true - }, - "type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dev": true, - "requires": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - } - }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", - "dev": true - }, - "uglify-js": { - "version": "3.4.9", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.9.tgz", - "integrity": "sha1-rwLxgMEgfXZDLkc+0koo9KeCuuM=", - "dev": true, - "requires": { - "commander": "~2.17.1", - "source-map": "~0.6.1" - } - }, - "union-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", - "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^0.4.3" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "set-value": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", - "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.1", - "to-object-path": "^0.3.0" - } - } - } - }, - "unique-filename": { - "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" - } - }, - "unique-slug": { - "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" - } - }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", - "dev": true - }, - "unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", - "dev": true, - "requires": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "dependencies": { - "has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "dev": true, - "requires": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "dependencies": { - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "requires": { - "isarray": "1.0.0" - } - } - } - }, - "has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - } - } - }, - "upath": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.2.tgz", - "integrity": "sha512-kXpym8nmDmlCBr7nKdIx8P2jNBa+pBpIUFRnKJ4dr8htyYGJFokkr2ZvERRtUN+9SY+JqXouNgUPtv6JQva/2Q==", - "dev": true - }, - "upper-case": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", - "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=", - "dev": true - }, - "uri-js": { - "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" - } - }, - "urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", - "dev": true - }, - "url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", - "dev": true, - "requires": { - "punycode": "1.3.2", - "querystring": "0.2.0" - }, - "dependencies": { - "punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", - "dev": true - } - } - }, - "url-parse": { - "version": "1.4.7", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.7.tgz", - "integrity": "sha512-d3uaVyzDB9tQoSXFvuSUNFibTd9zxd2bkVrDRvF5TmvWWQwqE4lgYJ5m+x1DbecWkw+LK4RNl2CU1hHuOKPVlg==", - "dev": true, - "requires": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" - } - }, - "use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", - "dev": true - }, - "util": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", - "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", - "dev": true, - "requires": { - "inherits": "2.0.3" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - }, - "util.promisify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", - "integrity": "sha1-RA9xZaRZyaFtwUXrjnLzVocJcDA=", - "dev": true, - "requires": { - "define-properties": "^1.1.2", - "object.getownpropertydescriptors": "^2.0.3" - } - }, - "utila": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", - "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=", - "dev": true - }, - "utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", - "dev": true - }, - "uuid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", - "dev": true - }, - "v8-compile-cache": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.0.3.tgz", - "integrity": "sha512-CNmdbwQMBjwr9Gsmohvm0pbL954tJrNzf6gWL3K+QMQf00PF7ERGrEiLgjuU3mKreLC2MeGhUsNV9ybTbLgd3w==", - "dev": true - }, - "vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", - "dev": true - }, - "vm-browserify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.0.tgz", - "integrity": "sha512-iq+S7vZJE60yejDYM0ek6zg308+UZsdtPExWP9VZoCFCz1zkJoXFnAX7aZfd/ZwrkidzdUZL0C/ryW+JwAiIGw==", - "dev": true - }, - "watchpack": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz", - "integrity": "sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==", - "dev": true, - "requires": { - "chokidar": "^2.0.2", - "graceful-fs": "^4.1.2", - "neo-async": "^2.5.0" - } - }, - "wbuf": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", - "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", - "dev": true, - "requires": { - "minimalistic-assert": "^1.0.0" - } - }, - "webpack": { - "version": "4.35.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.35.0.tgz", - "integrity": "sha512-M5hL3qpVvtr8d4YaJANbAQBc4uT01G33eDpl/psRTBCfjxFTihdhin1NtAKB1ruDwzeVdcsHHV3NX+QsAgOosw==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-module-context": "1.8.5", - "@webassemblyjs/wasm-edit": "1.8.5", - "@webassemblyjs/wasm-parser": "1.8.5", - "acorn": "^6.0.5", - "acorn-dynamic-import": "^4.0.0", - "ajv": "^6.1.0", - "ajv-keywords": "^3.1.0", - "chrome-trace-event": "^1.0.0", - "enhanced-resolve": "^4.1.0", - "eslint-scope": "^4.0.0", - "json-parse-better-errors": "^1.0.2", - "loader-runner": "^2.3.0", - "loader-utils": "^1.1.0", - "memory-fs": "~0.4.1", - "micromatch": "^3.1.8", - "mkdirp": "~0.5.0", - "neo-async": "^2.5.0", - "node-libs-browser": "^2.0.0", - "schema-utils": "^1.0.0", - "tapable": "^1.1.0", - "terser-webpack-plugin": "^1.1.0", - "watchpack": "^1.5.0", - "webpack-sources": "^1.3.0" - }, - "dependencies": { - "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 - }, - "json5": { - "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" - } - }, - "loader-utils": { - "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", - "json5": "^1.0.1" - } - } - } - }, - "webpack-cli": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.3.4.tgz", - "integrity": "sha512-ubJGQEKMtBSpT+LiL5hXvn2GIOWiRWItR1DGUqJRhwRBeGhpRXjvF5f0erqdRJLErkfqS5/Ldkkedh4AL5Q1ZQ==", - "dev": true, - "requires": { - "chalk": "^2.4.1", - "cross-spawn": "^6.0.5", - "enhanced-resolve": "^4.1.0", - "findup-sync": "^2.0.0", - "global-modules": "^1.0.0", - "import-local": "^2.0.0", - "interpret": "^1.1.0", - "loader-utils": "^1.1.0", - "prettier": "^1.17.0", - "supports-color": "^5.5.0", - "v8-compile-cache": "^2.0.2", - "yargs": "^12.0.5" - }, - "dependencies": { - "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 - }, - "json5": { - "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" - } - }, - "loader-utils": { - "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", - "json5": "^1.0.1" - } - } - } - }, - "webpack-dev-middleware": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.0.tgz", - "integrity": "sha512-qvDesR1QZRIAZHOE3iQ4CXLZZSQ1lAUsSpnQmlB1PBfoN/xdRjmge3Dok0W4IdaVLJOGJy3sGI4sZHwjRU0PCA==", - "dev": true, - "requires": { - "memory-fs": "^0.4.1", - "mime": "^2.4.2", - "range-parser": "^1.2.1", - "webpack-log": "^2.0.0" - }, - "dependencies": { - "mime": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", - "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==", - "dev": true - } - } - }, - "webpack-dev-server": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.7.2.tgz", - "integrity": "sha512-mjWtrKJW2T9SsjJ4/dxDC2fkFVUw8jlpemDERqV0ZJIkjjjamR2AbQlr3oz+j4JLhYCHImHnXZK5H06P2wvUew==", - "dev": true, - "requires": { - "ansi-html": "0.0.7", - "bonjour": "^3.5.0", - "chokidar": "^2.1.6", - "compression": "^1.7.4", - "connect-history-api-fallback": "^1.6.0", - "debug": "^4.1.1", - "del": "^4.1.1", - "express": "^4.17.1", - "html-entities": "^1.2.1", - "http-proxy-middleware": "^0.19.1", - "import-local": "^2.0.0", - "internal-ip": "^4.3.0", - "ip": "^1.1.5", - "killable": "^1.0.1", - "loglevel": "^1.6.3", - "opn": "^5.5.0", - "p-retry": "^3.0.1", - "portfinder": "^1.0.20", - "schema-utils": "^1.0.0", - "selfsigned": "^1.10.4", - "semver": "^6.1.1", - "serve-index": "^1.9.1", - "sockjs": "0.3.19", - "sockjs-client": "1.3.0", - "spdy": "^4.0.0", - "strip-ansi": "^3.0.1", - "supports-color": "^6.1.0", - "url": "^0.11.0", - "webpack-dev-middleware": "^3.7.0", - "webpack-log": "^2.0.0", - "yargs": "12.0.5" - }, - "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "semver": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.1.1.tgz", - "integrity": "sha512-rWYq2e5iYW+fFe/oPPtYJxYgjBm8sC4rmoGdUOgBB7VnwKt6HrL793l2voH1UlsyYZpJ4g0wfjnTEO1s1NP2eQ==", - "dev": true - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "webpack-log": { - "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" - } - }, - "webpack-sources": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.3.0.tgz", - "integrity": "sha512-OiVgSrbGu7NEnEvQJJgdSFPl2qWKkWq5lHMhgiToIiN9w34EBnjYzSYs+VbL5KoYiLNtFFa7BZIKxRED3I32pA==", - "dev": true, - "requires": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" - } - }, - "websocket-driver": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.3.tgz", - "integrity": "sha512-bpxWlvbbB459Mlipc5GBzzZwhoZgGEZLuqPaR0INBGnPAY1vdBX6hPnoFXiw+3yWxDuHyQjO2oXTMyS8A5haFg==", - "dev": true, - "requires": { - "http-parser-js": ">=0.4.0 <0.4.11", - "safe-buffer": ">=5.1.0", - "websocket-extensions": ">=0.1.1" - } - }, - "websocket-extensions": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz", - "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==", - "dev": true - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, - "worker-farm": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", - "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", - "dev": true, - "requires": { - "errno": "~0.1.7" - } - }, - "wrap-ansi": { - "version": "2.1.0", - "resolved": "http://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", - "dev": true, - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" - }, - "dependencies": { - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - } - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "ws": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.0.0.tgz", - "integrity": "sha512-cknCal4k0EAOrh1SHHPPWWh4qm93g1IuGGGwBjWkXmCG7LsDtL8w9w+YVfaF+KSVwiHQKDIMsSLBVftKf9d1pg==", - "requires": { - "async-limiter": "^1.0.0" - } - }, - "xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", - "dev": true - }, - "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==", - "dev": true - }, - "yallist": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", - "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==", - "dev": true - }, - "yargs": { - "version": "12.0.5", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", - "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", - "dev": true, - "requires": { - "cliui": "^4.0.0", - "decamelize": "^1.2.0", - "find-up": "^3.0.0", - "get-caller-file": "^1.0.1", - "os-locale": "^3.0.0", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^2.0.0", - "which-module": "^2.0.0", - "y18n": "^3.2.1 || ^4.0.0", - "yargs-parser": "^11.1.1" - } - }, - "yargs-parser": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", - "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } -} From 245e12c15f7df160db014a9cc6c136fa674ec916 Mon Sep 17 00:00:00 2001 From: alanpoon Date: Tue, 2 Jul 2019 10:14:23 +0800 Subject: [PATCH 59/64] added instruction on instruction of installing crayon-cli --- backends/conrod_crayon/tools/wasm-template/README.md | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/backends/conrod_crayon/tools/wasm-template/README.md b/backends/conrod_crayon/tools/wasm-template/README.md index 8a2ede2da..60fb75c9f 100644 --- a/backends/conrod_crayon/tools/wasm-template/README.md +++ b/backends/conrod_crayon/tools/wasm-template/README.md @@ -1,8 +1,9 @@ # Wasm-Template - +You will need to install crayon-cli. You may cargo install crayon-cli. ```sh -$ cd ./tools/wasm-template +$ cd assets/crayon +$ crayon-cli build +$ cd ../../tools/wasm-template $ npm install -$ cd ../.. -$ ./tools/wasm-template/run.sh crayon +$ ./run.sh crayon ``` \ No newline at end of file From a9202e8b052259b246ddd58f9bfff536d3319d3e Mon Sep 17 00:00:00 2001 From: alanpoon Date: Fri, 5 Jul 2019 16:07:58 +0800 Subject: [PATCH 60/64] git --- backends/conrod_crayon/Cargo.toml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/backends/conrod_crayon/Cargo.toml b/backends/conrod_crayon/Cargo.toml index e97f8ae9f..7aec650f6 100644 --- a/backends/conrod_crayon/Cargo.toml +++ b/backends/conrod_crayon/Cargo.toml @@ -17,12 +17,12 @@ path = "./src/lib.rs" [dependencies] conrod_core = { path = "../../conrod_core", version = "0.65" } -crayon = { git = "https://github.com/alanpoon/crayon", branch="textedit"} +crayon = { git = "https://github.com/alanpoon/crayon.git", branch="textedit"} conrod_example_shared = { path = "../conrod_example_shared", version = "0.65" } serde_json = "1.0" -crayon_bytes = { git = "https://github.com/alanpoon/crayon", branch="textedit"} +crayon_bytes = { git = "https://github.com/alanpoon/crayon.git", branch="textedit"} cgmath = "0.16.1" -instant = {git="https://github.com/alanpoon/instant", branch="window_performance_stable", version="0.1.1", features = [ "wasm-bindgen","now" ]} +instant = {git="https://github.com/alanpoon/instant.git", branch="window_performance_stable", version="0.1.1", features = [ "wasm-bindgen","now" ]} [target.'cfg(target_arch = "wasm32")'.dependencies] wasm-bindgen = "0.2.47" From c615d224cfaa2a0e91233d62ad889809748f68ac Mon Sep 17 00:00:00 2001 From: alanpoon Date: Fri, 5 Jul 2019 16:14:14 +0800 Subject: [PATCH 61/64] fix instant in conrod_core --- conrod_core/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conrod_core/Cargo.toml b/conrod_core/Cargo.toml index 511678120..f3f92f633 100644 --- a/conrod_core/Cargo.toml +++ b/conrod_core/Cargo.toml @@ -28,4 +28,4 @@ fnv = "1.0" num = "0.2" pistoncore-input = "0.24" rusttype = { version = "0.7", features = ["gpu_cache"] } -instant = {path="../../wasm/instant", version="0.1.1", features = [ "wasm-bindgen","now" ]} +instant = {git="https://github.com/alanpoon/instant.git", branch="window_performance_stable", version="0.1.1", features = [ "wasm-bindgen","now" ]} From 0994e7898b240fb512a1182e66b1aaf6363df342 Mon Sep 17 00:00:00 2001 From: alanpoon Date: Mon, 8 Jul 2019 17:38:35 +0800 Subject: [PATCH 62/64] push with asset --- .gitignore | 2 -- .../resources/26AA066C59834DA8884C4AC7BF9C49F6 | Bin 0 -> 74596 bytes .../resources/2943B9386A274730A50702A904F384D5 | Bin 0 -> 87520 bytes .../resources/427EB273E77446B8B7010ACE1B7652EE | Bin 0 -> 20495 bytes .../resources/4572A4B5C9F146BD84517F6FA535FAE6 | Bin 0 -> 173519 bytes .../resources/64CD2E4E19494718AD79BEC5F4CD5600 | Bin 0 -> 351 bytes .../resources/6F0C4447040F47C28F48BB8284DF5678 | Bin 0 -> 326 bytes .../resources/D0CB0AC2AC6949C998CBF5841751B3FD | Bin 0 -> 770 bytes .../resources/E32F80DF6B5946D9B49E4651AAF8A64E | Bin 0 -> 770 bytes assets/crayon/resources/MANIFEST | Bin 0 -> 468 bytes 10 files changed, 2 deletions(-) create mode 100644 assets/crayon/resources/26AA066C59834DA8884C4AC7BF9C49F6 create mode 100644 assets/crayon/resources/2943B9386A274730A50702A904F384D5 create mode 100644 assets/crayon/resources/427EB273E77446B8B7010ACE1B7652EE create mode 100644 assets/crayon/resources/4572A4B5C9F146BD84517F6FA535FAE6 create mode 100644 assets/crayon/resources/64CD2E4E19494718AD79BEC5F4CD5600 create mode 100644 assets/crayon/resources/6F0C4447040F47C28F48BB8284DF5678 create mode 100644 assets/crayon/resources/D0CB0AC2AC6949C998CBF5841751B3FD create mode 100644 assets/crayon/resources/E32F80DF6B5946D9B49E4651AAF8A64E create mode 100644 assets/crayon/resources/MANIFEST diff --git a/.gitignore b/.gitignore index 0dee3a1b3..756098a12 100644 --- a/.gitignore +++ b/.gitignore @@ -23,6 +23,4 @@ rusti.sh Cargo.lock */**/dist */**/node_modules -assets/crayon/resources -**.meta.toml backends/conrod_crayon/tools/wasm-template/package-lock.json \ No newline at end of file diff --git a/assets/crayon/resources/26AA066C59834DA8884C4AC7BF9C49F6 b/assets/crayon/resources/26AA066C59834DA8884C4AC7BF9C49F6 new file mode 100644 index 0000000000000000000000000000000000000000..0db6cf0529f592dca8cc3d314a5d11f9e9c064d6 GIT binary patch literal 74596 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 RMBo_MKkt(JNQU*r@L%R>>VW_N literal 0 HcmV?d00001 diff --git a/assets/crayon/resources/2943B9386A274730A50702A904F384D5 b/assets/crayon/resources/2943B9386A274730A50702A904F384D5 new file mode 100644 index 0000000000000000000000000000000000000000..995d9a7997a410fc1c6aa959eae6f872308b60cc GIT binary patch literal 87520 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 GfBz3-h&P%5 literal 0 HcmV?d00001 diff --git a/assets/crayon/resources/427EB273E77446B8B7010ACE1B7652EE b/assets/crayon/resources/427EB273E77446B8B7010ACE1B7652EE new file mode 100644 index 0000000000000000000000000000000000000000..9dc3a1880cff9f989aa7b36016deb664e10ac99e GIT binary patch literal 20495 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 UNF)>#01_*U5S45Ig+&Ad4(U9_6#xJL literal 0 HcmV?d00001 diff --git a/assets/crayon/resources/4572A4B5C9F146BD84517F6FA535FAE6 b/assets/crayon/resources/4572A4B5C9F146BD84517F6FA535FAE6 new file mode 100644 index 0000000000000000000000000000000000000000..cd0549e7b8d28d9ab3740a6248f87a542781208b GIT binary patch literal 173519 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 literal 0 HcmV?d00001 diff --git a/assets/crayon/resources/64CD2E4E19494718AD79BEC5F4CD5600 b/assets/crayon/resources/64CD2E4E19494718AD79BEC5F4CD5600 new file mode 100644 index 0000000000000000000000000000000000000000..88582a1d2afdb819ae051d52d18d1b28bbd7e067 GIT binary patch literal 351 zcmWFta&=N*U|?infB=3dot$5kmzt9kpOjyrm!Fiyz|de1m4Q;Id`3pNEGv|imXn`f zL`WY4BNJ3P+yD-!KygNXQHfK21z{tYVMf5rV228nB3^X2OBM7iTC^)&!y>UN?vqP>G zNH^Gn*h>m(?Gr!@Ab`n(#2_LNHOOj#;teo9jE0y8(g8OU$sU9_B8V6nn1I4ezz_le Du~ZsI literal 0 HcmV?d00001 diff --git a/assets/crayon/resources/D0CB0AC2AC6949C998CBF5841751B3FD b/assets/crayon/resources/D0CB0AC2AC6949C998CBF5841751B3FD new file mode 100644 index 0000000000000000000000000000000000000000..8c70ec97e23da3c17f7ae04154e1b2d9cd57225f GIT binary patch literal 770 zcmcJNyG}wu6h$|em!cpDCQxWBY_++C-5p8_Xf%@eA5d99LvL)1)K(PQ+6b}Nf3UFg zAB<Gv)>$3O;V%?P_ZHaWx3T>X`6{xoMSO*#7ywCx_>?&s78qk+?RDc8Db&RF)ToO2-O9L{G$ub-paMCY^Q zV{)yl{@SN3^ZN@YK01#RsDxd_k)DwTebId zU01f9HFKu@o4_5m55Rr^>RZRYA0`G;_y2#rJ%~n9yBEY~U}yk~YsT>J1E~j@2NH#; z2iXG>_jvegAF?>ed=MXGr&xUnn7!oSbUS2wk;ReCK^F&^12P|%_*30kV7vdxmh4A1 z2U#51{pjK#^FjW?B@VO~90ox5??W~RSsXds(8WRK1H)l2E^(l}b|5uC_uC_z0~K!o zi6e&_vU=ojMi%z~83+c93`{_p37A4z7+4wDfFv6OI|By;Cj%Fd9sP1P3@k4Sls5sZLa58Ace-OWoaI zDLd0jmd`C$LGmDVrD*D0i Date: Wed, 7 Aug 2019 15:48:47 +0800 Subject: [PATCH 63/64] ignore travis --- .gitignore | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 756098a12..4a92d1f81 100644 --- a/.gitignore +++ b/.gitignore @@ -23,4 +23,5 @@ rusti.sh Cargo.lock */**/dist */**/node_modules -backends/conrod_crayon/tools/wasm-template/package-lock.json \ No newline at end of file +backends/conrod_crayon/tools/wasm-template/package-lock.json +.travis.yml \ No newline at end of file From 2b9e6c32acf3da3dab657bf8e69681ee2a23895b Mon Sep 17 00:00:00 2001 From: alanpoon Date: Fri, 9 Aug 2019 23:14:51 +0800 Subject: [PATCH 64/64] added npm run serve --- backends/conrod_crayon/tools/wasm-template/run.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/backends/conrod_crayon/tools/wasm-template/run.sh b/backends/conrod_crayon/tools/wasm-template/run.sh index 40908948e..72d909a71 100755 --- a/backends/conrod_crayon/tools/wasm-template/run.sh +++ b/backends/conrod_crayon/tools/wasm-template/run.sh @@ -8,4 +8,5 @@ mkdir $SCRIPT_DIR/dist mkdir $SCRIPT_DIR/dist/intermediate cp $BASE_DIR/target/wasm32-unknown-unknown/debug/examples/$1.wasm $SCRIPT_DIR/dist/intermediate/native.wasm wasm-bindgen --target web $SCRIPT_DIR/dist/intermediate/native.wasm --out-dir $SCRIPT_DIR/dist --no-typescript -cd $SCRIPT_DIR \ No newline at end of file +cd $SCRIPT_DIR +npm run serve \ No newline at end of file