From 8c7e4266d022e180374c7afc03a03e001426b6fd Mon Sep 17 00:00:00 2001 From: Brendan Zabarauskas Date: Thu, 2 Jan 2020 23:06:30 +1100 Subject: [PATCH 01/88] =?UTF-8?q?Rename=20=E2=80=98lang=E2=80=99=20to=20?= =?UTF-8?q?=E2=80=98pikelet=E2=80=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Cargo.toml | 14 + README.md | 110 +++++++ build.rs | 6 + samples/cube.pi | 27 ++ samples/hello-world.pi | 1 + samples/universes.pi | 11 + samples/window-settings.pi | 27 ++ src/core/mod.rs | 467 ++++++++++++++++++++++++++++++ src/core/projections/mod.rs | 4 + src/core/projections/pretty.rs | 133 +++++++++ src/core/projections/surface.rs | 75 +++++ src/core/semantics.rs | 173 +++++++++++ src/core/typing.rs | 214 ++++++++++++++ src/lib.rs | 4 + src/surface/grammar.lalrpop | 47 +++ src/surface/mod.rs | 67 +++++ src/surface/projections/core.rs | 378 ++++++++++++++++++++++++ src/surface/projections/mod.rs | 4 + src/surface/projections/pretty.rs | 121 ++++++++ tests/samples.rs | 72 +++++ 20 files changed, 1955 insertions(+) create mode 100644 Cargo.toml create mode 100644 README.md create mode 100644 build.rs create mode 100644 samples/cube.pi create mode 100644 samples/hello-world.pi create mode 100644 samples/universes.pi create mode 100644 samples/window-settings.pi create mode 100644 src/core/mod.rs create mode 100644 src/core/projections/mod.rs create mode 100644 src/core/projections/pretty.rs create mode 100644 src/core/projections/surface.rs create mode 100644 src/core/semantics.rs create mode 100644 src/core/typing.rs create mode 100644 src/lib.rs create mode 100644 src/surface/grammar.lalrpop create mode 100644 src/surface/mod.rs create mode 100644 src/surface/projections/core.rs create mode 100644 src/surface/projections/mod.rs create mode 100644 src/surface/projections/pretty.rs create mode 100644 tests/samples.rs diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 000000000..a793a9867 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,14 @@ +[package] +name = "pikelet" +version = "0.1.0" +authors = ["Brenda Zabarauskas"] +edition = "2018" +publish = false + +[dependencies] +lalrpop-util = "0.17" +pretty = "0.7" +regex = "1.3" + +[build-dependencies] +lalrpop = "0.17" diff --git a/README.md b/README.md new file mode 100644 index 000000000..72fa501f4 --- /dev/null +++ b/README.md @@ -0,0 +1,110 @@ +# Pikelet + +A simple language. + +This is planned to meet the demands of the 'next version of Pikelet', as +described in [_Pondering the next version of Pikelet_][next-pikelet]. + +[next-pikelet]: https://gist.github.com/brendanzab/eba7015e6345abe79a57a704091820bb/. + +## Roadmap + +Our main aim is to start off with a simple configuration language, like +[Dhall][dhall]. From there we will progressively add features to gain more +flexibility. We want to provide a textual syntax up-front, but we should aim to +keep the core language reasonably decoupled from this, allowing us to provide +support for [projectional editing][structure-editor-wikipedia] in the future. + +[dhall]: https://dhall-lang.org/ +[structure-editor-wikipedia]: https://en.wikipedia.org/wiki/Structure_editor + +### Language + +- Basic config language + - [ ] Comments + - [x] Boolean literals/constants + - [x] Integer literals/constants + - [x] Float literals/constants + - [x] Character literals/constants + - [x] String literals/constants + - [x] Record terms + - [x] Non-dependent record types + - [x] Dynamically sized arrays + - [x] Fixed sized arrays +- Basic programming language + - [ ] Improved literal parsing + - [x] Annotated terms + - [ ] Let expressions + - [ ] Record field lookups + - [ ] Import expressions + - [ ] Function terms + - [ ] Non-dependent function types + - [ ] Pattern matching + - [ ] Recursive terms + - [ ] Opaque (abstract) terms + - [ ] Builtin terms +- Dependently typed language + - [ ] Dependent record types + - [ ] Dependent function types + - [ ] Equality types + - [ ] Fixed-size arrays + - [x] Universe levels + - [x] Stratified + - [x] Cumulative + - [x] Lifting operator + - [ ] Large types (Typeω) + - [ ] Multi-stage programming + - [ ] Quantitative type theory + +### Projections + +- [x] Surface -> Pretty +- [x] Surface -> Core +- [x] Core -> Pretty +- [x] Core -> Value +- [ ] Core -> Binary +- [ ] Core -> Documentation +- [ ] Core -> Cranelift +- [ ] Core -> LLVM +- [ ] Value -> JSON/YAML/TOML + +### Tooling + +- [ ] REPL +- [ ] Package manager +- [ ] Auto-formatter for surface language + +### Testing + +- [x] Language samples +- [ ] Feature tests +- [ ] Property based tests + +### Diagnostics + +- [x] Basic error enum +- [x] Error recovery +- [ ] Pretty diagnostic reporting + +### Rust marshalling + +- [x] Mashalling traits +- [ ] Improved error messages +- [ ] Nicer marshalling API +- [ ] Derive macro for generating marshalling trait implementations +- [ ] More efficient, visitor based marshalling + +### Documentation + +- [ ] Guide +- [ ] Specification + - [ ] Surface + - [ ] Syntax + - [ ] Elaboration + - [ ] Core + - [ ] Syntax + - [ ] Typing + - [ ] Operational semantics +- [ ] References + - [ ] Papers + - [ ] Languages diff --git a/build.rs b/build.rs new file mode 100644 index 000000000..4494207d5 --- /dev/null +++ b/build.rs @@ -0,0 +1,6 @@ +fn main() { + lalrpop::Configuration::new() + .always_use_colors() + .process_current_dir() + .unwrap(); +} diff --git a/samples/cube.pi b/samples/cube.pi new file mode 100644 index 000000000..61aab316c --- /dev/null +++ b/samples/cube.pi @@ -0,0 +1,27 @@ +record { + index-data = [ + 0, 1, 3, 3, 1, 2, + 1, 4, 2, 2, 4, 7, + 4, 5, 7, 7, 5, 6, + 5, 0, 6, 6, 0, 3, + 3, 2, 6, 6, 2, 7, + 5, 4, 0, 0, 4, 1, + ], + vertex-data = [ + record { point = [0, 0, 0], normal = [0, 0, 1], color = [1, 0, 0, 1] }, + record { point = [1, 0, 0], normal = [0, 0, 1], color = [0, 1, 0, 1] }, + record { point = [1, 1, 0], normal = [0, 0, 1], color = [0, 0, 1, 1] }, + record { point = [0, 1, 0], normal = [0, 0, 1], color = [1, 0, 1, 1] }, + record { point = [1, 0, -1], normal = [0, 0, 1], color = [1, 0, 0, 1] }, + record { point = [0, 0, -1], normal = [0, 0, 1], color = [0, 1, 0, 1] }, + record { point = [0, 1, -1], normal = [0, 0, 1], color = [0, 0, 1, 1] }, + record { point = [1, 1, -1], normal = [0, 0, 1], color = [1, 0, 1, 1] }, + ], +} : Record { + index-data : List U16, + vertex-data : List (Record { + point : Array 3 F32, + normal : Array 3 F32, + color : Array 4 F32, + }), +} diff --git a/samples/hello-world.pi b/samples/hello-world.pi new file mode 100644 index 000000000..54262db70 --- /dev/null +++ b/samples/hello-world.pi @@ -0,0 +1 @@ +"Hello beautiful world!" diff --git a/samples/universes.pi b/samples/universes.pi new file mode 100644 index 000000000..5abacc35a --- /dev/null +++ b/samples/universes.pi @@ -0,0 +1,11 @@ +record { + S32 = S32, + Type0 = Type^0, + Type1 = Type^1, + Type256 = Type^256, +} : Record { + S32 : Type^0 : Type^1 : Type^257, + Type0 : Type^1, + Type1 : Type^3, + Type256 : Type^257, +} diff --git a/samples/window-settings.pi b/samples/window-settings.pi new file mode 100644 index 000000000..2a9c5bc13 --- /dev/null +++ b/samples/window-settings.pi @@ -0,0 +1,27 @@ +record { + window = record { + title = "Voyager", + default-size = record { + width = 1280.0, + height = 720.0, + }, + fullscreen = false, + }, + controls = record { + move-speed = 2.0, + look-speed = 15.0, + }, +} : Record { + window : Record { + title : String, + default-size : Record { + width : F32, + height : F32, + }, + fullscreen : Bool, + }, + controls : Record { + move-speed : F32, + look-speed : F32, + }, +} diff --git a/src/core/mod.rs b/src/core/mod.rs new file mode 100644 index 000000000..4117e3a85 --- /dev/null +++ b/src/core/mod.rs @@ -0,0 +1,467 @@ +//! The core language. +//! +//! This is not intended to be used directly by users of the programming +//! language. + +use std::collections::BTreeMap; +use std::sync::Arc; + +pub mod projections; +pub mod semantics; +pub mod typing; + +/// Constants used in the core language. +// FIXME: Partial eq for floating point numbers +#[derive(Clone, Debug, PartialEq)] +pub enum Constant { + U8(u8), + U16(u16), + U32(u32), + U64(u64), + S8(i8), + S16(i16), + S32(i32), + S64(i64), + F32(f32), + F64(f64), + Char(char), + String(String), +} + +/// Universe levels. +#[derive(Copy, Clone, Debug, PartialEq, PartialOrd, Eq, Ord)] +pub struct UniverseLevel(pub u32); + +impl std::ops::Add for UniverseLevel { + type Output = Option; + + fn add(self, other: UniverseOffset) -> Option { + u32::checked_add(self.0, other.0).map(UniverseLevel) + } +} + +impl From for UniverseLevel { + fn from(level: u32) -> UniverseLevel { + UniverseLevel(level) + } +} + +/// Universe level offsets. +#[derive(Copy, Clone, Debug, PartialEq, PartialOrd, Eq, Ord)] +pub struct UniverseOffset(pub u32); + +impl std::ops::Add for UniverseOffset { + type Output = Option; + + fn add(self, other: UniverseOffset) -> Option { + u32::checked_add(self.0, other.0).map(UniverseOffset) + } +} + +impl From for UniverseOffset { + fn from(offset: u32) -> UniverseOffset { + UniverseOffset(offset) + } +} + +/// Terms in the core language. +#[derive(Clone, Debug, PartialEq)] +pub enum Term { + /// The type of types. + Universe(UniverseLevel), + /// References to globals. + Global(String), + /// Constants. + Constant(Constant), + /// Ordered sequences. + Sequence(Vec>), + /// Annotated terms + Ann(Arc, Arc), + /// Record types. + RecordType(Vec<(String, Arc)>), + /// Record terms. + RecordTerm(BTreeMap>), + /// Array types. + ArrayType(Arc, Arc), + /// List types. + ListType(Arc), + /// Lift a term by the given number of universe levels. + Lift(Arc, UniverseOffset), + /// Error sentinel. + Error, +} + +impl Term { + /// Create a universe at the given level. + pub fn universe(level: impl Into) -> Term { + Term::Universe(level.into()) + } + + pub fn lift(self, offset: impl Into) -> Term { + match offset.into() { + UniverseOffset(0) => self, + offset => Term::Lift(Arc::new(self), offset), + } + } +} + +/// The local value environment. +pub struct Locals { + /// The universe level of the environment. + offset: UniverseOffset, + // TODO: values, +} + +impl Locals { + /// Create a new local environment. + pub fn new() -> Locals { + Locals { + offset: UniverseOffset(0), + } + } + + /// Lookup the current universe level offset of the environment. + pub fn universe_offset(&self) -> UniverseOffset { + self.offset + } + + /// Set the current universe level offset of the environment, returning the + /// previous level offset. + pub fn set_universe_offset(&mut self, offset: UniverseOffset) -> UniverseOffset { + std::mem::replace(&mut self.offset, offset) + } +} + +/// Values in the core language. +#[derive(Clone, Debug, PartialEq)] +pub enum Value { + /// The type of types. + Universe(UniverseLevel), + /// Neutral values. + Neutral(Neutral, Arc), + /// Constants. + Constant(Constant), + /// Ordered sequences. + Sequence(Vec>), + /// Record types. + RecordType(Vec<(String, Arc)>), + /// Record terms. + RecordTerm(BTreeMap>), + /// Array types. + ArrayType(Arc, Arc), + /// List types. + ListType(Arc), + /// Error sentinel. + Error, +} + +impl Value { + /// Create a universe at the given level. + pub fn universe(level: impl Into) -> Value { + Value::Universe(level.into()) + } + + /// Create a reference to global. + pub fn global( + name: impl Into, + level: impl Into, + r#type: impl Into>, + ) -> Value { + Value::Neutral(Neutral::Global(name.into(), level.into()), r#type.into()) + } +} + +/// Neutral values. +/// +/// These are values that are 'stuck' on a +#[derive(Clone, Debug, PartialEq)] +pub enum Neutral { + /// References to globals. + Global(String, UniverseOffset), +} + +/// An environment of global definitions. +pub struct Globals { + entries: BTreeMap, Option>)>, +} + +impl Globals { + pub fn new(entries: BTreeMap, Option>)>) -> Globals { + Globals { entries } + } + + pub fn get(&self, name: &str) -> Option<&(Arc, Option>)> { + self.entries.get(name) + } +} + +impl Default for Globals { + fn default() -> Globals { + let mut entries = BTreeMap::new(); + + entries.insert( + "Type".to_owned(), + ( + Arc::new(Term::universe(1)), + Some(Arc::new(Term::universe(0))), + ), + ); + entries.insert("Bool".to_owned(), (Arc::new(Term::universe(0)), None)); + entries.insert("U8".to_owned(), (Arc::new(Term::universe(0)), None)); + entries.insert("U16".to_owned(), (Arc::new(Term::universe(0)), None)); + entries.insert("U32".to_owned(), (Arc::new(Term::universe(0)), None)); + entries.insert("U64".to_owned(), (Arc::new(Term::universe(0)), None)); + entries.insert("S8".to_owned(), (Arc::new(Term::universe(0)), None)); + entries.insert("S16".to_owned(), (Arc::new(Term::universe(0)), None)); + entries.insert("S32".to_owned(), (Arc::new(Term::universe(0)), None)); + entries.insert("S64".to_owned(), (Arc::new(Term::universe(0)), None)); + entries.insert("F32".to_owned(), (Arc::new(Term::universe(0)), None)); + entries.insert("F64".to_owned(), (Arc::new(Term::universe(0)), None)); + entries.insert("Char".to_owned(), (Arc::new(Term::universe(0)), None)); + entries.insert("String".to_owned(), (Arc::new(Term::universe(0)), None)); + entries.insert( + "true".to_owned(), + (Arc::new(Term::Global("Bool".to_owned())), None), + ); + entries.insert( + "false".to_owned(), + (Arc::new(Term::Global("Bool".to_owned())), None), + ); + + Globals::new(entries) + } +} + +pub trait HasType { + fn r#type() -> Value; +} + +macro_rules! impl_has_type { + ($Self:ty, $term:expr) => { + impl HasType for $Self { + fn r#type() -> Value { + $term + } + } + }; +} + +impl_has_type!(bool, Value::global("Bool", 0, Value::universe(0))); +impl_has_type!(u8, Value::global("U8", 0, Value::universe(0))); +impl_has_type!(u16, Value::global("U16", 0, Value::universe(0))); +impl_has_type!(u32, Value::global("U32", 0, Value::universe(0))); +impl_has_type!(u64, Value::global("U64", 0, Value::universe(0))); +impl_has_type!(i8, Value::global("S8", 0, Value::universe(0))); +impl_has_type!(i16, Value::global("S16", 0, Value::universe(0))); +impl_has_type!(i32, Value::global("S32", 0, Value::universe(0))); +impl_has_type!(i64, Value::global("S64", 0, Value::universe(0))); +impl_has_type!(f32, Value::global("F32", 0, Value::universe(0))); +impl_has_type!(f64, Value::global("F64", 0, Value::universe(0))); +impl_has_type!(char, Value::global("Char", 0, Value::universe(0))); +impl_has_type!(String, Value::global("String", 0, Value::universe(0))); +impl_has_type!(str, Value::global("String", 0, Value::universe(0))); + +impl HasType for Vec { + fn r#type() -> Value { + Value::ListType(Arc::new(T::r#type())) + } +} + +macro_rules! impl_has_type_array { + ($($len:expr),*) => { + $(impl HasType for [T; $len] { + fn r#type() -> Value { + Value::ArrayType( + Arc::new(Value::Constant(Constant::U32($len as u32))), + Arc::new(T::r#type()), + ) + } + })* + }; +} + +impl_has_type_array!( + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, + 26, 27, 28, 29, 30, 31, 32 +); + +/// Attempt to deserialize something from a `Term`. +/// +/// # Laws +/// +/// ```skipped +/// check_type(&term, &Self::r#type()) && Self::try_from_term(term).is_ok() +/// ``` +// TODO: Make more efficient with visitors +pub trait TryFromTerm: HasType + Sized { + type Error: Sized; + fn try_from_term(term: &Term) -> Result; +} + +macro_rules! impl_try_from_term { + ($Self:ty, |$p:pat| $term:expr) => { + impl TryFromTerm for $Self { + type Error = (); + + fn try_from_term(term: &Term) -> Result<$Self, ()> { + match term { + $p => $term, + _ => Err(()), + } + } + } + }; +} + +impl_try_from_term!(bool, |Term::Global(name)| match name.as_str() { + "true" => Ok(true), + "false" => Ok(false), + _ => Err(()), +}); +impl_try_from_term!(u8, |Term::Constant(Constant::U8(value))| Ok(*value)); +impl_try_from_term!(u16, |Term::Constant(Constant::U16(value))| Ok(*value)); +impl_try_from_term!(u32, |Term::Constant(Constant::U32(value))| Ok(*value)); +impl_try_from_term!(u64, |Term::Constant(Constant::U64(value))| Ok(*value)); +impl_try_from_term!(i8, |Term::Constant(Constant::S8(value))| Ok(*value)); +impl_try_from_term!(i16, |Term::Constant(Constant::S16(value))| Ok(*value)); +impl_try_from_term!(i32, |Term::Constant(Constant::S32(value))| Ok(*value)); +impl_try_from_term!(i64, |Term::Constant(Constant::S64(value))| Ok(*value)); +impl_try_from_term!(f32, |Term::Constant(Constant::F32(value))| Ok(*value)); +impl_try_from_term!(f64, |Term::Constant(Constant::F64(value))| Ok(*value)); +impl_try_from_term!(char, |Term::Constant(Constant::Char(value))| Ok(*value)); +impl_try_from_term!(String, |Term::Constant(Constant::String(value))| Ok( + value.clone(), +)); + +impl TryFromTerm for Vec { + type Error = (); + + fn try_from_term(term: &Term) -> Result, ()> { + match term { + Term::Sequence(entry_terms) => entry_terms + .iter() + .map(|entry_term| T::try_from_term(entry_term).map_err(|_| ())) + .collect::, ()>>(), + _ => Err(()), + } + } +} + +macro_rules! impl_try_from_term_array { + ($($len:expr),*) => { + $(impl TryFromTerm for [T; $len] { + type Error = (); + + fn try_from_term(term: &Term) -> Result<[T; $len], ()> { + match term { + Term::Sequence(entry_terms) if entry_terms.len() == $len => { + use std::mem::MaybeUninit; + + let mut entries: [MaybeUninit::; $len] = unsafe { + MaybeUninit::uninit().assume_init() + }; + for (i, entry_term) in entry_terms.iter().enumerate() { + entries[i] = MaybeUninit::new(T::try_from_term(entry_term).map_err(|_| ())?); + } + + // NOTE: We'd prefer to do the following: + // + // ``` + // Ok(unsafe { std::mem::transmute::<_, [T; $len]>(entries) }) + // ``` + // + // Sadly we run into the following issue: https://github.com/rust-lang/rust/issues/61956 + // For this reason we need to do the following (hideous) workaround: + + let ptr = &mut entries as *mut _ as *mut [T; $len]; + let result = unsafe { ptr.read() }; + core::mem::forget(entries); + Ok(result) + }, + _ => Err(()), + } + } + })* + }; +} + +impl_try_from_term_array!( + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, + 26, 27, 28, 29, 30, 31, 32 +); + +// TODO: Fixed-size arrays + +/// Serialize something to a `Term`. +/// +/// # Laws +/// +/// ```skipped +/// check_type(&Self::to_term(&value), &Self::r#type()) == true +/// ``` +// TODO: Make more efficient with visitors +pub trait ToTerm: HasType { + fn to_term(&self) -> Term; +} + +macro_rules! impl_to_term { + ($Self:ty, |$p:pat| $term:expr) => { + impl ToTerm for $Self { + fn to_term(&self) -> Term { + let $p = self; + $term + } + } + }; +} + +impl_to_term!(bool, |value| Term::Global(match value { + true => "true".to_owned(), + false => "false".to_owned(), +})); +impl_to_term!(u8, |value| Term::Constant(Constant::U8(*value))); +impl_to_term!(u16, |value| Term::Constant(Constant::U16(*value))); +impl_to_term!(u32, |value| Term::Constant(Constant::U32(*value))); +impl_to_term!(u64, |value| Term::Constant(Constant::U64(*value))); +impl_to_term!(i8, |value| Term::Constant(Constant::S8(*value))); +impl_to_term!(i16, |value| Term::Constant(Constant::S16(*value))); +impl_to_term!(i32, |value| Term::Constant(Constant::S32(*value))); +impl_to_term!(i64, |value| Term::Constant(Constant::S64(*value))); +impl_to_term!(f32, |value| Term::Constant(Constant::F32(*value))); +impl_to_term!(f64, |value| Term::Constant(Constant::F64(*value))); +impl_to_term!(char, |value| Term::Constant(Constant::Char(*value))); +impl_to_term!(String, |value| Term::Constant(Constant::String( + value.clone() +))); +impl_to_term!(str, |value| Term::Constant(Constant::String( + value.to_owned() +))); + +impl ToTerm for Vec { + fn to_term(&self) -> Term { + Term::Sequence( + self.iter() + .map(|entry_term| Arc::new(T::to_term(entry_term))) + .collect(), + ) + } +} + +macro_rules! impl_to_term_array { + ($($len:expr),*) => { + $(impl ToTerm for [T; $len] { + fn to_term(&self) -> Term { + Term::Sequence( + self.iter() + .map(|entry_term| Arc::new(T::to_term(entry_term))) + .collect(), + ) + } + })* + }; +} + +impl_to_term_array!( + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, + 26, 27, 28, 29, 30, 31, 32 +); diff --git a/src/core/projections/mod.rs b/src/core/projections/mod.rs new file mode 100644 index 000000000..95c33dc42 --- /dev/null +++ b/src/core/projections/mod.rs @@ -0,0 +1,4 @@ +//! Projections from the core language into other forms. + +pub mod pretty; +pub mod surface; diff --git a/src/core/projections/pretty.rs b/src/core/projections/pretty.rs new file mode 100644 index 000000000..d32d2d80f --- /dev/null +++ b/src/core/projections/pretty.rs @@ -0,0 +1,133 @@ +//! Pretty prints the core language to a textual form. +use pretty::{DocAllocator, DocBuilder}; + +use crate::core::{Constant, Term}; + +pub fn pretty_term<'term, D, S>(alloc: &'term D, term: &'term Term) -> DocBuilder<'term, D> +where + S: 'term, + &'term S: ToString, + D: DocAllocator<'term>, + D::Doc: Clone, +{ + match term { + Term::Universe(level) => (alloc.nil()) + .append("Type") + .append("^") + .append(alloc.as_string(level.0)), + Term::Global(name) => alloc.text(name), + Term::Constant(constant) => pretty_constant(alloc, constant), + Term::Sequence(term_entries) => (alloc.nil()) + .append("[") + .group() + .append(alloc.intersperse( + term_entries.iter().map(|term| { + (alloc.space()) + .append(pretty_term(alloc, term)) + .group() + .nest(4) + }), + alloc.text(",").append(alloc.space()), + )) + .append("]"), + Term::Ann(term, r#type) => (alloc.nil()) + .append(pretty_term(alloc, term)) + .append(alloc.space()) + .append(":") + .append( + (alloc.space()) + .append(pretty_term(alloc, r#type)) + .group() + .nest(4), + ), + Term::RecordType(ty_entries) => (alloc.nil()) + .append("Record") + .append(alloc.space()) + .append("{") + .group() + .append(alloc.concat(ty_entries.iter().map(|(name, r#type)| { + (alloc.nil()) + .append(alloc.hardline()) + .append(alloc.as_string(name)) + .append(":") + .append( + (alloc.space()) + .append(pretty_term(alloc, r#type)) + .append(",") + .group() + .nest(4), + ) + .nest(4) + .group() + }))) + .append("}"), + Term::RecordTerm(term_entries) => (alloc.nil()) + .append("record") + .append(alloc.space()) + .append("{") + .group() + .append(alloc.concat(term_entries.iter().map(|(name, term)| { + (alloc.nil()) + .append(alloc.hardline()) + .append(alloc.as_string(name)) + .append("=") + .append( + (alloc.space()) + .append(pretty_term(alloc, term)) + .append(",") + .group() + .nest(4), + ) + .nest(4) + .group() + }))) + .append("}"), + Term::ArrayType(len, entry_type) => alloc.text("Array").append( + (alloc.nil()) + .append(alloc.space()) + .append(pretty_term(alloc, len)) + .append(alloc.space()) + .append(pretty_term(alloc, entry_type)) + .group() + .nest(4), + ), + Term::ListType(entry_type) => alloc.text("List").append( + (alloc.nil()) + .append(alloc.space()) + .append(pretty_term(alloc, entry_type)) + .group() + .nest(4), + ), + Term::Lift(term, shift) => (alloc.nil()) + .append(pretty_term(alloc, term)) + .append("^") + .append(alloc.as_string(shift.0)), + Term::Error => alloc.text("!"), + } +} + +pub fn pretty_constant<'term, D, S>( + alloc: &'term D, + constant: &'term Constant, +) -> DocBuilder<'term, D> +where + S: 'term, + &'term S: ToString, + D: DocAllocator<'term>, + D::Doc: Clone, +{ + match constant { + Constant::U8(value) => alloc.as_string(format!("{}", value)), + Constant::U16(value) => alloc.as_string(format!("{}", value)), + Constant::U32(value) => alloc.as_string(format!("{}", value)), + Constant::U64(value) => alloc.as_string(format!("{}", value)), + Constant::S8(value) => alloc.as_string(format!("{}", value)), + Constant::S16(value) => alloc.as_string(format!("{}", value)), + Constant::S32(value) => alloc.as_string(format!("{}", value)), + Constant::S64(value) => alloc.as_string(format!("{}", value)), + Constant::F32(value) => alloc.as_string(format!("{}", value)), + Constant::F64(value) => alloc.as_string(format!("{}", value)), + Constant::Char(value) => alloc.as_string(format!("{:?}", value)), + Constant::String(value) => alloc.as_string(format!("{:?}", value)), + } +} diff --git a/src/core/projections/surface.rs b/src/core/projections/surface.rs new file mode 100644 index 000000000..3e23ff177 --- /dev/null +++ b/src/core/projections/surface.rs @@ -0,0 +1,75 @@ +//! Delaborate the core language into the surface language. + +use crate::core::{Constant, Term, UniverseLevel, UniverseOffset}; +use crate::surface; + +pub fn delaborate_term(term: &Term) -> surface::Term { + match term { + Term::Universe(UniverseLevel(0)) => surface::Term::Name(0..0, "Type".to_owned()), + Term::Universe(UniverseLevel(level)) => { + let universe0 = Box::new(surface::Term::Name(0..0, "Type".to_owned())); + surface::Term::Lift(0..0, universe0, *level) + } + Term::Global(name) => surface::Term::Name(0..0, name.to_owned()), + Term::Constant(constant) => delaborate_constant(constant), + Term::Sequence(entry_terms) => { + let core_entry_terms = entry_terms + .iter() + .map(|entry_term| delaborate_term(entry_term)) + .collect(); + + surface::Term::Sequence(0..0, core_entry_terms) + } + Term::Ann(term, r#type) => surface::Term::Ann( + Box::new(delaborate_term(term)), + Box::new(delaborate_term(r#type)), + ), + Term::RecordType(type_entries) => { + let core_type_entries = type_entries + .iter() + .map(|(name, r#type)| (name.clone(), delaborate_term(r#type))) + .collect(); + + surface::Term::RecordType(0..0, core_type_entries) + } + Term::RecordTerm(term_entries) => { + let core_term_entries = term_entries + .iter() + .map(|(name, term)| (name.clone(), delaborate_term(term))) + .collect(); + + surface::Term::RecordTerm(0..0, core_term_entries) + } + Term::ArrayType(len, entry_type) => surface::Term::ArrayType( + 0..0, + Box::new(delaborate_term(len)), + Box::new(delaborate_term(entry_type)), + ), + Term::ListType(entry_type) => { + surface::Term::ListType(0..0, Box::new(delaborate_term(entry_type))) + } + Term::Lift(term, UniverseOffset(offset)) => { + surface::Term::Lift(0..0, Box::new(delaborate_term(term)), *offset) + } + Term::Error => surface::Term::Error(0..0), + } +} + +pub fn delaborate_constant(constant: &Constant) -> surface::Term { + use crate::surface::Literal; + + match constant { + Constant::U8(value) => surface::Term::Literal(0..0, Literal::Number(value.to_string())), + Constant::U16(value) => surface::Term::Literal(0..0, Literal::Number(value.to_string())), + Constant::U32(value) => surface::Term::Literal(0..0, Literal::Number(value.to_string())), + Constant::U64(value) => surface::Term::Literal(0..0, Literal::Number(value.to_string())), + Constant::S8(value) => surface::Term::Literal(0..0, Literal::Number(value.to_string())), + Constant::S16(value) => surface::Term::Literal(0..0, Literal::Number(value.to_string())), + Constant::S32(value) => surface::Term::Literal(0..0, Literal::Number(value.to_string())), + Constant::S64(value) => surface::Term::Literal(0..0, Literal::Number(value.to_string())), + Constant::F32(value) => surface::Term::Literal(0..0, Literal::Number(value.to_string())), + Constant::F64(value) => surface::Term::Literal(0..0, Literal::Number(value.to_string())), + Constant::Char(value) => surface::Term::Literal(0..0, Literal::Char(value.to_string())), + Constant::String(value) => surface::Term::Literal(0..0, Literal::String(value.to_string())), + } +} diff --git a/src/core/semantics.rs b/src/core/semantics.rs new file mode 100644 index 000000000..2cace772b --- /dev/null +++ b/src/core/semantics.rs @@ -0,0 +1,173 @@ +//! The operational semantics of the language. + +use std::sync::Arc; + +use crate::core::{Globals, Locals, Neutral, Term, Value}; + +/// Evaluate a term into a value in weak-head normal form. +pub fn eval_term(globals: &Globals, locals: &mut Locals, term: &Term) -> Value { + match term { + Term::Universe(level) => Value::universe((*level + locals.universe_offset()).unwrap()), // FIXME: Handle overflow + Term::Global(name) => match globals.get(name) { + Some((_, Some(term))) => eval_term(globals, locals, term), + Some((r#type, None)) => { + let r#type = eval_term(globals, locals, r#type); + Value::global(name, locals.universe_offset(), r#type) + } + None => Value::Error, + }, + Term::Constant(constant) => Value::Constant(constant.clone()), + Term::Sequence(term_entries) => { + let value_entries = term_entries + .iter() + .map(|entry_term| Arc::new(eval_term(globals, locals, entry_term))) + .collect(); + + Value::Sequence(value_entries) + } + Term::Ann(term, _) => eval_term(globals, locals, term), + Term::RecordType(type_entries) => { + let type_entries = type_entries + .iter() + .map(|(name, r#type)| (name.clone(), Arc::new(eval_term(globals, locals, r#type)))) + .collect(); + + Value::RecordType(type_entries) + } + Term::RecordTerm(term_entries) => { + let value_entries = term_entries + .iter() + .map(|(name, term)| (name.clone(), Arc::new(eval_term(globals, locals, term)))) + .collect(); + + Value::RecordTerm(value_entries) + } + Term::ArrayType(len, entry_type) => Value::ArrayType( + Arc::new(eval_term(globals, locals, len)), + Arc::new(eval_term(globals, locals, entry_type)), + ), + Term::ListType(r#type) => Value::ListType(Arc::new(eval_term(globals, locals, r#type))), + Term::Lift(term, offset) => { + let previous_offset = locals.universe_offset(); + locals.set_universe_offset((previous_offset + *offset).unwrap()); // FIXME: Handle overflow + let value = eval_term(globals, locals, term); + locals.set_universe_offset(previous_offset); + value + } + Term::Error => Value::Error, + } +} + +/// Read-back a neutral value into the term syntax. +pub fn read_back_neutral(/* TODO: level, */ neutral: &Neutral) -> Term { + match neutral { + Neutral::Global(name, shift) => Term::Global(name.clone()).lift(*shift), + } +} + +/// Read-back a normal form into the term syntax. +/// +/// This is type-directed to allow us to perform eta-conversion. +pub fn read_back_nf(/* TODO: level, */ value: &Value, r#type: &Value) -> Term { + match (value, r#type) { + (Value::Universe(level), Value::Universe(_)) => Term::Universe(*level), + (Value::Neutral(neutral, _), _) => read_back_neutral(neutral), + (Value::Constant(constant), _) => Term::Constant(constant.clone()), + (Value::Sequence(value_entries), Value::ArrayType(_, entry_type)) => Term::Sequence( + value_entries + .iter() + .map(|value_entry| Arc::new(read_back_nf(value_entry, entry_type))) + .collect(), + ), + (Value::Sequence(value_entries), Value::ListType(entry_type)) => { + let term_entries = value_entries + .iter() + .map(|value_entry| Arc::new(read_back_nf(value_entry, entry_type))) + .collect(); + + Term::Sequence(term_entries) + } + (Value::RecordType(type_entries), Value::Universe(level)) => { + let type_entries = type_entries + .iter() + .map(|(name, r#type)| { + let r#type = Arc::new(read_back_nf(r#type, &Value::Universe(*level))); + (name.clone(), r#type) + }) + .collect(); + + Term::RecordType(type_entries) + } + (Value::RecordTerm(value_entries), Value::RecordType(type_entries)) => { + let term_entries = type_entries + .iter() + .map(|(name, r#type)| { + let term = Arc::new(read_back_nf(&value_entries[name], r#type)); + (name.clone(), term) + }) + .collect(); + + Term::RecordTerm(term_entries) + } + (Value::ArrayType(len, entry_type), Value::Universe(level)) => { + let u32_type = Value::global("U32", 0, Value::universe(0)); + Term::ArrayType( + Arc::new(read_back_nf(len, &u32_type)), + Arc::new(read_back_nf(entry_type, &Value::Universe(*level))), + ) + } + (Value::ListType(entry_type), Value::Universe(level)) => { + Term::ListType(Arc::new(read_back_nf(entry_type, &Value::Universe(*level)))) + } + (Value::Universe(_), _) + | (Value::Sequence(_), _) + | (Value::RecordType(_), _) + | (Value::RecordTerm(_), _) + | (Value::ArrayType(_, _), _) + | (Value::ListType(_), _) + | (Value::Error, _) => Term::Error, + } +} + +/// Fully normalize a term. +pub fn normalize(globals: &Globals, locals: &mut Locals, term: &Term, r#type: &Value) -> Term { + read_back_nf(&eval_term(globals, locals, term), r#type) +} + +/// Check that two values are equal. +pub fn is_subtype(value0: &Value, value1: &Value) -> bool { + match (value0, value1) { + (Value::Universe(level0), Value::Universe(level1)) => level0 <= level1, + (Value::Neutral(neutral0, type0), Value::Neutral(neutral1, type1)) => { + read_back_neutral(neutral0) == read_back_neutral(neutral1) && is_subtype(type0, type1) + } + (Value::Constant(constant0), Value::Constant(constant1)) => constant0 == constant1, + (Value::Sequence(value_entries0), Value::Sequence(value_entries1)) => { + value_entries0.len() == value_entries1.len() + && Iterator::zip(value_entries0.iter(), value_entries1.iter()) + .all(|(term0, term1)| is_subtype(term0, term1)) + } + (Value::RecordType(type_entries0), Value::RecordType(type_entries1)) => { + type_entries0.len() == type_entries1.len() + && Iterator::zip(type_entries0.iter(), type_entries1.iter()).all( + |((name0, type0), (name1, type1))| name0 == name1 && is_subtype(type0, type1), + ) + } + (Value::RecordTerm(value_entries0), Value::RecordTerm(value_entries1)) => { + value_entries0.len() == value_entries1.len() + && Iterator::zip(value_entries0.iter(), value_entries1.iter()).all( + |((name0, term0), (name1, term1))| name0 == name1 && is_subtype(term0, term1), + ) + } + (Value::ArrayType(len0, entry_type0), Value::ArrayType(len1, entry_type1)) => { + is_subtype(len0, len1) && is_subtype(entry_type0, entry_type1) + } + (Value::ListType(entry_type0), Value::ListType(entry_type1)) => { + is_subtype(entry_type0, entry_type1) + } + // Errors are always treated as subtypes, regardless of what they are compared with. + (Value::Error, _) | (_, Value::Error) => true, + // Anything else is not equal! + (_, _) => false, + } +} diff --git a/src/core/typing.rs b/src/core/typing.rs new file mode 100644 index 000000000..65f5b8e82 --- /dev/null +++ b/src/core/typing.rs @@ -0,0 +1,214 @@ +//! Bidirectional type checker for the core language. +//! +//! This is used to validate that terms are well-formed. + +use std::sync::Arc; + +use crate::core::semantics; +use crate::core::{Constant, Globals, Locals, Term, UniverseLevel, UniverseOffset, Value}; + +/// The state of the type checker. +pub struct State<'me> { + globals: &'me Globals, + locals: Locals, + pub errors: Vec, +} + +impl<'me> State<'me> { + /// Construct a new type checker state. + pub fn new(globals: &'me Globals) -> State<'me> { + State { + globals, + locals: Locals::new(), + errors: Vec::new(), + } + } + + /// Report an error. + pub fn report(&mut self, error: TypeError) { + self.errors.push(error); + } + + /// Reset the type checker state while retaining existing allocations. + pub fn clear(&mut self) { + self.errors.clear(); + } +} + +#[derive(Clone, Debug, PartialEq)] +pub enum TypeError { + MaximumUniverseLevelReached, + UnboundName(String), + DuplicateNamesInRecordType(Vec), + MissingNamesInRecordTerm(Vec), + UnexpectedNamesInRecordTerm(Vec), + AmbiguousSequence, + UnexpectedSequenceLength(usize, Arc), + ExpectedType(Value), + MismatchedTypes(Value, Value), +} + +/// Check that a term is a universe and return its level. +pub fn check_type(state: &mut State<'_>, term: &Term) -> Option { + match synth_term(state, term) { + Value::Universe(level) => Some(level), + r#type => { + state.report(TypeError::ExpectedType(r#type)); + None + } + } +} + +/// Check that a term matches the expected type. +pub fn check_term(state: &mut State<'_>, term: &Term, expected_type: &Value) { + match (term, expected_type) { + (Term::Sequence(entry_terms), Value::ArrayType(len, entry_type)) => { + for entry_term in entry_terms { + check_term(state, entry_term, entry_type); + } + match **len { + Value::Constant(Constant::U32(len)) if len as usize == entry_terms.len() => {} + _ => state.report(TypeError::UnexpectedSequenceLength( + entry_terms.len(), + len.clone(), + )), + } + } + (Term::Sequence(entry_terms), Value::ListType(entry_type)) => { + for entry_term in entry_terms { + check_term(state, entry_term, entry_type); + } + } + (Term::RecordTerm(term_entries), Value::RecordType(type_entries)) => { + let mut missing_names = Vec::new(); + let mut term_entries = term_entries.clone(); + + for (name, r#type) in type_entries { + match term_entries.remove(name) { + Some(term) => check_term(state, &term, r#type), + None => missing_names.push(name.clone()), + } + } + + if !missing_names.is_empty() { + state.report(TypeError::MissingNamesInRecordTerm(missing_names)); + } + if !term_entries.is_empty() { + let unexpected_names = (term_entries.into_iter()) + .map(|(name, _)| name.to_owned()) + .collect(); + state.report(TypeError::UnexpectedNamesInRecordTerm(unexpected_names)); + } + } + (term, expected_type) => match synth_term(state, term) { + ty if semantics::is_subtype(&ty, expected_type) => {} + ty => state.report(TypeError::MismatchedTypes(ty, expected_type.clone())), + }, + } +} + +/// Synthesize the type of a term. +pub fn synth_term(state: &mut State<'_>, term: &Term) -> Value { + match term { + Term::Universe(level) => match *level + UniverseOffset(1) { + Some(level) => Value::universe(level), + None => { + state.report(TypeError::MaximumUniverseLevelReached); + Value::Error + } + }, + Term::Global(name) => match state.globals.get(name) { + Some((r#type, _)) => semantics::eval_term(state.globals, &mut state.locals, r#type), + None => { + state.report(TypeError::UnboundName(name.to_owned())); + Value::Error + } + }, + Term::Constant(constant) => match constant { + Constant::U8(_) => Value::global("U8", 0, Value::universe(0)), + Constant::U16(_) => Value::global("U16", 0, Value::universe(0)), + Constant::U32(_) => Value::global("U32", 0, Value::universe(0)), + Constant::U64(_) => Value::global("U64", 0, Value::universe(0)), + Constant::S8(_) => Value::global("S8", 0, Value::universe(0)), + Constant::S16(_) => Value::global("S16", 0, Value::universe(0)), + Constant::S32(_) => Value::global("S32", 0, Value::universe(0)), + Constant::S64(_) => Value::global("S64", 0, Value::universe(0)), + Constant::F32(_) => Value::global("F32", 0, Value::universe(0)), + Constant::F64(_) => Value::global("F64", 0, Value::universe(0)), + Constant::Char(_) => Value::global("Char", 0, Value::universe(0)), + Constant::String(_) => Value::global("String", 0, Value::universe(0)), + }, + Term::Sequence(_) => { + state.report(TypeError::AmbiguousSequence); + Value::Error + } + Term::Ann(term, r#type) => { + check_type(state, r#type); + let r#type = semantics::eval_term(state.globals, &mut state.locals, r#type); + check_term(state, term, &r#type); + r#type + } + Term::RecordTerm(term_entries) => { + let type_entries = term_entries + .iter() + .map(|(name, term)| (name.clone(), Arc::new(synth_term(state, term)))) + .collect(); + + Value::RecordType(type_entries) + } + Term::RecordType(type_entries) => { + use std::collections::BTreeSet; + + let mut max_level = UniverseLevel(0); + let mut duplicate_names = Vec::new(); + let mut seen_names = BTreeSet::new(); + + for (name, r#type) in type_entries { + if !seen_names.insert(name) { + duplicate_names.push(name.clone()); + } + max_level = match check_type(state, r#type) { + Some(level) => std::cmp::max(max_level, level), + None => return Value::Error, + }; + } + + if !duplicate_names.is_empty() { + state.report(TypeError::DuplicateNamesInRecordType(duplicate_names)); + } + + Value::Universe(max_level) + } + Term::ArrayType(len, entry_type) => { + let u32_type = Value::global("U32", 0, Value::universe(0)); + check_term(state, len, &u32_type); + let level = check_type(state, entry_type); + + match level { + Some(level) => Value::Universe(level), + None => Value::Error, + } + } + Term::ListType(entry_type) => { + let level = check_type(state, entry_type); + + match level { + Some(level) => Value::Universe(level), + None => Value::Error, + } + } + Term::Lift(term, shift) => match state.locals.universe_offset() + *shift { + Some(lifted_level) => { + let offset = state.locals.set_universe_offset(lifted_level); + let r#type = synth_term(state, term); + state.locals.set_universe_offset(offset); + r#type + } + None => { + state.report(TypeError::MaximumUniverseLevelReached); + Value::Error + } + }, + Term::Error => Value::Error, + } +} diff --git a/src/lib.rs b/src/lib.rs new file mode 100644 index 000000000..b640e7943 --- /dev/null +++ b/src/lib.rs @@ -0,0 +1,4 @@ +//! A simple language. + +pub mod core; +pub mod surface; diff --git a/src/surface/grammar.lalrpop b/src/surface/grammar.lalrpop new file mode 100644 index 000000000..34dd8a298 --- /dev/null +++ b/src/surface/grammar.lalrpop @@ -0,0 +1,47 @@ +use crate::surface::{Term, Literal}; + +grammar; + +pub Term: Term<&'input str> = { + TermAtomic, + "Array" => Term::ArrayType(start..end, Box::new(arg0), Box::new(arg1)), + "List" => Term::ListType(start..end, Box::new(arg)), + ":" => Term::Ann(Box::new(term), Box::new(ty)), +}; + +TermAtomic: Term<&'input str> = { + "(" ")" => term, + => Term::Name(start..end, name), + => Term::Literal(start..end, literal), + "[" > "]" => Term::Sequence(start..end, entries), + "Record" "{" > "}" => Term::RecordType(start..end, entries), + "record" "{" > "}" => Term::RecordTerm(start..end, entries), + => { + Term::Lift(start..end, Box::new(term), shift[1..].parse().unwrap()) // FIXME: Overflow! + }, +}; + +List: Vec = { + ",")*> => { + entries.extend(last); + entries + } +} + +TypeEntry: (&'input str, Term<&'input str>) = { + ":" => (<>), +}; + +TermEntry: (&'input str, Term<&'input str>) = { + "=" => (<>), +}; + +Name: &'input str = { + r"[a-zA-Z][a-zA-Z0-9\-]*" => <>, +}; + +Literal: Literal<&'input str> = { + r#"'(.|\\"|\\')*'"# => Literal::Char(<>), + r#""(.|\\"|\\')*""# => Literal::String(<>), + r"[-+]?[0-9]+(\.[0-9]+)?" => Literal::Number(<>), +}; diff --git a/src/surface/mod.rs b/src/surface/mod.rs new file mode 100644 index 000000000..f4007a22a --- /dev/null +++ b/src/surface/mod.rs @@ -0,0 +1,67 @@ +//! The surface language. +//! +//! This is a user-friendly concrete syntax for the language. + +use std::ops::Range; + +pub mod projections; + +mod grammar { + include!(concat!(env!("OUT_DIR"), "/surface/grammar.rs")); +} + +pub enum Term { + /// Names. + Name(Range, S), + /// Annotated terms. + Ann(Box>, Box>), + /// Literals. + Literal(Range, Literal), + /// Ordered sequences. + Sequence(Range, Vec>), + /// Record types. + RecordType(Range, Vec<(S, Term)>), + /// Record terms. + RecordTerm(Range, Vec<(S, Term)>), + /// Array types. + ArrayType(Range, Box>, Box>), + /// List types. + ListType(Range, Box>), + /// Lift a term by the given number of universe levels. + Lift(Range, Box>, u32), + /// Error sentinel. + Error(Range), +} + +type ParseError<'input> = lalrpop_util::ParseError, &'static str>; + +impl<'input> Term<&'input str> { + pub fn from_str(input: &'input str) -> Result, ParseError<'input>> { + grammar::TermParser::new().parse(input) + } + + pub fn span(&self) -> Range { + match self { + Term::Name(span, _) + | Term::Literal(span, _) + | Term::Sequence(span, _) + | Term::RecordType(span, _) + | Term::RecordTerm(span, _) + | Term::ArrayType(span, _, _) + | Term::ListType(span, _) + | Term::Lift(span, _, _) + | Term::Error(span) => span.clone(), + Term::Ann(term, r#type) => term.span().start..r#type.span().end, + } + } +} + +/// Literals. +pub enum Literal { + /// Character literals. + Char(S), + /// String literals. + String(S), + /// Numeric literals. + Number(S), +} diff --git a/src/surface/projections/core.rs b/src/surface/projections/core.rs new file mode 100644 index 000000000..829d6394b --- /dev/null +++ b/src/surface/projections/core.rs @@ -0,0 +1,378 @@ +//! Elaborates the surface language into the core language. + +use std::str::FromStr; +use std::sync::Arc; + +use crate::core; +use crate::surface::{Literal, Term}; + +/// The state of the elaborator. +pub struct State<'me> { + globals: &'me core::Globals, + locals: core::Locals, + pub errors: Vec, +} + +impl<'me> State<'me> { + /// Construct a new elaborator state. + pub fn new(globals: &'me core::Globals) -> State<'me> { + State { + globals, + locals: core::Locals::new(), + errors: Vec::new(), + } + } + + /// Report an error. + pub fn report(&mut self, error: TypeError) { + self.errors.push(error); + } + + /// Reset the elaborator state while retaining existing allocations. + pub fn clear(&mut self) { + self.errors.clear(); + } +} + +#[derive(Clone, Debug, PartialEq)] +pub enum TypeError { + MaximumUniverseLevelReached, + UnboundName(String), + DuplicateNamesInRecordTerm(Vec), + DuplicateNamesInRecordType(Vec), + MissingNamesInRecordTerm(Vec), + UnexpectedNamesInRecordTerm(Vec), + InvalidNumberLiteral, + InvalidCharLiteral, + InvalidStringLiteral, + NoLiteralConversion(core::Value), + AmbiguousLiteral, + AmbiguousSequence, + UnexpectedSequenceLength(usize, Arc), + ExpectedType(core::Value), + MismatchedTypes(core::Value, core::Value), +} + +/// Check that a term is a universe and return its level. +pub fn check_type>( + state: &mut State<'_>, + term: &Term, +) -> (core::Term, Option) { + match synth_term(state, term) { + (term, core::Value::Universe(level)) => (term, Some(level)), + (_, r#type) => { + state.report(TypeError::ExpectedType(r#type)); + (core::Term::Error, None) + } + } +} + +/// Check that a term matches the expected type. +pub fn check_term>( + state: &mut State<'_>, + term: &Term, + expected_type: &core::Value, +) -> core::Term { + match (term, expected_type) { + (Term::Literal(_, literal), _) => check_literal(state, literal, expected_type), + (Term::Sequence(_, entry_terms), core::Value::ArrayType(len, core_entry_type)) => { + let core_entry_terms = entry_terms + .iter() + .map(|entry_term| Arc::new(check_term(state, entry_term, core_entry_type))) + .collect(); + + match **len { + core::Value::Constant(core::Constant::U32(len)) + if len as usize == entry_terms.len() => + { + core::Term::Sequence(core_entry_terms) + } + _ => { + state.report(TypeError::UnexpectedSequenceLength( + entry_terms.len(), + len.clone(), + )); + + core::Term::Error + } + } + } + (Term::Sequence(_, entry_terms), core::Value::ListType(core_entry_type)) => { + core::Term::Sequence( + entry_terms + .iter() + .map(|entry_term| Arc::new(check_term(state, entry_term, core_entry_type))) + .collect(), + ) + } + (Term::RecordTerm(_, term_entries), core::Value::RecordType(core_type_entries)) => { + use std::collections::btree_map::Entry; + use std::collections::BTreeMap; + + let mut duplicate_names = Vec::new(); + let mut missing_names = Vec::new(); + let mut term_entries = + (term_entries.iter()).fold(BTreeMap::new(), |mut acc, (name, term)| { + match acc.entry(name.as_ref()) { + Entry::Vacant(entry) => drop(entry.insert(term)), + Entry::Occupied(_) => duplicate_names.push(name.as_ref().to_owned()), + } + acc + }); + let mut core_term_entries = BTreeMap::new(); + + for (name, core_type) in core_type_entries { + match term_entries.remove(&name.as_str()) { + Some(term) => { + let core_term = Arc::new(check_term(state, term, core_type)); + core_term_entries.insert(name.clone(), core_term); + } + None => missing_names.push(name.clone()), + } + } + + if !duplicate_names.is_empty() { + state.report(TypeError::DuplicateNamesInRecordTerm(duplicate_names)); + } + if !missing_names.is_empty() { + state.report(TypeError::MissingNamesInRecordTerm(missing_names)); + } + if !term_entries.is_empty() { + let unexpected_names = (term_entries.into_iter()) + .map(|(name, _)| name.to_owned()) + .collect(); + state.report(TypeError::UnexpectedNamesInRecordTerm(unexpected_names)); + } + + core::Term::RecordTerm(core_term_entries) + } + (term, expected_type) => match synth_term(state, term) { + (term, ty) if core::semantics::is_subtype(&ty, expected_type) => term, + (_, ty) => { + state.report(TypeError::MismatchedTypes(ty, expected_type.clone())); + core::Term::Error + } + }, + } +} + +/// Synthesize the type of a term. +pub fn synth_term>( + state: &mut State<'_>, + term: &Term, +) -> (core::Term, core::Value) { + use std::collections::{BTreeMap, BTreeSet}; + + match term { + Term::Name(_, name) => match state.globals.get(name.as_ref()) { + Some((r#type, _)) => ( + core::Term::Global(name.as_ref().to_owned()).lift(state.locals.universe_offset()), + core::semantics::eval_term(state.globals, &mut state.locals, r#type), + ), + None => { + state.report(TypeError::UnboundName(name.as_ref().to_owned())); + (core::Term::Error, core::Value::Error) + } + }, + Term::Ann(term, r#type) => { + let (core_type, _) = check_type(state, r#type); + let core_type_value = + core::semantics::eval_term(state.globals, &mut state.locals, &core_type); + let core_term = check_term(state, term, &core_type_value); + ( + core::Term::Ann(Arc::new(core_term), Arc::new(core_type.clone())), + core_type_value, + ) + } + Term::Literal(_, literal) => synth_literal(state, literal), + Term::Sequence(_, _) => { + state.report(TypeError::AmbiguousSequence); + (core::Term::Error, core::Value::Error) + } + Term::RecordTerm(_, term_entries) => { + let mut duplicate_names = Vec::new(); + let mut core_term_entries = BTreeMap::new(); + let mut core_type_entries = Vec::new(); + + for (name, term) in term_entries { + use std::collections::btree_map::Entry; + + let (term, r#type) = synth_term(state, term); + + match core_term_entries.entry(name.as_ref().to_owned()) { + Entry::Occupied(_) => duplicate_names.push(name.as_ref().to_owned()), + Entry::Vacant(entry) => { + entry.insert(Arc::new(term)); + core_type_entries.push((name.as_ref().to_owned(), Arc::new(r#type))); + } + } + } + + if !duplicate_names.is_empty() { + state.report(TypeError::DuplicateNamesInRecordTerm(duplicate_names)); + } + + ( + core::Term::RecordTerm(core_term_entries), + core::Value::RecordType(core_type_entries), + ) + } + Term::RecordType(_, type_entries) => { + let mut max_level = core::UniverseLevel(0); + let mut duplicate_names = Vec::new(); + let mut seen_names = BTreeSet::new(); + let mut core_type_entries = Vec::new(); + + for (name, r#type) in type_entries { + if seen_names.insert(name.as_ref()) { + let (core_type, level) = check_type(state, r#type); + max_level = match level { + Some(level) => std::cmp::max(max_level, level), + None => return (core::Term::Error, core::Value::Error), + }; + core_type_entries.push((name.as_ref().to_owned(), Arc::new(core_type))); + } else { + duplicate_names.push(name.as_ref().to_owned()); + check_type(state, r#type); + } + } + + if !duplicate_names.is_empty() { + state.report(TypeError::DuplicateNamesInRecordType(duplicate_names)); + } + + ( + core::Term::RecordType(core_type_entries), + core::Value::Universe(max_level), + ) + } + Term::ArrayType(_, len, entry_type) => { + let u32_type = core::Value::global("U32", 0, core::Value::universe(0)); + let core_len = Arc::new(check_term(state, len, &u32_type)); + let (core_entry_type, level) = check_type(state, entry_type); + + match level { + Some(level) => ( + core::Term::ArrayType(core_len, Arc::new(core_entry_type)), + core::Value::Universe(level), + ), + None => (core::Term::Error, core::Value::Error), + } + } + Term::ListType(_, entry_type) => { + let (core_entry_type, level) = check_type(state, entry_type); + + match level { + Some(level) => ( + core::Term::ListType(Arc::new(core_entry_type)), + core::Value::Universe(level), + ), + None => (core::Term::Error, core::Value::Error), + } + } + Term::Lift(_, term, offset) => { + match state.locals.universe_offset() + core::UniverseOffset(*offset) { + Some(lifted_level) => { + let previous_level = state.locals.set_universe_offset(lifted_level); + let (core_term, r#type) = synth_term(state, term); + state.locals.set_universe_offset(previous_level); + (core_term, r#type) + } + None => { + state.report(TypeError::MaximumUniverseLevelReached); + (core::Term::Error, core::Value::Error) + } + } + } + Term::Error(_) => (core::Term::Error, core::Value::Error), + } +} + +/// Check that a literal matches the expected type. +fn check_literal>( + state: &mut State<'_>, + literal: &Literal, + expected_type: &core::Value, +) -> core::Term { + if let core::Value::Neutral(core::Neutral::Global(name, _), _) = expected_type { + match (literal, name.as_ref()) { + (Literal::Number(data), "U8") => parse_number(state, data, core::Constant::U8), + (Literal::Number(data), "U16") => parse_number(state, data, core::Constant::U16), + (Literal::Number(data), "U32") => parse_number(state, data, core::Constant::U32), + (Literal::Number(data), "U64") => parse_number(state, data, core::Constant::U64), + (Literal::Number(data), "S8") => parse_number(state, data, core::Constant::S8), + (Literal::Number(data), "S16") => parse_number(state, data, core::Constant::S16), + (Literal::Number(data), "S32") => parse_number(state, data, core::Constant::S32), + (Literal::Number(data), "S64") => parse_number(state, data, core::Constant::S64), + (Literal::Number(data), "F32") => parse_number(state, data, core::Constant::F32), + (Literal::Number(data), "F64") => parse_number(state, data, core::Constant::F64), + (Literal::Char(data), "Char") => parse_char(state, data), + (Literal::String(data), "String") => parse_string(state, data), + (_, _) => { + state.report(TypeError::NoLiteralConversion(expected_type.clone())); + core::Term::Error + } + } + } else { + state.report(TypeError::NoLiteralConversion(expected_type.clone())); + core::Term::Error + } +} + +/// Check that a literal matches the expected type. +fn synth_literal>( + state: &mut State<'_>, + literal: &Literal, +) -> (core::Term, core::Value) { + match literal { + Literal::Number(_) => { + state.report(TypeError::AmbiguousLiteral); + (core::Term::Error, core::Value::Error) + } + Literal::Char(data) => ( + parse_char(state, data), + core::Value::global("Char", 0, core::Value::universe(0)), + ), + Literal::String(data) => ( + parse_string(state, data), + core::Value::global("String", 0, core::Value::universe(0)), + ), + } +} + +fn parse_number, T: FromStr>( + state: &mut State<'_>, + data: &S, + f: impl Fn(T) -> core::Constant, +) -> core::Term { + // TODO: improve parser (eg. numeric separators, positive sign) + match data.as_ref().parse() { + Ok(value) => core::Term::Constant(f(value)), + Err(_) => { + state.report(TypeError::InvalidNumberLiteral); + core::Term::Error + } + } +} + +fn parse_char>(state: &mut State<'_>, data: &S) -> core::Term { + // TODO: Improve parser (escapes) + match data.as_ref().chars().nth(1) { + Some(value) => core::Term::Constant(core::Constant::Char(value)), + None => { + state.report(TypeError::InvalidCharLiteral); + core::Term::Error + } + } +} + +fn parse_string>(state: &mut State<'_>, data: &S) -> core::Term { + // TODO: Improve parser (escapes) + match data.as_ref().get(1..data.as_ref().len() - 1) { + Some(value) => core::Term::Constant(core::Constant::String(value.to_owned())), + None => { + state.report(TypeError::InvalidStringLiteral); + core::Term::Error + } + } +} diff --git a/src/surface/projections/mod.rs b/src/surface/projections/mod.rs new file mode 100644 index 000000000..399ada48f --- /dev/null +++ b/src/surface/projections/mod.rs @@ -0,0 +1,4 @@ +//! Projections from the surface language into other forms. + +pub mod core; +pub mod pretty; diff --git a/src/surface/projections/pretty.rs b/src/surface/projections/pretty.rs new file mode 100644 index 000000000..6c99b28af --- /dev/null +++ b/src/surface/projections/pretty.rs @@ -0,0 +1,121 @@ +//! Pretty prints the surface language to a textual form. + +use pretty::{DocAllocator, DocBuilder}; + +use crate::surface::{Literal, Term}; + +pub fn pretty_term<'term, D, S>(alloc: &'term D, term: &'term Term) -> DocBuilder<'term, D> +where + S: 'term, + &'term S: ToString, + D: DocAllocator<'term>, + D::Doc: Clone, +{ + match term { + Term::Name(_, name) => alloc.as_string(name), + Term::Ann(term, r#type) => (alloc.nil()) + .append(pretty_term(alloc, term)) + .append(alloc.space()) + .append(":") + .append( + (alloc.space()) + .append(pretty_term(alloc, r#type)) + .group() + .nest(4), + ), + Term::Literal(_, literal) => pretty_literal(alloc, literal), + Term::Sequence(_, term_entries) => (alloc.nil()) + .append("[") + .group() + .append(alloc.intersperse( + term_entries.iter().map(|term| { + (alloc.space()) + .append(pretty_term(alloc, term)) + .group() + .nest(4) + }), + alloc.text(",").append(alloc.space()), + )) + .append("]"), + Term::RecordType(_, ty_entries) => (alloc.nil()) + .append("Record") + .append(alloc.space()) + .append("{") + .group() + .append(alloc.concat(ty_entries.iter().map(|(name, r#type)| { + (alloc.nil()) + .append(alloc.hardline()) + .append(alloc.as_string(name)) + .append(":") + .append( + (alloc.space()) + .append(pretty_term(alloc, r#type)) + .append(",") + .group() + .nest(4), + ) + .nest(4) + .group() + }))) + .append("}"), + Term::RecordTerm(_, term_entries) => (alloc.nil()) + .append("record") + .append(alloc.space()) + .append("{") + .group() + .append(alloc.concat(term_entries.iter().map(|(name, term)| { + (alloc.nil()) + .append(alloc.hardline()) + .append(alloc.as_string(name)) + .append("=") + .append( + (alloc.space()) + .append(pretty_term(alloc, term)) + .append(",") + .group() + .nest(4), + ) + .nest(4) + .group() + }))) + .append("}"), + Term::ArrayType(_, len, entry_type) => alloc.text("Array").append( + (alloc.nil()) + .append(alloc.space()) + .append(pretty_term(alloc, len)) + .append(alloc.space()) + .append(pretty_term(alloc, entry_type)) + .group() + .nest(4), + ), + Term::ListType(_, entry_type) => alloc.text("List").append( + (alloc.nil()) + .append(alloc.space()) + .append(pretty_term(alloc, entry_type)) + .group() + .nest(4), + ), + Term::Lift(_, term, shift) => (alloc.nil()) + .append(pretty_term(alloc, term)) + .append("^") + .append(shift.to_string()), + Term::Error(_) => alloc.text("!"), + } +} + +pub fn pretty_literal<'term, D, S>( + alloc: &'term D, + literal: &'term Literal, +) -> DocBuilder<'term, D> +where + S: 'term, + &'term S: ToString, + D: DocAllocator<'term>, + D::Doc: Clone, +{ + match literal { + Literal::Char(text) | Literal::String(text) | Literal::Number(text) => { + alloc.as_string(text) + } + } +} diff --git a/tests/samples.rs b/tests/samples.rs new file mode 100644 index 000000000..6b38e0411 --- /dev/null +++ b/tests/samples.rs @@ -0,0 +1,72 @@ +//! Integration tests against the language samples directory. + +use pikelet::{core, surface}; + +fn run_test(input: &str) { + let mut is_failed = false; + + let surface_term = surface::Term::from_str(input).unwrap(); + + let globals = core::Globals::default(); + let mut state = surface::projections::core::State::new(&globals); + let (core_term, r#type) = surface::projections::core::synth_term(&mut state, &surface_term); + if !state.errors.is_empty() { + is_failed = true; + eprintln!("surface::projections::core::synth_term errors:"); + for error in state.errors { + eprintln!(" {:?}", error); + } + eprintln!(); + } + + eprintln!("{:?}", core_term); + eprintln!("{:?}", r#type); + + let mut state = core::typing::State::new(&globals); + core::typing::synth_term(&mut state, &core_term); + if !state.errors.is_empty() { + is_failed = true; + eprintln!("core::typing::synth_term errors:"); + for error in state.errors { + eprintln!(" {:?}", error); + } + eprintln!(); + } + + let mut state = core::typing::State::new(&globals); + core::typing::check_term(&mut state, &core_term, &r#type); + if !state.errors.is_empty() { + is_failed = true; + eprintln!("core::typing::check_term errors:"); + for error in state.errors { + eprintln!(" {:?}", error); + } + eprintln!(); + } + + eprintln!("{:?}", r#type); + + if is_failed { + panic!("failed sample"); + } +} + +#[test] +fn cube() { + run_test(include_str!("../samples/cube.pi")); +} + +#[test] +fn hello_world() { + run_test(include_str!("../samples/hello-world.pi")); +} + +#[test] +fn universes() { + run_test(include_str!("../samples/universes.pi")); +} + +#[test] +fn window_settings() { + run_test(include_str!("../samples/window-settings.pi")); +} From cf249061768cab0a8e993a58947ac7a13119b10c Mon Sep 17 00:00:00 2001 From: Brendan Zabarauskas Date: Fri, 3 Jan 2020 01:07:34 +1100 Subject: [PATCH 02/88] Collapse roadmap by default --- README.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/README.md b/README.md index 72fa501f4..5b0b42aaf 100644 --- a/README.md +++ b/README.md @@ -18,6 +18,9 @@ support for [projectional editing][structure-editor-wikipedia] in the future. [dhall]: https://dhall-lang.org/ [structure-editor-wikipedia]: https://en.wikipedia.org/wiki/Structure_editor +
+ Full Roadmap + ### Language - Basic config language @@ -108,3 +111,5 @@ support for [projectional editing][structure-editor-wikipedia] in the future. - [ ] References - [ ] Papers - [ ] Languages + +
From 4c96829753f0b02c969592c999e6de7760555881 Mon Sep 17 00:00:00 2001 From: Brendan Zabarauskas Date: Fri, 3 Jan 2020 01:16:13 +1100 Subject: [PATCH 03/88] Add stub crates --- README.md | 1 + {samples => examples}/cube.pi | 0 {samples => examples}/hello-world.pi | 0 {samples => examples}/universes.pi | 0 {samples => examples}/window-settings.pi | 0 pikelet-cli/Cargo.toml | 13 +++++++++++++ pikelet-cli/README.md | 1 + pikelet-cli/src/main.rs | 3 +++ pikelet-gui/Cargo.toml | 13 +++++++++++++ pikelet-gui/src/main.rs | 3 +++ Cargo.toml => pikelet/Cargo.toml | 4 +++- pikelet/README.md | 3 +++ build.rs => pikelet/build.rs | 0 {src => pikelet/src}/core/mod.rs | 0 {src => pikelet/src}/core/projections/mod.rs | 0 {src => pikelet/src}/core/projections/pretty.rs | 0 {src => pikelet/src}/core/projections/surface.rs | 0 {src => pikelet/src}/core/semantics.rs | 0 {src => pikelet/src}/core/typing.rs | 0 {src => pikelet/src}/lib.rs | 0 {src => pikelet/src}/surface/grammar.lalrpop | 0 {src => pikelet/src}/surface/mod.rs | 0 {src => pikelet/src}/surface/projections/core.rs | 0 {src => pikelet/src}/surface/projections/mod.rs | 0 {src => pikelet/src}/surface/projections/pretty.rs | 0 tests/samples.rs => pikelet/tests/examples.rs | 8 ++++---- 26 files changed, 44 insertions(+), 5 deletions(-) rename {samples => examples}/cube.pi (100%) rename {samples => examples}/hello-world.pi (100%) rename {samples => examples}/universes.pi (100%) rename {samples => examples}/window-settings.pi (100%) create mode 100644 pikelet-cli/Cargo.toml create mode 100644 pikelet-cli/README.md create mode 100644 pikelet-cli/src/main.rs create mode 100644 pikelet-gui/Cargo.toml create mode 100644 pikelet-gui/src/main.rs rename Cargo.toml => pikelet/Cargo.toml (63%) create mode 100644 pikelet/README.md rename build.rs => pikelet/build.rs (100%) rename {src => pikelet/src}/core/mod.rs (100%) rename {src => pikelet/src}/core/projections/mod.rs (100%) rename {src => pikelet/src}/core/projections/pretty.rs (100%) rename {src => pikelet/src}/core/projections/surface.rs (100%) rename {src => pikelet/src}/core/semantics.rs (100%) rename {src => pikelet/src}/core/typing.rs (100%) rename {src => pikelet/src}/lib.rs (100%) rename {src => pikelet/src}/surface/grammar.lalrpop (100%) rename {src => pikelet/src}/surface/mod.rs (100%) rename {src => pikelet/src}/surface/projections/core.rs (100%) rename {src => pikelet/src}/surface/projections/mod.rs (100%) rename {src => pikelet/src}/surface/projections/pretty.rs (100%) rename tests/samples.rs => pikelet/tests/examples.rs (87%) diff --git a/README.md b/README.md index 5b0b42aaf..a8a3f0613 100644 --- a/README.md +++ b/README.md @@ -76,6 +76,7 @@ support for [projectional editing][structure-editor-wikipedia] in the future. - [ ] REPL - [ ] Package manager - [ ] Auto-formatter for surface language +- [ ] Structured editor ### Testing diff --git a/samples/cube.pi b/examples/cube.pi similarity index 100% rename from samples/cube.pi rename to examples/cube.pi diff --git a/samples/hello-world.pi b/examples/hello-world.pi similarity index 100% rename from samples/hello-world.pi rename to examples/hello-world.pi diff --git a/samples/universes.pi b/examples/universes.pi similarity index 100% rename from samples/universes.pi rename to examples/universes.pi diff --git a/samples/window-settings.pi b/examples/window-settings.pi similarity index 100% rename from samples/window-settings.pi rename to examples/window-settings.pi diff --git a/pikelet-cli/Cargo.toml b/pikelet-cli/Cargo.toml new file mode 100644 index 000000000..04f91ea11 --- /dev/null +++ b/pikelet-cli/Cargo.toml @@ -0,0 +1,13 @@ +[package] +name = "pikelet-cli" +version = "0.1.0" +authors = ["Brendan Zabarauskas "] +edition = "2018" +publish = false +description = "Command line interface for interacting with the Pikelet programming language" +readme = "README.md" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +pikelet = { path = "../pikelet" } diff --git a/pikelet-cli/README.md b/pikelet-cli/README.md new file mode 100644 index 000000000..fe7aef009 --- /dev/null +++ b/pikelet-cli/README.md @@ -0,0 +1 @@ +# pikelet-cli diff --git a/pikelet-cli/src/main.rs b/pikelet-cli/src/main.rs new file mode 100644 index 000000000..e7a11a969 --- /dev/null +++ b/pikelet-cli/src/main.rs @@ -0,0 +1,3 @@ +fn main() { + println!("Hello, world!"); +} diff --git a/pikelet-gui/Cargo.toml b/pikelet-gui/Cargo.toml new file mode 100644 index 000000000..f2a61b625 --- /dev/null +++ b/pikelet-gui/Cargo.toml @@ -0,0 +1,13 @@ +[package] +name = "pikelet-gui" +version = "0.1.0" +authors = ["Brendan Zabarauskas "] +edition = "2018" +publish = false +description = "Graphical user interface for interacting with the Pikelet programming language" +readme = "README.md" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +pikelet = { path = "../pikelet" } diff --git a/pikelet-gui/src/main.rs b/pikelet-gui/src/main.rs new file mode 100644 index 000000000..e7a11a969 --- /dev/null +++ b/pikelet-gui/src/main.rs @@ -0,0 +1,3 @@ +fn main() { + println!("Hello, world!"); +} diff --git a/Cargo.toml b/pikelet/Cargo.toml similarity index 63% rename from Cargo.toml rename to pikelet/Cargo.toml index a793a9867..1f93f2dbc 100644 --- a/Cargo.toml +++ b/pikelet/Cargo.toml @@ -1,9 +1,11 @@ [package] name = "pikelet" version = "0.1.0" -authors = ["Brenda Zabarauskas"] +authors = ["Brendan Zabarauskas"] edition = "2018" publish = false +description = "The Pikelet programming language" +readme = "../README.md" [dependencies] lalrpop-util = "0.17" diff --git a/pikelet/README.md b/pikelet/README.md new file mode 100644 index 000000000..9330877e2 --- /dev/null +++ b/pikelet/README.md @@ -0,0 +1,3 @@ +# pikelet + +See the [top-level README](../README) for more information. diff --git a/build.rs b/pikelet/build.rs similarity index 100% rename from build.rs rename to pikelet/build.rs diff --git a/src/core/mod.rs b/pikelet/src/core/mod.rs similarity index 100% rename from src/core/mod.rs rename to pikelet/src/core/mod.rs diff --git a/src/core/projections/mod.rs b/pikelet/src/core/projections/mod.rs similarity index 100% rename from src/core/projections/mod.rs rename to pikelet/src/core/projections/mod.rs diff --git a/src/core/projections/pretty.rs b/pikelet/src/core/projections/pretty.rs similarity index 100% rename from src/core/projections/pretty.rs rename to pikelet/src/core/projections/pretty.rs diff --git a/src/core/projections/surface.rs b/pikelet/src/core/projections/surface.rs similarity index 100% rename from src/core/projections/surface.rs rename to pikelet/src/core/projections/surface.rs diff --git a/src/core/semantics.rs b/pikelet/src/core/semantics.rs similarity index 100% rename from src/core/semantics.rs rename to pikelet/src/core/semantics.rs diff --git a/src/core/typing.rs b/pikelet/src/core/typing.rs similarity index 100% rename from src/core/typing.rs rename to pikelet/src/core/typing.rs diff --git a/src/lib.rs b/pikelet/src/lib.rs similarity index 100% rename from src/lib.rs rename to pikelet/src/lib.rs diff --git a/src/surface/grammar.lalrpop b/pikelet/src/surface/grammar.lalrpop similarity index 100% rename from src/surface/grammar.lalrpop rename to pikelet/src/surface/grammar.lalrpop diff --git a/src/surface/mod.rs b/pikelet/src/surface/mod.rs similarity index 100% rename from src/surface/mod.rs rename to pikelet/src/surface/mod.rs diff --git a/src/surface/projections/core.rs b/pikelet/src/surface/projections/core.rs similarity index 100% rename from src/surface/projections/core.rs rename to pikelet/src/surface/projections/core.rs diff --git a/src/surface/projections/mod.rs b/pikelet/src/surface/projections/mod.rs similarity index 100% rename from src/surface/projections/mod.rs rename to pikelet/src/surface/projections/mod.rs diff --git a/src/surface/projections/pretty.rs b/pikelet/src/surface/projections/pretty.rs similarity index 100% rename from src/surface/projections/pretty.rs rename to pikelet/src/surface/projections/pretty.rs diff --git a/tests/samples.rs b/pikelet/tests/examples.rs similarity index 87% rename from tests/samples.rs rename to pikelet/tests/examples.rs index 6b38e0411..064ce376e 100644 --- a/tests/samples.rs +++ b/pikelet/tests/examples.rs @@ -53,20 +53,20 @@ fn run_test(input: &str) { #[test] fn cube() { - run_test(include_str!("../samples/cube.pi")); + run_test(include_str!("../../examples/cube.pi")); } #[test] fn hello_world() { - run_test(include_str!("../samples/hello-world.pi")); + run_test(include_str!("../../examples/hello-world.pi")); } #[test] fn universes() { - run_test(include_str!("../samples/universes.pi")); + run_test(include_str!("../../examples/universes.pi")); } #[test] fn window_settings() { - run_test(include_str!("../samples/window-settings.pi")); + run_test(include_str!("../../examples/window-settings.pi")); } From fd8432e1fbc6f268bf9086655d3e1572047a63ef Mon Sep 17 00:00:00 2001 From: Brendan Zabarauskas Date: Fri, 3 Jan 2020 12:44:57 +1100 Subject: [PATCH 04/88] Begin documenting Pikelet --- README.md | 15 --------------- docs/contributing.md | 8 ++++++++ docs/guide.md | 19 +++++++++++++++++++ docs/index.md | 21 +++++++++++++++++++++ docs/reference.md | 32 ++++++++++++++++++++++++++++++++ docs/specification.md | 16 ++++++++++++++++ 6 files changed, 96 insertions(+), 15 deletions(-) create mode 100644 docs/contributing.md create mode 100644 docs/guide.md create mode 100644 docs/index.md create mode 100644 docs/reference.md create mode 100644 docs/specification.md diff --git a/README.md b/README.md index a8a3f0613..d7794a145 100644 --- a/README.md +++ b/README.md @@ -98,19 +98,4 @@ support for [projectional editing][structure-editor-wikipedia] in the future. - [ ] Derive macro for generating marshalling trait implementations - [ ] More efficient, visitor based marshalling -### Documentation - -- [ ] Guide -- [ ] Specification - - [ ] Surface - - [ ] Syntax - - [ ] Elaboration - - [ ] Core - - [ ] Syntax - - [ ] Typing - - [ ] Operational semantics -- [ ] References - - [ ] Papers - - [ ] Languages - diff --git a/docs/contributing.md b/docs/contributing.md new file mode 100644 index 000000000..701460d7f --- /dev/null +++ b/docs/contributing.md @@ -0,0 +1,8 @@ +# Pikelet Contributing Guide + +Topics might include: + +- How to set up the development environment +- Code of conduct +- How to contribute to the language +- A reading list for those wanting to learn about the theory diff --git a/docs/guide.md b/docs/guide.md new file mode 100644 index 000000000..aff6f4ab6 --- /dev/null +++ b/docs/guide.md @@ -0,0 +1,19 @@ +# Pikelet Language Guide + +A guide for learning Pikelet. + +Topics that this guide might cover are: + +- motivation for Pikelet +- installation of tools +- first program +- data structures +- modular programming using functions records +- working with universes +- embedding Pikelet in another program +- compiling standalone Pikelet programs +- using Pikelet as a configuration language + +We should provide links to the corresponding [reference][reference] material where appropriate. + +[reference]: ./reference diff --git a/docs/index.md b/docs/index.md new file mode 100644 index 000000000..25c0b7dc5 --- /dev/null +++ b/docs/index.md @@ -0,0 +1,21 @@ +# Pikelet Documentation + +> **Note**: +> +> The documentation is still very much a work in progress, so there is not actually much here yet! + +This is where we will document the Pikelet programming language! +We'll aim to provide multiple levels of documentation for different purposes: + +- [Guide][guide]: For people new to the language +- [Reference][reference]: For people wanting to learn more about individual language features +- [Contibuting][contributing]: For people wanting to contribute to the language +- [Specification][specification]: For Pikelet developers and researchers + +[guide]: ./guide +[reference]: ./reference +[contributing]: ./contributing +[specification]: ./specification + +More sections might be added later, for example tutorials and cookbooks. + diff --git a/docs/reference.md b/docs/reference.md new file mode 100644 index 000000000..3ded469d0 --- /dev/null +++ b/docs/reference.md @@ -0,0 +1,32 @@ +# Pikelet Language Reference + +Reference-level documentation for the Pikelet programming language. +This will cover all language features, but not necessarily describe how they fit together. + +Topics might include: + +- records + - formation + - introduction + - elimination +- functions + - formation + - introduction + - elimination +- sequences + - lists + - arrays +- literals + - numbers + - strings + - characters +- builtin types +- universes + - cumulativity + - lifting operator +- references +- inspiration + +We should link each topic to the relevant places in the [specification][specification]. + +[specification]: ./specification diff --git a/docs/specification.md b/docs/specification.md new file mode 100644 index 000000000..3272732db --- /dev/null +++ b/docs/specification.md @@ -0,0 +1,16 @@ +# Pikelet Language Specification + +This will be where we give a comprehensive, formally described specification of the Pikelet programming language, including: + +- surface language + - lexical syntax + - grammar rules + - elaboration to the core language +- core language + - declarative typing rules + - operational semantics + - bidirectional type checking + - serialization format +- environment + +We may want to create some form of markup language for this, similar to OTT. From ddd382b88d9e743be9755581ad79078d6ca4ec9d Mon Sep 17 00:00:00 2001 From: Brendan Zabarauskas Date: Fri, 3 Jan 2020 12:48:04 +1100 Subject: [PATCH 05/88] Add a README for the example folder --- examples/README.md | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 examples/README.md diff --git a/examples/README.md b/examples/README.md new file mode 100644 index 000000000..f456f5411 --- /dev/null +++ b/examples/README.md @@ -0,0 +1,7 @@ +# Pikelet examples + +This directory includes a bunch of different example Pikelet programs. + +We make sure to ensure these are kept up-to-date in [`../pikelet/tests/examples.rs`]. + +[`../pikelet/tests/examples.rs`]: ../pikelet/tests/examples.rs From 3f47fc32ab1594d82d6f89e8887e9fb8c55d5791 Mon Sep 17 00:00:00 2001 From: Brendan Zabarauskas Date: Fri, 3 Jan 2020 13:06:46 +1100 Subject: [PATCH 06/88] Add a README for pikelet-gui --- pikelet-gui/README.md | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 pikelet-gui/README.md diff --git a/pikelet-gui/README.md b/pikelet-gui/README.md new file mode 100644 index 000000000..13ffdfbe0 --- /dev/null +++ b/pikelet-gui/README.md @@ -0,0 +1,28 @@ +# pikelet-gui + +This is intended to provided the basis for a structured programming environment for Pikelet. +It should both be natively compiled, be able to be run in a browser, or embedded in other applications, like game engines. + +While the hopes behind this are ambitious, we will need to proceed carefully, taking care to avoid getting trapped down rabbit holes. + +## Inspiration + +### Projects + +- [Alfa](http://www.cse.chalmers.se/~hallgren/Alfa/) +- [Dark](https://darklang.com/) +- [Eve](http://witheve.com/) +- [Factor](https://factorcode.org/) +- [fructure](https://github.com/disconcision/fructure) +- [Glamorous Toolkit](https://gtoolkit.com/) +- [Hazel](https://hazel.org/) +- [Livelits](https://github.com/hazelgrove/livelits-tyde/blob/master/livelits-tyde.pdf) +- [medit](https://github.com/molikto/medit) +- [MPS](https://www.jetbrains.com/mps/) +- [Pharo](https://pharo.org/) +- [Self](https://www.jetbrains.com/mps/) + +### Collections + +- [Visual Programming Codex](https://github.com/ivanreese/visual-programming-codex) +- [The Whole Code Catalog](https://futureofcoding.org/catalog/) From 6c8106394b4bd823920ddb19b32fbb729bf2b205 Mon Sep 17 00:00:00 2001 From: Brendan Zabarauskas Date: Fri, 3 Jan 2020 13:19:29 +1100 Subject: [PATCH 07/88] Fix spelling --- docs/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/index.md b/docs/index.md index 25c0b7dc5..9476561ba 100644 --- a/docs/index.md +++ b/docs/index.md @@ -9,7 +9,7 @@ We'll aim to provide multiple levels of documentation for different purposes: - [Guide][guide]: For people new to the language - [Reference][reference]: For people wanting to learn more about individual language features -- [Contibuting][contributing]: For people wanting to contribute to the language +- [Contributing][contributing]: For people wanting to contribute to the language - [Specification][specification]: For Pikelet developers and researchers [guide]: ./guide From 1d5800f77cc30c5616fd0cb53a83b189f4c059f7 Mon Sep 17 00:00:00 2001 From: Brendan Zabarauskas Date: Fri, 3 Jan 2020 13:42:05 +1100 Subject: [PATCH 08/88] Add license file for Pikelet --- LICENSE | 201 +++++++++++++++++++++++++++++++++++++++++ pikelet-cli/Cargo.toml | 3 + pikelet-gui/Cargo.toml | 3 + pikelet/Cargo.toml | 5 + 4 files changed, 212 insertions(+) create mode 100644 LICENSE diff --git a/LICENSE b/LICENSE new file mode 100644 index 000000000..8dada3eda --- /dev/null +++ b/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright {yyyy} {name of copyright owner} + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/pikelet-cli/Cargo.toml b/pikelet-cli/Cargo.toml index 04f91ea11..c05e0e8f3 100644 --- a/pikelet-cli/Cargo.toml +++ b/pikelet-cli/Cargo.toml @@ -6,6 +6,9 @@ edition = "2018" publish = false description = "Command line interface for interacting with the Pikelet programming language" readme = "README.md" +homepage = "https://github.com/pikelet-lang/pikelet" +repository = "https://github.com/pikelet-lang/pikelet" +license = "Apache-2.0" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/pikelet-gui/Cargo.toml b/pikelet-gui/Cargo.toml index f2a61b625..c60fa89a1 100644 --- a/pikelet-gui/Cargo.toml +++ b/pikelet-gui/Cargo.toml @@ -6,6 +6,9 @@ edition = "2018" publish = false description = "Graphical user interface for interacting with the Pikelet programming language" readme = "README.md" +homepage = "https://github.com/pikelet-lang/pikelet" +repository = "https://github.com/pikelet-lang/pikelet" +license = "Apache-2.0" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/pikelet/Cargo.toml b/pikelet/Cargo.toml index 1f93f2dbc..7be89ef7e 100644 --- a/pikelet/Cargo.toml +++ b/pikelet/Cargo.toml @@ -6,6 +6,11 @@ edition = "2018" publish = false description = "The Pikelet programming language" readme = "../README.md" +homepage = "https://github.com/pikelet-lang/pikelet" +repository = "https://github.com/pikelet-lang/pikelet" +license = "Apache-2.0" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] lalrpop-util = "0.17" From 50d7ac497fd3eaf79637ec7684d79f6772320827 Mon Sep 17 00:00:00 2001 From: Brendan Zabarauskas Date: Fri, 3 Jan 2020 13:55:05 +1100 Subject: [PATCH 09/88] Port over existing project README --- README.md | 32 +++++++++++++++++++++++++++----- assets/pikelet.png | Bin 0 -> 16518 bytes 2 files changed, 27 insertions(+), 5 deletions(-) create mode 100644 assets/pikelet.png diff --git a/README.md b/README.md index d7794a145..fceb3f1ca 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,29 @@ -# Pikelet +# Pikelet! -A simple language. +![Pikelet Mascot][pikelet-mascot] -This is planned to meet the demands of the 'next version of Pikelet', as -described in [_Pondering the next version of Pikelet_][next-pikelet]. +[pikelet-mascot]: assets/pikelet.png -[next-pikelet]: https://gist.github.com/brendanzab/eba7015e6345abe79a57a704091820bb/. +[![Build Status][travis-badge]][travis-url] +[![Gitter][gitter-badge]][gitter-lobby] + +[travis-badge]: https://travis-ci.org/pikelet-lang/pikelet.svg?branch=master +[travis-url]: https://travis-ci.org/pikelet-lang/pikelet +[gitter-badge]: https://badges.gitter.im/pikelet-lang/pikelet.svg +[gitter-lobby]: https://gitter.im/pikelet-lang/Lobby + +Pikelet is a small, functional, dependently typed programming language. + +Dependent types allow us to do a bunch of really interesting things, like using +records for modules, declaring the length of arrays at the type level, and +much more — many of great utility for low-level and high-level code alike! + +We hope to one day grow Pikelet into fully-fledged systems programming language, +with support for unboxed data types, control over memory layout and allocation +strategy, linear types, and a flexible phase distinction and support for calling +other languages. At the moment however we've only implemented a type checker and +very slow interpreter, so don't get your hopes up too much yet! There's still a +whole lot to do before it is even remotely useful to anyone! 😅 ## Roadmap @@ -18,6 +36,10 @@ support for [projectional editing][structure-editor-wikipedia] in the future. [dhall]: https://dhall-lang.org/ [structure-editor-wikipedia]: https://en.wikipedia.org/wiki/Structure_editor +You can read more about what we hope to achieve in [_Pondering the next version of Pikelet_][next-pikelet]. + +[next-pikelet]: https://gist.github.com/brendanzab/eba7015e6345abe79a57a704091820bb/. +
Full Roadmap diff --git a/assets/pikelet.png b/assets/pikelet.png new file mode 100644 index 0000000000000000000000000000000000000000..a64b2d3d223511b33ef8c76171cdc94afe479289 GIT binary patch literal 16518 zcmeHuWmH_twr)dkf;$>Zo^xL$0VIdxz?s>x%0<@EN_Ai%je5W zFJ!^a^;4><)AF;Uhm#>9(uu)(zh~v~J)YNV6GGj}Gq+FoM-Nq1r7-Dr5< z1mCZVFg>x`?qB!%KTcMU*Dljmr9-8$ZZl^c)V!+iHpr81x->o2pUn&wZuj}|)bvbk zKYaaS(mE+dzQk2f^BImS z`H*&ByMzC&Zm!cF;hpJgz38#0`_1RWul~E|-$ifBT*c0gr7Cc=)aRIAn<;kRW5UDV z;?F#8J-j*baQp86QJXCIKD3pkcXMwKoh>Z8(Tr(gaIa2j++T-m_Nfy9VJbQ^Y_N{v=6$OcM5G5fh`8o<53#vADjSEv1g(Lv5_Oz2GWa+Bw4z0_pYri)sJe<~*FWcP; zC~_xF%TQ%IA6gY>JC!!taIN}|RyMD`8;Yy&tN&>;-$%rH8&?nPdaE`#{h;@h#<5m) z-7E*yE2B9+tSuiHtz{Mv6g!gUKvGyTMq|+>^@&uf4p^61AIvHVGXu}Een#dY#CD5v zx$FFsXoulhe>X$*wt6^2?XWBD!Da24)W(Njvi2jfTdwipF{G{UMg!V1D%I1>#EHL8 z;4eAsL$r`D1uc#BUj32c2dx9@pJ~Z%yL9~@{p0D~b{puD>rPLEAD5~$%cc`?ZVmYi6&zQ<=YTxs#;yXRVSM%QI`6b|iNr zvWf)0!pz77n;QtM%XeKwAbA&GGpq|*Ep);AYtJ#EFPU`IPK@SE#di*TLvkwSvBXCx4xr|&p}s) zAc9c8lRVLpgWuzhoD2I+wu$jPIl`21VWEab7uw)p-6W3h=F6q+cZ-muN8}&65*I((PcSqa z5DF~ zISx-DjNhap6G%enBk0kn8ZRGy_+mt))~>l}tj=UMMeGY`#S89@_K+}pBju3G&38owDJfb}JZ+kHWrf1#Kk!_R+Yq{G?~VxOu`y+=Q>>2H|a zw(DqaN{|B1H6tQ*ZHIUOsT%5&b2lsBR9SvZS0Obt?o4jXE>=Kh1BMk2q8r5m+8Yu%g>{dmVp}ucQ~Vy_c}g5XylW zkg3HFSYsI1jpwO^h@P!W2tQDxrC?G;IGv-ogK=3J&rza0D`ai-RJPsFiw*w-vmK2C z8%P+uJSv63YYy>7)0?nW3>yyUEGZb{duWhz>O^(<#493qC@mt%#957fG4Z(Y#y!n! ziBJD555FhjqhsyXYaGCwvzj{t*}XR`{U;T24)UIdj339Fd{FXbRmGz?sy1w|^zq-y z9>`|_!@X79`la=pIeR>t5W;*@Zt=~-BGK=l)aT$i&PhzyE((hasCSK%um?=XmPynw zcGhrEm2l58YSyBU+1b~PpL+<%2u&VF$KHvhUrD4dQuww`uJZrBy=#ZNM;g@V_&sH#}LPp%*08i z!mmH1e(|HWR`q%#Exb>Jp#bgRI{<3fU z9?bgZIr!n>TGqjYo}xJ&=t2Rkq@ldlO^}!z(@3fCc^4NYQn*sbFhz~Ktj-W^n*yp_ zGKpkcP(O|i#DZlmR`X9LNXpJh1gv(^xafEi_-1tn=gZleKxL3jY?MPu2QA>e5e5gU z%plSj-UiCqwkQEWHvq8mt?D5s2I5DV1KyYF#nbJz4QOrqM1%koF*SJy`N>pz}V(!sCk%zp>VUQ?}l1n%%+FK02)sd$1NTm3!7*w>@$i*rmAShR)pBw4{);LI9 zxKv|n1;VmxKW?B>0DIAXr6IhZQH9?EA`zaAu`S1?om(+f3AhXYMp%tix|GXwqhp^` z{Bvy=8C)9G>p?qQX<-|qpZh;K=(dt!PFF|hlduRxy~>dq6HSIknw%amS?3)^O=5Qm zb&NmDsB&SclFGs^@TuuzLn4GU-Md>(MUm#HQ#*w}?yhMDBF>0hV0&1IyAfm*67J(v zBK#_bv?MCYOb~;Ez->#H6;z1kOjutOhV=9-+fhfDtHUpd*p@S;|I9}u!K8D)i(m?2IXq`>n&_bO*oP*~ z7FQa|DSE|D4rOq57y)CWHinLF1gyPmF&GtmwSg`930imrK1&Ra`7y@bG?iGJ4o)N$ zm|rt5+6LI8f)ejkzs?nq%(TI0>2(}%qZUPo(g84;v9>^k)>GreRk^4*#;hH%TUH$! zk)K%L2AEnfH(}La^+HPCk5nhnNpsDxP`mJv3YLzvLiWL#24 z?Hfm;3lgb3OaCl7F~uA|PQVK300f%SALXOV0d;urqva*Ps;{x(_;}VpzB-sTajMG;eT6 znit1IQ5zSCBV%bp>Pv{Xi(O%jIm8jBnfd|zp|tti2dWG_B)}!zsgDSOF0hH=v1Z;R z7^N8qvabg)Z`WX-sgZa4$dh2?K;4c)-1x&pG@58(t6@RP1GxEEEt2AW!Tn4+O`()? zTXR7PWN^yz&%=ZCm4ggw^p==-v(&BHTo*-1IR|jF_ek!;M@gB5uSy7ufB{}rNS~5L zWptG&VDI=8O z$xc93syYrcgJTQ|Of}zB-a5XcK*F0IS4DQ%9hDxcj0th_oDINr6RK6aHy3TE{3EM& z*vOEw2t@>FQX4u>K}6o^3yx>Qx;mPy&9Py`^3%YDEE@C#a<>X(45J81?r1z+15)KU zah}WuC>}~gc~VjFJ@tTsmL-kwC71NtEMjk5;efa89J!OahB$$WQG5u25S|J{R7IqD z4;)1>VIkM1WWgrtHASVJn{;$^o@jV6oIzH=Yj1YKw$$g)cZGuo^CwBg@aP$W2ap+? zgEG>)=dEQ5{Hj=uuYoyU_bqIa7*nj8KC!A*E9vQpjF!0U0YjQ)Cm;KU1^P z%gfF2rVZ6?B=qRXiw05yRpq0oxZjHhVjsT}9oC?fkv^pT%FIg(nVixpmckn{RQA{- zF>L$pRIb-32))ALLf->jnV#01=wnwz&}R<4x6YU|y{vgzXuHHhqy?Oyt0#`zQ+WBauA`?$P=8tO1njpehF4BP8(Cv<*rtP!DHQ) zm29Q&%}S@e= zXEI4geICeCriVx&j#JvlF4m5%1{~CNg>D>lG9|_$PdNJ}4HMUIqaE-m{u3p)RUyi2 z70p{N|C^y?@mp-UC{+B!(N`qj+1as=gZbmVxuJQ!6!!45L$0D2OjDUwwMTk0!VRS< zEjbTk^J*srfhyrWxe$`3372rwJZ^S#)vu!I*Srw*lS4rDz5|L7f{Wv^1#GnAMj{~` zlJJv4CDo5I6}}jv&vX`I#-5X;PW5;M!vI5$zoe2;Q7fKV$!vCA=QgzI1npkvU7sWhh{h7yq^1-;IMWFpasPk7(|szRN#QKsg@khyX-Q97 zbJUb)7~jbUQ6TVE9H_V{JKNle2=W#1r=w05Nrz5^K;H$MA)1Q{;$c-0O5||*E);Ox zy=y>qi_=42AAxo4>r=FwQk60nLx3s@ecrXGey^nH+i^pj(9)w`nN64{UVL=p0D>_K zIV+fe_yRY;f^}$N&62a0m~yvc_Y8P$87*M)>l!Wo>4H6J^jas47gv?4MIElWso62> zR5!=p9MN-s(!=HM8}A2#jCh1uNj&vRf-#uIfTB+u*r$KXmrKDgfUwOvr?mCeA4gNm?5qWORmNt zW*Re~k&@~M#m-3yxX@N;GY}5+<6C0Vq$^%paH1kXzpXPNoT~1Ej^NM zn5_Q*;ff&J?UmAsQfCsJGKg!@p*c20caprDLe-%GJyLe^42VMV+q&H>P>ldWLmcS| z4`L=IY!n%aS4m5t+o5@w%L$lSdplPA7rX%5c@?UkLr6nO4R>TUQ^-+G6B$=fa}Ph| zUoMF)jOR@vG`Bb0DdP@dUe4fhZt}{;D;xeWnMYQ@u%l6cZz-rgfYWLy4bU9u_EE=A zHD)$n9uZQ(x$hXTFYC}y*V!G^G9XAG*{PZ{QJM}O^@d1r&?W!@R-52J;+Sni?LG3G z_5})Po}O@5jVaIqeLqa$X>rVr@QN|!^Syw<5|#nWfFBu&#B3v0YA%qXj(1Ho?PQf) zT3x9i-S>G0I2_%C$^im1&XU3&E)r`!CV3?J=bh1)y)0c~c8Samp-3WO{-v1TDX;ZB zrCjiNq#<3i#lOfH_c=>9$*bjY9*{8$+W;IP{dC(rQ2SQ3xXvNx=Jk_&Ttdn%TOke7*(&aDd(4ym9UprR93UX zm&~MrkI*&TpoLsC2NT@^cA;-R;!TQImXtSk_-IcZ%c9L*^7V*~ehg{A$x#x)qZ!=>6D zKYa!rasrv`VNCVwNZlX^4*ATmpy^&s!i_|3lEFY3Jn`&u)g5G^^RWO$Sj=gi=pcPK zKRd2mo!xU-P>axV8*$6tD+rR}xf9t9W2w<(KomJU+`zTI_+%4jX{sgtZbN%h<+}Iu z6b~jdwDs`PLC7K7RrXZGl2@3-Mr6UlxgLYdM$Rh}JDnw|tg=(CwRY>x>{cN~UY$|_ zej6k%HIPC%2PO|Er9wB$K=}7AR!So393ofVJvfbp*|wMzYqYUG`)WdwW6sTUv(JR+ zxGaz{Uu`cmgB@7~P-EKfD9w6X{ag{=jX|*dh#nYpvPBHsrT;60*k`-(6LY4%+}y3%@`KBWaetaeGJRadURZlm+i&ymLrynHH86S#Qdu~N96dqp;5aGgUQ_}w zSwf9oQ^uLe4*!jiKrJZ54ULx5qKd2;hE&zyblM7%ze9dkF3ha;m4^eLuVk<~ecXc* zT~^zk{>DvTrI7%mC=CAdTo@WBB?HCix~hztlt5~bVj)kpTKbjSw0r8fkFv9b zDXgCP*ir}5j_crj8$KkZ=*Kru(n~Vu?5=Av?V-pvB&`h%2&p~34XDV`xRfoi-iMG< zA9!XU2)<`6N$$2QAfPRlEZ&-ZCP_oh|H&&mPnp5!`$gM72`1Wt8nu#!#47%SrCVgs zpcob#NhR~`7L~&G#^#p|SR+mq5|5*fHzs+v%GbQ<%8losZ3oj#O%WF{0U*2tX##e&nTt+hQWVqpKdppoA5(9)}Z8r3^-%WHZ(~@r-@4$ya z9qL4W^4Co%^A8_5+^l##1EFxu?NSdbB2!L--F+K-DJl^faIy>PWu6w_61?X0CVaU_*QC_}{s3DwxeDpk z67-%$k8c}dNa*hLa$;PN-Zfpoubkhl_vtF{j_x3@SQ|8LG@67U%W`-uJ8PsQ_C7b3 z#KiMU2&ymdI4&vKJRa3Q?8KCZ8jDl*PezJoYLab*tBlHs?-QEfOVr_vmE#jZB^oo( zNLMmL^THhBeVnxVs@4TBTzSD9zFaCm{y>nwpXj8q3=O+zpUmiRw!Va1`pwNWI-ayi zUe^~3I+$+yoaGx~kMRkmctPryLHJ390;lvFyX;PKZe;7}B@%+Q^l^|{;$$eY1ZqQ( z-QBF<^uF~6jnT@h#wL4Zdh%2e>jO!P#rknO5E@ELHiV}UXj>09vEcAgLsJP<(AXGK z=qs3!*kp(m{7~s~Su6PWzNQc=JEj4Y?SB$xN40qu7Ikb%@_Daqpb~sNOL_A7vO|=~6wow< z@JeKE4X+q+v5>s?!Tkwz-?qjRif1YokIQ!DMVi(VK}yc-zIZ&3fXa*nUzSPlV>$zSfuDU|IY6CcL(4OuMYC4AW2KpG~`dx4u| z{p+@7SJfsG+4s&^lN!(!r+vT;yUXPbUcN6W9o2XDW*LUa-@=JStNXnO;|Cy4ABWWG6G-1q_h0!VFI z*`K0*fq$T&f^OT-i(miqAREI+MHi8D7`A?-m`;CPo|0_*I`y{5|8{vSkDU&mx}`HO zVKfXPczV#-hHf@4w6@~$$4@DybXm6VGU}+IC#KG*vs;{FKQ^Z0$53#^k7!qfbJFUK z+VX-S1>6-SA8mR<&{u?nQA7*12gIr({XBMw6-zKk%4C7e1dK zCc5yhWOR;%Ff7YYqs1xyMQ&>0u|;wowTG2-XHfVm)B}N+=xH2t=pv-foghC^%Pwt9 ziEpjYwTYeWn39!6+)d(_l*WW<=guP#0gqNMnf9mKY)ah)JUJbnxyof2ibSWls+yC8 zXvq@~bQ{95WEoiqlt3JNet9F3ll0L^*1WZAP3f;Z+vuan8+;MbbLg*6eabgN{NW6k z-zMS&m~D%>2QUcCfmqT}p?WTFn>)Nc3sm_O1aOfOmdqg0=uplo+6e5vxrd)6a_z{u zTvT4VrjH{3q|!Hzo|H2p>r=U-t*F6aTBR&?>QtX~$rJTb7~hjvt(bRG`yLZI1!C6X zj#00`_L<-v&rt~<(=f2%^rIM|XWwsuPm}S~ezloX z8jJ4&I<<649@TDx=QLP$5-XJW5(}r$1Uu7DCMrgk@8h#(Gq&^OTdJ5hmuG$v9u}>U zSOwi;;b8mi1%0?M$bL_vBmA6li{v6)DcK94Lt)lhiFm-_8!~SYu(mfaciXM1et!?A zU+=g}hPD%j!%bIgUjA_CDw$Azp~v>UZl{PnjkYEy@7PWV=Gc4GUWm(i587Oe>AU5# z10U2yX~K0SO7r=I?aB2~M=Oj2d<%Pk)E(^C@8P+(e1wW6nTLH9pHeS&9SkmFK}u!a zLyYUp$lP93lstQ9^tWj`ed1H*c(-G@5t2~tqiU{Vz&A)4KO|le^}Kyf;dz#JmWBMr zI>udv8(K*-BXB&qvRGDX=`w>9_l|sweq1(L_Ps|B*K1wd0Ouh3@^YS=Pj1LvtB@eM zy7lP9ey>%EJlK(hrLR}44)~+DR(se)s~~R?3L-1)-o7U+cINC0Ijo^HIN$G63Yw4; zUv|jj$%r*>_@COj8OxVCB7gn}^$#RJFKz=2L_KNro=DQnh=3faup0h zybDkg2_+YvMNL_fB~j>f8*^);9@@+66kYzHx!<7qi7+BIg?VXgp z1;&Z|lpP)JPL!o+n4^5?$J*8u8f@{=fofe=JGReONZ1@Gc@sD>tP|e7gZa9STusW3 z{RGv2NweWSM~evp3jGiD+m-9VoOXui&j|Sr6p;RDS}`d`x$5t>%RZ=E@lZt)zB`fQ z_88LRAI_o+_gb&Zp%F0bgHLx`K2mqY3tW(o2|+6hZA*gI;;SqTWL^BQ>Jbiisgi+P z5vEg2oAM!rX<6{e8>UB`B#$x1a4e%^TIO+*2iqk2TtKfn|DQk!w0MuLziLM zH2c=3Cz>lBX1dzD#^GsT_^OPkYiH7{f|b!c(wn4E56WBDN2PIkZ5D%!0(dF8OZ)>SK5RA@ zxjA|W7{TXS)zNPEe4iJK?)6FhN%o$UzR7|nYi#9~F5!HSe!N!;+NBatkv37!kDC6y zXv{$e6s4o0Y8GlfqJGOb0DzKh1%8)CTS1=J#KDdcWa?mS#^`D1_S4UnZCJzq}Mh`Yd2WJZ=79JiRCT3P9R#pZug2Bbh-WBA@ zVDCcqLh%QOxS5NIvz4Q(m4iL;3n$3f!Oc~GloVV}{3kiM)I`D)Ed0~JOa3>#i>oP< z3^>CMZVwp1#LCRf&A`mcz{?)y&1g&Dq3E!rjc?mF%xZ9c|rQ{%X_B#q34&yWX~@=1ky9{kHs9 z9Vr+7$HWPDB zRu%>jvk8cSo!OX+0mN<2!N6+5%wi7W=3!%FW&aC>lCu?fB!F!HTB{c-Q!o{)xiL4F z2|E`9t0}uN13L#7I|C0lI}3xcIS)5Cw+Rc_l<{w>mww~Y-*RwUc*UH}K&}qX>JARJ z0;Dh0#4n7$hZHgYpM!;0-ofOz;%~5->C1TgbHs^)ESP?0`I-JJ@PA@bvvlyV|DW;v z9r`yG5ocEq2WJ~4XC-56GZWYUn&+Q^|Hh;Wp6gs(oxNoKn@0U#IQ~DvRT`}8;OzAm z`)X!Rf8_p{kZi4fyNa0j_awjzGWo;(E+BU^)8AbH_TwK#CYB(33p4O+`{z*m54qJp z31c&35UZ&PmoWneI4Bs{K|IC`#wOg%493Q+oGc)26J~B^j(=o#aWHrF06Ck9Sb$>y z+|S^l^}C;mssD&Rntz0QSem_r7BdTY2IOX7Wl?A00{&(tsh5ex| z=HTcB9>|uiN*?zArTKpX{DVQ>%EZjx#o@oI`d=Y`xaBWv5xCBO$iQnHc*$h?+nV`j zsJx7(|HaRrA^5*&0ZjdGBma_r|Lv}SyX#-_z`q3kcXa*RUH_5?{w46gqwD{hyAb|< z*KKAG-u!uh@2OkvgqZ;VDBPFF{5E1zVh*+r&T8OWb2BM3@czZhL{&-@0N{>^(a^Uf z(7+UIcd;NNA6K(w4|OdOLZU$Wpvj)w(B{9o%4we>!?{GdZ+dewp892+o2~sRS4l$I zm*p@Wv%kAJfSCFkWm&L+DH(xcX_lB;u;DIPc|WS?D2T!1b0%#;7}l_s;|(p+lWFH^%$TEW-Uv-YuIZ3!hyC-^Ey& zZ_{thghOknS%-f_jT;-dlYITaQZsLuqhNhhw!f2SobI-oQ|ovNdd{}%wG6$q`&>Mc zmMs`^3etO^sZ$zzkvApcVKt`{7e=~>9#RVT!PehyUr}H7_2RpT_i@lvg zj!&aLUgD2GJG`WC{G79Sjt_kIFGEroU>^%VCIw^l2Z#ITN{Zae!=rnZfpKi# zY~N7M@<9JCqQv^iP6P$*S7@fx!Z7Q=Ma$A)WEfV=N=)2H!(4N0{JkFj3*Lsb zuf1J;NzcQ>hQaqO;|;W?VS+)xI=si&3gC>{d3mUw35L)+dM-#IN?c;}Z^07=tTHzV zPOK25UXlC?Hy;SF3Q?U81Qq=KXpX2sTQS6tnxIp=NSEBqm|cFTd1H%ZhB8P zO7j4%-}yLbSgUtH&!y6|g`3%?HGXe+fAq+DL-%N1u;IV0b>8eeq%+oDC;$0}t+tDY z2A&Nn!|)okZJkk8@K6#Ck#X8qP#iWic?N^5_AW&6FiTh-^Z%Tl}Ec#i$7p@lXqSrSPnwp?=_) zL_?_QpupWFf)PzFW*VKuseap{b(u?=thA$Qg{sD~!#iOrYmC4<5kfAs?qyqp{^nno&uVPmKxyUOJShcVo!Zkr|4QDcK*-vR{ znGU;NfLDn~h{ZdrKI>!0$H?Eg-vCHkoZtYxkf`*+H2^3?@Z}{9zWh!@A^uMPPYVCX zz<**QV9bCAYVza5GAQGn-z_sTC4J6M?aZH@Mi6j7Vr}7tQSn|#aXN@>bV#avjqg<9 zl=Q@7vlQCGI6=^GKvdlrA8pQ6k<>n4fuRs+ZFI;NB|s1~v39@<0r>Kg1`B?tcf{La zb6-UL+nUz_J4TdM+#|*lN(Whw4r>G6VGcB!Q$=*Wq%tK2Zx()~F~uEyzrCqnyk>o? z@ZO2wN&SAj+ke0}5pnTRTOy-MUYi}Q%qGrocqu#?K8jM*j5S?IUm`XcUM?fmOJ3fJ zlD>aL+`J8)Uc79jUJX(>X}nGzjvO!)wOnmzG9$UOjrZJE7j*KC(woC>7B< zD5nH{2{!Ad^(#RRv(q{*h_k$YQ(k}p95vy1(y3?xGSn`iR=B_p*P%{hlt*KvSf*7C zx3mA?&`b|#(%D0TZN`ZnZdF#^yz$e=T?6c5Rsu>`>Sp;BzbeSw-hxizF_9^ zsC3v0sffX_xi?)W!Kkq8{^^+c28S^>$TiW>$yG7Q8`ml{vT^O*8(91kA-S$F4#Kgl zkAb4lB9s-aGn(b6=*AKVhTYelygXD#MLrHxA0x4NOe6x8;HxFdlN}?lwzUTIUG&J_ zGR#jPT`j_#;7C_B^nK|SorVHJhZ(j);`9p;Mj~j`;1=UZmgl! zfE-rGWzb08ftq`e4g45>g~f%3GGFQ`5tDKt+ptfq?eg&*B|}bGy0Umw$^il|^8AYB zwf7DzY6ZgACsXB?9Hwe(KO+y6J*H|WyVAu`FS?JMp*Hv0S$0|3@6W&T6?4kF^Pt#7 zU}C7p1{`<#W9>iHrn7!|(O8i_x~tq7+QmINQxyhXQ9U5~_g?!ZqryhyqRo53ci>0u+FjW>VjkY`e(2SbL|1LF@<)& z*-U$^azwHbiB1u1uV_PvY6Vo3V&3&Zr#4uKMyw-Bq3O~peu3L1byrVN%y&glPLbe! zIUbQuN$(yLrA?w85}u-+Rs|Jxm_PTh+xA7a1`d@W8?q`Y`QXr}OK!NxQhzDjCyjDsGu_hd_0Z2EKZ1i>aFjkq$M;n`82O3BqAz{s_P9O~5UikI&>!p|f3 zqBG|5VwY1)9kLh%HM%r}l%Hy6B5KNQ@;>v~`b7t6h}87URqS?cgmRwJl|qG!Gz@-9gFKv_%-vjqW5Zzoz;4t`w3|J4k}e`6ObV*=r{<*$5tpG(bDl z-$=>Mb5lim^63@Qz~K;cLFB^K-VeXF5cts~39?*TfzZq-twWb;dF@H33PosBg`S(# zHhFE4qKfZw@$w7Lk`>mUI!@jUlI%Sv8$rV_6ygJkH5-`-8Q|&Oi7xG3bXXpovV|6< zu>F9h`;4L4&|k*EBj}~~`C~SlfYYk(_(Xe{XR>)8?NzMJA*;eQw^LzkI(+$Ad(FWp z``l=MvI#mHNaF(84w6j+)Q7+m$b(l@wy&mH<;RGj8Sddc^D%<qb4b(dXU5iALx_>Q3`M{&9!3NDs7_E^ybZAJ0(pXg>mK1#>N{exOkrI4g}yH-iP2q8(^N zqDic63=K|-_}Xi9GxNKMl4%_8W_Za2^e{kxE-Xi+NAW0vErjZOB9FT^J5=^dHVhLgO?ekKP+c%LK06jd!KiLfY ls~dxVvflqI+l!WMA<@drn*dRc+?O*?83{%4Dp8}L{{z5cp1lA7 literal 0 HcmV?d00001 From 554be7e1d0ed48500d147e968298befb8244d3f2 Mon Sep 17 00:00:00 2001 From: Brendan Zabarauskas Date: Fri, 3 Jan 2020 14:04:30 +1100 Subject: [PATCH 10/88] Add categories and keywords to cargo manifests --- pikelet-cli/Cargo.toml | 4 +++- pikelet-gui/Cargo.toml | 4 +++- pikelet/Cargo.toml | 4 +++- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/pikelet-cli/Cargo.toml b/pikelet-cli/Cargo.toml index c05e0e8f3..a60b08228 100644 --- a/pikelet-cli/Cargo.toml +++ b/pikelet-cli/Cargo.toml @@ -5,9 +5,11 @@ authors = ["Brendan Zabarauskas "] edition = "2018" publish = false description = "Command line interface for interacting with the Pikelet programming language" -readme = "README.md" homepage = "https://github.com/pikelet-lang/pikelet" repository = "https://github.com/pikelet-lang/pikelet" +readme = "README.md" +keywords = ["pikelet", "cli"] +categories = ["command-line-utilities"] license = "Apache-2.0" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/pikelet-gui/Cargo.toml b/pikelet-gui/Cargo.toml index c60fa89a1..4170c9098 100644 --- a/pikelet-gui/Cargo.toml +++ b/pikelet-gui/Cargo.toml @@ -5,9 +5,11 @@ authors = ["Brendan Zabarauskas "] edition = "2018" publish = false description = "Graphical user interface for interacting with the Pikelet programming language" -readme = "README.md" homepage = "https://github.com/pikelet-lang/pikelet" repository = "https://github.com/pikelet-lang/pikelet" +readme = "README.md" +keywords = ["pikelet", "gui"] +categories = [] license = "Apache-2.0" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/pikelet/Cargo.toml b/pikelet/Cargo.toml index 7be89ef7e..840d5eaa8 100644 --- a/pikelet/Cargo.toml +++ b/pikelet/Cargo.toml @@ -5,9 +5,11 @@ authors = ["Brendan Zabarauskas"] edition = "2018" publish = false description = "The Pikelet programming language" -readme = "../README.md" homepage = "https://github.com/pikelet-lang/pikelet" repository = "https://github.com/pikelet-lang/pikelet" +readme = "../README.md" +keywords = ["pikelet", "language"] +categories = [] license = "Apache-2.0" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html From cf1a0e53bb18fe7b92d210eb4faaa91bb575ea2d Mon Sep 17 00:00:00 2001 From: Brendan Zabarauskas Date: Fri, 3 Jan 2020 16:57:20 +1100 Subject: [PATCH 11/88] Update reference topics --- docs/reference.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/docs/reference.md b/docs/reference.md index 3ded469d0..8c2a57676 100644 --- a/docs/reference.md +++ b/docs/reference.md @@ -14,13 +14,17 @@ Topics might include: - introduction - elimination - sequences - - lists - - arrays - literals - numbers - strings - characters - builtin types + - floating point + - signed/unsigned integers + - strings + - characters + - lists + - arrays - universes - cumulativity - lifting operator From 655642ddaf1acf0d3f0e1d1d44485ef437ac35b5 Mon Sep 17 00:00:00 2001 From: Brendan Zabarauskas Date: Sat, 4 Jan 2020 12:38:31 +1100 Subject: [PATCH 12/88] Rename Neutral enum to Head --- pikelet/src/core/mod.rs | 10 ++++------ pikelet/src/core/semantics.rs | 14 +++++++------- pikelet/src/surface/projections/core.rs | 2 +- 3 files changed, 12 insertions(+), 14 deletions(-) diff --git a/pikelet/src/core/mod.rs b/pikelet/src/core/mod.rs index 4117e3a85..f33da0dd5 100644 --- a/pikelet/src/core/mod.rs +++ b/pikelet/src/core/mod.rs @@ -138,7 +138,7 @@ pub enum Value { /// The type of types. Universe(UniverseLevel), /// Neutral values. - Neutral(Neutral, Arc), + Neutral(Head, Arc), /// Constants. Constant(Constant), /// Ordered sequences. @@ -167,15 +167,13 @@ impl Value { level: impl Into, r#type: impl Into>, ) -> Value { - Value::Neutral(Neutral::Global(name.into(), level.into()), r#type.into()) + Value::Neutral(Head::Global(name.into(), level.into()), r#type.into()) } } -/// Neutral values. -/// -/// These are values that are 'stuck' on a +/// The head of an elimination. #[derive(Clone, Debug, PartialEq)] -pub enum Neutral { +pub enum Head { /// References to globals. Global(String, UniverseOffset), } diff --git a/pikelet/src/core/semantics.rs b/pikelet/src/core/semantics.rs index 2cace772b..d5afc8dfc 100644 --- a/pikelet/src/core/semantics.rs +++ b/pikelet/src/core/semantics.rs @@ -2,7 +2,7 @@ use std::sync::Arc; -use crate::core::{Globals, Locals, Neutral, Term, Value}; +use crate::core::{Globals, Head, Locals, Term, Value}; /// Evaluate a term into a value in weak-head normal form. pub fn eval_term(globals: &Globals, locals: &mut Locals, term: &Term) -> Value { @@ -59,9 +59,9 @@ pub fn eval_term(globals: &Globals, locals: &mut Locals, term: &Term) -> Value { } /// Read-back a neutral value into the term syntax. -pub fn read_back_neutral(/* TODO: level, */ neutral: &Neutral) -> Term { - match neutral { - Neutral::Global(name, shift) => Term::Global(name.clone()).lift(*shift), +pub fn read_back_neutral(/* TODO: level, */ head: &Head) -> Term { + match head { + Head::Global(name, shift) => Term::Global(name.clone()).lift(*shift), } } @@ -71,7 +71,7 @@ pub fn read_back_neutral(/* TODO: level, */ neutral: &Neutral) -> Term { pub fn read_back_nf(/* TODO: level, */ value: &Value, r#type: &Value) -> Term { match (value, r#type) { (Value::Universe(level), Value::Universe(_)) => Term::Universe(*level), - (Value::Neutral(neutral, _), _) => read_back_neutral(neutral), + (Value::Neutral(head, _), _) => read_back_neutral(head), (Value::Constant(constant), _) => Term::Constant(constant.clone()), (Value::Sequence(value_entries), Value::ArrayType(_, entry_type)) => Term::Sequence( value_entries @@ -138,8 +138,8 @@ pub fn normalize(globals: &Globals, locals: &mut Locals, term: &Term, r#type: &V pub fn is_subtype(value0: &Value, value1: &Value) -> bool { match (value0, value1) { (Value::Universe(level0), Value::Universe(level1)) => level0 <= level1, - (Value::Neutral(neutral0, type0), Value::Neutral(neutral1, type1)) => { - read_back_neutral(neutral0) == read_back_neutral(neutral1) && is_subtype(type0, type1) + (Value::Neutral(head0, type0), Value::Neutral(head1, type1)) => { + read_back_neutral(head0) == read_back_neutral(head1) && is_subtype(type0, type1) } (Value::Constant(constant0), Value::Constant(constant1)) => constant0 == constant1, (Value::Sequence(value_entries0), Value::Sequence(value_entries1)) => { diff --git a/pikelet/src/surface/projections/core.rs b/pikelet/src/surface/projections/core.rs index 829d6394b..e73167918 100644 --- a/pikelet/src/surface/projections/core.rs +++ b/pikelet/src/surface/projections/core.rs @@ -294,7 +294,7 @@ fn check_literal>( literal: &Literal, expected_type: &core::Value, ) -> core::Term { - if let core::Value::Neutral(core::Neutral::Global(name, _), _) = expected_type { + if let core::Value::Neutral(core::Head::Global(name, _), _) = expected_type { match (literal, name.as_ref()) { (Literal::Number(data), "U8") => parse_number(state, data, core::Constant::U8), (Literal::Number(data), "U16") => parse_number(state, data, core::Constant::U16), From 5bf514f7cf67fa174894dbe8b0b9300e99b9a629 Mon Sep 17 00:00:00 2001 From: Brendan Zabarauskas Date: Sat, 4 Jan 2020 13:08:38 +1100 Subject: [PATCH 13/88] Implement record eliminations --- README.md | 2 +- pikelet/src/core/mod.rs | 17 +++++++- pikelet/src/core/projections/pretty.rs | 8 +++- pikelet/src/core/projections/surface.rs | 3 ++ pikelet/src/core/semantics.rs | 38 +++++++++++++---- pikelet/src/core/typing.rs | 17 ++++++++ pikelet/src/surface/grammar.lalrpop | 1 + pikelet/src/surface/mod.rs | 5 ++- pikelet/src/surface/projections/core.rs | 50 ++++++++++++++++------- pikelet/src/surface/projections/pretty.rs | 17 ++++---- 10 files changed, 123 insertions(+), 35 deletions(-) diff --git a/README.md b/README.md index fceb3f1ca..9b44caea7 100644 --- a/README.md +++ b/README.md @@ -60,7 +60,7 @@ You can read more about what we hope to achieve in [_Pondering the next version - [ ] Improved literal parsing - [x] Annotated terms - [ ] Let expressions - - [ ] Record field lookups + - [x] Record field lookups - [ ] Import expressions - [ ] Function terms - [ ] Non-dependent function types diff --git a/pikelet/src/core/mod.rs b/pikelet/src/core/mod.rs index f33da0dd5..867968a2e 100644 --- a/pikelet/src/core/mod.rs +++ b/pikelet/src/core/mod.rs @@ -81,6 +81,8 @@ pub enum Term { RecordType(Vec<(String, Arc)>), /// Record terms. RecordTerm(BTreeMap>), + /// Record eliminations (field access). + RecordElim(Arc, String), /// Array types. ArrayType(Arc, Arc), /// List types. @@ -138,7 +140,7 @@ pub enum Value { /// The type of types. Universe(UniverseLevel), /// Neutral values. - Neutral(Head, Arc), + Neutral(Head, Vec, Arc), /// Constants. Constant(Constant), /// Ordered sequences. @@ -167,7 +169,11 @@ impl Value { level: impl Into, r#type: impl Into>, ) -> Value { - Value::Neutral(Head::Global(name.into(), level.into()), r#type.into()) + Value::Neutral( + Head::Global(name.into(), level.into()), + Vec::new(), + r#type.into(), + ) } } @@ -178,6 +184,13 @@ pub enum Head { Global(String, UniverseOffset), } +/// An eliminator, to be used in the spine of an elimination. +#[derive(Clone, Debug, PartialEq)] +pub enum Elim { + /// Record eliminators (field access). + Record(String), +} + /// An environment of global definitions. pub struct Globals { entries: BTreeMap, Option>)>, diff --git a/pikelet/src/core/projections/pretty.rs b/pikelet/src/core/projections/pretty.rs index d32d2d80f..c271d3815 100644 --- a/pikelet/src/core/projections/pretty.rs +++ b/pikelet/src/core/projections/pretty.rs @@ -48,7 +48,7 @@ where .append(alloc.concat(ty_entries.iter().map(|(name, r#type)| { (alloc.nil()) .append(alloc.hardline()) - .append(alloc.as_string(name)) + .append(alloc.text(name)) .append(":") .append( (alloc.space()) @@ -69,7 +69,7 @@ where .append(alloc.concat(term_entries.iter().map(|(name, term)| { (alloc.nil()) .append(alloc.hardline()) - .append(alloc.as_string(name)) + .append(alloc.text(name)) .append("=") .append( (alloc.space()) @@ -82,6 +82,10 @@ where .group() }))) .append("}"), + Term::RecordElim(head, name) => (alloc.nil()) + .append(pretty_term(alloc, head)) + .append(".") + .append(alloc.text(name)), Term::ArrayType(len, entry_type) => alloc.text("Array").append( (alloc.nil()) .append(alloc.space()) diff --git a/pikelet/src/core/projections/surface.rs b/pikelet/src/core/projections/surface.rs index 3e23ff177..6e72a8460 100644 --- a/pikelet/src/core/projections/surface.rs +++ b/pikelet/src/core/projections/surface.rs @@ -40,6 +40,9 @@ pub fn delaborate_term(term: &Term) -> surface::Term { surface::Term::RecordTerm(0..0, core_term_entries) } + Term::RecordElim(head, name) => { + surface::Term::RecordElim(..0, Box::new(delaborate_term(head)), name.clone()) + } Term::ArrayType(len, entry_type) => surface::Term::ArrayType( 0..0, Box::new(delaborate_term(len)), diff --git a/pikelet/src/core/semantics.rs b/pikelet/src/core/semantics.rs index d5afc8dfc..d6d470d65 100644 --- a/pikelet/src/core/semantics.rs +++ b/pikelet/src/core/semantics.rs @@ -2,7 +2,7 @@ use std::sync::Arc; -use crate::core::{Globals, Head, Locals, Term, Value}; +use crate::core::{Elim, Globals, Head, Locals, Term, Value}; /// Evaluate a term into a value in weak-head normal form. pub fn eval_term(globals: &Globals, locals: &mut Locals, term: &Term) -> Value { @@ -42,6 +42,25 @@ pub fn eval_term(globals: &Globals, locals: &mut Locals, term: &Term) -> Value { Value::RecordTerm(value_entries) } + Term::RecordElim(head, name) => match eval_term(globals, locals, head) { + Value::RecordTerm(term_entries) => match term_entries.get(name) { + Some(value) => (**value).clone(), // TODO: return `Arc`? + None => Value::Error, + }, + Value::Neutral(head, mut elims, r#type) => match r#type.as_ref() { + Value::RecordType(type_entries) => { + match type_entries.iter().find(|(n, _)| n == name) { + Some((_, entry_type)) => { + elims.push(Elim::Record(name.clone())); + Value::Neutral(head, elims, entry_type.clone()) + } + None => Value::Error, + } + } + _ => Value::Error, + }, + _ => Value::Error, + }, Term::ArrayType(len, entry_type) => Value::ArrayType( Arc::new(eval_term(globals, locals, len)), Arc::new(eval_term(globals, locals, entry_type)), @@ -59,10 +78,14 @@ pub fn eval_term(globals: &Globals, locals: &mut Locals, term: &Term) -> Value { } /// Read-back a neutral value into the term syntax. -pub fn read_back_neutral(/* TODO: level, */ head: &Head) -> Term { - match head { +pub fn read_back_neutral(/* TODO: level, */ head: &Head, spine: &[Elim]) -> Term { + let head = match head { Head::Global(name, shift) => Term::Global(name.clone()).lift(*shift), - } + }; + + spine.iter().fold(head, |head, elim| match elim { + Elim::Record(name) => Term::RecordElim(Arc::new(head), name.clone()), + }) } /// Read-back a normal form into the term syntax. @@ -71,7 +94,7 @@ pub fn read_back_neutral(/* TODO: level, */ head: &Head) -> Term { pub fn read_back_nf(/* TODO: level, */ value: &Value, r#type: &Value) -> Term { match (value, r#type) { (Value::Universe(level), Value::Universe(_)) => Term::Universe(*level), - (Value::Neutral(head, _), _) => read_back_neutral(head), + (Value::Neutral(head, spine, _), _) => read_back_neutral(head, spine), (Value::Constant(constant), _) => Term::Constant(constant.clone()), (Value::Sequence(value_entries), Value::ArrayType(_, entry_type)) => Term::Sequence( value_entries @@ -138,8 +161,9 @@ pub fn normalize(globals: &Globals, locals: &mut Locals, term: &Term, r#type: &V pub fn is_subtype(value0: &Value, value1: &Value) -> bool { match (value0, value1) { (Value::Universe(level0), Value::Universe(level1)) => level0 <= level1, - (Value::Neutral(head0, type0), Value::Neutral(head1, type1)) => { - read_back_neutral(head0) == read_back_neutral(head1) && is_subtype(type0, type1) + (Value::Neutral(head0, spine0, type0), Value::Neutral(head1, spine1, type1)) => { + read_back_neutral(head0, spine0) == read_back_neutral(head1, spine1) + && is_subtype(type0, type1) } (Value::Constant(constant0), Value::Constant(constant1)) => constant0 == constant1, (Value::Sequence(value_entries0), Value::Sequence(value_entries1)) => { diff --git a/pikelet/src/core/typing.rs b/pikelet/src/core/typing.rs index 65f5b8e82..fb2d09c85 100644 --- a/pikelet/src/core/typing.rs +++ b/pikelet/src/core/typing.rs @@ -42,6 +42,8 @@ pub enum TypeError { DuplicateNamesInRecordType(Vec), MissingNamesInRecordTerm(Vec), UnexpectedNamesInRecordTerm(Vec), + FieldNotFoundInRecord(String), + ExpectedRecord(Value), AmbiguousSequence, UnexpectedSequenceLength(usize, Arc), ExpectedType(Value), @@ -179,6 +181,21 @@ pub fn synth_term(state: &mut State<'_>, term: &Term) -> Value { Value::Universe(max_level) } + Term::RecordElim(head, name) => match synth_term(state, head) { + Value::RecordType(type_entries) => { + match type_entries.iter().find(|(n, _)| n == name) { + Some((_, r#type)) => (**r#type).clone(), // TODO: return `Arc`? + None => { + state.report(TypeError::FieldNotFoundInRecord(name.clone())); + Value::Error + } + } + } + head_type => { + state.report(TypeError::ExpectedRecord(head_type)); + Value::Error + } + }, Term::ArrayType(len, entry_type) => { let u32_type = Value::global("U32", 0, Value::universe(0)); check_term(state, len, &u32_type); diff --git a/pikelet/src/surface/grammar.lalrpop b/pikelet/src/surface/grammar.lalrpop index 34dd8a298..54c75c631 100644 --- a/pikelet/src/surface/grammar.lalrpop +++ b/pikelet/src/surface/grammar.lalrpop @@ -16,6 +16,7 @@ TermAtomic: Term<&'input str> = { "[" > "]" => Term::Sequence(start..end, entries), "Record" "{" > "}" => Term::RecordType(start..end, entries), "record" "{" > "}" => Term::RecordTerm(start..end, entries), + "." => Term::RecordElim(..end, Box::new(head), name), => { Term::Lift(start..end, Box::new(term), shift[1..].parse().unwrap()) // FIXME: Overflow! }, diff --git a/pikelet/src/surface/mod.rs b/pikelet/src/surface/mod.rs index f4007a22a..b4258371f 100644 --- a/pikelet/src/surface/mod.rs +++ b/pikelet/src/surface/mod.rs @@ -2,7 +2,7 @@ //! //! This is a user-friendly concrete syntax for the language. -use std::ops::Range; +use std::ops::{Range, RangeTo}; pub mod projections; @@ -23,6 +23,8 @@ pub enum Term { RecordType(Range, Vec<(S, Term)>), /// Record terms. RecordTerm(Range, Vec<(S, Term)>), + /// Record eliminations (field access). + RecordElim(RangeTo, Box>, S), /// Array types. ArrayType(Range, Box>, Box>), /// List types. @@ -52,6 +54,7 @@ impl<'input> Term<&'input str> { | Term::Lift(span, _, _) | Term::Error(span) => span.clone(), Term::Ann(term, r#type) => term.span().start..r#type.span().end, + Term::RecordElim(span, term, _) => term.span().start..span.end, } } } diff --git a/pikelet/src/surface/projections/core.rs b/pikelet/src/surface/projections/core.rs index e73167918..b693b1aaa 100644 --- a/pikelet/src/surface/projections/core.rs +++ b/pikelet/src/surface/projections/core.rs @@ -42,6 +42,8 @@ pub enum TypeError { DuplicateNamesInRecordType(Vec), MissingNamesInRecordTerm(Vec), UnexpectedNamesInRecordTerm(Vec), + FieldNotFoundInRecord(String), + ExpectedRecord(core::Value), InvalidNumberLiteral, InvalidCharLiteral, InvalidStringLiteral, @@ -246,6 +248,24 @@ pub fn synth_term>( core::Value::Universe(max_level), ) } + Term::RecordElim(_, head, name) => match synth_term(state, head) { + (core_head, core::Value::RecordType(type_entries)) => { + match type_entries.iter().find(|(n, _)| n == name.as_ref()) { + Some((_, r#type)) => ( + core::Term::RecordElim(Arc::new(core_head), name.as_ref().to_owned()), + (**r#type).clone(), // TODO: return `Arc`? + ), + None => { + state.report(TypeError::FieldNotFoundInRecord(name.as_ref().to_owned())); + (core::Term::Error, core::Value::Error) + } + } + } + (_, head_type) => { + state.report(TypeError::ExpectedRecord(head_type)); + (core::Term::Error, core::Value::Error) + } + }, Term::ArrayType(_, len, entry_type) => { let u32_type = core::Value::global("U32", 0, core::Value::universe(0)); let core_len = Arc::new(check_term(state, len, &u32_type)); @@ -294,21 +314,21 @@ fn check_literal>( literal: &Literal, expected_type: &core::Value, ) -> core::Term { - if let core::Value::Neutral(core::Head::Global(name, _), _) = expected_type { - match (literal, name.as_ref()) { - (Literal::Number(data), "U8") => parse_number(state, data, core::Constant::U8), - (Literal::Number(data), "U16") => parse_number(state, data, core::Constant::U16), - (Literal::Number(data), "U32") => parse_number(state, data, core::Constant::U32), - (Literal::Number(data), "U64") => parse_number(state, data, core::Constant::U64), - (Literal::Number(data), "S8") => parse_number(state, data, core::Constant::S8), - (Literal::Number(data), "S16") => parse_number(state, data, core::Constant::S16), - (Literal::Number(data), "S32") => parse_number(state, data, core::Constant::S32), - (Literal::Number(data), "S64") => parse_number(state, data, core::Constant::S64), - (Literal::Number(data), "F32") => parse_number(state, data, core::Constant::F32), - (Literal::Number(data), "F64") => parse_number(state, data, core::Constant::F64), - (Literal::Char(data), "Char") => parse_char(state, data), - (Literal::String(data), "String") => parse_string(state, data), - (_, _) => { + if let core::Value::Neutral(core::Head::Global(name, _), spine, _) = expected_type { + match (literal, name.as_ref(), spine.as_slice()) { + (Literal::Number(data), "U8", []) => parse_number(state, data, core::Constant::U8), + (Literal::Number(data), "U16", []) => parse_number(state, data, core::Constant::U16), + (Literal::Number(data), "U32", []) => parse_number(state, data, core::Constant::U32), + (Literal::Number(data), "U64", []) => parse_number(state, data, core::Constant::U64), + (Literal::Number(data), "S8", []) => parse_number(state, data, core::Constant::S8), + (Literal::Number(data), "S16", []) => parse_number(state, data, core::Constant::S16), + (Literal::Number(data), "S32", []) => parse_number(state, data, core::Constant::S32), + (Literal::Number(data), "S64", []) => parse_number(state, data, core::Constant::S64), + (Literal::Number(data), "F32", []) => parse_number(state, data, core::Constant::F32), + (Literal::Number(data), "F64", []) => parse_number(state, data, core::Constant::F64), + (Literal::Char(data), "Char", []) => parse_char(state, data), + (Literal::String(data), "String", []) => parse_string(state, data), + (_, _, _) => { state.report(TypeError::NoLiteralConversion(expected_type.clone())); core::Term::Error } diff --git a/pikelet/src/surface/projections/pretty.rs b/pikelet/src/surface/projections/pretty.rs index 6c99b28af..675859014 100644 --- a/pikelet/src/surface/projections/pretty.rs +++ b/pikelet/src/surface/projections/pretty.rs @@ -6,13 +6,12 @@ use crate::surface::{Literal, Term}; pub fn pretty_term<'term, D, S>(alloc: &'term D, term: &'term Term) -> DocBuilder<'term, D> where - S: 'term, - &'term S: ToString, + S: 'term + AsRef, D: DocAllocator<'term>, D::Doc: Clone, { match term { - Term::Name(_, name) => alloc.as_string(name), + Term::Name(_, name) => alloc.text(name.as_ref()), Term::Ann(term, r#type) => (alloc.nil()) .append(pretty_term(alloc, term)) .append(alloc.space()) @@ -45,7 +44,7 @@ where .append(alloc.concat(ty_entries.iter().map(|(name, r#type)| { (alloc.nil()) .append(alloc.hardline()) - .append(alloc.as_string(name)) + .append(alloc.text(name.as_ref())) .append(":") .append( (alloc.space()) @@ -66,7 +65,7 @@ where .append(alloc.concat(term_entries.iter().map(|(name, term)| { (alloc.nil()) .append(alloc.hardline()) - .append(alloc.as_string(name)) + .append(alloc.text(name.as_ref())) .append("=") .append( (alloc.space()) @@ -79,6 +78,10 @@ where .group() }))) .append("}"), + Term::RecordElim(_, head, name) => (alloc.nil()) + .append(pretty_term(alloc, head)) + .append(".") + .append(name.as_ref()), Term::ArrayType(_, len, entry_type) => alloc.text("Array").append( (alloc.nil()) .append(alloc.space()) @@ -109,13 +112,13 @@ pub fn pretty_literal<'term, D, S>( ) -> DocBuilder<'term, D> where S: 'term, - &'term S: ToString, + S: 'term + AsRef, D: DocAllocator<'term>, D::Doc: Clone, { match literal { Literal::Char(text) | Literal::String(text) | Literal::Number(text) => { - alloc.as_string(text) + alloc.text(text.as_ref()) } } } From ccdadea43633c26939d49171a0b3268d2599b917 Mon Sep 17 00:00:00 2001 From: Brendan Zabarauskas Date: Sat, 4 Jan 2020 14:08:00 +1100 Subject: [PATCH 14/88] Simplify where clause --- pikelet/src/surface/projections/pretty.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/pikelet/src/surface/projections/pretty.rs b/pikelet/src/surface/projections/pretty.rs index 675859014..f054eb956 100644 --- a/pikelet/src/surface/projections/pretty.rs +++ b/pikelet/src/surface/projections/pretty.rs @@ -111,7 +111,6 @@ pub fn pretty_literal<'term, D, S>( literal: &'term Literal, ) -> DocBuilder<'term, D> where - S: 'term, S: 'term + AsRef, D: DocAllocator<'term>, D::Doc: Clone, From c3cb888d85b0a60f18a75f869ee574fadf285828 Mon Sep 17 00:00:00 2001 From: Brendan Zabarauskas Date: Sat, 4 Jan 2020 15:42:34 +1100 Subject: [PATCH 15/88] Rename neutrals, and improve documentation --- pikelet/src/core/mod.rs | 21 +++++++++++++++------ pikelet/src/core/semantics.rs | 18 ++++++++++-------- pikelet/src/surface/projections/core.rs | 2 +- 3 files changed, 26 insertions(+), 15 deletions(-) diff --git a/pikelet/src/core/mod.rs b/pikelet/src/core/mod.rs index 867968a2e..c336085e0 100644 --- a/pikelet/src/core/mod.rs +++ b/pikelet/src/core/mod.rs @@ -69,7 +69,7 @@ impl From for UniverseOffset { pub enum Term { /// The type of types. Universe(UniverseLevel), - /// References to globals. + /// References to global variables. Global(String), /// Constants. Constant(Constant), @@ -139,8 +139,17 @@ impl Locals { pub enum Value { /// The type of types. Universe(UniverseLevel), - /// Neutral values. - Neutral(Head, Vec, Arc), + /// A suspended elimination (neutral value). + /// + /// This is a value that cannot be reduced further as a result of being + /// stuck on some head. Instead we maintain a 'spine' of eliminators so that + /// we may perform further reduction later on. + /// + /// A type annotation is maintained in order to allow for type-directed + /// [eta-conversion] to take place during read-back. + /// + /// [eta-conversion]: https://ncatlab.org/nlab/show/eta-conversion + Elim(Head, Vec, Arc), /// Constants. Constant(Constant), /// Ordered sequences. @@ -163,13 +172,13 @@ impl Value { Value::Universe(level.into()) } - /// Create a reference to global. + /// Create a reference to global variable. pub fn global( name: impl Into, level: impl Into, r#type: impl Into>, ) -> Value { - Value::Neutral( + Value::Elim( Head::Global(name.into(), level.into()), Vec::new(), r#type.into(), @@ -180,7 +189,7 @@ impl Value { /// The head of an elimination. #[derive(Clone, Debug, PartialEq)] pub enum Head { - /// References to globals. + /// References to global variables. Global(String, UniverseOffset), } diff --git a/pikelet/src/core/semantics.rs b/pikelet/src/core/semantics.rs index d6d470d65..725f375de 100644 --- a/pikelet/src/core/semantics.rs +++ b/pikelet/src/core/semantics.rs @@ -47,12 +47,12 @@ pub fn eval_term(globals: &Globals, locals: &mut Locals, term: &Term) -> Value { Some(value) => (**value).clone(), // TODO: return `Arc`? None => Value::Error, }, - Value::Neutral(head, mut elims, r#type) => match r#type.as_ref() { + Value::Elim(head, mut elims, r#type) => match r#type.as_ref() { Value::RecordType(type_entries) => { match type_entries.iter().find(|(n, _)| n == name) { Some((_, entry_type)) => { elims.push(Elim::Record(name.clone())); - Value::Neutral(head, elims, entry_type.clone()) + Value::Elim(head, elims, entry_type.clone()) } None => Value::Error, } @@ -77,8 +77,8 @@ pub fn eval_term(globals: &Globals, locals: &mut Locals, term: &Term) -> Value { } } -/// Read-back a neutral value into the term syntax. -pub fn read_back_neutral(/* TODO: level, */ head: &Head, spine: &[Elim]) -> Term { +/// Read-back an eliminator into the term syntax. +pub fn read_back_elim(/* TODO: level, */ head: &Head, spine: &[Elim]) -> Term { let head = match head { Head::Global(name, shift) => Term::Global(name.clone()).lift(*shift), }; @@ -90,11 +90,13 @@ pub fn read_back_neutral(/* TODO: level, */ head: &Head, spine: &[Elim]) -> Term /// Read-back a normal form into the term syntax. /// -/// This is type-directed to allow us to perform eta-conversion. +/// This is type-directed to allow us to perform [eta-conversion]. +/// +/// [eta-conversion]: https://ncatlab.org/nlab/show/eta-conversion pub fn read_back_nf(/* TODO: level, */ value: &Value, r#type: &Value) -> Term { match (value, r#type) { (Value::Universe(level), Value::Universe(_)) => Term::Universe(*level), - (Value::Neutral(head, spine, _), _) => read_back_neutral(head, spine), + (Value::Elim(head, spine, _), _) => read_back_elim(head, spine), (Value::Constant(constant), _) => Term::Constant(constant.clone()), (Value::Sequence(value_entries), Value::ArrayType(_, entry_type)) => Term::Sequence( value_entries @@ -161,8 +163,8 @@ pub fn normalize(globals: &Globals, locals: &mut Locals, term: &Term, r#type: &V pub fn is_subtype(value0: &Value, value1: &Value) -> bool { match (value0, value1) { (Value::Universe(level0), Value::Universe(level1)) => level0 <= level1, - (Value::Neutral(head0, spine0, type0), Value::Neutral(head1, spine1, type1)) => { - read_back_neutral(head0, spine0) == read_back_neutral(head1, spine1) + (Value::Elim(head0, spine0, type0), Value::Elim(head1, spine1, type1)) => { + read_back_elim(head0, spine0) == read_back_elim(head1, spine1) && is_subtype(type0, type1) } (Value::Constant(constant0), Value::Constant(constant1)) => constant0 == constant1, diff --git a/pikelet/src/surface/projections/core.rs b/pikelet/src/surface/projections/core.rs index b693b1aaa..e299cca43 100644 --- a/pikelet/src/surface/projections/core.rs +++ b/pikelet/src/surface/projections/core.rs @@ -314,7 +314,7 @@ fn check_literal>( literal: &Literal, expected_type: &core::Value, ) -> core::Term { - if let core::Value::Neutral(core::Head::Global(name, _), spine, _) = expected_type { + if let core::Value::Elim(core::Head::Global(name, _), spine, _) = expected_type { match (literal, name.as_ref(), spine.as_slice()) { (Literal::Number(data), "U8", []) => parse_number(state, data, core::Constant::U8), (Literal::Number(data), "U16", []) => parse_number(state, data, core::Constant::U16), From 27a2e96af7ca415b5ef43af903860ac0103583a8 Mon Sep 17 00:00:00 2001 From: Brendan Zabarauskas Date: Sat, 4 Jan 2020 15:58:23 +1100 Subject: [PATCH 16/88] Remove intermediate function in elaborator --- pikelet/src/surface/projections/core.rs | 96 +++++++++++-------------- 1 file changed, 42 insertions(+), 54 deletions(-) diff --git a/pikelet/src/surface/projections/core.rs b/pikelet/src/surface/projections/core.rs index e299cca43..207af18f7 100644 --- a/pikelet/src/surface/projections/core.rs +++ b/pikelet/src/surface/projections/core.rs @@ -76,7 +76,34 @@ pub fn check_term>( expected_type: &core::Value, ) -> core::Term { match (term, expected_type) { - (Term::Literal(_, literal), _) => check_literal(state, literal, expected_type), + (Term::Literal(_, literal), _) => match expected_type { + core::Value::Elim(core::Head::Global(name, _), spine, _) => { + use crate::core::Constant::*; + + match (literal, name.as_ref(), spine.as_slice()) { + (Literal::Number(data), "U8", []) => parse_number(state, data, U8), + (Literal::Number(data), "U16", []) => parse_number(state, data, U16), + (Literal::Number(data), "U32", []) => parse_number(state, data, U32), + (Literal::Number(data), "U64", []) => parse_number(state, data, U64), + (Literal::Number(data), "S8", []) => parse_number(state, data, S8), + (Literal::Number(data), "S16", []) => parse_number(state, data, S16), + (Literal::Number(data), "S32", []) => parse_number(state, data, S32), + (Literal::Number(data), "S64", []) => parse_number(state, data, S64), + (Literal::Number(data), "F32", []) => parse_number(state, data, F32), + (Literal::Number(data), "F64", []) => parse_number(state, data, F64), + (Literal::Char(data), "Char", []) => parse_char(state, data), + (Literal::String(data), "String", []) => parse_string(state, data), + (_, _, _) => { + state.report(TypeError::NoLiteralConversion(expected_type.clone())); + core::Term::Error + } + } + } + _ => { + state.report(TypeError::NoLiteralConversion(expected_type.clone())); + core::Term::Error + } + }, (Term::Sequence(_, entry_terms), core::Value::ArrayType(len, core_entry_type)) => { let core_entry_terms = entry_terms .iter() @@ -186,7 +213,20 @@ pub fn synth_term>( core_type_value, ) } - Term::Literal(_, literal) => synth_literal(state, literal), + Term::Literal(_, literal) => match literal { + Literal::Number(_) => { + state.report(TypeError::AmbiguousLiteral); + (core::Term::Error, core::Value::Error) + } + Literal::Char(data) => ( + parse_char(state, data), + core::Value::global("Char", 0, core::Value::universe(0)), + ), + Literal::String(data) => ( + parse_string(state, data), + core::Value::global("String", 0, core::Value::universe(0)), + ), + }, Term::Sequence(_, _) => { state.report(TypeError::AmbiguousSequence); (core::Term::Error, core::Value::Error) @@ -308,58 +348,6 @@ pub fn synth_term>( } } -/// Check that a literal matches the expected type. -fn check_literal>( - state: &mut State<'_>, - literal: &Literal, - expected_type: &core::Value, -) -> core::Term { - if let core::Value::Elim(core::Head::Global(name, _), spine, _) = expected_type { - match (literal, name.as_ref(), spine.as_slice()) { - (Literal::Number(data), "U8", []) => parse_number(state, data, core::Constant::U8), - (Literal::Number(data), "U16", []) => parse_number(state, data, core::Constant::U16), - (Literal::Number(data), "U32", []) => parse_number(state, data, core::Constant::U32), - (Literal::Number(data), "U64", []) => parse_number(state, data, core::Constant::U64), - (Literal::Number(data), "S8", []) => parse_number(state, data, core::Constant::S8), - (Literal::Number(data), "S16", []) => parse_number(state, data, core::Constant::S16), - (Literal::Number(data), "S32", []) => parse_number(state, data, core::Constant::S32), - (Literal::Number(data), "S64", []) => parse_number(state, data, core::Constant::S64), - (Literal::Number(data), "F32", []) => parse_number(state, data, core::Constant::F32), - (Literal::Number(data), "F64", []) => parse_number(state, data, core::Constant::F64), - (Literal::Char(data), "Char", []) => parse_char(state, data), - (Literal::String(data), "String", []) => parse_string(state, data), - (_, _, _) => { - state.report(TypeError::NoLiteralConversion(expected_type.clone())); - core::Term::Error - } - } - } else { - state.report(TypeError::NoLiteralConversion(expected_type.clone())); - core::Term::Error - } -} - -/// Check that a literal matches the expected type. -fn synth_literal>( - state: &mut State<'_>, - literal: &Literal, -) -> (core::Term, core::Value) { - match literal { - Literal::Number(_) => { - state.report(TypeError::AmbiguousLiteral); - (core::Term::Error, core::Value::Error) - } - Literal::Char(data) => ( - parse_char(state, data), - core::Value::global("Char", 0, core::Value::universe(0)), - ), - Literal::String(data) => ( - parse_string(state, data), - core::Value::global("String", 0, core::Value::universe(0)), - ), - } -} - fn parse_number, T: FromStr>( state: &mut State<'_>, data: &S, From 722e310b18f452400b3bcdd5a5d5f45b94433e4e Mon Sep 17 00:00:00 2001 From: Brendan Zabarauskas Date: Sat, 4 Jan 2020 17:08:49 +1100 Subject: [PATCH 17/88] Use Arc to reduce copying of values --- pikelet/src/core/mod.rs | 18 ++-- pikelet/src/core/semantics.rs | 53 ++++----- pikelet/src/core/typing.rs | 82 +++++++------- pikelet/src/surface/projections/core.rs | 137 ++++++++++++------------ 4 files changed, 150 insertions(+), 140 deletions(-) diff --git a/pikelet/src/core/mod.rs b/pikelet/src/core/mod.rs index c336085e0..b124cf6af 100644 --- a/pikelet/src/core/mod.rs +++ b/pikelet/src/core/mod.rs @@ -253,14 +253,14 @@ impl Default for Globals { } pub trait HasType { - fn r#type() -> Value; + fn r#type() -> Arc; } macro_rules! impl_has_type { ($Self:ty, $term:expr) => { impl HasType for $Self { - fn r#type() -> Value { - $term + fn r#type() -> Arc { + Arc::new($term) } } }; @@ -282,19 +282,19 @@ impl_has_type!(String, Value::global("String", 0, Value::universe(0))); impl_has_type!(str, Value::global("String", 0, Value::universe(0))); impl HasType for Vec { - fn r#type() -> Value { - Value::ListType(Arc::new(T::r#type())) + fn r#type() -> Arc { + Arc::new(Value::ListType(T::r#type())) } } macro_rules! impl_has_type_array { ($($len:expr),*) => { $(impl HasType for [T; $len] { - fn r#type() -> Value { - Value::ArrayType( + fn r#type() -> Arc { + Arc::new(Value::ArrayType( Arc::new(Value::Constant(Constant::U32($len as u32))), - Arc::new(T::r#type()), - ) + T::r#type(), + )) } })* }; diff --git a/pikelet/src/core/semantics.rs b/pikelet/src/core/semantics.rs index 725f375de..dd933592f 100644 --- a/pikelet/src/core/semantics.rs +++ b/pikelet/src/core/semantics.rs @@ -5,67 +5,70 @@ use std::sync::Arc; use crate::core::{Elim, Globals, Head, Locals, Term, Value}; /// Evaluate a term into a value in weak-head normal form. -pub fn eval_term(globals: &Globals, locals: &mut Locals, term: &Term) -> Value { +pub fn eval_term(globals: &Globals, locals: &mut Locals, term: &Term) -> Arc { match term { - Term::Universe(level) => Value::universe((*level + locals.universe_offset()).unwrap()), // FIXME: Handle overflow + Term::Universe(level) => Arc::new(Value::universe( + (*level + locals.universe_offset()).unwrap(), // FIXME: Handle overflow + )), Term::Global(name) => match globals.get(name) { Some((_, Some(term))) => eval_term(globals, locals, term), Some((r#type, None)) => { let r#type = eval_term(globals, locals, r#type); - Value::global(name, locals.universe_offset(), r#type) + Arc::new(Value::global(name, locals.universe_offset(), r#type)) } - None => Value::Error, + None => Arc::new(Value::Error), }, - Term::Constant(constant) => Value::Constant(constant.clone()), + Term::Constant(constant) => Arc::new(Value::Constant(constant.clone())), Term::Sequence(term_entries) => { let value_entries = term_entries .iter() - .map(|entry_term| Arc::new(eval_term(globals, locals, entry_term))) + .map(|entry_term| eval_term(globals, locals, entry_term)) .collect(); - Value::Sequence(value_entries) + Arc::new(Value::Sequence(value_entries)) } Term::Ann(term, _) => eval_term(globals, locals, term), Term::RecordType(type_entries) => { let type_entries = type_entries .iter() - .map(|(name, r#type)| (name.clone(), Arc::new(eval_term(globals, locals, r#type)))) + .map(|(name, r#type)| (name.clone(), eval_term(globals, locals, r#type))) .collect(); - Value::RecordType(type_entries) + Arc::new(Value::RecordType(type_entries)) } Term::RecordTerm(term_entries) => { let value_entries = term_entries .iter() - .map(|(name, term)| (name.clone(), Arc::new(eval_term(globals, locals, term)))) + .map(|(name, term)| (name.clone(), eval_term(globals, locals, term))) .collect(); - Value::RecordTerm(value_entries) + Arc::new(Value::RecordTerm(value_entries)) } - Term::RecordElim(head, name) => match eval_term(globals, locals, head) { + Term::RecordElim(head, name) => match eval_term(globals, locals, head).as_ref() { Value::RecordTerm(term_entries) => match term_entries.get(name) { - Some(value) => (**value).clone(), // TODO: return `Arc`? - None => Value::Error, + Some(value) => value.clone(), + None => Arc::new(Value::Error), }, - Value::Elim(head, mut elims, r#type) => match r#type.as_ref() { + Value::Elim(head, elims, r#type) => match r#type.as_ref() { Value::RecordType(type_entries) => { match type_entries.iter().find(|(n, _)| n == name) { Some((_, entry_type)) => { + let mut elims = elims.clone(); // TODO: avoid cloning elims.push(Elim::Record(name.clone())); - Value::Elim(head, elims, entry_type.clone()) + Arc::new(Value::Elim(head.clone(), elims, entry_type.clone())) } - None => Value::Error, + None => Arc::new(Value::Error), } } - _ => Value::Error, + _ => Arc::new(Value::Error), }, - _ => Value::Error, + _ => Arc::new(Value::Error), }, - Term::ArrayType(len, entry_type) => Value::ArrayType( - Arc::new(eval_term(globals, locals, len)), - Arc::new(eval_term(globals, locals, entry_type)), - ), - Term::ListType(r#type) => Value::ListType(Arc::new(eval_term(globals, locals, r#type))), + Term::ArrayType(len, entry_type) => Arc::new(Value::ArrayType( + eval_term(globals, locals, len), + eval_term(globals, locals, entry_type), + )), + Term::ListType(r#type) => Arc::new(Value::ListType(eval_term(globals, locals, r#type))), Term::Lift(term, offset) => { let previous_offset = locals.universe_offset(); locals.set_universe_offset((previous_offset + *offset).unwrap()); // FIXME: Handle overflow @@ -73,7 +76,7 @@ pub fn eval_term(globals: &Globals, locals: &mut Locals, term: &Term) -> Value { locals.set_universe_offset(previous_offset); value } - Term::Error => Value::Error, + Term::Error => Arc::new(Value::Error), } } diff --git a/pikelet/src/core/typing.rs b/pikelet/src/core/typing.rs index fb2d09c85..73856a448 100644 --- a/pikelet/src/core/typing.rs +++ b/pikelet/src/core/typing.rs @@ -43,18 +43,19 @@ pub enum TypeError { MissingNamesInRecordTerm(Vec), UnexpectedNamesInRecordTerm(Vec), FieldNotFoundInRecord(String), - ExpectedRecord(Value), + ExpectedRecord(Arc), AmbiguousSequence, UnexpectedSequenceLength(usize, Arc), - ExpectedType(Value), - MismatchedTypes(Value, Value), + ExpectedType(Arc), + MismatchedTypes(Arc, Arc), } /// Check that a term is a universe and return its level. pub fn check_type(state: &mut State<'_>, term: &Term) -> Option { - match synth_term(state, term) { - Value::Universe(level) => Some(level), - r#type => { + let r#type = synth_term(state, term); + match r#type.as_ref() { + Value::Universe(level) => Some(*level), + _ => { state.report(TypeError::ExpectedType(r#type)); None } @@ -62,8 +63,8 @@ pub fn check_type(state: &mut State<'_>, term: &Term) -> Option { } /// Check that a term matches the expected type. -pub fn check_term(state: &mut State<'_>, term: &Term, expected_type: &Value) { - match (term, expected_type) { +pub fn check_term(state: &mut State<'_>, term: &Term, expected_type: &Arc) { + match (term, expected_type.as_ref()) { (Term::Sequence(entry_terms), Value::ArrayType(len, entry_type)) => { for entry_term in entry_terms { check_term(state, entry_term, entry_type); @@ -102,7 +103,7 @@ pub fn check_term(state: &mut State<'_>, term: &Term, expected_type: &Value) { state.report(TypeError::UnexpectedNamesInRecordTerm(unexpected_names)); } } - (term, expected_type) => match synth_term(state, term) { + (term, _) => match synth_term(state, term) { ty if semantics::is_subtype(&ty, expected_type) => {} ty => state.report(TypeError::MismatchedTypes(ty, expected_type.clone())), }, @@ -110,23 +111,23 @@ pub fn check_term(state: &mut State<'_>, term: &Term, expected_type: &Value) { } /// Synthesize the type of a term. -pub fn synth_term(state: &mut State<'_>, term: &Term) -> Value { +pub fn synth_term(state: &mut State<'_>, term: &Term) -> Arc { match term { Term::Universe(level) => match *level + UniverseOffset(1) { - Some(level) => Value::universe(level), + Some(level) => Arc::new(Value::universe(level)), None => { state.report(TypeError::MaximumUniverseLevelReached); - Value::Error + Arc::new(Value::Error) } }, Term::Global(name) => match state.globals.get(name) { Some((r#type, _)) => semantics::eval_term(state.globals, &mut state.locals, r#type), None => { state.report(TypeError::UnboundName(name.to_owned())); - Value::Error + Arc::new(Value::Error) } }, - Term::Constant(constant) => match constant { + Term::Constant(constant) => Arc::new(match constant { Constant::U8(_) => Value::global("U8", 0, Value::universe(0)), Constant::U16(_) => Value::global("U16", 0, Value::universe(0)), Constant::U32(_) => Value::global("U32", 0, Value::universe(0)), @@ -139,10 +140,10 @@ pub fn synth_term(state: &mut State<'_>, term: &Term) -> Value { Constant::F64(_) => Value::global("F64", 0, Value::universe(0)), Constant::Char(_) => Value::global("Char", 0, Value::universe(0)), Constant::String(_) => Value::global("String", 0, Value::universe(0)), - }, + }), Term::Sequence(_) => { state.report(TypeError::AmbiguousSequence); - Value::Error + Arc::new(Value::Error) } Term::Ann(term, r#type) => { check_type(state, r#type); @@ -153,10 +154,10 @@ pub fn synth_term(state: &mut State<'_>, term: &Term) -> Value { Term::RecordTerm(term_entries) => { let type_entries = term_entries .iter() - .map(|(name, term)| (name.clone(), Arc::new(synth_term(state, term)))) + .map(|(name, term)| (name.clone(), synth_term(state, term))) .collect(); - Value::RecordType(type_entries) + Arc::new(Value::RecordType(type_entries)) } Term::RecordType(type_entries) => { use std::collections::BTreeSet; @@ -171,7 +172,7 @@ pub fn synth_term(state: &mut State<'_>, term: &Term) -> Value { } max_level = match check_type(state, r#type) { Some(level) => std::cmp::max(max_level, level), - None => return Value::Error, + None => return Arc::new(Value::Error), }; } @@ -179,39 +180,42 @@ pub fn synth_term(state: &mut State<'_>, term: &Term) -> Value { state.report(TypeError::DuplicateNamesInRecordType(duplicate_names)); } - Value::Universe(max_level) + Arc::new(Value::Universe(max_level)) } - Term::RecordElim(head, name) => match synth_term(state, head) { - Value::RecordType(type_entries) => { - match type_entries.iter().find(|(n, _)| n == name) { - Some((_, r#type)) => (**r#type).clone(), // TODO: return `Arc`? - None => { - state.report(TypeError::FieldNotFoundInRecord(name.clone())); - Value::Error + Term::RecordElim(head, name) => { + let head_type = synth_term(state, head); + match head_type.as_ref() { + Value::RecordType(type_entries) => { + match type_entries.iter().find(|(n, _)| n == name) { + Some((_, r#type)) => r#type.clone(), + None => { + state.report(TypeError::FieldNotFoundInRecord(name.clone())); + Arc::new(Value::Error) + } } } + _ => { + state.report(TypeError::ExpectedRecord(head_type)); + Arc::new(Value::Error) + } } - head_type => { - state.report(TypeError::ExpectedRecord(head_type)); - Value::Error - } - }, + } Term::ArrayType(len, entry_type) => { - let u32_type = Value::global("U32", 0, Value::universe(0)); + let u32_type = Arc::new(Value::global("U32", 0, Value::universe(0))); check_term(state, len, &u32_type); let level = check_type(state, entry_type); match level { - Some(level) => Value::Universe(level), - None => Value::Error, + Some(level) => Arc::new(Value::Universe(level)), + None => Arc::new(Value::Error), } } Term::ListType(entry_type) => { let level = check_type(state, entry_type); match level { - Some(level) => Value::Universe(level), - None => Value::Error, + Some(level) => Arc::new(Value::Universe(level)), + None => Arc::new(Value::Error), } } Term::Lift(term, shift) => match state.locals.universe_offset() + *shift { @@ -223,9 +227,9 @@ pub fn synth_term(state: &mut State<'_>, term: &Term) -> Value { } None => { state.report(TypeError::MaximumUniverseLevelReached); - Value::Error + Arc::new(Value::Error) } }, - Term::Error => Value::Error, + Term::Error => Arc::new(Value::Error), } } diff --git a/pikelet/src/surface/projections/core.rs b/pikelet/src/surface/projections/core.rs index 207af18f7..9be2480e3 100644 --- a/pikelet/src/surface/projections/core.rs +++ b/pikelet/src/surface/projections/core.rs @@ -43,16 +43,16 @@ pub enum TypeError { MissingNamesInRecordTerm(Vec), UnexpectedNamesInRecordTerm(Vec), FieldNotFoundInRecord(String), - ExpectedRecord(core::Value), + ExpectedRecord(Arc), InvalidNumberLiteral, InvalidCharLiteral, InvalidStringLiteral, - NoLiteralConversion(core::Value), + NoLiteralConversion(Arc), AmbiguousLiteral, AmbiguousSequence, UnexpectedSequenceLength(usize, Arc), - ExpectedType(core::Value), - MismatchedTypes(core::Value, core::Value), + ExpectedType(Arc), + MismatchedTypes(Arc, Arc), } /// Check that a term is a universe and return its level. @@ -60,9 +60,10 @@ pub fn check_type>( state: &mut State<'_>, term: &Term, ) -> (core::Term, Option) { - match synth_term(state, term) { - (term, core::Value::Universe(level)) => (term, Some(level)), - (_, r#type) => { + let (term, r#type) = synth_term(state, term); + match r#type.as_ref() { + core::Value::Universe(level) => (term, Some(*level)), + _ => { state.report(TypeError::ExpectedType(r#type)); (core::Term::Error, None) } @@ -73,37 +74,35 @@ pub fn check_type>( pub fn check_term>( state: &mut State<'_>, term: &Term, - expected_type: &core::Value, + expected_type: &Arc, ) -> core::Term { - match (term, expected_type) { - (Term::Literal(_, literal), _) => match expected_type { - core::Value::Elim(core::Head::Global(name, _), spine, _) => { - use crate::core::Constant::*; + match (term, expected_type.as_ref()) { + (Term::Literal(_, literal), core::Value::Elim(core::Head::Global(name, _), spine, _)) => { + use crate::core::Constant::*; - match (literal, name.as_ref(), spine.as_slice()) { - (Literal::Number(data), "U8", []) => parse_number(state, data, U8), - (Literal::Number(data), "U16", []) => parse_number(state, data, U16), - (Literal::Number(data), "U32", []) => parse_number(state, data, U32), - (Literal::Number(data), "U64", []) => parse_number(state, data, U64), - (Literal::Number(data), "S8", []) => parse_number(state, data, S8), - (Literal::Number(data), "S16", []) => parse_number(state, data, S16), - (Literal::Number(data), "S32", []) => parse_number(state, data, S32), - (Literal::Number(data), "S64", []) => parse_number(state, data, S64), - (Literal::Number(data), "F32", []) => parse_number(state, data, F32), - (Literal::Number(data), "F64", []) => parse_number(state, data, F64), - (Literal::Char(data), "Char", []) => parse_char(state, data), - (Literal::String(data), "String", []) => parse_string(state, data), - (_, _, _) => { - state.report(TypeError::NoLiteralConversion(expected_type.clone())); - core::Term::Error - } + match (literal, name.as_ref(), spine.as_slice()) { + (Literal::Number(data), "U8", []) => parse_number(state, data, U8), + (Literal::Number(data), "U16", []) => parse_number(state, data, U16), + (Literal::Number(data), "U32", []) => parse_number(state, data, U32), + (Literal::Number(data), "U64", []) => parse_number(state, data, U64), + (Literal::Number(data), "S8", []) => parse_number(state, data, S8), + (Literal::Number(data), "S16", []) => parse_number(state, data, S16), + (Literal::Number(data), "S32", []) => parse_number(state, data, S32), + (Literal::Number(data), "S64", []) => parse_number(state, data, S64), + (Literal::Number(data), "F32", []) => parse_number(state, data, F32), + (Literal::Number(data), "F64", []) => parse_number(state, data, F64), + (Literal::Char(data), "Char", []) => parse_char(state, data), + (Literal::String(data), "String", []) => parse_string(state, data), + (_, _, _) => { + state.report(TypeError::NoLiteralConversion(expected_type.clone())); + core::Term::Error } } - _ => { - state.report(TypeError::NoLiteralConversion(expected_type.clone())); - core::Term::Error - } - }, + } + (Term::Literal(_, _), _) => { + state.report(TypeError::NoLiteralConversion(expected_type.clone())); + core::Term::Error + } (Term::Sequence(_, entry_terms), core::Value::ArrayType(len, core_entry_type)) => { let core_entry_terms = entry_terms .iter() @@ -175,7 +174,7 @@ pub fn check_term>( core::Term::RecordTerm(core_term_entries) } - (term, expected_type) => match synth_term(state, term) { + (term, _) => match synth_term(state, term) { (term, ty) if core::semantics::is_subtype(&ty, expected_type) => term, (_, ty) => { state.report(TypeError::MismatchedTypes(ty, expected_type.clone())); @@ -189,7 +188,7 @@ pub fn check_term>( pub fn synth_term>( state: &mut State<'_>, term: &Term, -) -> (core::Term, core::Value) { +) -> (core::Term, Arc) { use std::collections::{BTreeMap, BTreeSet}; match term { @@ -200,7 +199,7 @@ pub fn synth_term>( ), None => { state.report(TypeError::UnboundName(name.as_ref().to_owned())); - (core::Term::Error, core::Value::Error) + (core::Term::Error, Arc::new(core::Value::Error)) } }, Term::Ann(term, r#type) => { @@ -216,20 +215,20 @@ pub fn synth_term>( Term::Literal(_, literal) => match literal { Literal::Number(_) => { state.report(TypeError::AmbiguousLiteral); - (core::Term::Error, core::Value::Error) + (core::Term::Error, Arc::new(core::Value::Error)) } Literal::Char(data) => ( parse_char(state, data), - core::Value::global("Char", 0, core::Value::universe(0)), + Arc::new(core::Value::global("Char", 0, core::Value::universe(0))), ), Literal::String(data) => ( parse_string(state, data), - core::Value::global("String", 0, core::Value::universe(0)), + Arc::new(core::Value::global("String", 0, core::Value::universe(0))), ), }, Term::Sequence(_, _) => { state.report(TypeError::AmbiguousSequence); - (core::Term::Error, core::Value::Error) + (core::Term::Error, Arc::new(core::Value::Error)) } Term::RecordTerm(_, term_entries) => { let mut duplicate_names = Vec::new(); @@ -245,7 +244,7 @@ pub fn synth_term>( Entry::Occupied(_) => duplicate_names.push(name.as_ref().to_owned()), Entry::Vacant(entry) => { entry.insert(Arc::new(term)); - core_type_entries.push((name.as_ref().to_owned(), Arc::new(r#type))); + core_type_entries.push((name.as_ref().to_owned(), r#type)); } } } @@ -256,7 +255,7 @@ pub fn synth_term>( ( core::Term::RecordTerm(core_term_entries), - core::Value::RecordType(core_type_entries), + Arc::new(core::Value::RecordType(core_type_entries)), ) } Term::RecordType(_, type_entries) => { @@ -270,7 +269,7 @@ pub fn synth_term>( let (core_type, level) = check_type(state, r#type); max_level = match level { Some(level) => std::cmp::max(max_level, level), - None => return (core::Term::Error, core::Value::Error), + None => return (core::Term::Error, Arc::new(core::Value::Error)), }; core_type_entries.push((name.as_ref().to_owned(), Arc::new(core_type))); } else { @@ -285,38 +284,42 @@ pub fn synth_term>( ( core::Term::RecordType(core_type_entries), - core::Value::Universe(max_level), + Arc::new(core::Value::Universe(max_level)), ) } - Term::RecordElim(_, head, name) => match synth_term(state, head) { - (core_head, core::Value::RecordType(type_entries)) => { - match type_entries.iter().find(|(n, _)| n == name.as_ref()) { - Some((_, r#type)) => ( - core::Term::RecordElim(Arc::new(core_head), name.as_ref().to_owned()), - (**r#type).clone(), // TODO: return `Arc`? - ), - None => { - state.report(TypeError::FieldNotFoundInRecord(name.as_ref().to_owned())); - (core::Term::Error, core::Value::Error) + Term::RecordElim(_, head, name) => { + let (core_head, head_type) = synth_term(state, head); + match head_type.as_ref() { + core::Value::RecordType(type_entries) => { + match type_entries.iter().find(|(n, _)| n == name.as_ref()) { + Some((_, r#type)) => ( + core::Term::RecordElim(Arc::new(core_head), name.as_ref().to_owned()), + r#type.clone(), + ), + None => { + state + .report(TypeError::FieldNotFoundInRecord(name.as_ref().to_owned())); + (core::Term::Error, Arc::new(core::Value::Error)) + } } } + _ => { + state.report(TypeError::ExpectedRecord(head_type)); + (core::Term::Error, Arc::new(core::Value::Error)) + } } - (_, head_type) => { - state.report(TypeError::ExpectedRecord(head_type)); - (core::Term::Error, core::Value::Error) - } - }, + } Term::ArrayType(_, len, entry_type) => { - let u32_type = core::Value::global("U32", 0, core::Value::universe(0)); + let u32_type = Arc::new(core::Value::global("U32", 0, core::Value::universe(0))); let core_len = Arc::new(check_term(state, len, &u32_type)); let (core_entry_type, level) = check_type(state, entry_type); match level { Some(level) => ( core::Term::ArrayType(core_len, Arc::new(core_entry_type)), - core::Value::Universe(level), + Arc::new(core::Value::Universe(level)), ), - None => (core::Term::Error, core::Value::Error), + None => (core::Term::Error, Arc::new(core::Value::Error)), } } Term::ListType(_, entry_type) => { @@ -325,9 +328,9 @@ pub fn synth_term>( match level { Some(level) => ( core::Term::ListType(Arc::new(core_entry_type)), - core::Value::Universe(level), + Arc::new(core::Value::Universe(level)), ), - None => (core::Term::Error, core::Value::Error), + None => (core::Term::Error, Arc::new(core::Value::Error)), } } Term::Lift(_, term, offset) => { @@ -340,11 +343,11 @@ pub fn synth_term>( } None => { state.report(TypeError::MaximumUniverseLevelReached); - (core::Term::Error, core::Value::Error) + (core::Term::Error, Arc::new(core::Value::Error)) } } } - Term::Error(_) => (core::Term::Error, core::Value::Error), + Term::Error(_) => (core::Term::Error, Arc::new(core::Value::Error)), } } From 2fe4530ccba4217a3779e9bd7873104f2294bb2a Mon Sep 17 00:00:00 2001 From: Brendan Zabarauskas Date: Sat, 4 Jan 2020 21:01:42 +1100 Subject: [PATCH 18/88] Clean up record elimination evaluation --- pikelet/src/core/semantics.rs | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/pikelet/src/core/semantics.rs b/pikelet/src/core/semantics.rs index dd933592f..252c81b70 100644 --- a/pikelet/src/core/semantics.rs +++ b/pikelet/src/core/semantics.rs @@ -49,19 +49,20 @@ pub fn eval_term(globals: &Globals, locals: &mut Locals, term: &Term) -> Arc value.clone(), None => Arc::new(Value::Error), }, - Value::Elim(head, elims, r#type) => match r#type.as_ref() { - Value::RecordType(type_entries) => { - match type_entries.iter().find(|(n, _)| n == name) { - Some((_, entry_type)) => { - let mut elims = elims.clone(); // TODO: avoid cloning - elims.push(Elim::Record(name.clone())); - Arc::new(Value::Elim(head.clone(), elims, entry_type.clone())) - } - None => Arc::new(Value::Error), - } - } - _ => Arc::new(Value::Error), - }, + Value::Elim(head, elims, r#type) => { + let type_entries = match r#type.as_ref() { + Value::RecordType(type_entries) => type_entries, + _ => return Arc::new(Value::Error), + }; + let entry_type = match type_entries.iter().find(|(n, _)| n == name) { + Some((_, entry_type)) => entry_type, + None => return Arc::new(Value::Error), + }; + + let mut elims = elims.clone(); // TODO: Avoid clone? + elims.push(Elim::Record(name.clone())); + Arc::new(Value::Elim(head.clone(), elims, entry_type.clone())) + } _ => Arc::new(Value::Error), }, Term::ArrayType(len, entry_type) => Arc::new(Value::ArrayType( From e3afc0adeea53da4b51e9494a0246199ffff84ac Mon Sep 17 00:00:00 2001 From: Brendan Zabarauskas Date: Sun, 5 Jan 2020 09:32:48 +1100 Subject: [PATCH 19/88] Add Symbolics Lisp as possible gui inspiration --- pikelet-gui/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/pikelet-gui/README.md b/pikelet-gui/README.md index 13ffdfbe0..610255626 100644 --- a/pikelet-gui/README.md +++ b/pikelet-gui/README.md @@ -21,6 +21,7 @@ While the hopes behind this are ambitious, we will need to proceed carefully, ta - [MPS](https://www.jetbrains.com/mps/) - [Pharo](https://pharo.org/) - [Self](https://www.jetbrains.com/mps/) +- [Symbolics Lisp](https://twitter.com/RainerJoswig/status/1213528401774071813) ### Collections From 2a5f8de00e65c38ca69bba65e58c57f2568fdfef Mon Sep 17 00:00:00 2001 From: Brendan Zabarauskas Date: Sun, 5 Jan 2020 14:09:10 +1100 Subject: [PATCH 20/88] First pass on a basic REPL implementation --- README.md | 2 +- pikelet-cli/Cargo.toml | 2 ++ pikelet-cli/src/lib.rs | 27 +++++++++++++++ pikelet-cli/src/main.rs | 8 +++-- pikelet-cli/src/repl.rs | 76 +++++++++++++++++++++++++++++++++++++++++ 5 files changed, 112 insertions(+), 3 deletions(-) create mode 100644 pikelet-cli/src/lib.rs create mode 100644 pikelet-cli/src/repl.rs diff --git a/README.md b/README.md index 9b44caea7..e9df02c61 100644 --- a/README.md +++ b/README.md @@ -95,7 +95,7 @@ You can read more about what we hope to achieve in [_Pondering the next version ### Tooling -- [ ] REPL +- [x] REPL - [ ] Package manager - [ ] Auto-formatter for surface language - [ ] Structured editor diff --git a/pikelet-cli/Cargo.toml b/pikelet-cli/Cargo.toml index a60b08228..d34ec2d12 100644 --- a/pikelet-cli/Cargo.toml +++ b/pikelet-cli/Cargo.toml @@ -16,3 +16,5 @@ license = "Apache-2.0" [dependencies] pikelet = { path = "../pikelet" } +rustyline = "5.0" +structopt = "0.3" diff --git a/pikelet-cli/src/lib.rs b/pikelet-cli/src/lib.rs new file mode 100644 index 000000000..18eac05d2 --- /dev/null +++ b/pikelet-cli/src/lib.rs @@ -0,0 +1,27 @@ +use std::error::Error; + +pub mod repl; + +/// The Pikelet command line interface. +#[derive(structopt::StructOpt)] +#[structopt(name = "mltt")] +pub enum Options { + /// Type check some files. + #[structopt(name = "check")] + Check, + /// Runs the language server/IDE support. + #[structopt(name = "ide")] + Ide, + /// Runs the REPL/interactive mode. + #[structopt(name = "repl")] + Repl(repl::Options), +} + +/// Run the CLI with the given options +pub fn run(options: Options) -> Result<(), Box> { + match options { + Options::Check => Err("not yet implemented".into()), + Options::Ide => Err("not yet implemented".into()), + Options::Repl(options) => repl::run(options), + } +} diff --git a/pikelet-cli/src/main.rs b/pikelet-cli/src/main.rs index e7a11a969..39b42a63e 100644 --- a/pikelet-cli/src/main.rs +++ b/pikelet-cli/src/main.rs @@ -1,3 +1,7 @@ -fn main() { - println!("Hello, world!"); +use pikelet_cli::Options; +use std::error::Error; +use structopt::StructOpt; + +fn main() -> Result<(), Box> { + pikelet_cli::run(Options::from_args()) } diff --git a/pikelet-cli/src/repl.rs b/pikelet-cli/src/repl.rs new file mode 100644 index 000000000..900ac0f1e --- /dev/null +++ b/pikelet-cli/src/repl.rs @@ -0,0 +1,76 @@ +use std::error::Error; +use std::path::PathBuf; + +/// The Pikelet REPL/interactive mode. +#[derive(structopt::StructOpt)] +pub struct Options { + /// The file to save the command history to. + #[structopt(long = "history-file", default_value = "repl-history")] + pub history_file: PathBuf, + /// The prompt to display before expressions. + #[structopt(long = "prompt", default_value = "> ")] + pub prompt: String, +} + +/// Run the REPL with the given options. +pub fn run(options: Options) -> Result<(), Box> { + use pikelet::{core, surface}; + use rustyline::error::ReadlineError; + use rustyline::{Config, Editor}; + + let mut editor = { + let config = Config::builder() + .history_ignore_space(true) + .history_ignore_dups(true) + .build(); + + Editor::<()>::with_config(config) + }; + + if editor.load_history(&options.history_file).is_err() { + // No previous REPL history! + } + + let globals = core::Globals::default(); + let mut state = surface::projections::core::State::new(&globals); + + loop { + match editor.readline(&options.prompt) { + Ok(line) => { + editor.add_history_entry(&line); + + let surface_term = match surface::Term::from_str(&line) { + Ok(surface_term) => surface_term, + Err(error) => { + println!("error: {}", error); + continue; + } + }; + let (core_term, _type) = + surface::projections::core::synth_term(&mut state, &surface_term); + + if !state.errors.is_empty() { + for error in &state.errors { + println!("error: {:?}", error); + } + println!(); + state.errors.clear(); + } else { + println!("{:?}", core_term); + + // TODO: normalize term + // TODO: print `{term} : {type}` + } + } + Err(ReadlineError::Interrupted) => println!("Interrupted!"), + Err(ReadlineError::Eof) => break, + Err(error) => return Err(error.into()), + } + } + + editor.save_history(&options.history_file)?; + + println!("Bye bye"); + + Ok(()) +} From 234a182ea3d7ab76f661c5b5139f3030dc1b54e5 Mon Sep 17 00:00:00 2001 From: Brendan Zabarauskas Date: Sun, 5 Jan 2020 16:13:38 +1100 Subject: [PATCH 21/88] Remove some debugging code --- pikelet/tests/examples.rs | 5 ----- 1 file changed, 5 deletions(-) diff --git a/pikelet/tests/examples.rs b/pikelet/tests/examples.rs index 064ce376e..88ed3d8bd 100644 --- a/pikelet/tests/examples.rs +++ b/pikelet/tests/examples.rs @@ -19,9 +19,6 @@ fn run_test(input: &str) { eprintln!(); } - eprintln!("{:?}", core_term); - eprintln!("{:?}", r#type); - let mut state = core::typing::State::new(&globals); core::typing::synth_term(&mut state, &core_term); if !state.errors.is_empty() { @@ -44,8 +41,6 @@ fn run_test(input: &str) { eprintln!(); } - eprintln!("{:?}", r#type); - if is_failed { panic!("failed sample"); } From e026b458adf30fcf21156991009e9a544cac558e Mon Sep 17 00:00:00 2001 From: Brendan Zabarauskas Date: Sun, 5 Jan 2020 16:13:58 +1100 Subject: [PATCH 22/88] Make naming more consistent --- pikelet/src/core/semantics.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pikelet/src/core/semantics.rs b/pikelet/src/core/semantics.rs index 252c81b70..332d7dfd9 100644 --- a/pikelet/src/core/semantics.rs +++ b/pikelet/src/core/semantics.rs @@ -159,7 +159,7 @@ pub fn read_back_nf(/* TODO: level, */ value: &Value, r#type: &Value) -> Term { } /// Fully normalize a term. -pub fn normalize(globals: &Globals, locals: &mut Locals, term: &Term, r#type: &Value) -> Term { +pub fn normalize_term(globals: &Globals, locals: &mut Locals, term: &Term, r#type: &Value) -> Term { read_back_nf(&eval_term(globals, locals, term), r#type) } From e3aa4a787549f9b7a6ccb27fa18053a919161485 Mon Sep 17 00:00:00 2001 From: Brendan Zabarauskas Date: Sun, 5 Jan 2020 16:23:36 +1100 Subject: [PATCH 23/88] Clarify status of cli subcommands --- pikelet-cli/src/lib.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pikelet-cli/src/lib.rs b/pikelet-cli/src/lib.rs index 18eac05d2..14de809e7 100644 --- a/pikelet-cli/src/lib.rs +++ b/pikelet-cli/src/lib.rs @@ -6,10 +6,10 @@ pub mod repl; #[derive(structopt::StructOpt)] #[structopt(name = "mltt")] pub enum Options { - /// Type check some files. + /// Type check some files (not yet implemented). #[structopt(name = "check")] Check, - /// Runs the language server/IDE support. + /// Runs the language server/IDE support (not yet implemented). #[structopt(name = "ide")] Ide, /// Runs the REPL/interactive mode. From e47c6a54e394e5133dda8453fa14f228a7f01e31 Mon Sep 17 00:00:00 2001 From: Brendan Zabarauskas Date: Sun, 5 Jan 2020 22:12:26 +1100 Subject: [PATCH 24/88] Begin stub implementation of an iced gui --- pikelet-gui/Cargo.toml | 1 + pikelet-gui/src/lib.rs | 28 ++++++++++++++++++++++++++++ pikelet-gui/src/main.rs | 5 ++++- 3 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 pikelet-gui/src/lib.rs diff --git a/pikelet-gui/Cargo.toml b/pikelet-gui/Cargo.toml index 4170c9098..fe687f5b0 100644 --- a/pikelet-gui/Cargo.toml +++ b/pikelet-gui/Cargo.toml @@ -15,4 +15,5 @@ license = "Apache-2.0" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] +iced = "0.1.0-beta" pikelet = { path = "../pikelet" } diff --git a/pikelet-gui/src/lib.rs b/pikelet-gui/src/lib.rs new file mode 100644 index 000000000..74b6f2c6a --- /dev/null +++ b/pikelet-gui/src/lib.rs @@ -0,0 +1,28 @@ +use iced::{Container, Element, Sandbox, Text}; + +#[derive(Debug, Clone)] +pub enum Message {} + +pub struct Workspace {} + +impl Sandbox for Workspace { + type Message = Message; + + fn new() -> Workspace { + Workspace {} + } + + fn title(&self) -> String { + format!("Pikelet") + } + + fn update(&mut self, message: Message) { + match message {} + } + + fn view(&mut self) -> Element { + let Workspace {} = self; + + Container::new(Text::new("Hi this is Pikelet!")).into() + } +} diff --git a/pikelet-gui/src/main.rs b/pikelet-gui/src/main.rs index e7a11a969..1535b46b6 100644 --- a/pikelet-gui/src/main.rs +++ b/pikelet-gui/src/main.rs @@ -1,3 +1,6 @@ +use iced::{Sandbox, Settings}; +use pikelet_gui::Workspace; + fn main() { - println!("Hello, world!"); + Workspace::run(Settings::default()) } From 76abcba470092281a137a4020659e4e403de78b3 Mon Sep 17 00:00:00 2001 From: Brendan Zabarauskas Date: Mon, 6 Jan 2020 11:44:58 +1100 Subject: [PATCH 25/88] Render globals in gui --- pikelet-gui/src/lib.rs | 38 ++++++++++++++++++++++++++++++++------ pikelet/src/core/mod.rs | 4 ++++ 2 files changed, 36 insertions(+), 6 deletions(-) diff --git a/pikelet-gui/src/lib.rs b/pikelet-gui/src/lib.rs index 74b6f2c6a..bcab19793 100644 --- a/pikelet-gui/src/lib.rs +++ b/pikelet-gui/src/lib.rs @@ -1,15 +1,19 @@ -use iced::{Container, Element, Sandbox, Text}; +use iced::{Column, Container, Element, Sandbox, Text}; #[derive(Debug, Clone)] pub enum Message {} -pub struct Workspace {} +pub struct Workspace { + globals: pikelet::core::Globals, +} impl Sandbox for Workspace { type Message = Message; fn new() -> Workspace { - Workspace {} + Workspace { + globals: pikelet::core::Globals::default(), + } } fn title(&self) -> String { @@ -21,8 +25,30 @@ impl Sandbox for Workspace { } fn view(&mut self) -> Element { - let Workspace {} = self; - - Container::new(Text::new("Hi this is Pikelet!")).into() + let Workspace { globals } = self; + + Container::new( + Column::new() + .push(Text::new("Hi this is Pikelet!")) + .push(Text::new("")) + .push( + globals + .entries() + .fold(Column::new(), |column, (name, (r#type, term))| match term { + None => column.push(Text::new(format!( + "{} : {type:?}", // TODO: pretty print? + name, + r#type = r#type, + ))), + Some(term) => column.push(Text::new(format!( + "{} : {type:?} = {term:?}", // TODO: pretty print? + name, + r#type = r#type, + term = term, + ))), + }), + ), + ) + .into() } } diff --git a/pikelet/src/core/mod.rs b/pikelet/src/core/mod.rs index b124cf6af..eb054b126 100644 --- a/pikelet/src/core/mod.rs +++ b/pikelet/src/core/mod.rs @@ -213,6 +213,10 @@ impl Globals { pub fn get(&self, name: &str) -> Option<&(Arc, Option>)> { self.entries.get(name) } + + pub fn entries(&self) -> impl Iterator, Option>))> { + self.entries.iter() + } } impl Default for Globals { From cc80833c4257aa67a791321adbab984ac09ad06c Mon Sep 17 00:00:00 2001 From: Brendan Zabarauskas Date: Mon, 6 Jan 2020 11:52:18 +1100 Subject: [PATCH 26/88] Align globals using rows --- pikelet-gui/src/lib.rs | 26 ++++++++++++-------------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/pikelet-gui/src/lib.rs b/pikelet-gui/src/lib.rs index bcab19793..4fae16577 100644 --- a/pikelet-gui/src/lib.rs +++ b/pikelet-gui/src/lib.rs @@ -1,4 +1,4 @@ -use iced::{Column, Container, Element, Sandbox, Text}; +use iced::{Column, Container, Element, Row, Sandbox, Text}; #[derive(Debug, Clone)] pub enum Message {} @@ -30,22 +30,20 @@ impl Sandbox for Workspace { Container::new( Column::new() .push(Text::new("Hi this is Pikelet!")) - .push(Text::new("")) + .push(Text::new("Globals:")) .push( globals .entries() - .fold(Column::new(), |column, (name, (r#type, term))| match term { - None => column.push(Text::new(format!( - "{} : {type:?}", // TODO: pretty print? - name, - r#type = r#type, - ))), - Some(term) => column.push(Text::new(format!( - "{} : {type:?} = {term:?}", // TODO: pretty print? - name, - r#type = r#type, - term = term, - ))), + .fold(Column::new(), |column, (name, (r#type, term))| { + column.push( + Row::new() + .push(Text::new(name)) + .push(Text::new(format!(" : {:?}", r#type))) // TODO: pretty print? + .push(match term { + None => Text::new(""), + Some(term) => Text::new(format!(" = {:?}", term)), // TODO: pretty print? + }), + ) }), ), ) From 93c74f3e9e2d0d4e243301e3fde92140545774ed Mon Sep 17 00:00:00 2001 From: Brendan Zabarauskas Date: Mon, 6 Jan 2020 12:23:46 +1100 Subject: [PATCH 27/88] Begin pretty printing terms --- pikelet-gui/src/lib.rs | 44 ++++++++++++++++++++++++++++++++++-------- 1 file changed, 36 insertions(+), 8 deletions(-) diff --git a/pikelet-gui/src/lib.rs b/pikelet-gui/src/lib.rs index 4fae16577..c0f6f1717 100644 --- a/pikelet-gui/src/lib.rs +++ b/pikelet-gui/src/lib.rs @@ -35,18 +35,46 @@ impl Sandbox for Workspace { globals .entries() .fold(Column::new(), |column, (name, (r#type, term))| { - column.push( - Row::new() + column.push({ + let entry = Row::new() .push(Text::new(name)) - .push(Text::new(format!(" : {:?}", r#type))) // TODO: pretty print? - .push(match term { - None => Text::new(""), - Some(term) => Text::new(format!(" = {:?}", term)), // TODO: pretty print? - }), - ) + .push(Text::new(" : ")) + .push(view_term(r#type)); + + match term { + None => entry.push(Text::new("")).push(Text::new("")), + Some(term) => { + entry.push(Text::new(" = ")).push(view_term(term)) + } + } + }) }), ), ) .into() } } + +fn view_term(term: &pikelet::core::Term) -> Element { + use pikelet::core::Term; + + match term { + Term::Universe(level) => Row::new() + .push(Text::new(format!("Type^{}", level.0))) // TODO: superscript? + .into(), + Term::Global(name) => Text::new(name).into(), + Term::Constant(_) => Text::new("todo").into(), + Term::Sequence(_) => Text::new("todo").into(), + Term::Ann(_, _) => Text::new("todo").into(), + Term::RecordTerm(_) => Text::new("todo").into(), + Term::RecordType(_) => Text::new("todo").into(), + Term::RecordElim(_, _) => Text::new("todo").into(), + Term::ArrayType(_, _) => Text::new("todo").into(), + Term::ListType(_) => Text::new("todo").into(), + Term::Lift(term, shift) => Row::new() + .push(view_term(term)) + .push(Text::new(format!("^{}", shift.0))) + .into(), + Term::Error => Text::new("ERROR!").into(), + } +} From e23c5afc5273fd0ddbe7af9f63635a1f1067efb0 Mon Sep 17 00:00:00 2001 From: Brendan Zabarauskas Date: Mon, 6 Jan 2020 13:07:16 +1100 Subject: [PATCH 28/88] Make globals less misleading --- pikelet-gui/src/lib.rs | 10 +++++----- pikelet/src/core/mod.rs | 41 ++++++++++++++++++++--------------------- 2 files changed, 25 insertions(+), 26 deletions(-) diff --git a/pikelet-gui/src/lib.rs b/pikelet-gui/src/lib.rs index c0f6f1717..29af6836c 100644 --- a/pikelet-gui/src/lib.rs +++ b/pikelet-gui/src/lib.rs @@ -56,11 +56,11 @@ impl Sandbox for Workspace { } fn view_term(term: &pikelet::core::Term) -> Element { - use pikelet::core::Term; + use pikelet::core::{Term, UniverseLevel, UniverseOffset}; match term { - Term::Universe(level) => Row::new() - .push(Text::new(format!("Type^{}", level.0))) // TODO: superscript? + Term::Universe(UniverseLevel(level)) => Row::new() + .push(Text::new(format!("Univ^{}", level))) // TODO: superscript? .into(), Term::Global(name) => Text::new(name).into(), Term::Constant(_) => Text::new("todo").into(), @@ -71,9 +71,9 @@ fn view_term(term: &pikelet::core::Term) -> Element { Term::RecordElim(_, _) => Text::new("todo").into(), Term::ArrayType(_, _) => Text::new("todo").into(), Term::ListType(_) => Text::new("todo").into(), - Term::Lift(term, shift) => Row::new() + Term::Lift(term, UniverseOffset(offset)) => Row::new() .push(view_term(term)) - .push(Text::new(format!("^{}", shift.0))) + .push(Text::new(format!("^{}", offset))) .into(), Term::Error => Text::new("ERROR!").into(), } diff --git a/pikelet/src/core/mod.rs b/pikelet/src/core/mod.rs index eb054b126..0c8b9bb8e 100644 --- a/pikelet/src/core/mod.rs +++ b/pikelet/src/core/mod.rs @@ -99,6 +99,11 @@ impl Term { Term::Universe(level.into()) } + /// Create a reference to global variable. + pub fn global(name: impl Into) -> Term { + Term::Global(name.into()) + } + pub fn lift(self, offset: impl Into) -> Term { match offset.into() { UniverseOffset(0) => self, @@ -230,27 +235,21 @@ impl Default for Globals { Some(Arc::new(Term::universe(0))), ), ); - entries.insert("Bool".to_owned(), (Arc::new(Term::universe(0)), None)); - entries.insert("U8".to_owned(), (Arc::new(Term::universe(0)), None)); - entries.insert("U16".to_owned(), (Arc::new(Term::universe(0)), None)); - entries.insert("U32".to_owned(), (Arc::new(Term::universe(0)), None)); - entries.insert("U64".to_owned(), (Arc::new(Term::universe(0)), None)); - entries.insert("S8".to_owned(), (Arc::new(Term::universe(0)), None)); - entries.insert("S16".to_owned(), (Arc::new(Term::universe(0)), None)); - entries.insert("S32".to_owned(), (Arc::new(Term::universe(0)), None)); - entries.insert("S64".to_owned(), (Arc::new(Term::universe(0)), None)); - entries.insert("F32".to_owned(), (Arc::new(Term::universe(0)), None)); - entries.insert("F64".to_owned(), (Arc::new(Term::universe(0)), None)); - entries.insert("Char".to_owned(), (Arc::new(Term::universe(0)), None)); - entries.insert("String".to_owned(), (Arc::new(Term::universe(0)), None)); - entries.insert( - "true".to_owned(), - (Arc::new(Term::Global("Bool".to_owned())), None), - ); - entries.insert( - "false".to_owned(), - (Arc::new(Term::Global("Bool".to_owned())), None), - ); + entries.insert("Bool".to_owned(), (Arc::new(Term::global("Type")), None)); + entries.insert("U8".to_owned(), (Arc::new(Term::global("Type")), None)); + entries.insert("U16".to_owned(), (Arc::new(Term::global("Type")), None)); + entries.insert("U32".to_owned(), (Arc::new(Term::global("Type")), None)); + entries.insert("U64".to_owned(), (Arc::new(Term::global("Type")), None)); + entries.insert("S8".to_owned(), (Arc::new(Term::global("Type")), None)); + entries.insert("S16".to_owned(), (Arc::new(Term::global("Type")), None)); + entries.insert("S32".to_owned(), (Arc::new(Term::global("Type")), None)); + entries.insert("S64".to_owned(), (Arc::new(Term::global("Type")), None)); + entries.insert("F32".to_owned(), (Arc::new(Term::global("Type")), None)); + entries.insert("F64".to_owned(), (Arc::new(Term::global("Type")), None)); + entries.insert("Char".to_owned(), (Arc::new(Term::global("Type")), None)); + entries.insert("String".to_owned(), (Arc::new(Term::global("Type")), None)); + entries.insert("true".to_owned(), (Arc::new(Term::global("Bool")), None)); + entries.insert("false".to_owned(), (Arc::new(Term::global("Bool")), None)); Globals::new(entries) } From 530fae611151780bea69fb0d625de46f2faa5d3c Mon Sep 17 00:00:00 2001 From: Brendan Zabarauskas Date: Mon, 6 Jan 2020 14:34:13 +1100 Subject: [PATCH 29/88] Render constants in GUI --- pikelet-gui/src/lib.rs | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/pikelet-gui/src/lib.rs b/pikelet-gui/src/lib.rs index 29af6836c..8b4d81455 100644 --- a/pikelet-gui/src/lib.rs +++ b/pikelet-gui/src/lib.rs @@ -56,14 +56,25 @@ impl Sandbox for Workspace { } fn view_term(term: &pikelet::core::Term) -> Element { - use pikelet::core::{Term, UniverseLevel, UniverseOffset}; + use pikelet::core::{Constant, Term, UniverseLevel, UniverseOffset}; match term { Term::Universe(UniverseLevel(level)) => Row::new() .push(Text::new(format!("Univ^{}", level))) // TODO: superscript? .into(), Term::Global(name) => Text::new(name).into(), - Term::Constant(_) => Text::new("todo").into(), + Term::Constant(Constant::U8(data)) => Text::new(data.to_string()).into(), + Term::Constant(Constant::U16(data)) => Text::new(data.to_string()).into(), + Term::Constant(Constant::U32(data)) => Text::new(data.to_string()).into(), + Term::Constant(Constant::U64(data)) => Text::new(data.to_string()).into(), + Term::Constant(Constant::S8(data)) => Text::new(data.to_string()).into(), + Term::Constant(Constant::S16(data)) => Text::new(data.to_string()).into(), + Term::Constant(Constant::S32(data)) => Text::new(data.to_string()).into(), + Term::Constant(Constant::S64(data)) => Text::new(data.to_string()).into(), + Term::Constant(Constant::F32(data)) => Text::new(data.to_string()).into(), + Term::Constant(Constant::F64(data)) => Text::new(data.to_string()).into(), + Term::Constant(Constant::Char(data)) => Text::new(format!("{:?}", data)).into(), + Term::Constant(Constant::String(data)) => Text::new(format!("{:?}", data)).into(), Term::Sequence(_) => Text::new("todo").into(), Term::Ann(_, _) => Text::new("todo").into(), Term::RecordTerm(_) => Text::new("todo").into(), From 3db39a483280dc3d0c5e1cf1d286cedb26fc2f2a Mon Sep 17 00:00:00 2001 From: Brendan Zabarauskas Date: Mon, 6 Jan 2020 14:42:06 +1100 Subject: [PATCH 30/88] Render annotated terms in GUI --- pikelet-gui/src/lib.rs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/pikelet-gui/src/lib.rs b/pikelet-gui/src/lib.rs index 8b4d81455..935288840 100644 --- a/pikelet-gui/src/lib.rs +++ b/pikelet-gui/src/lib.rs @@ -76,7 +76,11 @@ fn view_term(term: &pikelet::core::Term) -> Element { Term::Constant(Constant::Char(data)) => Text::new(format!("{:?}", data)).into(), Term::Constant(Constant::String(data)) => Text::new(format!("{:?}", data)).into(), Term::Sequence(_) => Text::new("todo").into(), - Term::Ann(_, _) => Text::new("todo").into(), + Term::Ann(term, r#type) => Row::new() + .push(view_term(term)) + .push(Text::new(" : ")) + .push(view_term(r#type)) + .into(), Term::RecordTerm(_) => Text::new("todo").into(), Term::RecordType(_) => Text::new("todo").into(), Term::RecordElim(_, _) => Text::new("todo").into(), From 90224a332f6b707fd6917228418f196c263c3b44 Mon Sep 17 00:00:00 2001 From: Brendan Zabarauskas Date: Mon, 6 Jan 2020 14:50:56 +1100 Subject: [PATCH 31/88] Allow the gui to be run from the cli --- pikelet-cli/Cargo.toml | 5 +++++ pikelet-cli/src/lib.rs | 9 +++++++++ pikelet-gui/src/lib.rs | 6 +++++- pikelet-gui/src/main.rs | 6 ------ 4 files changed, 19 insertions(+), 7 deletions(-) delete mode 100644 pikelet-gui/src/main.rs diff --git a/pikelet-cli/Cargo.toml b/pikelet-cli/Cargo.toml index d34ec2d12..40f6a0c3b 100644 --- a/pikelet-cli/Cargo.toml +++ b/pikelet-cli/Cargo.toml @@ -14,7 +14,12 @@ license = "Apache-2.0" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html +[features] +default = ["gui"] +gui = ["pikelet-gui"] + [dependencies] pikelet = { path = "../pikelet" } +pikelet-gui = { path = "../pikelet-gui", optional = true } rustyline = "5.0" structopt = "0.3" diff --git a/pikelet-cli/src/lib.rs b/pikelet-cli/src/lib.rs index 14de809e7..5ff3efed4 100644 --- a/pikelet-cli/src/lib.rs +++ b/pikelet-cli/src/lib.rs @@ -15,6 +15,10 @@ pub enum Options { /// Runs the REPL/interactive mode. #[structopt(name = "repl")] Repl(repl::Options), + /// Runs the GUI mode. + #[cfg(feature = "gui")] + #[structopt(name = "gui")] + Gui, } /// Run the CLI with the given options @@ -23,5 +27,10 @@ pub fn run(options: Options) -> Result<(), Box> { Options::Check => Err("not yet implemented".into()), Options::Ide => Err("not yet implemented".into()), Options::Repl(options) => repl::run(options), + #[cfg(feature = "gui")] + Options::Gui => { + pikelet_gui::run(); + Ok(()) + } } } diff --git a/pikelet-gui/src/lib.rs b/pikelet-gui/src/lib.rs index 935288840..ec101fa47 100644 --- a/pikelet-gui/src/lib.rs +++ b/pikelet-gui/src/lib.rs @@ -1,4 +1,8 @@ -use iced::{Column, Container, Element, Row, Sandbox, Text}; +use iced::{Column, Container, Element, Row, Sandbox, Settings, Text}; + +pub fn run() { + Workspace::run(Settings::default()) +} #[derive(Debug, Clone)] pub enum Message {} diff --git a/pikelet-gui/src/main.rs b/pikelet-gui/src/main.rs deleted file mode 100644 index 1535b46b6..000000000 --- a/pikelet-gui/src/main.rs +++ /dev/null @@ -1,6 +0,0 @@ -use iced::{Sandbox, Settings}; -use pikelet_gui::Workspace; - -fn main() { - Workspace::run(Settings::default()) -} From 3a0ed3fb88d1f96cf4cf1819b3b4055ffb5448fc Mon Sep 17 00:00:00 2001 From: Brendan Zabarauskas Date: Mon, 6 Jan 2020 15:07:44 +1100 Subject: [PATCH 32/88] Update gui README --- pikelet-gui/README.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/pikelet-gui/README.md b/pikelet-gui/README.md index 610255626..d95406904 100644 --- a/pikelet-gui/README.md +++ b/pikelet-gui/README.md @@ -1,10 +1,13 @@ # pikelet-gui This is intended to provided the basis for a structured programming environment for Pikelet. -It should both be natively compiled, be able to be run in a browser, or embedded in other applications, like game engines. - While the hopes behind this are ambitious, we will need to proceed carefully, taking care to avoid getting trapped down rabbit holes. +It should both be natively compiled, be able to be run in a browser, or embedded in other applications, like game engines. +For this, libraries like [Iced](https://github.com/hecrj/iced) could prove useful. +Another possibility could be to embed this within Electron-based IDEs like VS Code. +We might also want to eventually investigate implementing the programming environment using platform-specific GUI toolkits. + ## Inspiration ### Projects From d2a1447201df0149aeb03948f3249b5d2e64a2f4 Mon Sep 17 00:00:00 2001 From: Brendan Zabarauskas Date: Mon, 6 Jan 2020 19:15:12 +1100 Subject: [PATCH 33/88] Normalize terms in REPL --- pikelet-cli/src/repl.rs | 11 +++++----- pikelet/src/core/semantics.rs | 27 +++++++++++++++++++++++-- pikelet/src/surface/projections/core.rs | 8 ++++++++ 3 files changed, 39 insertions(+), 7 deletions(-) diff --git a/pikelet-cli/src/repl.rs b/pikelet-cli/src/repl.rs index 900ac0f1e..16b5e287c 100644 --- a/pikelet-cli/src/repl.rs +++ b/pikelet-cli/src/repl.rs @@ -1,5 +1,6 @@ use std::error::Error; use std::path::PathBuf; +use std::sync::Arc; /// The Pikelet REPL/interactive mode. #[derive(structopt::StructOpt)] @@ -46,20 +47,20 @@ pub fn run(options: Options) -> Result<(), Box> { continue; } }; - let (core_term, _type) = + let (core_term, r#type) = surface::projections::core::synth_term(&mut state, &surface_term); if !state.errors.is_empty() { for error in &state.errors { println!("error: {:?}", error); } - println!(); state.errors.clear(); } else { - println!("{:?}", core_term); + let core_term = state.normalize_term(&core_term, &r#type); + let r#type = state.read_back_type(&r#type); + let ann_term = core::Term::Ann(Arc::new(core_term), Arc::new(r#type)); - // TODO: normalize term - // TODO: print `{term} : {type}` + println!("{:?}", ann_term); // TODO: pretty print } } Err(ReadlineError::Interrupted) => println!("Interrupted!"), diff --git a/pikelet/src/core/semantics.rs b/pikelet/src/core/semantics.rs index 332d7dfd9..12bc4946b 100644 --- a/pikelet/src/core/semantics.rs +++ b/pikelet/src/core/semantics.rs @@ -153,8 +153,31 @@ pub fn read_back_nf(/* TODO: level, */ value: &Value, r#type: &Value) -> Term { | (Value::RecordType(_), _) | (Value::RecordTerm(_), _) | (Value::ArrayType(_, _), _) - | (Value::ListType(_), _) - | (Value::Error, _) => Term::Error, + | (Value::ListType(_), _) => Term::Error, // TODO: Report error + (Value::Error, _) => Term::Error, + } +} + +/// Read-back a type into the term syntax. +pub fn read_back_type(/* TODO: level, */ r#type: &Value) -> Term { + match r#type { + Value::Universe(level) => Term::Universe(*level), + Value::Elim(head, spine, _) => read_back_elim(head, spine), + Value::RecordType(type_entries) => { + let type_entries = type_entries + .iter() + .map(|(name, r#type)| (name.clone(), Arc::new(read_back_type(r#type)))) + .collect(); + + Term::RecordType(type_entries) + } + Value::ArrayType(len, entry_type) => Term::ArrayType( + Arc::new(read_back_type(len)), + Arc::new(read_back_type(entry_type)), + ), + Value::ListType(entry_type) => Term::ListType(Arc::new(read_back_type(entry_type))), + Value::Constant(_) | Value::Sequence(_) | Value::RecordTerm(_) => Term::Error, // TODO: Report error + Value::Error => Term::Error, } } diff --git a/pikelet/src/surface/projections/core.rs b/pikelet/src/surface/projections/core.rs index 9be2480e3..1423b49b5 100644 --- a/pikelet/src/surface/projections/core.rs +++ b/pikelet/src/surface/projections/core.rs @@ -32,6 +32,14 @@ impl<'me> State<'me> { pub fn clear(&mut self) { self.errors.clear(); } + + pub fn normalize_term(&mut self, term: &core::Term, r#type: &core::Value) -> core::Term { + core::semantics::normalize_term(self.globals, &mut self.locals, term, r#type) + } + + pub fn read_back_type(&mut self, r#type: &core::Value) -> core::Term { + core::semantics::read_back_type(r#type) + } } #[derive(Clone, Debug, PartialEq)] From ed8b2550284b44ff0fcbd26feeb4c3cd55542a02 Mon Sep 17 00:00:00 2001 From: Brendan Zabarauskas Date: Mon, 6 Jan 2020 19:36:45 +1100 Subject: [PATCH 34/88] Pretty print expressions in REPL --- pikelet-cli/Cargo.toml | 2 ++ pikelet-cli/src/repl.rs | 17 +++++++++++++++-- pikelet/Cargo.toml | 2 +- 3 files changed, 18 insertions(+), 3 deletions(-) diff --git a/pikelet-cli/Cargo.toml b/pikelet-cli/Cargo.toml index 40f6a0c3b..16312d925 100644 --- a/pikelet-cli/Cargo.toml +++ b/pikelet-cli/Cargo.toml @@ -21,5 +21,7 @@ gui = ["pikelet-gui"] [dependencies] pikelet = { path = "../pikelet" } pikelet-gui = { path = "../pikelet-gui", optional = true } +pretty = "0.8" rustyline = "5.0" structopt = "0.3" +term_size = "0.3.1" diff --git a/pikelet-cli/src/repl.rs b/pikelet-cli/src/repl.rs index 16b5e287c..2f2665e5f 100644 --- a/pikelet-cli/src/repl.rs +++ b/pikelet-cli/src/repl.rs @@ -32,6 +32,7 @@ pub fn run(options: Options) -> Result<(), Box> { // No previous REPL history! } + let pretty_alloc = pretty::BoxAllocator; let globals = core::Globals::default(); let mut state = surface::projections::core::State::new(&globals); @@ -58,9 +59,21 @@ pub fn run(options: Options) -> Result<(), Box> { } else { let core_term = state.normalize_term(&core_term, &r#type); let r#type = state.read_back_type(&r#type); - let ann_term = core::Term::Ann(Arc::new(core_term), Arc::new(r#type)); - println!("{:?}", ann_term); // TODO: pretty print + let ann_term = core::projections::surface::delaborate_term(&core::Term::Ann( + Arc::new(core_term), + Arc::new(r#type), + )); + let ann_term_doc = + surface::projections::pretty::pretty_term(&pretty_alloc, &ann_term); + + println!( + "{term}", + term = ann_term_doc.1.pretty(match term_size::dimensions() { + Some((width, _)) => width, + None => std::usize::MAX, + }), + ); } } Err(ReadlineError::Interrupted) => println!("Interrupted!"), diff --git a/pikelet/Cargo.toml b/pikelet/Cargo.toml index 840d5eaa8..1a1e1c5d6 100644 --- a/pikelet/Cargo.toml +++ b/pikelet/Cargo.toml @@ -16,7 +16,7 @@ license = "Apache-2.0" [dependencies] lalrpop-util = "0.17" -pretty = "0.7" +pretty = "0.8" regex = "1.3" [build-dependencies] From 37d34dd9e327737ee153843362be15efb4d95811 Mon Sep 17 00:00:00 2001 From: Brendan Zabarauskas Date: Mon, 6 Jan 2020 20:20:15 +1100 Subject: [PATCH 35/88] Port over niceties from existing Pikelet REPL --- pikelet-cli/src/repl.rs | 75 +++++++++++++++++++++++++++++------------ 1 file changed, 54 insertions(+), 21 deletions(-) diff --git a/pikelet-cli/src/repl.rs b/pikelet-cli/src/repl.rs index 2f2665e5f..6b02d5ad2 100644 --- a/pikelet-cli/src/repl.rs +++ b/pikelet-cli/src/repl.rs @@ -5,12 +5,47 @@ use std::sync::Arc; /// The Pikelet REPL/interactive mode. #[derive(structopt::StructOpt)] pub struct Options { - /// The file to save the command history to. - #[structopt(long = "history-file", default_value = "repl-history")] - pub history_file: PathBuf, /// The prompt to display before expressions. #[structopt(long = "prompt", default_value = "> ")] pub prompt: String, + /// Disable the welcome banner on startup. + #[structopt(long = "no-banner")] + pub no_banner: bool, + /// Disable saving of command history on exit. + #[structopt(long = "no-history")] + pub no_history: bool, + /// The file to save the command history to. + #[structopt(long = "history-file", default_value = "repl-history")] + pub history_file: PathBuf, +} + +fn print_welcome_banner() { + const WELCOME_BANNER: &[&str] = &[ + r" ____ _ __ __ __ ", + r" / __ \(_) /_____ / /__ / /_ ", + r" / /_/ / / //_/ _ \/ / _ \/ __/ ", + r" / ____/ / ,< / __/ / __/ /_ ", + r"/_/ /_/_/|_|\___/_/\___/\__/ ", + r"", + ]; + + for (i, line) in WELCOME_BANNER.iter().enumerate() { + // warning on `env!` is a known issue + #[cfg_attr(feature = "cargo-clippy", allow(print_literal))] + match i { + 2 => println!("{}Version {}", line, env!("CARGO_PKG_VERSION")), + 3 => println!("{}{}", line, env!("CARGO_PKG_HOMEPAGE")), + 4 => println!("{}:? for help", line), + _ => println!("{}", line), + } + } +} + +fn term_width() -> usize { + match term_size::dimensions() { + Some((width, _)) => width, + None => std::usize::MAX, + } } /// Run the REPL with the given options. @@ -28,7 +63,11 @@ pub fn run(options: Options) -> Result<(), Box> { Editor::<()>::with_config(config) }; - if editor.load_history(&options.history_file).is_err() { + if !options.no_banner { + print_welcome_banner() + } + + if !options.no_history && editor.load_history(&options.history_file).is_err() { // No previous REPL history! } @@ -39,7 +78,9 @@ pub fn run(options: Options) -> Result<(), Box> { loop { match editor.readline(&options.prompt) { Ok(line) => { - editor.add_history_entry(&line); + if !options.no_history { + editor.add_history_entry(&line); + } let surface_term = match surface::Term::from_str(&line) { Ok(surface_term) => surface_term, @@ -57,23 +98,13 @@ pub fn run(options: Options) -> Result<(), Box> { } state.errors.clear(); } else { - let core_term = state.normalize_term(&core_term, &r#type); - let r#type = state.read_back_type(&r#type); - let ann_term = core::projections::surface::delaborate_term(&core::Term::Ann( - Arc::new(core_term), - Arc::new(r#type), + Arc::new(state.normalize_term(&core_term, &r#type)), + Arc::new(state.read_back_type(&r#type)), )); - let ann_term_doc = - surface::projections::pretty::pretty_term(&pretty_alloc, &ann_term); - - println!( - "{term}", - term = ann_term_doc.1.pretty(match term_size::dimensions() { - Some((width, _)) => width, - None => std::usize::MAX, - }), - ); + let doc = surface::projections::pretty::pretty_term(&pretty_alloc, &ann_term); + + println!("{}", doc.1.pretty(term_width())); } } Err(ReadlineError::Interrupted) => println!("Interrupted!"), @@ -82,7 +113,9 @@ pub fn run(options: Options) -> Result<(), Box> { } } - editor.save_history(&options.history_file)?; + if !options.no_history { + editor.save_history(&options.history_file)?; + } println!("Bye bye"); From 7a188de447c9a9679ae1028e4d01c962126eeca9 Mon Sep 17 00:00:00 2001 From: Brendan Zabarauskas Date: Mon, 6 Jan 2020 20:28:31 +1100 Subject: [PATCH 36/88] Trim banner lines --- pikelet-cli/src/repl.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pikelet-cli/src/repl.rs b/pikelet-cli/src/repl.rs index 6b02d5ad2..a15622a06 100644 --- a/pikelet-cli/src/repl.rs +++ b/pikelet-cli/src/repl.rs @@ -36,7 +36,7 @@ fn print_welcome_banner() { 2 => println!("{}Version {}", line, env!("CARGO_PKG_VERSION")), 3 => println!("{}{}", line, env!("CARGO_PKG_HOMEPAGE")), 4 => println!("{}:? for help", line), - _ => println!("{}", line), + _ => println!("{}", line.trim_end()), } } } From f9aa935ac721cfc441dd1685facf8fe355879887 Mon Sep 17 00:00:00 2001 From: Brendan Zabarauskas Date: Mon, 6 Jan 2020 20:29:58 +1100 Subject: [PATCH 37/88] Add TODO --- pikelet-cli/src/repl.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pikelet-cli/src/repl.rs b/pikelet-cli/src/repl.rs index a15622a06..3f0959e4d 100644 --- a/pikelet-cli/src/repl.rs +++ b/pikelet-cli/src/repl.rs @@ -82,6 +82,8 @@ pub fn run(options: Options) -> Result<(), Box> { editor.add_history_entry(&line); } + // TODO: Parse REPL commands + let surface_term = match surface::Term::from_str(&line) { Ok(surface_term) => surface_term, Err(error) => { From f16f3cc9eb7d7d2810996669b5c4de4a47c3f59e Mon Sep 17 00:00:00 2001 From: Brendan Zabarauskas Date: Tue, 7 Jan 2020 13:21:26 +1100 Subject: [PATCH 38/88] Implement non-dependent function types --- README.md | 2 +- pikelet-gui/src/lib.rs | 4 +- pikelet/src/core/mod.rs | 60 ++++++++--- pikelet/src/core/projections/pretty.rs | 37 +++---- pikelet/src/core/projections/surface.rs | 14 +-- pikelet/src/core/semantics.rs | 94 ++++++++++-------- pikelet/src/core/typing.rs | 81 +++++++++------ pikelet/src/surface/grammar.lalrpop | 18 +++- pikelet/src/surface/mod.rs | 21 ++-- pikelet/src/surface/projections/core.rs | 115 ++++++++++++++-------- pikelet/src/surface/projections/pretty.rs | 43 ++++---- 11 files changed, 297 insertions(+), 192 deletions(-) diff --git a/README.md b/README.md index e9df02c61..c842a2b2a 100644 --- a/README.md +++ b/README.md @@ -63,7 +63,7 @@ You can read more about what we hope to achieve in [_Pondering the next version - [x] Record field lookups - [ ] Import expressions - [ ] Function terms - - [ ] Non-dependent function types + - [x] Non-dependent function types - [ ] Pattern matching - [ ] Recursive terms - [ ] Opaque (abstract) terms diff --git a/pikelet-gui/src/lib.rs b/pikelet-gui/src/lib.rs index ec101fa47..784af2d85 100644 --- a/pikelet-gui/src/lib.rs +++ b/pikelet-gui/src/lib.rs @@ -88,8 +88,8 @@ fn view_term(term: &pikelet::core::Term) -> Element { Term::RecordTerm(_) => Text::new("todo").into(), Term::RecordType(_) => Text::new("todo").into(), Term::RecordElim(_, _) => Text::new("todo").into(), - Term::ArrayType(_, _) => Text::new("todo").into(), - Term::ListType(_) => Text::new("todo").into(), + Term::FunctionType(_, _) => Text::new("todo").into(), + Term::FunctionElim(_, _) => Text::new("todo").into(), Term::Lift(term, UniverseOffset(offset)) => Row::new() .push(view_term(term)) .push(Text::new(format!("^{}", offset))) diff --git a/pikelet/src/core/mod.rs b/pikelet/src/core/mod.rs index 0c8b9bb8e..66131cb51 100644 --- a/pikelet/src/core/mod.rs +++ b/pikelet/src/core/mod.rs @@ -83,10 +83,10 @@ pub enum Term { RecordTerm(BTreeMap>), /// Record eliminations (field access). RecordElim(Arc, String), - /// Array types. - ArrayType(Arc, Arc), - /// List types. - ListType(Arc), + /// Function types. + FunctionType(Arc, Arc), + /// Function eliminations (function application). + FunctionElim(Arc, Arc), /// Lift a term by the given number of universe levels. Lift(Arc, UniverseOffset), /// Error sentinel. @@ -163,10 +163,8 @@ pub enum Value { RecordType(Vec<(String, Arc)>), /// Record terms. RecordTerm(BTreeMap>), - /// Array types. - ArrayType(Arc, Arc), - /// List types. - ListType(Arc), + /// Function types. + FunctionType(Arc, Arc), /// Error sentinel. Error, } @@ -203,6 +201,8 @@ pub enum Head { pub enum Elim { /// Record eliminators (field access). Record(String), + /// Function eliminatiors (function application). + Function(Arc, Arc), } /// An environment of global definitions. @@ -250,6 +250,29 @@ impl Default for Globals { entries.insert("String".to_owned(), (Arc::new(Term::global("Type")), None)); entries.insert("true".to_owned(), (Arc::new(Term::global("Bool")), None)); entries.insert("false".to_owned(), (Arc::new(Term::global("Bool")), None)); + entries.insert( + "Array".to_owned(), + ( + Arc::new(Term::FunctionType( + Arc::new(Term::Global("U32".to_owned())), + Arc::new(Term::FunctionType( + Arc::new(Term::universe(0)), + Arc::new(Term::universe(0)), + )), + )), + None, + ), + ); + entries.insert( + "List".to_owned(), + ( + Arc::new(Term::FunctionType( + Arc::new(Term::universe(0)), + Arc::new(Term::universe(0)), + )), + None, + ), + ); Globals::new(entries) } @@ -286,7 +309,11 @@ impl_has_type!(str, Value::global("String", 0, Value::universe(0))); impl HasType for Vec { fn r#type() -> Arc { - Arc::new(Value::ListType(T::r#type())) + Arc::new(Value::Elim( + Head::Global("List".to_owned(), UniverseOffset(0)), + vec![Elim::Function(T::r#type(), Arc::new(Value::universe(0)))], + Arc::new(Value::universe(0)), + )) } } @@ -294,9 +321,16 @@ macro_rules! impl_has_type_array { ($($len:expr),*) => { $(impl HasType for [T; $len] { fn r#type() -> Arc { - Arc::new(Value::ArrayType( - Arc::new(Value::Constant(Constant::U32($len as u32))), - T::r#type(), + Arc::new(Value::Elim( + Head::Global("Array".to_owned(), UniverseOffset(0)), + vec![ + Elim::Function( + Arc::new(Value::Constant(Constant::U32($len as u32))), + Arc::new(Value::global("U32", 0, Value::universe(0))), + ), + Elim::Function(T::r#type(), Arc::new(Value::universe(0))), + ], + Arc::new(Value::universe(0)), )) } })* @@ -413,8 +447,6 @@ impl_try_from_term_array!( 26, 27, 28, 29, 30, 31, 32 ); -// TODO: Fixed-size arrays - /// Serialize something to a `Term`. /// /// # Laws diff --git a/pikelet/src/core/projections/pretty.rs b/pikelet/src/core/projections/pretty.rs index c271d3815..bd8e1971b 100644 --- a/pikelet/src/core/projections/pretty.rs +++ b/pikelet/src/core/projections/pretty.rs @@ -20,15 +20,14 @@ where Term::Sequence(term_entries) => (alloc.nil()) .append("[") .group() - .append(alloc.intersperse( - term_entries.iter().map(|term| { - (alloc.space()) - .append(pretty_term(alloc, term)) - .group() - .nest(4) - }), - alloc.text(",").append(alloc.space()), - )) + .append( + alloc.intersperse( + term_entries + .iter() + .map(|term| pretty_term(alloc, term).group().nest(4)), + alloc.text(",").append(alloc.space()), + ), + ) .append("]"), Term::Ann(term, r#type) => (alloc.nil()) .append(pretty_term(alloc, term)) @@ -86,19 +85,15 @@ where .append(pretty_term(alloc, head)) .append(".") .append(alloc.text(name)), - Term::ArrayType(len, entry_type) => alloc.text("Array").append( - (alloc.nil()) - .append(alloc.space()) - .append(pretty_term(alloc, len)) - .append(alloc.space()) - .append(pretty_term(alloc, entry_type)) - .group() - .nest(4), - ), - Term::ListType(entry_type) => alloc.text("List").append( + Term::FunctionType(param_type, body_type) => (alloc.nil()) + .append(pretty_term(alloc, param_type)) + .append(alloc.space()) + .append("->") + .append(alloc.space()) + .append(pretty_term(alloc, body_type)), + Term::FunctionElim(head, argument) => pretty_term(alloc, head).append( (alloc.nil()) - .append(alloc.space()) - .append(pretty_term(alloc, entry_type)) + .append(pretty_term(alloc, argument)) .group() .nest(4), ), diff --git a/pikelet/src/core/projections/surface.rs b/pikelet/src/core/projections/surface.rs index 6e72a8460..98ed80af0 100644 --- a/pikelet/src/core/projections/surface.rs +++ b/pikelet/src/core/projections/surface.rs @@ -43,14 +43,14 @@ pub fn delaborate_term(term: &Term) -> surface::Term { Term::RecordElim(head, name) => { surface::Term::RecordElim(..0, Box::new(delaborate_term(head)), name.clone()) } - Term::ArrayType(len, entry_type) => surface::Term::ArrayType( - 0..0, - Box::new(delaborate_term(len)), - Box::new(delaborate_term(entry_type)), + Term::FunctionType(param_type, body_type) => surface::Term::FunctionType( + Box::new(delaborate_term(param_type)), + Box::new(delaborate_term(body_type)), + ), + Term::FunctionElim(head, argument) => surface::Term::FunctionElim( + Box::new(delaborate_term(head)), + vec![delaborate_term(argument)], // TODO: flatten arguments ), - Term::ListType(entry_type) => { - surface::Term::ListType(0..0, Box::new(delaborate_term(entry_type))) - } Term::Lift(term, UniverseOffset(offset)) => { surface::Term::Lift(0..0, Box::new(delaborate_term(term)), *offset) } diff --git a/pikelet/src/core/semantics.rs b/pikelet/src/core/semantics.rs index 12bc4946b..c0f8df627 100644 --- a/pikelet/src/core/semantics.rs +++ b/pikelet/src/core/semantics.rs @@ -65,11 +65,29 @@ pub fn eval_term(globals: &Globals, locals: &mut Locals, term: &Term) -> Arc Arc::new(Value::Error), }, - Term::ArrayType(len, entry_type) => Arc::new(Value::ArrayType( - eval_term(globals, locals, len), - eval_term(globals, locals, entry_type), - )), - Term::ListType(r#type) => Arc::new(Value::ListType(eval_term(globals, locals, r#type))), + Term::FunctionType(param_type, body_type) => { + let param_type = eval_term(globals, locals, param_type); + let body_type = eval_term(globals, locals, body_type); + + Arc::new(Value::FunctionType(param_type, body_type)) + } + Term::FunctionElim(head, argument) => match eval_term(globals, locals, head).as_ref() { + // TODO: Value::FunctionTerm(body) + Value::Elim(head, elims, r#type) => { + let (param_type, body_type) = match r#type.as_ref() { + Value::FunctionType(param_type, body_type) => (param_type, body_type), + _ => return Arc::new(Value::Error), + }; + + let mut elims = elims.clone(); // TODO: Avoid clone? + elims.push(Elim::Function( + eval_term(globals, locals, argument), + param_type.clone(), + )); + Arc::new(Value::Elim(head.clone(), elims, body_type.clone())) + } + _ => Arc::new(Value::Error), + }, Term::Lift(term, offset) => { let previous_offset = locals.universe_offset(); locals.set_universe_offset((previous_offset + *offset).unwrap()); // FIXME: Handle overflow @@ -89,6 +107,10 @@ pub fn read_back_elim(/* TODO: level, */ head: &Head, spine: &[Elim]) -> Term { spine.iter().fold(head, |head, elim| match elim { Elim::Record(name) => Term::RecordElim(Arc::new(head), name.clone()), + Elim::Function(argument, argument_type) => Term::FunctionElim( + Arc::new(head), + Arc::new(read_back_nf(argument, argument_type)), + ), }) } @@ -102,25 +124,25 @@ pub fn read_back_nf(/* TODO: level, */ value: &Value, r#type: &Value) -> Term { (Value::Universe(level), Value::Universe(_)) => Term::Universe(*level), (Value::Elim(head, spine, _), _) => read_back_elim(head, spine), (Value::Constant(constant), _) => Term::Constant(constant.clone()), - (Value::Sequence(value_entries), Value::ArrayType(_, entry_type)) => Term::Sequence( - value_entries - .iter() - .map(|value_entry| Arc::new(read_back_nf(value_entry, entry_type))) - .collect(), - ), - (Value::Sequence(value_entries), Value::ListType(entry_type)) => { - let term_entries = value_entries - .iter() - .map(|value_entry| Arc::new(read_back_nf(value_entry, entry_type))) - .collect(); - - Term::Sequence(term_entries) - } - (Value::RecordType(type_entries), Value::Universe(level)) => { + (Value::Sequence(value_entries), Value::Elim(head, elims, _)) => match head { + Head::Global(name, _) => match (name.as_ref(), elims.as_slice()) { + ("Array", [Elim::Function(_, _), Elim::Function(entry_type, _)]) + | ("List", [Elim::Function(entry_type, _)]) => { + let term_entries = value_entries + .iter() + .map(|value_entry| Arc::new(read_back_nf(value_entry, entry_type))) + .collect(); + + Term::Sequence(term_entries) + } + _ => Term::Error, // TODO: Report error + }, + }, + (Value::RecordType(type_entries), Value::Universe(_)) => { let type_entries = type_entries .iter() .map(|(name, r#type)| { - let r#type = Arc::new(read_back_nf(r#type, &Value::Universe(*level))); + let r#type = Arc::new(read_back_type(r#type)); (name.clone(), r#type) }) .collect(); @@ -138,22 +160,15 @@ pub fn read_back_nf(/* TODO: level, */ value: &Value, r#type: &Value) -> Term { Term::RecordTerm(term_entries) } - (Value::ArrayType(len, entry_type), Value::Universe(level)) => { - let u32_type = Value::global("U32", 0, Value::universe(0)); - Term::ArrayType( - Arc::new(read_back_nf(len, &u32_type)), - Arc::new(read_back_nf(entry_type, &Value::Universe(*level))), - ) - } - (Value::ListType(entry_type), Value::Universe(level)) => { - Term::ListType(Arc::new(read_back_nf(entry_type, &Value::Universe(*level)))) - } + (Value::FunctionType(param_type, body_type), Value::Universe(_)) => Term::FunctionType( + Arc::new(read_back_type(param_type)), + Arc::new(read_back_type(body_type)), + ), (Value::Universe(_), _) | (Value::Sequence(_), _) | (Value::RecordType(_), _) | (Value::RecordTerm(_), _) - | (Value::ArrayType(_, _), _) - | (Value::ListType(_), _) => Term::Error, // TODO: Report error + | (Value::FunctionType(_, _), _) => Term::Error, // TODO: Report error (Value::Error, _) => Term::Error, } } @@ -171,11 +186,10 @@ pub fn read_back_type(/* TODO: level, */ r#type: &Value) -> Term { Term::RecordType(type_entries) } - Value::ArrayType(len, entry_type) => Term::ArrayType( - Arc::new(read_back_type(len)), - Arc::new(read_back_type(entry_type)), + Value::FunctionType(param_type, body_type) => Term::FunctionType( + Arc::new(read_back_type(param_type)), + Arc::new(read_back_type(body_type)), ), - Value::ListType(entry_type) => Term::ListType(Arc::new(read_back_type(entry_type))), Value::Constant(_) | Value::Sequence(_) | Value::RecordTerm(_) => Term::Error, // TODO: Report error Value::Error => Term::Error, } @@ -212,12 +226,6 @@ pub fn is_subtype(value0: &Value, value1: &Value) -> bool { |((name0, term0), (name1, term1))| name0 == name1 && is_subtype(term0, term1), ) } - (Value::ArrayType(len0, entry_type0), Value::ArrayType(len1, entry_type1)) => { - is_subtype(len0, len1) && is_subtype(entry_type0, entry_type1) - } - (Value::ListType(entry_type0), Value::ListType(entry_type1)) => { - is_subtype(entry_type0, entry_type1) - } // Errors are always treated as subtypes, regardless of what they are compared with. (Value::Error, _) | (_, Value::Error) => true, // Anything else is not equal! diff --git a/pikelet/src/core/typing.rs b/pikelet/src/core/typing.rs index 73856a448..68690de35 100644 --- a/pikelet/src/core/typing.rs +++ b/pikelet/src/core/typing.rs @@ -5,7 +5,9 @@ use std::sync::Arc; use crate::core::semantics; -use crate::core::{Constant, Globals, Locals, Term, UniverseLevel, UniverseOffset, Value}; +use crate::core::{ + Constant, Elim, Globals, Head, Locals, Term, UniverseLevel, UniverseOffset, Value, +}; /// The state of the type checker. pub struct State<'me> { @@ -44,8 +46,10 @@ pub enum TypeError { UnexpectedNamesInRecordTerm(Vec), FieldNotFoundInRecord(String), ExpectedRecord(Arc), + NotAFunction(Arc), AmbiguousSequence, UnexpectedSequenceLength(usize, Arc), + NoSequenceConversion(Arc), ExpectedType(Arc), MismatchedTypes(Arc, Arc), } @@ -65,22 +69,33 @@ pub fn check_type(state: &mut State<'_>, term: &Term) -> Option { /// Check that a term matches the expected type. pub fn check_term(state: &mut State<'_>, term: &Term, expected_type: &Arc) { match (term, expected_type.as_ref()) { - (Term::Sequence(entry_terms), Value::ArrayType(len, entry_type)) => { - for entry_term in entry_terms { - check_term(state, entry_term, entry_type); - } - match **len { - Value::Constant(Constant::U32(len)) if len as usize == entry_terms.len() => {} - _ => state.report(TypeError::UnexpectedSequenceLength( - entry_terms.len(), - len.clone(), - )), - } - } - (Term::Sequence(entry_terms), Value::ListType(entry_type)) => { - for entry_term in entry_terms { - check_term(state, entry_term, entry_type); - } + (Term::Sequence(entry_terms), Value::Elim(head, elims, _)) => match head { + Head::Global(name, _) => match (name.as_ref(), elims.as_slice()) { + ("Array", [Elim::Function(len, _), Elim::Function(entry_type, _)]) => { + for entry_term in entry_terms { + check_term(state, entry_term, entry_type); + } + + match **len { + Value::Constant(Constant::U32(len)) + if len as usize == entry_terms.len() => {} + _ => state.report(TypeError::UnexpectedSequenceLength( + entry_terms.len(), + len.clone(), + )), + } + } + ("List", [Elim::Function(entry_type, _)]) => { + for entry_term in entry_terms { + check_term(state, entry_term, entry_type); + } + } + _ => state.report(TypeError::NoSequenceConversion(expected_type.clone())), + }, + }, + (Term::Sequence(_), Value::Error) => {} + (Term::Sequence(_), _) => { + state.report(TypeError::NoSequenceConversion(expected_type.clone())) } (Term::RecordTerm(term_entries), Value::RecordType(type_entries)) => { let mut missing_names = Vec::new(); @@ -200,22 +215,26 @@ pub fn synth_term(state: &mut State<'_>, term: &Term) -> Arc { } } } - Term::ArrayType(len, entry_type) => { - let u32_type = Arc::new(Value::global("U32", 0, Value::universe(0))); - check_term(state, len, &u32_type); - let level = check_type(state, entry_type); - - match level { - Some(level) => Arc::new(Value::Universe(level)), - None => Arc::new(Value::Error), + Term::FunctionType(param_type, body_type) => { + match (check_type(state, param_type), check_type(state, body_type)) { + (Some(param_level), Some(body_level)) => { + Arc::new(Value::Universe(std::cmp::max(param_level, body_level))) + } + (_, _) => Arc::new(Value::Error), } } - Term::ListType(entry_type) => { - let level = check_type(state, entry_type); - - match level { - Some(level) => Arc::new(Value::Universe(level)), - None => Arc::new(Value::Error), + Term::FunctionElim(head, argument) => { + let head_type = synth_term(state, head); + match head_type.as_ref() { + Value::FunctionType(param_type, body_type) => { + check_term(state, argument, ¶m_type); + body_type.clone() + } + Value::Error => Arc::new(Value::Error), + _ => { + state.report(TypeError::NotAFunction(head_type)); + Arc::new(Value::Error) + } } } Term::Lift(term, shift) => match state.locals.universe_offset() + *shift { diff --git a/pikelet/src/surface/grammar.lalrpop b/pikelet/src/surface/grammar.lalrpop index 54c75c631..9e8173342 100644 --- a/pikelet/src/surface/grammar.lalrpop +++ b/pikelet/src/surface/grammar.lalrpop @@ -3,10 +3,22 @@ use crate::surface::{Term, Literal}; grammar; pub Term: Term<&'input str> = { + ArrowTerm, + ":" => Term::Ann(Box::new(term), Box::new(ty)), +}; + +ArrowTerm: Term<&'input str> = { + AppTerm, + "->" => { + Term::FunctionType(Box::new(param_type), Box::new(body_type)) + }, +}; + +AppTerm: Term<&'input str> = { TermAtomic, - "Array" => Term::ArrayType(start..end, Box::new(arg0), Box::new(arg1)), - "List" => Term::ListType(start..end, Box::new(arg)), - ":" => Term::Ann(Box::new(term), Box::new(ty)), + => { + Term::FunctionElim(Box::new(head), arguments) + }, }; TermAtomic: Term<&'input str> = { diff --git a/pikelet/src/surface/mod.rs b/pikelet/src/surface/mod.rs index b4258371f..3d0123897 100644 --- a/pikelet/src/surface/mod.rs +++ b/pikelet/src/surface/mod.rs @@ -25,10 +25,10 @@ pub enum Term { RecordTerm(Range, Vec<(S, Term)>), /// Record eliminations (field access). RecordElim(RangeTo, Box>, S), - /// Array types. - ArrayType(Range, Box>, Box>), - /// List types. - ListType(Range, Box>), + /// Function types. + FunctionType(Box>, Box>), + /// Function eliminations (function application). + FunctionElim(Box>, Vec>), /// Lift a term by the given number of universe levels. Lift(Range, Box>, u32), /// Error sentinel. @@ -49,12 +49,21 @@ impl<'input> Term<&'input str> { | Term::Sequence(span, _) | Term::RecordType(span, _) | Term::RecordTerm(span, _) - | Term::ArrayType(span, _, _) - | Term::ListType(span, _) | Term::Lift(span, _, _) | Term::Error(span) => span.clone(), Term::Ann(term, r#type) => term.span().start..r#type.span().end, Term::RecordElim(span, term, _) => term.span().start..span.end, + Term::FunctionType(param_type, body_type) => { + param_type.span().start..body_type.span().end + } + Term::FunctionElim(head, arguments) => { + let head_span = head.span(); + head_span.start + ..arguments + .last() + .map(|argument| argument.span().end) + .unwrap_or(head_span.end) + } } } } diff --git a/pikelet/src/surface/projections/core.rs b/pikelet/src/surface/projections/core.rs index 1423b49b5..39e1683d5 100644 --- a/pikelet/src/surface/projections/core.rs +++ b/pikelet/src/surface/projections/core.rs @@ -52,6 +52,7 @@ pub enum TypeError { UnexpectedNamesInRecordTerm(Vec), FieldNotFoundInRecord(String), ExpectedRecord(Arc), + NotAFunction(Arc), InvalidNumberLiteral, InvalidCharLiteral, InvalidStringLiteral, @@ -59,6 +60,7 @@ pub enum TypeError { AmbiguousLiteral, AmbiguousSequence, UnexpectedSequenceLength(usize, Arc), + NoSequenceConversion(Arc), ExpectedType(Arc), MismatchedTypes(Arc, Arc), } @@ -107,39 +109,56 @@ pub fn check_term>( } } } + (Term::Literal(_, _), core::Value::Error) => core::Term::Error, (Term::Literal(_, _), _) => { state.report(TypeError::NoLiteralConversion(expected_type.clone())); core::Term::Error } - (Term::Sequence(_, entry_terms), core::Value::ArrayType(len, core_entry_type)) => { - let core_entry_terms = entry_terms - .iter() - .map(|entry_term| Arc::new(check_term(state, entry_term, core_entry_type))) - .collect(); - - match **len { - core::Value::Constant(core::Constant::U32(len)) - if len as usize == entry_terms.len() => - { + (Term::Sequence(_, entry_terms), core::Value::Elim(head, elims, _)) => match head { + core::Head::Global(name, _) => match (name.as_ref(), elims.as_slice()) { + ( + "Array", + [core::Elim::Function(len, _), core::Elim::Function(core_entry_type, _)], + ) => { + let core_entry_terms = entry_terms + .iter() + .map(|entry_term| Arc::new(check_term(state, entry_term, core_entry_type))) + .collect(); + + match **len { + core::Value::Constant(core::Constant::U32(len)) + if len as usize == entry_terms.len() => + { + core::Term::Sequence(core_entry_terms) + } + _ => { + state.report(TypeError::UnexpectedSequenceLength( + entry_terms.len(), + len.clone(), + )); + + core::Term::Error + } + } + } + ("List", [core::Elim::Function(core_entry_type, _)]) => { + let core_entry_terms = entry_terms + .iter() + .map(|entry_term| Arc::new(check_term(state, entry_term, core_entry_type))) + .collect(); + core::Term::Sequence(core_entry_terms) } _ => { - state.report(TypeError::UnexpectedSequenceLength( - entry_terms.len(), - len.clone(), - )); - + state.report(TypeError::NoSequenceConversion(expected_type.clone())); core::Term::Error } - } - } - (Term::Sequence(_, entry_terms), core::Value::ListType(core_entry_type)) => { - core::Term::Sequence( - entry_terms - .iter() - .map(|entry_term| Arc::new(check_term(state, entry_term, core_entry_type))) - .collect(), - ) + }, + }, + (Term::Sequence(_, _), core::Value::Error) => core::Term::Error, + (Term::Sequence(_, _), _) => { + state.report(TypeError::NoSequenceConversion(expected_type.clone())); + core::Term::Error } (Term::RecordTerm(_, term_entries), core::Value::RecordType(core_type_entries)) => { use std::collections::btree_map::Entry; @@ -317,29 +336,39 @@ pub fn synth_term>( } } } - Term::ArrayType(_, len, entry_type) => { - let u32_type = Arc::new(core::Value::global("U32", 0, core::Value::universe(0))); - let core_len = Arc::new(check_term(state, len, &u32_type)); - let (core_entry_type, level) = check_type(state, entry_type); - - match level { - Some(level) => ( - core::Term::ArrayType(core_len, Arc::new(core_entry_type)), - Arc::new(core::Value::Universe(level)), + Term::FunctionType(param_type, body_type) => { + match (check_type(state, param_type), check_type(state, body_type)) { + ((core_param_type, Some(param_level)), (core_body_type, Some(body_level))) => ( + core::Term::FunctionType(Arc::new(core_param_type), Arc::new(core_body_type)), + Arc::new(core::Value::Universe(std::cmp::max( + param_level, + body_level, + ))), ), - None => (core::Term::Error, Arc::new(core::Value::Error)), + (_, _) => (core::Term::Error, Arc::new(core::Value::Error)), } } - Term::ListType(_, entry_type) => { - let (core_entry_type, level) = check_type(state, entry_type); - - match level { - Some(level) => ( - core::Term::ListType(Arc::new(core_entry_type)), - Arc::new(core::Value::Universe(level)), - ), - None => (core::Term::Error, Arc::new(core::Value::Error)), + Term::FunctionElim(head, arguments) => { + let (mut core_head, mut head_type) = synth_term(state, head); + + for argument in arguments { + match head_type.as_ref() { + core::Value::FunctionType(param_type, body_type) => { + core_head = core::Term::FunctionElim( + Arc::new(core_head), + Arc::new(check_term(state, argument, ¶m_type)), + ); + head_type = body_type.clone(); + } + core::Value::Error => return (core::Term::Error, Arc::new(core::Value::Error)), + _ => { + state.report(TypeError::NotAFunction(head_type)); + return (core::Term::Error, Arc::new(core::Value::Error)); + } + } } + + (core_head, head_type) } Term::Lift(_, term, offset) => { match state.locals.universe_offset() + core::UniverseOffset(*offset) { diff --git a/pikelet/src/surface/projections/pretty.rs b/pikelet/src/surface/projections/pretty.rs index f054eb956..ddabe0b51 100644 --- a/pikelet/src/surface/projections/pretty.rs +++ b/pikelet/src/surface/projections/pretty.rs @@ -26,15 +26,14 @@ where Term::Sequence(_, term_entries) => (alloc.nil()) .append("[") .group() - .append(alloc.intersperse( - term_entries.iter().map(|term| { - (alloc.space()) - .append(pretty_term(alloc, term)) - .group() - .nest(4) - }), - alloc.text(",").append(alloc.space()), - )) + .append( + alloc.intersperse( + term_entries + .iter() + .map(|term| pretty_term(alloc, term).group().nest(4)), + alloc.text(",").append(alloc.space()), + ), + ) .append("]"), Term::RecordType(_, ty_entries) => (alloc.nil()) .append("Record") @@ -82,19 +81,21 @@ where .append(pretty_term(alloc, head)) .append(".") .append(name.as_ref()), - Term::ArrayType(_, len, entry_type) => alloc.text("Array").append( - (alloc.nil()) - .append(alloc.space()) - .append(pretty_term(alloc, len)) - .append(alloc.space()) - .append(pretty_term(alloc, entry_type)) - .group() - .nest(4), - ), - Term::ListType(_, entry_type) => alloc.text("List").append( + Term::FunctionType(param_type, body_type) => (alloc.nil()) + .append(pretty_term(alloc, param_type)) + .append(alloc.space()) + .append("->") + .append(alloc.space()) + .append(pretty_term(alloc, body_type)), + Term::FunctionElim(head, arguments) => pretty_term(alloc, head).append( (alloc.nil()) - .append(alloc.space()) - .append(pretty_term(alloc, entry_type)) + .append( + alloc.concat( + arguments + .iter() + .map(|argument| alloc.space().append(pretty_term(alloc, argument))), + ), + ) .group() .nest(4), ), From 9e221698c177d068c34d956b81671b02ed971b83 Mon Sep 17 00:00:00 2001 From: Brendan Zabarauskas Date: Wed, 8 Jan 2020 22:27:55 +1100 Subject: [PATCH 39/88] Begin stubbing out documentation chapters --- docs/guide.rs/data-structures.md | 13 +++++ docs/guide.rs/hello-world.md | 37 ++++++++++++ docs/guide.rs/installation.md | 34 +++++++++++ docs/guide.rs/modular-programming.md | 13 +++++ docs/guide.rs/motivation.md | 3 + docs/reference/builtins.md | 84 ++++++++++++++++++++++++++++ docs/reference/functions.md | 20 +++++++ docs/reference/literals.md | 51 +++++++++++++++++ docs/reference/records.md | 15 +++++ docs/reference/universes.md | 13 +++++ 10 files changed, 283 insertions(+) create mode 100644 docs/guide.rs/data-structures.md create mode 100644 docs/guide.rs/hello-world.md create mode 100644 docs/guide.rs/installation.md create mode 100644 docs/guide.rs/modular-programming.md create mode 100644 docs/guide.rs/motivation.md create mode 100644 docs/reference/builtins.md create mode 100644 docs/reference/functions.md create mode 100644 docs/reference/literals.md create mode 100644 docs/reference/records.md create mode 100644 docs/reference/universes.md diff --git a/docs/guide.rs/data-structures.md b/docs/guide.rs/data-structures.md new file mode 100644 index 000000000..9dd529274 --- /dev/null +++ b/docs/guide.rs/data-structures.md @@ -0,0 +1,13 @@ +# Data structures + +## Lists + +TODO + +## Arrays + +TODO + +## Records + +TODO diff --git a/docs/guide.rs/hello-world.md b/docs/guide.rs/hello-world.md new file mode 100644 index 000000000..d901fd713 --- /dev/null +++ b/docs/guide.rs/hello-world.md @@ -0,0 +1,37 @@ +# Hello world! + +## Using the REPL + +If you have [installed pikelet][installation], you can run the REPL by running this command in the terminal: + +``` +$ pikelet repl +``` + +[installation]: ./installation + +The REPL should appear like so: + +``` +$ cargo run repl + ____ _ __ __ __ + / __ \(_) /_____ / /__ / /_ + / /_/ / / //_/ _ \/ / _ \/ __/ Version 0.1.0 + / ____/ / ,< / __/ / __/ /_ https://github.com/pikelet-lang/pikelet +/_/ /_/_/|_|\___/_/\___/\__/ :? for help + +> +``` + +You can now enter Pikelet terms into the REPL after the `>`. For example: + +``` +> "Hello world!" +``` + +By pressing Enter, you can 'normalize' the term, and see its type: + +``` +> "Hello world!" +"Hello world!" : String +``` diff --git a/docs/guide.rs/installation.md b/docs/guide.rs/installation.md new file mode 100644 index 000000000..6834bfb22 --- /dev/null +++ b/docs/guide.rs/installation.md @@ -0,0 +1,34 @@ +# Installation + +Pikelet is written in [Rust][rust-site] and therefore needs to be compiled with +Cargo, because we don't yet offer prebuilt binaries. If you haven't already +installed Rust, please [install it][rust-install] now! + +[rust-site]: https://www.rust-lang.org/ +[rust-install]: https://www.rust-lang.org/downloads.html + +## Cloning the source from Github + +We've not yet published Pikelet on [crates.io][crates-io], so you'll first need +to clone [the repository][pikelet-repository] using git: + +```sh +git clone https://github.com/pikelet-lang/pikelet.git +cd pikelet +``` + +[crates-io]: https://crates.io/ +[pikelet-repository]: https://github.com/pikelet-lang/pikelet + +## Running the REPL + +After cloning, you can now run the [REPL][repl-wikipedia] using Cargo: + +```sh +cargo run repl +``` + +You will now need to wait for Cargo to download and build the dependencies, but +sooner or later the REPL will be ready for you to interact with! + +[repl-wikipedia]: https://en.wikipedia.org/wiki/Read%E2%80%93eval%E2%80%93print_loop diff --git a/docs/guide.rs/modular-programming.md b/docs/guide.rs/modular-programming.md new file mode 100644 index 000000000..5aa98350f --- /dev/null +++ b/docs/guide.rs/modular-programming.md @@ -0,0 +1,13 @@ +# Modular Programming + +## The need for modularity + +TODO + +## Describing interfaces using record types + +TODO + +## Parameterised modules using functions + +TODO diff --git a/docs/guide.rs/motivation.md b/docs/guide.rs/motivation.md new file mode 100644 index 000000000..0d0f45759 --- /dev/null +++ b/docs/guide.rs/motivation.md @@ -0,0 +1,3 @@ +# Motivation + +TODO diff --git a/docs/reference/builtins.md b/docs/reference/builtins.md new file mode 100644 index 000000000..09346893e --- /dev/null +++ b/docs/reference/builtins.md @@ -0,0 +1,84 @@ +# Builtin types + +Pikelet has a number of builtin types, which we now describe here: + +## Unsigned integers + +```pikelet +U8 : Type +U16 : Type +U32 : Type +U64 : Type +``` + +## Signed integers + +```pikelet +S8 : Type +S16 : Type +S32 : Type +S64 : Type +``` + +## Floating point + +```pikelet +F32 : Type +F64 : Type +``` + +## Strings + +```pikelet +String : Type +``` + +Characters can be constructed using string literals. For example: + +```pikelet +"hello" : String +``` + +## Characters + +```pikelet +Char : Type +``` + +Characters can be constructed using character literals. For example: + +```pikelet +'A' : Char +'가' : Char +'🥞' : Char +``` + +## Lists + +Lists are ordered sequences of terms. + +```pikelet +List : Type -> Type +``` + +Lists can be constructed using sequences. For example: + +```pikelet +[] : List F32 +[1, 2, 3] : List F32 +``` + +## Arrays + +Arrays are ordered sequences of terms, with a length specified in the type. + +```pikelet +Array : U32 -> Type -> Type +``` + +Arrays can be constructed using sequences. For example: + +```pikelet +[] : Array 0 F32 +[1, 2, 3] : Array 3 F32 +``` diff --git a/docs/reference/functions.md b/docs/reference/functions.md new file mode 100644 index 000000000..1e1dd98c0 --- /dev/null +++ b/docs/reference/functions.md @@ -0,0 +1,20 @@ +# Functions + +A function is a way of relating an input to an output. + +## Formation + +Function types are written as `A -> B`. +For example, the function type for adding two 32-bit signed integers together is: + +```pikelet +S32 -> S32 -> S32 +``` + +## Introduction + +TODO + +## Elimination + +TODO diff --git a/docs/reference/literals.md b/docs/reference/literals.md new file mode 100644 index 000000000..cb1dc14af --- /dev/null +++ b/docs/reference/literals.md @@ -0,0 +1,51 @@ +# Literals + +## Numbers + +```pikelet +0.0 ++1 +-25 +0xAB342 +1_000_000 +``` + +### Supported types + +- Unsigned integers: `U8`, `U16`, `U32`, `U64` +- Signed integers: `S8`, `S16`, `S32`, `S64` +- Floating point numbers: `F32`, `F64` + +### Overloading + +Overloaded number literals are not yet supported, but _are_ planned. + +## Strings + +```pikelet +"hello" +``` + +### Supported types + +- `String` + +### Overloading + +Overloaded string literals are not yet supported, but _are_ planned. + +## Characters + +```pikelet +'A' +'가' +'🥞' +``` + +### Supported types + +- `Char` + +### Overloading + +Overloaded character literals are not yet supported, but _are_ planned. diff --git a/docs/reference/records.md b/docs/reference/records.md new file mode 100644 index 000000000..11c8e44a1 --- /dev/null +++ b/docs/reference/records.md @@ -0,0 +1,15 @@ +# Records + +Records provide a way of grouping together data. + +## Formation + +TODO + +## Introduction + +TODO + +## Elimination + +TODO diff --git a/docs/reference/universes.md b/docs/reference/universes.md new file mode 100644 index 000000000..f8759cb59 --- /dev/null +++ b/docs/reference/universes.md @@ -0,0 +1,13 @@ +# Universes + +## Universe levels + +TODO + +## Cumulativity + +TODO + +## Lifting terms + +TODO From f1ce594a48554f81f913615096763d2ab4b8538f Mon Sep 17 00:00:00 2001 From: Brendan Zabarauskas Date: Thu, 9 Jan 2020 10:28:47 +1100 Subject: [PATCH 40/88] Clean up span computation --- pikelet/src/surface/mod.rs | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/pikelet/src/surface/mod.rs b/pikelet/src/surface/mod.rs index 3d0123897..9be99d8a8 100644 --- a/pikelet/src/surface/mod.rs +++ b/pikelet/src/surface/mod.rs @@ -56,14 +56,10 @@ impl<'input> Term<&'input str> { Term::FunctionType(param_type, body_type) => { param_type.span().start..body_type.span().end } - Term::FunctionElim(head, arguments) => { - let head_span = head.span(); - head_span.start - ..arguments - .last() - .map(|argument| argument.span().end) - .unwrap_or(head_span.end) - } + Term::FunctionElim(head, arguments) => match arguments.last() { + Some(argument) => head.span().start..argument.span().end, + None => head.span(), + }, } } } From c65d9e28f41c21d667827021c165a5951b29a9c8 Mon Sep 17 00:00:00 2001 From: Brendan Zabarauskas Date: Thu, 9 Jan 2020 11:40:42 +1100 Subject: [PATCH 41/88] Stub out specification --- .../core/bidirectional-typing.md | 3 + docs/specification/core/declarative-typing.md | 3 + .../core/operational-semantics.md | 3 + docs/specification/surface/elaboration.md | 3 + docs/specification/surface/grammar.md | 3 + docs/specification/surface/lexical-syntax.md | 106 ++++++++++++++++++ 6 files changed, 121 insertions(+) create mode 100644 docs/specification/core/bidirectional-typing.md create mode 100644 docs/specification/core/declarative-typing.md create mode 100644 docs/specification/core/operational-semantics.md create mode 100644 docs/specification/surface/elaboration.md create mode 100644 docs/specification/surface/grammar.md create mode 100644 docs/specification/surface/lexical-syntax.md diff --git a/docs/specification/core/bidirectional-typing.md b/docs/specification/core/bidirectional-typing.md new file mode 100644 index 000000000..492b032b5 --- /dev/null +++ b/docs/specification/core/bidirectional-typing.md @@ -0,0 +1,3 @@ +# Bidirectional typing + +TODO diff --git a/docs/specification/core/declarative-typing.md b/docs/specification/core/declarative-typing.md new file mode 100644 index 000000000..7c84194c8 --- /dev/null +++ b/docs/specification/core/declarative-typing.md @@ -0,0 +1,3 @@ +# Declarative typing + +TODO diff --git a/docs/specification/core/operational-semantics.md b/docs/specification/core/operational-semantics.md new file mode 100644 index 000000000..5e3699074 --- /dev/null +++ b/docs/specification/core/operational-semantics.md @@ -0,0 +1,3 @@ +# Operational syntax + +TODO diff --git a/docs/specification/surface/elaboration.md b/docs/specification/surface/elaboration.md new file mode 100644 index 000000000..848c510cf --- /dev/null +++ b/docs/specification/surface/elaboration.md @@ -0,0 +1,3 @@ +# Elaboration + +TODO diff --git a/docs/specification/surface/grammar.md b/docs/specification/surface/grammar.md new file mode 100644 index 000000000..feaa6a8f0 --- /dev/null +++ b/docs/specification/surface/grammar.md @@ -0,0 +1,3 @@ +# Grammar + +TODO diff --git a/docs/specification/surface/lexical-syntax.md b/docs/specification/surface/lexical-syntax.md new file mode 100644 index 000000000..d3678d2fa --- /dev/null +++ b/docs/specification/surface/lexical-syntax.md @@ -0,0 +1,106 @@ +# Lexical syntax + +## Whitespace and comments + +> Grammar: +> +> horizontal-tab ::=\ +>  | U+0009 +> +> line-feed ::=\ +>  | U+000A +> +> vertical-tab ::=\ +>  | U+000B +> +> form-feed ::=\ +>  | U+000C +> +> carriage-return ::=\ +>  | U+000D +> +> next-line ::=\ +>  | U+0085 +> +> left-to-right-mark ::=\ +>  | U+200E +> +> right-to-left-mark ::=\ +>  | U+200F +> +> line-separator ::=\ +>  | U+2028 +> +> paragraph-separator ::=\ +>  | U+2029 +> +> line-break ::=\ +>  | line-feed\ +>  | carriage-return\ +>  | carriage-return line-feed +> +> comment-text ::=\ +>  | Any Unicode scalar value except line-feed or carriage-return +> +> comment ::=\ +>  | `--` comment-text line-break +> +> doc-comment ::=\ +>  | `|||` comment-text line-break +> +> white-space ::=\ +>  | horizontal-tab\ +>  | comment\ +>  | vertical-tab\ +>  | form-feed\ +>  | line-break\ +>  | next-line\ +>  | left-to-right-mark\ +>  | right-to-left-mark\ +>  | line-separator\ +>  | paragraph-separator + +## Keywords and identifiers + +> Grammar: +> +> keyword ::=\ +>  |  `Record`\ +>  |  `record` +> +> ident-or-keyword ::=\ +>  | [`a`-`z` `A`-`Z`] [`a`-`z` `A`-`Z` `0`-`9` `-`]\* +> +> ident ::=\ +>  | Any ident-or-keyword except keyword + +### Punctuation + +> Grammar: +> +> punctuation ::=\ +>  | `{`\ +>  | `}`\ +>  | `(`\ +>  | `)`\ +>  | `:`\ +>  | `,`\ +>  | `=`\ +>  | `->`\ +>  | `;` + +### Literals + +TODO + +### Tokens + +> Grammar: +> +> token ::=\ +>  | white-space\ +>  | doc-comment\ +>  | keyword\ +>  | ident\ +>  | punctuation\ +>  | literal From 4e508dfa209ae367adf784a8709800276c34b48e Mon Sep 17 00:00:00 2001 From: Brendan Zabarauskas Date: Thu, 9 Jan 2020 11:09:30 +1100 Subject: [PATCH 42/88] More documentation --- docs/guide.rs/hello-world.md | 28 +++++++++++++++++++++++----- docs/reference.md | 2 ++ docs/reference/builtins.md | 21 +++++++++++++++++++++ docs/reference/comments.md | 27 +++++++++++++++++++++++++++ docs/reference/names.md | 9 +++++++++ 5 files changed, 82 insertions(+), 5 deletions(-) create mode 100644 docs/reference/comments.md create mode 100644 docs/reference/names.md diff --git a/docs/guide.rs/hello-world.md b/docs/guide.rs/hello-world.md index d901fd713..27fc75d74 100644 --- a/docs/guide.rs/hello-world.md +++ b/docs/guide.rs/hello-world.md @@ -2,18 +2,17 @@ ## Using the REPL -If you have [installed pikelet][installation], you can run the REPL by running this command in the terminal: +If you have [installed Pikelet][installation], you can run the REPL by running this command in the terminal: ``` -$ pikelet repl +pikelet repl ``` [installation]: ./installation -The REPL should appear like so: +The REPL should appear in the terminal like so: ``` -$ cargo run repl ____ _ __ __ __ / __ \(_) /_____ / /__ / /_ / /_/ / / //_/ _ \/ / _ \/ __/ Version 0.1.0 @@ -23,7 +22,8 @@ $ cargo run repl > ``` -You can now enter Pikelet terms into the REPL after the `>`. For example: +"REPL" stands for "Read-eval-print-loop" and is a nice way to experiment with Pikelet in an interactive way. +You can enter Pikelet terms into the REPL after the `>`. For example: ``` > "Hello world!" @@ -35,3 +35,21 @@ By pressing Enter, you can 'normalize' the term, and see its type: > "Hello world!" "Hello world!" : String ``` + +## Effects + +TODO: This is not yet implemented! + +``` +> print-line "Hello world!" +print-line "Hello world!" : Unit <{Std-Out}> +``` + +``` +> :exec print-line "Hello world!" +Hello world! +``` + +## Compiling a standalone executable + +TODO: This is not yet implemented! diff --git a/docs/reference.md b/docs/reference.md index 8c2a57676..5b1552eb3 100644 --- a/docs/reference.md +++ b/docs/reference.md @@ -5,6 +5,8 @@ This will cover all language features, but not necessarily describe how they fit Topics might include: +- comments +- names - records - formation - introduction diff --git a/docs/reference/builtins.md b/docs/reference/builtins.md index 09346893e..8598ab996 100644 --- a/docs/reference/builtins.md +++ b/docs/reference/builtins.md @@ -4,6 +4,8 @@ Pikelet has a number of builtin types, which we now describe here: ## Unsigned integers +Unsigned integers are defined via the following built-ins: + ```pikelet U8 : Type U16 : Type @@ -11,8 +13,18 @@ U32 : Type U64 : Type ``` +Unsigned integers can be constructed using numeric literals: + +```pikelet +0 : S8 ++42 : S32 +0x2F : S16 +``` + ## Signed integers +Two's complement, signed integers are defined via the following built-ins: + ```pikelet S8 : Type S16 : Type @@ -20,6 +32,15 @@ S32 : Type S64 : Type ``` +Signed integers can be constructed using numeric literals: + +```pikelet +0 : S8 ++42 : S32 +-42 : S32 +0x2F : S16 +``` + ## Floating point ```pikelet diff --git a/docs/reference/comments.md b/docs/reference/comments.md new file mode 100644 index 000000000..71cf7d017 --- /dev/null +++ b/docs/reference/comments.md @@ -0,0 +1,27 @@ +# Comments + +## Line comments + +Line comments are preceded by a double dash (`--`): + +```pikelet +-- This is a comment! +``` + +> **Specification**: +> +> - [Surface language - Lexical syntax - Whitespace and comments][whitespace-and-comments] + +## Doc comments + +Documentation comments are preceded by three pipes (`|||`): + +```pikelet +||| A doc comment! +``` + +> **Specification**: +> +> - [Surface language - Lexical syntax - Whitespace and comments][whitespace-and-comments] + +[whitespace-and-comments]: ../specification/surface/lexical-syntax#Whitespace-and-comments diff --git a/docs/reference/names.md b/docs/reference/names.md new file mode 100644 index 000000000..ff0a6504e --- /dev/null +++ b/docs/reference/names.md @@ -0,0 +1,9 @@ +# Names + +Names refer to declarations that are currently in scope. + +> **Specification**: +> +> - [Surface language - Lexical syntax - Keywords and identifiers][keywords-and-identifiers] + +[keywords-and-identifiers]: ../specification/surface/lexical-syntax#Keywords-and-identifiers From 309492c2a2301d24e6d1e1294f7c114efaed2cd8 Mon Sep 17 00:00:00 2001 From: Brendan Zabarauskas Date: Thu, 9 Jan 2020 12:00:29 +1100 Subject: [PATCH 43/88] Improve cross-linking in specification --- docs/reference/comments.md | 6 +- docs/reference/literals.md | 32 +++-- docs/reference/names.md | 4 +- .../surface/lexical-structure.md | 123 ++++++++++++++++++ docs/specification/surface/lexical-syntax.md | 106 --------------- pikelet/src/surface/grammar.lalrpop | 10 +- 6 files changed, 153 insertions(+), 128 deletions(-) create mode 100644 docs/specification/surface/lexical-structure.md delete mode 100644 docs/specification/surface/lexical-syntax.md diff --git a/docs/reference/comments.md b/docs/reference/comments.md index 71cf7d017..745ada05f 100644 --- a/docs/reference/comments.md +++ b/docs/reference/comments.md @@ -10,7 +10,7 @@ Line comments are preceded by a double dash (`--`): > **Specification**: > -> - [Surface language - Lexical syntax - Whitespace and comments][whitespace-and-comments] +> - [Surface language - Lexical syntax - Whitespace and comments](../specification/surface/lexical-structure): comment ## Doc comments @@ -22,6 +22,4 @@ Documentation comments are preceded by three pipes (`|||`): > **Specification**: > -> - [Surface language - Lexical syntax - Whitespace and comments][whitespace-and-comments] - -[whitespace-and-comments]: ../specification/surface/lexical-syntax#Whitespace-and-comments +> - [Surface language - Lexical syntax - Whitespace and comments](../specification/surface/lexical-structure): doc-comment diff --git a/docs/reference/literals.md b/docs/reference/literals.md index cb1dc14af..cfe27dd54 100644 --- a/docs/reference/literals.md +++ b/docs/reference/literals.md @@ -10,6 +10,10 @@ 1_000_000 ``` +> **Specification**: +> +> - [Surface language - Lexical syntax - Literals](../specification/surface/lexical-structure#Literals): number-literal + ### Supported types - Unsigned integers: `U8`, `U16`, `U32`, `U64` @@ -20,32 +24,40 @@ Overloaded number literals are not yet supported, but _are_ planned. -## Strings +## Characters ```pikelet -"hello" +'A' +'가' +'🥞' ``` ### Supported types -- `String` +- `Char` ### Overloading -Overloaded string literals are not yet supported, but _are_ planned. +Overloaded character literals are not yet supported, but _are_ planned. -## Characters +> **Specification**: +> +> - [Surface language - Lexical syntax - Literals](../specification/surface/lexical-structure#Literals): character-literal + +## Strings ```pikelet -'A' -'가' -'🥞' +"hello" ``` ### Supported types -- `Char` +- `String` ### Overloading -Overloaded character literals are not yet supported, but _are_ planned. +Overloaded string literals are not yet supported, but _are_ planned. + +> **Specification**: +> +> - [Surface language - Lexical syntax - Literals](../specification/surface/lexical-structure#Literals): string-literal diff --git a/docs/reference/names.md b/docs/reference/names.md index ff0a6504e..953e10ef5 100644 --- a/docs/reference/names.md +++ b/docs/reference/names.md @@ -4,6 +4,4 @@ Names refer to declarations that are currently in scope. > **Specification**: > -> - [Surface language - Lexical syntax - Keywords and identifiers][keywords-and-identifiers] - -[keywords-and-identifiers]: ../specification/surface/lexical-syntax#Keywords-and-identifiers +> - [Surface language - Lexical syntax - Keywords and identifiers](../specification/surface/lexical-structure#Keywords-and-identifiers): ident diff --git a/docs/specification/surface/lexical-structure.md b/docs/specification/surface/lexical-structure.md new file mode 100644 index 000000000..1e3f9af0d --- /dev/null +++ b/docs/specification/surface/lexical-structure.md @@ -0,0 +1,123 @@ +# Lexical structure + +The _lexical structure_ of the Pikelet programming langues is a description of what constitutes a valid sequence of tokens in the programming language. + +## Whitespace and comments + +> **Grammar**: +> +> horizontal-tab ::=\ +>  | U+0009 +> +> line-feed ::=\ +>  | U+000A +> +> vertical-tab ::=\ +>  | U+000B +> +> form-feed ::=\ +>  | U+000C +> +> carriage-return ::=\ +>  | U+000D +> +> next-line ::=\ +>  | U+0085 +> +> left-to-right-mark ::=\ +>  | U+200E +> +> right-to-left-mark ::=\ +>  | U+200F +> +> line-separator ::=\ +>  | U+2028 +> +> paragraph-separator ::=\ +>  | U+2029 +> +> line-break ::=\ +>  | line-feed\ +>  | carriage-return\ +>  | carriage-return line-feed +> +> comment-text ::=\ +>  | Any Unicode scalar value except line-feed or carriage-return +> +> comment ::=\ +>  | `--` comment-text line-break +> +> doc-comment ::=\ +>  | `|||` comment-text line-break +> +> white-space ::=\ +>  | horizontal-tab\ +>  | comment\ +>  | vertical-tab\ +>  | form-feed\ +>  | line-break\ +>  | next-line\ +>  | left-to-right-mark\ +>  | right-to-left-mark\ +>  | line-separator\ +>  | paragraph-separator + +## Keywords and identifiers + +> **Grammar**: +> +> keyword ::=\ +>  | `Record`\ +>  | `record` +> +> ident-or-keyword ::=\ +>  | [`a`-`z` `A`-`Z`] [`a`-`z` `A`-`Z` `0`-`9` `-`]\* +> +> ident ::=\ +>  | Any ident-or-keyword except keyword + +### Punctuation + +> **Grammar**: +> +> punctuation ::=\ +>  | `{`\ +>  | `}`\ +>  | `(`\ +>  | `)`\ +>  | `:`\ +>  | `,`\ +>  | `=`\ +>  | `->`\ +>  | `;` + +### Literals + +> **Grammar**: +> +> number-literal ::=\ +>  | [`+` `-`]? [`0`-`9`]\+ (`.` [`0`-`9`]+)? +> +> character-literal ::=\ +>  | `"` TODO `"` +> +> string-literal ::=\ +>  | `'` TODO `'` +> +> literal ::=\ +>  | number-literal\ +>  | character-literal\ +>  | string-literal + +### Tokens + +> **Grammar**: +> +> token ::=\ +>  | white-space\ +>  | doc-comment\ +>  | keyword\ +>  | ident\ +>  | punctuation\ +>  | literal\ +>  | literal diff --git a/docs/specification/surface/lexical-syntax.md b/docs/specification/surface/lexical-syntax.md deleted file mode 100644 index d3678d2fa..000000000 --- a/docs/specification/surface/lexical-syntax.md +++ /dev/null @@ -1,106 +0,0 @@ -# Lexical syntax - -## Whitespace and comments - -> Grammar: -> -> horizontal-tab ::=\ ->  | U+0009 -> -> line-feed ::=\ ->  | U+000A -> -> vertical-tab ::=\ ->  | U+000B -> -> form-feed ::=\ ->  | U+000C -> -> carriage-return ::=\ ->  | U+000D -> -> next-line ::=\ ->  | U+0085 -> -> left-to-right-mark ::=\ ->  | U+200E -> -> right-to-left-mark ::=\ ->  | U+200F -> -> line-separator ::=\ ->  | U+2028 -> -> paragraph-separator ::=\ ->  | U+2029 -> -> line-break ::=\ ->  | line-feed\ ->  | carriage-return\ ->  | carriage-return line-feed -> -> comment-text ::=\ ->  | Any Unicode scalar value except line-feed or carriage-return -> -> comment ::=\ ->  | `--` comment-text line-break -> -> doc-comment ::=\ ->  | `|||` comment-text line-break -> -> white-space ::=\ ->  | horizontal-tab\ ->  | comment\ ->  | vertical-tab\ ->  | form-feed\ ->  | line-break\ ->  | next-line\ ->  | left-to-right-mark\ ->  | right-to-left-mark\ ->  | line-separator\ ->  | paragraph-separator - -## Keywords and identifiers - -> Grammar: -> -> keyword ::=\ ->  |  `Record`\ ->  |  `record` -> -> ident-or-keyword ::=\ ->  | [`a`-`z` `A`-`Z`] [`a`-`z` `A`-`Z` `0`-`9` `-`]\* -> -> ident ::=\ ->  | Any ident-or-keyword except keyword - -### Punctuation - -> Grammar: -> -> punctuation ::=\ ->  | `{`\ ->  | `}`\ ->  | `(`\ ->  | `)`\ ->  | `:`\ ->  | `,`\ ->  | `=`\ ->  | `->`\ ->  | `;` - -### Literals - -TODO - -### Tokens - -> Grammar: -> -> token ::=\ ->  | white-space\ ->  | doc-comment\ ->  | keyword\ ->  | ident\ ->  | punctuation\ ->  | literal diff --git a/pikelet/src/surface/grammar.lalrpop b/pikelet/src/surface/grammar.lalrpop index 9e8173342..5b124f445 100644 --- a/pikelet/src/surface/grammar.lalrpop +++ b/pikelet/src/surface/grammar.lalrpop @@ -15,21 +15,21 @@ ArrowTerm: Term<&'input str> = { }; AppTerm: Term<&'input str> = { - TermAtomic, - => { + AtomicTerm, + => { Term::FunctionElim(Box::new(head), arguments) }, }; -TermAtomic: Term<&'input str> = { +AtomicTerm: Term<&'input str> = { "(" ")" => term, => Term::Name(start..end, name), => Term::Literal(start..end, literal), "[" > "]" => Term::Sequence(start..end, entries), "Record" "{" > "}" => Term::RecordType(start..end, entries), "record" "{" > "}" => Term::RecordTerm(start..end, entries), - "." => Term::RecordElim(..end, Box::new(head), name), - => { + "." => Term::RecordElim(..end, Box::new(head), name), + => { Term::Lift(start..end, Box::new(term), shift[1..].parse().unwrap()) // FIXME: Overflow! }, }; From e70a6a0b75ef9cf162fc6b3884079b89a84a5e62 Mon Sep 17 00:00:00 2001 From: Brendan Zabarauskas Date: Thu, 9 Jan 2020 13:29:23 +1100 Subject: [PATCH 44/88] Add grammar to specification --- docs/specification/surface/grammar.md | 38 ++++++++++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git a/docs/specification/surface/grammar.md b/docs/specification/surface/grammar.md index feaa6a8f0..71e703ba5 100644 --- a/docs/specification/surface/grammar.md +++ b/docs/specification/surface/grammar.md @@ -1,3 +1,39 @@ # Grammar -TODO +This defines the grammar of the surface language. + +## Terms + +> **Grammar**: +> +> term ::=\ +>  | arrow-term\ +>  | arrow-term `:` term +> +> arrow-term ::=\ +>  | app-term\ +>  | app-term `->` arrow-term +> +> app-term ::=\ +>  | atomic-term\ +>  | atomic-term atomic-term+ +> +> atomic-term ::=\ +>  | `(` term `)`\ +>  | name\ +>  | literal\ +>  | `[` (term `,`)\* term? `]`\ +>  | `Record` `{` (type-field `,`)\* type-field? `}`\ +>  | `record` `{` (term-field `,`)\* term-field? `}`\ +>  | atomic-term `.` name\ +>  | atomic-term `^` number-literal + +## Fields + +> **Grammar**: +> +> type-field ::=\ +>  | doc-comment\* name `:` term +> +> term-field ::=\ +>  | doc-comment\* name `=` term From b40a33e376e876b373d1ba135f07f7b3a18e9c5f Mon Sep 17 00:00:00 2001 From: Brendan Zabarauskas Date: Thu, 9 Jan 2020 14:03:19 +1100 Subject: [PATCH 45/88] Notation cleanups --- .../surface/lexical-structure.md | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/docs/specification/surface/lexical-structure.md b/docs/specification/surface/lexical-structure.md index 1e3f9af0d..c7a8ceeca 100644 --- a/docs/specification/surface/lexical-structure.md +++ b/docs/specification/surface/lexical-structure.md @@ -7,34 +7,34 @@ The _lexical structure_ of the Pikelet programming langues is a description of w > **Grammar**: > > horizontal-tab ::=\ ->  | U+0009 +>  | U+0009 > > line-feed ::=\ ->  | U+000A +>  | U+000A > > vertical-tab ::=\ ->  | U+000B +>  | U+000B > > form-feed ::=\ ->  | U+000C +>  | U+000C > > carriage-return ::=\ ->  | U+000D +>  | U+000D > > next-line ::=\ ->  | U+0085 +>  | U+0085 > > left-to-right-mark ::=\ ->  | U+200E +>  | U+200E > > right-to-left-mark ::=\ ->  | U+200F +>  | U+200F > > line-separator ::=\ ->  | U+2028 +>  | U+2028 > > paragraph-separator ::=\ ->  | U+2029 +>  | U+2029 > > line-break ::=\ >  | line-feed\ @@ -71,7 +71,7 @@ The _lexical structure_ of the Pikelet programming langues is a description of w >  | `record` > > ident-or-keyword ::=\ ->  | [`a`-`z` `A`-`Z`] [`a`-`z` `A`-`Z` `0`-`9` `-`]\* +>  | (`a`…`z` | `A`…`Z`) (`a`…`z` | `A`…`Z` | `0`…`9` | `-`)\* > > ident ::=\ >  | Any ident-or-keyword except keyword @@ -96,7 +96,7 @@ The _lexical structure_ of the Pikelet programming langues is a description of w > **Grammar**: > > number-literal ::=\ ->  | [`+` `-`]? [`0`-`9`]\+ (`.` [`0`-`9`]+)? +>  | (`+` | `-`)? (`0`…`9`)+ `.`? (`0`…`9`)+ > > character-literal ::=\ >  | `"` TODO `"` From 90b92d1f7a4da5d51cfb03689792fa6e474fb161 Mon Sep 17 00:00:00 2001 From: Brendan Zabarauskas Date: Thu, 9 Jan 2020 14:20:44 +1100 Subject: [PATCH 46/88] Add some inspiring language specifications --- docs/index.md | 1 - docs/specification.md | 19 ++++++++++++++++++- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/docs/index.md b/docs/index.md index 9476561ba..93f007405 100644 --- a/docs/index.md +++ b/docs/index.md @@ -18,4 +18,3 @@ We'll aim to provide multiple levels of documentation for different purposes: [specification]: ./specification More sections might be added later, for example tutorials and cookbooks. - diff --git a/docs/specification.md b/docs/specification.md index 3272732db..12a3826ab 100644 --- a/docs/specification.md +++ b/docs/specification.md @@ -3,7 +3,7 @@ This will be where we give a comprehensive, formally described specification of the Pikelet programming language, including: - surface language - - lexical syntax + - lexical structure - grammar rules - elaboration to the core language - core language @@ -14,3 +14,20 @@ This will be where we give a comprehensive, formally described specification of - environment We may want to create some form of markup language for this, similar to OTT. + +## Inspiration + +Some inspiring language specifications/references: + +- [WebAssembly Specification](https://webassembly.github.io/spec/core/) +- [The Definition of Standard ML](http://sml-family.org/sml97-defn.pdf) +- [Dhall Specification](https://github.com/dhall-lang/dhall-lang/blob/master/standard/README.md) +- [The Ur/Web Manual](http://www.impredicative.com/ur/manual.pdf) +- [Coq Reference Manual: The Gallina specification language](https://coq.inria.fr/refman/language/gallina-specification-language.html) +- [Coq Reference Manual: Calculus of Inductive Constructions](https://coq.inria.fr/refman/language/cic.html) +- [The Isabelle/Isar Reference Manual](http://isabelle.in.tum.de/dist/Isabelle2019/doc/isar-ref.pdf) +- [The Isabelle/Isar Implementation](http://isabelle.in.tum.de/dist/Isabelle2019/doc/implementation.pdf) +- [Specification of Core Agda](https://agda.github.io/agda-spec/core-agda.pdf) +- [Swift Reference](https://docs.swift.org/swift-book/ReferenceManual/AboutTheLanguageReference.html) +- [D Specification](https://dlang.org/spec/spec.html) +- [Rust Reference](https://doc.rust-lang.org/reference/) From 80499d7089cf81f992925331d7d54101abdf9da1 Mon Sep 17 00:00:00 2001 From: Brendan Zabarauskas Date: Thu, 9 Jan 2020 14:44:13 +1100 Subject: [PATCH 47/88] Update literals --- docs/reference/literals.md | 6 ++--- docs/specification/surface/grammar.md | 4 +++- .../surface/lexical-structure.md | 24 +++++++++---------- 3 files changed, 18 insertions(+), 16 deletions(-) diff --git a/docs/reference/literals.md b/docs/reference/literals.md index cfe27dd54..18e53846e 100644 --- a/docs/reference/literals.md +++ b/docs/reference/literals.md @@ -12,7 +12,7 @@ > **Specification**: > -> - [Surface language - Lexical syntax - Literals](../specification/surface/lexical-structure#Literals): number-literal +> - [Surface language - Lexical syntax - Numeric literals](../specification/surface/lexical-structure#Numeric-literals): number-literal ### Supported types @@ -42,7 +42,7 @@ Overloaded character literals are not yet supported, but _are_ planned. > **Specification**: > -> - [Surface language - Lexical syntax - Literals](../specification/surface/lexical-structure#Literals): character-literal +> - [Surface language - Lexical syntax - Character and string literals](../specification/surface/lexical-structure#Character-and-string-literals): character-literal ## Strings @@ -60,4 +60,4 @@ Overloaded string literals are not yet supported, but _are_ planned. > **Specification**: > -> - [Surface language - Lexical syntax - Literals](../specification/surface/lexical-structure#Literals): string-literal +> - [Surface language - Lexical syntax - Character and string literals](../specification/surface/lexical-structure#Character-and-string-literals): string-literal diff --git a/docs/specification/surface/grammar.md b/docs/specification/surface/grammar.md index 71e703ba5..df8a10abe 100644 --- a/docs/specification/surface/grammar.md +++ b/docs/specification/surface/grammar.md @@ -21,7 +21,9 @@ This defines the grammar of the surface language. > atomic-term ::=\ >  | `(` term `)`\ >  | name\ ->  | literal\ +>  | number-literal\ +>  | character-literal\ +>  | string-literal\ >  | `[` (term `,`)\* term? `]`\ >  | `Record` `{` (type-field `,`)\* type-field? `}`\ >  | `record` `{` (term-field `,`)\* term-field? `}`\ diff --git a/docs/specification/surface/lexical-structure.md b/docs/specification/surface/lexical-structure.md index c7a8ceeca..f229dabb3 100644 --- a/docs/specification/surface/lexical-structure.md +++ b/docs/specification/surface/lexical-structure.md @@ -42,7 +42,7 @@ The _lexical structure_ of the Pikelet programming langues is a description of w >  | carriage-return line-feed > > comment-text ::=\ ->  | Any Unicode scalar value except line-feed or carriage-return +>  | ~(line-feed | carriage-return) Any Unicode scalar value > > comment ::=\ >  | `--` comment-text line-break @@ -74,7 +74,7 @@ The _lexical structure_ of the Pikelet programming langues is a description of w >  | (`a`…`z` | `A`…`Z`) (`a`…`z` | `A`…`Z` | `0`…`9` | `-`)\* > > ident ::=\ ->  | Any ident-or-keyword except keyword +>  | ~keyword ident-or-keyword ### Punctuation @@ -91,23 +91,22 @@ The _lexical structure_ of the Pikelet programming langues is a description of w >  | `->`\ >  | `;` -### Literals +### Numeric literals > **Grammar**: > > number-literal ::=\ >  | (`+` | `-`)? (`0`…`9`)+ `.`? (`0`…`9`)+ + +### Character and string literals + +> **Grammar**: > > character-literal ::=\ ->  | `"` TODO `"` +>  | `"` (`\"` | ~`"` Any Unicode scalar value)* `"` > > string-literal ::=\ ->  | `'` TODO `'` -> -> literal ::=\ ->  | number-literal\ ->  | character-literal\ ->  | string-literal +>  | `'` (`\'` | ~`'` Any Unicode scalar value)* `'` ### Tokens @@ -119,5 +118,6 @@ The _lexical structure_ of the Pikelet programming langues is a description of w >  | keyword\ >  | ident\ >  | punctuation\ ->  | literal\ ->  | literal +>  | number-literal\ +>  | character-literal\ +>  | string-literal From 14bb5a456caa37d1d25dd23a3b6c267c9bebf80c Mon Sep 17 00:00:00 2001 From: Brendan Zabarauskas Date: Thu, 9 Jan 2020 14:52:32 +1100 Subject: [PATCH 48/88] Add unicode production --- docs/specification/surface/lexical-structure.md | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/docs/specification/surface/lexical-structure.md b/docs/specification/surface/lexical-structure.md index f229dabb3..59a9588f9 100644 --- a/docs/specification/surface/lexical-structure.md +++ b/docs/specification/surface/lexical-structure.md @@ -2,10 +2,13 @@ The _lexical structure_ of the Pikelet programming langues is a description of what constitutes a valid sequence of tokens in the programming language. -## Whitespace and comments +## Unicode > **Grammar**: > +> any-unicode-scalar ::=\ +>  | U+0000U+7FFF +> > horizontal-tab ::=\ >  | U+0009 > @@ -35,6 +38,10 @@ The _lexical structure_ of the Pikelet programming langues is a description of w > > paragraph-separator ::=\ >  | U+2029 + +## Whitespace and comments + +> **Grammar**: > > line-break ::=\ >  | line-feed\ @@ -42,7 +49,7 @@ The _lexical structure_ of the Pikelet programming langues is a description of w >  | carriage-return line-feed > > comment-text ::=\ ->  | ~(line-feed | carriage-return) Any Unicode scalar value +>  | ~(line-feed | carriage-return) any-unicode-scalar > > comment ::=\ >  | `--` comment-text line-break @@ -103,10 +110,10 @@ The _lexical structure_ of the Pikelet programming langues is a description of w > **Grammar**: > > character-literal ::=\ ->  | `"` (`\"` | ~`"` Any Unicode scalar value)* `"` +>  | `"` (`\"` | ~`"` any-unicode-scalar)* `"` > > string-literal ::=\ ->  | `'` (`\'` | ~`'` Any Unicode scalar value)* `'` +>  | `'` (`\'` | ~`'` any-unicode-scalar)* `'` ### Tokens From 18b11adbc9b97b4e194e15297ce8e3a125ed53fb Mon Sep 17 00:00:00 2001 From: Brendan Zabarauskas Date: Thu, 9 Jan 2020 15:00:17 +1100 Subject: [PATCH 49/88] Add missing square bracket delimiters --- docs/specification/surface/lexical-structure.md | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/docs/specification/surface/lexical-structure.md b/docs/specification/surface/lexical-structure.md index 59a9588f9..2ec02f200 100644 --- a/docs/specification/surface/lexical-structure.md +++ b/docs/specification/surface/lexical-structure.md @@ -87,16 +87,24 @@ The _lexical structure_ of the Pikelet programming langues is a description of w > **Grammar**: > -> punctuation ::=\ +> delimiter ::=\ >  | `{`\ >  | `}`\ +>  | `[`\ +>  | `]`\ >  | `(`\ ->  | `)`\ +>  | `)` +> +> symbol ::=\ >  | `:`\ >  | `,`\ >  | `=`\ >  | `->`\ >  | `;` +> +> punctuation ::=\ +>  | delimiter\ +>  | symbol ### Numeric literals From a3bd67611c760b83feb35a7b936424d9b09a3148 Mon Sep 17 00:00:00 2001 From: Brendan Zabarauskas Date: Thu, 9 Jan 2020 15:02:04 +1100 Subject: [PATCH 50/88] Link to type system specification gist --- docs/specification.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/specification.md b/docs/specification.md index 12a3826ab..142a406d5 100644 --- a/docs/specification.md +++ b/docs/specification.md @@ -13,7 +13,7 @@ This will be where we give a comprehensive, formally described specification of - serialization format - environment -We may want to create some form of markup language for this, similar to OTT. +We may want to create [some form of markup language for this](https://gist.github.com/brendanzab/47fac049f8b40e449db6a9bd60efa57f), similar to OTT. ## Inspiration From 18e3ec35fbfbecf8f8317c8585bfbb45c03f0b2f Mon Sep 17 00:00:00 2001 From: Brendan Zabarauskas Date: Thu, 9 Jan 2020 15:18:58 +1100 Subject: [PATCH 51/88] Fix escapes --- docs/specification/surface/lexical-structure.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/specification/surface/lexical-structure.md b/docs/specification/surface/lexical-structure.md index 2ec02f200..f3674d751 100644 --- a/docs/specification/surface/lexical-structure.md +++ b/docs/specification/surface/lexical-structure.md @@ -118,10 +118,10 @@ The _lexical structure_ of the Pikelet programming langues is a description of w > **Grammar**: > > character-literal ::=\ ->  | `"` (`\"` | ~`"` any-unicode-scalar)* `"` +>  | `"` (`\"` | ~`"` any-unicode-scalar)\* `"` > > string-literal ::=\ ->  | `'` (`\'` | ~`'` any-unicode-scalar)* `'` +>  | `'` (`\'` | ~`'` any-unicode-scalar)\* `'` ### Tokens From 6d705a6e85d36d04bdb67f6738124500747e4254 Mon Sep 17 00:00:00 2001 From: Brendan Zabarauskas Date: Thu, 9 Jan 2020 15:55:53 +1100 Subject: [PATCH 52/88] Begin describing operational semantics --- .../core/operational-semantics.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/docs/specification/core/operational-semantics.md b/docs/specification/core/operational-semantics.md index 5e3699074..974a895fd 100644 --- a/docs/specification/core/operational-semantics.md +++ b/docs/specification/core/operational-semantics.md @@ -1,3 +1,21 @@ # Operational syntax TODO + +## Evaluation + +| `eval(`globals`,` offset`,` term`)` | value | +| - | - | +| `eval(`globals`,` offset`,` `univ(`level`))` | `univ(`level + offset`)` | +| `eval(`globals`,` offset`,` `local(`name`))` | `local(`name`)` | +| `eval(`globals`,` offset`,` `global(`name`))` | `global(`name`)` | +| `eval(`globals`,` offset`,` `constant(`constant`))` | `constant(`constant`)` | +| `eval(`globals`,` offset`,` `ann(`term`,` type`))` | `eval(`globals`,` offset`,` term`)` | +| … | … | +| `eval(`globals`,` offset0`,` `lift(`term`,` offset1`))` | `eval(`globals`,` offset0 + offset1`,` term`)` | + +## Read-back + +| `read-back(`value`,`value`)` | term | +| - | - | +| … | … | From 2941a67a3ffc1e73046915c137718b7add66fcae Mon Sep 17 00:00:00 2001 From: Brendan Zabarauskas Date: Thu, 9 Jan 2020 19:10:44 +1100 Subject: [PATCH 53/88] Fix subtyping --- pikelet/src/core/semantics.rs | 18 +++++------------- 1 file changed, 5 insertions(+), 13 deletions(-) diff --git a/pikelet/src/core/semantics.rs b/pikelet/src/core/semantics.rs index c0f8df627..44fa720bc 100644 --- a/pikelet/src/core/semantics.rs +++ b/pikelet/src/core/semantics.rs @@ -200,7 +200,7 @@ pub fn normalize_term(globals: &Globals, locals: &mut Locals, term: &Term, r#typ read_back_nf(&eval_term(globals, locals, term), r#type) } -/// Check that two values are equal. +/// Check that one type is a subtype of another type. pub fn is_subtype(value0: &Value, value1: &Value) -> bool { match (value0, value1) { (Value::Universe(level0), Value::Universe(level1)) => level0 <= level1, @@ -208,24 +208,16 @@ pub fn is_subtype(value0: &Value, value1: &Value) -> bool { read_back_elim(head0, spine0) == read_back_elim(head1, spine1) && is_subtype(type0, type1) } - (Value::Constant(constant0), Value::Constant(constant1)) => constant0 == constant1, - (Value::Sequence(value_entries0), Value::Sequence(value_entries1)) => { - value_entries0.len() == value_entries1.len() - && Iterator::zip(value_entries0.iter(), value_entries1.iter()) - .all(|(term0, term1)| is_subtype(term0, term1)) - } (Value::RecordType(type_entries0), Value::RecordType(type_entries1)) => { type_entries0.len() == type_entries1.len() && Iterator::zip(type_entries0.iter(), type_entries1.iter()).all( |((name0, type0), (name1, type1))| name0 == name1 && is_subtype(type0, type1), ) } - (Value::RecordTerm(value_entries0), Value::RecordTerm(value_entries1)) => { - value_entries0.len() == value_entries1.len() - && Iterator::zip(value_entries0.iter(), value_entries1.iter()).all( - |((name0, term0), (name1, term1))| name0 == name1 && is_subtype(term0, term1), - ) - } + ( + Value::FunctionType(param_type0, body_type0), + Value::FunctionType(param_type1, body_type1), + ) => is_subtype(param_type1, param_type0) && is_subtype(body_type0, body_type1), // Errors are always treated as subtypes, regardless of what they are compared with. (Value::Error, _) | (_, Value::Error) => true, // Anything else is not equal! From 8b0e0a58279fe90420162d8d3ebbb2aa568163aa Mon Sep 17 00:00:00 2001 From: Brendan Zabarauskas Date: Fri, 10 Jan 2020 10:03:32 +1100 Subject: [PATCH 54/88] Document booleans --- docs/reference/builtins.md | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/docs/reference/builtins.md b/docs/reference/builtins.md index 8598ab996..075244e3a 100644 --- a/docs/reference/builtins.md +++ b/docs/reference/builtins.md @@ -2,6 +2,19 @@ Pikelet has a number of builtin types, which we now describe here: +## Booleans + +```pikelet +Bool : Type +``` + +Booleans have two constructors, `true` and `false`: + +```pikelet +true : Type +false : Type +``` + ## Unsigned integers Unsigned integers are defined via the following built-ins: @@ -41,7 +54,7 @@ Signed integers can be constructed using numeric literals: 0x2F : S16 ``` -## Floating point +## Floating point numbers ```pikelet F32 : Type From 905126a3a1cc240c24386fd95412e10c1da0ff01 Mon Sep 17 00:00:00 2001 From: Brendan Zabarauskas Date: Fri, 10 Jan 2020 15:16:16 +1100 Subject: [PATCH 55/88] Improve definition of unicode scalar values --- .../surface/lexical-structure.md | 31 +++++++++++++------ 1 file changed, 22 insertions(+), 9 deletions(-) diff --git a/docs/specification/surface/lexical-structure.md b/docs/specification/surface/lexical-structure.md index f3674d751..015d3a46c 100644 --- a/docs/specification/surface/lexical-structure.md +++ b/docs/specification/surface/lexical-structure.md @@ -2,12 +2,24 @@ The _lexical structure_ of the Pikelet programming langues is a description of what constitutes a valid sequence of tokens in the programming language. -## Unicode +## Characters + +The textual surface language assigns meaning to a source string, +which consists of a sequence of _Unicode scalar values_ (as defined in Section 3.4 of [the Unicode Standard](www.unicode.org/versions/latest/)), +terminated with a virtual end-of-file symbol, ∅: > **Grammar**: > -> any-unicode-scalar ::=\ ->  | U+0000U+7FFF +> unicode-scalar-value ::=\ +>  | U+00U+D7FF\ +>  | U+E000U+10FFF +> +> source ::=\ +>  | unicode-scalar-value\* ∅ + +For convenience, we define a number of special values within the above unicode-scalar-value definition: + +> **Grammar**: > > horizontal-tab ::=\ >  | U+0009 @@ -46,10 +58,11 @@ The _lexical structure_ of the Pikelet programming langues is a description of w > line-break ::=\ >  | line-feed\ >  | carriage-return\ ->  | carriage-return line-feed +>  | carriage-return line-feed\ +>  | ∅ > > comment-text ::=\ ->  | ~(line-feed | carriage-return) any-unicode-scalar +>  | ~(line-feed | carriage-return) unicode-scalar-value\* > > comment ::=\ >  | `--` comment-text line-break @@ -78,7 +91,7 @@ The _lexical structure_ of the Pikelet programming langues is a description of w >  | `record` > > ident-or-keyword ::=\ ->  | (`a`…`z` | `A`…`Z`) (`a`…`z` | `A`…`Z` | `0`…`9` | `-`)\* +>  | (`a` … `z` | `A` … `Z`) (`a` … `z` | `A` … `Z` | `0` … `9` | `-`)\* > > ident ::=\ >  | ~keyword ident-or-keyword @@ -111,17 +124,17 @@ The _lexical structure_ of the Pikelet programming langues is a description of w > **Grammar**: > > number-literal ::=\ ->  | (`+` | `-`)? (`0`…`9`)+ `.`? (`0`…`9`)+ +>  | (`+` | `-`)? (`0` … `9`)+ `.`? (`0` … `9`)+ ### Character and string literals > **Grammar**: > > character-literal ::=\ ->  | `"` (`\"` | ~`"` any-unicode-scalar)\* `"` +>  | `"` (`\"` | ~`"` unicode-scalar-value)\* `"` > > string-literal ::=\ ->  | `'` (`\'` | ~`'` any-unicode-scalar)\* `'` +>  | `'` (`\'` | ~`'` unicode-scalar-value)\* `'` ### Tokens From 3ce91c000fc3b0e8021ff564ba43e60d284c8ddb Mon Sep 17 00:00:00 2001 From: Brendan Zabarauskas Date: Tue, 14 Jan 2020 00:16:40 +1100 Subject: [PATCH 56/88] Start a bibliography --- docs/reference/bibliography.md | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 docs/reference/bibliography.md diff --git a/docs/reference/bibliography.md b/docs/reference/bibliography.md new file mode 100644 index 000000000..1c87aeb3e --- /dev/null +++ b/docs/reference/bibliography.md @@ -0,0 +1,6 @@ +# Bibliography + +- Conor McBride, [Crude but Effective Stratification](https://mazzo.li/epilogue/index.html%3Fp=857&cpage=1.html), 2011. +- Conor McBride, [Universe Hierarchies](https://pigworker.wordpress.com/2015/01/09/universe-hierarchies/), 2015. +- Damien Rouhling, [Dependently typed lambda calculus with a lifting operator](http://www-sop.inria.fr/members/Damien.Rouhling/data/internships/M1Report.pdf), 2014. +- Thierry Coquand, Yoshiki Kinoshita, Bengt Nordström, Makoto Takeyama, [A simple type-theoretic language: Mini-TT](http://www.cse.chalmers.se/~bengt/papers/GKminiTT.pdf), 2009. From 1e2769c206cf47664029ea934ba31ad3870e7f5d Mon Sep 17 00:00:00 2001 From: Brendan Zabarauskas Date: Tue, 14 Jan 2020 01:05:00 +1100 Subject: [PATCH 57/88] Update dependencies --- pikelet-cli/Cargo.toml | 4 ++-- pikelet/Cargo.toml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pikelet-cli/Cargo.toml b/pikelet-cli/Cargo.toml index 16312d925..e1fd6d02f 100644 --- a/pikelet-cli/Cargo.toml +++ b/pikelet-cli/Cargo.toml @@ -21,7 +21,7 @@ gui = ["pikelet-gui"] [dependencies] pikelet = { path = "../pikelet" } pikelet-gui = { path = "../pikelet-gui", optional = true } -pretty = "0.8" -rustyline = "5.0" +pretty = "0.9" +rustyline = "6.0" structopt = "0.3" term_size = "0.3.1" diff --git a/pikelet/Cargo.toml b/pikelet/Cargo.toml index 1a1e1c5d6..a88c103c6 100644 --- a/pikelet/Cargo.toml +++ b/pikelet/Cargo.toml @@ -16,7 +16,7 @@ license = "Apache-2.0" [dependencies] lalrpop-util = "0.17" -pretty = "0.8" +pretty = "0.9" regex = "1.3" [build-dependencies] From 5546b570b02b6daa27aa78ca3b5f6b4efde9c26a Mon Sep 17 00:00:00 2001 From: Brendan Zabarauskas Date: Tue, 14 Jan 2020 10:23:46 +1100 Subject: [PATCH 58/88] Naming improvements in grammar --- docs/specification/surface/grammar.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/specification/surface/grammar.md b/docs/specification/surface/grammar.md index df8a10abe..91e4c7e42 100644 --- a/docs/specification/surface/grammar.md +++ b/docs/specification/surface/grammar.md @@ -25,17 +25,17 @@ This defines the grammar of the surface language. >  | character-literal\ >  | string-literal\ >  | `[` (term `,`)\* term? `]`\ ->  | `Record` `{` (type-field `,`)\* type-field? `}`\ ->  | `record` `{` (term-field `,`)\* term-field? `}`\ +>  | `Record` `{` (type-entry `,`)\* type-entry? `}`\ +>  | `record` `{` (term-entry `,`)\* term-entry? `}`\ >  | atomic-term `.` name\ >  | atomic-term `^` number-literal -## Fields +## Entries > **Grammar**: > -> type-field ::=\ +> type-entry ::=\ >  | doc-comment\* name `:` term > -> term-field ::=\ +> term-entry ::=\ >  | doc-comment\* name `=` term From 2bd80f40373ef92dd9e40549fcbb88519316caad Mon Sep 17 00:00:00 2001 From: Brendan Zabarauskas Date: Thu, 9 Jan 2020 21:22:19 +1100 Subject: [PATCH 59/88] Move universe offset out of local environment --- pikelet/src/core/mod.rs | 17 +-- pikelet/src/core/semantics.rs | 132 ++++++++++++++---------- pikelet/src/core/typing.rs | 18 ++-- pikelet/src/surface/projections/core.rs | 29 ++++-- 4 files changed, 110 insertions(+), 86 deletions(-) diff --git a/pikelet/src/core/mod.rs b/pikelet/src/core/mod.rs index 66131cb51..4a28c7eef 100644 --- a/pikelet/src/core/mod.rs +++ b/pikelet/src/core/mod.rs @@ -114,28 +114,13 @@ impl Term { /// The local value environment. pub struct Locals { - /// The universe level of the environment. - offset: UniverseOffset, // TODO: values, } impl Locals { /// Create a new local environment. pub fn new() -> Locals { - Locals { - offset: UniverseOffset(0), - } - } - - /// Lookup the current universe level offset of the environment. - pub fn universe_offset(&self) -> UniverseOffset { - self.offset - } - - /// Set the current universe level offset of the environment, returning the - /// previous level offset. - pub fn set_universe_offset(&mut self, offset: UniverseOffset) -> UniverseOffset { - std::mem::replace(&mut self.offset, offset) + Locals {} } } diff --git a/pikelet/src/core/semantics.rs b/pikelet/src/core/semantics.rs index 44fa720bc..2382a1b5c 100644 --- a/pikelet/src/core/semantics.rs +++ b/pikelet/src/core/semantics.rs @@ -2,19 +2,24 @@ use std::sync::Arc; -use crate::core::{Elim, Globals, Head, Locals, Term, Value}; +use crate::core::{Elim, Globals, Head, Locals, Term, UniverseOffset, Value}; /// Evaluate a term into a value in weak-head normal form. -pub fn eval_term(globals: &Globals, locals: &mut Locals, term: &Term) -> Arc { +pub fn eval_term( + globals: &Globals, + universe_offset: UniverseOffset, + locals: &mut Locals, + term: &Term, +) -> Arc { match term { Term::Universe(level) => Arc::new(Value::universe( - (*level + locals.universe_offset()).unwrap(), // FIXME: Handle overflow + (*level + universe_offset).unwrap(), // FIXME: Handle overflow )), Term::Global(name) => match globals.get(name) { - Some((_, Some(term))) => eval_term(globals, locals, term), + Some((_, Some(term))) => eval_term(globals, universe_offset, locals, term), Some((r#type, None)) => { - let r#type = eval_term(globals, locals, r#type); - Arc::new(Value::global(name, locals.universe_offset(), r#type)) + let r#type = eval_term(globals, universe_offset, locals, r#type); + Arc::new(Value::global(name, universe_offset, r#type)) } None => Arc::new(Value::Error), }, @@ -22,16 +27,21 @@ pub fn eval_term(globals: &Globals, locals: &mut Locals, term: &Term) -> Arc { let value_entries = term_entries .iter() - .map(|entry_term| eval_term(globals, locals, entry_term)) + .map(|entry_term| eval_term(globals, universe_offset, locals, entry_term)) .collect(); Arc::new(Value::Sequence(value_entries)) } - Term::Ann(term, _) => eval_term(globals, locals, term), + Term::Ann(term, _) => eval_term(globals, universe_offset, locals, term), Term::RecordType(type_entries) => { let type_entries = type_entries .iter() - .map(|(name, r#type)| (name.clone(), eval_term(globals, locals, r#type))) + .map(|(name, r#type)| { + ( + name.clone(), + eval_term(globals, universe_offset, locals, r#type), + ) + }) .collect(); Arc::new(Value::RecordType(type_entries)) @@ -39,61 +49,67 @@ pub fn eval_term(globals: &Globals, locals: &mut Locals, term: &Term) -> Arc { let value_entries = term_entries .iter() - .map(|(name, term)| (name.clone(), eval_term(globals, locals, term))) + .map(|(name, term)| { + ( + name.clone(), + eval_term(globals, universe_offset, locals, term), + ) + }) .collect(); Arc::new(Value::RecordTerm(value_entries)) } - Term::RecordElim(head, name) => match eval_term(globals, locals, head).as_ref() { - Value::RecordTerm(term_entries) => match term_entries.get(name) { - Some(value) => value.clone(), - None => Arc::new(Value::Error), - }, - Value::Elim(head, elims, r#type) => { - let type_entries = match r#type.as_ref() { - Value::RecordType(type_entries) => type_entries, - _ => return Arc::new(Value::Error), - }; - let entry_type = match type_entries.iter().find(|(n, _)| n == name) { - Some((_, entry_type)) => entry_type, - None => return Arc::new(Value::Error), - }; - - let mut elims = elims.clone(); // TODO: Avoid clone? - elims.push(Elim::Record(name.clone())); - Arc::new(Value::Elim(head.clone(), elims, entry_type.clone())) + Term::RecordElim(head, name) => { + match eval_term(globals, universe_offset, locals, head).as_ref() { + Value::RecordTerm(term_entries) => match term_entries.get(name) { + Some(value) => value.clone(), + None => Arc::new(Value::Error), + }, + Value::Elim(head, elims, r#type) => { + let type_entries = match r#type.as_ref() { + Value::RecordType(type_entries) => type_entries, + _ => return Arc::new(Value::Error), + }; + let entry_type = match type_entries.iter().find(|(n, _)| n == name) { + Some((_, entry_type)) => entry_type, + None => return Arc::new(Value::Error), + }; + + let mut elims = elims.clone(); // TODO: Avoid clone? + elims.push(Elim::Record(name.clone())); + Arc::new(Value::Elim(head.clone(), elims, entry_type.clone())) + } + _ => Arc::new(Value::Error), } - _ => Arc::new(Value::Error), - }, + } Term::FunctionType(param_type, body_type) => { - let param_type = eval_term(globals, locals, param_type); - let body_type = eval_term(globals, locals, body_type); + let param_type = eval_term(globals, universe_offset, locals, param_type); + let body_type = eval_term(globals, universe_offset, locals, body_type); Arc::new(Value::FunctionType(param_type, body_type)) } - Term::FunctionElim(head, argument) => match eval_term(globals, locals, head).as_ref() { - // TODO: Value::FunctionTerm(body) - Value::Elim(head, elims, r#type) => { - let (param_type, body_type) = match r#type.as_ref() { - Value::FunctionType(param_type, body_type) => (param_type, body_type), - _ => return Arc::new(Value::Error), - }; - - let mut elims = elims.clone(); // TODO: Avoid clone? - elims.push(Elim::Function( - eval_term(globals, locals, argument), - param_type.clone(), - )); - Arc::new(Value::Elim(head.clone(), elims, body_type.clone())) + Term::FunctionElim(head, argument) => { + match eval_term(globals, universe_offset, locals, head).as_ref() { + // TODO: Value::FunctionTerm(body) + Value::Elim(head, elims, r#type) => { + let (param_type, body_type) = match r#type.as_ref() { + Value::FunctionType(param_type, body_type) => (param_type, body_type), + _ => return Arc::new(Value::Error), + }; + + let mut elims = elims.clone(); // TODO: Avoid clone? + elims.push(Elim::Function( + eval_term(globals, universe_offset, locals, argument), + param_type.clone(), + )); + Arc::new(Value::Elim(head.clone(), elims, body_type.clone())) + } + _ => Arc::new(Value::Error), } - _ => Arc::new(Value::Error), - }, + } Term::Lift(term, offset) => { - let previous_offset = locals.universe_offset(); - locals.set_universe_offset((previous_offset + *offset).unwrap()); // FIXME: Handle overflow - let value = eval_term(globals, locals, term); - locals.set_universe_offset(previous_offset); - value + let universe_offset = (universe_offset + *offset).unwrap(); // FIXME: Handle overflow + eval_term(globals, universe_offset, locals, term) } Term::Error => Arc::new(Value::Error), } @@ -196,8 +212,14 @@ pub fn read_back_type(/* TODO: level, */ r#type: &Value) -> Term { } /// Fully normalize a term. -pub fn normalize_term(globals: &Globals, locals: &mut Locals, term: &Term, r#type: &Value) -> Term { - read_back_nf(&eval_term(globals, locals, term), r#type) +pub fn normalize_term( + globals: &Globals, + universe_offset: UniverseOffset, + locals: &mut Locals, + term: &Term, + r#type: &Value, +) -> Term { + read_back_nf(&eval_term(globals, universe_offset, locals, term), r#type) } /// Check that one type is a subtype of another type. diff --git a/pikelet/src/core/typing.rs b/pikelet/src/core/typing.rs index 68690de35..1c2d0e63f 100644 --- a/pikelet/src/core/typing.rs +++ b/pikelet/src/core/typing.rs @@ -12,6 +12,7 @@ use crate::core::{ /// The state of the type checker. pub struct State<'me> { globals: &'me Globals, + universe_offset: UniverseOffset, locals: Locals, pub errors: Vec, } @@ -21,11 +22,16 @@ impl<'me> State<'me> { pub fn new(globals: &'me Globals) -> State<'me> { State { globals, + universe_offset: UniverseOffset(0), locals: Locals::new(), errors: Vec::new(), } } + pub fn eval_term(&mut self, term: &Term) -> Arc { + semantics::eval_term(self.globals, self.universe_offset, &mut self.locals, term) + } + /// Report an error. pub fn report(&mut self, error: TypeError) { self.errors.push(error); @@ -136,7 +142,7 @@ pub fn synth_term(state: &mut State<'_>, term: &Term) -> Arc { } }, Term::Global(name) => match state.globals.get(name) { - Some((r#type, _)) => semantics::eval_term(state.globals, &mut state.locals, r#type), + Some((r#type, _)) => state.eval_term(r#type), None => { state.report(TypeError::UnboundName(name.to_owned())); Arc::new(Value::Error) @@ -162,7 +168,7 @@ pub fn synth_term(state: &mut State<'_>, term: &Term) -> Arc { } Term::Ann(term, r#type) => { check_type(state, r#type); - let r#type = semantics::eval_term(state.globals, &mut state.locals, r#type); + let r#type = state.eval_term(r#type); check_term(state, term, &r#type); r#type } @@ -237,11 +243,11 @@ pub fn synth_term(state: &mut State<'_>, term: &Term) -> Arc { } } } - Term::Lift(term, shift) => match state.locals.universe_offset() + *shift { - Some(lifted_level) => { - let offset = state.locals.set_universe_offset(lifted_level); + Term::Lift(term, offset) => match state.universe_offset + *offset { + Some(new_offset) => { + let previous_offset = std::mem::replace(&mut state.universe_offset, new_offset); let r#type = synth_term(state, term); - state.locals.set_universe_offset(offset); + state.universe_offset = previous_offset; r#type } None => { diff --git a/pikelet/src/surface/projections/core.rs b/pikelet/src/surface/projections/core.rs index 39e1683d5..874631e37 100644 --- a/pikelet/src/surface/projections/core.rs +++ b/pikelet/src/surface/projections/core.rs @@ -9,6 +9,7 @@ use crate::surface::{Literal, Term}; /// The state of the elaborator. pub struct State<'me> { globals: &'me core::Globals, + universe_offset: core::UniverseOffset, locals: core::Locals, pub errors: Vec, } @@ -18,6 +19,7 @@ impl<'me> State<'me> { pub fn new(globals: &'me core::Globals) -> State<'me> { State { globals, + universe_offset: core::UniverseOffset(0), locals: core::Locals::new(), errors: Vec::new(), } @@ -33,8 +35,18 @@ impl<'me> State<'me> { self.errors.clear(); } + pub fn eval_term(&mut self, term: &core::Term) -> Arc { + core::semantics::eval_term(self.globals, self.universe_offset, &mut self.locals, term) + } + pub fn normalize_term(&mut self, term: &core::Term, r#type: &core::Value) -> core::Term { - core::semantics::normalize_term(self.globals, &mut self.locals, term, r#type) + core::semantics::normalize_term( + self.globals, + self.universe_offset, + &mut self.locals, + term, + r#type, + ) } pub fn read_back_type(&mut self, r#type: &core::Value) -> core::Term { @@ -221,8 +233,8 @@ pub fn synth_term>( match term { Term::Name(_, name) => match state.globals.get(name.as_ref()) { Some((r#type, _)) => ( - core::Term::Global(name.as_ref().to_owned()).lift(state.locals.universe_offset()), - core::semantics::eval_term(state.globals, &mut state.locals, r#type), + core::Term::Global(name.as_ref().to_owned()).lift(state.universe_offset), + state.eval_term(r#type), ), None => { state.report(TypeError::UnboundName(name.as_ref().to_owned())); @@ -231,8 +243,7 @@ pub fn synth_term>( }, Term::Ann(term, r#type) => { let (core_type, _) = check_type(state, r#type); - let core_type_value = - core::semantics::eval_term(state.globals, &mut state.locals, &core_type); + let core_type_value = state.eval_term(&core_type); let core_term = check_term(state, term, &core_type_value); ( core::Term::Ann(Arc::new(core_term), Arc::new(core_type.clone())), @@ -371,11 +382,11 @@ pub fn synth_term>( (core_head, head_type) } Term::Lift(_, term, offset) => { - match state.locals.universe_offset() + core::UniverseOffset(*offset) { - Some(lifted_level) => { - let previous_level = state.locals.set_universe_offset(lifted_level); + match state.universe_offset + core::UniverseOffset(*offset) { + Some(new_offset) => { + let previous_offset = std::mem::replace(&mut state.universe_offset, new_offset); let (core_term, r#type) = synth_term(state, term); - state.locals.set_universe_offset(previous_level); + state.universe_offset = previous_offset; (core_term, r#type) } None => { From 8d433df1806b4a38471906bba8cf81586e6fdb72 Mon Sep 17 00:00:00 2001 From: Brendan Zabarauskas Date: Thu, 9 Jan 2020 21:38:07 +1100 Subject: [PATCH 60/88] Move locals to a more logical place in module --- pikelet/src/core/mod.rs | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/pikelet/src/core/mod.rs b/pikelet/src/core/mod.rs index 4a28c7eef..f1f431ad5 100644 --- a/pikelet/src/core/mod.rs +++ b/pikelet/src/core/mod.rs @@ -112,18 +112,6 @@ impl Term { } } -/// The local value environment. -pub struct Locals { - // TODO: values, -} - -impl Locals { - /// Create a new local environment. - pub fn new() -> Locals { - Locals {} - } -} - /// Values in the core language. #[derive(Clone, Debug, PartialEq)] pub enum Value { @@ -263,6 +251,18 @@ impl Default for Globals { } } +/// The local value environment. +pub struct Locals { + // TODO: values, +} + +impl Locals { + /// Create a new local environment. + pub fn new() -> Locals { + Locals {} + } +} + pub trait HasType { fn r#type() -> Arc; } From 015959bb2475ea1f68f983881444933c6f204524 Mon Sep 17 00:00:00 2001 From: Brendan Zabarauskas Date: Thu, 9 Jan 2020 23:07:06 +1100 Subject: [PATCH 61/88] Add some doc comments --- pikelet/src/core/typing.rs | 1 + pikelet/src/surface/projections/core.rs | 2 ++ 2 files changed, 3 insertions(+) diff --git a/pikelet/src/core/typing.rs b/pikelet/src/core/typing.rs index 1c2d0e63f..bbc5c27ca 100644 --- a/pikelet/src/core/typing.rs +++ b/pikelet/src/core/typing.rs @@ -28,6 +28,7 @@ impl<'me> State<'me> { } } + /// Evaluate a term using the current state of the type checker. pub fn eval_term(&mut self, term: &Term) -> Arc { semantics::eval_term(self.globals, self.universe_offset, &mut self.locals, term) } diff --git a/pikelet/src/surface/projections/core.rs b/pikelet/src/surface/projections/core.rs index 874631e37..82aff7431 100644 --- a/pikelet/src/surface/projections/core.rs +++ b/pikelet/src/surface/projections/core.rs @@ -35,10 +35,12 @@ impl<'me> State<'me> { self.errors.clear(); } + /// Evaluate a term using the current state of the elaborator. pub fn eval_term(&mut self, term: &core::Term) -> Arc { core::semantics::eval_term(self.globals, self.universe_offset, &mut self.locals, term) } + /// Normalize a term using the current state of the elaborator. pub fn normalize_term(&mut self, term: &core::Term, r#type: &core::Value) -> core::Term { core::semantics::normalize_term( self.globals, From 5e3bef76f365c448d19b73eadf3c26b34ba4ea3f Mon Sep 17 00:00:00 2001 From: Brendan Zabarauskas Date: Tue, 7 Jan 2020 16:17:03 +1100 Subject: [PATCH 62/88] Implement function terms --- README.md | 3 +- docs/specification/surface/grammar.md | 8 +- .../surface/lexical-structure.md | 2 + pikelet-cli/src/repl.rs | 14 +- pikelet-gui/src/lib.rs | 2 + pikelet/src/core/mod.rs | 123 ++++++++-- pikelet/src/core/projections/pretty.rs | 18 +- pikelet/src/core/projections/surface.rs | 69 ++++-- pikelet/src/core/semantics.rs | 187 +++++++++----- pikelet/src/core/typing.rs | 103 ++++++-- pikelet/src/lib.rs | 5 + pikelet/src/surface/grammar.lalrpop | 9 +- pikelet/src/surface/mod.rs | 5 +- pikelet/src/surface/projections/core.rs | 228 +++++++++++++----- pikelet/src/surface/projections/pretty.rs | 12 + pikelet/tests/examples.rs | 15 +- 16 files changed, 624 insertions(+), 179 deletions(-) diff --git a/README.md b/README.md index c842a2b2a..4d5c09441 100644 --- a/README.md +++ b/README.md @@ -62,7 +62,7 @@ You can read more about what we hope to achieve in [_Pondering the next version - [ ] Let expressions - [x] Record field lookups - [ ] Import expressions - - [ ] Function terms + - [x] Function terms - [x] Non-dependent function types - [ ] Pattern matching - [ ] Recursive terms @@ -72,7 +72,6 @@ You can read more about what we hope to achieve in [_Pondering the next version - [ ] Dependent record types - [ ] Dependent function types - [ ] Equality types - - [ ] Fixed-size arrays - [x] Universe levels - [x] Stratified - [x] Cumulative diff --git a/docs/specification/surface/grammar.md b/docs/specification/surface/grammar.md index 91e4c7e42..708b19c06 100644 --- a/docs/specification/surface/grammar.md +++ b/docs/specification/surface/grammar.md @@ -4,11 +4,17 @@ This defines the grammar of the surface language. ## Terms +Precedence climbing is used to define the syntax of terms: + > **Grammar**: > > term ::=\ +>  | expr-term\ +>  | expr-term `:` term +> +> expr-term ::=\ >  | arrow-term\ ->  | arrow-term `:` term +>  | `fun` name+ `=>` expr-term > > arrow-term ::=\ >  | app-term\ diff --git a/docs/specification/surface/lexical-structure.md b/docs/specification/surface/lexical-structure.md index 015d3a46c..4c054d2d2 100644 --- a/docs/specification/surface/lexical-structure.md +++ b/docs/specification/surface/lexical-structure.md @@ -87,6 +87,7 @@ For convenience, we define a number of special values within the above keyword ::=\ +>  | `fun`\ >  | `Record`\ >  | `record` > @@ -112,6 +113,7 @@ For convenience, we define a number of special values within the above (term: &pikelet::core::Term) -> Element { .push(Text::new(format!("Univ^{}", level))) // TODO: superscript? .into(), Term::Global(name) => Text::new(name).into(), + Term::Local(_) => Text::new("todo").into(), Term::Constant(Constant::U8(data)) => Text::new(data.to_string()).into(), Term::Constant(Constant::U16(data)) => Text::new(data.to_string()).into(), Term::Constant(Constant::U32(data)) => Text::new(data.to_string()).into(), @@ -89,6 +90,7 @@ fn view_term(term: &pikelet::core::Term) -> Element { Term::RecordType(_) => Text::new("todo").into(), Term::RecordElim(_, _) => Text::new("todo").into(), Term::FunctionType(_, _) => Text::new("todo").into(), + Term::FunctionTerm(_, _) => Text::new("todo").into(), Term::FunctionElim(_, _) => Text::new("todo").into(), Term::Lift(term, UniverseOffset(offset)) => Row::new() .push(view_term(term)) diff --git a/pikelet/src/core/mod.rs b/pikelet/src/core/mod.rs index f1f431ad5..b77f5b7e9 100644 --- a/pikelet/src/core/mod.rs +++ b/pikelet/src/core/mod.rs @@ -69,8 +69,10 @@ impl From for UniverseOffset { pub enum Term { /// The type of types. Universe(UniverseLevel), - /// References to global variables. + /// Global variables. Global(String), + /// Local variables. + Local(LocalIndex), /// Constants. Constant(Constant), /// Ordered sequences. @@ -85,6 +87,8 @@ pub enum Term { RecordElim(Arc, String), /// Function types. FunctionType(Arc, Arc), + /// Function terms (lambda abstractions). + FunctionTerm(String, Arc), /// Function eliminations (function application). FunctionElim(Arc, Arc), /// Lift a term by the given number of universe levels. @@ -99,11 +103,12 @@ impl Term { Term::Universe(level.into()) } - /// Create a reference to global variable. + /// Create a global variable. pub fn global(name: impl Into) -> Term { Term::Global(name.into()) } + /// Lift a term by the given offset. pub fn lift(self, offset: impl Into) -> Term { match offset.into() { UniverseOffset(0) => self, @@ -113,7 +118,7 @@ impl Term { } /// Values in the core language. -#[derive(Clone, Debug, PartialEq)] +#[derive(Clone, Debug)] pub enum Value { /// The type of types. Universe(UniverseLevel), @@ -138,6 +143,8 @@ pub enum Value { RecordTerm(BTreeMap>), /// Function types. FunctionType(Arc, Arc), + /// Function terms (lambda abstractions). + FunctionTerm(String, Closure), /// Error sentinel. Error, } @@ -148,29 +155,36 @@ impl Value { Value::Universe(level.into()) } - /// Create a reference to global variable. + /// Create a global variable. pub fn global( name: impl Into, - level: impl Into, + offset: impl Into, r#type: impl Into>, ) -> Value { Value::Elim( - Head::Global(name.into(), level.into()), + Head::Global(name.into(), offset.into()), Vec::new(), r#type.into(), ) } + + /// Create a local variable. + pub fn local(level: impl Into, r#type: impl Into>) -> Value { + Value::Elim(Head::Local(level.into()), Vec::new(), r#type.into()) + } } /// The head of an elimination. -#[derive(Clone, Debug, PartialEq)] +#[derive(Clone, Debug)] pub enum Head { - /// References to global variables. + /// Global variables. Global(String, UniverseOffset), + /// Local variables. + Local(LocalLevel), } /// An eliminator, to be used in the spine of an elimination. -#[derive(Clone, Debug, PartialEq)] +#[derive(Clone, Debug)] pub enum Elim { /// Record eliminators (field access). Record(String), @@ -178,6 +192,28 @@ pub enum Elim { Function(Arc, Arc), } +/// Closure, which captures a local environment. +#[derive(Clone, Debug)] +pub struct Closure { + pub universe_offset: UniverseOffset, + pub values: Locals>, + pub term: Arc, +} + +impl Closure { + pub fn new( + universe_offset: UniverseOffset, + values: Locals>, + term: Arc, + ) -> Closure { + Closure { + universe_offset, + values, + term, + } + } +} + /// An environment of global definitions. pub struct Globals { entries: BTreeMap, Option>)>, @@ -251,15 +287,72 @@ impl Default for Globals { } } -/// The local value environment. -pub struct Locals { - // TODO: values, +/// An index into the local environment. +#[derive(Copy, Clone, Debug, PartialEq, Eq)] +pub struct LocalIndex(u32); + +/// An level into the local environment. +#[derive(Copy, Clone, Debug, PartialEq, Eq)] +pub struct LocalLevel(u32); + +/// The size of the local environment. +#[derive(Copy, Clone, Debug, PartialEq, Eq)] +pub struct LocalSize(u32); + +impl LocalSize { + /// Return the level of the next variable to be added to the environment. + pub fn next_level(self) -> LocalLevel { + LocalLevel(self.0) + } + + /// Convert a variable level to a variable index in the current environment. + pub fn index(self, level: LocalLevel) -> LocalIndex { + LocalIndex(self.0 - (level.0 + 1)) // FIXME: Check for over/underflow? + } +} + +/// A local environment. +#[derive(Clone, Debug)] +pub struct Locals { + /// The local values that are currently defined in the environment. + values: Vec, } -impl Locals { +impl Locals { /// Create a new local environment. - pub fn new() -> Locals { - Locals {} + pub fn new() -> Locals { + Locals { values: Vec::new() } + } + + /// Get the size of the environment. + pub fn size(&self) -> LocalSize { + LocalSize(self.values.len() as u32) // FIXME: Check for overflow? + } + + /// Lookup an entry in the environment. + pub fn get(&self, index: LocalIndex) -> Option<&Entry> { + self.values + .get(self.values.len().checked_sub(index.0 as usize + 1)?) + } + + /// Push an entry onto the environment. + pub fn push(&mut self, entry: Entry) { + self.values.push(entry); + } + + /// Pop an entry off the environment. + pub fn pop(&mut self) { + self.values.pop(); + } + + /// Pop a number of entries off the environment. + pub fn pop_many(&mut self, count: usize) { + crate::pop_many(&mut self.values, count); + } + + /// Clear the entries from the environment. + pub fn clear(&mut self) { + self.values.clear(); } } diff --git a/pikelet/src/core/projections/pretty.rs b/pikelet/src/core/projections/pretty.rs index bd8e1971b..e4e1c9b7c 100644 --- a/pikelet/src/core/projections/pretty.rs +++ b/pikelet/src/core/projections/pretty.rs @@ -15,7 +15,14 @@ where .append("Type") .append("^") .append(alloc.as_string(level.0)), - Term::Global(name) => alloc.text(name), + Term::Global(name) => (alloc.nil()) + .append(alloc.text("global")) + .append(alloc.space()) + .append(alloc.text(name)), + Term::Local(index) => (alloc.nil()) + .append(alloc.text("local")) + .append(alloc.space()) + .append(alloc.as_string(index.0)), Term::Constant(constant) => pretty_constant(alloc, constant), Term::Sequence(term_entries) => (alloc.nil()) .append("[") @@ -91,6 +98,15 @@ where .append("->") .append(alloc.space()) .append(pretty_term(alloc, body_type)), + Term::FunctionTerm(_, body) => (alloc.nil()) + .append("fun") + .append(alloc.space()) + .append("_") + .append(alloc.space()) + .append("=>") + .group() + .append(alloc.space()) + .append(pretty_term(alloc, body).nest(4)), Term::FunctionElim(head, argument) => pretty_term(alloc, head).append( (alloc.nil()) .append(pretty_term(alloc, argument)) diff --git a/pikelet/src/core/projections/surface.rs b/pikelet/src/core/projections/surface.rs index 98ed80af0..7c071f13d 100644 --- a/pikelet/src/core/projections/surface.rs +++ b/pikelet/src/core/projections/surface.rs @@ -1,9 +1,21 @@ //! Delaborate the core language into the surface language. -use crate::core::{Constant, Term, UniverseLevel, UniverseOffset}; +use crate::core::{Constant, Locals, Term, UniverseLevel, UniverseOffset}; use crate::surface; -pub fn delaborate_term(term: &Term) -> surface::Term { +pub struct State<'me> { + // TODO: global names + // TODO: used names + names: &'me mut Locals, +} + +impl<'me> State<'me> { + pub fn new(names: &'me mut Locals) -> State<'me> { + State { names } + } +} + +pub fn delaborate_term(state: &mut State<'_>, term: &Term) -> surface::Term { match term { Term::Universe(UniverseLevel(0)) => surface::Term::Name(0..0, "Type".to_owned()), Term::Universe(UniverseLevel(level)) => { @@ -11,23 +23,24 @@ pub fn delaborate_term(term: &Term) -> surface::Term { surface::Term::Lift(0..0, universe0, *level) } Term::Global(name) => surface::Term::Name(0..0, name.to_owned()), + Term::Local(index) => surface::Term::Name(0..0, state.names.get(*index).cloned().unwrap()), // FIXME: unwrap Term::Constant(constant) => delaborate_constant(constant), Term::Sequence(entry_terms) => { let core_entry_terms = entry_terms .iter() - .map(|entry_term| delaborate_term(entry_term)) + .map(|entry_term| delaborate_term(state, entry_term)) .collect(); surface::Term::Sequence(0..0, core_entry_terms) } Term::Ann(term, r#type) => surface::Term::Ann( - Box::new(delaborate_term(term)), - Box::new(delaborate_term(r#type)), + Box::new(delaborate_term(state, term)), + Box::new(delaborate_term(state, r#type)), ), Term::RecordType(type_entries) => { let core_type_entries = type_entries .iter() - .map(|(name, r#type)| (name.clone(), delaborate_term(r#type))) + .map(|(name, r#type)| (name.clone(), delaborate_term(state, r#type))) .collect(); surface::Term::RecordType(0..0, core_type_entries) @@ -35,24 +48,50 @@ pub fn delaborate_term(term: &Term) -> surface::Term { Term::RecordTerm(term_entries) => { let core_term_entries = term_entries .iter() - .map(|(name, term)| (name.clone(), delaborate_term(term))) + .map(|(name, term)| (name.clone(), delaborate_term(state, term))) .collect(); surface::Term::RecordTerm(0..0, core_term_entries) } Term::RecordElim(head, name) => { - surface::Term::RecordElim(..0, Box::new(delaborate_term(head)), name.clone()) + surface::Term::RecordElim(..0, Box::new(delaborate_term(state, head)), name.clone()) } Term::FunctionType(param_type, body_type) => surface::Term::FunctionType( - Box::new(delaborate_term(param_type)), - Box::new(delaborate_term(body_type)), - ), - Term::FunctionElim(head, argument) => surface::Term::FunctionElim( - Box::new(delaborate_term(head)), - vec![delaborate_term(argument)], // TODO: flatten arguments + Box::new(delaborate_term(state, param_type)), + Box::new(delaborate_term(state, body_type)), ), + Term::FunctionTerm(param_name_hint, body) => { + let mut current_body = body; + + let mut param_names = vec![param_name_hint.clone()]; // FIXME: Name avoidance + state.names.push(param_name_hint.clone()); + + while let Term::FunctionTerm(param_name_hint, body) = current_body.as_ref() { + param_names.push(param_name_hint.clone()); // FIXME: Name avoidance + state.names.push(param_name_hint.clone()); + current_body = body; + } + + let body = delaborate_term(state, current_body); + state.names.pop_many(param_names.len()); + + surface::Term::FunctionTerm(0.., param_names, Box::new(body)) + } + Term::FunctionElim(head, argument) => { + let mut current_head = head; + + let mut arguments = vec![delaborate_term(state, argument)]; + while let Term::FunctionElim(head, argument) = current_head.as_ref() { + arguments.push(delaborate_term(state, argument)); + current_head = head; + } + arguments.reverse(); + + let head = delaborate_term(state, current_head); + surface::Term::FunctionElim(Box::new(head), arguments) + } Term::Lift(term, UniverseOffset(offset)) => { - surface::Term::Lift(0..0, Box::new(delaborate_term(term)), *offset) + surface::Term::Lift(0..0, Box::new(delaborate_term(state, term)), *offset) } Term::Error => surface::Term::Error(0..0), } diff --git a/pikelet/src/core/semantics.rs b/pikelet/src/core/semantics.rs index 2382a1b5c..d4fb5f3c0 100644 --- a/pikelet/src/core/semantics.rs +++ b/pikelet/src/core/semantics.rs @@ -2,13 +2,25 @@ use std::sync::Arc; -use crate::core::{Elim, Globals, Head, Locals, Term, UniverseOffset, Value}; +use crate::core::{Closure, Elim, Globals, Head, LocalSize, Locals, Term, UniverseOffset, Value}; + +/// Fully normalize a term. +pub fn normalize_term( + globals: &Globals, + universe_offset: UniverseOffset, + values: &mut Locals>, + term: &Term, + r#type: &Value, +) -> Term { + let value = eval_term(globals, universe_offset, values, term); + read_back_nf(globals, values.size(), &value, r#type) +} /// Evaluate a term into a value in weak-head normal form. pub fn eval_term( globals: &Globals, universe_offset: UniverseOffset, - locals: &mut Locals, + values: &mut Locals>, term: &Term, ) -> Arc { match term { @@ -16,31 +28,33 @@ pub fn eval_term( (*level + universe_offset).unwrap(), // FIXME: Handle overflow )), Term::Global(name) => match globals.get(name) { - Some((_, Some(term))) => eval_term(globals, universe_offset, locals, term), + Some((_, Some(term))) => eval_term(globals, universe_offset, values, term), Some((r#type, None)) => { - let r#type = eval_term(globals, universe_offset, locals, r#type); + let r#type = eval_term(globals, universe_offset, values, r#type); Arc::new(Value::global(name, universe_offset, r#type)) } None => Arc::new(Value::Error), }, + Term::Local(index) => match values.get(*index) { + Some(value) => value.clone(), + None => Arc::new(Value::Error), + }, Term::Constant(constant) => Arc::new(Value::Constant(constant.clone())), Term::Sequence(term_entries) => { let value_entries = term_entries .iter() - .map(|entry_term| eval_term(globals, universe_offset, locals, entry_term)) + .map(|entry_term| eval_term(globals, universe_offset, values, entry_term)) .collect(); Arc::new(Value::Sequence(value_entries)) } - Term::Ann(term, _) => eval_term(globals, universe_offset, locals, term), + Term::Ann(term, _) => eval_term(globals, universe_offset, values, term), Term::RecordType(type_entries) => { let type_entries = type_entries .iter() .map(|(name, r#type)| { - ( - name.clone(), - eval_term(globals, universe_offset, locals, r#type), - ) + let r#type = eval_term(globals, universe_offset, values, r#type); + (name.clone(), r#type) }) .collect(); @@ -50,17 +64,15 @@ pub fn eval_term( let value_entries = term_entries .iter() .map(|(name, term)| { - ( - name.clone(), - eval_term(globals, universe_offset, locals, term), - ) + let term = eval_term(globals, universe_offset, values, term); + (name.clone(), term) }) .collect(); Arc::new(Value::RecordTerm(value_entries)) } Term::RecordElim(head, name) => { - match eval_term(globals, universe_offset, locals, head).as_ref() { + match eval_term(globals, universe_offset, values, head).as_ref() { Value::RecordTerm(term_entries) => match term_entries.get(name) { Some(value) => value.clone(), None => Arc::new(Value::Error), @@ -83,14 +95,25 @@ pub fn eval_term( } } Term::FunctionType(param_type, body_type) => { - let param_type = eval_term(globals, universe_offset, locals, param_type); - let body_type = eval_term(globals, universe_offset, locals, body_type); + let param_type = eval_term(globals, universe_offset, values, param_type); + let body_type = eval_term(globals, universe_offset, values, body_type); Arc::new(Value::FunctionType(param_type, body_type)) } + Term::FunctionTerm(param_name, body) => Arc::new(Value::FunctionTerm( + param_name.clone(), + Closure::new( + universe_offset, + values.clone(), // FIXME: This clone could be expensive + body.clone(), + ), + )), Term::FunctionElim(head, argument) => { - match eval_term(globals, universe_offset, locals, head).as_ref() { - // TODO: Value::FunctionTerm(body) + match eval_term(globals, universe_offset, values, head).as_ref() { + Value::FunctionTerm(_, body_closure) => { + let argument = eval_term(globals, universe_offset, values, argument); + apply_closure(globals, body_closure, argument) + } Value::Elim(head, elims, r#type) => { let (param_type, body_type) = match r#type.as_ref() { Value::FunctionType(param_type, body_type) => (param_type, body_type), @@ -99,7 +122,7 @@ pub fn eval_term( let mut elims = elims.clone(); // TODO: Avoid clone? elims.push(Elim::Function( - eval_term(globals, universe_offset, locals, argument), + eval_term(globals, universe_offset, values, argument), param_type.clone(), )); Arc::new(Value::Elim(head.clone(), elims, body_type.clone())) @@ -109,23 +132,47 @@ pub fn eval_term( } Term::Lift(term, offset) => { let universe_offset = (universe_offset + *offset).unwrap(); // FIXME: Handle overflow - eval_term(globals, universe_offset, locals, term) + eval_term(globals, universe_offset, values, term) } Term::Error => Arc::new(Value::Error), } } +/// Apply a closure to an argument. +pub fn apply_closure(globals: &Globals, closure: &Closure, argument: Arc) -> Arc { + let mut values = closure.values.clone(); + values.push(argument); + eval_term(globals, closure.universe_offset, &mut values, &closure.term) +} + +/// Instantiate a closure in an environment of the given size. +pub fn instantiate_closure( + globals: &Globals, + local_size: LocalSize, + r#type: Arc, + closure: &Closure, +) -> Arc { + let argument = Arc::from(Value::local(local_size.next_level(), r#type)); + apply_closure(globals, closure, argument) +} + /// Read-back an eliminator into the term syntax. -pub fn read_back_elim(/* TODO: level, */ head: &Head, spine: &[Elim]) -> Term { +pub fn read_back_elim( + globals: &Globals, + local_size: LocalSize, + head: &Head, + spine: &[Elim], +) -> Term { let head = match head { Head::Global(name, shift) => Term::Global(name.clone()).lift(*shift), + Head::Local(level) => Term::Local(local_size.index(*level)), }; spine.iter().fold(head, |head, elim| match elim { Elim::Record(name) => Term::RecordElim(Arc::new(head), name.clone()), Elim::Function(argument, argument_type) => Term::FunctionElim( Arc::new(head), - Arc::new(read_back_nf(argument, argument_type)), + Arc::new(read_back_nf(globals, local_size, argument, argument_type)), ), }) } @@ -135,30 +182,37 @@ pub fn read_back_elim(/* TODO: level, */ head: &Head, spine: &[Elim]) -> Term { /// This is type-directed to allow us to perform [eta-conversion]. /// /// [eta-conversion]: https://ncatlab.org/nlab/show/eta-conversion -pub fn read_back_nf(/* TODO: level, */ value: &Value, r#type: &Value) -> Term { +pub fn read_back_nf( + globals: &Globals, + local_size: LocalSize, + value: &Value, + r#type: &Value, +) -> Term { match (value, r#type) { (Value::Universe(level), Value::Universe(_)) => Term::Universe(*level), - (Value::Elim(head, spine, _), _) => read_back_elim(head, spine), + (Value::Elim(head, spine, _), _) => read_back_elim(globals, local_size, head, spine), (Value::Constant(constant), _) => Term::Constant(constant.clone()), - (Value::Sequence(value_entries), Value::Elim(head, elims, _)) => match head { - Head::Global(name, _) => match (name.as_ref(), elims.as_slice()) { + (Value::Sequence(value_entries), Value::Elim(Head::Global(name, _), elims, _)) => { + match (name.as_ref(), elims.as_slice()) { ("Array", [Elim::Function(_, _), Elim::Function(entry_type, _)]) | ("List", [Elim::Function(entry_type, _)]) => { let term_entries = value_entries .iter() - .map(|value_entry| Arc::new(read_back_nf(value_entry, entry_type))) + .map(|value_entry| { + Arc::new(read_back_nf(globals, local_size, value_entry, entry_type)) + }) .collect(); Term::Sequence(term_entries) } _ => Term::Error, // TODO: Report error - }, - }, + } + } (Value::RecordType(type_entries), Value::Universe(_)) => { let type_entries = type_entries .iter() .map(|(name, r#type)| { - let r#type = Arc::new(read_back_type(r#type)); + let r#type = Arc::new(read_back_type(globals, local_size, r#type)); (name.clone(), r#type) }) .collect(); @@ -169,7 +223,8 @@ pub fn read_back_nf(/* TODO: level, */ value: &Value, r#type: &Value) -> Term { let term_entries = type_entries .iter() .map(|(name, r#type)| { - let term = Arc::new(read_back_nf(&value_entries[name], r#type)); + let value = &value_entries[name]; + let term = Arc::new(read_back_nf(globals, local_size, value, r#type)); (name.clone(), term) }) .collect(); @@ -177,69 +232,87 @@ pub fn read_back_nf(/* TODO: level, */ value: &Value, r#type: &Value) -> Term { Term::RecordTerm(term_entries) } (Value::FunctionType(param_type, body_type), Value::Universe(_)) => Term::FunctionType( - Arc::new(read_back_type(param_type)), - Arc::new(read_back_type(body_type)), + Arc::new(read_back_type(globals, local_size, param_type)), + Arc::new(read_back_type(globals, local_size, body_type)), ), + ( + Value::FunctionTerm(param_name_hint, body_closure), + Value::FunctionType(param_type, body_type), + ) => { + let body = instantiate_closure(globals, local_size, param_type.clone(), body_closure); + let body = read_back_nf(globals, LocalSize(local_size.0 + 1), &body, body_type); + + Term::FunctionTerm(param_name_hint.clone(), Arc::new(body)) + } (Value::Universe(_), _) | (Value::Sequence(_), _) | (Value::RecordType(_), _) | (Value::RecordTerm(_), _) - | (Value::FunctionType(_, _), _) => Term::Error, // TODO: Report error + | (Value::FunctionType(_, _), _) + | (Value::FunctionTerm(_, _), _) => Term::Error, // TODO: Report error (Value::Error, _) => Term::Error, } } /// Read-back a type into the term syntax. -pub fn read_back_type(/* TODO: level, */ r#type: &Value) -> Term { +pub fn read_back_type(globals: &Globals, local_size: LocalSize, r#type: &Value) -> Term { match r#type { Value::Universe(level) => Term::Universe(*level), - Value::Elim(head, spine, _) => read_back_elim(head, spine), + Value::Elim(head, spine, _) => read_back_elim(globals, local_size, head, spine), Value::RecordType(type_entries) => { let type_entries = type_entries .iter() - .map(|(name, r#type)| (name.clone(), Arc::new(read_back_type(r#type)))) + .map(|(name, r#type)| { + let r#type = Arc::new(read_back_type(globals, local_size, r#type)); + (name.clone(), r#type) + }) .collect(); Term::RecordType(type_entries) } Value::FunctionType(param_type, body_type) => Term::FunctionType( - Arc::new(read_back_type(param_type)), - Arc::new(read_back_type(body_type)), + Arc::new(read_back_type(globals, local_size, param_type)), + Arc::new(read_back_type(globals, local_size, body_type)), ), - Value::Constant(_) | Value::Sequence(_) | Value::RecordTerm(_) => Term::Error, // TODO: Report error + Value::Constant(_) + | Value::Sequence(_) + | Value::RecordTerm(_) + | Value::FunctionTerm(_, _) => { + Term::Error // TODO: Report error + } Value::Error => Term::Error, } } -/// Fully normalize a term. -pub fn normalize_term( - globals: &Globals, - universe_offset: UniverseOffset, - locals: &mut Locals, - term: &Term, - r#type: &Value, -) -> Term { - read_back_nf(&eval_term(globals, universe_offset, locals, term), r#type) -} - /// Check that one type is a subtype of another type. -pub fn is_subtype(value0: &Value, value1: &Value) -> bool { +pub fn is_subtype( + globals: &Globals, + local_size: LocalSize, + value0: &Value, + value1: &Value, +) -> bool { match (value0, value1) { (Value::Universe(level0), Value::Universe(level1)) => level0 <= level1, (Value::Elim(head0, spine0, type0), Value::Elim(head1, spine1, type1)) => { - read_back_elim(head0, spine0) == read_back_elim(head1, spine1) - && is_subtype(type0, type1) + read_back_elim(globals, local_size, head0, spine0) + == read_back_elim(globals, local_size, head1, spine1) + && is_subtype(globals, local_size, type0, type1) } (Value::RecordType(type_entries0), Value::RecordType(type_entries1)) => { type_entries0.len() == type_entries1.len() && Iterator::zip(type_entries0.iter(), type_entries1.iter()).all( - |((name0, type0), (name1, type1))| name0 == name1 && is_subtype(type0, type1), + |((name0, type0), (name1, type1))| { + name0 == name1 && is_subtype(globals, local_size, type0, type1) + }, ) } ( Value::FunctionType(param_type0, body_type0), Value::FunctionType(param_type1, body_type1), - ) => is_subtype(param_type1, param_type0) && is_subtype(body_type0, body_type1), + ) => { + is_subtype(globals, local_size, param_type1, param_type0) + && is_subtype(globals, local_size, body_type0, body_type1) + } // Errors are always treated as subtypes, regardless of what they are compared with. (Value::Error, _) | (_, Value::Error) => true, // Anything else is not equal! diff --git a/pikelet/src/core/typing.rs b/pikelet/src/core/typing.rs index bbc5c27ca..27a28d998 100644 --- a/pikelet/src/core/typing.rs +++ b/pikelet/src/core/typing.rs @@ -6,15 +6,21 @@ use std::sync::Arc; use crate::core::semantics; use crate::core::{ - Constant, Elim, Globals, Head, Locals, Term, UniverseLevel, UniverseOffset, Value, + Constant, Elim, Globals, Head, LocalLevel, Locals, Term, UniverseLevel, UniverseOffset, Value, }; /// The state of the type checker. pub struct State<'me> { + /// Global variables. globals: &'me Globals, + /// The current universe offset. universe_offset: UniverseOffset, - locals: Locals, - pub errors: Vec, + /// Types of the locals currently bound. + types: Locals>, + /// Values to be used during evaluation. + values: Locals>, + /// The errors accumulated during elaboration. + errors: Vec, } impl<'me> State<'me> { @@ -23,36 +29,76 @@ impl<'me> State<'me> { State { globals, universe_offset: UniverseOffset(0), - locals: Locals::new(), + types: Locals::new(), + values: Locals::new(), errors: Vec::new(), } } - /// Evaluate a term using the current state of the type checker. - pub fn eval_term(&mut self, term: &Term) -> Arc { - semantics::eval_term(self.globals, self.universe_offset, &mut self.locals, term) + /// Get the next level to be used for a local entry. + fn next_level(&self) -> LocalLevel { + self.values.size().next_level() + } + + /// Push a local entry. + fn push_local(&mut self, value: Arc, r#type: Arc) { + self.types.push(value); + self.values.push(r#type); + } + + /// Push a local parameter. + fn push_param(&mut self, r#type: Arc) -> Arc { + let value = Arc::new(Value::local(self.next_level(), r#type.clone())); + self.push_local(value.clone(), r#type); + value + } + + /// Pop a local entry. + fn pop_local(&mut self) { + self.types.pop(); + self.values.pop(); } /// Report an error. - pub fn report(&mut self, error: TypeError) { + fn report(&mut self, error: TypeError) { self.errors.push(error); } + /// Drain the current errors. + pub fn drain_errors(&mut self) -> std::vec::Drain { + self.errors.drain(..) + } + /// Reset the type checker state while retaining existing allocations. pub fn clear(&mut self) { + self.universe_offset = UniverseOffset(0); + self.types.clear(); + self.values.clear(); self.errors.clear(); } + + /// Evaluate a term using the current state of the type checker. + pub fn eval_term(&mut self, term: &Term) -> Arc { + semantics::eval_term(self.globals, self.universe_offset, &mut self.values, term) + } + + pub fn is_subtype(&self, value0: &Value, value1: &Value) -> bool { + semantics::is_subtype(self.globals, self.values.size(), value0, value1) + } } -#[derive(Clone, Debug, PartialEq)] +#[derive(Clone, Debug)] pub enum TypeError { MaximumUniverseLevelReached, - UnboundName(String), + UnboundGlobal(String), + UnboundLocal, DuplicateNamesInRecordType(Vec), MissingNamesInRecordTerm(Vec), UnexpectedNamesInRecordTerm(Vec), FieldNotFoundInRecord(String), - ExpectedRecord(Arc), + NotARecord(Arc), + TooManyParametersForFunctionTerm { expected_type: Arc }, + AmbiguousFunctionTerm, NotAFunction(Arc), AmbiguousSequence, UnexpectedSequenceLength(usize, Arc), @@ -76,8 +122,8 @@ pub fn check_type(state: &mut State<'_>, term: &Term) -> Option { /// Check that a term matches the expected type. pub fn check_term(state: &mut State<'_>, term: &Term, expected_type: &Arc) { match (term, expected_type.as_ref()) { - (Term::Sequence(entry_terms), Value::Elim(head, elims, _)) => match head { - Head::Global(name, _) => match (name.as_ref(), elims.as_slice()) { + (Term::Sequence(entry_terms), Value::Elim(Head::Global(name, _), elims, _)) => { + match (name.as_ref(), elims.as_slice()) { ("Array", [Elim::Function(len, _), Elim::Function(entry_type, _)]) => { for entry_term in entry_terms { check_term(state, entry_term, entry_type); @@ -98,8 +144,8 @@ pub fn check_term(state: &mut State<'_>, term: &Term, expected_type: &Arc } } _ => state.report(TypeError::NoSequenceConversion(expected_type.clone())), - }, - }, + } + } (Term::Sequence(_), Value::Error) => {} (Term::Sequence(_), _) => { state.report(TypeError::NoSequenceConversion(expected_type.clone())) @@ -125,8 +171,18 @@ pub fn check_term(state: &mut State<'_>, term: &Term, expected_type: &Arc state.report(TypeError::UnexpectedNamesInRecordTerm(unexpected_names)); } } + (Term::FunctionTerm(_, body), Value::FunctionType(param_type, body_type)) => { + state.push_param(param_type.clone()); + check_term(state, body, body_type); + state.pop_local(); + } + (Term::FunctionTerm(_, _), _) => { + state.report(TypeError::TooManyParametersForFunctionTerm { + expected_type: expected_type.clone(), + }); + } (term, _) => match synth_term(state, term) { - ty if semantics::is_subtype(&ty, expected_type) => {} + ty if state.is_subtype(&ty, expected_type) => {} ty => state.report(TypeError::MismatchedTypes(ty, expected_type.clone())), }, } @@ -145,7 +201,14 @@ pub fn synth_term(state: &mut State<'_>, term: &Term) -> Arc { Term::Global(name) => match state.globals.get(name) { Some((r#type, _)) => state.eval_term(r#type), None => { - state.report(TypeError::UnboundName(name.to_owned())); + state.report(TypeError::UnboundGlobal(name.to_owned())); + Arc::new(Value::Error) + } + }, + Term::Local(index) => match state.types.get(*index) { + Some(r#type) => r#type.clone(), + None => { + state.report(TypeError::UnboundLocal); Arc::new(Value::Error) } }, @@ -217,7 +280,7 @@ pub fn synth_term(state: &mut State<'_>, term: &Term) -> Arc { } } _ => { - state.report(TypeError::ExpectedRecord(head_type)); + state.report(TypeError::NotARecord(head_type)); Arc::new(Value::Error) } } @@ -230,6 +293,10 @@ pub fn synth_term(state: &mut State<'_>, term: &Term) -> Arc { (_, _) => Arc::new(Value::Error), } } + Term::FunctionTerm(_, _) => { + state.report(TypeError::AmbiguousFunctionTerm); + Arc::new(Value::Error) + } Term::FunctionElim(head, argument) => { let head_type = synth_term(state, head); match head_type.as_ref() { diff --git a/pikelet/src/lib.rs b/pikelet/src/lib.rs index b640e7943..b33bf68d3 100644 --- a/pikelet/src/lib.rs +++ b/pikelet/src/lib.rs @@ -2,3 +2,8 @@ pub mod core; pub mod surface; + +/// Pop a number of elements off the end of a vector in one go. +fn pop_many(vec: &mut Vec, count: usize) { + vec.truncate(vec.len().checked_sub(count).unwrap_or(0)); +} diff --git a/pikelet/src/surface/grammar.lalrpop b/pikelet/src/surface/grammar.lalrpop index 5b124f445..f181833ac 100644 --- a/pikelet/src/surface/grammar.lalrpop +++ b/pikelet/src/surface/grammar.lalrpop @@ -3,8 +3,15 @@ use crate::surface::{Term, Literal}; grammar; pub Term: Term<&'input str> = { + ExprTerm, + ":" => Term::Ann(Box::new(term), Box::new(ty)), +}; + +ExprTerm: Term<&'input str> = { ArrowTerm, - ":" => Term::Ann(Box::new(term), Box::new(ty)), + "fun" "=>" => { + Term::FunctionTerm(start.., param_names, Box::new(body)) + }, }; ArrowTerm: Term<&'input str> = { diff --git a/pikelet/src/surface/mod.rs b/pikelet/src/surface/mod.rs index 9be99d8a8..c65c18c3a 100644 --- a/pikelet/src/surface/mod.rs +++ b/pikelet/src/surface/mod.rs @@ -2,7 +2,7 @@ //! //! This is a user-friendly concrete syntax for the language. -use std::ops::{Range, RangeTo}; +use std::ops::{Range, RangeFrom, RangeTo}; pub mod projections; @@ -27,6 +27,8 @@ pub enum Term { RecordElim(RangeTo, Box>, S), /// Function types. FunctionType(Box>, Box>), + /// Function terms (lambda abstractions). + FunctionTerm(RangeFrom, Vec, Box>), /// Function eliminations (function application). FunctionElim(Box>, Vec>), /// Lift a term by the given number of universe levels. @@ -56,6 +58,7 @@ impl<'input> Term<&'input str> { Term::FunctionType(param_type, body_type) => { param_type.span().start..body_type.span().end } + Term::FunctionTerm(span, _, body) => span.start..body.span().end, Term::FunctionElim(head, arguments) => match arguments.last() { Some(argument) => head.span().start..argument.span().end, None => head.span(), diff --git a/pikelet/src/surface/projections/core.rs b/pikelet/src/surface/projections/core.rs index 82aff7431..4f323e451 100644 --- a/pikelet/src/surface/projections/core.rs +++ b/pikelet/src/surface/projections/core.rs @@ -8,10 +8,20 @@ use crate::surface::{Literal, Term}; /// The state of the elaborator. pub struct State<'me> { + /// Global variables. globals: &'me core::Globals, + /// The current universe offset. universe_offset: core::UniverseOffset, - locals: core::Locals, - pub errors: Vec, + /// Substitutions from the user-defined names to the level in which they were bound. + names_to_levels: Vec<(String, core::LocalLevel)>, + /// Names of the entries in the context (used for pretty printing). + names: core::Locals, + /// Types of the locals currently bound. + types: core::Locals>, + /// Values to be used during evaluation. + values: core::Locals>, + /// The errors accumulated during elaboration. + errors: Vec, } impl<'me> State<'me> { @@ -20,24 +30,80 @@ impl<'me> State<'me> { State { globals, universe_offset: core::UniverseOffset(0), - locals: core::Locals::new(), + names_to_levels: Vec::new(), + names: core::Locals::new(), + types: core::Locals::new(), + values: core::Locals::new(), errors: Vec::new(), } } + /// Get the next level to be used for a local entry. + fn next_level(&self) -> core::LocalLevel { + self.values.size().next_level() + } + + /// Get a local entry. + fn get_local(&self, name: &str) -> Option<(core::LocalIndex, &Arc)> { + let (_, level) = self.names_to_levels.iter().rev().find(|(n, _)| n == name)?; + let index = self.values.size().index(*level); + let ty = self.types.get(index)?; + Some((index, ty)) + } + + /// Push a local entry. + fn push_local(&mut self, name: String, value: Arc, r#type: Arc) { + self.names_to_levels.push((name.clone(), self.next_level())); + self.names.push(name); + self.types.push(r#type); + self.values.push(value); + } + + /// Push a local parameter. + fn push_param(&mut self, name: String, r#type: Arc) -> Arc { + let value = Arc::new(core::Value::local(self.next_level(), r#type.clone())); + self.push_local(name, value.clone(), r#type); + value + } + + // /// Pop a local entry. + // fn pop_local(&mut self) { + // self.names_to_levels.pop(); + // self.names.pop(); + // self.types.pop(); + // self.values.pop(); + // } + + /// Pop the given number of local entries. + fn pop_many_locals(&mut self, count: usize) { + crate::pop_many(&mut self.names_to_levels, count); + self.names.pop_many(count); + self.types.pop_many(count); + self.values.pop_many(count); + } + /// Report an error. - pub fn report(&mut self, error: TypeError) { + fn report(&mut self, error: TypeError) { self.errors.push(error); } + /// Drain the current errors. + pub fn drain_errors(&mut self) -> std::vec::Drain { + self.errors.drain(..) + } + /// Reset the elaborator state while retaining existing allocations. pub fn clear(&mut self) { + self.universe_offset = core::UniverseOffset(0); + self.names_to_levels.clear(); + self.types.clear(); + self.values.clear(); self.errors.clear(); } /// Evaluate a term using the current state of the elaborator. pub fn eval_term(&mut self, term: &core::Term) -> Arc { - core::semantics::eval_term(self.globals, self.universe_offset, &mut self.locals, term) + core::semantics::eval_term(self.globals, self.universe_offset, &mut self.values, term) } /// Normalize a term using the current state of the elaborator. @@ -45,18 +111,30 @@ impl<'me> State<'me> { core::semantics::normalize_term( self.globals, self.universe_offset, - &mut self.locals, + &mut self.values, term, r#type, ) } + /// Read back a type using the current state of the elaborator. pub fn read_back_type(&mut self, r#type: &core::Value) -> core::Term { - core::semantics::read_back_type(r#type) + core::semantics::read_back_type(self.globals, self.values.size(), r#type) + } + + pub fn is_subtype(&self, value0: &core::Value, value1: &core::Value) -> bool { + core::semantics::is_subtype(self.globals, self.values.size(), value0, value1) + } + + pub fn delaborate_term(&mut self, core_term: &core::Term) -> Term { + core::projections::surface::delaborate_term( + &mut core::projections::surface::State::new(&mut self.names), + &core_term, + ) } } -#[derive(Clone, Debug, PartialEq)] +#[derive(Clone, Debug)] pub enum TypeError { MaximumUniverseLevelReached, UnboundName(String), @@ -65,7 +143,12 @@ pub enum TypeError { MissingNamesInRecordTerm(Vec), UnexpectedNamesInRecordTerm(Vec), FieldNotFoundInRecord(String), - ExpectedRecord(Arc), + NotARecord(Arc), + TooManyParametersForFunctionTerm { + excess_parameters: Vec, + expected_type: Arc, + }, + AmbiguousFunctionTerm, NotAFunction(Arc), InvalidNumberLiteral, InvalidCharLiteral, @@ -128,46 +211,44 @@ pub fn check_term>( state.report(TypeError::NoLiteralConversion(expected_type.clone())); core::Term::Error } - (Term::Sequence(_, entry_terms), core::Value::Elim(head, elims, _)) => match head { - core::Head::Global(name, _) => match (name.as_ref(), elims.as_slice()) { - ( - "Array", - [core::Elim::Function(len, _), core::Elim::Function(core_entry_type, _)], - ) => { - let core_entry_terms = entry_terms - .iter() - .map(|entry_term| Arc::new(check_term(state, entry_term, core_entry_type))) - .collect(); - - match **len { - core::Value::Constant(core::Constant::U32(len)) - if len as usize == entry_terms.len() => - { - core::Term::Sequence(core_entry_terms) - } - _ => { - state.report(TypeError::UnexpectedSequenceLength( - entry_terms.len(), - len.clone(), - )); + ( + Term::Sequence(_, entry_terms), + core::Value::Elim(core::Head::Global(name, _), elims, _), + ) => match (name.as_ref(), elims.as_slice()) { + ("Array", [core::Elim::Function(len, _), core::Elim::Function(core_entry_type, _)]) => { + let core_entry_terms = entry_terms + .iter() + .map(|entry_term| Arc::new(check_term(state, entry_term, core_entry_type))) + .collect(); - core::Term::Error - } + match **len { + core::Value::Constant(core::Constant::U32(len)) + if len as usize == entry_terms.len() => + { + core::Term::Sequence(core_entry_terms) } - } - ("List", [core::Elim::Function(core_entry_type, _)]) => { - let core_entry_terms = entry_terms - .iter() - .map(|entry_term| Arc::new(check_term(state, entry_term, core_entry_type))) - .collect(); + _ => { + state.report(TypeError::UnexpectedSequenceLength( + entry_terms.len(), + len.clone(), + )); - core::Term::Sequence(core_entry_terms) - } - _ => { - state.report(TypeError::NoSequenceConversion(expected_type.clone())); - core::Term::Error + core::Term::Error + } } - }, + } + ("List", [core::Elim::Function(core_entry_type, _)]) => { + let core_entry_terms = entry_terms + .iter() + .map(|entry_term| Arc::new(check_term(state, entry_term, core_entry_type))) + .collect(); + + core::Term::Sequence(core_entry_terms) + } + _ => { + state.report(TypeError::NoSequenceConversion(expected_type.clone())); + core::Term::Error + } }, (Term::Sequence(_, _), core::Value::Error) => core::Term::Error, (Term::Sequence(_, _), _) => { @@ -215,8 +296,36 @@ pub fn check_term>( core::Term::RecordTerm(core_term_entries) } + (Term::FunctionTerm(_, param_names, body), _) => { + let core_body = { + let mut expected_type = expected_type; + let mut param_names = param_names.iter(); + while let Some(param_name) = param_names.next() { + match expected_type.as_ref() { + core::Value::FunctionType(param_type, body_type) => { + state.push_param(param_name.as_ref().to_owned(), param_type.clone()); + expected_type = body_type; + } + _ => { + state.report(TypeError::TooManyParametersForFunctionTerm { + excess_parameters: param_names + .map(|param_name| param_name.as_ref().to_owned()) + .collect(), + expected_type: expected_type.clone(), + }); + return core::Term::Error; + } + } + } + check_term(state, body, expected_type) + }; + state.pop_many_locals(param_names.len()); + (param_names.iter().rev()).fold(core_body, |core_body, param_name| { + core::Term::FunctionTerm(param_name.as_ref().to_owned(), Arc::new(core_body)) + }) + } (term, _) => match synth_term(state, term) { - (term, ty) if core::semantics::is_subtype(&ty, expected_type) => term, + (term, ty) if state.is_subtype(&ty, expected_type) => term, (_, ty) => { state.report(TypeError::MismatchedTypes(ty, expected_type.clone())); core::Term::Error @@ -233,16 +342,19 @@ pub fn synth_term>( use std::collections::{BTreeMap, BTreeSet}; match term { - Term::Name(_, name) => match state.globals.get(name.as_ref()) { - Some((r#type, _)) => ( - core::Term::Global(name.as_ref().to_owned()).lift(state.universe_offset), - state.eval_term(r#type), - ), - None => { - state.report(TypeError::UnboundName(name.as_ref().to_owned())); - (core::Term::Error, Arc::new(core::Value::Error)) + Term::Name(_, name) => { + if let Some((index, r#type)) = state.get_local(name.as_ref()) { + return (core::Term::Local(index), r#type.clone()); } - }, + + if let Some((r#type, _)) = state.globals.get(name.as_ref()) { + let global = core::Term::Global(name.as_ref().to_owned()); + return (global.lift(state.universe_offset), state.eval_term(r#type)); + } + + state.report(TypeError::UnboundName(name.as_ref().to_owned())); + (core::Term::Error, Arc::new(core::Value::Error)) + } Term::Ann(term, r#type) => { let (core_type, _) = check_type(state, r#type); let core_type_value = state.eval_term(&core_type); @@ -344,7 +456,7 @@ pub fn synth_term>( } } _ => { - state.report(TypeError::ExpectedRecord(head_type)); + state.report(TypeError::NotARecord(head_type)); (core::Term::Error, Arc::new(core::Value::Error)) } } @@ -361,6 +473,10 @@ pub fn synth_term>( (_, _) => (core::Term::Error, Arc::new(core::Value::Error)), } } + Term::FunctionTerm(_, _, _) => { + state.report(TypeError::AmbiguousFunctionTerm); + (core::Term::Error, Arc::new(core::Value::Error)) + } Term::FunctionElim(head, arguments) => { let (mut core_head, mut head_type) = synth_term(state, head); diff --git a/pikelet/src/surface/projections/pretty.rs b/pikelet/src/surface/projections/pretty.rs index ddabe0b51..97b624e2f 100644 --- a/pikelet/src/surface/projections/pretty.rs +++ b/pikelet/src/surface/projections/pretty.rs @@ -87,6 +87,18 @@ where .append("->") .append(alloc.space()) .append(pretty_term(alloc, body_type)), + Term::FunctionTerm(_, param_names, body) => (alloc.nil()) + .append("fun") + .append(alloc.space()) + .append(alloc.intersperse(param_names.iter().map(S::as_ref), alloc.space())) + .append(alloc.space()) + .append("=>") + .group() + .append( + (alloc.nil()) + .append(alloc.space()) + .append(pretty_term(alloc, body).group().nest(4)), + ), Term::FunctionElim(head, arguments) => pretty_term(alloc, head).append( (alloc.nil()) .append( diff --git a/pikelet/tests/examples.rs b/pikelet/tests/examples.rs index 88ed3d8bd..ff5e80134 100644 --- a/pikelet/tests/examples.rs +++ b/pikelet/tests/examples.rs @@ -10,10 +10,11 @@ fn run_test(input: &str) { let globals = core::Globals::default(); let mut state = surface::projections::core::State::new(&globals); let (core_term, r#type) = surface::projections::core::synth_term(&mut state, &surface_term); - if !state.errors.is_empty() { + let errors = state.drain_errors().collect::>(); + if !errors.is_empty() { is_failed = true; eprintln!("surface::projections::core::synth_term errors:"); - for error in state.errors { + for error in errors { eprintln!(" {:?}", error); } eprintln!(); @@ -21,10 +22,11 @@ fn run_test(input: &str) { let mut state = core::typing::State::new(&globals); core::typing::synth_term(&mut state, &core_term); - if !state.errors.is_empty() { + let errors = state.drain_errors().collect::>(); + if !errors.is_empty() { is_failed = true; eprintln!("core::typing::synth_term errors:"); - for error in state.errors { + for error in errors { eprintln!(" {:?}", error); } eprintln!(); @@ -32,10 +34,11 @@ fn run_test(input: &str) { let mut state = core::typing::State::new(&globals); core::typing::check_term(&mut state, &core_term, &r#type); - if !state.errors.is_empty() { + let errors = state.drain_errors().collect::>(); + if !errors.is_empty() { is_failed = true; eprintln!("core::typing::check_term errors:"); - for error in state.errors { + for error in errors { eprintln!(" {:?}", error); } eprintln!(); From 8d8e1548613e069d0d742a83ef14a00d165b34e5 Mon Sep 17 00:00:00 2001 From: Brendan Zabarauskas Date: Thu, 16 Jan 2020 11:55:51 +1100 Subject: [PATCH 63/88] Add a test for functions --- examples/functions.pi | 4 ++++ pikelet/src/core/typing.rs | 4 ++-- pikelet/tests/examples.rs | 5 +++++ 3 files changed, 11 insertions(+), 2 deletions(-) create mode 100644 examples/functions.pi diff --git a/examples/functions.pi b/examples/functions.pi new file mode 100644 index 000000000..2cf9cb9d7 --- /dev/null +++ b/examples/functions.pi @@ -0,0 +1,4 @@ +record { + id-String = (fun a => a) : String -> String, + const-String-S32 = (fun a b => a) : String -> S32 -> String, +} diff --git a/pikelet/src/core/typing.rs b/pikelet/src/core/typing.rs index 27a28d998..def614542 100644 --- a/pikelet/src/core/typing.rs +++ b/pikelet/src/core/typing.rs @@ -42,8 +42,8 @@ impl<'me> State<'me> { /// Push a local entry. fn push_local(&mut self, value: Arc, r#type: Arc) { - self.types.push(value); - self.values.push(r#type); + self.types.push(r#type); + self.values.push(value); } /// Push a local parameter. diff --git a/pikelet/tests/examples.rs b/pikelet/tests/examples.rs index ff5e80134..a52a99c58 100644 --- a/pikelet/tests/examples.rs +++ b/pikelet/tests/examples.rs @@ -54,6 +54,11 @@ fn cube() { run_test(include_str!("../../examples/cube.pi")); } +#[test] +fn functions() { + run_test(include_str!("../../examples/functions.pi")); +} + #[test] fn hello_world() { run_test(include_str!("../../examples/hello-world.pi")); From 138c873b4dd97d5c650596ff4015d7b4c15d7235 Mon Sep 17 00:00:00 2001 From: Brendan Zabarauskas Date: Thu, 16 Jan 2020 12:09:29 +1100 Subject: [PATCH 64/88] Fix delaboration of character and string constants --- pikelet/src/core/projections/pretty.rs | 24 +++++++++++------------ pikelet/src/core/projections/surface.rs | 26 ++++++++++++------------- 2 files changed, 25 insertions(+), 25 deletions(-) diff --git a/pikelet/src/core/projections/pretty.rs b/pikelet/src/core/projections/pretty.rs index e4e1c9b7c..dc60c6b35 100644 --- a/pikelet/src/core/projections/pretty.rs +++ b/pikelet/src/core/projections/pretty.rs @@ -132,17 +132,17 @@ where D::Doc: Clone, { match constant { - Constant::U8(value) => alloc.as_string(format!("{}", value)), - Constant::U16(value) => alloc.as_string(format!("{}", value)), - Constant::U32(value) => alloc.as_string(format!("{}", value)), - Constant::U64(value) => alloc.as_string(format!("{}", value)), - Constant::S8(value) => alloc.as_string(format!("{}", value)), - Constant::S16(value) => alloc.as_string(format!("{}", value)), - Constant::S32(value) => alloc.as_string(format!("{}", value)), - Constant::S64(value) => alloc.as_string(format!("{}", value)), - Constant::F32(value) => alloc.as_string(format!("{}", value)), - Constant::F64(value) => alloc.as_string(format!("{}", value)), - Constant::Char(value) => alloc.as_string(format!("{:?}", value)), - Constant::String(value) => alloc.as_string(format!("{:?}", value)), + Constant::U8(value) => alloc.text(format!("{}", value)), + Constant::U16(value) => alloc.text(format!("{}", value)), + Constant::U32(value) => alloc.text(format!("{}", value)), + Constant::U64(value) => alloc.text(format!("{}", value)), + Constant::S8(value) => alloc.text(format!("{}", value)), + Constant::S16(value) => alloc.text(format!("{}", value)), + Constant::S32(value) => alloc.text(format!("{}", value)), + Constant::S64(value) => alloc.text(format!("{}", value)), + Constant::F32(value) => alloc.text(format!("{}", value)), + Constant::F64(value) => alloc.text(format!("{}", value)), + Constant::Char(value) => alloc.text(format!("{:?}", value)), + Constant::String(value) => alloc.text(format!("{:?}", value)), } } diff --git a/pikelet/src/core/projections/surface.rs b/pikelet/src/core/projections/surface.rs index 7c071f13d..3d8452b0f 100644 --- a/pikelet/src/core/projections/surface.rs +++ b/pikelet/src/core/projections/surface.rs @@ -98,20 +98,20 @@ pub fn delaborate_term(state: &mut State<'_>, term: &Term) -> surface::Term surface::Term { - use crate::surface::Literal; + use crate::surface::Literal::{Char, Number, String}; match constant { - Constant::U8(value) => surface::Term::Literal(0..0, Literal::Number(value.to_string())), - Constant::U16(value) => surface::Term::Literal(0..0, Literal::Number(value.to_string())), - Constant::U32(value) => surface::Term::Literal(0..0, Literal::Number(value.to_string())), - Constant::U64(value) => surface::Term::Literal(0..0, Literal::Number(value.to_string())), - Constant::S8(value) => surface::Term::Literal(0..0, Literal::Number(value.to_string())), - Constant::S16(value) => surface::Term::Literal(0..0, Literal::Number(value.to_string())), - Constant::S32(value) => surface::Term::Literal(0..0, Literal::Number(value.to_string())), - Constant::S64(value) => surface::Term::Literal(0..0, Literal::Number(value.to_string())), - Constant::F32(value) => surface::Term::Literal(0..0, Literal::Number(value.to_string())), - Constant::F64(value) => surface::Term::Literal(0..0, Literal::Number(value.to_string())), - Constant::Char(value) => surface::Term::Literal(0..0, Literal::Char(value.to_string())), - Constant::String(value) => surface::Term::Literal(0..0, Literal::String(value.to_string())), + Constant::U8(value) => surface::Term::Literal(0..0, Number(value.to_string())), + Constant::U16(value) => surface::Term::Literal(0..0, Number(value.to_string())), + Constant::U32(value) => surface::Term::Literal(0..0, Number(value.to_string())), + Constant::U64(value) => surface::Term::Literal(0..0, Number(value.to_string())), + Constant::S8(value) => surface::Term::Literal(0..0, Number(value.to_string())), + Constant::S16(value) => surface::Term::Literal(0..0, Number(value.to_string())), + Constant::S32(value) => surface::Term::Literal(0..0, Number(value.to_string())), + Constant::S64(value) => surface::Term::Literal(0..0, Number(value.to_string())), + Constant::F32(value) => surface::Term::Literal(0..0, Number(value.to_string())), + Constant::F64(value) => surface::Term::Literal(0..0, Number(value.to_string())), + Constant::Char(value) => surface::Term::Literal(0..0, Char(format!("{:?}", value))), + Constant::String(value) => surface::Term::Literal(0..0, String(format!("{:?}", value))), } } From d2be1f09450a8799bb8f71110a3a673c0d4b36c1 Mon Sep 17 00:00:00 2001 From: Brendan Zabarauskas Date: Thu, 16 Jan 2020 14:34:35 +1100 Subject: [PATCH 65/88] Add gitignore --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..e846d38e3 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +/target +Cargo.lock +repl-history From 006acd551df76c56b2547d90256a20aa9e30cf02 Mon Sep 17 00:00:00 2001 From: Brendan Zabarauskas Date: Thu, 16 Jan 2020 15:13:01 +1100 Subject: [PATCH 66/88] Add missing documentation --- pikelet/src/core/typing.rs | 7 ++++++- pikelet/src/surface/projections/core.rs | 2 ++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/pikelet/src/core/typing.rs b/pikelet/src/core/typing.rs index def614542..ade5918b3 100644 --- a/pikelet/src/core/typing.rs +++ b/pikelet/src/core/typing.rs @@ -1,6 +1,10 @@ //! Bidirectional type checker for the core language. //! -//! This is used to validate that terms are well-formed. +//! This is a simpler implementation of type checking than the one found in +//! `surface::projections::core`, +//! because it only needs to check the (much simpler) core language, +//! and doesn't need to perform any additional elaboaration. +//! We can use it as a way to validate that elaborated terms are well-formed. use std::sync::Arc; @@ -82,6 +86,7 @@ impl<'me> State<'me> { semantics::eval_term(self.globals, self.universe_offset, &mut self.values, term) } + /// Check if `value0` is a subtype of `value1`. pub fn is_subtype(&self, value0: &Value, value1: &Value) -> bool { semantics::is_subtype(self.globals, self.values.size(), value0, value1) } diff --git a/pikelet/src/surface/projections/core.rs b/pikelet/src/surface/projections/core.rs index 4f323e451..bc91e39d1 100644 --- a/pikelet/src/surface/projections/core.rs +++ b/pikelet/src/surface/projections/core.rs @@ -122,10 +122,12 @@ impl<'me> State<'me> { core::semantics::read_back_type(self.globals, self.values.size(), r#type) } + /// Check if `value0` is a subtype of `value1`. pub fn is_subtype(&self, value0: &core::Value, value1: &core::Value) -> bool { core::semantics::is_subtype(self.globals, self.values.size(), value0, value1) } + /// Delaborate a `core::Term` into a `surface::Term`. pub fn delaborate_term(&mut self, core_term: &core::Term) -> Term { core::projections::surface::delaborate_term( &mut core::projections::surface::State::new(&mut self.names), From 4aba7e1ce56f204f07056d9830e94ba241a1331f Mon Sep 17 00:00:00 2001 From: Brendan Zabarauskas Date: Thu, 16 Jan 2020 15:59:28 +1100 Subject: [PATCH 67/88] Use struct-style variants for type errors --- pikelet/src/core/typing.rs | 99 +++++++++++++------- pikelet/src/surface/projections/core.rs | 114 ++++++++++++++++-------- 2 files changed, 147 insertions(+), 66 deletions(-) diff --git a/pikelet/src/core/typing.rs b/pikelet/src/core/typing.rs index ade5918b3..3982b85b8 100644 --- a/pikelet/src/core/typing.rs +++ b/pikelet/src/core/typing.rs @@ -23,7 +23,7 @@ pub struct State<'me> { types: Locals>, /// Values to be used during evaluation. values: Locals>, - /// The errors accumulated during elaboration. + /// The errors accumulated during type checking. errors: Vec, } @@ -95,21 +95,48 @@ impl<'me> State<'me> { #[derive(Clone, Debug)] pub enum TypeError { MaximumUniverseLevelReached, - UnboundGlobal(String), + UnboundGlobal { + name: String, + }, UnboundLocal, - DuplicateNamesInRecordType(Vec), - MissingNamesInRecordTerm(Vec), - UnexpectedNamesInRecordTerm(Vec), - FieldNotFoundInRecord(String), - NotARecord(Arc), - TooManyParametersForFunctionTerm { expected_type: Arc }, + DuplicateNamesInRecordType { + duplicate_names: Vec, + }, + MissingNamesInRecordTerm { + missing_names: Vec, + }, + UnexpectedNamesInRecordTerm { + unexpected_names: Vec, + }, + FieldNotFoundInRecord { + expected_field_name: String, + head_type: Arc, + }, + NotARecord { + head_type: Arc, + }, + TooManyParametersForFunctionTerm { + expected_type: Arc, + }, AmbiguousFunctionTerm, - NotAFunction(Arc), + NotAFunction { + head_type: Arc, + }, AmbiguousSequence, - UnexpectedSequenceLength(usize, Arc), - NoSequenceConversion(Arc), - ExpectedType(Arc), - MismatchedTypes(Arc, Arc), + MismatchedSequenceLength { + found_len: usize, + expected_len: Arc, + }, + NoSequenceConversion { + expected_type: Arc, + }, + ExpectedType { + found_type: Arc, + }, + MismatchedTypes { + found_type: Arc, + expected_type: Arc, + }, } /// Check that a term is a universe and return its level. @@ -118,7 +145,7 @@ pub fn check_type(state: &mut State<'_>, term: &Term) -> Option { match r#type.as_ref() { Value::Universe(level) => Some(*level), _ => { - state.report(TypeError::ExpectedType(r#type)); + state.report(TypeError::ExpectedType { found_type: r#type }); None } } @@ -137,10 +164,10 @@ pub fn check_term(state: &mut State<'_>, term: &Term, expected_type: &Arc match **len { Value::Constant(Constant::U32(len)) if len as usize == entry_terms.len() => {} - _ => state.report(TypeError::UnexpectedSequenceLength( - entry_terms.len(), - len.clone(), - )), + _ => state.report(TypeError::MismatchedSequenceLength { + found_len: entry_terms.len(), + expected_len: len.clone(), + }), } } ("List", [Elim::Function(entry_type, _)]) => { @@ -148,13 +175,15 @@ pub fn check_term(state: &mut State<'_>, term: &Term, expected_type: &Arc check_term(state, entry_term, entry_type); } } - _ => state.report(TypeError::NoSequenceConversion(expected_type.clone())), + _ => state.report(TypeError::NoSequenceConversion { + expected_type: expected_type.clone(), + }), } } (Term::Sequence(_), Value::Error) => {} - (Term::Sequence(_), _) => { - state.report(TypeError::NoSequenceConversion(expected_type.clone())) - } + (Term::Sequence(_), _) => state.report(TypeError::NoSequenceConversion { + expected_type: expected_type.clone(), + }), (Term::RecordTerm(term_entries), Value::RecordType(type_entries)) => { let mut missing_names = Vec::new(); let mut term_entries = term_entries.clone(); @@ -167,13 +196,13 @@ pub fn check_term(state: &mut State<'_>, term: &Term, expected_type: &Arc } if !missing_names.is_empty() { - state.report(TypeError::MissingNamesInRecordTerm(missing_names)); + state.report(TypeError::MissingNamesInRecordTerm { missing_names }); } if !term_entries.is_empty() { let unexpected_names = (term_entries.into_iter()) .map(|(name, _)| name.to_owned()) .collect(); - state.report(TypeError::UnexpectedNamesInRecordTerm(unexpected_names)); + state.report(TypeError::UnexpectedNamesInRecordTerm { unexpected_names }); } } (Term::FunctionTerm(_, body), Value::FunctionType(param_type, body_type)) => { @@ -187,8 +216,11 @@ pub fn check_term(state: &mut State<'_>, term: &Term, expected_type: &Arc }); } (term, _) => match synth_term(state, term) { - ty if state.is_subtype(&ty, expected_type) => {} - ty => state.report(TypeError::MismatchedTypes(ty, expected_type.clone())), + found_type if state.is_subtype(&found_type, expected_type) => {} + found_type => state.report(TypeError::MismatchedTypes { + found_type, + expected_type: expected_type.clone(), + }), }, } } @@ -206,7 +238,9 @@ pub fn synth_term(state: &mut State<'_>, term: &Term) -> Arc { Term::Global(name) => match state.globals.get(name) { Some((r#type, _)) => state.eval_term(r#type), None => { - state.report(TypeError::UnboundGlobal(name.to_owned())); + state.report(TypeError::UnboundGlobal { + name: name.to_owned(), + }); Arc::new(Value::Error) } }, @@ -267,7 +301,7 @@ pub fn synth_term(state: &mut State<'_>, term: &Term) -> Arc { } if !duplicate_names.is_empty() { - state.report(TypeError::DuplicateNamesInRecordType(duplicate_names)); + state.report(TypeError::DuplicateNamesInRecordType { duplicate_names }); } Arc::new(Value::Universe(max_level)) @@ -279,13 +313,16 @@ pub fn synth_term(state: &mut State<'_>, term: &Term) -> Arc { match type_entries.iter().find(|(n, _)| n == name) { Some((_, r#type)) => r#type.clone(), None => { - state.report(TypeError::FieldNotFoundInRecord(name.clone())); + state.report(TypeError::FieldNotFoundInRecord { + expected_field_name: name.clone(), + head_type, + }); Arc::new(Value::Error) } } } _ => { - state.report(TypeError::NotARecord(head_type)); + state.report(TypeError::NotARecord { head_type }); Arc::new(Value::Error) } } @@ -311,7 +348,7 @@ pub fn synth_term(state: &mut State<'_>, term: &Term) -> Arc { } Value::Error => Arc::new(Value::Error), _ => { - state.report(TypeError::NotAFunction(head_type)); + state.report(TypeError::NotAFunction { head_type }); Arc::new(Value::Error) } } diff --git a/pikelet/src/surface/projections/core.rs b/pikelet/src/surface/projections/core.rs index bc91e39d1..ba1577b01 100644 --- a/pikelet/src/surface/projections/core.rs +++ b/pikelet/src/surface/projections/core.rs @@ -139,29 +139,58 @@ impl<'me> State<'me> { #[derive(Clone, Debug)] pub enum TypeError { MaximumUniverseLevelReached, - UnboundName(String), - DuplicateNamesInRecordTerm(Vec), - DuplicateNamesInRecordType(Vec), - MissingNamesInRecordTerm(Vec), - UnexpectedNamesInRecordTerm(Vec), - FieldNotFoundInRecord(String), - NotARecord(Arc), + UnboundName { + name: String, + }, + DuplicateNamesInRecordTerm { + duplicate_names: Vec, + }, + DuplicateNamesInRecordType { + duplicate_names: Vec, + }, + MissingNamesInRecordTerm { + missing_names: Vec, + }, + UnexpectedNamesInRecordTerm { + unexpected_names: Vec, + }, + FieldNotFoundInRecord { + expected_field_name: String, + head_type: Arc, + }, + NotARecord { + head_type: Arc, + }, TooManyParametersForFunctionTerm { excess_parameters: Vec, expected_type: Arc, }, AmbiguousFunctionTerm, - NotAFunction(Arc), + NotAFunction { + head_type: Arc, + }, InvalidNumberLiteral, InvalidCharLiteral, InvalidStringLiteral, - NoLiteralConversion(Arc), + NoLiteralConversion { + expected_type: Arc, + }, AmbiguousLiteral, AmbiguousSequence, - UnexpectedSequenceLength(usize, Arc), - NoSequenceConversion(Arc), - ExpectedType(Arc), - MismatchedTypes(Arc, Arc), + MismatchedSequenceLength { + found_len: usize, + expected_len: Arc, + }, + NoSequenceConversion { + expected_type: Arc, + }, + ExpectedType { + found_type: Arc, + }, + MismatchedTypes { + found_type: Arc, + expected_type: Arc, + }, } /// Check that a term is a universe and return its level. @@ -173,7 +202,7 @@ pub fn check_type>( match r#type.as_ref() { core::Value::Universe(level) => (term, Some(*level)), _ => { - state.report(TypeError::ExpectedType(r#type)); + state.report(TypeError::ExpectedType { found_type: r#type }); (core::Term::Error, None) } } @@ -203,14 +232,18 @@ pub fn check_term>( (Literal::Char(data), "Char", []) => parse_char(state, data), (Literal::String(data), "String", []) => parse_string(state, data), (_, _, _) => { - state.report(TypeError::NoLiteralConversion(expected_type.clone())); + state.report(TypeError::NoLiteralConversion { + expected_type: expected_type.clone(), + }); core::Term::Error } } } (Term::Literal(_, _), core::Value::Error) => core::Term::Error, (Term::Literal(_, _), _) => { - state.report(TypeError::NoLiteralConversion(expected_type.clone())); + state.report(TypeError::NoLiteralConversion { + expected_type: expected_type.clone(), + }); core::Term::Error } ( @@ -230,10 +263,10 @@ pub fn check_term>( core::Term::Sequence(core_entry_terms) } _ => { - state.report(TypeError::UnexpectedSequenceLength( - entry_terms.len(), - len.clone(), - )); + state.report(TypeError::MismatchedSequenceLength { + found_len: entry_terms.len(), + expected_len: len.clone(), + }); core::Term::Error } @@ -248,13 +281,17 @@ pub fn check_term>( core::Term::Sequence(core_entry_terms) } _ => { - state.report(TypeError::NoSequenceConversion(expected_type.clone())); + state.report(TypeError::NoSequenceConversion { + expected_type: expected_type.clone(), + }); core::Term::Error } }, (Term::Sequence(_, _), core::Value::Error) => core::Term::Error, (Term::Sequence(_, _), _) => { - state.report(TypeError::NoSequenceConversion(expected_type.clone())); + state.report(TypeError::NoSequenceConversion { + expected_type: expected_type.clone(), + }); core::Term::Error } (Term::RecordTerm(_, term_entries), core::Value::RecordType(core_type_entries)) => { @@ -284,16 +321,16 @@ pub fn check_term>( } if !duplicate_names.is_empty() { - state.report(TypeError::DuplicateNamesInRecordTerm(duplicate_names)); + state.report(TypeError::DuplicateNamesInRecordTerm { duplicate_names }); } if !missing_names.is_empty() { - state.report(TypeError::MissingNamesInRecordTerm(missing_names)); + state.report(TypeError::MissingNamesInRecordTerm { missing_names }); } if !term_entries.is_empty() { let unexpected_names = (term_entries.into_iter()) .map(|(name, _)| name.to_owned()) .collect(); - state.report(TypeError::UnexpectedNamesInRecordTerm(unexpected_names)); + state.report(TypeError::UnexpectedNamesInRecordTerm { unexpected_names }); } core::Term::RecordTerm(core_term_entries) @@ -327,9 +364,12 @@ pub fn check_term>( }) } (term, _) => match synth_term(state, term) { - (term, ty) if state.is_subtype(&ty, expected_type) => term, - (_, ty) => { - state.report(TypeError::MismatchedTypes(ty, expected_type.clone())); + (term, found_type) if state.is_subtype(&found_type, expected_type) => term, + (_, found_type) => { + state.report(TypeError::MismatchedTypes { + found_type, + expected_type: expected_type.clone(), + }); core::Term::Error } }, @@ -354,7 +394,9 @@ pub fn synth_term>( return (global.lift(state.universe_offset), state.eval_term(r#type)); } - state.report(TypeError::UnboundName(name.as_ref().to_owned())); + state.report(TypeError::UnboundName { + name: name.as_ref().to_owned(), + }); (core::Term::Error, Arc::new(core::Value::Error)) } Term::Ann(term, r#type) => { @@ -404,7 +446,7 @@ pub fn synth_term>( } if !duplicate_names.is_empty() { - state.report(TypeError::DuplicateNamesInRecordTerm(duplicate_names)); + state.report(TypeError::DuplicateNamesInRecordTerm { duplicate_names }); } ( @@ -433,7 +475,7 @@ pub fn synth_term>( } if !duplicate_names.is_empty() { - state.report(TypeError::DuplicateNamesInRecordType(duplicate_names)); + state.report(TypeError::DuplicateNamesInRecordType { duplicate_names }); } ( @@ -451,14 +493,16 @@ pub fn synth_term>( r#type.clone(), ), None => { - state - .report(TypeError::FieldNotFoundInRecord(name.as_ref().to_owned())); + state.report(TypeError::FieldNotFoundInRecord { + expected_field_name: name.as_ref().to_owned(), + head_type, + }); (core::Term::Error, Arc::new(core::Value::Error)) } } } _ => { - state.report(TypeError::NotARecord(head_type)); + state.report(TypeError::NotARecord { head_type }); (core::Term::Error, Arc::new(core::Value::Error)) } } @@ -493,7 +537,7 @@ pub fn synth_term>( } core::Value::Error => return (core::Term::Error, Arc::new(core::Value::Error)), _ => { - state.report(TypeError::NotAFunction(head_type)); + state.report(TypeError::NotAFunction { head_type }); return (core::Term::Error, Arc::new(core::Value::Error)); } } From 30a685e39c40575b7a7f45a1bca2a5fade8853f1 Mon Sep 17 00:00:00 2001 From: Brendan Zabarauskas Date: Thu, 16 Jan 2020 16:00:44 +1100 Subject: [PATCH 68/88] Fix spelling --- pikelet/src/core/typing.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pikelet/src/core/typing.rs b/pikelet/src/core/typing.rs index 3982b85b8..7392034c6 100644 --- a/pikelet/src/core/typing.rs +++ b/pikelet/src/core/typing.rs @@ -3,7 +3,7 @@ //! This is a simpler implementation of type checking than the one found in //! `surface::projections::core`, //! because it only needs to check the (much simpler) core language, -//! and doesn't need to perform any additional elaboaration. +//! and doesn't need to perform any additional elaboration. //! We can use it as a way to validate that elaborated terms are well-formed. use std::sync::Arc; From c5384e1a93ba2e54590029cb8883969964036095 Mon Sep 17 00:00:00 2001 From: Brendan Zabarauskas Date: Fri, 17 Jan 2020 15:49:53 +1100 Subject: [PATCH 69/88] Doc comment improvements --- pikelet/src/core/typing.rs | 6 +++--- pikelet/src/surface/projections/core.rs | 8 ++++---- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/pikelet/src/core/typing.rs b/pikelet/src/core/typing.rs index 7392034c6..8c8075df1 100644 --- a/pikelet/src/core/typing.rs +++ b/pikelet/src/core/typing.rs @@ -15,13 +15,13 @@ use crate::core::{ /// The state of the type checker. pub struct State<'me> { - /// Global variables. + /// Global definition environment. globals: &'me Globals, /// The current universe offset. universe_offset: UniverseOffset, - /// Types of the locals currently bound. + /// Local type environment (used for getting the types of local variables). types: Locals>, - /// Values to be used during evaluation. + /// Local value environment (used for evaluation). values: Locals>, /// The errors accumulated during type checking. errors: Vec, diff --git a/pikelet/src/surface/projections/core.rs b/pikelet/src/surface/projections/core.rs index ba1577b01..725da46c6 100644 --- a/pikelet/src/surface/projections/core.rs +++ b/pikelet/src/surface/projections/core.rs @@ -8,17 +8,17 @@ use crate::surface::{Literal, Term}; /// The state of the elaborator. pub struct State<'me> { - /// Global variables. + /// Global definition environment. globals: &'me core::Globals, /// The current universe offset. universe_offset: core::UniverseOffset, /// Substitutions from the user-defined names to the level in which they were bound. names_to_levels: Vec<(String, core::LocalLevel)>, - /// Names of the entries in the context (used for pretty printing). + /// Local name environment (used for pretty printing). names: core::Locals, - /// Types of the locals currently bound. + /// Local type environment (used for getting the types of local variables). types: core::Locals>, - /// Values to be used during evaluation. + /// Local value environment (used for evaluation). values: core::Locals>, /// The errors accumulated during elaboration. errors: Vec, From 93c16d06ed0cbf90df09f9cdb863452fe2b81f4e Mon Sep 17 00:00:00 2001 From: Brendan Zabarauskas Date: Tue, 14 Jan 2020 14:48:53 +1100 Subject: [PATCH 70/88] Use docusaurus for documentation --- README.md | 94 +- docs/contributing.md | 8 - docs/guide.rs/data-structures.md | 13 - docs/guide.rs/modular-programming.md | 13 - docs/guide.rs/motivation.md | 3 - docs/reference.md | 38 - docs/reference/bibliography.md | 6 - docs/reference/comments.md | 25 - docs/reference/functions.md | 20 - docs/reference/literals.md | 63 - docs/reference/names.md | 7 - docs/reference/records.md | 15 - docs/reference/universes.md | 13 - .../core/bidirectional-typing.md | 3 - docs/specification/core/declarative-typing.md | 3 - docs/specification/surface/elaboration.md | 3 - pikelet/src/core/projections/pretty.rs | 2 +- website/.gitignore | 20 + website/README.md | 33 + website/blog/2020-01-15-hello-world.md | 21 + website/docs/contributing.md | 25 + website/docs/contributing/roadmap.md | 98 + {docs => website/docs}/guide.md | 18 +- website/docs/guide/data-structures.md | 26 + .../docs/guide}/hello-world.md | 33 +- .../docs/guide}/installation.md | 9 +- website/docs/guide/modular-programming.md | 26 + {docs => website/docs}/index.md | 6 +- website/docs/reference.md | 11 + website/docs/reference/bibliography.md | 41 + {docs => website/docs}/reference/builtins.md | 9 +- website/docs/reference/comments.md | 41 + website/docs/reference/functions.md | 53 + website/docs/reference/influences.md | 244 + website/docs/reference/literals.md | 78 + website/docs/reference/names.md | 51 + website/docs/reference/records.md | 32 + website/docs/reference/universes.md | 53 + {docs => website/docs}/specification.md | 10 +- .../core/bidirectional-typing.md | 12 + .../specification/core/declarative-typing.md | 12 + .../core/operational-semantics.md | 13 +- .../docs/specification/surface/elaboration.md | 12 + .../docs}/specification/surface/grammar.md | 9 +- .../surface/lexical-structure.md | 9 +- website/docusaurus.config.js | 127 + website/package.json | 31 + website/sidebars.js | 56 + website/src/css/custom.css | 120 + website/src/pages/index.js | 97 + website/src/pages/styles.module.css | 35 + website/src/theme/CodeBlock/index.js | 113 + website/src/theme/CodeBlock/pikelet.js | 52 + website/src/theme/CodeBlock/styles.module.css | 40 + website/static/img/favicon.ico | Bin 0 -> 766 bytes website/static/img/logo.svg | 1 + .../static/img/undraw_docusaurus_mountain.svg | 170 + .../static/img/undraw_docusaurus_react.svg | 169 + website/static/img/undraw_docusaurus_tree.svg | 1 + website/yarn.lock | 9218 +++++++++++++++++ 60 files changed, 11218 insertions(+), 346 deletions(-) delete mode 100644 docs/contributing.md delete mode 100644 docs/guide.rs/data-structures.md delete mode 100644 docs/guide.rs/modular-programming.md delete mode 100644 docs/guide.rs/motivation.md delete mode 100644 docs/reference.md delete mode 100644 docs/reference/bibliography.md delete mode 100644 docs/reference/comments.md delete mode 100644 docs/reference/functions.md delete mode 100644 docs/reference/literals.md delete mode 100644 docs/reference/names.md delete mode 100644 docs/reference/records.md delete mode 100644 docs/reference/universes.md delete mode 100644 docs/specification/core/bidirectional-typing.md delete mode 100644 docs/specification/core/declarative-typing.md delete mode 100644 docs/specification/surface/elaboration.md create mode 100755 website/.gitignore create mode 100755 website/README.md create mode 100755 website/blog/2020-01-15-hello-world.md create mode 100644 website/docs/contributing.md create mode 100644 website/docs/contributing/roadmap.md rename {docs => website/docs}/guide.md (55%) create mode 100644 website/docs/guide/data-structures.md rename {docs/guide.rs => website/docs/guide}/hello-world.md (74%) rename {docs/guide.rs => website/docs/guide}/installation.md (92%) create mode 100644 website/docs/guide/modular-programming.md rename {docs => website/docs}/index.md (85%) create mode 100644 website/docs/reference.md create mode 100644 website/docs/reference/bibliography.md rename {docs => website/docs}/reference/builtins.md (94%) create mode 100644 website/docs/reference/comments.md create mode 100644 website/docs/reference/functions.md create mode 100644 website/docs/reference/influences.md create mode 100644 website/docs/reference/literals.md create mode 100644 website/docs/reference/names.md create mode 100644 website/docs/reference/records.md create mode 100644 website/docs/reference/universes.md rename {docs => website/docs}/specification.md (91%) create mode 100644 website/docs/specification/core/bidirectional-typing.md create mode 100644 website/docs/specification/core/declarative-typing.md rename {docs => website/docs}/specification/core/operational-semantics.md (87%) create mode 100644 website/docs/specification/surface/elaboration.md rename {docs => website/docs}/specification/surface/grammar.md (96%) rename {docs => website/docs}/specification/surface/lexical-structure.md (98%) create mode 100755 website/docusaurus.config.js create mode 100755 website/package.json create mode 100755 website/sidebars.js create mode 100755 website/src/css/custom.css create mode 100755 website/src/pages/index.js create mode 100755 website/src/pages/styles.module.css create mode 100755 website/src/theme/CodeBlock/index.js create mode 100644 website/src/theme/CodeBlock/pikelet.js create mode 100755 website/src/theme/CodeBlock/styles.module.css create mode 100755 website/static/img/favicon.ico create mode 100755 website/static/img/logo.svg create mode 100755 website/static/img/undraw_docusaurus_mountain.svg create mode 100755 website/static/img/undraw_docusaurus_react.svg create mode 100755 website/static/img/undraw_docusaurus_tree.svg create mode 100644 website/yarn.lock diff --git a/README.md b/README.md index 4d5c09441..90a0ccb83 100644 --- a/README.md +++ b/README.md @@ -27,96 +27,4 @@ whole lot to do before it is even remotely useful to anyone! 😅 ## Roadmap -Our main aim is to start off with a simple configuration language, like -[Dhall][dhall]. From there we will progressively add features to gain more -flexibility. We want to provide a textual syntax up-front, but we should aim to -keep the core language reasonably decoupled from this, allowing us to provide -support for [projectional editing][structure-editor-wikipedia] in the future. - -[dhall]: https://dhall-lang.org/ -[structure-editor-wikipedia]: https://en.wikipedia.org/wiki/Structure_editor - -You can read more about what we hope to achieve in [_Pondering the next version of Pikelet_][next-pikelet]. - -[next-pikelet]: https://gist.github.com/brendanzab/eba7015e6345abe79a57a704091820bb/. - -
- Full Roadmap - -### Language - -- Basic config language - - [ ] Comments - - [x] Boolean literals/constants - - [x] Integer literals/constants - - [x] Float literals/constants - - [x] Character literals/constants - - [x] String literals/constants - - [x] Record terms - - [x] Non-dependent record types - - [x] Dynamically sized arrays - - [x] Fixed sized arrays -- Basic programming language - - [ ] Improved literal parsing - - [x] Annotated terms - - [ ] Let expressions - - [x] Record field lookups - - [ ] Import expressions - - [x] Function terms - - [x] Non-dependent function types - - [ ] Pattern matching - - [ ] Recursive terms - - [ ] Opaque (abstract) terms - - [ ] Builtin terms -- Dependently typed language - - [ ] Dependent record types - - [ ] Dependent function types - - [ ] Equality types - - [x] Universe levels - - [x] Stratified - - [x] Cumulative - - [x] Lifting operator - - [ ] Large types (Typeω) - - [ ] Multi-stage programming - - [ ] Quantitative type theory - -### Projections - -- [x] Surface -> Pretty -- [x] Surface -> Core -- [x] Core -> Pretty -- [x] Core -> Value -- [ ] Core -> Binary -- [ ] Core -> Documentation -- [ ] Core -> Cranelift -- [ ] Core -> LLVM -- [ ] Value -> JSON/YAML/TOML - -### Tooling - -- [x] REPL -- [ ] Package manager -- [ ] Auto-formatter for surface language -- [ ] Structured editor - -### Testing - -- [x] Language samples -- [ ] Feature tests -- [ ] Property based tests - -### Diagnostics - -- [x] Basic error enum -- [x] Error recovery -- [ ] Pretty diagnostic reporting - -### Rust marshalling - -- [x] Mashalling traits -- [ ] Improved error messages -- [ ] Nicer marshalling API -- [ ] Derive macro for generating marshalling trait implementations -- [ ] More efficient, visitor based marshalling - -
+Check out our plans in [the roadmap](./website/docs/contributing/roadmap). diff --git a/docs/contributing.md b/docs/contributing.md deleted file mode 100644 index 701460d7f..000000000 --- a/docs/contributing.md +++ /dev/null @@ -1,8 +0,0 @@ -# Pikelet Contributing Guide - -Topics might include: - -- How to set up the development environment -- Code of conduct -- How to contribute to the language -- A reading list for those wanting to learn about the theory diff --git a/docs/guide.rs/data-structures.md b/docs/guide.rs/data-structures.md deleted file mode 100644 index 9dd529274..000000000 --- a/docs/guide.rs/data-structures.md +++ /dev/null @@ -1,13 +0,0 @@ -# Data structures - -## Lists - -TODO - -## Arrays - -TODO - -## Records - -TODO diff --git a/docs/guide.rs/modular-programming.md b/docs/guide.rs/modular-programming.md deleted file mode 100644 index 5aa98350f..000000000 --- a/docs/guide.rs/modular-programming.md +++ /dev/null @@ -1,13 +0,0 @@ -# Modular Programming - -## The need for modularity - -TODO - -## Describing interfaces using record types - -TODO - -## Parameterised modules using functions - -TODO diff --git a/docs/guide.rs/motivation.md b/docs/guide.rs/motivation.md deleted file mode 100644 index 0d0f45759..000000000 --- a/docs/guide.rs/motivation.md +++ /dev/null @@ -1,3 +0,0 @@ -# Motivation - -TODO diff --git a/docs/reference.md b/docs/reference.md deleted file mode 100644 index 5b1552eb3..000000000 --- a/docs/reference.md +++ /dev/null @@ -1,38 +0,0 @@ -# Pikelet Language Reference - -Reference-level documentation for the Pikelet programming language. -This will cover all language features, but not necessarily describe how they fit together. - -Topics might include: - -- comments -- names -- records - - formation - - introduction - - elimination -- functions - - formation - - introduction - - elimination -- sequences -- literals - - numbers - - strings - - characters -- builtin types - - floating point - - signed/unsigned integers - - strings - - characters - - lists - - arrays -- universes - - cumulativity - - lifting operator -- references -- inspiration - -We should link each topic to the relevant places in the [specification][specification]. - -[specification]: ./specification diff --git a/docs/reference/bibliography.md b/docs/reference/bibliography.md deleted file mode 100644 index 1c87aeb3e..000000000 --- a/docs/reference/bibliography.md +++ /dev/null @@ -1,6 +0,0 @@ -# Bibliography - -- Conor McBride, [Crude but Effective Stratification](https://mazzo.li/epilogue/index.html%3Fp=857&cpage=1.html), 2011. -- Conor McBride, [Universe Hierarchies](https://pigworker.wordpress.com/2015/01/09/universe-hierarchies/), 2015. -- Damien Rouhling, [Dependently typed lambda calculus with a lifting operator](http://www-sop.inria.fr/members/Damien.Rouhling/data/internships/M1Report.pdf), 2014. -- Thierry Coquand, Yoshiki Kinoshita, Bengt Nordström, Makoto Takeyama, [A simple type-theoretic language: Mini-TT](http://www.cse.chalmers.se/~bengt/papers/GKminiTT.pdf), 2009. diff --git a/docs/reference/comments.md b/docs/reference/comments.md deleted file mode 100644 index 745ada05f..000000000 --- a/docs/reference/comments.md +++ /dev/null @@ -1,25 +0,0 @@ -# Comments - -## Line comments - -Line comments are preceded by a double dash (`--`): - -```pikelet --- This is a comment! -``` - -> **Specification**: -> -> - [Surface language - Lexical syntax - Whitespace and comments](../specification/surface/lexical-structure):
comment - -## Doc comments - -Documentation comments are preceded by three pipes (`|||`): - -```pikelet -||| A doc comment! -``` - -> **Specification**: -> -> - [Surface language - Lexical syntax - Whitespace and comments](../specification/surface/lexical-structure): doc-comment diff --git a/docs/reference/functions.md b/docs/reference/functions.md deleted file mode 100644 index 1e1dd98c0..000000000 --- a/docs/reference/functions.md +++ /dev/null @@ -1,20 +0,0 @@ -# Functions - -A function is a way of relating an input to an output. - -## Formation - -Function types are written as `A -> B`. -For example, the function type for adding two 32-bit signed integers together is: - -```pikelet -S32 -> S32 -> S32 -``` - -## Introduction - -TODO - -## Elimination - -TODO diff --git a/docs/reference/literals.md b/docs/reference/literals.md deleted file mode 100644 index 18e53846e..000000000 --- a/docs/reference/literals.md +++ /dev/null @@ -1,63 +0,0 @@ -# Literals - -## Numbers - -```pikelet -0.0 -+1 --25 -0xAB342 -1_000_000 -``` - -> **Specification**: -> -> - [Surface language - Lexical syntax - Numeric literals](../specification/surface/lexical-structure#Numeric-literals): number-literal - -### Supported types - -- Unsigned integers: `U8`, `U16`, `U32`, `U64` -- Signed integers: `S8`, `S16`, `S32`, `S64` -- Floating point numbers: `F32`, `F64` - -### Overloading - -Overloaded number literals are not yet supported, but _are_ planned. - -## Characters - -```pikelet -'A' -'가' -'🥞' -``` - -### Supported types - -- `Char` - -### Overloading - -Overloaded character literals are not yet supported, but _are_ planned. - -> **Specification**: -> -> - [Surface language - Lexical syntax - Character and string literals](../specification/surface/lexical-structure#Character-and-string-literals): character-literal - -## Strings - -```pikelet -"hello" -``` - -### Supported types - -- `String` - -### Overloading - -Overloaded string literals are not yet supported, but _are_ planned. - -> **Specification**: -> -> - [Surface language - Lexical syntax - Character and string literals](../specification/surface/lexical-structure#Character-and-string-literals): string-literal diff --git a/docs/reference/names.md b/docs/reference/names.md deleted file mode 100644 index 953e10ef5..000000000 --- a/docs/reference/names.md +++ /dev/null @@ -1,7 +0,0 @@ -# Names - -Names refer to declarations that are currently in scope. - -> **Specification**: -> -> - [Surface language - Lexical syntax - Keywords and identifiers](../specification/surface/lexical-structure#Keywords-and-identifiers): ident diff --git a/docs/reference/records.md b/docs/reference/records.md deleted file mode 100644 index 11c8e44a1..000000000 --- a/docs/reference/records.md +++ /dev/null @@ -1,15 +0,0 @@ -# Records - -Records provide a way of grouping together data. - -## Formation - -TODO - -## Introduction - -TODO - -## Elimination - -TODO diff --git a/docs/reference/universes.md b/docs/reference/universes.md deleted file mode 100644 index f8759cb59..000000000 --- a/docs/reference/universes.md +++ /dev/null @@ -1,13 +0,0 @@ -# Universes - -## Universe levels - -TODO - -## Cumulativity - -TODO - -## Lifting terms - -TODO diff --git a/docs/specification/core/bidirectional-typing.md b/docs/specification/core/bidirectional-typing.md deleted file mode 100644 index 492b032b5..000000000 --- a/docs/specification/core/bidirectional-typing.md +++ /dev/null @@ -1,3 +0,0 @@ -# Bidirectional typing - -TODO diff --git a/docs/specification/core/declarative-typing.md b/docs/specification/core/declarative-typing.md deleted file mode 100644 index 7c84194c8..000000000 --- a/docs/specification/core/declarative-typing.md +++ /dev/null @@ -1,3 +0,0 @@ -# Declarative typing - -TODO diff --git a/docs/specification/surface/elaboration.md b/docs/specification/surface/elaboration.md deleted file mode 100644 index 848c510cf..000000000 --- a/docs/specification/surface/elaboration.md +++ /dev/null @@ -1,3 +0,0 @@ -# Elaboration - -TODO diff --git a/pikelet/src/core/projections/pretty.rs b/pikelet/src/core/projections/pretty.rs index dc60c6b35..cf5431142 100644 --- a/pikelet/src/core/projections/pretty.rs +++ b/pikelet/src/core/projections/pretty.rs @@ -108,7 +108,7 @@ where .append(alloc.space()) .append(pretty_term(alloc, body).nest(4)), Term::FunctionElim(head, argument) => pretty_term(alloc, head).append( - (alloc.nil()) + (alloc.space()) .append(pretty_term(alloc, argument)) .group() .nest(4), diff --git a/website/.gitignore b/website/.gitignore new file mode 100755 index 000000000..b2d6de306 --- /dev/null +++ b/website/.gitignore @@ -0,0 +1,20 @@ +# Dependencies +/node_modules + +# Production +/build + +# Generated files +.docusaurus +.cache-loader + +# Misc +.DS_Store +.env.local +.env.development.local +.env.test.local +.env.production.local + +npm-debug.log* +yarn-debug.log* +yarn-error.log* diff --git a/website/README.md b/website/README.md new file mode 100755 index 000000000..ee0ccc9d1 --- /dev/null +++ b/website/README.md @@ -0,0 +1,33 @@ +# Website + +This website is built using [Docusaurus 2](https://v2.docusaurus.io/), a modern static website generator. + +### Installation + +``` +$ yarn +``` + +### Local Development + +``` +$ yarn start +``` + +This command starts a local development server and open up a browser window. Most changes are reflected live without having to restart the server. + +### Build + +``` +$ yarn build +``` + +This command generates static content into the `build` directory and can be served using any static contents hosting service. + +### Deployment + +``` +$ GIT_USER= USE_SSH=true yarn deploy +``` + +If you are using GitHub pages for hosting, this command is a convenient way to build the website and push to the `gh-pages` branch. diff --git a/website/blog/2020-01-15-hello-world.md b/website/blog/2020-01-15-hello-world.md new file mode 100755 index 000000000..aea4f65b0 --- /dev/null +++ b/website/blog/2020-01-15-hello-world.md @@ -0,0 +1,21 @@ +--- +id: hello-world +title: Hello +author: Brendan Zabarauskas +author_title: Contributor +author_url: https://github.com/brendanzab +author_image_url: https://avatars0.githubusercontent.com/u/695077?s=400&v=4 +tags: [pikelet] +--- + +Hello everyone, and welcome to the new Pikelet website! + +I've been toying around with An implementation of Pikelet for some time now. +Since I started on this journey, I've learned a great deal! + +I have rebuilt the Pikelet type checker from the ground up to use [_normalization by evaluation_](https://en.wikipedia.org/wiki/Normalisation_by_evaluation). +This is much easier to understand than our previous implementation. + +I also posted a gist regarding the future of Pikelet: [Pondering the next version of Pikelet](https://gist.github.com/brendanzab/eba7015e6345abe79a57a704091820bb/). + + diff --git a/website/docs/contributing.md b/website/docs/contributing.md new file mode 100644 index 000000000..9e9d3c0fc --- /dev/null +++ b/website/docs/contributing.md @@ -0,0 +1,25 @@ +--- +id: contributing +title: Contributing to Pikelet +sidebar_label: Introduction +keywords: + - docs + - contributing + - pikelet +--- + +We really want to encourage new contributors to help out! Please come chat with +us [on our Gitter channel][gitter-lobby] - if you have any questions about the +project, or just want to say hi! We sometimes get side-tracked on technical +discussions, but we're always more than happy to spend time explaining things. + +[gitter-lobby]: https://gitter.im/pikelet-lang/Lobby + +:::note +Topics might include: + +- How to set up the development environment +- Code of conduct +- How to contribute to the language +- A reading list for those wanting to learn about the theory +::: diff --git a/website/docs/contributing/roadmap.md b/website/docs/contributing/roadmap.md new file mode 100644 index 000000000..e5332826b --- /dev/null +++ b/website/docs/contributing/roadmap.md @@ -0,0 +1,98 @@ +--- +id: roadmap +title: Roadmap +sidebar_label: Roadmap +keywords: + - docs + - roadmap + - pikelet +--- + +Our main aim is to start off with a simple configuration language, like +[Dhall][dhall]. From there we will progressively add features to gain more +flexibility. We want to provide a textual syntax up-front, but we should aim to +keep the core language reasonably decoupled from this, allowing us to provide +support for [projectional editing][structure-editor-wikipedia] in the future. + +[dhall]: https://dhall-lang.org/ +[structure-editor-wikipedia]: https://en.wikipedia.org/wiki/Structure_editor + +You can read more about what we hope to achieve in [_Pondering the next version of Pikelet_][next-pikelet]. + +[next-pikelet]: https://gist.github.com/brendanzab/eba7015e6345abe79a57a704091820bb/. + +### Language + +- Basic config language + - [ ] Comments + - [x] Boolean literals/constants + - [x] Integer literals/constants + - [x] Float literals/constants + - [x] Character literals/constants + - [x] String literals/constants + - [x] Record terms + - [x] Non-dependent record types + - [x] Dynamically sized arrays + - [x] Fixed sized arrays +- Basic programming language + - [ ] Improved literal parsing + - [x] Annotated terms + - [ ] Let expressions + - [x] Record field lookups + - [ ] Import expressions + - [x] Function terms + - [x] Non-dependent function types + - [ ] Pattern matching + - [ ] Recursive terms + - [ ] Opaque (abstract) terms + - [ ] Builtin terms +- Dependently typed language + - [ ] Dependent record types + - [ ] Dependent function types + - [ ] Equality types + - [x] Universe levels + - [x] Stratified + - [x] Cumulative + - [x] Lifting operator + - [ ] Large types (`Typeω`) + - [ ] Multi-stage programming + - [ ] Quantitative type theory + +### Projections + +- [x] Surface → Pretty +- [x] Surface → Core +- [x] Core → Pretty +- [x] Core → Value +- [ ] Core → Binary +- [ ] Core → Documentation +- [ ] Core → Cranelift +- [ ] Core → LLVM +- [ ] Value → JSON/YAML/TOML + +### Tooling + +- [x] REPL +- [ ] Package manager +- [ ] Auto-formatter for surface language +- [ ] Structured editor + +### Testing + +- [x] Language samples +- [ ] Feature tests +- [ ] Property based tests + +### Diagnostics + +- [x] Basic error enum +- [x] Error recovery +- [ ] Pretty diagnostic reporting + +### Rust marshalling + +- [x] Mashalling traits +- [ ] Improved error messages +- [ ] Nicer marshalling API +- [ ] Derive macro for generating marshalling trait implementations +- [ ] More efficient, visitor based marshalling diff --git a/docs/guide.md b/website/docs/guide.md similarity index 55% rename from docs/guide.md rename to website/docs/guide.md index aff6f4ab6..a39685dfb 100644 --- a/docs/guide.md +++ b/website/docs/guide.md @@ -1,4 +1,18 @@ -# Pikelet Language Guide +--- +id: guide +title: The Pikelet Language Guide +sidebar_label: Introduction +keywords: + - docs + - guide + - pikelet +--- + +:::warning +Pikelet is still a work in progress! Many features are not implemented yet! + +If you'd like to see what we hope to tackle next, have a look at [our roadmap](./contributing/roadmap). +::: A guide for learning Pikelet. @@ -16,4 +30,4 @@ Topics that this guide might cover are: We should provide links to the corresponding [reference][reference] material where appropriate. -[reference]: ./reference +[reference]: ../reference/introduction diff --git a/website/docs/guide/data-structures.md b/website/docs/guide/data-structures.md new file mode 100644 index 000000000..849d78a71 --- /dev/null +++ b/website/docs/guide/data-structures.md @@ -0,0 +1,26 @@ +--- +id: data-structures +title: Data Structures (WIP) +keywords: + - docs + - guide + - pikelet +--- + +## Lists + +:::warning +This section is a work in progress. +::: + +## Arrays + +:::warning +This section is a work in progress. +::: + +## Records + +:::warning +This section is a work in progress. +::: diff --git a/docs/guide.rs/hello-world.md b/website/docs/guide/hello-world.md similarity index 74% rename from docs/guide.rs/hello-world.md rename to website/docs/guide/hello-world.md index 27fc75d74..70bade927 100644 --- a/docs/guide.rs/hello-world.md +++ b/website/docs/guide/hello-world.md @@ -1,4 +1,11 @@ -# Hello world! +--- +id: hello-world +title: Hello world! +keywords: + - docs + - guide + - pikelet +--- ## Using the REPL @@ -25,31 +32,43 @@ The REPL should appear in the terminal like so: "REPL" stands for "Read-eval-print-loop" and is a nice way to experiment with Pikelet in an interactive way. You can enter Pikelet terms into the REPL after the `>`. For example: -``` +```pikelet > "Hello world!" ``` By pressing Enter, you can 'normalize' the term, and see its type: -``` +```pikelet > "Hello world!" "Hello world!" : String ``` ## Effects -TODO: This is not yet implemented! +:::warning +This section is a work in progress. +::: -``` +:::warning +This feature is not yet implemented! +::: + +```pikelet > print-line "Hello world!" print-line "Hello world!" : Unit <{Std-Out}> ``` -``` +```pikelet > :exec print-line "Hello world!" Hello world! ``` ## Compiling a standalone executable -TODO: This is not yet implemented! +:::warning +This section is a work in progress. +::: + +:::warning +This feature is not yet implemented! +::: diff --git a/docs/guide.rs/installation.md b/website/docs/guide/installation.md similarity index 92% rename from docs/guide.rs/installation.md rename to website/docs/guide/installation.md index 6834bfb22..24ccf6b18 100644 --- a/docs/guide.rs/installation.md +++ b/website/docs/guide/installation.md @@ -1,4 +1,11 @@ -# Installation +--- +id: installation +title: Installation +keywords: + - docs + - guide + - pikelet +--- Pikelet is written in [Rust][rust-site] and therefore needs to be compiled with Cargo, because we don't yet offer prebuilt binaries. If you haven't already diff --git a/website/docs/guide/modular-programming.md b/website/docs/guide/modular-programming.md new file mode 100644 index 000000000..f7d4c5528 --- /dev/null +++ b/website/docs/guide/modular-programming.md @@ -0,0 +1,26 @@ +--- +id: modular-programming +title: Modular Programming (WIP) +keywords: + - docs + - guide + - pikelet +--- + +## The need for modularity + +:::warning +This section is a work in progress. +::: + +## Describing interfaces + +:::warning +This section is a work in progress. +::: + +## Parameterised modules + +:::warning +This section is a work in progress. +::: diff --git a/docs/index.md b/website/docs/index.md similarity index 85% rename from docs/index.md rename to website/docs/index.md index 93f007405..8a638aadd 100644 --- a/docs/index.md +++ b/website/docs/index.md @@ -1,8 +1,8 @@ # Pikelet Documentation -> **Note**: -> -> The documentation is still very much a work in progress, so there is not actually much here yet! +:::warning +This section is a work in progress. +::: This is where we will document the Pikelet programming language! We'll aim to provide multiple levels of documentation for different purposes: diff --git a/website/docs/reference.md b/website/docs/reference.md new file mode 100644 index 000000000..462a3271f --- /dev/null +++ b/website/docs/reference.md @@ -0,0 +1,11 @@ +--- +id: reference +title: The Pikelet Language Reference +sidebar_label: Introduction +keywords: + - docs + - reference + - pikelet +--- + +Reference-level documentation for the Pikelet programming language. diff --git a/website/docs/reference/bibliography.md b/website/docs/reference/bibliography.md new file mode 100644 index 000000000..123048ce1 --- /dev/null +++ b/website/docs/reference/bibliography.md @@ -0,0 +1,41 @@ +--- +id: bibliography +title: Bibliography +keywords: + - docs + - reference + - pikelet +--- + +The following resources where helpful when designing and building Pikelet. + +### A simple type-theoretic language: Mini-TT + +Thierry Coquand, Yoshiki Kinoshita, Bengt Nordström, and Makoto Takeyama
+Essays in Honour of Gilles Kahn, 2009.
+[paper](http://www.cse.chalmers.se/~bengt/papers/GKminiTT.pdf) + +### Crude but Effective Stratification + +Conor McBride
+Blog Post, 2011.
+[blog](https://mazzo.li/epilogue/index.html%3Fp=857&cpage=1.html) + +### Universe Hierarchies + +Conor McBride
+Blog Post, 2015.
+[blog](https://pigworker.wordpress.com/2015/01/09/universe-hierarchies/) + +### Dependently typed lambda calculus with a lifting operator + +Damien Rouhling
+Internship Report, 2014.
+[paper](http://www-sop.inria.fr/members/Damien.Rouhling/data/internships/M1Report.pdf) + +### A tutorial implementation of a dependently typed lambda calculus + +Andres Löh, Conor McBride, and Wouter Swierstra
+Fundamenta Informaticae XXI, 2001 (Revised 2009).
+[paper](https://www.andres-loeh.de/LambdaPi/LambdaPi.pdf) - +[abstract](https://www.andres-loeh.de/LambdaPi/) diff --git a/docs/reference/builtins.md b/website/docs/reference/builtins.md similarity index 94% rename from docs/reference/builtins.md rename to website/docs/reference/builtins.md index 075244e3a..53270dbdc 100644 --- a/docs/reference/builtins.md +++ b/website/docs/reference/builtins.md @@ -1,4 +1,11 @@ -# Builtin types +--- +id: builtins +title: Builtin Types +keywords: + - docs + - reference + - pikelet +--- Pikelet has a number of builtin types, which we now describe here: diff --git a/website/docs/reference/comments.md b/website/docs/reference/comments.md new file mode 100644 index 000000000..01322c8ff --- /dev/null +++ b/website/docs/reference/comments.md @@ -0,0 +1,41 @@ +--- +id: comments +title: Comments +keywords: + - docs + - reference + - pikelet +--- + +## Line comments + +Line comments are preceded by a double dash (`--`): + +```pikelet +-- This is a comment! +``` + +:::note +See [Surface language - Lexical syntax - Whitespace and comments](../specification/surface/lexical-structure#whitespace-and-comments) +::: + +## Doc comments + +Documentation comments are preceded by three pipes (`|||`): + +```pikelet +||| A doc comment! +``` + +Multi-line doc comments can be created by 'stacking'. For example: + +```pikelet +||| The unit type +||| +||| This is a synonym for the empty record, +||| and can be constructed using the `unit` function. +``` + +:::note +See [Surface language - Lexical syntax - Whitespace and comments](../specification/surface/lexical-structure#whitespace-and-comments) +::: diff --git a/website/docs/reference/functions.md b/website/docs/reference/functions.md new file mode 100644 index 000000000..98595e7d7 --- /dev/null +++ b/website/docs/reference/functions.md @@ -0,0 +1,53 @@ +--- +id: functions +title: Functions (WIP) +keywords: + - docs + - reference + - pikelet +--- + +A function is a way of relating an input to an output. + +## Formation + +Function types are written as `A -> B`. +Functions are [_curried_][currying-wikipedia], meaning that they take a single input, and return a single output. +Multi-argument functions can be created by creating functions that output other functions. + +For example, the function type for adding two 32-bit signed integers together is: + +```pikelet +S32 -> S32 -> S32 +``` + +## Introduction + +:::warning +This section is a work in progress. +::: + +:::warning +This feature is not yet implemented! +::: + +## Elimination + +:::warning +This section is a work in progress. +::: + +Functions are applied to arguments via [_juxtaposition_][juxtaposition-wikipedia]. + +For example, this is how the identity function might be applied: + +```pikelet +id String "hello!" +``` + +```pikelet +Array 3 String +``` + +[currying-wikipedia]: https://en.wikipedia.org/wiki/Currying +[juxtaposition-wikipedia]: https://en.wikipedia.org/wiki/Juxtaposition#Mathematics diff --git a/website/docs/reference/influences.md b/website/docs/reference/influences.md new file mode 100644 index 000000000..b8d0bddb1 --- /dev/null +++ b/website/docs/reference/influences.md @@ -0,0 +1,244 @@ +--- +id: influences +title: Influences +keywords: + - docs + - reference + - pikelet +--- + +Some languages have been inspiring when building Pikelet. +We list some of them here, and the contributions they have made in our thinking. +These ideas may or may not be included in the final Pikelet language, but they are worth mentioning! + +## 1ML + +Links: + +- [Website](https://people.mpi-sws.org/~rossberg/1ml/) + +Things we love: + +- focus on simplicity +- combines module language of ML with dependent records +- formalized foundation + +## Agda + +Links: + +- [Wiki](http://wiki.portal.chalmers.se/agda/pmwiki.php) + +Things we love: + +- interactive editing +- dependent types +- dependent records +- implicit arguments +- instance arguments for emulating type classes +- codata for unbounded data +- totality checking +- inductive data types + +## ATS + +Links: + +- [Website](http://www.ats-lang.org/) + +Things we love: + +- dependent types +- proofs can be generated by SMT solvers +- high level of performance, low level interoperability +- unboxed data types + +## D + +Links: + +- [Website](http://dlang.org) + +Things we love: + +- strong support for static metaprogramming +- [design by introspection](https://dconf.org/2017/talks/alexandrescu.pdf) + (ie. breaking parametricity for performance optimization and metaprogramming purposes) +- low-level control and high-level abstraction +- fast compiler, short iteration times + +## Dhall + +Links: + +- [Website](https://github.com/dhall-lang/) + +Things we love: + +- simple core language +- dependent types +- total language +- structural records + +## Discus (formerly DDC) + +Links: + +- [Website](http://www.discus-lang.org/) + +## Elm + +Links: + +- [Website](http://elm-lang.org/) + +Things we love: + +- focus on usability, and adoption +- friendly marketing +- welcoming community +- best-in-class error messages +- row polymorphism + +## F* + +Links: + +- [Website](https://www.fstar-lang.org/) + +Things we love: + +- combining SMT solvers with explicit proofs +- combining effects with dependent types + +## Gluon + +Links: + +- [Repository](https://github.com/gluon-lang/gluon) + +Things we love: + +- strict evaluation +- focus on simplicity +- embeddable in Rust programs +- using records as a basis for the module system + +## Granule + +Links: + +- [Repository](https://github.com/dorchard/granule/) + +Things we love: + +- combining coeffects with effects in one language + +## Idris + +Links: + +- [Website](https://www.idris-lang.org/) +- [Documentation](http://docs.idris-lang.org) + +Things we love: + +- focus on making dependently typed programming practical +- interactive editing +- simple core type theory +- opt-out totality checking +- nice, accessible documentation, focused on real-world examples +- universe checking +- aggressive erasure +- linear types +- compilation to native code +- elaborator reflection +- ad-hoc interfaces desugar into records +- effects system as a library +- state machine library + +## Ivory + +Links: + +- [Website](https://ivorylang.org/ivory-introduction.html) + +## Koka + +Links: + +- [Website](https://www.microsoft.com/en-us/research/project/koka/) + +Things we love: + +- algebraic effects and handlers +- nice library documentation, with clickable links, etc. + +## Lean + +Links: + +- [Website](http://leanprover.github.io) + +Things we love: + +- focus on responsive interactive development +- metaprogramming support using Lean +- simple kernel language + +## OCaml + +Links: + +- [Website](https://ocaml.org/) +- [Repository (Multicore)](https://github.com/ocamllabs/ocaml-multicore) +- [Repository (Modular implicits)](https://github.com/ocamllabs/ocaml-modular-implicits) + +Things we love: + +- module system +- algebraic effects +- modular implicits +- row polymorphism +- structural records +- efficient (and _fast_) code generation + +## Rust + +Links: + +- [Website](http://rust-lang.org/) + +Things we love: + +- friendly community +- non-uniform, unboxed data layout +- predictable optimizations +- focus on systems programming +- having safety and low level code under one roof +- infectious 'unsafe' keyword +- strict evaluation +- opt-in garbage collection +- minimal runtime +- bootstrapped itself off a foundation of C libraries + +## Sixten + +Links: + +- [Repository](https://github.com/ollef/sixten) + +Things we love: + +- non-uniform, unboxed data layout +- dependent types + +## Ur + +Links: + +- [Website](http://www.impredicative.com/ur/) + +Things we love: + +- Statically typed metaprogramming with type-level records diff --git a/website/docs/reference/literals.md b/website/docs/reference/literals.md new file mode 100644 index 000000000..89ccfb877 --- /dev/null +++ b/website/docs/reference/literals.md @@ -0,0 +1,78 @@ +--- +id: literals +title: Literals +keywords: + - docs + - reference + - pikelet +--- + +## Numbers + +```pikelet +0.0 ++1 +-25 +0xAB342 +1_000_000 +``` + +:::note +See [Surface language - Lexical syntax - Numeric literals](../specification/surface/lexical-structure#numeric-literals) +::: + +### Supported types + +- Unsigned integers: [`U8`][unsigned-integers], [`U16`][unsigned-integers], [`U32`][unsigned-integers], [`U64`][unsigned-integers] +- Signed integers: [`S8`][signed-integers], [`S16`][signed-integers], [`S32`][signed-integers], [`S64`][signed-integers] +- Floating point numbers: [`F32`][floating-point-numbers], [`F64`][floating-point-numbers] + +### Overloading + +Overloaded number literals are not yet supported, but _are_ planned. + +## Characters + +```pikelet +'A' +'가' +'🥞' +``` + +### Supported types + +- [`Char`][characters] + +### Overloading + +Overloaded character literals are not yet supported, but _are_ planned. + +:::note +See [Surface language - Lexical syntax - Character and string literals](../specification/surface/lexical-structure#character-and-string-literals) +::: + +## Strings + +```pikelet +"hello" +``` + +### Supported types + +- [`String`][strings] + +### Overloading + +Overloaded string literals are not yet supported, but _are_ planned. + +:::note +See [Surface language - Lexical syntax - Character and string literals](../specification/surface/lexical-structure#character-and-string-literals) +::: + + +[booleans]: ./builtins#booleans +[unsigned-integers]: ./builtins#unsigned-integers +[signed-integers]: ./builtins#signed-integers +[floating-point-numbers]: ./builtins#floating-point-numbers +[strings]: ./builtins#strings +[characters]: ./builtins#characters diff --git a/website/docs/reference/names.md b/website/docs/reference/names.md new file mode 100644 index 000000000..84443e056 --- /dev/null +++ b/website/docs/reference/names.md @@ -0,0 +1,51 @@ +--- +id: names +title: Names (WIP) +keywords: + - docs + - reference + - pikelet +--- + +### Keywords + +The following keywords are reserved by Pikelet: + +- `Record` +- `record` + +:::note +See [Surface language - Lexical syntax - Keywords and identifiers](../specification/surface/lexical-structure#keywords-and-identifiers): keyword +::: + +### Identifiers + +Names refer to declarations that are currently in scope. + +```pikelet +make-string +Foo-23 +Unicode-String +``` + +:::note +See [Surface language - Lexical syntax - Keywords and identifiers](../specification/surface/lexical-structure#keywords-and-identifiers): ident +::: + +### Conventions + +#### Term names + +Term names are in `lower-kebab-case`, for example: + +```pikelet +binary-data +``` + +#### Type Names + +Type names are in `Title-Kebab-Case`, for example: + +```pikelet +Unicode-String +``` diff --git a/website/docs/reference/records.md b/website/docs/reference/records.md new file mode 100644 index 000000000..2473c0bc5 --- /dev/null +++ b/website/docs/reference/records.md @@ -0,0 +1,32 @@ +--- +id: records +title: Records (WIP) +keywords: + - docs + - reference + - pikelet +--- + +Records provide a way of grouping together data. + +## Formation + +:::warning +This section is a work in progress. +::: + +## Introduction + +:::warning +This section is a work in progress. +::: + +## Elimination + +:::warning +This section is a work in progress. +::: + +:::warning +This feature is not yet implemented! +::: diff --git a/website/docs/reference/universes.md b/website/docs/reference/universes.md new file mode 100644 index 000000000..0b9597aa9 --- /dev/null +++ b/website/docs/reference/universes.md @@ -0,0 +1,53 @@ +--- +id: universes +title: Universes (WIP) +keywords: + - docs + - reference + - pikelet +--- + +## Universe levels + +:::warning +This section is a work in progress. +::: + +``` +╭─ Type^2 ───────────────────────────────────────────────────────────────────────╮ +│ Array n Type^1 │ +│ │ +│ ╭─ Type^1 ─────────────────────────────────────────────────────────────────╮ │ +│ │ │ │ +│ │ ╭─ Type ───────────────────────────────╮ │ │ +│ │ │ Array n String │ │ │ +│ │ │ │ │ │ +│ │ │ Record { x : F32 } │ Array n Type │ │ +│ │ │ │ │ │ +│ │ │ ╭─ S32 ──────────────╮ │ │ │ +│ │ │ │ ..., -1, 0, 1, ... │ │ Nat -> Type -> Type │ │ +│ │ │ ╰────────────────────╯ │ │ │ +│ │ │ │ │ │ +│ │ │ ╭─ Record {} ─╮ ╭─ Bool ───────╮ │ │ │ +│ │ │ │ record {} │ │ true, false │ │ Type -> Type │ │ +│ │ │ ╰────────────-╯ ╰──────────────╯ │ │ │ +│ │ │ │ │ │ +│ │ │ ╭─ String ──────────────────────╮ │ ╭─ Record { t : Type } ────╮ │ │ +│ │ │ │ "hello", "byee!", "hoho", ... │ │ │ record { t = String }, │ │ │ +│ │ │ ╰──────────────────────────────-╯ │ │ record { t = U32 }, ... │ │ │ +│ │ ╰──────────────────────────────────────╯ ╰──────────────────────────╯ │ │ +│ ╰──────────────────────────────────────────────────────────────────────────╯ │ +╰────────────────────────────────────────────────────────────────────────────────╯ +``` + +## Cumulativity + +:::warning +This section is a work in progress. +::: + +## Lifting terms + +:::warning +This section is a work in progress. +::: diff --git a/docs/specification.md b/website/docs/specification.md similarity index 91% rename from docs/specification.md rename to website/docs/specification.md index 142a406d5..cac65da1a 100644 --- a/docs/specification.md +++ b/website/docs/specification.md @@ -1,4 +1,12 @@ -# Pikelet Language Specification +--- +id: specification +title: The Pikelet Language Specification +sidebar_label: Introduction +keywords: + - docs + - specification + - pikelet +--- This will be where we give a comprehensive, formally described specification of the Pikelet programming language, including: diff --git a/website/docs/specification/core/bidirectional-typing.md b/website/docs/specification/core/bidirectional-typing.md new file mode 100644 index 000000000..dedbc129d --- /dev/null +++ b/website/docs/specification/core/bidirectional-typing.md @@ -0,0 +1,12 @@ +--- +id: bidirectional-typing +title: Bidirectional Typing (WIP) +keywords: + - docs + - specification + - pikelet +--- + +:::warning +This section is a work in progress. +::: diff --git a/website/docs/specification/core/declarative-typing.md b/website/docs/specification/core/declarative-typing.md new file mode 100644 index 000000000..2855150de --- /dev/null +++ b/website/docs/specification/core/declarative-typing.md @@ -0,0 +1,12 @@ +--- +id: declarative-typing +title: Declarative Typing (WIP) +keywords: + - docs + - specification + - pikelet +--- + +:::warning +This section is a work in progress. +::: diff --git a/docs/specification/core/operational-semantics.md b/website/docs/specification/core/operational-semantics.md similarity index 87% rename from docs/specification/core/operational-semantics.md rename to website/docs/specification/core/operational-semantics.md index 974a895fd..400434092 100644 --- a/docs/specification/core/operational-semantics.md +++ b/website/docs/specification/core/operational-semantics.md @@ -1,6 +1,15 @@ -# Operational syntax +--- +id: operational-semantics +title: Operational Semantics (WIP) +keywords: + - docs + - specification + - pikelet +--- -TODO +:::warning +This section is a work in progress. +::: ## Evaluation diff --git a/website/docs/specification/surface/elaboration.md b/website/docs/specification/surface/elaboration.md new file mode 100644 index 000000000..97a080c82 --- /dev/null +++ b/website/docs/specification/surface/elaboration.md @@ -0,0 +1,12 @@ +--- +id: elaboration +title: Elaboration (WIP) +keywords: + - docs + - specification + - pikelet +--- + +:::warning +This section is a work in progress. +::: diff --git a/docs/specification/surface/grammar.md b/website/docs/specification/surface/grammar.md similarity index 96% rename from docs/specification/surface/grammar.md rename to website/docs/specification/surface/grammar.md index 708b19c06..46e912a45 100644 --- a/docs/specification/surface/grammar.md +++ b/website/docs/specification/surface/grammar.md @@ -1,4 +1,11 @@ -# Grammar +--- +id: grammar +title: Grammar +keywords: + - docs + - specification + - pikelet +--- This defines the grammar of the surface language. diff --git a/docs/specification/surface/lexical-structure.md b/website/docs/specification/surface/lexical-structure.md similarity index 98% rename from docs/specification/surface/lexical-structure.md rename to website/docs/specification/surface/lexical-structure.md index 4c054d2d2..a4723c6c5 100644 --- a/docs/specification/surface/lexical-structure.md +++ b/website/docs/specification/surface/lexical-structure.md @@ -1,4 +1,11 @@ -# Lexical structure +--- +id: lexical-structure +title: Lexical Structure +keywords: + - docs + - specification + - pikelet +--- The _lexical structure_ of the Pikelet programming langues is a description of what constitutes a valid sequence of tokens in the programming language. diff --git a/website/docusaurus.config.js b/website/docusaurus.config.js new file mode 100755 index 000000000..85dfbf919 --- /dev/null +++ b/website/docusaurus.config.js @@ -0,0 +1,127 @@ +module.exports = { + title: "Pikelet", + tagline: "A friendly little systems language with first-class types.", + url: "https://pikelet.org", + baseUrl: "/", + favicon: "img/favicon.ico", + organizationName: "pikelet-lang", // Usually your GitHub org/user name. + projectName: "pikelet", // Usually your repo name. + themeConfig: { + sidebarCollapsible: false, + prism: { + theme: require("prism-react-renderer/themes/palenight") + }, + navbar: { + title: "Pikelet", + logo: { + alt: "My Site Logo", + src: "img/logo.svg" + }, + links: [ + { + label: "Guide", + to: "docs/guide", + position: "left" + }, + { + label: "Reference", + to: "docs/reference", + position: "left" + }, + { + label: "Specification", + to: "docs/specification", + position: "left" + }, + { + label: "Contributing", + to: "docs/contributing", + position: "left" + }, + // { + // label: "Blog", + // to: "blog", + // position: "left" + // }, + { + label: "GitHub", + href: "https://github.com/pikelet-lang/pikelet", + position: "right" + }, + { + label: "Gitter", + href: "https://gitter.im/pikelet-lang/Lobby", + position: "right" + } + ] + }, + footer: { + style: "dark", + links: [ + { + title: "Docs", + items: [ + { to: "docs/guide", label: "Guide" }, + { to: "docs/reference", label: "Reference" }, + { to: "docs/specification", label: "Specification" } + ] + }, + { + title: "Community", + items: [ + { + label: "Gitter", + href: "https://gitter.im/pikelet-lang/Lobby" + }, + { + label: "Discord (Unofficial)", + href: "https://discord.gg/vQtyxjZ" + } + ] + }, + { + title: "Social", + items: [ + { + label: "Blog", + to: "blog" + }, + { + label: "GitHub", + href: "https://github.com/pikelet-lang/pikelet" + }, + { + label: "Twitter", + href: "https://twitter.com/pikelet-lang" + } + ] + } + ], + copyright: `Copyright © ${new Date().getFullYear()} Brendan Zabarauskas. Built with Docusaurus.` + } + }, + presets: [ + [ + "@docusaurus/preset-classic", + { + docs: { + sidebarPath: require.resolve("./sidebars.js"), + editUrl: + "https://github.com/pikelet-lang/pikelet/edit/master/website/", + remarkPlugins: [[require("remark-admonitions"), {}]] + }, + // blog: { + // feedOptions: { + // type: "all", + // description: "Pikelet Language Blog", + // copyright: `Copyright © ${new Date().getFullYear()} Brendan Zabarauskas.`, + // language: "en" + // } + // }, + theme: { + customCss: require.resolve("./src/css/custom.css") + } + } + ] + ] +}; diff --git a/website/package.json b/website/package.json new file mode 100755 index 000000000..a2ca2327b --- /dev/null +++ b/website/package.json @@ -0,0 +1,31 @@ +{ + "name": "website", + "version": "0.0.0", + "private": true, + "scripts": { + "start": "docusaurus start", + "build": "docusaurus build", + "swizzle": "docusaurus swizzle", + "deploy": "docusaurus deploy" + }, + "dependencies": { + "@docusaurus/core": "^2.0.0-alpha.40", + "@docusaurus/preset-classic": "^2.0.0-alpha.40", + "classnames": "^2.2.6", + "react": "^16.8.4", + "react-dom": "^16.8.4", + "remark-admonitions": "^1.0.0" + }, + "browserslist": { + "production": [ + ">0.2%", + "not dead", + "not op_mini all" + ], + "development": [ + "last 1 chrome version", + "last 1 firefox version", + "last 1 safari version" + ] + } +} diff --git a/website/sidebars.js b/website/sidebars.js new file mode 100755 index 000000000..96a6146f9 --- /dev/null +++ b/website/sidebars.js @@ -0,0 +1,56 @@ +/** + * Copyright (c) 2017-present, Facebook, Inc. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +module.exports = { + guideSidebar: [ + "guide", + "guide/installation", + "guide/hello-world", + "guide/data-structures", + "guide/modular-programming" + ], + referenceSidebar: [ + "reference", + { + type: "category", + label: "Language Features", + items: [ + "reference/comments", + "reference/names", + "reference/literals", + "reference/builtins", + "reference/functions", + "reference/records", + "reference/universes" + ] + }, + "reference/bibliography", + "reference/influences" + ], + specificationSidebar: [ + "specification", + { + type: "category", + label: "Surface Language", + items: [ + "specification/surface/lexical-structure", + "specification/surface/grammar", + "specification/surface/elaboration" + ] + }, + { + type: "category", + label: "Core Language", + items: [ + "specification/core/operational-semantics", + "specification/core/declarative-typing", + "specification/core/bidirectional-typing" + ] + } + ], + contributingSidebar: ["contributing", "contributing/roadmap"] +}; diff --git a/website/src/css/custom.css b/website/src/css/custom.css new file mode 100755 index 000000000..c9b380186 --- /dev/null +++ b/website/src/css/custom.css @@ -0,0 +1,120 @@ +/** + * Any CSS included here will be global. The classic template + * bundles Infima by default. Infima is a CSS framework designed to + * work well for content-centric websites. + */ + +/* You can override the default Infima variables here. */ +:root { + --ifm-color-primary: hsl(44, 96%, 46%); + --ifm-color-primary-dark: hsl(44, 68%, 41%); + --ifm-color-primary-darker: hsl(44, 68%, 38%); + --ifm-color-primary-darkest: hsl(44, 68%, 32%); + --ifm-color-primary-light: hsl(38, 56%, 54%); + --ifm-color-primary-lighter: hsl(37, 56%, 62%); + --ifm-color-primary-lightest: hsl(36, 56%, 73%); + --ifm-code-font-size: 95%; +} + +.docusaurus-highlight-code-line { + background-color: rgb(72, 77, 91); + display: block; + margin: 0 calc(-1 * var(--ifm-pre-padding)); + padding: 0 var(--ifm-pre-padding); +} + +/* remark-admonitions + * + * From: https://github.com/elviswolcott/remark-admonitions#infima-docusaurus-v2 + */ + +/* Based on the styling for alerts */ +.admonition { + background-color: var(--ifm-alert-background-color); + border: var(--ifm-alert-border-width) solid var(--ifm-alert-border-color); + border-radius: var(--ifm-alert-border-radius); + box-sizing: border-box; + color: var(--ifm-alert-color); + padding: var(--ifm-alert-padding-vertical) var(--ifm-alert-padding-horizontal); + margin-bottom: 1em; +} + +.admonition h5 { + margin-top: 0; + margin-bottom: 8px; + text-transform: uppercase; +} + +.admonition-icon { + display: inline-block; + vertical-align: middle; + margin-right: 0.2em; +} + +.admonition-icon svg { + display: inline-block; + width: 22px; + height: 22px; + stroke-width: 0; +} + +.admonition-content > :last-child { + margin-bottom: 0; +} + +.admonition .admonition-icon svg { + stroke: var(--ifm-alert-color); + fill: var(--ifm-alert-color); +} + +/* default for custom types */ + +.admonition { + --ifm-alert-background-color: var(--ifm-color-primary) +} + +/* styles for native types */ + +.admonition-important { + color: var(--ifm-alert-color); + background-color: var(--ifm-alert-background-color); + border-color: var(--ifm-alert-background-color) +} + +.admonition-tip { + --ifm-alert-background-color: var(--ifm-color-success) +} + +.admonition-important, .admonition-tip { + color: var(--ifm-alert-color); + background-color: var(--ifm-alert-background-color); + border-color: var(--ifm-alert-background-color) +} + +.admonition-important { + --ifm-alert-background-color:var(--ifm-color-info) +} + +.admonition-warning { + --ifm-alert-background-color:var(--ifm-color-warning) +} + +.admonition-note { + --ifm-alert-background-color:var(--ifm-color-secondary); + color: var(--ifm-color-gray-900); +} + +.admonition-note .admonition-icon svg { + fill: var(--ifm-color-gray-900); + stroke: var(--ifm-color-gray-900); +} + +.admonition-caution,.admonition-warning { + color: var(--ifm-alert-color); + background-color: var(--ifm-alert-background-color); + border-color: var(--ifm-alert-background-color) +} + +.admonition-caution { + --ifm-alert-background-color:var(--ifm-color-danger) +} diff --git a/website/src/pages/index.js b/website/src/pages/index.js new file mode 100755 index 000000000..90cff1e1b --- /dev/null +++ b/website/src/pages/index.js @@ -0,0 +1,97 @@ +import React from 'react'; +import classnames from 'classnames'; +import Layout from '@theme/Layout'; +import Link from '@docusaurus/Link'; +import useDocusaurusContext from '@docusaurus/useDocusaurusContext'; +import useBaseUrl from '@docusaurus/useBaseUrl'; +import styles from './styles.module.css'; + +const features = [ + { + title: <>Easy to Use, + imageUrl: 'img/undraw_docusaurus_mountain.svg', + description: ( + <> + Docusaurus was designed from the ground up to be easily installed and + used to get your website up and running quickly. + + ), + }, + { + title: <>Focus on What Matters, + imageUrl: 'img/undraw_docusaurus_tree.svg', + description: ( + <> + Docusaurus lets you focus on your docs, and we'll do the chores. Go + ahead and move your docs into the docs directory. + + ), + }, + { + title: <>Powered by React, + imageUrl: 'img/undraw_docusaurus_react.svg', + description: ( + <> + Extend or customize your website layout by reusing React. Docusaurus can + be extended while reusing the same header and footer. + + ), + }, +]; + +function Feature({imageUrl, title, description}) { + const imgUrl = useBaseUrl(imageUrl); + return ( +
+ {imgUrl && ( +
+ {title} +
+ )} +

{title}

+

{description}

+
+ ); +} + +function Home() { + const context = useDocusaurusContext(); + const {siteConfig = {}} = context; + return ( + +
+
+

{siteConfig.title}

+

{siteConfig.tagline}

+
+ + Get Started + +
+
+
+
+ {features && features.length && ( +
+
+
+ {features.map((props, idx) => ( + + ))} +
+
+
+ )} +
+
+ ); +} + +export default Home; diff --git a/website/src/pages/styles.module.css b/website/src/pages/styles.module.css new file mode 100755 index 000000000..caeec63c5 --- /dev/null +++ b/website/src/pages/styles.module.css @@ -0,0 +1,35 @@ +/** + * CSS files with the .module.css suffix will be treated as CSS modules + * and scoped locally. + */ + +.heroBanner { + padding: 4rem 0; + text-align: center; + position: relative; + overflow: hidden; +} + +@media screen and (max-width: 966px) { + .heroBanner { + padding: 2rem; + } +} + +.buttons { + display: flex; + align-items: center; + justify-content: center; +} + +.features { + display: flex; + align-items: center; + padding: 2rem 0; + width: 100%; +} + +.featureImage { + height: 200px; + width: 200px; +} diff --git a/website/src/theme/CodeBlock/index.js b/website/src/theme/CodeBlock/index.js new file mode 100755 index 000000000..15773dcfa --- /dev/null +++ b/website/src/theme/CodeBlock/index.js @@ -0,0 +1,113 @@ +/** + * Copyright (c) 2017-present, Facebook, Inc. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +import React, { useEffect, useState, useRef } from "react"; +import classnames from "classnames"; +import Highlight, { defaultProps } from "prism-react-renderer"; +import defaultTheme from "prism-react-renderer/themes/palenight"; +import Clipboard from "clipboard"; +import rangeParser from "parse-numeric-range"; +import useDocusaurusContext from "@docusaurus/useDocusaurusContext"; +import styles from "./styles.module.css"; + +// Include custom Prism languages +import Prism from "prism-react-renderer/prism"; +(typeof global !== "undefined" ? global : window).Prism = Prism; +require("./pikelet"); + +const highlightLinesRangeRegex = /{([\d,-]+)}/; + +export default ({ children, className: languageClassName, metastring }) => { + const { + siteConfig: { + themeConfig: { prism = {} } + } + } = useDocusaurusContext(); + const [showCopied, setShowCopied] = useState(false); + const target = useRef(null); + const button = useRef(null); + let highlightLines = []; + + if (metastring && highlightLinesRangeRegex.test(metastring)) { + const highlightLinesRange = metastring.match(highlightLinesRangeRegex)[1]; + highlightLines = rangeParser.parse(highlightLinesRange).filter(n => n > 0); + } + + useEffect(() => { + let clipboard; + + if (button.current) { + clipboard = new Clipboard(button.current, { + target: () => target.current + }); + } + + return () => { + if (clipboard) { + clipboard.destroy(); + } + }; + }, [button.current, target.current]); + + let language = + languageClassName && languageClassName.replace(/language-/, ""); + + if (!language && prism.defaultLanguage) { + language = prism.defaultLanguage; + } + + const handleCopyCode = () => { + window.getSelection().empty(); + setShowCopied(true); + + setTimeout(() => setShowCopied(false), 2000); + }; + + return ( + + {({ className, style, tokens, getLineProps, getTokenProps }) => ( +
+
+            {tokens.map((line, i) => {
+              const lineProps = getLineProps({ line, key: i });
+
+              if (highlightLines.includes(i + 1)) {
+                lineProps.className = `${lineProps.className} docusaurus-highlight-code-line`;
+              }
+
+              return (
+                
+ {line.map((token, key) => ( + + ))} +
+ ); + })} +
+ +
+ )} +
+ ); +}; diff --git a/website/src/theme/CodeBlock/pikelet.js b/website/src/theme/CodeBlock/pikelet.js new file mode 100644 index 000000000..a0f01727d --- /dev/null +++ b/website/src/theme/CodeBlock/pikelet.js @@ -0,0 +1,52 @@ +// Check out some other Prism highlighters for inspiration: +// +// https://github.com/PrismJS/prism/blob/master/components/prism-haskell.js +// https://github.com/PrismJS/prism/blob/master/components/prism-rust.js +// https://github.com/SassDoc/prism-scss-sassdoc/blob/master/prism-scss-sassdoc.js + +Prism.languages.pikelet = { + // Comments. + comment: { + pattern: /(^|[^\\:])--.*/, + lookbehind: true + }, + "doc-comment": { + pattern: /(^|[^\\:])\|\|\|.*/, + lookbehind: true, + alias: "comment" + }, + // String literals + string: [ + { + pattern: /b?r(#*)"(?:\\.|(?!"\1)[^\\\r\n])*"\1/, + greedy: true + }, + { + pattern: /b?"(?:\\.|[^\\\r\n"])*"/, + greedy: true + } + ], + // Character literals + char: { + pattern: /b?'(?:\\(?:x[0-7][\da-fA-F]|u{(?:[\da-fA-F]_*){1,6}|.)|[^\\\r\n\t'])'/, + alias: "string" + }, + // Keywords + keyword: /\b(?:Record|record)\b/, + // Builtins + builtin: /\b(?:Type|Bool|true|false|U8|U16|U32|U64|S8|S16|S32|S64|F32|F64|String|Char|Array|List)\b/, + // Numeric literals + number: [ + /(-|\+)?\b(?:0b[01](?:_?[01])*)(?:_)?\b/, + /(-|\+)?\b(?:0o[0-7](?:_?[0-7])*)(?:_)?\b/, + /(-|\+)?\b(?:0x[\dA-Fa-f](?:_?[\dA-Fa-f])*)(?:_)?\b/, + /(-|\+)?\b(?:(?:\d(?:_?\d)*)?\.?\d(?:_?\d)*(?:[Ee][+-]?\d+)?)(?:_)?\b/ + ], + // Symbols + delimiter: { + pattern: /\[|\]|\(|\)|\{|\}/, + alias: "punctuation" + }, + punctuation: /;|,|:|=/, + operator: /->|\.|\^/ +}; diff --git a/website/src/theme/CodeBlock/styles.module.css b/website/src/theme/CodeBlock/styles.module.css new file mode 100755 index 000000000..83c9e16af --- /dev/null +++ b/website/src/theme/CodeBlock/styles.module.css @@ -0,0 +1,40 @@ +/** + * Copyright (c) 2017-present, Facebook, Inc. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +.codeBlock { + margin-bottom: 0; + overflow: hidden; + overflow-wrap: break-word; + white-space: pre-wrap; +} + +.codeBlockWrapper { + position: relative; +} + +.codeBlockWrapper:hover > .copyButton { + visibility: visible; + opacity: 1; +} + +.copyButton { + background: rgb(1, 22, 39); + border: 1px solid rgb(214, 222, 235); + border-radius: var(--ifm-global-radius); + color: rgb(214, 222, 235); + cursor: pointer; + line-height: 12px; + opacity: 0; + outline: none; + padding: 4px 8px; + position: absolute; + right: var(--ifm-pre-padding); + top: var(--ifm-pre-padding); + visibility: hidden; + transition: opacity 200ms ease-in-out, visibility 200ms ease-in-out, + bottom 200ms ease-in-out; +} diff --git a/website/static/img/favicon.ico b/website/static/img/favicon.ico new file mode 100755 index 0000000000000000000000000000000000000000..be74abd69ad6a32de7375df13cab9354798e328f GIT binary patch literal 766 zcmc(dze~eV5XUd2fg&jH87YDYDQKxq1{4b-_ydP-wqS9vgGh17QXQQAwOE{VaBvi* zmu^z9t({y-&1ey8Y_x;?x+`BviV9;aRjMgZ8M*!jgkRrFqSI9;F zHyfX@Az|AvVmn~YWWZP`0&JWEY~BFm?*Vq}VD7&_%x%MP$p`D`4JMC!K|B7pt?Mmp zUJAB7rxMXS6=!P+AtLU9V)J#61WPxwipRXCHO{BJ`l{m53#=t97a!znv~vfmr|AaP zRGIT7#0FyJy3Z*hL{GQp-0TRhX8UzZ)+>%?mK0^goaX4Q;x \ No newline at end of file diff --git a/website/static/img/undraw_docusaurus_mountain.svg b/website/static/img/undraw_docusaurus_mountain.svg new file mode 100755 index 000000000..431cef2f7 --- /dev/null +++ b/website/static/img/undraw_docusaurus_mountain.svg @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/website/static/img/undraw_docusaurus_react.svg b/website/static/img/undraw_docusaurus_react.svg new file mode 100755 index 000000000..e41705043 --- /dev/null +++ b/website/static/img/undraw_docusaurus_react.svg @@ -0,0 +1,169 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/website/static/img/undraw_docusaurus_tree.svg b/website/static/img/undraw_docusaurus_tree.svg new file mode 100755 index 000000000..a05cc03dd --- /dev/null +++ b/website/static/img/undraw_docusaurus_tree.svg @@ -0,0 +1 @@ +docu_tree \ No newline at end of file diff --git a/website/yarn.lock b/website/yarn.lock new file mode 100644 index 000000000..609989c49 --- /dev/null +++ b/website/yarn.lock @@ -0,0 +1,9218 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@babel/code-frame@7.5.5": + version "7.5.5" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.5.5.tgz#bc0782f6d69f7b7d49531219699b988f669a8f9d" + integrity sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw== + dependencies: + "@babel/highlight" "^7.0.0" + +"@babel/code-frame@^7.5.5", "@babel/code-frame@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.8.3.tgz#33e25903d7481181534e12ec0a25f16b6fcf419e" + integrity sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g== + dependencies: + "@babel/highlight" "^7.8.3" + +"@babel/compat-data@^7.8.0", "@babel/compat-data@^7.8.1": + version "7.8.1" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.8.1.tgz#fc0bbbb7991e4fb2b47e168e60f2cc2c41680be9" + integrity sha512-Z+6ZOXvyOWYxJ50BwxzdhRnRsGST8Y3jaZgxYig575lTjVSs3KtJnmESwZegg6e2Dn0td1eDhoWlp1wI4BTCPw== + dependencies: + browserslist "^4.8.2" + invariant "^2.2.4" + semver "^5.5.0" + +"@babel/core@7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.7.4.tgz#37e864532200cb6b50ee9a4045f5f817840166ab" + integrity sha512-+bYbx56j4nYBmpsWtnPUsKW3NdnYxbqyfrP2w9wILBuHzdfIKz9prieZK0DFPyIzkjYVUe4QkusGL07r5pXznQ== + dependencies: + "@babel/code-frame" "^7.5.5" + "@babel/generator" "^7.7.4" + "@babel/helpers" "^7.7.4" + "@babel/parser" "^7.7.4" + "@babel/template" "^7.7.4" + "@babel/traverse" "^7.7.4" + "@babel/types" "^7.7.4" + convert-source-map "^1.7.0" + debug "^4.1.0" + json5 "^2.1.0" + lodash "^4.17.13" + resolve "^1.3.2" + semver "^5.4.1" + source-map "^0.5.0" + +"@babel/core@^7.7.4": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.8.3.tgz#30b0ebb4dd1585de6923a0b4d179e0b9f5d82941" + integrity sha512-4XFkf8AwyrEG7Ziu3L2L0Cv+WyY47Tcsp70JFmpftbAA1K7YL/sgE9jh9HyNj08Y/U50ItUchpN0w6HxAoX1rA== + dependencies: + "@babel/code-frame" "^7.8.3" + "@babel/generator" "^7.8.3" + "@babel/helpers" "^7.8.3" + "@babel/parser" "^7.8.3" + "@babel/template" "^7.8.3" + "@babel/traverse" "^7.8.3" + "@babel/types" "^7.8.3" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.1" + json5 "^2.1.0" + lodash "^4.17.13" + resolve "^1.3.2" + semver "^5.4.1" + source-map "^0.5.0" + +"@babel/generator@^7.7.4", "@babel/generator@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.8.3.tgz#0e22c005b0a94c1c74eafe19ef78ce53a4d45c03" + integrity sha512-WjoPk8hRpDRqqzRpvaR8/gDUPkrnOOeuT2m8cNICJtZH6mwaCo3v0OKMI7Y6SM1pBtyijnLtAL0HDi41pf41ug== + dependencies: + "@babel/types" "^7.8.3" + jsesc "^2.5.1" + lodash "^4.17.13" + source-map "^0.5.0" + +"@babel/helper-annotate-as-pure@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.8.3.tgz#60bc0bc657f63a0924ff9a4b4a0b24a13cf4deee" + integrity sha512-6o+mJrZBxOoEX77Ezv9zwW7WV8DdluouRKNY/IR5u/YTMuKHgugHOzYWlYvYLpLA9nPsQCAAASpCIbjI9Mv+Uw== + dependencies: + "@babel/types" "^7.8.3" + +"@babel/helper-builder-binary-assignment-operator-visitor@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.8.3.tgz#c84097a427a061ac56a1c30ebf54b7b22d241503" + integrity sha512-5eFOm2SyFPK4Rh3XMMRDjN7lBH0orh3ss0g3rTYZnBQ+r6YPj7lgDyCvPphynHvUrobJmeMignBr6Acw9mAPlw== + dependencies: + "@babel/helper-explode-assignable-expression" "^7.8.3" + "@babel/types" "^7.8.3" + +"@babel/helper-builder-react-jsx@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.8.3.tgz#dee98d7d79cc1f003d80b76fe01c7f8945665ff6" + integrity sha512-JT8mfnpTkKNCboTqZsQTdGo3l3Ik3l7QIt9hh0O9DYiwVel37VoJpILKM4YFbP2euF32nkQSb+F9cUk9b7DDXQ== + dependencies: + "@babel/types" "^7.8.3" + esutils "^2.0.0" + +"@babel/helper-call-delegate@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-call-delegate/-/helper-call-delegate-7.8.3.tgz#de82619898aa605d409c42be6ffb8d7204579692" + integrity sha512-6Q05px0Eb+N4/GTyKPPvnkig7Lylw+QzihMpws9iiZQv7ZImf84ZsZpQH7QoWN4n4tm81SnSzPgHw2qtO0Zf3A== + dependencies: + "@babel/helper-hoist-variables" "^7.8.3" + "@babel/traverse" "^7.8.3" + "@babel/types" "^7.8.3" + +"@babel/helper-compilation-targets@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.8.3.tgz#2deedc816fd41dca7355ef39fd40c9ea69f0719a" + integrity sha512-JLylPCsFjhLN+6uBSSh3iYdxKdeO9MNmoY96PE/99d8kyBFaXLORtAVhqN6iHa+wtPeqxKLghDOZry0+Aiw9Tw== + dependencies: + "@babel/compat-data" "^7.8.1" + browserslist "^4.8.2" + invariant "^2.2.4" + levenary "^1.1.0" + semver "^5.5.0" + +"@babel/helper-create-regexp-features-plugin@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.8.3.tgz#c774268c95ec07ee92476a3862b75cc2839beb79" + integrity sha512-Gcsm1OHCUr9o9TcJln57xhWHtdXbA2pgQ58S0Lxlks0WMGNXuki4+GLfX0p+L2ZkINUGZvfkz8rzoqJQSthI+Q== + dependencies: + "@babel/helper-regex" "^7.8.3" + regexpu-core "^4.6.0" + +"@babel/helper-define-map@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.8.3.tgz#a0655cad5451c3760b726eba875f1cd8faa02c15" + integrity sha512-PoeBYtxoZGtct3md6xZOCWPcKuMuk3IHhgxsRRNtnNShebf4C8YonTSblsK4tvDbm+eJAw2HAPOfCr+Q/YRG/g== + dependencies: + "@babel/helper-function-name" "^7.8.3" + "@babel/types" "^7.8.3" + lodash "^4.17.13" + +"@babel/helper-explode-assignable-expression@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.8.3.tgz#a728dc5b4e89e30fc2dfc7d04fa28a930653f982" + integrity sha512-N+8eW86/Kj147bO9G2uclsg5pwfs/fqqY5rwgIL7eTBklgXjcOJ3btzS5iM6AitJcftnY7pm2lGsrJVYLGjzIw== + dependencies: + "@babel/traverse" "^7.8.3" + "@babel/types" "^7.8.3" + +"@babel/helper-function-name@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz#eeeb665a01b1f11068e9fb86ad56a1cb1a824cca" + integrity sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA== + dependencies: + "@babel/helper-get-function-arity" "^7.8.3" + "@babel/template" "^7.8.3" + "@babel/types" "^7.8.3" + +"@babel/helper-get-function-arity@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz#b894b947bd004381ce63ea1db9f08547e920abd5" + integrity sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA== + dependencies: + "@babel/types" "^7.8.3" + +"@babel/helper-hoist-variables@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.8.3.tgz#1dbe9b6b55d78c9b4183fc8cdc6e30ceb83b7134" + integrity sha512-ky1JLOjcDUtSc+xkt0xhYff7Z6ILTAHKmZLHPxAhOP0Nd77O+3nCsd6uSVYur6nJnCI029CrNbYlc0LoPfAPQg== + dependencies: + "@babel/types" "^7.8.3" + +"@babel/helper-member-expression-to-functions@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.8.3.tgz#659b710498ea6c1d9907e0c73f206eee7dadc24c" + integrity sha512-fO4Egq88utkQFjbPrSHGmGLFqmrshs11d46WI+WZDESt7Wu7wN2G2Iu+NMMZJFDOVRHAMIkB5SNh30NtwCA7RA== + dependencies: + "@babel/types" "^7.8.3" + +"@babel/helper-module-imports@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.8.3.tgz#7fe39589b39c016331b6b8c3f441e8f0b1419498" + integrity sha512-R0Bx3jippsbAEtzkpZ/6FIiuzOURPcMjHp+Z6xPe6DtApDJx+w7UYyOLanZqO8+wKR9G10s/FmHXvxaMd9s6Kg== + dependencies: + "@babel/types" "^7.8.3" + +"@babel/helper-module-transforms@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.8.3.tgz#d305e35d02bee720fbc2c3c3623aa0c316c01590" + integrity sha512-C7NG6B7vfBa/pwCOshpMbOYUmrYQDfCpVL/JCRu0ek8B5p8kue1+BCXpg2vOYs7w5ACB9GTOBYQ5U6NwrMg+3Q== + dependencies: + "@babel/helper-module-imports" "^7.8.3" + "@babel/helper-simple-access" "^7.8.3" + "@babel/helper-split-export-declaration" "^7.8.3" + "@babel/template" "^7.8.3" + "@babel/types" "^7.8.3" + lodash "^4.17.13" + +"@babel/helper-optimise-call-expression@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.8.3.tgz#7ed071813d09c75298ef4f208956006b6111ecb9" + integrity sha512-Kag20n86cbO2AvHca6EJsvqAd82gc6VMGule4HwebwMlwkpXuVqrNRj6CkCV2sKxgi9MyAUnZVnZ6lJ1/vKhHQ== + dependencies: + "@babel/types" "^7.8.3" + +"@babel/helper-plugin-utils@7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz#bbb3fbee98661c569034237cc03967ba99b4f250" + integrity sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA== + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz#9ea293be19babc0f52ff8ca88b34c3611b208670" + integrity sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ== + +"@babel/helper-regex@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.8.3.tgz#139772607d51b93f23effe72105b319d2a4c6965" + integrity sha512-BWt0QtYv/cg/NecOAZMdcn/waj/5P26DR4mVLXfFtDokSR6fyuG0Pj+e2FqtSME+MqED1khnSMulkmGl8qWiUQ== + dependencies: + lodash "^4.17.13" + +"@babel/helper-remap-async-to-generator@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.8.3.tgz#273c600d8b9bf5006142c1e35887d555c12edd86" + integrity sha512-kgwDmw4fCg7AVgS4DukQR/roGp+jP+XluJE5hsRZwxCYGg+Rv9wSGErDWhlI90FODdYfd4xG4AQRiMDjjN0GzA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.8.3" + "@babel/helper-wrap-function" "^7.8.3" + "@babel/template" "^7.8.3" + "@babel/traverse" "^7.8.3" + "@babel/types" "^7.8.3" + +"@babel/helper-replace-supers@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.8.3.tgz#91192d25f6abbcd41da8a989d4492574fb1530bc" + integrity sha512-xOUssL6ho41U81etpLoT2RTdvdus4VfHamCuAm4AHxGr+0it5fnwoVdwUJ7GFEqCsQYzJUhcbsN9wB9apcYKFA== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.8.3" + "@babel/helper-optimise-call-expression" "^7.8.3" + "@babel/traverse" "^7.8.3" + "@babel/types" "^7.8.3" + +"@babel/helper-simple-access@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.8.3.tgz#7f8109928b4dab4654076986af575231deb639ae" + integrity sha512-VNGUDjx5cCWg4vvCTR8qQ7YJYZ+HBjxOgXEl7ounz+4Sn7+LMD3CFrCTEU6/qXKbA2nKg21CwhhBzO0RpRbdCw== + dependencies: + "@babel/template" "^7.8.3" + "@babel/types" "^7.8.3" + +"@babel/helper-split-export-declaration@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz#31a9f30070f91368a7182cf05f831781065fc7a9" + integrity sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA== + dependencies: + "@babel/types" "^7.8.3" + +"@babel/helper-wrap-function@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.8.3.tgz#9dbdb2bb55ef14aaa01fe8c99b629bd5352d8610" + integrity sha512-LACJrbUET9cQDzb6kG7EeD7+7doC3JNvUgTEQOx2qaO1fKlzE/Bf05qs9w1oXQMmXlPO65lC3Tq9S6gZpTErEQ== + dependencies: + "@babel/helper-function-name" "^7.8.3" + "@babel/template" "^7.8.3" + "@babel/traverse" "^7.8.3" + "@babel/types" "^7.8.3" + +"@babel/helpers@^7.7.4", "@babel/helpers@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.8.3.tgz#382fbb0382ce7c4ce905945ab9641d688336ce85" + integrity sha512-LmU3q9Pah/XyZU89QvBgGt+BCsTPoQa+73RxAQh8fb8qkDyIfeQnmgs+hvzhTCKTzqOyk7JTkS3MS1S8Mq5yrQ== + dependencies: + "@babel/template" "^7.8.3" + "@babel/traverse" "^7.8.3" + "@babel/types" "^7.8.3" + +"@babel/highlight@^7.0.0", "@babel/highlight@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.8.3.tgz#28f173d04223eaaa59bc1d439a3836e6d1265797" + integrity sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg== + dependencies: + chalk "^2.0.0" + esutils "^2.0.2" + js-tokens "^4.0.0" + +"@babel/parser@^7.7.4", "@babel/parser@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.8.3.tgz#790874091d2001c9be6ec426c2eed47bc7679081" + integrity sha512-/V72F4Yp/qmHaTALizEm9Gf2eQHV3QyTL3K0cNfijwnMnb1L+LDlAubb/ZnSdGAVzVSWakujHYs1I26x66sMeQ== + +"@babel/plugin-proposal-async-generator-functions@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.8.3.tgz#bad329c670b382589721b27540c7d288601c6e6f" + integrity sha512-NZ9zLv848JsV3hs8ryEh7Uaz/0KsmPLqv0+PdkDJL1cJy0K4kOCFa8zc1E3mp+RHPQcpdfb/6GovEsW4VDrOMw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-remap-async-to-generator" "^7.8.3" + "@babel/plugin-syntax-async-generators" "^7.8.0" + +"@babel/plugin-proposal-dynamic-import@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.8.3.tgz#38c4fe555744826e97e2ae930b0fb4cc07e66054" + integrity sha512-NyaBbyLFXFLT9FP+zk0kYlUlA8XtCUbehs67F0nnEg7KICgMc2mNkIeu9TYhKzyXMkrapZFwAhXLdnt4IYHy1w== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-dynamic-import" "^7.8.0" + +"@babel/plugin-proposal-json-strings@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.8.3.tgz#da5216b238a98b58a1e05d6852104b10f9a70d6b" + integrity sha512-KGhQNZ3TVCQG/MjRbAUwuH+14y9q0tpxs1nWWs3pbSleRdDro9SAMMDyye8HhY1gqZ7/NqIc8SKhya0wRDgP1Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-json-strings" "^7.8.0" + +"@babel/plugin-proposal-nullish-coalescing-operator@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.8.3.tgz#e4572253fdeed65cddeecfdab3f928afeb2fd5d2" + integrity sha512-TS9MlfzXpXKt6YYomudb/KU7nQI6/xnapG6in1uZxoxDghuSMZsPb6D2fyUwNYSAp4l1iR7QtFOjkqcRYcUsfw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" + +"@babel/plugin-proposal-object-rest-spread@7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.7.4.tgz#cc57849894a5c774214178c8ab64f6334ec8af71" + integrity sha512-rnpnZR3/iWKmiQyJ3LKJpSwLDcX/nSXhdLk4Aq/tXOApIvyu7qoabrige0ylsAJffaUC51WiBu209Q0U+86OWQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-object-rest-spread" "^7.7.4" + +"@babel/plugin-proposal-object-rest-spread@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.8.3.tgz#eb5ae366118ddca67bed583b53d7554cad9951bb" + integrity sha512-8qvuPwU/xxUCt78HocNlv0mXXo0wdh9VT1R04WU8HGOfaOob26pF+9P5/lYjN/q7DHOX1bvX60hnhOvuQUJdbA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-object-rest-spread" "^7.8.0" + +"@babel/plugin-proposal-optional-catch-binding@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.8.3.tgz#9dee96ab1650eed88646ae9734ca167ac4a9c5c9" + integrity sha512-0gkX7J7E+AtAw9fcwlVQj8peP61qhdg/89D5swOkjYbkboA2CVckn3kiyum1DE0wskGb7KJJxBdyEBApDLLVdw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" + +"@babel/plugin-proposal-optional-chaining@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.8.3.tgz#ae10b3214cb25f7adb1f3bc87ba42ca10b7e2543" + integrity sha512-QIoIR9abkVn+seDE3OjA08jWcs3eZ9+wJCKSRgo3WdEU2csFYgdScb+8qHB3+WXsGJD55u+5hWCISI7ejXS+kg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-optional-chaining" "^7.8.0" + +"@babel/plugin-proposal-unicode-property-regex@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.8.3.tgz#b646c3adea5f98800c9ab45105ac34d06cd4a47f" + integrity sha512-1/1/rEZv2XGweRwwSkLpY+s60za9OZ1hJs4YDqFHCw0kYWYwL5IFljVY1MYBL+weT1l9pokDO2uhSTLVxzoHkQ== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-syntax-async-generators@^7.8.0": + version "7.8.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" + integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-dynamic-import@^7.7.4", "@babel/plugin-syntax-dynamic-import@^7.8.0": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" + integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-json-strings@^7.8.0": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" + integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-jsx@7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.7.4.tgz#dab2b56a36fb6c3c222a1fbc71f7bf97f327a9ec" + integrity sha512-wuy6fiMe9y7HeZBWXYCGt2RGxZOj0BImZ9EyXJVnVGBKO/Br592rbR3rtIQn0eQhAk9vqaKP5n8tVqEFBQMfLg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-jsx@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.8.3.tgz#521b06c83c40480f1e58b4fd33b92eceb1d6ea94" + integrity sha512-WxdW9xyLgBdefoo0Ynn3MRSkhe5tFVxxKNVdnZSh318WrG2e2jH+E9wd/++JsqcLJZPfz87njQJ8j2Upjm0M0A== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.0": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" + integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-object-rest-spread@7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.7.4.tgz#47cf220d19d6d0d7b154304701f468fc1cc6ff46" + integrity sha512-mObR+r+KZq0XhRVS2BrBKBpr5jqrqzlPvS9C9vuOf5ilSwzloAl7RPWLrgKdWS6IreaVrjHxTjtyqFiOisaCwg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-object-rest-spread@^7.7.4", "@babel/plugin-syntax-object-rest-spread@^7.8.0": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" + integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-catch-binding@^7.8.0": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" + integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-chaining@^7.8.0": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" + integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-top-level-await@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.8.3.tgz#3acdece695e6b13aaf57fc291d1a800950c71391" + integrity sha512-kwj1j9lL/6Wd0hROD3b/OZZ7MSrZLqqn9RAZ5+cYYsflQ9HZBIKCUkr3+uL1MEJ1NePiUbf98jjiMQSv0NMR9g== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-arrow-functions@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.8.3.tgz#82776c2ed0cd9e1a49956daeb896024c9473b8b6" + integrity sha512-0MRF+KC8EqH4dbuITCWwPSzsyO3HIWWlm30v8BbbpOrS1B++isGxPnnuq/IZvOX5J2D/p7DQalQm+/2PnlKGxg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-async-to-generator@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.8.3.tgz#4308fad0d9409d71eafb9b1a6ee35f9d64b64086" + integrity sha512-imt9tFLD9ogt56Dd5CI/6XgpukMwd/fLGSrix2httihVe7LOGVPhyhMh1BU5kDM7iHD08i8uUtmV2sWaBFlHVQ== + dependencies: + "@babel/helper-module-imports" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-remap-async-to-generator" "^7.8.3" + +"@babel/plugin-transform-block-scoped-functions@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.8.3.tgz#437eec5b799b5852072084b3ae5ef66e8349e8a3" + integrity sha512-vo4F2OewqjbB1+yaJ7k2EJFHlTP3jR634Z9Cj9itpqNjuLXvhlVxgnjsHsdRgASR8xYDrx6onw4vW5H6We0Jmg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-block-scoping@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.8.3.tgz#97d35dab66857a437c166358b91d09050c868f3a" + integrity sha512-pGnYfm7RNRgYRi7bids5bHluENHqJhrV4bCZRwc5GamaWIIs07N4rZECcmJL6ZClwjDz1GbdMZFtPs27hTB06w== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + lodash "^4.17.13" + +"@babel/plugin-transform-classes@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.8.3.tgz#46fd7a9d2bb9ea89ce88720477979fe0d71b21b8" + integrity sha512-SjT0cwFJ+7Rbr1vQsvphAHwUHvSUPmMjMU/0P59G8U2HLFqSa082JO7zkbDNWs9kH/IUqpHI6xWNesGf8haF1w== + dependencies: + "@babel/helper-annotate-as-pure" "^7.8.3" + "@babel/helper-define-map" "^7.8.3" + "@babel/helper-function-name" "^7.8.3" + "@babel/helper-optimise-call-expression" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-replace-supers" "^7.8.3" + "@babel/helper-split-export-declaration" "^7.8.3" + globals "^11.1.0" + +"@babel/plugin-transform-computed-properties@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.8.3.tgz#96d0d28b7f7ce4eb5b120bb2e0e943343c86f81b" + integrity sha512-O5hiIpSyOGdrQZRQ2ccwtTVkgUDBBiCuK//4RJ6UfePllUTCENOzKxfh6ulckXKc0DixTFLCfb2HVkNA7aDpzA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-destructuring@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.8.3.tgz#20ddfbd9e4676906b1056ee60af88590cc7aaa0b" + integrity sha512-H4X646nCkiEcHZUZaRkhE2XVsoz0J/1x3VVujnn96pSoGCtKPA99ZZA+va+gK+92Zycd6OBKCD8tDb/731bhgQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-dotall-regex@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.8.3.tgz#c3c6ec5ee6125c6993c5cbca20dc8621a9ea7a6e" + integrity sha512-kLs1j9Nn4MQoBYdRXH6AeaXMbEJFaFu/v1nQkvib6QzTj8MZI5OQzqmD83/2jEM1z0DLilra5aWO5YpyC0ALIw== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-duplicate-keys@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.8.3.tgz#8d12df309aa537f272899c565ea1768e286e21f1" + integrity sha512-s8dHiBUbcbSgipS4SMFuWGqCvyge5V2ZeAWzR6INTVC3Ltjig/Vw1G2Gztv0vU/hRG9X8IvKvYdoksnUfgXOEQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-exponentiation-operator@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.8.3.tgz#581a6d7f56970e06bf51560cd64f5e947b70d7b7" + integrity sha512-zwIpuIymb3ACcInbksHaNcR12S++0MDLKkiqXHl3AzpgdKlFNhog+z/K0+TGW+b0w5pgTq4H6IwV/WhxbGYSjQ== + dependencies: + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-for-of@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.8.3.tgz#15f17bce2fc95c7d59a24b299e83e81cedc22e18" + integrity sha512-ZjXznLNTxhpf4Q5q3x1NsngzGA38t9naWH8Gt+0qYZEJAcvPI9waSStSh56u19Ofjr7QmD0wUsQ8hw8s/p1VnA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-function-name@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.8.3.tgz#279373cb27322aaad67c2683e776dfc47196ed8b" + integrity sha512-rO/OnDS78Eifbjn5Py9v8y0aR+aSYhDhqAwVfsTl0ERuMZyr05L1aFSCJnbv2mmsLkit/4ReeQ9N2BgLnOcPCQ== + dependencies: + "@babel/helper-function-name" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-literals@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.8.3.tgz#aef239823d91994ec7b68e55193525d76dbd5dc1" + integrity sha512-3Tqf8JJ/qB7TeldGl+TT55+uQei9JfYaregDcEAyBZ7akutriFrt6C/wLYIer6OYhleVQvH/ntEhjE/xMmy10A== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-member-expression-literals@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.8.3.tgz#963fed4b620ac7cbf6029c755424029fa3a40410" + integrity sha512-3Wk2EXhnw+rP+IDkK6BdtPKsUE5IeZ6QOGrPYvw52NwBStw9V1ZVzxgK6fSKSxqUvH9eQPR3tm3cOq79HlsKYA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-modules-amd@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.8.3.tgz#65606d44616b50225e76f5578f33c568a0b876a5" + integrity sha512-MadJiU3rLKclzT5kBH4yxdry96odTUwuqrZM+GllFI/VhxfPz+k9MshJM+MwhfkCdxxclSbSBbUGciBngR+kEQ== + dependencies: + "@babel/helper-module-transforms" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + babel-plugin-dynamic-import-node "^2.3.0" + +"@babel/plugin-transform-modules-commonjs@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.8.3.tgz#df251706ec331bd058a34bdd72613915f82928a5" + integrity sha512-JpdMEfA15HZ/1gNuB9XEDlZM1h/gF/YOH7zaZzQu2xCFRfwc01NXBMHHSTT6hRjlXJJs5x/bfODM3LiCk94Sxg== + dependencies: + "@babel/helper-module-transforms" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-simple-access" "^7.8.3" + babel-plugin-dynamic-import-node "^2.3.0" + +"@babel/plugin-transform-modules-systemjs@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.8.3.tgz#d8bbf222c1dbe3661f440f2f00c16e9bb7d0d420" + integrity sha512-8cESMCJjmArMYqa9AO5YuMEkE4ds28tMpZcGZB/jl3n0ZzlsxOAi3mC+SKypTfT8gjMupCnd3YiXCkMjj2jfOg== + dependencies: + "@babel/helper-hoist-variables" "^7.8.3" + "@babel/helper-module-transforms" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + babel-plugin-dynamic-import-node "^2.3.0" + +"@babel/plugin-transform-modules-umd@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.8.3.tgz#592d578ce06c52f5b98b02f913d653ffe972661a" + integrity sha512-evhTyWhbwbI3/U6dZAnx/ePoV7H6OUG+OjiJFHmhr9FPn0VShjwC2kdxqIuQ/+1P50TMrneGzMeyMTFOjKSnAw== + dependencies: + "@babel/helper-module-transforms" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-named-capturing-groups-regex@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.8.3.tgz#a2a72bffa202ac0e2d0506afd0939c5ecbc48c6c" + integrity sha512-f+tF/8UVPU86TrCb06JoPWIdDpTNSGGcAtaD9mLP0aYGA0OS0j7j7DHJR0GTFrUZPUU6loZhbsVZgTh0N+Qdnw== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.8.3" + +"@babel/plugin-transform-new-target@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.8.3.tgz#60cc2ae66d85c95ab540eb34babb6434d4c70c43" + integrity sha512-QuSGysibQpyxexRyui2vca+Cmbljo8bcRckgzYV4kRIsHpVeyeC3JDO63pY+xFZ6bWOBn7pfKZTqV4o/ix9sFw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-object-super@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.8.3.tgz#ebb6a1e7a86ffa96858bd6ac0102d65944261725" + integrity sha512-57FXk+gItG/GejofIyLIgBKTas4+pEU47IXKDBWFTxdPd7F80H8zybyAY7UoblVfBhBGs2EKM+bJUu2+iUYPDQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-replace-supers" "^7.8.3" + +"@babel/plugin-transform-parameters@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.8.3.tgz#7890576a13b17325d8b7d44cb37f21dc3bbdda59" + integrity sha512-/pqngtGb54JwMBZ6S/D3XYylQDFtGjWrnoCF4gXZOUpFV/ujbxnoNGNvDGu6doFWRPBveE72qTx/RRU44j5I/Q== + dependencies: + "@babel/helper-call-delegate" "^7.8.3" + "@babel/helper-get-function-arity" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-property-literals@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.8.3.tgz#33194300d8539c1ed28c62ad5087ba3807b98263" + integrity sha512-uGiiXAZMqEoQhRWMK17VospMZh5sXWg+dlh2soffpkAl96KAm+WZuJfa6lcELotSRmooLqg0MWdH6UUq85nmmg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-react-display-name@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.8.3.tgz#70ded987c91609f78353dd76d2fb2a0bb991e8e5" + integrity sha512-3Jy/PCw8Fe6uBKtEgz3M82ljt+lTg+xJaM4og+eyu83qLT87ZUSckn0wy7r31jflURWLO83TW6Ylf7lyXj3m5A== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-react-jsx-self@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.8.3.tgz#c4f178b2aa588ecfa8d077ea80d4194ee77ed702" + integrity sha512-01OT7s5oa0XTLf2I8XGsL8+KqV9lx3EZV+jxn/L2LQ97CGKila2YMroTkCEIE0HV/FF7CMSRsIAybopdN9NTdg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-jsx" "^7.8.3" + +"@babel/plugin-transform-react-jsx-source@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.8.3.tgz#951e75a8af47f9f120db731be095d2b2c34920e0" + integrity sha512-PLMgdMGuVDtRS/SzjNEQYUT8f4z1xb2BAT54vM1X5efkVuYBf5WyGUMbpmARcfq3NaglIwz08UVQK4HHHbC6ag== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-jsx" "^7.8.3" + +"@babel/plugin-transform-react-jsx@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.8.3.tgz#4220349c0390fdefa505365f68c103562ab2fc4a" + integrity sha512-r0h+mUiyL595ikykci+fbwm9YzmuOrUBi0b+FDIKmi3fPQyFokWVEMJnRWHJPPQEjyFJyna9WZC6Viv6UHSv1g== + dependencies: + "@babel/helper-builder-react-jsx" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-jsx" "^7.8.3" + +"@babel/plugin-transform-regenerator@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.8.3.tgz#b31031e8059c07495bf23614c97f3d9698bc6ec8" + integrity sha512-qt/kcur/FxrQrzFR432FGZznkVAjiyFtCOANjkAKwCbt465L6ZCiUQh2oMYGU3Wo8LRFJxNDFwWn106S5wVUNA== + dependencies: + regenerator-transform "^0.14.0" + +"@babel/plugin-transform-reserved-words@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.8.3.tgz#9a0635ac4e665d29b162837dd3cc50745dfdf1f5" + integrity sha512-mwMxcycN3omKFDjDQUl+8zyMsBfjRFr0Zn/64I41pmjv4NJuqcYlEtezwYtw9TFd9WR1vN5kiM+O0gMZzO6L0A== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-runtime@^7.7.4": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.8.3.tgz#c0153bc0a5375ebc1f1591cb7eea223adea9f169" + integrity sha512-/vqUt5Yh+cgPZXXjmaG9NT8aVfThKk7G4OqkVhrXqwsC5soMn/qTCxs36rZ2QFhpfTJcjw4SNDIZ4RUb8OL4jQ== + dependencies: + "@babel/helper-module-imports" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + resolve "^1.8.1" + semver "^5.5.1" + +"@babel/plugin-transform-shorthand-properties@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.8.3.tgz#28545216e023a832d4d3a1185ed492bcfeac08c8" + integrity sha512-I9DI6Odg0JJwxCHzbzW08ggMdCezoWcuQRz3ptdudgwaHxTjxw5HgdFJmZIkIMlRymL6YiZcped4TTCB0JcC8w== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-spread@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.8.3.tgz#9c8ffe8170fdfb88b114ecb920b82fb6e95fe5e8" + integrity sha512-CkuTU9mbmAoFOI1tklFWYYbzX5qCIZVXPVy0jpXgGwkplCndQAa58s2jr66fTeQnA64bDox0HL4U56CFYoyC7g== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-sticky-regex@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.8.3.tgz#be7a1290f81dae767475452199e1f76d6175b100" + integrity sha512-9Spq0vGCD5Bb4Z/ZXXSK5wbbLFMG085qd2vhL1JYu1WcQ5bXqZBAYRzU1d+p79GcHs2szYv5pVQCX13QgldaWw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-regex" "^7.8.3" + +"@babel/plugin-transform-template-literals@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.8.3.tgz#7bfa4732b455ea6a43130adc0ba767ec0e402a80" + integrity sha512-820QBtykIQOLFT8NZOcTRJ1UNuztIELe4p9DCgvj4NK+PwluSJ49we7s9FB1HIGNIYT7wFUJ0ar2QpCDj0escQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-typeof-symbol@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.8.3.tgz#5cffb216fb25c8c64ba6bf5f76ce49d3ab079f4d" + integrity sha512-3TrkKd4LPqm4jHs6nPtSDI/SV9Cm5PRJkHLUgTcqRQQTMAZ44ZaAdDZJtvWFSaRcvT0a1rTmJ5ZA5tDKjleF3g== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-unicode-regex@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.8.3.tgz#0cef36e3ba73e5c57273effb182f46b91a1ecaad" + integrity sha512-+ufgJjYdmWfSQ+6NS9VGUR2ns8cjJjYbrbi11mZBTaWm+Fui/ncTLFF28Ei1okavY+xkojGr1eJxNsWYeA5aZw== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/preset-env@^7.7.4": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.8.3.tgz#dc0fb2938f52bbddd79b3c861a4b3427dd3a6c54" + integrity sha512-Rs4RPL2KjSLSE2mWAx5/iCH+GC1ikKdxPrhnRS6PfFVaiZeom22VFKN4X8ZthyN61kAaR05tfXTbCvatl9WIQg== + dependencies: + "@babel/compat-data" "^7.8.0" + "@babel/helper-compilation-targets" "^7.8.3" + "@babel/helper-module-imports" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-proposal-async-generator-functions" "^7.8.3" + "@babel/plugin-proposal-dynamic-import" "^7.8.3" + "@babel/plugin-proposal-json-strings" "^7.8.3" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-proposal-object-rest-spread" "^7.8.3" + "@babel/plugin-proposal-optional-catch-binding" "^7.8.3" + "@babel/plugin-proposal-optional-chaining" "^7.8.3" + "@babel/plugin-proposal-unicode-property-regex" "^7.8.3" + "@babel/plugin-syntax-async-generators" "^7.8.0" + "@babel/plugin-syntax-dynamic-import" "^7.8.0" + "@babel/plugin-syntax-json-strings" "^7.8.0" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" + "@babel/plugin-syntax-object-rest-spread" "^7.8.0" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" + "@babel/plugin-syntax-optional-chaining" "^7.8.0" + "@babel/plugin-syntax-top-level-await" "^7.8.3" + "@babel/plugin-transform-arrow-functions" "^7.8.3" + "@babel/plugin-transform-async-to-generator" "^7.8.3" + "@babel/plugin-transform-block-scoped-functions" "^7.8.3" + "@babel/plugin-transform-block-scoping" "^7.8.3" + "@babel/plugin-transform-classes" "^7.8.3" + "@babel/plugin-transform-computed-properties" "^7.8.3" + "@babel/plugin-transform-destructuring" "^7.8.3" + "@babel/plugin-transform-dotall-regex" "^7.8.3" + "@babel/plugin-transform-duplicate-keys" "^7.8.3" + "@babel/plugin-transform-exponentiation-operator" "^7.8.3" + "@babel/plugin-transform-for-of" "^7.8.3" + "@babel/plugin-transform-function-name" "^7.8.3" + "@babel/plugin-transform-literals" "^7.8.3" + "@babel/plugin-transform-member-expression-literals" "^7.8.3" + "@babel/plugin-transform-modules-amd" "^7.8.3" + "@babel/plugin-transform-modules-commonjs" "^7.8.3" + "@babel/plugin-transform-modules-systemjs" "^7.8.3" + "@babel/plugin-transform-modules-umd" "^7.8.3" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.8.3" + "@babel/plugin-transform-new-target" "^7.8.3" + "@babel/plugin-transform-object-super" "^7.8.3" + "@babel/plugin-transform-parameters" "^7.8.3" + "@babel/plugin-transform-property-literals" "^7.8.3" + "@babel/plugin-transform-regenerator" "^7.8.3" + "@babel/plugin-transform-reserved-words" "^7.8.3" + "@babel/plugin-transform-shorthand-properties" "^7.8.3" + "@babel/plugin-transform-spread" "^7.8.3" + "@babel/plugin-transform-sticky-regex" "^7.8.3" + "@babel/plugin-transform-template-literals" "^7.8.3" + "@babel/plugin-transform-typeof-symbol" "^7.8.3" + "@babel/plugin-transform-unicode-regex" "^7.8.3" + "@babel/types" "^7.8.3" + browserslist "^4.8.2" + core-js-compat "^3.6.2" + invariant "^2.2.2" + levenary "^1.1.0" + semver "^5.5.0" + +"@babel/preset-react@^7.7.4": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.8.3.tgz#23dc63f1b5b0751283e04252e78cf1d6589273d2" + integrity sha512-9hx0CwZg92jGb7iHYQVgi0tOEHP/kM60CtWJQnmbATSPIQQ2xYzfoCI3EdqAhFBeeJwYMdWQuDUHMsuDbH9hyQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-transform-react-display-name" "^7.8.3" + "@babel/plugin-transform-react-jsx" "^7.8.3" + "@babel/plugin-transform-react-jsx-self" "^7.8.3" + "@babel/plugin-transform-react-jsx-source" "^7.8.3" + +"@babel/runtime@^7.1.2", "@babel/runtime@^7.4.0", "@babel/runtime@^7.7.4": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.8.3.tgz#0811944f73a6c926bb2ad35e918dcc1bfab279f1" + integrity sha512-fVHx1rzEmwB130VTkLnxR+HmxcTjGzH12LYQcFFoBwakMd3aOMD4OsRN7tGG/UOYE2ektgFrS8uACAoRk1CY0w== + dependencies: + regenerator-runtime "^0.13.2" + +"@babel/template@^7.7.4", "@babel/template@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.8.3.tgz#e02ad04fe262a657809327f578056ca15fd4d1b8" + integrity sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ== + dependencies: + "@babel/code-frame" "^7.8.3" + "@babel/parser" "^7.8.3" + "@babel/types" "^7.8.3" + +"@babel/traverse@^7.7.4", "@babel/traverse@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.8.3.tgz#a826215b011c9b4f73f3a893afbc05151358bf9a" + integrity sha512-we+a2lti+eEImHmEXp7bM9cTxGzxPmBiVJlLVD+FuuQMeeO7RaDbutbgeheDkw+Xe3mCfJHnGOWLswT74m2IPg== + dependencies: + "@babel/code-frame" "^7.8.3" + "@babel/generator" "^7.8.3" + "@babel/helper-function-name" "^7.8.3" + "@babel/helper-split-export-declaration" "^7.8.3" + "@babel/parser" "^7.8.3" + "@babel/types" "^7.8.3" + debug "^4.1.0" + globals "^11.1.0" + lodash "^4.17.13" + +"@babel/types@^7.7.4", "@babel/types@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.8.3.tgz#5a383dffa5416db1b73dedffd311ffd0788fb31c" + integrity sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg== + dependencies: + esutils "^2.0.2" + lodash "^4.17.13" + to-fast-properties "^2.0.0" + +"@csstools/convert-colors@^1.4.0": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@csstools/convert-colors/-/convert-colors-1.4.0.tgz#ad495dc41b12e75d588c6db8b9834f08fa131eb7" + integrity sha512-5a6wqoJV/xEdbRNKVo6I4hO3VjyDq//8q2f9I6PBAvMesJHFauXDorcNCsr9RzvsZnaWi5NYCcfyqP1QeFHFbw== + +"@docusaurus/core@^2.0.0-alpha.40": + version "2.0.0-alpha.40" + resolved "https://registry.yarnpkg.com/@docusaurus/core/-/core-2.0.0-alpha.40.tgz#cefc79156b89316317aee289fc68547b1d0ced04" + integrity sha512-3mVw7vXm6Ad53+1qKvYD3EzULC/JyWH8dUlysLzbsWx3M6+ZJ4NNdNTtLM4Uuug8OdnbhIJL244O4wSeRT5U3Q== + dependencies: + "@babel/core" "^7.7.4" + "@babel/plugin-syntax-dynamic-import" "^7.7.4" + "@babel/plugin-transform-runtime" "^7.7.4" + "@babel/preset-env" "^7.7.4" + "@babel/preset-react" "^7.7.4" + "@babel/runtime" "^7.7.4" + "@docusaurus/utils" "^2.0.0-alpha.40" + "@endiliey/static-site-generator-webpack-plugin" "^4.0.0" + babel-loader "^8.0.6" + babel-plugin-dynamic-import-node "^2.3.0" + cache-loader "^4.1.0" + chalk "^3.0.0" + chokidar "^3.3.0" + classnames "^2.2.6" + commander "^4.0.1" + copy-webpack-plugin "^5.0.5" + core-js "^2.6.5" + css-loader "^3.2.0" + del "^5.1.0" + ejs "^3.0.1" + express "^4.17.1" + fs-extra "^8.1.0" + globby "^10.0.1" + html-minifier-terser "^5.0.2" + html-tags "^3.1.0" + html-webpack-plugin "^4.0.0-beta.11" + import-fresh "^3.2.1" + lodash "^4.17.15" + mini-css-extract-plugin "^0.8.0" + nprogress "^0.2.0" + null-loader "^3.0.0" + optimize-css-assets-webpack-plugin "^5.0.3" + portfinder "^1.0.25" + postcss-loader "^3.0.0" + postcss-preset-env "^6.7.0" + react-dev-utils "^9.1.0" + react-helmet "^6.0.0-beta" + react-loadable "^5.5.0" + react-loadable-ssr-addon "^0.2.0" + react-router "^5.1.2" + react-router-config "^5.1.1" + react-router-dom "^5.1.2" + semver "^6.3.0" + shelljs "^0.8.3" + std-env "^2.2.1" + terser-webpack-plugin "^2.2.1" + wait-file "^1.0.5" + webpack "^4.41.2" + webpack-bundle-analyzer "^3.6.0" + webpack-dev-server "^3.9.0" + webpack-merge "^4.2.2" + webpackbar "^4.0.0" + +"@docusaurus/mdx-loader@^2.0.0-alpha.40": + version "2.0.0-alpha.40" + resolved "https://registry.yarnpkg.com/@docusaurus/mdx-loader/-/mdx-loader-2.0.0-alpha.40.tgz#26670dd07ff4b91831257f9b375400fe05a10e0c" + integrity sha512-v63OQKDf2DxN5SG9brKC2h5xDY9I8e0CGs/uNMF6txpVA/XYTNc2yP+XXUZS3Vx9xVIPH8uLruTZr5/bx2XH7w== + dependencies: + "@babel/parser" "^7.7.4" + "@babel/traverse" "^7.7.4" + "@mdx-js/mdx" "^1.5.1" + "@mdx-js/react" "^1.5.1" + escape-html "^1.0.3" + fs-extra "^8.1.0" + github-slugger "^1.2.1" + gray-matter "^4.0.2" + loader-utils "^1.2.3" + mdast-util-to-string "^1.0.7" + remark-emoji "^2.0.2" + remark-slug "^5.1.2" + stringify-object "^3.3.0" + unist-util-visit "^2.0.1" + +"@docusaurus/plugin-content-blog@^2.0.0-alpha.40": + version "2.0.0-alpha.40" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-blog/-/plugin-content-blog-2.0.0-alpha.40.tgz#e586f2af7e4736094eb4af5d2cc305877e4ef80a" + integrity sha512-iLCWtkQNe08+kYWlZC52WE3b3LDoYqh7mQYr2sOPmuZYmUv6wm88I7QMP3FlEpSIsYrIVy6yRoOGpD7Lf43wlA== + dependencies: + "@docusaurus/mdx-loader" "^2.0.0-alpha.40" + "@docusaurus/utils" "^2.0.0-alpha.40" + feed "^4.0.0" + fs-extra "^8.1.0" + globby "^10.0.1" + loader-utils "^1.2.3" + lodash "^4.17.15" + +"@docusaurus/plugin-content-docs@^2.0.0-alpha.40": + version "2.0.0-alpha.40" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-docs/-/plugin-content-docs-2.0.0-alpha.40.tgz#acec3e8b7c9deba415131fb8b53b618c039b06b5" + integrity sha512-cZgGJGNtYXlR2CQI7EuPyzf7DV1RvX+gRSRcPn979XxuLyk2GRWJ1/ODS3jkjQOfTat1QMFYvFrF5vYAgN6Drg== + dependencies: + "@docusaurus/mdx-loader" "^2.0.0-alpha.40" + "@docusaurus/utils" "^2.0.0-alpha.40" + execa "^3.4.0" + fs-extra "^8.1.0" + globby "^10.0.1" + import-fresh "^3.2.1" + loader-utils "^1.2.3" + lodash "^4.17.15" + shelljs "^0.8.3" + +"@docusaurus/plugin-content-pages@^2.0.0-alpha.40": + version "2.0.0-alpha.40" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-pages/-/plugin-content-pages-2.0.0-alpha.40.tgz#2edc4f906d9e30d4adac834d1a5ac8fab54b703e" + integrity sha512-igSyxGgzuJASLJ5969hyYx2x5B2jNDPu28BEiDbWP3sx1hwVZ+p+kXB8BlY1zlQob/NCGRH2LAR2Cyyb6o3Ntg== + dependencies: + "@docusaurus/types" "^2.0.0-alpha.40" + "@docusaurus/utils" "^2.0.0-alpha.40" + globby "^10.0.1" + +"@docusaurus/plugin-google-analytics@^2.0.0-alpha.40": + version "2.0.0-alpha.40" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-2.0.0-alpha.40.tgz#1967ff433c1dfc3d0cf29e17bc078232f2344119" + integrity sha512-vWkx63QadZgxTi2J+nLRnAd4uuCJT/F1rhRB8wVoUR/Vkeo463oufNWQL5yDpC1FA2d54zAwaLbjSbTSyuD4TA== + +"@docusaurus/plugin-google-gtag@^2.0.0-alpha.40": + version "2.0.0-alpha.40" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-2.0.0-alpha.40.tgz#9f6e372c39175615a70f53cdd4d4bb91fbbb07ac" + integrity sha512-2cBdCAsgLGg2uqSFf85GfUxsuqlmBIpmJhQrA/4Bc+ECc9mPxVq4UdD3C8YafUbiUzgNB2GTRv1igMBM4d7hEQ== + +"@docusaurus/plugin-sitemap@^2.0.0-alpha.40": + version "2.0.0-alpha.40" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-sitemap/-/plugin-sitemap-2.0.0-alpha.40.tgz#32c9fdff8fee20fbebb18f15fd49a2b01a2560b5" + integrity sha512-Z7VoC1o8+9gsy8LCiqgkYJmWKqzpIKjfydD5AX0D46vWMohfCnDIvWPKS4uN7BcCm9HRL786tJu3v3821N8I0A== + dependencies: + "@docusaurus/types" "^2.0.0-alpha.40" + sitemap "^3.2.2" + +"@docusaurus/preset-classic@^2.0.0-alpha.40": + version "2.0.0-alpha.40" + resolved "https://registry.yarnpkg.com/@docusaurus/preset-classic/-/preset-classic-2.0.0-alpha.40.tgz#7b45eb699c8512a3601c9dd2707b1c283edd8d6a" + integrity sha512-CALOb3aB1WR9JbK6ogMosy4ReZnkvtfCOJy49ibQqdVcJnmI46CbBscjHgbNph87tY9U/uzRb32XlP7mcScmng== + dependencies: + "@docusaurus/plugin-content-blog" "^2.0.0-alpha.40" + "@docusaurus/plugin-content-docs" "^2.0.0-alpha.40" + "@docusaurus/plugin-content-pages" "^2.0.0-alpha.40" + "@docusaurus/plugin-google-analytics" "^2.0.0-alpha.40" + "@docusaurus/plugin-google-gtag" "^2.0.0-alpha.40" + "@docusaurus/plugin-sitemap" "^2.0.0-alpha.40" + "@docusaurus/theme-classic" "^2.0.0-alpha.40" + "@docusaurus/theme-search-algolia" "^2.0.0-alpha.40" + +"@docusaurus/theme-classic@^2.0.0-alpha.40": + version "2.0.0-alpha.40" + resolved "https://registry.yarnpkg.com/@docusaurus/theme-classic/-/theme-classic-2.0.0-alpha.40.tgz#e6b6ee684d9499a895d2df894b4772db9d299939" + integrity sha512-kksNoAD4AD/klNJAuMWIWvkTP3aV85iozoNeihLALbTGQejEWxCbRL+dBjUflhF9zrKcvZP3s905hKj7Xt3B3g== + dependencies: + "@mdx-js/mdx" "^1.5.1" + "@mdx-js/react" "^1.5.1" + classnames "^2.2.6" + clipboard "^2.0.4" + infima "0.2.0-alpha.3" + parse-numeric-range "^0.0.2" + prism-react-renderer "^1.0.2" + react-toggle "^4.1.1" + +"@docusaurus/theme-search-algolia@^2.0.0-alpha.40": + version "2.0.0-alpha.40" + resolved "https://registry.yarnpkg.com/@docusaurus/theme-search-algolia/-/theme-search-algolia-2.0.0-alpha.40.tgz#f3f133d8ff392cfee5d5e1f7c102f6800bf54516" + integrity sha512-dCCu7JN5/WmJv6bBTpgbCuvz6LlQr6/pRMsWsShQPxal7JpgMAyVjLCdqL9byY+mJONQrWbpxPTWEHl9nZ9Mdw== + dependencies: + classnames "^2.2.6" + docsearch.js "^2.6.3" + +"@docusaurus/types@^2.0.0-alpha.40": + version "2.0.0-alpha.40" + resolved "https://registry.yarnpkg.com/@docusaurus/types/-/types-2.0.0-alpha.40.tgz#be0af577dd6f4ef3202620f7e21acc7843a56bee" + integrity sha512-CcEVeONauYMaqECauAwt9p9ux4r8C7ww+ipaSLxG9wwzeYVgoVPWnIDlKSBIyx2UBWzGz4er+V6eGpHLY15x8Q== + dependencies: + "@types/webpack" "^4.41.0" + commander "^4.0.1" + querystring "0.2.0" + +"@docusaurus/utils@^2.0.0-alpha.40": + version "2.0.0-alpha.40" + resolved "https://registry.yarnpkg.com/@docusaurus/utils/-/utils-2.0.0-alpha.40.tgz#fbbde31886ea1076a8d14e2133f07a6d35cf158e" + integrity sha512-MR1nD3o23PuyWuSX0n+bGXlGfWt08w1xrVDRb+J4M3LrOflSlgI2RaT2p3J7V/czNWcvfCjhknVNXqpVTViw6A== + dependencies: + escape-string-regexp "^2.0.0" + fs-extra "^8.1.0" + gray-matter "^4.0.2" + lodash "^4.17.15" + +"@endiliey/static-site-generator-webpack-plugin@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@endiliey/static-site-generator-webpack-plugin/-/static-site-generator-webpack-plugin-4.0.0.tgz#94bfe58fd83aeda355de797fcb5112adaca3a6b1" + integrity sha512-3MBqYCs30qk1OBRC697NqhGouYbs71D1B8hrk/AFJC6GwF2QaJOQZtA1JYAaGSe650sZ8r5ppRTtCRXepDWlng== + dependencies: + bluebird "^3.7.1" + cheerio "^0.22.0" + eval "^0.1.4" + url "^0.11.0" + webpack-sources "^1.4.3" + +"@hapi/address@2.x.x": + version "2.1.4" + resolved "https://registry.yarnpkg.com/@hapi/address/-/address-2.1.4.tgz#5d67ed43f3fd41a69d4b9ff7b56e7c0d1d0a81e5" + integrity sha512-QD1PhQk+s31P1ixsX0H0Suoupp3VMXzIVMSwobR3F3MSUO2YCV0B7xqLcUw/Bh8yuvd3LhpyqLQWTNcRmp6IdQ== + +"@hapi/bourne@1.x.x": + version "1.3.2" + resolved "https://registry.yarnpkg.com/@hapi/bourne/-/bourne-1.3.2.tgz#0a7095adea067243ce3283e1b56b8a8f453b242a" + integrity sha512-1dVNHT76Uu5N3eJNTYcvxee+jzX4Z9lfciqRRHCU27ihbUcYi+iSc2iml5Ke1LXe1SyJCLA0+14Jh4tXJgOppA== + +"@hapi/hoek@8.x.x", "@hapi/hoek@^8.3.0": + version "8.5.0" + resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-8.5.0.tgz#2f9ce301c8898e1c3248b0a8564696b24d1a9a5a" + integrity sha512-7XYT10CZfPsH7j9F1Jmg1+d0ezOux2oM2GfArAzLwWe4mE2Dr3hVjsAL6+TFY49RRJlCdJDMw3nJsLFroTc8Kw== + +"@hapi/joi@^15.1.0": + version "15.1.1" + resolved "https://registry.yarnpkg.com/@hapi/joi/-/joi-15.1.1.tgz#c675b8a71296f02833f8d6d243b34c57b8ce19d7" + integrity sha512-entf8ZMOK8sc+8YfeOlM8pCfg3b5+WZIKBfUaaJT8UsjAAPjartzxIYm3TIbjvA4u+u++KbcXD38k682nVHDAQ== + dependencies: + "@hapi/address" "2.x.x" + "@hapi/bourne" "1.x.x" + "@hapi/hoek" "8.x.x" + "@hapi/topo" "3.x.x" + +"@hapi/topo@3.x.x": + version "3.1.6" + resolved "https://registry.yarnpkg.com/@hapi/topo/-/topo-3.1.6.tgz#68d935fa3eae7fdd5ab0d7f953f3205d8b2bfc29" + integrity sha512-tAag0jEcjwH+P2quUfipd7liWCNX2F8NvYjQp2wtInsZxnMlypdw0FtAOLxtvvkO+GSRRbmNi8m/5y42PQJYCQ== + dependencies: + "@hapi/hoek" "^8.3.0" + +"@mdx-js/mdx@^1.5.1": + version "1.5.3" + resolved "https://registry.yarnpkg.com/@mdx-js/mdx/-/mdx-1.5.3.tgz#d0092d4e177331d4eaa65d60fa1f37e42fb251ea" + integrity sha512-XxnOvyCQKri52tgaCXbV5NWnZGqgRsRifa/yJrxwWa6QG3vdFiEi/xokBHBf/62RCKRK4+QmbM4dSl0fgWIRNA== + dependencies: + "@babel/core" "7.7.4" + "@babel/plugin-syntax-jsx" "7.7.4" + "@babel/plugin-syntax-object-rest-spread" "7.7.4" + "@mdx-js/util" "^1.5.3" + babel-plugin-apply-mdx-type-prop "^1.5.3" + babel-plugin-extract-import-names "^1.5.3" + camelcase-css "2.0.1" + detab "2.0.2" + hast-util-raw "5.0.1" + lodash.uniq "4.5.0" + mdast-util-to-hast "6.0.2" + remark-mdx "^1.5.3" + remark-parse "7.0.2" + remark-squeeze-paragraphs "3.0.4" + style-to-object "0.3.0" + unified "8.4.2" + unist-builder "1.0.4" + unist-util-visit "2.0.1" + +"@mdx-js/react@^1.5.1": + version "1.5.3" + resolved "https://registry.yarnpkg.com/@mdx-js/react/-/react-1.5.3.tgz#e58c458c72b4618f9c8e16d76136e62a6d517515" + integrity sha512-5bVLUsZybjmeYL8l4Uh/ysE8vMn0Vb0GKzki/LicaDHJvXr/N4Tjj0gT4tk1OzhcC5nGQAQGIyQMW5pvIjp9XQ== + +"@mdx-js/util@^1.5.3": + version "1.5.3" + resolved "https://registry.yarnpkg.com/@mdx-js/util/-/util-1.5.3.tgz#49f939313a8561814ef72c231257865aa127ca55" + integrity sha512-OXeOtHO+eN50QlIkm4Vj4vqNGtowv4FH9L21WvcbEM0eeZrb7aANiFTN70lBQEXcucxCMRkd/6IA9LxhotZEQw== + +"@mrmlnc/readdir-enhanced@^2.2.1": + version "2.2.1" + resolved "https://registry.yarnpkg.com/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz#524af240d1a360527b730475ecfa1344aa540dde" + integrity sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g== + dependencies: + call-me-maybe "^1.0.1" + glob-to-regexp "^0.3.0" + +"@nodelib/fs.scandir@2.1.3": + version "2.1.3" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz#3a582bdb53804c6ba6d146579c46e52130cf4a3b" + integrity sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw== + dependencies: + "@nodelib/fs.stat" "2.0.3" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.3", "@nodelib/fs.stat@^2.0.2": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz#34dc5f4cabbc720f4e60f75a747e7ecd6c175bd3" + integrity sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA== + +"@nodelib/fs.stat@^1.1.2": + version "1.1.3" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz#2b5a3ab3f918cca48a8c754c08168e3f03eba61b" + integrity sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw== + +"@nodelib/fs.walk@^1.2.3": + version "1.2.4" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz#011b9202a70a6366e436ca5c065844528ab04976" + integrity sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ== + dependencies: + "@nodelib/fs.scandir" "2.1.3" + fastq "^1.6.0" + +"@types/anymatch@*": + version "1.3.1" + resolved "https://registry.yarnpkg.com/@types/anymatch/-/anymatch-1.3.1.tgz#336badc1beecb9dacc38bea2cf32adf627a8421a" + integrity sha512-/+CRPXpBDpo2RK9C68N3b2cOvO0Cf5B9aPijHsoDQTHivnGSObdOF2BRQOYjojWTDy6nQvMjmqRXIxH55VjxxA== + +"@types/color-name@^1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0" + integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ== + +"@types/events@*": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/events/-/events-3.0.0.tgz#2862f3f58a9a7f7c3e78d79f130dd4d71c25c2a7" + integrity sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g== + +"@types/glob@^7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.1.tgz#aa59a1c6e3fbc421e07ccd31a944c30eba521575" + integrity sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w== + dependencies: + "@types/events" "*" + "@types/minimatch" "*" + "@types/node" "*" + +"@types/minimatch@*": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" + integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA== + +"@types/node@*": + version "13.1.6" + resolved "https://registry.yarnpkg.com/@types/node/-/node-13.1.6.tgz#076028d0b0400be8105b89a0a55550c86684ffec" + integrity sha512-Jg1F+bmxcpENHP23sVKkNuU3uaxPnsBMW0cLjleiikFKomJQbsn0Cqk2yDvQArqzZN6ABfBkZ0To7pQ8sLdWDg== + +"@types/q@^1.5.1": + version "1.5.2" + resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.2.tgz#690a1475b84f2a884fd07cd797c00f5f31356ea8" + integrity sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw== + +"@types/source-list-map@*": + version "0.1.2" + resolved "https://registry.yarnpkg.com/@types/source-list-map/-/source-list-map-0.1.2.tgz#0078836063ffaf17412349bba364087e0ac02ec9" + integrity sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA== + +"@types/tapable@*": + version "1.0.5" + resolved "https://registry.yarnpkg.com/@types/tapable/-/tapable-1.0.5.tgz#9adbc12950582aa65ead76bffdf39fe0c27a3c02" + integrity sha512-/gG2M/Imw7cQFp8PGvz/SwocNrmKFjFsm5Pb8HdbHkZ1K8pmuPzOX4VeVoiEecFCVf4CsN1r3/BRvx+6sNqwtQ== + +"@types/uglify-js@*": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@types/uglify-js/-/uglify-js-3.0.4.tgz#96beae23df6f561862a830b4288a49e86baac082" + integrity sha512-SudIN9TRJ+v8g5pTG8RRCqfqTMNqgWCKKd3vtynhGzkIIjxaicNAMuY5TRadJ6tzDu3Dotf3ngaMILtmOdmWEQ== + dependencies: + source-map "^0.6.1" + +"@types/unist@^2.0.0", "@types/unist@^2.0.2": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.3.tgz#9c088679876f374eb5983f150d4787aa6fb32d7e" + integrity sha512-FvUupuM3rlRsRtCN+fDudtmytGO6iHJuuRKS1Ss0pG5z8oX0diNEw94UEL7hgDbpN94rgaK5R7sWm6RrSkZuAQ== + +"@types/webpack-sources@*": + version "0.1.5" + resolved "https://registry.yarnpkg.com/@types/webpack-sources/-/webpack-sources-0.1.5.tgz#be47c10f783d3d6efe1471ff7f042611bd464a92" + integrity sha512-zfvjpp7jiafSmrzJ2/i3LqOyTYTuJ7u1KOXlKgDlvsj9Rr0x7ZiYu5lZbXwobL7lmsRNtPXlBfmaUD8eU2Hu8w== + dependencies: + "@types/node" "*" + "@types/source-list-map" "*" + source-map "^0.6.1" + +"@types/webpack@^4.41.0": + version "4.41.2" + resolved "https://registry.yarnpkg.com/@types/webpack/-/webpack-4.41.2.tgz#c6faf0111de27afdffe1158dac559e447c273516" + integrity sha512-DNMQOfEvwzWRRyp6Wy9QVCgJ3gkelZsuBE2KUD318dg95s9DKGiT5CszmmV58hq8jk89I9NClre48AEy1MWAJA== + dependencies: + "@types/anymatch" "*" + "@types/node" "*" + "@types/tapable" "*" + "@types/uglify-js" "*" + "@types/webpack-sources" "*" + source-map "^0.6.0" + +"@webassemblyjs/ast@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.8.5.tgz#51b1c5fe6576a34953bf4b253df9f0d490d9e359" + integrity sha512-aJMfngIZ65+t71C3y2nBBg5FFG0Okt9m0XEgWZ7Ywgn1oMAT8cNwx00Uv1cQyHtidq0Xn94R4TAywO+LCQ+ZAQ== + dependencies: + "@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@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.8.5.tgz#1ba926a2923613edce496fd5b02e8ce8a5f49721" + integrity sha512-9p+79WHru1oqBh9ewP9zW95E3XAo+90oth7S5Re3eQnECGq59ly1Ri5tsIipKGpiStHsUYmY3zMLqtk3gTcOtQ== + +"@webassemblyjs/helper-api-error@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.8.5.tgz#c49dad22f645227c5edb610bdb9697f1aab721f7" + integrity sha512-Za/tnzsvnqdaSPOUXHyKJ2XI7PDX64kWtURyGiJJZKVEdFOsdKUCPTNEVFZq3zJ2R0G5wc2PZ5gvdTRFgm81zA== + +"@webassemblyjs/helper-buffer@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.8.5.tgz#fea93e429863dd5e4338555f42292385a653f204" + integrity sha512-Ri2R8nOS0U6G49Q86goFIPNgjyl6+oE1abW1pS84BuhP1Qcr5JqMwRFT3Ah3ADDDYGEgGs1iyb1DGX+kAi/c/Q== + +"@webassemblyjs/helper-code-frame@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.8.5.tgz#9a740ff48e3faa3022b1dff54423df9aa293c25e" + integrity sha512-VQAadSubZIhNpH46IR3yWO4kZZjMxN1opDrzePLdVKAZ+DFjkGD/rf4v1jap744uPVU6yjL/smZbRIIJTOUnKQ== + dependencies: + "@webassemblyjs/wast-printer" "1.8.5" + +"@webassemblyjs/helper-fsm@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.8.5.tgz#ba0b7d3b3f7e4733da6059c9332275d860702452" + integrity sha512-kRuX/saORcg8se/ft6Q2UbRpZwP4y7YrWsLXPbbmtepKr22i8Z4O3V5QE9DbZK908dh5Xya4Un57SDIKwB9eow== + +"@webassemblyjs/helper-module-context@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.8.5.tgz#def4b9927b0101dc8cbbd8d1edb5b7b9c82eb245" + integrity sha512-/O1B236mN7UNEU4t9X7Pj38i4VoU8CcMHyy3l2cV/kIF4U5KoHXDVqcDuOs1ltkac90IM4vZdHc52t1x8Yfs3g== + dependencies: + "@webassemblyjs/ast" "1.8.5" + mamacro "^0.0.3" + +"@webassemblyjs/helper-wasm-bytecode@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.8.5.tgz#537a750eddf5c1e932f3744206551c91c1b93e61" + integrity sha512-Cu4YMYG3Ddl72CbmpjU/wbP6SACcOPVbHN1dI4VJNJVgFwaKf1ppeFJrwydOG3NDHxVGuCfPlLZNyEdIYlQ6QQ== + +"@webassemblyjs/helper-wasm-section@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.8.5.tgz#74ca6a6bcbe19e50a3b6b462847e69503e6bfcbf" + integrity sha512-VV083zwR+VTrIWWtgIUpqfvVdK4ff38loRmrdDBgBT8ADXYsEZ5mPQ4Nde90N3UYatHdYoDIFb7oHzMncI02tA== + dependencies: + "@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@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.8.5.tgz#712329dbef240f36bf57bd2f7b8fb9bf4154421e" + integrity sha512-aaCvQYrvKbY/n6wKHb/ylAJr27GglahUO89CcGXMItrOBqRarUMxWLJgxm9PJNuKULwN5n1csT9bYoMeZOGF3g== + dependencies: + "@xtuc/ieee754" "^1.2.0" + +"@webassemblyjs/leb128@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.8.5.tgz#044edeb34ea679f3e04cd4fd9824d5e35767ae10" + integrity sha512-plYUuUwleLIziknvlP8VpTgO4kqNaH57Y3JnNa6DLpu/sGcP6hbVdfdX5aHAV716pQBKrfuU26BJK29qY37J7A== + dependencies: + "@xtuc/long" "4.2.2" + +"@webassemblyjs/utf8@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.8.5.tgz#a8bf3b5d8ffe986c7c1e373ccbdc2a0915f0cedc" + integrity sha512-U7zgftmQriw37tfD934UNInokz6yTmn29inT2cAetAsaU9YeVCveWEwhKL1Mg4yS7q//NGdzy79nlXh3bT8Kjw== + +"@webassemblyjs/wasm-edit@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.8.5.tgz#962da12aa5acc1c131c81c4232991c82ce56e01a" + integrity sha512-A41EMy8MWw5yvqj7MQzkDjU29K7UJq1VrX2vWLzfpRHt3ISftOXqrtojn7nlPsZ9Ijhp5NwuODuycSvfAO/26Q== + dependencies: + "@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@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.8.5.tgz#54840766c2c1002eb64ed1abe720aded714f98bc" + integrity sha512-BCZBT0LURC0CXDzj5FXSc2FPTsxwp3nWcqXQdOZE4U7h7i8FqtFK5Egia6f9raQLpEKT1VL7zr4r3+QX6zArWg== + dependencies: + "@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@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.8.5.tgz#b24d9f6ba50394af1349f510afa8ffcb8a63d264" + integrity sha512-HKo2mO/Uh9A6ojzu7cjslGaHaUU14LdLbGEKqTR7PBKwT6LdPtLLh9fPY33rmr5wcOMrsWDbbdCHq4hQUdd37Q== + dependencies: + "@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@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.8.5.tgz#21576f0ec88b91427357b8536383668ef7c66b8d" + integrity sha512-pi0SYE9T6tfcMkthwcgCpL0cM9nRYr6/6fjgDtL6q/ZqKHdMWvxitRi5JcZ7RI4SNJJYnYNaWy5UUrHQy998lw== + dependencies: + "@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@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.8.5.tgz#e10eecd542d0e7bd394f6827c49f3df6d4eefb8c" + integrity sha512-daXC1FyKWHF1i11obK086QRlsMsY4+tIOKgBqI1lxAnkp9xe9YMcgOxm9kLe+ttjs5aWV2KKE1TWJCN57/Btsg== + dependencies: + "@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@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.8.5.tgz#114bbc481fd10ca0e23b3560fa812748b0bae5bc" + integrity sha512-w0U0pD4EhlnvRyeJzBqaVSJAo9w/ce7/WPogeXLzGkO6hzhr4GnQIZ4W4uUt5b9ooAaXPtnXlj0gzsXEOUNYMg== + dependencies: + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/wast-parser" "1.8.5" + "@xtuc/long" "4.2.2" + +"@xtuc/ieee754@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" + integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== + +"@xtuc/long@4.2.2": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" + integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== + +abbrev@1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" + integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== + +accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.7: + version "1.3.7" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" + integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA== + dependencies: + mime-types "~2.1.24" + negotiator "0.6.2" + +acorn-walk@^6.1.1: + version "6.2.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-6.2.0.tgz#123cb8f3b84c2171f1f7fb252615b1c78a6b1a8c" + integrity sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA== + +acorn@^6.0.7, acorn@^6.2.1: + version "6.4.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.0.tgz#b659d2ffbafa24baf5db1cdbb2c94a983ecd2784" + integrity sha512-gac8OEcQ2Li1dxIEWGZzsp2BitJxwkwcOm0zHAJLcPJaVvm58FRnk6RkuLRpU1EujipU2ZFODv2P9DLMfnV8mw== + +address@1.1.2, address@^1.0.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/address/-/address-1.1.2.tgz#bf1116c9c758c51b7a933d296b72c221ed9428b6" + integrity sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA== + +agentkeepalive@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-2.2.0.tgz#c5d1bd4b129008f1163f236f86e5faea2026e2ef" + integrity sha1-xdG9SxKQCPEWPyNvhuX66iAm4u8= + +aggregate-error@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.0.1.tgz#db2fe7246e536f40d9b5442a39e117d7dd6a24e0" + integrity sha512-quoaXsZ9/BLNae5yiNoUz+Nhkwz83GhWwtYFglcjEQB2NDHCIpApbqXxIFnm4Pq/Nvhrsq5sYJFyohrrxnTGAA== + dependencies: + clean-stack "^2.0.0" + indent-string "^4.0.0" + +ajv-errors@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d" + integrity sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ== + +ajv-keywords@^3.1.0, ajv-keywords@^3.4.1: + version "3.4.1" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.4.1.tgz#ef916e271c64ac12171fd8384eaae6b2345854da" + integrity sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ== + +ajv@^6.1.0, ajv@^6.10.2, ajv@^6.5.5: + version "6.10.2" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.10.2.tgz#d3cea04d6b017b2894ad69040fec8b623eb4bd52" + integrity sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw== + dependencies: + fast-deep-equal "^2.0.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +algoliasearch@^3.24.5: + version "3.35.1" + resolved "https://registry.yarnpkg.com/algoliasearch/-/algoliasearch-3.35.1.tgz#297d15f534a3507cab2f5dfb996019cac7568f0c" + integrity sha512-K4yKVhaHkXfJ/xcUnil04xiSrB8B8yHZoFEhWNpXg23eiCnqvTZw1tn/SqvdsANlYHLJlKl0qi3I/Q2Sqo7LwQ== + dependencies: + agentkeepalive "^2.2.0" + debug "^2.6.9" + envify "^4.0.0" + es6-promise "^4.1.0" + events "^1.1.0" + foreach "^2.0.5" + global "^4.3.2" + inherits "^2.0.1" + isarray "^2.0.1" + load-script "^1.0.0" + object-keys "^1.0.11" + querystring-es3 "^0.2.1" + reduce "^1.0.1" + semver "^5.1.0" + tunnel-agent "^0.6.0" + +alphanum-sort@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3" + integrity sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM= + +ansi-colors@^3.0.0: + version "3.2.4" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.4.tgz#e3a3da4bfbae6c86a9c285625de124a234026fbf" + integrity sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA== + +ansi-escapes@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" + integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== + +ansi-escapes@^4.2.1: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.0.tgz#a4ce2b33d6b214b7950d8595c212f12ac9cc569d" + integrity sha512-EiYhwo0v255HUL6eDyuLrXEkTi7WwVCLAw+SeOQ7M7qdun1z1pum4DEm/nuqIVbPvi9RPPc9k9LbyBv6H0DwVg== + dependencies: + type-fest "^0.8.1" + +ansi-html@0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/ansi-html/-/ansi-html-0.0.7.tgz#813584021962a9e9e6fd039f940d12f56ca7859e" + integrity sha1-gTWEAhliqenm/QOflA0S9WynhZ4= + +ansi-regex@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= + +ansi-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" + integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= + +ansi-regex@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" + integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== + +ansi-regex@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" + integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== + +ansi-styles@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" + integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= + +ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.2.1.tgz#90ae75c424d008d2624c5bf29ead3177ebfcf359" + integrity sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA== + dependencies: + "@types/color-name" "^1.1.1" + color-convert "^2.0.1" + +anymatch@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" + integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw== + dependencies: + micromatch "^3.1.4" + normalize-path "^2.1.1" + +anymatch@~3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.1.tgz#c55ecf02185e2469259399310c173ce31233b142" + integrity sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +aproba@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" + integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== + +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + +arr-diff@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" + integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= + +arr-flatten@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" + integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== + +arr-union@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" + integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= + +array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" + integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= + +array-flatten@^2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.2.tgz#24ef80a28c1a893617e2149b0c6d0d788293b099" + integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== + +array-union@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" + integrity sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk= + dependencies: + array-uniq "^1.0.1" + +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + +array-uniq@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" + integrity sha1-r2rId6Jcx/dOBYiUdThY39sk/bY= + +array-unique@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" + integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= + +arrify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" + integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0= + +asn1.js@^4.0.0: + version "4.10.1" + resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.10.1.tgz#b9c2bf5805f1e64aadeed6df3a2bfafb5a73f5a0" + integrity sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw== + dependencies: + bn.js "^4.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + +asn1@~0.2.3: + version "0.2.4" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" + integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg== + dependencies: + safer-buffer "~2.1.0" + +assert-plus@1.0.0, assert-plus@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= + +assert@^1.1.1: + version "1.5.0" + resolved "https://registry.yarnpkg.com/assert/-/assert-1.5.0.tgz#55c109aaf6e0aefdb3dc4b71240c70bf574b18eb" + integrity sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA== + dependencies: + object-assign "^4.1.1" + util "0.10.3" + +assign-symbols@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" + integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= + +async-each@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" + integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ== + +async-limiter@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" + integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== + +async@^2.6.2: + version "2.6.3" + resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff" + integrity sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg== + dependencies: + lodash "^4.17.14" + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= + +atob@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" + integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== + +autocomplete.js@0.36.0: + version "0.36.0" + resolved "https://registry.yarnpkg.com/autocomplete.js/-/autocomplete.js-0.36.0.tgz#94fe775fe64b6cd42e622d076dc7fd26bedd837b" + integrity sha512-jEwUXnVMeCHHutUt10i/8ZiRaCb0Wo+ZyKxeGsYwBDtw6EJHqEeDrq4UwZRD8YBSvp3g6klP678il2eeiVXN2Q== + dependencies: + immediate "^3.2.3" + +autoprefixer@^9.6.1: + version "9.7.3" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.7.3.tgz#fd42ed03f53de9beb4ca0d61fb4f7268a9bb50b4" + integrity sha512-8T5Y1C5Iyj6PgkPSFd0ODvK9DIleuPKUPYniNxybS47g2k2wFgLZ46lGQHlBuGKIAEV8fbCDfKCCRS1tvOgc3Q== + dependencies: + browserslist "^4.8.0" + caniuse-lite "^1.0.30001012" + chalk "^2.4.2" + normalize-range "^0.1.2" + num2fraction "^1.2.2" + postcss "^7.0.23" + postcss-value-parser "^4.0.2" + +aws-sign2@~0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" + integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= + +aws4@^1.8.0: + version "1.9.1" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.9.1.tgz#7e33d8f7d449b3f673cd72deb9abdc552dbe528e" + integrity sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug== + +babel-code-frame@^6.22.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" + integrity sha1-Y/1D99weO7fONZR9uP42mj9Yx0s= + dependencies: + chalk "^1.1.3" + esutils "^2.0.2" + js-tokens "^3.0.2" + +babel-loader@^8.0.6: + version "8.0.6" + resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.0.6.tgz#e33bdb6f362b03f4bb141a0c21ab87c501b70dfb" + integrity sha512-4BmWKtBOBm13uoUwd08UwjZlaw3O9GWf456R9j+5YykFZ6LUIjIKLc0zEZf+hauxPOJs96C8k6FvYD09vWzhYw== + dependencies: + find-cache-dir "^2.0.0" + loader-utils "^1.0.2" + mkdirp "^0.5.1" + pify "^4.0.1" + +babel-plugin-apply-mdx-type-prop@^1.5.3: + version "1.5.3" + resolved "https://registry.yarnpkg.com/babel-plugin-apply-mdx-type-prop/-/babel-plugin-apply-mdx-type-prop-1.5.3.tgz#1f460e0fffae70ec999ca17530ddd876d2b677c8" + integrity sha512-9G+V0R8Jx56nHdEnWvRmSN//rFXMDiBZynu9JPuu3KVUhZhaJMgx5CTiXcdR2P//c85Q/IuwPbH0vIGrjdSq8A== + dependencies: + "@babel/helper-plugin-utils" "7.0.0" + "@mdx-js/util" "^1.5.3" + +babel-plugin-dynamic-import-node@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.0.tgz#f00f507bdaa3c3e3ff6e7e5e98d90a7acab96f7f" + integrity sha512-o6qFkpeQEBxcqt0XYlWzAVxNCSCZdUgcR8IRlhD/8DylxjjO4foPcvTW0GGKa/cVt3rvxZ7o5ippJ+/0nvLhlQ== + dependencies: + object.assign "^4.1.0" + +babel-plugin-extract-import-names@^1.5.3: + version "1.5.3" + resolved "https://registry.yarnpkg.com/babel-plugin-extract-import-names/-/babel-plugin-extract-import-names-1.5.3.tgz#5c4e099d16bd29fe7d8ca6738a532fb1809d7428" + integrity sha512-UPgDHjNb4hr2xYRWO8C8JPX7GO+q3gluKd3pkcmVcd1gn9bdO7/yE5FKnYe1UkCPY7PhEUOpEzHCSuIy3GMpsQ== + dependencies: + "@babel/helper-plugin-utils" "7.0.0" + +bail@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/bail/-/bail-1.0.4.tgz#7181b66d508aa3055d3f6c13f0a0c720641dde9b" + integrity sha512-S8vuDB4w6YpRhICUDET3guPlQpaJl7od94tpZ0Fvnyp+MKW/HyDTcRDck+29C9g+d/qQHnddRH3+94kZdrW0Ww== + +balanced-match@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" + integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= + +base64-js@^1.0.2: + version "1.3.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.1.tgz#58ece8cb75dd07e71ed08c736abc5fac4dbf8df1" + integrity sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g== + +base@^0.11.1: + version "0.11.2" + resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" + integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== + dependencies: + 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" + +batch@0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16" + integrity sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY= + +bcrypt-pbkdf@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" + integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= + dependencies: + tweetnacl "^0.14.3" + +bfj@^6.1.1: + version "6.1.2" + resolved "https://registry.yarnpkg.com/bfj/-/bfj-6.1.2.tgz#325c861a822bcb358a41c78a33b8e6e2086dde7f" + integrity sha512-BmBJa4Lip6BPRINSZ0BPEIfB1wUY/9rwbwvIHQA1KjX9om29B6id0wnWXq7m3bn5JrUVjeOTnVuhPT1FiHwPGw== + dependencies: + bluebird "^3.5.5" + check-types "^8.0.3" + hoopy "^0.1.4" + tryer "^1.0.1" + +big.js@^5.2.2: + version "5.2.2" + resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" + integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== + +binary-extensions@^1.0.0: + version "1.13.1" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65" + integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw== + +binary-extensions@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.0.0.tgz#23c0df14f6a88077f5f986c0d167ec03c3d5537c" + integrity sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow== + +bindings@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" + integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== + dependencies: + file-uri-to-path "1.0.0" + +bluebird@^3.5.5, bluebird@^3.7.1: + version "3.7.2" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" + integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== + +bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0: + version "4.11.8" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f" + integrity sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA== + +body-parser@1.19.0: + version "1.19.0" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a" + integrity sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw== + dependencies: + 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" + +bonjour@^3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/bonjour/-/bonjour-3.5.0.tgz#8e890a183d8ee9a2393b3844c691a42bcf7bc9f5" + integrity sha1-jokKGD2O6aI5OzhExpGkK897yfU= + dependencies: + 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@^1.0.0, boolbase@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" + integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24= + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^2.3.1, braces@^2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" + integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== + dependencies: + 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" + +braces@^3.0.1, braces@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +brorand@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" + integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= + +browserify-aes@^1.0.0, browserify-aes@^1.0.4: + version "1.2.0" + resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" + integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== + dependencies: + 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@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0" + integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w== + dependencies: + browserify-aes "^1.0.4" + browserify-des "^1.0.0" + evp_bytestokey "^1.0.0" + +browserify-des@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c" + integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A== + dependencies: + cipher-base "^1.0.1" + des.js "^1.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +browserify-rsa@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524" + integrity sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ= + dependencies: + bn.js "^4.1.0" + randombytes "^2.0.1" + +browserify-sign@^4.0.0: + version "4.0.4" + resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.0.4.tgz#aa4eb68e5d7b658baa6bf6a57e630cbd7a93d298" + integrity sha1-qk62jl17ZYuqa/alfmMMvXqT0pg= + dependencies: + 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@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f" + integrity sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA== + dependencies: + pako "~1.0.5" + +browserslist@4.7.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.7.0.tgz#9ee89225ffc07db03409f2fee524dc8227458a17" + integrity sha512-9rGNDtnj+HaahxiVV38Gn8n8Lr8REKsel68v1sPFfIGEK6uSXTY3h9acgiT1dZVtOOUtifo/Dn8daDQ5dUgVsA== + dependencies: + caniuse-lite "^1.0.30000989" + electron-to-chromium "^1.3.247" + node-releases "^1.1.29" + +browserslist@^4.0.0, browserslist@^4.6.4, browserslist@^4.8.0, browserslist@^4.8.2, browserslist@^4.8.3: + version "4.8.3" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.8.3.tgz#65802fcd77177c878e015f0e3189f2c4f627ba44" + integrity sha512-iU43cMMknxG1ClEZ2MDKeonKE1CCrFVkQK2AqO2YWFmvIrx4JWrvQ4w4hQez6EpVI8rHTtqh/ruHHDHSOKxvUg== + dependencies: + caniuse-lite "^1.0.30001017" + electron-to-chromium "^1.3.322" + node-releases "^1.1.44" + +buffer-from@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" + integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== + +buffer-indexof@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/buffer-indexof/-/buffer-indexof-1.1.1.tgz#52fabcc6a606d1a00302802648ef68f639da268c" + integrity sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g== + +buffer-json@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/buffer-json/-/buffer-json-2.0.0.tgz#f73e13b1e42f196fe2fd67d001c7d7107edd7c23" + integrity sha512-+jjPFVqyfF1esi9fvfUs3NqM0pH1ziZ36VP4hmA/y/Ssfo/5w5xHKfTw9BwQjoJ1w/oVtpLomqwUHKdefGyuHw== + +buffer-xor@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" + integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk= + +buffer@^4.3.0: + version "4.9.2" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.2.tgz#230ead344002988644841ab0244af8c44bbe3ef8" + integrity sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg== + dependencies: + base64-js "^1.0.2" + ieee754 "^1.1.4" + isarray "^1.0.0" + +builtin-status-codes@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" + integrity sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug= + +bytes@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" + integrity sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg= + +bytes@3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" + integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== + +cacache@^12.0.2, cacache@^12.0.3: + version "12.0.3" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-12.0.3.tgz#be99abba4e1bf5df461cd5a2c1071fc432573390" + integrity sha512-kqdmfXEGFepesTuROHMs3MpFLWrPkSSpRqOw80RCflZXy/khxaArvFrQ7uJxSUduzAufc6G0g1VUCOZXxWavPw== + dependencies: + bluebird "^3.5.5" + chownr "^1.1.1" + figgy-pudding "^3.5.1" + glob "^7.1.4" + graceful-fs "^4.1.15" + infer-owner "^1.0.3" + 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" + +cacache@^13.0.1: + version "13.0.1" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-13.0.1.tgz#a8000c21697089082f85287a1aec6e382024a71c" + integrity sha512-5ZvAxd05HDDU+y9BVvcqYu2LLXmPnQ0hW62h32g4xBTgL/MppR4/04NHfj/ycM2y6lmTnbw6HVi+1eN0Psba6w== + dependencies: + chownr "^1.1.2" + figgy-pudding "^3.5.1" + fs-minipass "^2.0.0" + glob "^7.1.4" + graceful-fs "^4.2.2" + infer-owner "^1.0.4" + lru-cache "^5.1.1" + minipass "^3.0.0" + minipass-collect "^1.0.2" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.2" + mkdirp "^0.5.1" + move-concurrently "^1.0.1" + p-map "^3.0.0" + promise-inflight "^1.0.1" + rimraf "^2.7.1" + ssri "^7.0.0" + unique-filename "^1.1.1" + +cache-base@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" + integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== + dependencies: + 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" + +cache-loader@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/cache-loader/-/cache-loader-4.1.0.tgz#9948cae353aec0a1fcb1eafda2300816ec85387e" + integrity sha512-ftOayxve0PwKzBF/GLsZNC9fJBXl8lkZE3TOsjkboHfVHVkL39iUEs1FO07A33mizmci5Dudt38UZrrYXDtbhw== + dependencies: + buffer-json "^2.0.0" + find-cache-dir "^3.0.0" + loader-utils "^1.2.3" + mkdirp "^0.5.1" + neo-async "^2.6.1" + schema-utils "^2.0.0" + +call-me-maybe@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/call-me-maybe/-/call-me-maybe-1.0.1.tgz#26d208ea89e37b5cbde60250a15f031c16a4d66b" + integrity sha1-JtII6onje1y95gJQoV8DHBak1ms= + +caller-callsite@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/caller-callsite/-/caller-callsite-2.0.0.tgz#847e0fce0a223750a9a027c54b33731ad3154134" + integrity sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ= + dependencies: + callsites "^2.0.0" + +caller-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-2.0.0.tgz#468f83044e369ab2010fac5f06ceee15bb2cb1f4" + integrity sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ= + dependencies: + caller-callsite "^2.0.0" + +callsites@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50" + integrity sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA= + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +camel-case@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-3.0.0.tgz#ca3c3688a4e9cf3a4cda777dc4dcbc713249cf73" + integrity sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M= + dependencies: + no-case "^2.2.0" + upper-case "^1.1.1" + +camelcase-css@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/camelcase-css/-/camelcase-css-2.0.1.tgz#ee978f6947914cc30c6b44741b6ed1df7f043fd5" + integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA== + +camelcase@^5.0.0, camelcase@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + +caniuse-api@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-3.0.0.tgz#5e4d90e2274961d46291997df599e3ed008ee4c0" + integrity sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw== + dependencies: + browserslist "^4.0.0" + caniuse-lite "^1.0.0" + lodash.memoize "^4.1.2" + lodash.uniq "^4.5.0" + +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000981, caniuse-lite@^1.0.30000989, caniuse-lite@^1.0.30001012, caniuse-lite@^1.0.30001017: + version "1.0.30001020" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001020.tgz#3f04c1737500ffda78be9beb0b5c1e2070e15926" + integrity sha512-yWIvwA68wRHKanAVS1GjN8vajAv7MBFshullKCeq/eKpK7pJBVDgFFEqvgWTkcP2+wIDeQGYFRXECjKZnLkUjA== + +caseless@~0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= + +ccount@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/ccount/-/ccount-1.0.4.tgz#9cf2de494ca84060a2a8d2854edd6dfb0445f386" + integrity sha512-fpZ81yYfzentuieinmGnphk0pLkOTMm6MZdVqwd77ROvhko6iujLNGrHH5E7utq3ygWklwfmwuG+A7P+NpqT6w== + +chalk@2.4.2, chalk@^2.0.0, chalk@^2.4.1, chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" + integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= + dependencies: + ansi-styles "^2.2.1" + escape-string-regexp "^1.0.2" + has-ansi "^2.0.0" + strip-ansi "^3.0.0" + supports-color "^2.0.0" + +chalk@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" + integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +character-entities-legacy@^1.0.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/character-entities-legacy/-/character-entities-legacy-1.1.3.tgz#3c729991d9293da0ede6dddcaf1f2ce1009ee8b4" + integrity sha512-YAxUpPoPwxYFsslbdKkhrGnXAtXoHNgYjlBM3WMXkWGTl5RsY3QmOyhwAgL8Nxm9l5LBThXGawxKPn68y6/fww== + +character-entities@^1.0.0: + version "1.2.3" + resolved "https://registry.yarnpkg.com/character-entities/-/character-entities-1.2.3.tgz#bbed4a52fe7ef98cc713c6d80d9faa26916d54e6" + integrity sha512-yB4oYSAa9yLcGyTbB4ItFwHw43QHdH129IJ5R+WvxOkWlyFnR5FAaBNnUq4mcxsTVZGh28bHoeTHMKXH1wZf3w== + +character-reference-invalid@^1.0.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/character-reference-invalid/-/character-reference-invalid-1.1.3.tgz#1647f4f726638d3ea4a750cf5d1975c1c7919a85" + integrity sha512-VOq6PRzQBam/8Jm6XBGk2fNEnHXAdGd6go0rtd4weAGECBamHDwwCQSOT12TACIYUZegUXnV6xBXqUssijtxIg== + +chardet@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" + integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== + +check-types@^8.0.3: + version "8.0.3" + resolved "https://registry.yarnpkg.com/check-types/-/check-types-8.0.3.tgz#3356cca19c889544f2d7a95ed49ce508a0ecf552" + integrity sha512-YpeKZngUmG65rLudJ4taU7VLkOCTMhNl/u4ctNC56LQS/zJTyNH0Lrtwm1tfTsbLlwvlfsA2d1c8vCf/Kh2KwQ== + +cheerio@^0.22.0: + version "0.22.0" + resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-0.22.0.tgz#a9baa860a3f9b595a6b81b1a86873121ed3a269e" + integrity sha1-qbqoYKP5tZWmuBsahocxIe06Jp4= + dependencies: + css-select "~1.2.0" + dom-serializer "~0.1.0" + entities "~1.1.1" + htmlparser2 "^3.9.1" + lodash.assignin "^4.0.9" + lodash.bind "^4.1.4" + lodash.defaults "^4.0.1" + lodash.filter "^4.4.0" + lodash.flatten "^4.2.0" + lodash.foreach "^4.3.0" + lodash.map "^4.4.0" + lodash.merge "^4.4.0" + lodash.pick "^4.2.1" + lodash.reduce "^4.4.0" + lodash.reject "^4.4.0" + lodash.some "^4.4.0" + +chokidar@^2.0.2, chokidar@^2.0.4, chokidar@^2.1.8: + version "2.1.8" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917" + integrity sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg== + dependencies: + anymatch "^2.0.0" + async-each "^1.0.1" + braces "^2.3.2" + 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" + optionalDependencies: + fsevents "^1.2.7" + +chokidar@^3.3.0: + version "3.3.1" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.3.1.tgz#c84e5b3d18d9a4d77558fef466b1bf16bbeb3450" + integrity sha512-4QYCEWOcK3OJrxwvyyAOxFuhpvOVCYkr33LPfFNBjAD/w3sEzWsp2BUOkI4l9bHvWioAd0rc6NlHUOEaWkTeqg== + dependencies: + anymatch "~3.1.1" + braces "~3.0.2" + glob-parent "~5.1.0" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.3.0" + optionalDependencies: + fsevents "~2.1.2" + +chownr@^1.1.1, chownr@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.3.tgz#42d837d5239688d55f303003a508230fa6727142" + integrity sha512-i70fVHhmV3DtTl6nqvZOnIjbY0Pe4kAUjwHj8z0zAdgBtYrJyYwLKCCuRBQ5ppkyL0AkN7HKRnETdmdp1zqNXw== + +chrome-trace-event@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz#234090ee97c7d4ad1a2c4beae27505deffc608a4" + integrity sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ== + dependencies: + tslib "^1.9.0" + +ci-info@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.6.0.tgz#2ca20dbb9ceb32d4524a683303313f0304b1e497" + integrity sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A== + +cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" + integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +class-utils@^0.3.5: + version "0.3.6" + resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" + integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== + dependencies: + arr-union "^3.1.0" + define-property "^0.2.5" + isobject "^3.0.0" + static-extend "^0.1.1" + +classnames@^2.2.5, classnames@^2.2.6: + version "2.2.6" + resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.2.6.tgz#43935bffdd291f326dad0a205309b38d00f650ce" + integrity sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q== + +clean-css@^4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.2.1.tgz#2d411ef76b8569b6d0c84068dabe85b0aa5e5c17" + integrity sha512-4ZxI6dy4lrY6FHzfiy1aEOXgu4LIsW2MhwG0VBKdcoGoH/XLFgaHSdLTGr4O8Be6A8r3MOphEiI8Gc1n0ecf3g== + dependencies: + source-map "~0.6.0" + +clean-stack@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" + integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== + +cli-cursor@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" + integrity sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU= + dependencies: + restore-cursor "^2.0.0" + +cli-width@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" + integrity sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk= + +clipboard@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/clipboard/-/clipboard-2.0.4.tgz#836dafd66cf0fea5d71ce5d5b0bf6e958009112d" + integrity sha512-Vw26VSLRpJfBofiVaFb/I8PVfdI1OxKcYShe6fm0sP/DtmiWQNCjhM/okTvdCo0G+lMMm1rMYbk4IK4x1X+kgQ== + dependencies: + good-listener "^1.2.2" + select "^1.1.2" + tiny-emitter "^2.0.0" + +cliui@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.1.0.tgz#348422dbe82d800b3022eef4f6ac10bf2e4d1b49" + integrity sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ== + dependencies: + string-width "^2.1.1" + strip-ansi "^4.0.0" + wrap-ansi "^2.0.0" + +coa@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/coa/-/coa-2.0.2.tgz#43f6c21151b4ef2bf57187db0d73de229e3e7ec3" + integrity sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA== + dependencies: + "@types/q" "^1.5.1" + chalk "^2.4.1" + q "^1.1.2" + +code-point-at@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" + integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= + +collapse-white-space@^1.0.0, collapse-white-space@^1.0.2: + version "1.0.5" + resolved "https://registry.yarnpkg.com/collapse-white-space/-/collapse-white-space-1.0.5.tgz#c2495b699ab1ed380d29a1091e01063e75dbbe3a" + integrity sha512-703bOOmytCYAX9cXYqoikYIx6twmFCXsnzRQheBcTG3nzKYBR4P/+wkYeH+Mvj7qUz8zZDtdyzbxfnEi/kYzRQ== + +collection-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" + integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= + dependencies: + map-visit "^1.0.0" + object-visit "^1.0.0" + +color-convert@^1.9.0, color-convert@^1.9.1: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= + +color-name@^1.0.0, color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +color-string@^1.5.2: + version "1.5.3" + resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.5.3.tgz#c9bbc5f01b58b5492f3d6857459cb6590ce204cc" + integrity sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw== + dependencies: + color-name "^1.0.0" + simple-swizzle "^0.2.2" + +color@^3.0.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/color/-/color-3.1.2.tgz#68148e7f85d41ad7649c5fa8c8106f098d229e10" + integrity sha512-vXTJhHebByxZn3lDvDJYw4lR5+uB3vuoHsuYA5AKuxRVn5wzzIfQKGLBmgdVRHKTJYeK5rvJcHnrd0Li49CFpg== + dependencies: + color-convert "^1.9.1" + color-string "^1.5.2" + +combined-stream@^1.0.6, combined-stream@~1.0.6: + version "1.0.8" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + +comma-separated-tokens@^1.0.0: + version "1.0.7" + resolved "https://registry.yarnpkg.com/comma-separated-tokens/-/comma-separated-tokens-1.0.7.tgz#419cd7fb3258b1ed838dc0953167a25e152f5b59" + integrity sha512-Jrx3xsP4pPv4AwJUDWY9wOXGtwPXARej6Xd99h4TUGotmf8APuquKMpK+dnD3UgyxK7OEWaisjZz+3b5jtL6xQ== + +commander@^2.18.0, commander@^2.20.0: + version "2.20.3" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + +commander@^4.0.0, commander@^4.0.1: + version "4.1.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.0.tgz#545983a0603fe425bc672d66c9e3c89c42121a83" + integrity sha512-NIQrwvv9V39FHgGFm36+U9SMQzbiHvU79k+iADraJTpmrFFfx7Ds0IvDoAdZsDrknlkRk14OYoWXb57uTh7/sw== + +commondir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" + integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= + +component-emitter@^1.2.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" + integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== + +compressible@~2.0.16: + version "2.0.18" + resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" + integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== + dependencies: + mime-db ">= 1.43.0 < 2" + +compression@^1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.4.tgz#95523eff170ca57c29a0ca41e6fe131f41e5bb8f" + integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ== + dependencies: + 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@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= + +concat-stream@^1.5.0: + version "1.6.2" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" + integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== + dependencies: + buffer-from "^1.0.0" + inherits "^2.0.3" + readable-stream "^2.2.2" + typedarray "^0.0.6" + +connect-history-api-fallback@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz#8b32089359308d111115d81cad3fceab888f97bc" + integrity sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg== + +consola@^2.10.0: + version "2.11.3" + resolved "https://registry.yarnpkg.com/consola/-/consola-2.11.3.tgz#f7315836224c143ac5094b47fd4c816c2cd1560e" + integrity sha512-aoW0YIIAmeftGR8GSpw6CGQluNdkWMWh3yEFjH/hmynTYnMtibXszii3lxCXmk8YxJtI3FAK5aTiquA5VH68Gw== + +console-browserify@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336" + integrity sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA== + +constants-browserify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" + integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U= + +content-disposition@0.5.3: + version "0.5.3" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd" + integrity sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g== + dependencies: + safe-buffer "5.1.2" + +content-type@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" + integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== + +convert-source-map@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442" + integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA== + dependencies: + safe-buffer "~5.1.1" + +cookie-signature@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= + +cookie@0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba" + integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg== + +copy-concurrently@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0" + integrity sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A== + dependencies: + 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@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" + integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= + +copy-webpack-plugin@^5.0.5: + version "5.1.1" + resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-5.1.1.tgz#5481a03dea1123d88a988c6ff8b78247214f0b88" + integrity sha512-P15M5ZC8dyCjQHWwd4Ia/dm0SgVvZJMYeykVIVYXbGyqO4dWB5oyPHp9i7wjwo5LhtlhKbiBCdS2NvM07Wlybg== + dependencies: + cacache "^12.0.3" + find-cache-dir "^2.1.0" + glob-parent "^3.1.0" + globby "^7.1.1" + is-glob "^4.0.1" + loader-utils "^1.2.3" + minimatch "^3.0.4" + normalize-path "^3.0.0" + p-limit "^2.2.1" + schema-utils "^1.0.0" + serialize-javascript "^2.1.2" + webpack-log "^2.0.0" + +core-js-compat@^3.6.2: + version "3.6.4" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.6.4.tgz#938476569ebb6cda80d339bcf199fae4f16fff17" + integrity sha512-zAa3IZPvsJ0slViBQ2z+vgyyTuhd3MFn1rBQjZSKVEgB0UMYhUkCj9jJUVPgGTGqWvsBVmfnruXgTcNyTlEiSA== + dependencies: + browserslist "^4.8.3" + semver "7.0.0" + +core-js@^2.6.5: + version "2.6.11" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.11.tgz#38831469f9922bded8ee21c9dc46985e0399308c" + integrity sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg== + +core-util-is@1.0.2, core-util-is@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= + +cosmiconfig@^5.0.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.2.1.tgz#040f726809c591e77a17c0a3626ca45b4f168b1a" + integrity sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA== + dependencies: + import-fresh "^2.0.0" + is-directory "^0.3.1" + js-yaml "^3.13.1" + parse-json "^4.0.0" + +create-ecdh@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.3.tgz#c9111b6f33045c4697f144787f9254cdc77c45ff" + integrity sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw== + dependencies: + bn.js "^4.1.0" + elliptic "^6.0.0" + +create-hash@^1.1.0, create-hash@^1.1.2: + version "1.2.0" + resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" + integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== + dependencies: + 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@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4: + version "1.1.7" + resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" + integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== + dependencies: + 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@6.0.5, cross-spawn@^6.0.0: + version "6.0.5" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" + integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== + dependencies: + nice-try "^1.0.4" + path-key "^2.0.1" + semver "^5.5.0" + shebang-command "^1.2.0" + which "^1.2.9" + +cross-spawn@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.1.tgz#0ab56286e0f7c24e153d04cc2aa027e43a9a5d14" + integrity sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +crypto-browserify@^3.11.0: + version "3.12.0" + resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" + integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg== + dependencies: + 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-blank-pseudo@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/css-blank-pseudo/-/css-blank-pseudo-0.1.4.tgz#dfdefd3254bf8a82027993674ccf35483bfcb3c5" + integrity sha512-LHz35Hr83dnFeipc7oqFDmsjHdljj3TQtxGGiNWSOsTLIAubSm4TEz8qCaKFpk7idaQ1GfWscF4E6mgpBysA1w== + dependencies: + postcss "^7.0.5" + +css-color-names@0.0.4, css-color-names@^0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-0.0.4.tgz#808adc2e79cf84738069b646cb20ec27beb629e0" + integrity sha1-gIrcLnnPhHOAabZGyyDsJ762KeA= + +css-declaration-sorter@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz#c198940f63a76d7e36c1e71018b001721054cb22" + integrity sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA== + dependencies: + postcss "^7.0.1" + timsort "^0.3.0" + +css-has-pseudo@^0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/css-has-pseudo/-/css-has-pseudo-0.10.0.tgz#3c642ab34ca242c59c41a125df9105841f6966ee" + integrity sha512-Z8hnfsZu4o/kt+AuFzeGpLVhFOGO9mluyHBaA2bA8aCGTwah5sT3WV/fTHH8UNZUytOIImuGPrl/prlb4oX4qQ== + dependencies: + postcss "^7.0.6" + postcss-selector-parser "^5.0.0-rc.4" + +css-loader@^3.2.0: + version "3.4.2" + resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-3.4.2.tgz#d3fdb3358b43f233b78501c5ed7b1c6da6133202" + integrity sha512-jYq4zdZT0oS0Iykt+fqnzVLRIeiPWhka+7BqPn+oSIpWJAHak5tmB/WZrJ2a21JhCeFyNnnlroSl8c+MtVndzA== + dependencies: + camelcase "^5.3.1" + cssesc "^3.0.0" + icss-utils "^4.1.1" + loader-utils "^1.2.3" + normalize-path "^3.0.0" + postcss "^7.0.23" + postcss-modules-extract-imports "^2.0.0" + postcss-modules-local-by-default "^3.0.2" + postcss-modules-scope "^2.1.1" + postcss-modules-values "^3.0.0" + postcss-value-parser "^4.0.2" + schema-utils "^2.6.0" + +css-prefers-color-scheme@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/css-prefers-color-scheme/-/css-prefers-color-scheme-3.1.1.tgz#6f830a2714199d4f0d0d0bb8a27916ed65cff1f4" + integrity sha512-MTu6+tMs9S3EUqzmqLXEcgNRbNkkD/TGFvowpeoWJn5Vfq7FMgsmRQs9X5NXAURiOBmOxm/lLjsDNXDE6k9bhg== + dependencies: + postcss "^7.0.5" + +css-select-base-adapter@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz#3b2ff4972cc362ab88561507a95408a1432135d7" + integrity sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w== + +css-select@^1.1.0, css-select@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-1.2.0.tgz#2b3a110539c5355f1cd8d314623e870b121ec858" + integrity sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg= + dependencies: + boolbase "~1.0.0" + css-what "2.1" + domutils "1.5.1" + nth-check "~1.0.1" + +css-select@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-2.1.0.tgz#6a34653356635934a81baca68d0255432105dbef" + integrity sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ== + dependencies: + boolbase "^1.0.0" + css-what "^3.2.1" + domutils "^1.7.0" + nth-check "^1.0.2" + +css-tree@1.0.0-alpha.37: + version "1.0.0-alpha.37" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.37.tgz#98bebd62c4c1d9f960ec340cf9f7522e30709a22" + integrity sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg== + dependencies: + mdn-data "2.0.4" + source-map "^0.6.1" + +css-unit-converter@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/css-unit-converter/-/css-unit-converter-1.1.1.tgz#d9b9281adcfd8ced935bdbaba83786897f64e996" + integrity sha1-2bkoGtz9jO2TW9urqDeGiX9k6ZY= + +css-what@2.1: + version "2.1.3" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.3.tgz#a6d7604573365fe74686c3f311c56513d88285f2" + integrity sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg== + +css-what@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-3.2.1.tgz#f4a8f12421064621b456755e34a03a2c22df5da1" + integrity sha512-WwOrosiQTvyms+Ti5ZC5vGEK0Vod3FTt1ca+payZqvKuGJF+dq7bG63DstxtN0dpm6FxY27a/zS3Wten+gEtGw== + +cssdb@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/cssdb/-/cssdb-4.4.0.tgz#3bf2f2a68c10f5c6a08abd92378331ee803cddb0" + integrity sha512-LsTAR1JPEM9TpGhl/0p3nQecC2LJ0kD8X5YARu1hk/9I1gril5vDtMZyNxcEpxxDj34YNck/ucjuoUd66K03oQ== + +cssesc@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-2.0.0.tgz#3b13bd1bb1cb36e1bcb5a4dcd27f54c5dcb35703" + integrity sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg== + +cssesc@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" + integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== + +cssnano-preset-default@^4.0.7: + version "4.0.7" + resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-4.0.7.tgz#51ec662ccfca0f88b396dcd9679cdb931be17f76" + integrity sha512-x0YHHx2h6p0fCl1zY9L9roD7rnlltugGu7zXSKQx6k2rYw0Hi3IqxcoAGF7u9Q5w1nt7vK0ulxV8Lo+EvllGsA== + dependencies: + css-declaration-sorter "^4.0.1" + cssnano-util-raw-cache "^4.0.1" + postcss "^7.0.0" + postcss-calc "^7.0.1" + postcss-colormin "^4.0.3" + postcss-convert-values "^4.0.1" + postcss-discard-comments "^4.0.2" + postcss-discard-duplicates "^4.0.2" + postcss-discard-empty "^4.0.1" + postcss-discard-overridden "^4.0.1" + postcss-merge-longhand "^4.0.11" + postcss-merge-rules "^4.0.3" + postcss-minify-font-values "^4.0.2" + postcss-minify-gradients "^4.0.2" + postcss-minify-params "^4.0.2" + postcss-minify-selectors "^4.0.2" + postcss-normalize-charset "^4.0.1" + postcss-normalize-display-values "^4.0.2" + postcss-normalize-positions "^4.0.2" + postcss-normalize-repeat-style "^4.0.2" + postcss-normalize-string "^4.0.2" + postcss-normalize-timing-functions "^4.0.2" + postcss-normalize-unicode "^4.0.1" + postcss-normalize-url "^4.0.1" + postcss-normalize-whitespace "^4.0.2" + postcss-ordered-values "^4.1.2" + postcss-reduce-initial "^4.0.3" + postcss-reduce-transforms "^4.0.2" + postcss-svgo "^4.0.2" + postcss-unique-selectors "^4.0.1" + +cssnano-util-get-arguments@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz#ed3a08299f21d75741b20f3b81f194ed49cc150f" + integrity sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8= + +cssnano-util-get-match@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz#c0e4ca07f5386bb17ec5e52250b4f5961365156d" + integrity sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0= + +cssnano-util-raw-cache@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz#b26d5fd5f72a11dfe7a7846fb4c67260f96bf282" + integrity sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA== + dependencies: + postcss "^7.0.0" + +cssnano-util-same-parent@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz#574082fb2859d2db433855835d9a8456ea18bbf3" + integrity sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q== + +cssnano@^4.1.10: + version "4.1.10" + resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-4.1.10.tgz#0ac41f0b13d13d465487e111b778d42da631b8b2" + integrity sha512-5wny+F6H4/8RgNlaqab4ktc3e0/blKutmq8yNlBFXA//nSFFAqAngjNVRzUvCgYROULmZZUoosL/KSoZo5aUaQ== + dependencies: + cosmiconfig "^5.0.0" + cssnano-preset-default "^4.0.7" + is-resolvable "^1.0.0" + postcss "^7.0.0" + +csso@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/csso/-/csso-4.0.2.tgz#e5f81ab3a56b8eefb7f0092ce7279329f454de3d" + integrity sha512-kS7/oeNVXkHWxby5tHVxlhjizRCSv8QdU7hB2FpdAibDU8FjTAolhNjKNTiLzXtUrKT6HwClE81yXwEk1309wg== + dependencies: + css-tree "1.0.0-alpha.37" + +cyclist@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9" + integrity sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk= + +dashdash@^1.12.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= + dependencies: + assert-plus "^1.0.0" + +debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.0, debug@^2.6.9: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@^3.0.0, debug@^3.1.1, debug@^3.2.5: + version "3.2.6" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" + integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== + dependencies: + ms "^2.1.1" + +debug@^4.1.0, debug@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" + integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== + dependencies: + ms "^2.1.1" + +decamelize@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= + +decode-uri-component@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" + integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= + +deep-equal@^1.0.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.1.1.tgz#b5c98c942ceffaf7cb051e24e1434a25a2e6076a" + integrity sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g== + dependencies: + is-arguments "^1.0.4" + is-date-object "^1.0.1" + is-regex "^1.0.4" + object-is "^1.0.1" + object-keys "^1.1.1" + regexp.prototype.flags "^1.2.0" + +default-gateway@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-4.2.0.tgz#167104c7500c2115f6dd69b0a536bb8ed720552b" + integrity sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA== + dependencies: + execa "^1.0.0" + ip-regex "^2.1.0" + +define-properties@^1.1.2, define-properties@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" + integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== + dependencies: + object-keys "^1.0.12" + +define-property@^0.2.5: + version "0.2.5" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" + integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= + dependencies: + is-descriptor "^0.1.0" + +define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" + integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= + dependencies: + is-descriptor "^1.0.0" + +define-property@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" + integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== + dependencies: + is-descriptor "^1.0.2" + isobject "^3.0.1" + +del@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/del/-/del-4.1.1.tgz#9e8f117222ea44a31ff3a156c049b99052a9f0b4" + integrity sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ== + dependencies: + "@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" + +del@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/del/-/del-5.1.0.tgz#d9487c94e367410e6eff2925ee58c0c84a75b3a7" + integrity sha512-wH9xOVHnczo9jN2IW68BabcecVPxacIA3g/7z6vhSU/4stOKQzeCRK0yD0A24WiAAUJmmVpWqrERcTxnLo3AnA== + dependencies: + globby "^10.0.1" + graceful-fs "^4.2.2" + is-glob "^4.0.1" + is-path-cwd "^2.2.0" + is-path-inside "^3.0.1" + p-map "^3.0.0" + rimraf "^3.0.0" + slash "^3.0.0" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= + +delegate@^3.1.2: + version "3.2.0" + resolved "https://registry.yarnpkg.com/delegate/-/delegate-3.2.0.tgz#b66b71c3158522e8ab5744f720d8ca0c2af59166" + integrity sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw== + +depd@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" + integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= + +des.js@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.1.tgz#5382142e1bdc53f85d86d53e5f4aa7deb91e0843" + integrity sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA== + dependencies: + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + +destroy@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" + integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= + +detab@2.0.2, detab@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/detab/-/detab-2.0.2.tgz#074970d1a807b045d0258a4235df5928dd683561" + integrity sha512-Q57yPrxScy816TTE1P/uLRXLDKjXhvYTbfxS/e6lPD+YrqghbsMlGB9nQzj/zVtSPaF0DFPSdO916EWO4sQUyQ== + dependencies: + repeat-string "^1.5.4" + +detect-node@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.0.4.tgz#014ee8f8f669c5c58023da64b8179c083a28c46c" + integrity sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw== + +detect-port-alt@1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/detect-port-alt/-/detect-port-alt-1.1.6.tgz#24707deabe932d4a3cf621302027c2b266568275" + integrity sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q== + dependencies: + address "^1.0.1" + debug "^2.6.0" + +diffie-hellman@^5.0.0: + version "5.0.3" + resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" + integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg== + dependencies: + bn.js "^4.1.0" + miller-rabin "^4.0.0" + randombytes "^2.0.0" + +dir-glob@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-2.0.0.tgz#0b205d2b6aef98238ca286598a8204d29d0a0034" + integrity sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag== + dependencies: + arrify "^1.0.1" + path-type "^3.0.0" + +dir-glob@^2.0.0: + version "2.2.2" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-2.2.2.tgz#fa09f0694153c8918b18ba0deafae94769fc50c4" + integrity sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw== + dependencies: + path-type "^3.0.0" + +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + +dns-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/dns-equal/-/dns-equal-1.0.0.tgz#b39e7f1da6eb0a75ba9c17324b34753c47e0654d" + integrity sha1-s55/HabrCnW6nBcySzR1PEfgZU0= + +dns-packet@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-1.3.1.tgz#12aa426981075be500b910eedcd0b47dd7deda5a" + integrity sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg== + dependencies: + ip "^1.1.0" + safe-buffer "^5.0.1" + +dns-txt@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/dns-txt/-/dns-txt-2.0.2.tgz#b91d806f5d27188e4ab3e7d107d881a1cc4642b6" + integrity sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY= + dependencies: + buffer-indexof "^1.0.0" + +docsearch.js@^2.6.3: + version "2.6.3" + resolved "https://registry.yarnpkg.com/docsearch.js/-/docsearch.js-2.6.3.tgz#57cb4600d3b6553c677e7cbbe6a734593e38625d" + integrity sha512-GN+MBozuyz664ycpZY0ecdQE0ND/LSgJKhTLA0/v3arIS3S1Rpf2OJz6A35ReMsm91V5apcmzr5/kM84cvUg+A== + dependencies: + algoliasearch "^3.24.5" + autocomplete.js "0.36.0" + hogan.js "^3.0.2" + request "^2.87.0" + stack-utils "^1.0.1" + to-factory "^1.0.0" + zepto "^1.2.0" + +dom-converter@^0.2: + version "0.2.0" + resolved "https://registry.yarnpkg.com/dom-converter/-/dom-converter-0.2.0.tgz#6721a9daee2e293682955b6afe416771627bb768" + integrity sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA== + dependencies: + utila "~0.4" + +dom-serializer@0: + version "0.2.2" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.2.2.tgz#1afb81f533717175d478655debc5e332d9f9bb51" + integrity sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g== + dependencies: + domelementtype "^2.0.1" + entities "^2.0.0" + +dom-serializer@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.1.tgz#1ec4059e284babed36eec2941d4a970a189ce7c0" + integrity sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA== + dependencies: + domelementtype "^1.3.0" + entities "^1.1.1" + +dom-walk@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.1.tgz#672226dc74c8f799ad35307df936aba11acd6018" + integrity sha1-ZyIm3HTI95mtNTB9+TaroRrNYBg= + +domain-browser@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" + integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA== + +domelementtype@1, domelementtype@^1.3.0, domelementtype@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f" + integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w== + +domelementtype@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.0.1.tgz#1f8bdfe91f5a78063274e803b4bdcedf6e94f94d" + integrity sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ== + +domhandler@^2.3.0: + version "2.4.2" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.4.2.tgz#8805097e933d65e85546f726d60f5eb88b44f803" + integrity sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA== + dependencies: + domelementtype "1" + +domutils@1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.5.1.tgz#dcd8488a26f563d61079e48c9f7b7e32373682cf" + integrity sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8= + dependencies: + dom-serializer "0" + domelementtype "1" + +domutils@^1.5.1, domutils@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a" + integrity sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg== + dependencies: + dom-serializer "0" + domelementtype "1" + +dot-prop@^4.1.1: + version "4.2.0" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.0.tgz#1f19e0c2e1aa0e32797c49799f2837ac6af69c57" + integrity sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ== + dependencies: + is-obj "^1.0.0" + +duplexer@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1" + integrity sha1-rOb/gIwc5mtX0ev5eXessCM0z8E= + +duplexify@^3.4.2, duplexify@^3.6.0: + version "3.7.1" + resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.7.1.tgz#2a4df5317f6ccfd91f86d6fd25d8d8a103b88309" + integrity sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g== + dependencies: + end-of-stream "^1.0.0" + inherits "^2.0.1" + readable-stream "^2.0.0" + stream-shift "^1.0.0" + +ecc-jsbn@~0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" + integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= + dependencies: + jsbn "~0.1.0" + safer-buffer "^2.1.0" + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= + +ejs@^2.6.1: + version "2.7.4" + resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.7.4.tgz#48661287573dcc53e366c7a1ae52c3a120eec9ba" + integrity sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA== + +ejs@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.0.1.tgz#30c8f6ee9948502cc32e85c37a3f8b39b5a614a5" + integrity sha512-cuIMtJwxvzumSAkqaaoGY/L6Fc/t6YvoP9/VIaK0V/CyqKLEQ8sqODmYfy/cjXEdZ9+OOL8TecbJu+1RsofGDw== + +electron-to-chromium@^1.3.247, electron-to-chromium@^1.3.322: + version "1.3.333" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.333.tgz#b835de183afbaaf8655a14f542db06d67a00cba1" + integrity sha512-7MJfCpa/tmhqYy2lZ1NEbkSxH7q3KiZiepiSs2ayTPAweAjdzGXotij+7OKPPb3OwJD2ZuBKPrA2HIuuSi6ahw== + +elliptic@^6.0.0: + version "6.5.2" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.2.tgz#05c5678d7173c049d8ca433552224a495d0e3762" + integrity sha512-f4x70okzZbIQl/NSRLkI/+tteV/9WqL98zx+SQ69KbXxmVrmjwsNUPn/gYJJ0sHvEak24cZgHIPegRePAtA/xw== + dependencies: + 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" + +"emoji-regex@>=6.0.0 <=6.1.1": + version "6.1.1" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-6.1.1.tgz#c6cd0ec1b0642e2a3c67a1137efc5e796da4f88e" + integrity sha1-xs0OwbBkLio8Z6ETfvxeeW2k+I4= + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +emojis-list@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" + integrity sha1-TapNnbAPmBmIDHn6RXrlsJof04k= + +encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= + +end-of-stream@^1.0.0, end-of-stream@^1.1.0: + version "1.4.4" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + dependencies: + once "^1.4.0" + +enhanced-resolve@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.1.1.tgz#2937e2b8066cd0fe7ce0990a98f0d71a35189f66" + integrity sha512-98p2zE+rL7/g/DzMHMTF4zZlCgeVdJ7yr6xzEpJRYwFYrGi9ANdn5DnJURg6RpBkyk60XYDnWIv51VfIhfNGuA== + dependencies: + graceful-fs "^4.1.2" + memory-fs "^0.5.0" + tapable "^1.0.0" + +entities@^1.1.1, entities@~1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56" + integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w== + +entities@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-2.0.0.tgz#68d6084cab1b079767540d80e56a39b423e4abf4" + integrity sha512-D9f7V0JSRwIxlRI2mjMqufDrRDnx8p+eEOz7aUM9SuvF8gsBzra0/6tbjl1m8eQHrZlYj6PxqE00hZ1SAIKPLw== + +envify@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/envify/-/envify-4.1.0.tgz#f39ad3db9d6801b4e6b478b61028d3f0b6819f7e" + integrity sha512-IKRVVoAYr4pIx4yIWNsz9mOsboxlNXiu7TNBnem/K/uTHdkyzXWDzHCK7UTolqBbgaBz0tQHsD3YNls0uIIjiw== + dependencies: + esprima "^4.0.0" + through "~2.3.4" + +errno@^0.1.3, errno@~0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618" + integrity sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg== + dependencies: + prr "~1.0.1" + +error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + +es-abstract@^1.17.0-next.1: + version "1.17.0" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.0.tgz#f42a517d0036a5591dbb2c463591dc8bb50309b1" + integrity sha512-yYkE07YF+6SIBmg1MsJ9dlub5L48Ek7X0qz+c/CPCHS9EBXfESorzng4cJQjJW5/pB6vDF41u7F8vUhLVDqIug== + dependencies: + es-to-primitive "^1.2.1" + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.1" + is-callable "^1.1.5" + is-regex "^1.0.5" + object-inspect "^1.7.0" + object-keys "^1.1.1" + object.assign "^4.1.0" + string.prototype.trimleft "^2.1.1" + string.prototype.trimright "^2.1.1" + +es-to-primitive@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" + integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + +es6-promise@^4.1.0: + version "4.2.8" + resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a" + integrity sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w== + +escape-html@^1.0.3, escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= + +escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= + +escape-string-regexp@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" + integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== + +eslint-scope@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848" + integrity sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg== + dependencies: + esrecurse "^4.1.0" + estraverse "^4.1.1" + +esprima@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +esrecurse@^4.1.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf" + integrity sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ== + dependencies: + estraverse "^4.1.0" + +estraverse@^4.1.0, estraverse@^4.1.1: + version "4.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +esutils@^2.0.0, esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +etag@~1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= + +eval@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/eval/-/eval-0.1.4.tgz#e05dbe0dab4b9330215cbb7bf4886eb24bd58700" + integrity sha512-npGsebJejyjMRnLdFu+T/97dnigqIU0Ov3IGrZ8ygd1v7RL1vGkEKtvyWZobqUH1AQgKlg0Yqqe2BtMA9/QZLw== + dependencies: + require-like ">= 0.1.1" + +eventemitter3@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.0.tgz#d65176163887ee59f386d64c82610b696a4a74eb" + integrity sha512-qerSRB0p+UDEssxTtm6EDKcE7W4OaoisfIMl4CngyEhjpYglocpNg6UEqCvemdGhosAsg4sO2dXJOdyBifPGCg== + +events@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924" + integrity sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ= + +events@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.1.0.tgz#84279af1b34cb75aa88bf5ff291f6d0bd9b31a59" + integrity sha512-Rv+u8MLHNOdMjTAFeT3nCjHn2aGlx435FP/sDHNaRhDEMwyI/aB22Kj2qIN8R0cw3z28psEQLYwxVKLsKrMgWg== + +eventsource@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/eventsource/-/eventsource-1.0.7.tgz#8fbc72c93fcd34088090bc0a4e64f4b5cee6d8d0" + integrity sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ== + dependencies: + original "^1.0.0" + +evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" + integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== + dependencies: + md5.js "^1.3.4" + safe-buffer "^5.1.1" + +execa@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" + integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== + dependencies: + 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" + +execa@^3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-3.4.0.tgz#c08ed4550ef65d858fac269ffc8572446f37eb89" + integrity sha512-r9vdGQk4bmCuK1yKQu1KTwcT2zwfWdbdaXfCtAh+5nU/4fSX+JAb7vZGvI5naJrQlvONrEB20jeruESI69530g== + dependencies: + cross-spawn "^7.0.0" + get-stream "^5.0.0" + human-signals "^1.1.1" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.0" + onetime "^5.1.0" + p-finally "^2.0.0" + signal-exit "^3.0.2" + strip-final-newline "^2.0.0" + +expand-brackets@^2.1.4: + version "2.1.4" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" + integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= + dependencies: + 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" + +express@^4.16.3, express@^4.17.1: + version "4.17.1" + resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134" + integrity sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g== + dependencies: + 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" + +extend-shallow@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" + integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= + dependencies: + is-extendable "^0.1.0" + +extend-shallow@^3.0.0, extend-shallow@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" + integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= + dependencies: + assign-symbols "^1.0.0" + is-extendable "^1.0.1" + +extend@^3.0.0, extend@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== + +external-editor@^3.0.3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" + integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== + dependencies: + chardet "^0.7.0" + iconv-lite "^0.4.24" + tmp "^0.0.33" + +extglob@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" + integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== + dependencies: + 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" + +extsprintf@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" + integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= + +extsprintf@^1.2.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" + integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= + +fast-deep-equal@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" + integrity sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk= + +fast-glob@^2.0.2: + version "2.2.7" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-2.2.7.tgz#6953857c3afa475fff92ee6015d52da70a4cd39d" + integrity sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw== + dependencies: + "@mrmlnc/readdir-enhanced" "^2.2.1" + "@nodelib/fs.stat" "^1.1.2" + glob-parent "^3.1.0" + is-glob "^4.0.0" + merge2 "^1.2.3" + micromatch "^3.1.10" + +fast-glob@^3.0.3: + version "3.1.1" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.1.1.tgz#87ee30e9e9f3eb40d6f254a7997655da753d7c82" + integrity sha512-nTCREpBY8w8r+boyFYAx21iL6faSsQynliPHM4Uf56SbkyohCNxpVPEH9xrF5TXKy+IsjkPUHDKiUkzBVRXn9g== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.0" + merge2 "^1.3.0" + micromatch "^4.0.2" + +fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fastq@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.6.0.tgz#4ec8a38f4ac25f21492673adb7eae9cfef47d1c2" + integrity sha512-jmxqQ3Z/nXoeyDmWAzF9kH1aGZSis6e/SbfPmJpUnyZ0ogr6iscHQaml4wsEepEWSdtmpy+eVXmCRIMpxaXqOA== + dependencies: + reusify "^1.0.0" + +faye-websocket@^0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.10.0.tgz#4e492f8d04dfb6f89003507f6edbf2d501e7c6f4" + integrity sha1-TkkvjQTftviQA1B/btvy1QHnxvQ= + dependencies: + websocket-driver ">=0.5.1" + +faye-websocket@~0.11.1: + version "0.11.3" + resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.3.tgz#5c0e9a8968e8912c286639fde977a8b209f2508e" + integrity sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA== + dependencies: + websocket-driver ">=0.5.1" + +feed@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/feed/-/feed-4.1.0.tgz#58f1c9cc2b44715d14ac59234e1bf20c5d757aa7" + integrity sha512-dAXWXM8QMxZ1DRnAxDmy1MaWZFlh1Ku7TU3onbXgHrVJynsxkNGPUed1AxszVW8AXo43xExronVkIqK+ACsoBA== + dependencies: + xml-js "^1.6.11" + +figgy-pudding@^3.5.1: + version "3.5.1" + resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.1.tgz#862470112901c727a0e495a80744bd5baa1d6790" + integrity sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w== + +figures@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" + integrity sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI= + dependencies: + escape-string-regexp "^1.0.5" + +figures@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-3.1.0.tgz#4b198dd07d8d71530642864af2d45dd9e459c4ec" + integrity sha512-ravh8VRXqHuMvZt/d8GblBeqDMkdJMBdv/2KntFH+ra5MXkO7nxNKpzQ3n6QD/2da1kH0aWmNISdvhM7gl2gVg== + dependencies: + escape-string-regexp "^1.0.5" + +file-uri-to-path@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" + integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== + +filesize@3.6.1, filesize@^3.6.1: + version "3.6.1" + resolved "https://registry.yarnpkg.com/filesize/-/filesize-3.6.1.tgz#090bb3ee01b6f801a8a8be99d31710b3422bb317" + integrity sha512-7KjR1vv6qnicaPMi1iiTcI85CyYwRO/PSFCu6SvqL8jN2Wjt/NIYQTFtFs7fSDCYOstUkEWIQGFUg5YZQfjlcg== + +fill-range@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" + integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= + dependencies: + extend-shallow "^2.0.1" + is-number "^3.0.0" + repeat-string "^1.6.1" + to-regex-range "^2.1.0" + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +finalhandler@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" + integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== + dependencies: + 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@^2.0.0, find-cache-dir@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz#8d0f94cd13fe43c6c7c261a0d86115ca918c05f7" + integrity sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ== + dependencies: + commondir "^1.0.1" + make-dir "^2.0.0" + pkg-dir "^3.0.0" + +find-cache-dir@^3.0.0, find-cache-dir@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.2.0.tgz#e7fe44c1abc1299f516146e563108fd1006c1874" + integrity sha512-1JKclkYYsf1q9WIJKLZa9S9muC+08RIjzAlLrK4QcYLJMS6mk9yombQ9qf+zJ7H9LS800k0s44L4sDq9VYzqyg== + dependencies: + commondir "^1.0.1" + make-dir "^3.0.0" + pkg-dir "^4.1.0" + +find-up@3.0.0, find-up@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" + integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== + dependencies: + locate-path "^3.0.0" + +find-up@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" + integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= + dependencies: + locate-path "^2.0.0" + +find-up@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + +flatten@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.3.tgz#c1283ac9f27b368abc1e36d1ff7b04501a30356b" + integrity sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg== + +flush-write-stream@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.1.1.tgz#8dd7d873a1babc207d94ead0c2e0e44276ebf2e8" + integrity sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w== + dependencies: + inherits "^2.0.3" + readable-stream "^2.3.6" + +follow-redirects@^1.0.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.9.0.tgz#8d5bcdc65b7108fe1508649c79c12d732dcedb4f" + integrity sha512-CRcPzsSIbXyVDl0QI01muNDu69S8trU4jArW9LpOt2WtC6LyUJetcIrmfHsRBx7/Jb6GHJUiuqyYxPooFfNt6A== + dependencies: + debug "^3.0.0" + +for-in@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" + integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= + +foreach@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99" + integrity sha1-C+4AUBiusmDQo6865ljdATbsG5k= + +forever-agent@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= + +fork-ts-checker-webpack-plugin@1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-1.5.0.tgz#ce1d77190b44d81a761b10b6284a373795e41f0c" + integrity sha512-zEhg7Hz+KhZlBhILYpXy+Beu96gwvkROWJiTXOCyOOMMrdBIRPvsBpBqgTI4jfJGrJXcqGwJR8zsBGDmzY0jsA== + dependencies: + babel-code-frame "^6.22.0" + chalk "^2.4.1" + chokidar "^2.0.4" + micromatch "^3.1.10" + minimatch "^3.0.4" + semver "^5.6.0" + tapable "^1.0.0" + worker-rpc "^0.1.0" + +form-data@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" + integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.6" + mime-types "^2.1.12" + +forwarded@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" + integrity sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ= + +fragment-cache@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" + integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= + dependencies: + map-cache "^0.2.2" + +fresh@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= + +from2@^2.1.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" + integrity sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8= + dependencies: + inherits "^2.0.1" + readable-stream "^2.0.0" + +fs-extra@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" + integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^4.0.0" + universalify "^0.1.0" + +fs-minipass@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.0.0.tgz#a6415edab02fae4b9e9230bc87ee2e4472003cd1" + integrity sha512-40Qz+LFXmd9tzYVnnBmZvFfvAADfUA14TXPK1s7IfElJTIZ97rA8w4Kin7Wt5JBrC3ShnnFJO/5vPjPEeJIq9A== + dependencies: + minipass "^3.0.0" + +fs-write-stream-atomic@^1.0.8: + version "1.0.10" + resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9" + integrity sha1-tH31NJPvkR33VzHnCp3tAYnbQMk= + dependencies: + graceful-fs "^4.1.2" + iferr "^0.1.5" + imurmurhash "^0.1.4" + readable-stream "1 || 2" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= + +fsevents@^1.2.7: + version "1.2.11" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.11.tgz#67bf57f4758f02ede88fb2a1712fef4d15358be3" + integrity sha512-+ux3lx6peh0BpvY0JebGyZoiR4D+oYzdPZMKJwkZ+sFkNJzpL7tXc/wehS49gUAxg3tmMHPHZkA8JU2rhhgDHw== + dependencies: + bindings "^1.5.0" + nan "^2.12.1" + +fsevents@~2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.2.tgz#4c0a1fb34bc68e543b4b82a9ec392bfbda840805" + integrity sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA== + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +gensync@^1.0.0-beta.1: + version "1.0.0-beta.1" + resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.1.tgz#58f4361ff987e5ff6e1e7a210827aa371eaac269" + integrity sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg== + +get-caller-file@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" + integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w== + +get-own-enumerable-property-symbols@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz#b5fde77f22cbe35f390b4e089922c50bce6ef664" + integrity sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g== + +get-stream@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" + integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== + dependencies: + pump "^3.0.0" + +get-stream@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.1.0.tgz#01203cdc92597f9b909067c3e656cc1f4d3c4dc9" + integrity sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw== + dependencies: + pump "^3.0.0" + +get-value@^2.0.3, get-value@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" + integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= + +getpass@^0.1.1: + version "0.1.7" + resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" + integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= + dependencies: + assert-plus "^1.0.0" + +github-slugger@^1.0.0, github-slugger@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/github-slugger/-/github-slugger-1.2.1.tgz#47e904e70bf2dccd0014748142d31126cfd49508" + integrity sha512-SsZUjg/P03KPzQBt7OxJPasGw6NRO5uOgiZ5RGXVud5iSIZ0eNZeNp5rTwCxtavrRUa/A77j8mePVc5lEvk0KQ== + dependencies: + emoji-regex ">=6.0.0 <=6.1.1" + +glob-parent@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" + integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4= + dependencies: + is-glob "^3.1.0" + path-dirname "^1.0.0" + +glob-parent@^5.1.0, glob-parent@~5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.0.tgz#5f4c1d1e748d30cd73ad2944b3577a81b081e8c2" + integrity sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw== + dependencies: + is-glob "^4.0.1" + +glob-to-regexp@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz#8c5a1494d2066c570cc3bfe4496175acc4d502ab" + integrity sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs= + +glob@^7.0.0, glob@^7.0.3, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4: + version "7.1.6" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" + integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== + dependencies: + 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" + +global-modules@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-2.0.0.tgz#997605ad2345f27f51539bea26574421215c7780" + integrity sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A== + dependencies: + global-prefix "^3.0.0" + +global-prefix@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-3.0.0.tgz#fc85f73064df69f50421f47f883fe5b913ba9b97" + integrity sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg== + dependencies: + ini "^1.3.5" + kind-of "^6.0.2" + which "^1.3.1" + +global@^4.3.2: + version "4.4.0" + resolved "https://registry.yarnpkg.com/global/-/global-4.4.0.tgz#3e7b105179006a323ed71aafca3e9c57a5cc6406" + integrity sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w== + dependencies: + min-document "^2.19.0" + process "^0.11.10" + +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + +globby@8.0.2: + version "8.0.2" + resolved "https://registry.yarnpkg.com/globby/-/globby-8.0.2.tgz#5697619ccd95c5275dbb2d6faa42087c1a941d8d" + integrity sha512-yTzMmKygLp8RUpG1Ymu2VXPSJQZjNAZPD4ywgYEaG7e4tBJeUQBO8OpXrf1RCNcEs5alsoJYPAMiIHP0cmeC7w== + dependencies: + array-union "^1.0.1" + dir-glob "2.0.0" + fast-glob "^2.0.2" + glob "^7.1.2" + ignore "^3.3.5" + pify "^3.0.0" + slash "^1.0.0" + +globby@^10.0.1: + version "10.0.2" + resolved "https://registry.yarnpkg.com/globby/-/globby-10.0.2.tgz#277593e745acaa4646c3ab411289ec47a0392543" + integrity sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg== + dependencies: + "@types/glob" "^7.1.1" + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.0.3" + glob "^7.1.3" + ignore "^5.1.1" + merge2 "^1.2.3" + slash "^3.0.0" + +globby@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c" + integrity sha1-9abXDoOV4hyFj7BInWTfAkJNUGw= + dependencies: + array-union "^1.0.1" + glob "^7.0.3" + object-assign "^4.0.1" + pify "^2.0.0" + pinkie-promise "^2.0.0" + +globby@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/globby/-/globby-7.1.1.tgz#fb2ccff9401f8600945dfada97440cca972b8680" + integrity sha1-+yzP+UAfhgCUXfral0QMypcrhoA= + dependencies: + array-union "^1.0.1" + dir-glob "^2.0.0" + glob "^7.1.2" + ignore "^3.3.5" + pify "^3.0.0" + slash "^1.0.0" + +good-listener@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/good-listener/-/good-listener-1.2.2.tgz#d53b30cdf9313dffb7dc9a0d477096aa6d145c50" + integrity sha1-1TswzfkxPf+33JoNR3CWqm0UXFA= + dependencies: + delegate "^3.1.2" + +graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.2: + version "4.2.3" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.3.tgz#4a12ff1b60376ef09862c2093edd908328be8423" + integrity sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ== + +gray-matter@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/gray-matter/-/gray-matter-4.0.2.tgz#9aa379e3acaf421193fce7d2a28cebd4518ac454" + integrity sha512-7hB/+LxrOjq/dd8APlK0r24uL/67w7SkYnfwhNFwg/VDIGWGmduTDYf3WNstLW2fbbmRwrDGCVSJ2isuf2+4Hw== + dependencies: + js-yaml "^3.11.0" + kind-of "^6.0.2" + section-matter "^1.0.0" + strip-bom-string "^1.0.0" + +gud@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/gud/-/gud-1.0.0.tgz#a489581b17e6a70beca9abe3ae57de7a499852c0" + integrity sha512-zGEOVKFM5sVPPrYs7J5/hYEw2Pof8KCyOwyhG8sAF26mCAeUFAcYPu1mwB7hhpIP29zOIBaDqwuHdLp0jvZXjw== + +gzip-size@5.1.1, gzip-size@^5.0.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-5.1.1.tgz#cb9bee692f87c0612b232840a873904e4c135274" + integrity sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA== + dependencies: + duplexer "^0.1.1" + pify "^4.0.1" + +handle-thing@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.0.tgz#0e039695ff50c93fc288557d696f3c1dc6776754" + integrity sha512-d4sze1JNC454Wdo2fkuyzCr6aHcbL6PGGuFAz0Li/NcOm1tCHGnWDRmJP85dh9IhQErTc2svWFEX5xHIOo//kQ== + +har-schema@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" + integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= + +har-validator@~5.1.0: + version "5.1.3" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.3.tgz#1ef89ebd3e4996557675eed9893110dc350fa080" + integrity sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g== + dependencies: + ajv "^6.5.5" + har-schema "^2.0.0" + +has-ansi@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" + integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE= + dependencies: + ansi-regex "^2.0.0" + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-symbols@^1.0.0, has-symbols@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8" + integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg== + +has-value@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" + integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= + dependencies: + get-value "^2.0.3" + has-values "^0.1.4" + isobject "^2.0.0" + +has-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" + integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= + dependencies: + get-value "^2.0.6" + has-values "^1.0.0" + isobject "^3.0.0" + +has-values@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" + integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= + +has-values@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" + integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= + dependencies: + is-number "^3.0.0" + kind-of "^4.0.0" + +has@^1.0.0, has@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +hash-base@^3.0.0: + version "3.0.4" + resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.0.4.tgz#5fc8686847ecd73499403319a6b0a3f3f6ae4918" + integrity sha1-X8hoaEfs1zSZQDMZprCj8/auSRg= + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +hash.js@^1.0.0, hash.js@^1.0.3: + version "1.1.7" + resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" + integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== + dependencies: + inherits "^2.0.3" + minimalistic-assert "^1.0.1" + +hast-to-hyperscript@^7.0.0: + version "7.0.4" + resolved "https://registry.yarnpkg.com/hast-to-hyperscript/-/hast-to-hyperscript-7.0.4.tgz#7c4c037d9a8ea19b0a3fdb676a26448ad922353d" + integrity sha512-vmwriQ2H0RPS9ho4Kkbf3n3lY436QKLq6VaGA1pzBh36hBi3tm1DO9bR+kaJIbpT10UqaANDkMjxvjVfr+cnOA== + dependencies: + comma-separated-tokens "^1.0.0" + property-information "^5.3.0" + space-separated-tokens "^1.0.0" + style-to-object "^0.2.1" + unist-util-is "^3.0.0" + web-namespaces "^1.1.2" + +hast-util-from-parse5@^5.0.0: + version "5.0.2" + resolved "https://registry.yarnpkg.com/hast-util-from-parse5/-/hast-util-from-parse5-5.0.2.tgz#afeadc6aab41e6acfe038645bbefd4005c56a475" + integrity sha512-YXFjoRS7ES7PEoLx6uihtSfKTO1s3z/tzGiV5cVpsUiihduogFXubNRCzTIW3yOOGO1nws9CxPq4MbwD39Uo+w== + dependencies: + ccount "^1.0.3" + hastscript "^5.0.0" + property-information "^5.0.0" + web-namespaces "^1.1.2" + xtend "^4.0.1" + +hast-util-parse-selector@^2.0.0: + version "2.2.3" + resolved "https://registry.yarnpkg.com/hast-util-parse-selector/-/hast-util-parse-selector-2.2.3.tgz#57edd449103900c7f63fd9e6f694ffd7e4634719" + integrity sha512-nxbeqjQNxsvo/uYYAw9kij6td05YVUlf1qti09rVfbWSLT5H6wo3c+USIwX6nzXWk5kFZzXnEqO82856r0aM2Q== + +hast-util-raw@5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/hast-util-raw/-/hast-util-raw-5.0.1.tgz#b39539cf4b9f7ccdc131f72a583502a7911b99ee" + integrity sha512-iHo7G6BjRc/GU1Yun5CIEXjil0wVnIbz11C6k0JdDichSDMtYi2+NNtk6YN7EOP0JfPstX30d3pRLfaJv5CkdA== + dependencies: + hast-util-from-parse5 "^5.0.0" + hast-util-to-parse5 "^5.0.0" + html-void-elements "^1.0.1" + parse5 "^5.0.0" + unist-util-position "^3.0.0" + web-namespaces "^1.0.0" + xtend "^4.0.1" + zwitch "^1.0.0" + +hast-util-to-parse5@^5.0.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/hast-util-to-parse5/-/hast-util-to-parse5-5.1.1.tgz#cabf2dbe9ed988a5128fc708457b37cdf535a2e8" + integrity sha512-ivCeAd5FCXr7bapJIVsWMnx/EmbjkkW2TU2hd1prq+jGwiaUoK+FcpjyPNwsC5ogzCwWO669tOqIovGeLc/ntg== + dependencies: + hast-to-hyperscript "^7.0.0" + property-information "^5.0.0" + web-namespaces "^1.0.0" + xtend "^4.0.1" + zwitch "^1.0.0" + +hastscript@^5.0.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/hastscript/-/hastscript-5.1.1.tgz#71726ee1e97220575d1f29a8e937387d99d48275" + integrity sha512-xHo1Hkcqd0LlWNuDL3/BxwhgAGp3d7uEvCMgCTrBY+zsOooPPH+8KAvW8PCgl+GB8H3H44nfSaF0A4BQ+4xlYg== + dependencies: + comma-separated-tokens "^1.0.0" + hast-util-parse-selector "^2.0.0" + property-information "^5.0.0" + space-separated-tokens "^1.0.0" + +he@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" + integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== + +hex-color-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/hex-color-regex/-/hex-color-regex-1.1.0.tgz#4c06fccb4602fe2602b3c93df82d7e7dbf1a8a8e" + integrity sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ== + +history@^4.9.0: + version "4.10.1" + resolved "https://registry.yarnpkg.com/history/-/history-4.10.1.tgz#33371a65e3a83b267434e2b3f3b1b4c58aad4cf3" + integrity sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew== + dependencies: + "@babel/runtime" "^7.1.2" + loose-envify "^1.2.0" + resolve-pathname "^3.0.0" + tiny-invariant "^1.0.2" + tiny-warning "^1.0.0" + value-equal "^1.0.1" + +hmac-drbg@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" + integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE= + dependencies: + hash.js "^1.0.3" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.1" + +hogan.js@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/hogan.js/-/hogan.js-3.0.2.tgz#4cd9e1abd4294146e7679e41d7898732b02c7bfd" + integrity sha1-TNnhq9QpQUbnZ55B14mHMrAse/0= + dependencies: + mkdirp "0.3.0" + nopt "1.0.10" + +hoist-non-react-statics@^3.1.0: + version "3.3.1" + resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz#101685d3aff3b23ea213163f6e8e12f4f111e19f" + integrity sha512-wbg3bpgA/ZqWrZuMOeJi8+SKMhr7X9TesL/rXMjTzh0p0JUBo3II8DHboYbuIXWRlttrUFxwcu/5kygrCw8fJw== + dependencies: + react-is "^16.7.0" + +hoopy@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/hoopy/-/hoopy-0.1.4.tgz#609207d661100033a9a9402ad3dea677381c1b1d" + integrity sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ== + +hpack.js@^2.1.6: + version "2.1.6" + resolved "https://registry.yarnpkg.com/hpack.js/-/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2" + integrity sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI= + dependencies: + inherits "^2.0.1" + obuf "^1.0.0" + readable-stream "^2.0.1" + wbuf "^1.1.0" + +hsl-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/hsl-regex/-/hsl-regex-1.0.0.tgz#d49330c789ed819e276a4c0d272dffa30b18fe6e" + integrity sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4= + +hsla-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/hsla-regex/-/hsla-regex-1.0.0.tgz#c1ce7a3168c8c6614033a4b5f7877f3b225f9c38" + integrity sha1-wc56MWjIxmFAM6S194d/OyJfnDg= + +html-comment-regex@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/html-comment-regex/-/html-comment-regex-1.1.2.tgz#97d4688aeb5c81886a364faa0cad1dda14d433a7" + integrity sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ== + +html-entities@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.2.1.tgz#0df29351f0721163515dfb9e5543e5f6eed5162f" + integrity sha1-DfKTUfByEWNRXfueVUPl9u7VFi8= + +html-minifier-terser@^5.0.1, html-minifier-terser@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/html-minifier-terser/-/html-minifier-terser-5.0.2.tgz#0e67a0b062ae1dd0719fc73199479298f807ae16" + integrity sha512-VAaitmbBuHaPKv9bj47XKypRhgDxT/cDLvsPiiF7w+omrN3K0eQhpigV9Z1ilrmHa9e0rOYcD6R/+LCDADGcnQ== + dependencies: + camel-case "^3.0.0" + clean-css "^4.2.1" + commander "^4.0.0" + he "^1.2.0" + param-case "^2.1.1" + relateurl "^0.2.7" + terser "^4.3.9" + +html-tags@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/html-tags/-/html-tags-3.1.0.tgz#7b5e6f7e665e9fb41f30007ed9e0d41e97fb2140" + integrity sha512-1qYz89hW3lFDEazhjW0yVAV87lw8lVkrJocr72XmBkMKsoSVJCQx3W8BXsC7hO2qAt8BoVjYjtAcZ9perqGnNg== + +html-void-elements@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/html-void-elements/-/html-void-elements-1.0.4.tgz#95e8bb5ecd6b88766569c2645f2b5f1591db9ba5" + integrity sha512-yMk3naGPLrfvUV9TdDbuYXngh/TpHbA6TrOw3HL9kS8yhwx7i309BReNg7CbAJXGE+UMJ6je5OqJ7lC63o6YuQ== + +html-webpack-plugin@^4.0.0-beta.11: + version "4.0.0-beta.11" + resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-4.0.0-beta.11.tgz#3059a69144b5aecef97708196ca32f9e68677715" + integrity sha512-4Xzepf0qWxf8CGg7/WQM5qBB2Lc/NFI7MhU59eUDTkuQp3skZczH4UA1d6oQyDEIoMDgERVhRyTdtUPZ5s5HBg== + dependencies: + html-minifier-terser "^5.0.1" + loader-utils "^1.2.3" + lodash "^4.17.15" + pretty-error "^2.1.1" + tapable "^1.1.3" + util.promisify "1.0.0" + +htmlparser2@^3.3.0, htmlparser2@^3.9.1: + version "3.10.1" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.10.1.tgz#bd679dc3f59897b6a34bb10749c855bb53a9392f" + integrity sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ== + dependencies: + domelementtype "^1.3.1" + domhandler "^2.3.0" + domutils "^1.5.1" + entities "^1.1.1" + inherits "^2.0.1" + readable-stream "^3.1.1" + +http-deceiver@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87" + integrity sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc= + +http-errors@1.7.2: + version "1.7.2" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f" + integrity sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg== + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.1" + statuses ">= 1.5.0 < 2" + toidentifier "1.0.0" + +http-errors@~1.6.2: + version "1.6.3" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" + integrity sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0= + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.0" + statuses ">= 1.4.0 < 2" + +http-errors@~1.7.2: + version "1.7.3" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06" + integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw== + dependencies: + depd "~1.1.2" + inherits "2.0.4" + setprototypeof "1.1.1" + statuses ">= 1.5.0 < 2" + toidentifier "1.0.0" + +"http-parser-js@>=0.4.0 <0.4.11": + version "0.4.10" + resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.4.10.tgz#92c9c1374c35085f75db359ec56cc257cbb93fa4" + integrity sha1-ksnBN0w1CF912zWexWzCV8u5P6Q= + +http-proxy-middleware@0.19.1: + version "0.19.1" + resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz#183c7dc4aa1479150306498c210cdaf96080a43a" + integrity sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q== + dependencies: + http-proxy "^1.17.0" + is-glob "^4.0.0" + lodash "^4.17.11" + micromatch "^3.1.10" + +http-proxy@^1.17.0: + version "1.18.0" + resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.0.tgz#dbe55f63e75a347db7f3d99974f2692a314a6a3a" + integrity sha512-84I2iJM/n1d4Hdgc6y2+qY5mDaz2PUVjlg9znE9byl+q0uC3DeByqBGReQu5tpLK0TAqTIXScRUV+dg7+bUPpQ== + dependencies: + eventemitter3 "^4.0.0" + follow-redirects "^1.0.0" + requires-port "^1.0.0" + +http-signature@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" + integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= + dependencies: + assert-plus "^1.0.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + +https-browserify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" + integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= + +human-signals@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3" + integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw== + +iconv-lite@0.4.24, iconv-lite@^0.4.24: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +icss-utils@^4.0.0, icss-utils@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-4.1.1.tgz#21170b53789ee27447c2f47dd683081403f9a467" + integrity sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA== + dependencies: + postcss "^7.0.14" + +ieee754@^1.1.4: + version "1.1.13" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84" + integrity sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg== + +iferr@^0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" + integrity sha1-xg7taebY/bazEEofy8ocGS3FtQE= + +ignore@^3.3.5: + version "3.3.10" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043" + integrity sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug== + +ignore@^5.1.1: + version "5.1.4" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.4.tgz#84b7b3dbe64552b6ef0eca99f6743dbec6d97adf" + integrity sha512-MzbUSahkTW1u7JpKKjY7LCARd1fU5W2rLdxlM4kdkayuCwZImjkpluF9CM1aLewYJguPDqewLam18Y6AU69A8A== + +immediate@^3.2.3: + version "3.2.3" + resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.2.3.tgz#d140fa8f614659bd6541233097ddaac25cdd991c" + integrity sha1-0UD6j2FGWb1lQSMwl92qwlzdmRw= + +immer@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/immer/-/immer-1.10.0.tgz#bad67605ba9c810275d91e1c2a47d4582e98286d" + integrity sha512-O3sR1/opvCDGLEVcvrGTMtLac8GJ5IwZC4puPrLuRj3l7ICKvkmA0vGuU9OW8mV9WIBRnaxp5GJh9IEAaNOoYg== + +import-cwd@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/import-cwd/-/import-cwd-2.1.0.tgz#aa6cf36e722761285cb371ec6519f53e2435b0a9" + integrity sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk= + dependencies: + import-from "^2.1.0" + +import-fresh@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-2.0.0.tgz#d81355c15612d386c61f9ddd3922d4304822a546" + integrity sha1-2BNVwVYS04bGH53dOSLUMEgipUY= + dependencies: + caller-path "^2.0.0" + resolve-from "^3.0.0" + +import-fresh@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.2.1.tgz#633ff618506e793af5ac91bf48b72677e15cbe66" + integrity sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +import-from@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/import-from/-/import-from-2.1.0.tgz#335db7f2a7affd53aaa471d4b8021dee36b7f3b1" + integrity sha1-M1238qev/VOqpHHUuAId7ja387E= + dependencies: + resolve-from "^3.0.0" + +import-local@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-2.0.0.tgz#55070be38a5993cf18ef6db7e961f5bee5c5a09d" + integrity sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ== + dependencies: + pkg-dir "^3.0.0" + resolve-cwd "^2.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= + +indent-string@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" + integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== + +indexes-of@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607" + integrity sha1-8w9xbI4r00bHtn0985FVZqfAVgc= + +infer-owner@^1.0.3, infer-owner@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467" + integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A== + +infima@0.2.0-alpha.3: + version "0.2.0-alpha.3" + resolved "https://registry.yarnpkg.com/infima/-/infima-0.2.0-alpha.3.tgz#86c0bd9ee7a38e921bee0611970f1a7b71d69b32" + integrity sha512-3DusmJsdsaZeLYgcHubVQHqRht/0/evhfGaqQBcBgp/vnc7TEeoLUBREJTHMFdCoZUGDy2UfkNiMAwpUrVhyEg== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +inherits@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" + integrity sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE= + +inherits@2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= + +ini@^1.3.5: + version "1.3.5" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" + integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== + +inline-style-parser@0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/inline-style-parser/-/inline-style-parser-0.1.1.tgz#ec8a3b429274e9c0a1f1c4ffa9453a7fef72cea1" + integrity sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q== + +inquirer@6.5.0: + version "6.5.0" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.5.0.tgz#2303317efc9a4ea7ec2e2df6f86569b734accf42" + integrity sha512-scfHejeG/lVZSpvCXpsB4j/wQNPM5JC8kiElOI0OUTwmc1RTpXr4H32/HOlQHcZiYl2z2VElwuCVDRG8vFmbnA== + dependencies: + ansi-escapes "^3.2.0" + chalk "^2.4.2" + cli-cursor "^2.1.0" + cli-width "^2.0.0" + external-editor "^3.0.3" + figures "^2.0.0" + lodash "^4.17.12" + mute-stream "0.0.7" + run-async "^2.2.0" + rxjs "^6.4.0" + string-width "^2.1.0" + strip-ansi "^5.1.0" + through "^2.3.6" + +internal-ip@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/internal-ip/-/internal-ip-4.3.0.tgz#845452baad9d2ca3b69c635a137acb9a0dad0907" + integrity sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg== + dependencies: + default-gateway "^4.2.0" + ipaddr.js "^1.9.0" + +interpret@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.2.0.tgz#d5061a6224be58e8083985f5014d844359576296" + integrity sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw== + +invariant@^2.2.2, invariant@^2.2.4: + version "2.2.4" + resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" + integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== + dependencies: + loose-envify "^1.0.0" + +invert-kv@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-2.0.0.tgz#7393f5afa59ec9ff5f67a27620d11c226e3eec02" + integrity sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA== + +ip-regex@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-2.1.0.tgz#fa78bf5d2e6913c911ce9f819ee5146bb6d844e9" + integrity sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk= + +ip@^1.1.0, ip@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" + integrity sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo= + +ipaddr.js@1.9.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.0.tgz#37df74e430a0e47550fe54a2defe30d8acd95f65" + integrity sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA== + +ipaddr.js@^1.9.0: + version "1.9.1" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" + integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== + +is-absolute-url@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz#50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6" + integrity sha1-UFMN+4T8yap9vnhS6Do3uTufKqY= + +is-absolute-url@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-3.0.3.tgz#96c6a22b6a23929b11ea0afb1836c36ad4a5d698" + integrity sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q== + +is-accessor-descriptor@^0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" + integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= + dependencies: + kind-of "^3.0.2" + +is-accessor-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" + integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== + dependencies: + kind-of "^6.0.0" + +is-alphabetical@1.0.3, is-alphabetical@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-alphabetical/-/is-alphabetical-1.0.3.tgz#eb04cc47219a8895d8450ace4715abff2258a1f8" + integrity sha512-eEMa6MKpHFzw38eKm56iNNi6GJ7lf6aLLio7Kr23sJPAECscgRtZvOBYybejWDQ2bM949Y++61PY+udzj5QMLA== + +is-alphanumerical@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-alphanumerical/-/is-alphanumerical-1.0.3.tgz#57ae21c374277b3defe0274c640a5704b8f6657c" + integrity sha512-A1IGAPO5AW9vSh7omxIlOGwIqEvpW/TA+DksVOPM5ODuxKlZS09+TEM1E3275lJqO2oJ38vDpeAL3DCIiHE6eA== + dependencies: + is-alphabetical "^1.0.0" + is-decimal "^1.0.0" + +is-arguments@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.0.4.tgz#3faf966c7cba0ff437fb31f6250082fcf0448cf3" + integrity sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA== + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= + +is-arrayish@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" + integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== + +is-binary-path@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" + integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg= + dependencies: + binary-extensions "^1.0.0" + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-buffer@^1.1.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== + +is-buffer@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.4.tgz#3e572f23c8411a5cfd9557c849e3665e0b290623" + integrity sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A== + +is-callable@^1.1.4, is-callable@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.5.tgz#f7e46b596890456db74e7f6e976cb3273d06faab" + integrity sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q== + +is-color-stop@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-color-stop/-/is-color-stop-1.1.0.tgz#cfff471aee4dd5c9e158598fbe12967b5cdad345" + integrity sha1-z/9HGu5N1cnhWFmPvhKWe1za00U= + dependencies: + css-color-names "^0.0.4" + hex-color-regex "^1.1.0" + hsl-regex "^1.0.0" + hsla-regex "^1.0.0" + rgb-regex "^1.0.1" + rgba-regex "^1.0.0" + +is-data-descriptor@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" + integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= + dependencies: + kind-of "^3.0.2" + +is-data-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" + integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== + dependencies: + kind-of "^6.0.0" + +is-date-object@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.2.tgz#bda736f2cd8fd06d32844e7743bfa7494c3bfd7e" + integrity sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g== + +is-decimal@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-decimal/-/is-decimal-1.0.3.tgz#381068759b9dc807d8c0dc0bfbae2b68e1da48b7" + integrity sha512-bvLSwoDg2q6Gf+E2LEPiklHZxxiSi3XAh4Mav65mKqTfCO1HM3uBs24TjEH8iJX3bbDdLXKJXBTmGzuTUuAEjQ== + +is-descriptor@^0.1.0: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" + integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== + dependencies: + is-accessor-descriptor "^0.1.6" + is-data-descriptor "^0.1.4" + kind-of "^5.0.0" + +is-descriptor@^1.0.0, is-descriptor@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" + integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== + dependencies: + is-accessor-descriptor "^1.0.0" + is-data-descriptor "^1.0.0" + kind-of "^6.0.2" + +is-directory@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1" + integrity sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE= + +is-extendable@^0.1.0, is-extendable@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= + +is-extendable@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" + integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== + dependencies: + is-plain-object "^2.0.4" + +is-extglob@^2.1.0, is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= + +is-fullwidth-code-point@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" + integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= + dependencies: + number-is-nan "^1.0.0" + +is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-glob@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" + integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo= + dependencies: + is-extglob "^2.1.0" + +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" + integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== + dependencies: + is-extglob "^2.1.1" + +is-hexadecimal@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-1.0.3.tgz#e8a426a69b6d31470d3a33a47bb825cda02506ee" + integrity sha512-zxQ9//Q3D/34poZf8fiy3m3XVpbQc7ren15iKqrTtLPwkPD/t3Scy9Imp63FujULGxuK0ZlCwoo5xNpktFgbOA== + +is-number@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" + integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= + dependencies: + kind-of "^3.0.2" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-obj@^1.0.0, is-obj@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" + integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8= + +is-path-cwd@^2.0.0, is-path-cwd@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-2.2.0.tgz#67d43b82664a7b5191fd9119127eb300048a9fdb" + integrity sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ== + +is-path-in-cwd@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz#bfe2dca26c69f397265a4009963602935a053acb" + integrity sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ== + dependencies: + is-path-inside "^2.1.0" + +is-path-inside@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-2.1.0.tgz#7c9810587d659a40d27bcdb4d5616eab059494b2" + integrity sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg== + dependencies: + path-is-inside "^1.0.2" + +is-path-inside@^3.0.1: + version "3.0.2" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.2.tgz#f5220fc82a3e233757291dddc9c5877f2a1f3017" + integrity sha512-/2UGPSgmtqwo1ktx8NDHjuPwZWmHhO+gj0f93EkhLB5RgW9RZevWYYlIkS6zePc6U2WpOdQYIwHe9YC4DWEBVg== + +is-plain-obj@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" + integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= + +is-plain-obj@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.0.0.tgz#7fd1a7f1b69e160cde9181d2313f445c68aa2679" + integrity sha512-EYisGhpgSCwspmIuRHGjROWTon2Xp8Z7U03Wubk/bTL5TTRC5R1rGVgyjzBrk9+ULdH6cRD06KRcw/xfqhVYKQ== + +is-plain-object@^2.0.3, is-plain-object@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== + dependencies: + isobject "^3.0.1" + +is-promise@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" + integrity sha1-eaKp7OfwlugPNtKy87wWwf9L8/o= + +is-regex@^1.0.4, is-regex@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.5.tgz#39d589a358bf18967f726967120b8fc1aed74eae" + integrity sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ== + dependencies: + has "^1.0.3" + +is-regexp@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-1.0.0.tgz#fd2d883545c46bac5a633e7b9a09e87fa2cb5069" + integrity sha1-/S2INUXEa6xaYz57mgnof6LLUGk= + +is-resolvable@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" + integrity sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg== + +is-root@2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-root/-/is-root-2.1.0.tgz#809e18129cf1129644302a4f8544035d51984a9c" + integrity sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg== + +is-stream@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= + +is-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.0.tgz#bde9c32680d6fae04129d6ac9d921ce7815f78e3" + integrity sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw== + +is-svg@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-svg/-/is-svg-3.0.0.tgz#9321dbd29c212e5ca99c4fa9794c714bcafa2f75" + integrity sha512-gi4iHK53LR2ujhLVVj+37Ykh9GLqYHX6JOVXbLAucaG/Cqw9xwdFOjDM2qeifLs1sF1npXXFvDu0r5HNgCMrzQ== + dependencies: + html-comment-regex "^1.1.0" + +is-symbol@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937" + integrity sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ== + dependencies: + has-symbols "^1.0.1" + +is-typedarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= + +is-whitespace-character@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-whitespace-character/-/is-whitespace-character-1.0.3.tgz#b3ad9546d916d7d3ffa78204bca0c26b56257fac" + integrity sha512-SNPgMLz9JzPccD3nPctcj8sZlX9DAMJSKH8bP7Z6bohCwuNgX8xbWr1eTAYXX9Vpi/aSn8Y1akL9WgM3t43YNQ== + +is-windows@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" + integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== + +is-word-character@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-word-character/-/is-word-character-1.0.3.tgz#264d15541cbad0ba833d3992c34e6b40873b08aa" + integrity sha512-0wfcrFgOOOBdgRNT9H33xe6Zi6yhX/uoc4U8NBZGeQQB0ctU1dnlNTyL9JM2646bHDTpsDm1Brb3VPoCIMrd/A== + +is-wsl@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" + integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0= + +isarray@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" + integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= + +isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= + +isarray@^2.0.1: + version "2.0.5" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" + integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= + +isobject@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= + dependencies: + isarray "1.0.0" + +isobject@^3.0.0, isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= + +isstream@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= + +jest-worker@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-24.9.0.tgz#5dbfdb5b2d322e98567898238a9697bcce67b3e5" + integrity sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw== + dependencies: + merge-stream "^2.0.0" + supports-color "^6.1.0" + +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-tokens@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" + integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls= + +js-yaml@^3.11.0, js-yaml@^3.13.1: + version "3.13.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" + integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +jsbn@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= + +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + +jsesc@~0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= + +json-parse-better-errors@^1.0.1, json-parse-better-errors@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" + integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-schema@0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" + integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= + +json-stringify-safe@~5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= + +json3@^3.3.2: + version "3.3.3" + resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.3.tgz#7fc10e375fc5ae42c4705a5cc0aa6f62be305b81" + integrity sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA== + +json5@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" + integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== + dependencies: + minimist "^1.2.0" + +json5@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.1.tgz#81b6cb04e9ba496f1c7005d07b4368a2638f90b6" + integrity sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ== + dependencies: + minimist "^1.2.0" + +jsonfile@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" + integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= + optionalDependencies: + graceful-fs "^4.1.6" + +jsprim@^1.2.2: + version "1.4.1" + resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" + integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI= + dependencies: + assert-plus "1.0.0" + extsprintf "1.3.0" + json-schema "0.2.3" + verror "1.10.0" + +killable@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/killable/-/killable-1.0.1.tgz#4c8ce441187a061c7474fb87ca08e2a638194892" + integrity sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg== + +kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: + version "3.2.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" + integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= + dependencies: + is-buffer "^1.1.5" + +kind-of@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" + integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= + dependencies: + is-buffer "^1.1.5" + +kind-of@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" + integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== + +kind-of@^6.0.0, kind-of@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" + integrity sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA== + +last-call-webpack-plugin@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/last-call-webpack-plugin/-/last-call-webpack-plugin-3.0.0.tgz#9742df0e10e3cf46e5c0381c2de90d3a7a2d7555" + integrity sha512-7KI2l2GIZa9p2spzPIVZBYyNKkN+e/SQPpnjlTiPhdbDW3F86tdKKELxKpzJ5sgU19wQWsACULZmpTPYHeWO5w== + dependencies: + lodash "^4.17.5" + webpack-sources "^1.1.0" + +lcid@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/lcid/-/lcid-2.0.0.tgz#6ef5d2df60e52f82eb228a4c373e8d1f397253cf" + integrity sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA== + dependencies: + invert-kv "^2.0.0" + +leven@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" + integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== + +levenary@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/levenary/-/levenary-1.1.0.tgz#fc146fe75f32dc483a0a2c64aef720f602cd6210" + integrity sha512-VHcwhO0UTpUW7rLPN2/OiWJdgA1e9BqEDALhrgCe/F+uUJnep6CoUsTzMeP8Rh0NGr9uKquXxqe7lwLZo509nQ== + dependencies: + leven "^3.1.0" + +load-script@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/load-script/-/load-script-1.0.0.tgz#0491939e0bee5643ee494a7e3da3d2bac70c6ca4" + integrity sha1-BJGTngvuVkPuSUp+PaPSuscMbKQ= + +loader-runner@^2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357" + integrity sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw== + +loader-utils@1.2.3, loader-utils@^1.0.2, loader-utils@^1.1.0, loader-utils@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.2.3.tgz#1ff5dc6911c9f0a062531a4c04b609406108c2c7" + integrity sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA== + dependencies: + big.js "^5.2.2" + emojis-list "^2.0.0" + json5 "^1.0.1" + +locate-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" + integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4= + dependencies: + p-locate "^2.0.0" + path-exists "^3.0.0" + +locate-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" + integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== + dependencies: + p-locate "^3.0.0" + path-exists "^3.0.0" + +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== + dependencies: + p-locate "^4.1.0" + +lodash._reinterpolate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" + integrity sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0= + +lodash.assignin@^4.0.9: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.assignin/-/lodash.assignin-4.2.0.tgz#ba8df5fb841eb0a3e8044232b0e263a8dc6a28a2" + integrity sha1-uo31+4QesKPoBEIysOJjqNxqKKI= + +lodash.bind@^4.1.4: + version "4.2.1" + resolved "https://registry.yarnpkg.com/lodash.bind/-/lodash.bind-4.2.1.tgz#7ae3017e939622ac31b7d7d7dcb1b34db1690d35" + integrity sha1-euMBfpOWIqwxt9fX3LGzTbFpDTU= + +lodash.chunk@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.chunk/-/lodash.chunk-4.2.0.tgz#66e5ce1f76ed27b4303d8c6512e8d1216e8106bc" + integrity sha1-ZuXOH3btJ7QwPYxlEujRIW6BBrw= + +lodash.defaults@^4.0.1: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c" + integrity sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw= + +lodash.filter@^4.4.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.filter/-/lodash.filter-4.6.0.tgz#668b1d4981603ae1cc5a6fa760143e480b4c4ace" + integrity sha1-ZosdSYFgOuHMWm+nYBQ+SAtMSs4= + +lodash.flatten@^4.2.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f" + integrity sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8= + +lodash.foreach@^4.3.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.foreach/-/lodash.foreach-4.5.0.tgz#1a6a35eace401280c7f06dddec35165ab27e3e53" + integrity sha1-Gmo16s5AEoDH8G3d7DUWWrJ+PlM= + +lodash.map@^4.4.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.map/-/lodash.map-4.6.0.tgz#771ec7839e3473d9c4cde28b19394c3562f4f6d3" + integrity sha1-dx7Hg540c9nEzeKLGTlMNWL09tM= + +lodash.memoize@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" + integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4= + +lodash.merge@^4.4.0: + version "4.6.2" + resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + +lodash.padstart@^4.6.1: + version "4.6.1" + resolved "https://registry.yarnpkg.com/lodash.padstart/-/lodash.padstart-4.6.1.tgz#d2e3eebff0d9d39ad50f5cbd1b52a7bce6bb611b" + integrity sha1-0uPuv/DZ05rVD1y9G1KnvOa7YRs= + +lodash.pick@^4.2.1: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.pick/-/lodash.pick-4.4.0.tgz#52f05610fff9ded422611441ed1fc123a03001b3" + integrity sha1-UvBWEP/53tQiYRRB7R/BI6AwAbM= + +lodash.reduce@^4.4.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.reduce/-/lodash.reduce-4.6.0.tgz#f1ab6b839299ad48f784abbf476596f03b914d3b" + integrity sha1-8atrg5KZrUj3hKu/R2WW8DuRTTs= + +lodash.reject@^4.4.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.reject/-/lodash.reject-4.6.0.tgz#80d6492dc1470864bbf583533b651f42a9f52415" + integrity sha1-gNZJLcFHCGS79YNTO2UfQqn1JBU= + +lodash.some@^4.4.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.some/-/lodash.some-4.6.0.tgz#1bb9f314ef6b8baded13b549169b2a945eb68e4d" + integrity sha1-G7nzFO9ri63tE7VJFpsqlF62jk0= + +lodash.sortby@^4.7.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" + integrity sha1-7dFMgk4sycHgsKG0K7UhBRakJDg= + +lodash.template@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.5.0.tgz#f976195cf3f347d0d5f52483569fe8031ccce8ab" + integrity sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A== + dependencies: + lodash._reinterpolate "^3.0.0" + lodash.templatesettings "^4.0.0" + +lodash.templatesettings@^4.0.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz#e481310f049d3cf6d47e912ad09313b154f0fb33" + integrity sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ== + dependencies: + lodash._reinterpolate "^3.0.0" + +lodash.toarray@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.toarray/-/lodash.toarray-4.4.0.tgz#24c4bfcd6b2fba38bfd0594db1179d8e9b656561" + integrity sha1-JMS/zWsvuji/0FlNsRedjptlZWE= + +lodash.uniq@4.5.0, lodash.uniq@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" + integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= + +lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.5: + version "4.17.15" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" + integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== + +loglevel@^1.6.6: + version "1.6.6" + resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.6.6.tgz#0ee6300cc058db6b3551fa1c4bf73b83bb771312" + integrity sha512-Sgr5lbboAUBo3eXCSPL4/KoVz3ROKquOjcctxmHIt+vol2DrqTQe3SwkKKuYhEiWB5kYa13YyopJ69deJ1irzQ== + +loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.2.0, loose-envify@^1.3.1, loose-envify@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + +lower-case@^1.1.1: + version "1.1.4" + resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-1.1.4.tgz#9a2cabd1b9e8e0ae993a4bf7d5875c39c42e8eac" + integrity sha1-miyr0bno4K6ZOkv31YdcOcQujqw= + +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" + +make-dir@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" + integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== + dependencies: + pify "^4.0.1" + semver "^5.6.0" + +make-dir@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.0.0.tgz#1b5f39f6b9270ed33f9f054c5c0f84304989f801" + integrity sha512-grNJDhb8b1Jm1qeqW5R/O63wUo4UXo2v2HMic6YT9i/HBlF93S8jkMgH7yugvY9ABDShH4VZMn8I+U8+fCNegw== + dependencies: + semver "^6.0.0" + +mamacro@^0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/mamacro/-/mamacro-0.0.3.tgz#ad2c9576197c9f1abf308d0787865bd975a3f3e4" + integrity sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA== + +map-age-cleaner@^0.1.1: + version "0.1.3" + resolved "https://registry.yarnpkg.com/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz#7d583a7306434c055fe474b0f45078e6e1b4b92a" + integrity sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w== + dependencies: + p-defer "^1.0.0" + +map-cache@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" + integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= + +map-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" + integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= + dependencies: + object-visit "^1.0.0" + +markdown-escapes@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/markdown-escapes/-/markdown-escapes-1.0.3.tgz#6155e10416efaafab665d466ce598216375195f5" + integrity sha512-XUi5HJhhV5R74k8/0H2oCbCiYf/u4cO/rX8tnGkRvrqhsr5BRNU6Mg0yt/8UIx1iIS8220BNJsDb7XnILhLepw== + +md5.js@^1.3.4: + version "1.3.5" + resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" + integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +mdast-squeeze-paragraphs@^3.0.0: + version "3.0.5" + resolved "https://registry.yarnpkg.com/mdast-squeeze-paragraphs/-/mdast-squeeze-paragraphs-3.0.5.tgz#f428b6b944f8faef454db9b58f170c4183cb2e61" + integrity sha512-xX6Vbe348Y/rukQlG4W3xH+7v4ZlzUbSY4HUIQCuYrF2DrkcHx584mCaFxkWoDZKNUfyLZItHC9VAqX3kIP7XA== + dependencies: + unist-util-remove "^1.0.0" + +mdast-util-definitions@^1.2.0: + version "1.2.5" + resolved "https://registry.yarnpkg.com/mdast-util-definitions/-/mdast-util-definitions-1.2.5.tgz#3fe622a4171c774ebd06f11e9f8af7ec53ea5c74" + integrity sha512-CJXEdoLfiISCDc2JB6QLb79pYfI6+GcIH+W2ox9nMc7od0Pz+bovcHsiq29xAQY6ayqe/9CsK2VzkSJdg1pFYA== + dependencies: + unist-util-visit "^1.0.0" + +mdast-util-to-hast@6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/mdast-util-to-hast/-/mdast-util-to-hast-6.0.2.tgz#24a8791b7c624118637d70f03a9d29116e4311cf" + integrity sha512-GjcOimC9qHI0yNFAQdBesrZXzUkRdFleQlcoU8+TVNfDW6oLUazUx8MgUoTaUyCJzBOnE5AOgqhpURrSlf0QwQ== + dependencies: + collapse-white-space "^1.0.0" + detab "^2.0.0" + mdast-util-definitions "^1.2.0" + mdurl "^1.0.1" + trim "0.0.1" + trim-lines "^1.0.0" + unist-builder "^1.0.1" + unist-util-generated "^1.1.0" + unist-util-position "^3.0.0" + unist-util-visit "^1.1.0" + xtend "^4.0.1" + +mdast-util-to-string@^1.0.0, mdast-util-to-string@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/mdast-util-to-string/-/mdast-util-to-string-1.0.7.tgz#62d8e9c6b2113070d8b497c7dc35bf12796f06ee" + integrity sha512-P+gdtssCoHOX+eJUrrC30Sixqao86ZPlVjR5NEAoy0U79Pfxb1Y0Gntei0+GrnQD4T04X9xA8tcugp90cSmNow== + +mdn-data@2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.4.tgz#699b3c38ac6f1d728091a64650b65d388502fd5b" + integrity sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA== + +mdurl@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-1.0.1.tgz#fe85b2ec75a59037f2adfec100fd6c601761152e" + integrity sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4= + +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= + +mem@^4.0.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/mem/-/mem-4.3.0.tgz#461af497bc4ae09608cdb2e60eefb69bff744178" + integrity sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w== + dependencies: + map-age-cleaner "^0.1.1" + mimic-fn "^2.0.0" + p-is-promise "^2.0.0" + +memory-fs@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" + integrity sha1-OpoguEYlI+RHz7x+i7gO1me/xVI= + dependencies: + errno "^0.1.3" + readable-stream "^2.0.1" + +memory-fs@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.5.0.tgz#324c01288b88652966d161db77838720845a8e3c" + integrity sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA== + dependencies: + errno "^0.1.3" + readable-stream "^2.0.1" + +merge-descriptors@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" + integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= + +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + +merge2@^1.2.3, merge2@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.3.0.tgz#5b366ee83b2f1582c48f87e47cf1a9352103ca81" + integrity sha512-2j4DAdlBOkiSZIsaXk4mTE3sRS02yBHAtfy127xRV3bQUFqXkjHCHLW6Scv7DwNRbIWNHH8zpnz9zMaKXIdvYw== + +methods@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= + +microevent.ts@~0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/microevent.ts/-/microevent.ts-0.1.1.tgz#70b09b83f43df5172d0205a63025bce0f7357fa0" + integrity sha512-jo1OfR4TaEwd5HOrt5+tAZ9mqT4jmpNAusXtyfNzqVm9uiSYFZlKM1wYL4oU7azZW/PxQW53wM0S6OR1JHNa2g== + +micromatch@^3.1.10, micromatch@^3.1.4: + version "3.1.10" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" + integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== + dependencies: + 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" + +micromatch@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.2.tgz#4fcb0999bf9fbc2fcbdd212f6d629b9a56c39259" + integrity sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q== + dependencies: + braces "^3.0.1" + picomatch "^2.0.5" + +miller-rabin@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" + integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA== + dependencies: + bn.js "^4.0.0" + brorand "^1.0.1" + +mime-db@1.43.0, "mime-db@>= 1.43.0 < 2": + version "1.43.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.43.0.tgz#0a12e0502650e473d735535050e7c8f4eb4fae58" + integrity sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ== + +mime-types@^2.1.12, mime-types@~2.1.17, mime-types@~2.1.19, mime-types@~2.1.24: + version "2.1.26" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.26.tgz#9c921fc09b7e149a65dfdc0da4d20997200b0a06" + integrity sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ== + dependencies: + mime-db "1.43.0" + +mime@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + +mime@^2.4.4: + version "2.4.4" + resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.4.tgz#bd7b91135fc6b01cde3e9bae33d659b63d8857e5" + integrity sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA== + +mimic-fn@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" + integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== + +mimic-fn@^2.0.0, mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +min-document@^2.19.0: + version "2.19.0" + resolved "https://registry.yarnpkg.com/min-document/-/min-document-2.19.0.tgz#7bd282e3f5842ed295bb748cdd9f1ffa2c824685" + integrity sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU= + dependencies: + dom-walk "^0.1.0" + +mini-create-react-context@^0.3.0: + version "0.3.2" + resolved "https://registry.yarnpkg.com/mini-create-react-context/-/mini-create-react-context-0.3.2.tgz#79fc598f283dd623da8e088b05db8cddab250189" + integrity sha512-2v+OeetEyliMt5VHMXsBhABoJ0/M4RCe7fatd/fBy6SMiKazUSEt3gxxypfnk2SHMkdBYvorHRoQxuGoiwbzAw== + dependencies: + "@babel/runtime" "^7.4.0" + gud "^1.0.0" + tiny-warning "^1.0.2" + +mini-css-extract-plugin@^0.8.0: + version "0.8.2" + resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-0.8.2.tgz#a875e169beb27c88af77dd962771c9eedc3da161" + integrity sha512-a3Y4of27Wz+mqK3qrcd3VhYz6cU0iW5x3Sgvqzbj+XmlrSizmvu8QQMl5oMYJjgHOC4iyt+w7l4umP+dQeW3bw== + dependencies: + loader-utils "^1.1.0" + normalize-url "1.9.1" + schema-utils "^1.0.0" + webpack-sources "^1.1.0" + +minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== + +minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" + integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= + +minimatch@3.0.4, minimatch@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== + dependencies: + brace-expansion "^1.1.7" + +minimist@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" + integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= + +minimist@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" + integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= + +minipass-collect@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/minipass-collect/-/minipass-collect-1.0.2.tgz#22b813bf745dc6edba2576b940022ad6edc8c617" + integrity sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA== + dependencies: + minipass "^3.0.0" + +minipass-flush@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/minipass-flush/-/minipass-flush-1.0.5.tgz#82e7135d7e89a50ffe64610a787953c4c4cbb373" + integrity sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw== + dependencies: + minipass "^3.0.0" + +minipass-pipeline@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/minipass-pipeline/-/minipass-pipeline-1.2.2.tgz#3dcb6bb4a546e32969c7ad710f2c79a86abba93a" + integrity sha512-3JS5A2DKhD2g0Gg8x3yamO0pj7YeKGwVlDS90pF++kxptwx/F+B//roxf9SqYil5tQo65bijy+dAuAFZmYOouA== + dependencies: + minipass "^3.0.0" + +minipass@^3.0.0, minipass@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.1.1.tgz#7607ce778472a185ad6d89082aa2070f79cedcd5" + integrity sha512-UFqVihv6PQgwj8/yTGvl9kPz7xIAY+R5z6XYjRInD3Gk3qx6QGSD6zEcpeG4Dy/lQnv1J6zv8ejV90hyYIKf3w== + dependencies: + yallist "^4.0.0" + +mississippi@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-3.0.0.tgz#ea0a3291f97e0b5e8776b363d5f0a12d94c67022" + integrity sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA== + dependencies: + 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@^1.2.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" + integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== + dependencies: + for-in "^1.0.2" + is-extendable "^1.0.1" + +mkdirp@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.3.0.tgz#1bbf5ab1ba827af23575143490426455f481fe1e" + integrity sha1-G79asbqCevI1dRQ0kEJkVfSB/h4= + +mkdirp@^0.5.1, mkdirp@~0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" + integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= + dependencies: + minimist "0.0.8" + +move-concurrently@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92" + integrity sha1-viwAX9oy4LKa8fBdfEszIUxwH5I= + dependencies: + 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@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= + +ms@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" + integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== + +ms@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +multicast-dns-service-types@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz#899f11d9686e5e05cb91b35d5f0e63b773cfc901" + integrity sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE= + +multicast-dns@^6.0.1: + version "6.2.3" + resolved "https://registry.yarnpkg.com/multicast-dns/-/multicast-dns-6.2.3.tgz#a0ec7bd9055c4282f790c3c82f4e28db3b31b229" + integrity sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g== + dependencies: + dns-packet "^1.3.1" + thunky "^1.0.2" + +mute-stream@0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" + integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s= + +nan@^2.12.1: + version "2.14.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.0.tgz#7818f722027b2459a86f0295d434d1fc2336c52c" + integrity sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg== + +nanomatch@^1.2.9: + version "1.2.13" + resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" + integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== + dependencies: + 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@0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" + integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== + +neo-async@^2.5.0, neo-async@^2.6.1: + version "2.6.1" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.1.tgz#ac27ada66167fa8849a6addd837f6b189ad2081c" + integrity sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw== + +nice-try@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" + integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== + +no-case@^2.2.0: + version "2.3.2" + resolved "https://registry.yarnpkg.com/no-case/-/no-case-2.3.2.tgz#60b813396be39b3f1288a4c1ed5d1e7d28b464ac" + integrity sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ== + dependencies: + lower-case "^1.1.1" + +node-emoji@^1.8.1: + version "1.10.0" + resolved "https://registry.yarnpkg.com/node-emoji/-/node-emoji-1.10.0.tgz#8886abd25d9c7bb61802a658523d1f8d2a89b2da" + integrity sha512-Yt3384If5H6BYGVHiHwTL+99OzJKHhgp82S8/dktEK73T26BazdgZ4JZh92xSVtGNJvz9UbXdNAc5hcrXV42vw== + dependencies: + lodash.toarray "^4.4.0" + +node-forge@0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.9.0.tgz#d624050edbb44874adca12bb9a52ec63cb782579" + integrity sha512-7ASaDa3pD+lJ3WvXFsxekJQelBKRpne+GOVbLbtHYdd7pFspyeuJHnWfLplGf3SwKGbfs/aYl5V/JCIaHVUKKQ== + +node-libs-browser@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.2.1.tgz#b64f513d18338625f90346d27b0d235e631f6425" + integrity sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q== + dependencies: + 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" + +node-releases@^1.1.29, node-releases@^1.1.44: + version "1.1.45" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.45.tgz#4cf7e9175d71b1317f15ffd68ce63bce1d53e9f2" + integrity sha512-cXvGSfhITKI8qsV116u2FTzH5EWZJfgG7d4cpqwF8I8+1tWpD6AsvvGRKq2onR0DNj1jfqsjkXZsm14JMS7Cyg== + dependencies: + semver "^6.3.0" + +nopt@1.0.10: + version "1.0.10" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-1.0.10.tgz#6ddd21bd2a31417b92727dd585f8a6f37608ebee" + integrity sha1-bd0hvSoxQXuScn3Vhfim83YI6+4= + dependencies: + abbrev "1" + +normalize-path@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" + integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= + dependencies: + remove-trailing-separator "^1.0.1" + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +normalize-range@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" + integrity sha1-LRDAa9/TEuqXd2laTShDlFa3WUI= + +normalize-url@1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-1.9.1.tgz#2cc0d66b31ea23036458436e3620d85954c66c3c" + integrity sha1-LMDWazHqIwNkWENuNiDYWVTGbDw= + dependencies: + object-assign "^4.0.1" + prepend-http "^1.0.0" + query-string "^4.1.0" + sort-keys "^1.0.0" + +normalize-url@^3.0.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-3.3.0.tgz#b2e1c4dc4f7c6d57743df733a4f5978d18650559" + integrity sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg== + +npm-run-path@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" + integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= + dependencies: + path-key "^2.0.0" + +npm-run-path@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" + integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== + dependencies: + path-key "^3.0.0" + +nprogress@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/nprogress/-/nprogress-0.2.0.tgz#cb8f34c53213d895723fcbab907e9422adbcafb1" + integrity sha1-y480xTIT2JVyP8urkH6UIq28r7E= + +nth-check@^1.0.2, nth-check@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c" + integrity sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg== + dependencies: + boolbase "~1.0.0" + +null-loader@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/null-loader/-/null-loader-3.0.0.tgz#3e2b6c663c5bda8c73a54357d8fa0708dc61b245" + integrity sha512-hf5sNLl8xdRho4UPBOOeoIwT3WhjYcMUQm0zj44EhD6UscMAz72o2udpoDFBgykucdEDGIcd6SXbc/G6zssbzw== + dependencies: + loader-utils "^1.2.3" + schema-utils "^1.0.0" + +num2fraction@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede" + integrity sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4= + +number-is-nan@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" + integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= + +oauth-sign@~0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" + integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== + +object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= + +object-copy@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" + integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= + dependencies: + copy-descriptor "^0.1.0" + define-property "^0.2.5" + kind-of "^3.0.3" + +object-inspect@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.7.0.tgz#f4f6bd181ad77f006b5ece60bd0b6f398ff74a67" + integrity sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw== + +object-is@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.0.2.tgz#6b80eb84fe451498f65007982f035a5b445edec4" + integrity sha512-Epah+btZd5wrrfjkJZq1AOB9O6OxUQto45hzFd7lXGrpHPGE0W1k+426yrZV+k6NJOzLNNW/nVsmZdIWsAqoOQ== + +object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.0, object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object-visit@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" + integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= + dependencies: + isobject "^3.0.0" + +object.assign@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" + integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w== + dependencies: + define-properties "^1.1.2" + function-bind "^1.1.1" + has-symbols "^1.0.0" + object-keys "^1.0.11" + +object.getownpropertydescriptors@^2.0.3: + version "2.1.0" + resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz#369bf1f9592d8ab89d712dced5cb81c7c5352649" + integrity sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.0-next.1" + +object.pick@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" + integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= + dependencies: + isobject "^3.0.1" + +object.values@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.1.tgz#68a99ecde356b7e9295a3c5e0ce31dc8c953de5e" + integrity sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.0-next.1" + function-bind "^1.1.1" + has "^1.0.3" + +obuf@^1.0.0, obuf@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" + integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== + +on-finished@~2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" + integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= + dependencies: + ee-first "1.1.1" + +on-headers@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" + integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== + +once@^1.3.0, once@^1.3.1, once@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= + dependencies: + wrappy "1" + +onetime@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" + integrity sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ= + dependencies: + mimic-fn "^1.0.0" + +onetime@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.0.tgz#fff0f3c91617fe62bb50189636e99ac8a6df7be5" + integrity sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q== + dependencies: + mimic-fn "^2.1.0" + +open@^6.3.0: + version "6.4.0" + resolved "https://registry.yarnpkg.com/open/-/open-6.4.0.tgz#5c13e96d0dc894686164f18965ecfe889ecfc8a9" + integrity sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg== + dependencies: + is-wsl "^1.1.0" + +opener@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.1.tgz#6d2f0e77f1a0af0032aca716c2c1fbb8e7e8abed" + integrity sha512-goYSy5c2UXE4Ra1xixabeVh1guIX/ZV/YokJksb6q2lubWu6UbvPQ20p542/sFIll1nl8JnCyK9oBaOcCWXwvA== + +opn@^5.5.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/opn/-/opn-5.5.0.tgz#fc7164fab56d235904c51c3b27da6758ca3b9bfc" + integrity sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA== + dependencies: + is-wsl "^1.1.0" + +optimize-css-assets-webpack-plugin@^5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-5.0.3.tgz#e2f1d4d94ad8c0af8967ebd7cf138dcb1ef14572" + integrity sha512-q9fbvCRS6EYtUKKSwI87qm2IxlyJK5b4dygW1rKUBT6mMDhdG5e5bZT63v6tnJR9F9FB/H5a0HTmtw+laUBxKA== + dependencies: + cssnano "^4.1.10" + last-call-webpack-plugin "^3.0.0" + +original@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/original/-/original-1.0.2.tgz#e442a61cffe1c5fd20a65f3261c26663b303f25f" + integrity sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg== + dependencies: + url-parse "^1.4.3" + +os-browserify@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" + integrity sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc= + +os-locale@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-3.1.0.tgz#a802a6ee17f24c10483ab9935719cef4ed16bf1a" + integrity sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q== + dependencies: + execa "^1.0.0" + lcid "^2.0.0" + mem "^4.0.0" + +os-tmpdir@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= + +p-defer@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" + integrity sha1-n26xgvbJqozXQwBKfU+WsZaw+ww= + +p-finally@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= + +p-finally@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-2.0.1.tgz#bd6fcaa9c559a096b680806f4d657b3f0f240561" + integrity sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw== + +p-is-promise@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-2.1.0.tgz#918cebaea248a62cf7ffab8e3bca8c5f882fc42e" + integrity sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg== + +p-limit@^1.1.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" + integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== + dependencies: + p-try "^1.0.0" + +p-limit@^2.0.0, p-limit@^2.2.0, p-limit@^2.2.1: + version "2.2.2" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.2.2.tgz#61279b67721f5287aa1c13a9a7fbbc48c9291b1e" + integrity sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ== + dependencies: + p-try "^2.0.0" + +p-locate@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" + integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM= + dependencies: + p-limit "^1.1.0" + +p-locate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" + integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== + dependencies: + p-limit "^2.0.0" + +p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== + dependencies: + p-limit "^2.2.0" + +p-map@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175" + integrity sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw== + +p-map@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-3.0.0.tgz#d704d9af8a2ba684e2600d9a215983d4141a979d" + integrity sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ== + dependencies: + aggregate-error "^3.0.0" + +p-retry@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-3.0.1.tgz#316b4c8893e2c8dc1cfa891f406c4b422bebf328" + integrity sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w== + dependencies: + retry "^0.12.0" + +p-try@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" + integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M= + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +pako@~1.0.5: + version "1.0.10" + resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.10.tgz#4328badb5086a426aa90f541977d4955da5c9732" + integrity sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw== + +parallel-transform@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.2.0.tgz#9049ca37d6cb2182c3b1d2c720be94d14a5814fc" + integrity sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg== + dependencies: + cyclist "^1.0.1" + inherits "^2.0.3" + readable-stream "^2.1.5" + +param-case@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/param-case/-/param-case-2.1.1.tgz#df94fd8cf6531ecf75e6bef9a0858fbc72be2247" + integrity sha1-35T9jPZTHs915r75oIWPvHK+Ikc= + dependencies: + no-case "^2.2.0" + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +parse-asn1@^5.0.0: + version "5.1.5" + resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.5.tgz#003271343da58dc94cace494faef3d2147ecea0e" + integrity sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ== + dependencies: + 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-entities@^1.1.0: + version "1.2.2" + resolved "https://registry.yarnpkg.com/parse-entities/-/parse-entities-1.2.2.tgz#c31bf0f653b6661354f8973559cb86dd1d5edf50" + integrity sha512-NzfpbxW/NPrzZ/yYSoQxyqUZMZXIdCfE0OIN4ESsnptHJECoUk3FZktxNuzQf4tjt5UEopnxpYJbvYuxIFDdsg== + dependencies: + character-entities "^1.0.0" + character-entities-legacy "^1.0.0" + character-reference-invalid "^1.0.0" + is-alphanumerical "^1.0.0" + is-decimal "^1.0.0" + is-hexadecimal "^1.0.0" + +parse-json@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" + integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA= + dependencies: + error-ex "^1.3.1" + json-parse-better-errors "^1.0.1" + +parse-numeric-range@^0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/parse-numeric-range/-/parse-numeric-range-0.0.2.tgz#b4f09d413c7adbcd987f6e9233c7b4b210c938e4" + integrity sha1-tPCdQTx6282Yf26SM8e0shDJOOQ= + +parse5@^5.0.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.1.1.tgz#f68e4e5ba1852ac2cadc00f4555fff6c2abb6178" + integrity sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug== + +parseurl@~1.3.2, parseurl@~1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + +pascalcase@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" + integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= + +path-browserify@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.1.tgz#e6c4ddd7ed3aa27c68a20cc4e50e1a4ee83bbc4a" + integrity sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ== + +path-dirname@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" + integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA= + +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= + +path-is-inside@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" + integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= + +path-key@^2.0.0, path-key@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" + integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= + +path-key@^3.0.0, path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-parse@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" + integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== + +path-to-regexp@0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" + integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= + +path-to-regexp@^1.7.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.8.0.tgz#887b3ba9d84393e87a0a0b9f4cb756198b53548a" + integrity sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA== + dependencies: + isarray "0.0.1" + +path-type@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" + integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg== + dependencies: + pify "^3.0.0" + +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + +pbkdf2@^3.0.3: + version "3.0.17" + resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.17.tgz#976c206530617b14ebb32114239f7b09336e93a6" + integrity sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA== + dependencies: + create-hash "^1.1.2" + create-hmac "^1.1.4" + ripemd160 "^2.0.1" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +performance-now@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= + +picomatch@^2.0.4, picomatch@^2.0.5, picomatch@^2.0.7: + version "2.2.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.1.tgz#21bac888b6ed8601f831ce7816e335bc779f0a4a" + integrity sha512-ISBaA8xQNmwELC7eOjqFKMESB2VIqt4PPDD0nsS95b/9dZXvVKOlz9keMSnoGGKcOHXfTvDD6WMaRoSc9UuhRA== + +pify@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= + +pify@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" + integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= + +pify@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" + integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== + +pinkie-promise@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" + integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o= + dependencies: + pinkie "^2.0.0" + +pinkie@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" + integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= + +pkg-dir@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" + integrity sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw== + dependencies: + find-up "^3.0.0" + +pkg-dir@^4.1.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" + integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== + dependencies: + find-up "^4.0.0" + +pkg-up@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-2.0.0.tgz#c819ac728059a461cab1c3889a2be3c49a004d7f" + integrity sha1-yBmscoBZpGHKscOImivjxJoATX8= + dependencies: + find-up "^2.1.0" + +portfinder@^1.0.25: + version "1.0.25" + resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.25.tgz#254fd337ffba869f4b9d37edc298059cb4d35eca" + integrity sha512-6ElJnHBbxVA1XSLgBp7G1FiCkQdlqGzuF7DswL5tcea+E8UpuvPU7beVAjjRwCioTS9ZluNbu+ZyRvgTsmqEBg== + dependencies: + async "^2.6.2" + debug "^3.1.1" + mkdirp "^0.5.1" + +posix-character-classes@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" + integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= + +postcss-attribute-case-insensitive@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-4.0.1.tgz#b2a721a0d279c2f9103a36331c88981526428cc7" + integrity sha512-L2YKB3vF4PetdTIthQVeT+7YiSzMoNMLLYxPXXppOOP7NoazEAy45sh2LvJ8leCQjfBcfkYQs8TtCcQjeZTp8A== + dependencies: + postcss "^7.0.2" + postcss-selector-parser "^5.0.0" + +postcss-calc@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-7.0.1.tgz#36d77bab023b0ecbb9789d84dcb23c4941145436" + integrity sha512-oXqx0m6tb4N3JGdmeMSc/i91KppbYsFZKdH0xMOqK8V1rJlzrKlTdokz8ozUXLVejydRN6u2IddxpcijRj2FqQ== + dependencies: + css-unit-converter "^1.1.1" + postcss "^7.0.5" + postcss-selector-parser "^5.0.0-rc.4" + postcss-value-parser "^3.3.1" + +postcss-color-functional-notation@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/postcss-color-functional-notation/-/postcss-color-functional-notation-2.0.1.tgz#5efd37a88fbabeb00a2966d1e53d98ced93f74e0" + integrity sha512-ZBARCypjEDofW4P6IdPVTLhDNXPRn8T2s1zHbZidW6rPaaZvcnCS2soYFIQJrMZSxiePJ2XIYTlcb2ztr/eT2g== + dependencies: + postcss "^7.0.2" + postcss-values-parser "^2.0.0" + +postcss-color-gray@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/postcss-color-gray/-/postcss-color-gray-5.0.0.tgz#532a31eb909f8da898ceffe296fdc1f864be8547" + integrity sha512-q6BuRnAGKM/ZRpfDascZlIZPjvwsRye7UDNalqVz3s7GDxMtqPY6+Q871liNxsonUw8oC61OG+PSaysYpl1bnw== + dependencies: + "@csstools/convert-colors" "^1.4.0" + postcss "^7.0.5" + postcss-values-parser "^2.0.0" + +postcss-color-hex-alpha@^5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/postcss-color-hex-alpha/-/postcss-color-hex-alpha-5.0.3.tgz#a8d9ca4c39d497c9661e374b9c51899ef0f87388" + integrity sha512-PF4GDel8q3kkreVXKLAGNpHKilXsZ6xuu+mOQMHWHLPNyjiUBOr75sp5ZKJfmv1MCus5/DWUGcK9hm6qHEnXYw== + dependencies: + postcss "^7.0.14" + postcss-values-parser "^2.0.1" + +postcss-color-mod-function@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/postcss-color-mod-function/-/postcss-color-mod-function-3.0.3.tgz#816ba145ac11cc3cb6baa905a75a49f903e4d31d" + integrity sha512-YP4VG+xufxaVtzV6ZmhEtc+/aTXH3d0JLpnYfxqTvwZPbJhWqp8bSY3nfNzNRFLgB4XSaBA82OE4VjOOKpCdVQ== + dependencies: + "@csstools/convert-colors" "^1.4.0" + postcss "^7.0.2" + postcss-values-parser "^2.0.0" + +postcss-color-rebeccapurple@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-4.0.1.tgz#c7a89be872bb74e45b1e3022bfe5748823e6de77" + integrity sha512-aAe3OhkS6qJXBbqzvZth2Au4V3KieR5sRQ4ptb2b2O8wgvB3SJBsdG+jsn2BZbbwekDG8nTfcCNKcSfe/lEy8g== + dependencies: + postcss "^7.0.2" + postcss-values-parser "^2.0.0" + +postcss-colormin@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-4.0.3.tgz#ae060bce93ed794ac71264f08132d550956bd381" + integrity sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw== + dependencies: + browserslist "^4.0.0" + color "^3.0.0" + has "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-convert-values@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz#ca3813ed4da0f812f9d43703584e449ebe189a7f" + integrity sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ== + dependencies: + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-custom-media@^7.0.8: + version "7.0.8" + resolved "https://registry.yarnpkg.com/postcss-custom-media/-/postcss-custom-media-7.0.8.tgz#fffd13ffeffad73621be5f387076a28b00294e0c" + integrity sha512-c9s5iX0Ge15o00HKbuRuTqNndsJUbaXdiNsksnVH8H4gdc+zbLzr/UasOwNG6CTDpLFekVY4672eWdiiWu2GUg== + dependencies: + postcss "^7.0.14" + +postcss-custom-properties@^8.0.11: + version "8.0.11" + resolved "https://registry.yarnpkg.com/postcss-custom-properties/-/postcss-custom-properties-8.0.11.tgz#2d61772d6e92f22f5e0d52602df8fae46fa30d97" + integrity sha512-nm+o0eLdYqdnJ5abAJeXp4CEU1c1k+eB2yMCvhgzsds/e0umabFrN6HoTy/8Q4K5ilxERdl/JD1LO5ANoYBeMA== + dependencies: + postcss "^7.0.17" + postcss-values-parser "^2.0.1" + +postcss-custom-selectors@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/postcss-custom-selectors/-/postcss-custom-selectors-5.1.2.tgz#64858c6eb2ecff2fb41d0b28c9dd7b3db4de7fba" + integrity sha512-DSGDhqinCqXqlS4R7KGxL1OSycd1lydugJ1ky4iRXPHdBRiozyMHrdu0H3o7qNOCiZwySZTUI5MV0T8QhCLu+w== + dependencies: + postcss "^7.0.2" + postcss-selector-parser "^5.0.0-rc.3" + +postcss-dir-pseudo-class@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-5.0.0.tgz#6e3a4177d0edb3abcc85fdb6fbb1c26dabaeaba2" + integrity sha512-3pm4oq8HYWMZePJY+5ANriPs3P07q+LW6FAdTlkFH2XqDdP4HeeJYMOzn0HYLhRSjBO3fhiqSwwU9xEULSrPgw== + dependencies: + postcss "^7.0.2" + postcss-selector-parser "^5.0.0-rc.3" + +postcss-discard-comments@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz#1fbabd2c246bff6aaad7997b2b0918f4d7af4033" + integrity sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg== + dependencies: + postcss "^7.0.0" + +postcss-discard-duplicates@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz#3fe133cd3c82282e550fc9b239176a9207b784eb" + integrity sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ== + dependencies: + postcss "^7.0.0" + +postcss-discard-empty@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz#c8c951e9f73ed9428019458444a02ad90bb9f765" + integrity sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w== + dependencies: + postcss "^7.0.0" + +postcss-discard-overridden@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz#652aef8a96726f029f5e3e00146ee7a4e755ff57" + integrity sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg== + dependencies: + postcss "^7.0.0" + +postcss-double-position-gradients@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/postcss-double-position-gradients/-/postcss-double-position-gradients-1.0.0.tgz#fc927d52fddc896cb3a2812ebc5df147e110522e" + integrity sha512-G+nV8EnQq25fOI8CH/B6krEohGWnF5+3A6H/+JEpOncu5dCnkS1QQ6+ct3Jkaepw1NGVqqOZH6lqrm244mCftA== + dependencies: + postcss "^7.0.5" + postcss-values-parser "^2.0.0" + +postcss-env-function@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/postcss-env-function/-/postcss-env-function-2.0.2.tgz#0f3e3d3c57f094a92c2baf4b6241f0b0da5365d7" + integrity sha512-rwac4BuZlITeUbiBq60h/xbLzXY43qOsIErngWa4l7Mt+RaSkT7QBjXVGTcBHupykkblHMDrBFh30zchYPaOUw== + dependencies: + postcss "^7.0.2" + postcss-values-parser "^2.0.0" + +postcss-focus-visible@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-focus-visible/-/postcss-focus-visible-4.0.0.tgz#477d107113ade6024b14128317ade2bd1e17046e" + integrity sha512-Z5CkWBw0+idJHSV6+Bgf2peDOFf/x4o+vX/pwcNYrWpXFrSfTkQ3JQ1ojrq9yS+upnAlNRHeg8uEwFTgorjI8g== + dependencies: + postcss "^7.0.2" + +postcss-focus-within@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-focus-within/-/postcss-focus-within-3.0.0.tgz#763b8788596cee9b874c999201cdde80659ef680" + integrity sha512-W0APui8jQeBKbCGZudW37EeMCjDeVxKgiYfIIEo8Bdh5SpB9sxds/Iq8SEuzS0Q4YFOlG7EPFulbbxujpkrV2w== + dependencies: + postcss "^7.0.2" + +postcss-font-variant@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-font-variant/-/postcss-font-variant-4.0.0.tgz#71dd3c6c10a0d846c5eda07803439617bbbabacc" + integrity sha512-M8BFYKOvCrI2aITzDad7kWuXXTm0YhGdP9Q8HanmN4EF1Hmcgs1KK5rSHylt/lUJe8yLxiSwWAHdScoEiIxztg== + dependencies: + postcss "^7.0.2" + +postcss-gap-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/postcss-gap-properties/-/postcss-gap-properties-2.0.0.tgz#431c192ab3ed96a3c3d09f2ff615960f902c1715" + integrity sha512-QZSqDaMgXCHuHTEzMsS2KfVDOq7ZFiknSpkrPJY6jmxbugUPTuSzs/vuE5I3zv0WAS+3vhrlqhijiprnuQfzmg== + dependencies: + postcss "^7.0.2" + +postcss-image-set-function@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/postcss-image-set-function/-/postcss-image-set-function-3.0.1.tgz#28920a2f29945bed4c3198d7df6496d410d3f288" + integrity sha512-oPTcFFip5LZy8Y/whto91L9xdRHCWEMs3e1MdJxhgt4jy2WYXfhkng59fH5qLXSCPN8k4n94p1Czrfe5IOkKUw== + dependencies: + postcss "^7.0.2" + postcss-values-parser "^2.0.0" + +postcss-initial@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/postcss-initial/-/postcss-initial-3.0.2.tgz#f018563694b3c16ae8eaabe3c585ac6319637b2d" + integrity sha512-ugA2wKonC0xeNHgirR4D3VWHs2JcU08WAi1KFLVcnb7IN89phID6Qtg2RIctWbnvp1TM2BOmDtX8GGLCKdR8YA== + dependencies: + lodash.template "^4.5.0" + postcss "^7.0.2" + +postcss-lab-function@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/postcss-lab-function/-/postcss-lab-function-2.0.1.tgz#bb51a6856cd12289ab4ae20db1e3821ef13d7d2e" + integrity sha512-whLy1IeZKY+3fYdqQFuDBf8Auw+qFuVnChWjmxm/UhHWqNHZx+B99EwxTvGYmUBqe3Fjxs4L1BoZTJmPu6usVg== + dependencies: + "@csstools/convert-colors" "^1.4.0" + postcss "^7.0.2" + postcss-values-parser "^2.0.0" + +postcss-load-config@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-2.1.0.tgz#c84d692b7bb7b41ddced94ee62e8ab31b417b003" + integrity sha512-4pV3JJVPLd5+RueiVVB+gFOAa7GWc25XQcMp86Zexzke69mKf6Nx9LRcQywdz7yZI9n1udOxmLuAwTBypypF8Q== + dependencies: + cosmiconfig "^5.0.0" + import-cwd "^2.0.0" + +postcss-loader@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-3.0.0.tgz#6b97943e47c72d845fa9e03f273773d4e8dd6c2d" + integrity sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA== + dependencies: + loader-utils "^1.1.0" + postcss "^7.0.0" + postcss-load-config "^2.0.0" + schema-utils "^1.0.0" + +postcss-logical@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-logical/-/postcss-logical-3.0.0.tgz#2495d0f8b82e9f262725f75f9401b34e7b45d5b5" + integrity sha512-1SUKdJc2vuMOmeItqGuNaC+N8MzBWFWEkAnRnLpFYj1tGGa7NqyVBujfRtgNa2gXR+6RkGUiB2O5Vmh7E2RmiA== + dependencies: + postcss "^7.0.2" + +postcss-media-minmax@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-media-minmax/-/postcss-media-minmax-4.0.0.tgz#b75bb6cbc217c8ac49433e12f22048814a4f5ed5" + integrity sha512-fo9moya6qyxsjbFAYl97qKO9gyre3qvbMnkOZeZwlsW6XYFsvs2DMGDlchVLfAd8LHPZDxivu/+qW2SMQeTHBw== + dependencies: + postcss "^7.0.2" + +postcss-merge-longhand@^4.0.11: + version "4.0.11" + resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz#62f49a13e4a0ee04e7b98f42bb16062ca2549e24" + integrity sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw== + dependencies: + css-color-names "0.0.4" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + stylehacks "^4.0.0" + +postcss-merge-rules@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz#362bea4ff5a1f98e4075a713c6cb25aefef9a650" + integrity sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ== + dependencies: + browserslist "^4.0.0" + caniuse-api "^3.0.0" + cssnano-util-same-parent "^4.0.0" + postcss "^7.0.0" + postcss-selector-parser "^3.0.0" + vendors "^1.0.0" + +postcss-minify-font-values@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz#cd4c344cce474343fac5d82206ab2cbcb8afd5a6" + integrity sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg== + dependencies: + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-minify-gradients@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz#93b29c2ff5099c535eecda56c4aa6e665a663471" + integrity sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q== + dependencies: + cssnano-util-get-arguments "^4.0.0" + is-color-stop "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-minify-params@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz#6b9cef030c11e35261f95f618c90036d680db874" + integrity sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg== + dependencies: + alphanum-sort "^1.0.0" + browserslist "^4.0.0" + cssnano-util-get-arguments "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + uniqs "^2.0.0" + +postcss-minify-selectors@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz#e2e5eb40bfee500d0cd9243500f5f8ea4262fbd8" + integrity sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g== + dependencies: + alphanum-sort "^1.0.0" + has "^1.0.0" + postcss "^7.0.0" + postcss-selector-parser "^3.0.0" + +postcss-modules-extract-imports@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz#818719a1ae1da325f9832446b01136eeb493cd7e" + integrity sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ== + dependencies: + postcss "^7.0.5" + +postcss-modules-local-by-default@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.2.tgz#e8a6561be914aaf3c052876377524ca90dbb7915" + integrity sha512-jM/V8eqM4oJ/22j0gx4jrp63GSvDH6v86OqyTHHUvk4/k1vceipZsaymiZ5PvocqZOl5SFHiFJqjs3la0wnfIQ== + dependencies: + icss-utils "^4.1.1" + postcss "^7.0.16" + postcss-selector-parser "^6.0.2" + postcss-value-parser "^4.0.0" + +postcss-modules-scope@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-2.1.1.tgz#33d4fc946602eb5e9355c4165d68a10727689dba" + integrity sha512-OXRUPecnHCg8b9xWvldG/jUpRIGPNRka0r4D4j0ESUU2/5IOnpsjfPPmDprM3Ih8CgZ8FXjWqaniK5v4rWt3oQ== + dependencies: + postcss "^7.0.6" + postcss-selector-parser "^6.0.0" + +postcss-modules-values@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz#5b5000d6ebae29b4255301b4a3a54574423e7f10" + integrity sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg== + dependencies: + icss-utils "^4.0.0" + postcss "^7.0.6" + +postcss-nesting@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/postcss-nesting/-/postcss-nesting-7.0.1.tgz#b50ad7b7f0173e5b5e3880c3501344703e04c052" + integrity sha512-FrorPb0H3nuVq0Sff7W2rnc3SmIcruVC6YwpcS+k687VxyxO33iE1amna7wHuRVzM8vfiYofXSBHNAZ3QhLvYg== + dependencies: + postcss "^7.0.2" + +postcss-normalize-charset@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz#8b35add3aee83a136b0471e0d59be58a50285dd4" + integrity sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g== + dependencies: + postcss "^7.0.0" + +postcss-normalize-display-values@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz#0dbe04a4ce9063d4667ed2be476bb830c825935a" + integrity sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ== + dependencies: + cssnano-util-get-match "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-positions@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz#05f757f84f260437378368a91f8932d4b102917f" + integrity sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA== + dependencies: + cssnano-util-get-arguments "^4.0.0" + has "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-repeat-style@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz#c4ebbc289f3991a028d44751cbdd11918b17910c" + integrity sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q== + dependencies: + cssnano-util-get-arguments "^4.0.0" + cssnano-util-get-match "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-string@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz#cd44c40ab07a0c7a36dc5e99aace1eca4ec2690c" + integrity sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA== + dependencies: + has "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-timing-functions@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz#8e009ca2a3949cdaf8ad23e6b6ab99cb5e7d28d9" + integrity sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A== + dependencies: + cssnano-util-get-match "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-unicode@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz#841bd48fdcf3019ad4baa7493a3d363b52ae1cfb" + integrity sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg== + dependencies: + browserslist "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-url@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz#10e437f86bc7c7e58f7b9652ed878daaa95faae1" + integrity sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA== + dependencies: + is-absolute-url "^2.0.0" + normalize-url "^3.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-whitespace@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz#bf1d4070fe4fcea87d1348e825d8cc0c5faa7d82" + integrity sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA== + dependencies: + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-ordered-values@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz#0cf75c820ec7d5c4d280189559e0b571ebac0eee" + integrity sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw== + dependencies: + cssnano-util-get-arguments "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-overflow-shorthand@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/postcss-overflow-shorthand/-/postcss-overflow-shorthand-2.0.0.tgz#31ecf350e9c6f6ddc250a78f0c3e111f32dd4c30" + integrity sha512-aK0fHc9CBNx8jbzMYhshZcEv8LtYnBIRYQD5i7w/K/wS9c2+0NSR6B3OVMu5y0hBHYLcMGjfU+dmWYNKH0I85g== + dependencies: + postcss "^7.0.2" + +postcss-page-break@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/postcss-page-break/-/postcss-page-break-2.0.0.tgz#add52d0e0a528cabe6afee8b46e2abb277df46bf" + integrity sha512-tkpTSrLpfLfD9HvgOlJuigLuk39wVTbbd8RKcy8/ugV2bNBUW3xU+AIqyxhDrQr1VUj1RmyJrBn1YWrqUm9zAQ== + dependencies: + postcss "^7.0.2" + +postcss-place@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-place/-/postcss-place-4.0.1.tgz#e9f39d33d2dc584e46ee1db45adb77ca9d1dcc62" + integrity sha512-Zb6byCSLkgRKLODj/5mQugyuj9bvAAw9LqJJjgwz5cYryGeXfFZfSXoP1UfveccFmeq0b/2xxwcTEVScnqGxBg== + dependencies: + postcss "^7.0.2" + postcss-values-parser "^2.0.0" + +postcss-preset-env@^6.7.0: + version "6.7.0" + resolved "https://registry.yarnpkg.com/postcss-preset-env/-/postcss-preset-env-6.7.0.tgz#c34ddacf8f902383b35ad1e030f178f4cdf118a5" + integrity sha512-eU4/K5xzSFwUFJ8hTdTQzo2RBLbDVt83QZrAvI07TULOkmyQlnYlpwep+2yIK+K+0KlZO4BvFcleOCCcUtwchg== + dependencies: + autoprefixer "^9.6.1" + browserslist "^4.6.4" + caniuse-lite "^1.0.30000981" + css-blank-pseudo "^0.1.4" + css-has-pseudo "^0.10.0" + css-prefers-color-scheme "^3.1.1" + cssdb "^4.4.0" + postcss "^7.0.17" + postcss-attribute-case-insensitive "^4.0.1" + postcss-color-functional-notation "^2.0.1" + postcss-color-gray "^5.0.0" + postcss-color-hex-alpha "^5.0.3" + postcss-color-mod-function "^3.0.3" + postcss-color-rebeccapurple "^4.0.1" + postcss-custom-media "^7.0.8" + postcss-custom-properties "^8.0.11" + postcss-custom-selectors "^5.1.2" + postcss-dir-pseudo-class "^5.0.0" + postcss-double-position-gradients "^1.0.0" + postcss-env-function "^2.0.2" + postcss-focus-visible "^4.0.0" + postcss-focus-within "^3.0.0" + postcss-font-variant "^4.0.0" + postcss-gap-properties "^2.0.0" + postcss-image-set-function "^3.0.1" + postcss-initial "^3.0.0" + postcss-lab-function "^2.0.1" + postcss-logical "^3.0.0" + postcss-media-minmax "^4.0.0" + postcss-nesting "^7.0.0" + postcss-overflow-shorthand "^2.0.0" + postcss-page-break "^2.0.0" + postcss-place "^4.0.1" + postcss-pseudo-class-any-link "^6.0.0" + postcss-replace-overflow-wrap "^3.0.0" + postcss-selector-matches "^4.0.0" + postcss-selector-not "^4.0.0" + +postcss-pseudo-class-any-link@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-6.0.0.tgz#2ed3eed393b3702879dec4a87032b210daeb04d1" + integrity sha512-lgXW9sYJdLqtmw23otOzrtbDXofUdfYzNm4PIpNE322/swES3VU9XlXHeJS46zT2onFO7V1QFdD4Q9LiZj8mew== + dependencies: + postcss "^7.0.2" + postcss-selector-parser "^5.0.0-rc.3" + +postcss-reduce-initial@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz#7fd42ebea5e9c814609639e2c2e84ae270ba48df" + integrity sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA== + dependencies: + browserslist "^4.0.0" + caniuse-api "^3.0.0" + has "^1.0.0" + postcss "^7.0.0" + +postcss-reduce-transforms@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz#17efa405eacc6e07be3414a5ca2d1074681d4e29" + integrity sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg== + dependencies: + cssnano-util-get-match "^4.0.0" + has "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-replace-overflow-wrap@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-3.0.0.tgz#61b360ffdaedca84c7c918d2b0f0d0ea559ab01c" + integrity sha512-2T5hcEHArDT6X9+9dVSPQdo7QHzG4XKclFT8rU5TzJPDN7RIRTbO9c4drUISOVemLj03aezStHCR2AIcr8XLpw== + dependencies: + postcss "^7.0.2" + +postcss-selector-matches@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-selector-matches/-/postcss-selector-matches-4.0.0.tgz#71c8248f917ba2cc93037c9637ee09c64436fcff" + integrity sha512-LgsHwQR/EsRYSqlwdGzeaPKVT0Ml7LAT6E75T8W8xLJY62CE4S/l03BWIt3jT8Taq22kXP08s2SfTSzaraoPww== + dependencies: + balanced-match "^1.0.0" + postcss "^7.0.2" + +postcss-selector-not@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-selector-not/-/postcss-selector-not-4.0.0.tgz#c68ff7ba96527499e832724a2674d65603b645c0" + integrity sha512-W+bkBZRhqJaYN8XAnbbZPLWMvZD1wKTu0UxtFKdhtGjWYmxhkUneoeOhRJKdAE5V7ZTlnbHfCR+6bNwK9e1dTQ== + dependencies: + balanced-match "^1.0.0" + postcss "^7.0.2" + +postcss-selector-parser@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-3.1.1.tgz#4f875f4afb0c96573d5cf4d74011aee250a7e865" + integrity sha1-T4dfSvsMllc9XPTXQBGu4lCn6GU= + dependencies: + dot-prop "^4.1.1" + indexes-of "^1.0.1" + uniq "^1.0.1" + +postcss-selector-parser@^5.0.0, postcss-selector-parser@^5.0.0-rc.3, postcss-selector-parser@^5.0.0-rc.4: + version "5.0.0" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz#249044356697b33b64f1a8f7c80922dddee7195c" + integrity sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ== + dependencies: + cssesc "^2.0.0" + indexes-of "^1.0.1" + uniq "^1.0.1" + +postcss-selector-parser@^6.0.0, postcss-selector-parser@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz#934cf799d016c83411859e09dcecade01286ec5c" + integrity sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg== + dependencies: + cssesc "^3.0.0" + indexes-of "^1.0.1" + uniq "^1.0.1" + +postcss-svgo@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-4.0.2.tgz#17b997bc711b333bab143aaed3b8d3d6e3d38258" + integrity sha512-C6wyjo3VwFm0QgBy+Fu7gCYOkCmgmClghO+pjcxvrcBKtiKt0uCF+hvbMO1fyv5BMImRK90SMb+dwUnfbGd+jw== + dependencies: + is-svg "^3.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + svgo "^1.0.0" + +postcss-unique-selectors@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz#9446911f3289bfd64c6d680f073c03b1f9ee4bac" + integrity sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg== + dependencies: + alphanum-sort "^1.0.0" + postcss "^7.0.0" + uniqs "^2.0.0" + +postcss-value-parser@^3.0.0, postcss-value-parser@^3.3.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281" + integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ== + +postcss-value-parser@^4.0.0, postcss-value-parser@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.0.2.tgz#482282c09a42706d1fc9a069b73f44ec08391dc9" + integrity sha512-LmeoohTpp/K4UiyQCwuGWlONxXamGzCMtFxLq4W1nZVGIQLYvMCJx3yAF9qyyuFpflABI9yVdtJAqbihOsCsJQ== + +postcss-values-parser@^2.0.0, postcss-values-parser@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/postcss-values-parser/-/postcss-values-parser-2.0.1.tgz#da8b472d901da1e205b47bdc98637b9e9e550e5f" + integrity sha512-2tLuBsA6P4rYTNKCXYG/71C7j1pU6pK503suYOmn4xYrQIzW+opD+7FAFNuGSdZC/3Qfy334QbeMu7MEb8gOxg== + dependencies: + flatten "^1.0.2" + indexes-of "^1.0.1" + uniq "^1.0.1" + +postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.16, postcss@^7.0.17, postcss@^7.0.2, postcss@^7.0.23, postcss@^7.0.5, postcss@^7.0.6: + version "7.0.26" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.26.tgz#5ed615cfcab35ba9bbb82414a4fa88ea10429587" + integrity sha512-IY4oRjpXWYshuTDFxMVkJDtWIk2LhsTlu8bZnbEJA4+bYT16Lvpo8Qv6EvDumhYRgzjZl489pmsY3qVgJQ08nA== + dependencies: + chalk "^2.4.2" + source-map "^0.6.1" + supports-color "^6.1.0" + +prepend-http@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" + integrity sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw= + +pretty-error@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/pretty-error/-/pretty-error-2.1.1.tgz#5f4f87c8f91e5ae3f3ba87ab4cf5e03b1a17f1a3" + integrity sha1-X0+HyPkeWuPzuoerTPXgOxoX8aM= + dependencies: + renderkid "^2.0.1" + utila "~0.4" + +pretty-time@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/pretty-time/-/pretty-time-1.1.0.tgz#ffb7429afabb8535c346a34e41873adf3d74dd0e" + integrity sha512-28iF6xPQrP8Oa6uxE6a1biz+lWeTOAPKggvjB8HAs6nVMKZwf5bG++632Dx614hIWgUPkgivRfG+a8uAXGTIbA== + +prism-react-renderer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/prism-react-renderer/-/prism-react-renderer-1.0.2.tgz#3bb9a6a42f76fc049b03266298c7068fdd4b7ea9" + integrity sha512-0++pJyRfu4v2OxI/Us/5RLui9ESDkTiLkVCtKuPZYdpB8UQWJpnJQhPrWab053XtsKW3oM0sD69uJ6N9exm1Ag== + +private@^0.1.6: + version "0.1.8" + resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" + integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg== + +process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + +process@^0.11.10: + version "0.11.10" + resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" + integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= + +promise-inflight@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" + integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM= + +prop-types@^15.5.0, prop-types@^15.5.4, prop-types@^15.6.2: + version "15.7.2" + resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5" + integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ== + dependencies: + loose-envify "^1.4.0" + object-assign "^4.1.1" + react-is "^16.8.1" + +property-information@^5.0.0, property-information@^5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/property-information/-/property-information-5.3.0.tgz#bc87ac82dc4e72a31bb62040544b1bf9653da039" + integrity sha512-IslotQn1hBCZDY7SaJ3zmCjVea219VTwmOk6Pu3z9haU9m4+T8GwaDubur+6NMHEU+Fjs/6/p66z6QULPkcL1w== + dependencies: + xtend "^4.0.1" + +proxy-addr@~2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.5.tgz#34cbd64a2d81f4b1fd21e76f9f06c8a45299ee34" + integrity sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ== + dependencies: + forwarded "~0.1.2" + ipaddr.js "1.9.0" + +prr@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" + integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY= + +psl@^1.1.24: + version "1.7.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.7.0.tgz#f1c4c47a8ef97167dea5d6bbf4816d736e884a3c" + integrity sha512-5NsSEDv8zY70ScRnOTn7bK7eanl2MvFrOrS/R6x+dBt5g1ghnj9Zv90kO8GwT8gxcu2ANyFprnFYB85IogIJOQ== + +public-encrypt@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" + integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q== + dependencies: + 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@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909" + integrity sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +pumpify@^1.3.3: + version "1.5.1" + resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce" + integrity sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ== + dependencies: + duplexify "^3.6.0" + inherits "^2.0.3" + pump "^2.0.0" + +punycode@1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" + integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0= + +punycode@^1.2.4, punycode@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= + +punycode@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + +q@^1.1.2: + version "1.5.1" + resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" + integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc= + +qs@6.7.0: + version "6.7.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc" + integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ== + +qs@~6.5.2: + version "6.5.2" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" + integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== + +query-string@^4.1.0: + version "4.3.4" + resolved "https://registry.yarnpkg.com/query-string/-/query-string-4.3.4.tgz#bbb693b9ca915c232515b228b1a02b609043dbeb" + integrity sha1-u7aTucqRXCMlFbIosaArYJBD2+s= + dependencies: + object-assign "^4.1.0" + strict-uri-encode "^1.0.0" + +querystring-es3@^0.2.0, querystring-es3@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" + integrity sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM= + +querystring@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" + integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= + +querystringify@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.1.1.tgz#60e5a5fd64a7f8bfa4d2ab2ed6fdf4c85bad154e" + integrity sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA== + +randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5: + version "2.1.0" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + +randomfill@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458" + integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw== + dependencies: + randombytes "^2.0.5" + safe-buffer "^5.1.0" + +range-parser@^1.2.1, range-parser@~1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + +raw-body@2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.0.tgz#a1ce6fb9c9bc356ca52e89256ab59059e13d0332" + integrity sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q== + dependencies: + bytes "3.1.0" + http-errors "1.7.2" + iconv-lite "0.4.24" + unpipe "1.0.0" + +react-dev-utils@^9.1.0: + version "9.1.0" + resolved "https://registry.yarnpkg.com/react-dev-utils/-/react-dev-utils-9.1.0.tgz#3ad2bb8848a32319d760d0a84c56c14bdaae5e81" + integrity sha512-X2KYF/lIGyGwP/F/oXgGDF24nxDA2KC4b7AFto+eqzc/t838gpSGiaU8trTqHXOohuLxxc5qi1eDzsl9ucPDpg== + dependencies: + "@babel/code-frame" "7.5.5" + address "1.1.2" + browserslist "4.7.0" + chalk "2.4.2" + cross-spawn "6.0.5" + detect-port-alt "1.1.6" + escape-string-regexp "1.0.5" + filesize "3.6.1" + find-up "3.0.0" + fork-ts-checker-webpack-plugin "1.5.0" + global-modules "2.0.0" + globby "8.0.2" + gzip-size "5.1.1" + immer "1.10.0" + inquirer "6.5.0" + is-root "2.1.0" + loader-utils "1.2.3" + open "^6.3.0" + pkg-up "2.0.0" + react-error-overlay "^6.0.3" + recursive-readdir "2.2.2" + shell-quote "1.7.2" + sockjs-client "1.4.0" + strip-ansi "5.2.0" + text-table "0.2.0" + +react-dom@^16.8.4: + version "16.12.0" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.12.0.tgz#0da4b714b8d13c2038c9396b54a92baea633fe11" + integrity sha512-LMxFfAGrcS3kETtQaCkTKjMiifahaMySFDn71fZUNpPHZQEzmk/GiAeIT8JSOrHB23fnuCOMruL2a8NYlw+8Gw== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + prop-types "^15.6.2" + scheduler "^0.18.0" + +react-error-overlay@^6.0.3: + version "6.0.4" + resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-6.0.4.tgz#0d165d6d27488e660bc08e57bdabaad741366f7a" + integrity sha512-ueZzLmHltszTshDMwyfELDq8zOA803wQ1ZuzCccXa1m57k1PxSHfflPD5W9YIiTXLs0JTLzoj6o1LuM5N6zzNA== + +react-fast-compare@^2.0.2: + version "2.0.4" + resolved "https://registry.yarnpkg.com/react-fast-compare/-/react-fast-compare-2.0.4.tgz#e84b4d455b0fec113e0402c329352715196f81f9" + integrity sha512-suNP+J1VU1MWFKcyt7RtjiSWUjvidmQSlqu+eHslq+342xCbGTYmC0mEhPCOHxlW0CywylOC1u2DFAT+bv4dBw== + +react-helmet@^6.0.0-beta: + version "6.0.0-beta" + resolved "https://registry.yarnpkg.com/react-helmet/-/react-helmet-6.0.0-beta.tgz#1f2ac04521951486e4fce3296d0c88aae8cabd5c" + integrity sha512-GnNWsokebTe7fe8MH2I/a2dl4THYWhthLBoMaQSRYqW5XbPo881WAJGi+lqRBjyOFryW6zpQluEkBy70zh+h9w== + dependencies: + object-assign "^4.1.1" + prop-types "^15.5.4" + react-fast-compare "^2.0.2" + react-side-effect "^1.1.0" + +react-is@^16.6.0, react-is@^16.7.0, react-is@^16.8.1: + version "16.12.0" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.12.0.tgz#2cc0fe0fba742d97fd527c42a13bec4eeb06241c" + integrity sha512-rPCkf/mWBtKc97aLL9/txD8DZdemK0vkA3JMLShjlJB3Pj3s+lpf1KaBzMfQrAmhMQB0n1cU/SUGgKKBCe837Q== + +react-loadable-ssr-addon@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/react-loadable-ssr-addon/-/react-loadable-ssr-addon-0.2.0.tgz#fbf4ebfa9cfd6eadb3c346f0459e1cee01c9cae8" + integrity sha512-gTfPaxWZa5mHKeSOE61RpoLe7hyjcJHgNa5m0ZZGV3OCkWsOKlfYgoBxXzu9ENg/ePR/kFd5H3ncF4K5eyyNTQ== + +react-loadable@^5.5.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/react-loadable/-/react-loadable-5.5.0.tgz#582251679d3da86c32aae2c8e689c59f1196d8c4" + integrity sha512-C8Aui0ZpMd4KokxRdVAm2bQtI03k2RMRNzOB+IipV3yxFTSVICv7WoUr5L9ALB5BmKO1iHgZtWM8EvYG83otdg== + dependencies: + prop-types "^15.5.0" + +react-router-config@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/react-router-config/-/react-router-config-5.1.1.tgz#0f4263d1a80c6b2dc7b9c1902c9526478194a988" + integrity sha512-DuanZjaD8mQp1ppHjgnnUnyOlqYXZVjnov/JzFhjLEwd3Z4dYjMSnqrEzzGThH47vpCOqPPwJM2FtthLeJ8Pbg== + dependencies: + "@babel/runtime" "^7.1.2" + +react-router-dom@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-5.1.2.tgz#06701b834352f44d37fbb6311f870f84c76b9c18" + integrity sha512-7BPHAaIwWpZS074UKaw1FjVdZBSVWEk8IuDXdB+OkLb8vd/WRQIpA4ag9WQk61aEfQs47wHyjWUoUGGZxpQXew== + dependencies: + "@babel/runtime" "^7.1.2" + history "^4.9.0" + loose-envify "^1.3.1" + prop-types "^15.6.2" + react-router "5.1.2" + tiny-invariant "^1.0.2" + tiny-warning "^1.0.0" + +react-router@5.1.2, react-router@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/react-router/-/react-router-5.1.2.tgz#6ea51d789cb36a6be1ba5f7c0d48dd9e817d3418" + integrity sha512-yjEuMFy1ONK246B+rsa0cUam5OeAQ8pyclRDgpxuSCrAlJ1qN9uZ5IgyKC7gQg0w8OM50NXHEegPh/ks9YuR2A== + dependencies: + "@babel/runtime" "^7.1.2" + history "^4.9.0" + hoist-non-react-statics "^3.1.0" + loose-envify "^1.3.1" + mini-create-react-context "^0.3.0" + path-to-regexp "^1.7.0" + prop-types "^15.6.2" + react-is "^16.6.0" + tiny-invariant "^1.0.2" + tiny-warning "^1.0.0" + +react-side-effect@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/react-side-effect/-/react-side-effect-1.2.0.tgz#0e940c78faba0c73b9b0eba9cd3dda8dfb7e7dae" + integrity sha512-v1ht1aHg5k/thv56DRcjw+WtojuuDHFUgGfc+bFHOWsF4ZK6C2V57DO0Or0GPsg6+LSTE0M6Ry/gfzhzSwbc5w== + dependencies: + shallowequal "^1.0.1" + +react-toggle@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/react-toggle/-/react-toggle-4.1.1.tgz#2317f67bf918ea3508a96b09dd383efd9da572af" + integrity sha512-+wXlMcSpg8SmnIXauMaZiKpR+r2wp2gMUteroejp2UTSqGTVvZLN+m9EhMzFARBKEw7KpQOwzCyfzeHeAndQGw== + dependencies: + classnames "^2.2.5" + +react@^16.8.4: + version "16.12.0" + resolved "https://registry.yarnpkg.com/react/-/react-16.12.0.tgz#0c0a9c6a142429e3614834d5a778e18aa78a0b83" + integrity sha512-fglqy3k5E+81pA8s+7K0/T3DBCF0ZDOher1elBFzF7O6arXJgzyu/FW+COxFvAWXJoJN9KIZbT2LXlukwphYTA== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + prop-types "^15.6.2" + +"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@~2.3.6: + version "2.3.7" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" + integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== + dependencies: + 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" + +readable-stream@^3.0.6, readable-stream@^3.1.1: + version "3.4.0" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.4.0.tgz#a51c26754658e0a3c21dbf59163bd45ba6f447fc" + integrity sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readdirp@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" + integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ== + dependencies: + graceful-fs "^4.1.11" + micromatch "^3.1.10" + readable-stream "^2.0.2" + +readdirp@~3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.3.0.tgz#984458d13a1e42e2e9f5841b129e162f369aff17" + integrity sha512-zz0pAkSPOXXm1viEwygWIPSPkcBYjW1xU5j/JBh5t9bGCJwa6f9+BJa6VaB2g+b55yVrmXzqkyLf4xaWYM0IkQ== + dependencies: + picomatch "^2.0.7" + +rechoir@^0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" + integrity sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q= + dependencies: + resolve "^1.1.6" + +recursive-readdir@2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/recursive-readdir/-/recursive-readdir-2.2.2.tgz#9946fb3274e1628de6e36b2f6714953b4845094f" + integrity sha512-nRCcW9Sj7NuZwa2XvH9co8NPeXUBhZP7CRKJtU+cS6PW9FpCIFoI5ib0NT1ZrbNuPoRy0ylyCaUL8Gih4LSyFg== + dependencies: + minimatch "3.0.4" + +reduce@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/reduce/-/reduce-1.0.2.tgz#0cd680ad3ffe0b060e57a5c68bdfce37168d361b" + integrity sha512-xX7Fxke/oHO5IfZSk77lvPa/7bjMh9BuCk4OOoX5XTXrM7s0Z+MkPfSDfz0q7r91BhhGSs8gii/VEN/7zhCPpQ== + dependencies: + object-keys "^1.1.0" + +regenerate-unicode-properties@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.1.0.tgz#ef51e0f0ea4ad424b77bf7cb41f3e015c70a3f0e" + integrity sha512-LGZzkgtLY79GeXLm8Dp0BVLdQlWICzBnJz/ipWUgo59qBaZ+BHtq51P2q1uVZlppMuUAT37SDk39qUbjTWB7bA== + dependencies: + regenerate "^1.4.0" + +regenerate@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11" + integrity sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg== + +regenerator-runtime@^0.13.2: + version "0.13.3" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz#7cf6a77d8f5c6f60eb73c5fc1955b2ceb01e6bf5" + integrity sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw== + +regenerator-transform@^0.14.0: + version "0.14.1" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.1.tgz#3b2fce4e1ab7732c08f665dfdb314749c7ddd2fb" + integrity sha512-flVuee02C3FKRISbxhXl9mGzdbWUVHubl1SMaknjxkFB1/iqpJhArQUvRxOOPEc/9tAiX0BaQ28FJH10E4isSQ== + dependencies: + private "^0.1.6" + +regex-not@^1.0.0, regex-not@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" + integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== + dependencies: + extend-shallow "^3.0.2" + safe-regex "^1.1.0" + +regexp.prototype.flags@^1.2.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz#7aba89b3c13a64509dabcf3ca8d9fbb9bdf5cb75" + integrity sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.0-next.1" + +regexpu-core@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.6.0.tgz#2037c18b327cfce8a6fea2a4ec441f2432afb8b6" + integrity sha512-YlVaefl8P5BnFYOITTNzDvan1ulLOiXJzCNZxduTIosN17b87h3bvG9yHMoHaRuo88H4mQ06Aodj5VtYGGGiTg== + dependencies: + regenerate "^1.4.0" + regenerate-unicode-properties "^8.1.0" + regjsgen "^0.5.0" + regjsparser "^0.6.0" + unicode-match-property-ecmascript "^1.0.4" + unicode-match-property-value-ecmascript "^1.1.0" + +regjsgen@^0.5.0: + version "0.5.1" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.1.tgz#48f0bf1a5ea205196929c0d9798b42d1ed98443c" + integrity sha512-5qxzGZjDs9w4tzT3TPhCJqWdCc3RLYwy9J2NB0nm5Lz+S273lvWcpjaTGHsT1dc6Hhfq41uSEOw8wBmxrKOuyg== + +regjsparser@^0.6.0: + version "0.6.2" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.2.tgz#fd62c753991467d9d1ffe0a9f67f27a529024b96" + integrity sha512-E9ghzUtoLwDekPT0DYCp+c4h+bvuUpe6rRHCTYn6eGoqj1LgKXxT6I0Il4WbjhQkOghzi/V+y03bPKvbllL93Q== + dependencies: + jsesc "~0.5.0" + +rehype-parse@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/rehype-parse/-/rehype-parse-6.0.2.tgz#aeb3fdd68085f9f796f1d3137ae2b85a98406964" + integrity sha512-0S3CpvpTAgGmnz8kiCyFLGuW5yA4OQhyNTm/nwPopZ7+PI11WnGl1TTWTGv/2hPEe/g2jRLlhVVSsoDH8waRug== + dependencies: + hast-util-from-parse5 "^5.0.0" + parse5 "^5.0.0" + xtend "^4.0.0" + +relateurl@^0.2.7: + version "0.2.7" + resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" + integrity sha1-VNvzd+UUQKypCkzSdGANP/LYiKk= + +remark-admonitions@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/remark-admonitions/-/remark-admonitions-1.0.0.tgz#5f0b824c56a7f0e31f4e826e68c30c7a17909003" + integrity sha512-qUDVDEAUoULp5j+RP++UPemn4QqtwY3L24RwlbZBLnSGfGn8Bqln0pEv+t3jsmm3L+ARdFdvO4XNrh40eU7WPQ== + dependencies: + rehype-parse "^6.0.2" + unified "^8.4.2" + unist-util-visit "^2.0.1" + +remark-emoji@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/remark-emoji/-/remark-emoji-2.0.2.tgz#49c134021132c192ee4cceed1988ec9b8ced7eb8" + integrity sha512-E8ZOa7Sx1YS9ivWJ8U9xpA8ldzZ4VPAfyUaKqhr1/Pr5Q8ZdQHrpDg6S+rPzMw8t89KNViB/oG9ZdJSFDrUXpA== + dependencies: + node-emoji "^1.8.1" + unist-util-visit "^1.4.0" + +remark-mdx@^1.5.3: + version "1.5.3" + resolved "https://registry.yarnpkg.com/remark-mdx/-/remark-mdx-1.5.3.tgz#adeb26ce7a7b13f3dbed29ac690d7856315e7ac7" + integrity sha512-7WqfwdyER3k0gNiikzw9y+AQskAm6PX2qEF97vhuZ9y8/MatVKoWGCPX4VCYAN0qlM1X6ty761rbMWMy5OmgyA== + dependencies: + "@babel/core" "7.7.4" + "@babel/helper-plugin-utils" "7.0.0" + "@babel/plugin-proposal-object-rest-spread" "7.7.4" + "@babel/plugin-syntax-jsx" "7.7.4" + "@mdx-js/util" "^1.5.3" + is-alphabetical "1.0.3" + remark-parse "7.0.2" + unified "8.4.2" + +remark-parse@7.0.2: + version "7.0.2" + resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-7.0.2.tgz#41e7170d9c1d96c3d32cf1109600a9ed50dba7cf" + integrity sha512-9+my0lQS80IQkYXsMA8Sg6m9QfXYJBnXjWYN5U+kFc5/n69t+XZVXU/ZBYr3cYH8FheEGf1v87rkFDhJ8bVgMA== + dependencies: + collapse-white-space "^1.0.2" + is-alphabetical "^1.0.0" + is-decimal "^1.0.0" + is-whitespace-character "^1.0.0" + is-word-character "^1.0.0" + markdown-escapes "^1.0.0" + parse-entities "^1.1.0" + repeat-string "^1.5.4" + state-toggle "^1.0.0" + trim "0.0.1" + trim-trailing-lines "^1.0.0" + unherit "^1.0.4" + unist-util-remove-position "^1.0.0" + vfile-location "^2.0.0" + xtend "^4.0.1" + +remark-slug@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/remark-slug/-/remark-slug-5.1.2.tgz#715ecdef8df1226786204b1887d31ab16aa24609" + integrity sha512-DWX+Kd9iKycqyD+/B+gEFO3jjnt7Yg1O05lygYSNTe5i5PIxxxPjp5qPBDxPIzp5wreF7+1ROCwRgjEcqmzr3A== + dependencies: + github-slugger "^1.0.0" + mdast-util-to-string "^1.0.0" + unist-util-visit "^1.0.0" + +remark-squeeze-paragraphs@3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/remark-squeeze-paragraphs/-/remark-squeeze-paragraphs-3.0.4.tgz#9fe50c3bf3b572dd88754cd426ada007c0b8dc5f" + integrity sha512-Wmz5Yj9q+W1oryo8BV17JrOXZgUKVcpJ2ApE2pwnoHwhFKSk4Wp2PmFNbmJMgYSqAdFwfkoe+TSYop5Fy8wMgA== + dependencies: + mdast-squeeze-paragraphs "^3.0.0" + +remove-trailing-separator@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" + integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= + +renderkid@^2.0.1: + version "2.0.3" + resolved "https://registry.yarnpkg.com/renderkid/-/renderkid-2.0.3.tgz#380179c2ff5ae1365c522bf2fcfcff01c5b74149" + integrity sha512-z8CLQp7EZBPCwCnncgf9C4XAi3WR0dv+uWu/PjIyhhAb5d6IJ/QZqlHFprHeKT+59//V6BNUsLbvN8+2LarxGA== + dependencies: + css-select "^1.1.0" + dom-converter "^0.2" + htmlparser2 "^3.3.0" + strip-ansi "^3.0.0" + utila "^0.4.0" + +repeat-element@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" + integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g== + +repeat-string@^1.5.4, repeat-string@^1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= + +replace-ext@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-1.0.0.tgz#de63128373fcbf7c3ccfa4de5a480c45a67958eb" + integrity sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs= + +request@^2.87.0: + version "2.88.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef" + integrity sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg== + dependencies: + aws-sign2 "~0.7.0" + aws4 "^1.8.0" + caseless "~0.12.0" + combined-stream "~1.0.6" + extend "~3.0.2" + forever-agent "~0.6.1" + form-data "~2.3.2" + har-validator "~5.1.0" + http-signature "~1.2.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.19" + oauth-sign "~0.9.0" + performance-now "^2.1.0" + qs "~6.5.2" + safe-buffer "^5.1.2" + tough-cookie "~2.4.3" + tunnel-agent "^0.6.0" + uuid "^3.3.2" + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= + +"require-like@>= 0.1.1": + version "0.1.2" + resolved "https://registry.yarnpkg.com/require-like/-/require-like-0.1.2.tgz#ad6f30c13becd797010c468afa775c0c0a6b47fa" + integrity sha1-rW8wwTvs15cBDEaK+ndcDAprR/o= + +require-main-filename@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" + integrity sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE= + +requires-port@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" + integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8= + +resolve-cwd@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a" + integrity sha1-AKn3OHVW4nA46uIyyqNypqWbZlo= + dependencies: + resolve-from "^3.0.0" + +resolve-from@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" + integrity sha1-six699nWiBvItuZTM17rywoYh0g= + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +resolve-pathname@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-pathname/-/resolve-pathname-3.0.0.tgz#99d02224d3cf263689becbb393bc560313025dcd" + integrity sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng== + +resolve-url@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" + integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= + +resolve@^1.1.6, resolve@^1.3.2, resolve@^1.8.1: + version "1.14.2" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.14.2.tgz#dbf31d0fa98b1f29aa5169783b9c290cb865fea2" + integrity sha512-EjlOBLBO1kxsUxsKjLt7TAECyKW6fOh1VRkykQkKGzcBbjjPIxBqGh0jf7GJ3k/f5mxMqW3htMD3WdTUVtW8HQ== + dependencies: + path-parse "^1.0.6" + +restore-cursor@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" + integrity sha1-n37ih/gv0ybU/RYpI9YhKe7g368= + dependencies: + onetime "^2.0.0" + signal-exit "^3.0.2" + +ret@~0.1.10: + version "0.1.15" + resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" + integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== + +retry@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" + integrity sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs= + +reusify@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +rgb-regex@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/rgb-regex/-/rgb-regex-1.0.1.tgz#c0e0d6882df0e23be254a475e8edd41915feaeb1" + integrity sha1-wODWiC3w4jviVKR16O3UGRX+rrE= + +rgba-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/rgba-regex/-/rgba-regex-1.0.0.tgz#43374e2e2ca0968b0ef1523460b7d730ff22eeb3" + integrity sha1-QzdOLiyglosO8VI0YLfXMP8i7rM= + +rimraf@^2.5.4, rimraf@^2.6.3, rimraf@^2.7.1: + version "2.7.1" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" + integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== + dependencies: + glob "^7.1.3" + +rimraf@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.0.tgz#614176d4b3010b75e5c390eb0ee96f6dc0cebb9b" + integrity sha512-NDGVxTsjqfunkds7CqsOiEnxln4Bo7Nddl3XhS4pXg5OzwkLqJ971ZVAAnB+DDLnF76N+VnDEiBHaVV8I06SUg== + dependencies: + glob "^7.1.3" + +ripemd160@^2.0.0, ripemd160@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" + integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + +run-async@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" + integrity sha1-A3GrSuC91yDUFm19/aZP96RFpsA= + dependencies: + is-promise "^2.1.0" + +run-parallel@^1.1.9: + version "1.1.9" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.1.9.tgz#c9dd3a7cf9f4b2c4b6244e173a6ed866e61dd679" + integrity sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q== + +run-queue@^1.0.0, run-queue@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47" + integrity sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec= + dependencies: + aproba "^1.1.1" + +rx@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/rx/-/rx-4.1.0.tgz#a5f13ff79ef3b740fe30aa803fb09f98805d4782" + integrity sha1-pfE/957zt0D+MKqAP7CfmIBdR4I= + +rxjs@^6.4.0: + version "6.5.4" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.4.tgz#e0777fe0d184cec7872df147f303572d414e211c" + integrity sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q== + dependencies: + tslib "^1.9.0" + +safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.0.tgz#b74daec49b1148f88c64b68d49b1e815c1f2f519" + integrity sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg== + +safe-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" + integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= + dependencies: + ret "~0.1.10" + +"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +sax@^1.2.4, sax@~1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" + integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== + +scheduler@^0.18.0: + version "0.18.0" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.18.0.tgz#5901ad6659bc1d8f3fdaf36eb7a67b0d6746b1c4" + integrity sha512-agTSHR1Nbfi6ulI0kYNK0203joW2Y5W4po4l+v03tOoiJKpTBbxpNhWDvqc/4IcOw+KLmSiQLTasZ4cab2/UWQ== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + +schema-utils@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-1.0.0.tgz#0b79a93204d7b600d4b2850d1f66c2a34951c770" + integrity sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g== + dependencies: + ajv "^6.1.0" + ajv-errors "^1.0.0" + ajv-keywords "^3.1.0" + +schema-utils@^2.0.0, schema-utils@^2.6.0, schema-utils@^2.6.1: + version "2.6.1" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.6.1.tgz#eb78f0b945c7bcfa2082b3565e8db3548011dc4f" + integrity sha512-0WXHDs1VDJyo+Zqs9TKLKyD/h7yDpHUhEFsM2CzkICFdoX1av+GBq/J2xRTFfsQO5kBfhZzANf2VcIm84jqDbg== + dependencies: + ajv "^6.10.2" + ajv-keywords "^3.4.1" + +section-matter@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/section-matter/-/section-matter-1.0.0.tgz#e9041953506780ec01d59f292a19c7b850b84167" + integrity sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA== + dependencies: + extend-shallow "^2.0.1" + kind-of "^6.0.0" + +select-hose@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" + integrity sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo= + +select@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/select/-/select-1.1.2.tgz#0e7350acdec80b1108528786ec1d4418d11b396d" + integrity sha1-DnNQrN7ICxEIUoeG7B1EGNEbOW0= + +selfsigned@^1.10.7: + version "1.10.7" + resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-1.10.7.tgz#da5819fd049d5574f28e88a9bcc6dbc6e6f3906b" + integrity sha512-8M3wBCzeWIJnQfl43IKwOmC4H/RAp50S8DF60znzjW5GVqTcSe2vWclt7hmYVPkKPlHWOu5EaWOMZ2Y6W8ZXTA== + dependencies: + node-forge "0.9.0" + +semver@7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" + integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== + +semver@^5.1.0, semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + +semver@^6.0.0, semver@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + +send@0.17.1: + version "0.17.1" + resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8" + integrity sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg== + dependencies: + 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" + +serialize-javascript@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-2.1.2.tgz#ecec53b0e0317bdc95ef76ab7074b7384785fa61" + integrity sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ== + +serve-index@^1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239" + integrity sha1-03aNabHn2C5c4FD/9bRTvqEqkjk= + dependencies: + 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@1.14.1: + version "1.14.1" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9" + integrity sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg== + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.3" + send "0.17.1" + +set-blocking@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= + +set-value@^2.0.0, set-value@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" + integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.3" + split-string "^3.0.1" + +setimmediate@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= + +setprototypeof@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" + integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== + +setprototypeof@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" + integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== + +sha.js@^2.4.0, sha.js@^2.4.8: + version "2.4.11" + resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" + integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +shallowequal@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/shallowequal/-/shallowequal-1.1.0.tgz#188d521de95b9087404fd4dcb68b13df0ae4e7f8" + integrity sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ== + +shebang-command@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= + dependencies: + shebang-regex "^1.0.0" + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +shell-quote@1.7.2: + version "1.7.2" + resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.2.tgz#67a7d02c76c9da24f99d20808fcaded0e0e04be2" + integrity sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg== + +shelljs@^0.8.3: + version "0.8.3" + resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.3.tgz#a7f3319520ebf09ee81275b2368adb286659b097" + integrity sha512-fc0BKlAWiLpwZljmOvAOTE/gXawtCoNrP5oaY7KIaQbbyHeQVg01pSEuEGvGh3HEdBU4baCD7wQBwADmM/7f7A== + dependencies: + glob "^7.0.0" + interpret "^1.0.0" + rechoir "^0.6.2" + +signal-exit@^3.0.0, signal-exit@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" + integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= + +simple-swizzle@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" + integrity sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo= + dependencies: + is-arrayish "^0.3.1" + +sitemap@^3.2.2: + version "3.2.2" + resolved "https://registry.yarnpkg.com/sitemap/-/sitemap-3.2.2.tgz#3f77c358fa97b555c879e457098e39910095c62b" + integrity sha512-TModL/WU4m2q/mQcrDgNANn0P4LwprM9MMvG4hu5zP4c6IIKs2YLTu6nXXnNr8ODW/WFtxKggiJ1EGn2W0GNmg== + dependencies: + lodash.chunk "^4.2.0" + lodash.padstart "^4.6.1" + whatwg-url "^7.0.0" + xmlbuilder "^13.0.0" + +slash@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" + integrity sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU= + +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +snapdragon-node@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" + integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== + dependencies: + define-property "^1.0.0" + isobject "^3.0.0" + snapdragon-util "^3.0.1" + +snapdragon-util@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" + integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== + dependencies: + kind-of "^3.2.0" + +snapdragon@^0.8.1: + version "0.8.2" + resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" + integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== + dependencies: + 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" + +sockjs-client@1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/sockjs-client/-/sockjs-client-1.4.0.tgz#c9f2568e19c8fd8173b4997ea3420e0bb306c7d5" + integrity sha512-5zaLyO8/nri5cua0VtOrFXBPK1jbL4+1cebT/mmKA1E1ZXOvJrII75bPu0l0k843G/+iAbhEqzyKr0w/eCCj7g== + dependencies: + 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" + +sockjs@0.3.19: + version "0.3.19" + resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.19.tgz#d976bbe800af7bd20ae08598d582393508993c0d" + integrity sha512-V48klKZl8T6MzatbLlzzRNhMepEys9Y4oGFpypBFFn1gLI/QQ9HtLLyWJNbPlwGLelOVOEijUbTTJeLLI59jLw== + dependencies: + faye-websocket "^0.10.0" + uuid "^3.0.1" + +sort-keys@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-1.1.2.tgz#441b6d4d346798f1b4e49e8920adfba0e543f9ad" + integrity sha1-RBttTTRnmPG05J6JIK37oOVD+a0= + dependencies: + is-plain-obj "^1.0.0" + +source-list-map@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" + integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== + +source-map-resolve@^0.5.0: + version "0.5.3" + resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" + integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw== + dependencies: + atob "^2.1.2" + decode-uri-component "^0.2.0" + resolve-url "^0.2.1" + source-map-url "^0.4.0" + urix "^0.1.0" + +source-map-support@~0.5.12: + version "0.5.16" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.16.tgz#0ae069e7fe3ba7538c64c98515e35339eac5a042" + integrity sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map-url@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" + integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= + +source-map@^0.5.0, source-map@^0.5.6: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= + +source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +space-separated-tokens@^1.0.0: + version "1.1.4" + resolved "https://registry.yarnpkg.com/space-separated-tokens/-/space-separated-tokens-1.1.4.tgz#27910835ae00d0adfcdbd0ad7e611fb9544351fa" + integrity sha512-UyhMSmeIqZrQn2UdjYpxEkwY9JUrn8pP+7L4f91zRzOQuI8MF1FGLfYU9DKCYeLdo7LXMxwrX5zKFy7eeeVHuA== + +spdy-transport@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-3.0.0.tgz#00d4863a6400ad75df93361a1608605e5dcdcf31" + integrity sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw== + dependencies: + 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" + +spdy@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/spdy/-/spdy-4.0.1.tgz#6f12ed1c5db7ea4f24ebb8b89ba58c87c08257f2" + integrity sha512-HeZS3PBdMA+sZSu0qwpCxl3DeALD5ASx8pAX0jZdKXSpPWbQ6SYGnlg3BBmYLx5LtiZrmkAZfErCm2oECBcioA== + dependencies: + debug "^4.1.0" + handle-thing "^2.0.0" + http-deceiver "^1.2.7" + select-hose "^2.0.0" + spdy-transport "^3.0.0" + +split-string@^3.0.1, split-string@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" + integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== + dependencies: + extend-shallow "^3.0.0" + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= + +sshpk@^1.7.0: + version "1.16.1" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877" + integrity sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg== + dependencies: + asn1 "~0.2.3" + assert-plus "^1.0.0" + bcrypt-pbkdf "^1.0.0" + dashdash "^1.12.0" + ecc-jsbn "~0.1.1" + getpass "^0.1.1" + jsbn "~0.1.0" + safer-buffer "^2.0.2" + tweetnacl "~0.14.0" + +ssri@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.1.tgz#2a3c41b28dd45b62b63676ecb74001265ae9edd8" + integrity sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA== + dependencies: + figgy-pudding "^3.5.1" + +ssri@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-7.1.0.tgz#92c241bf6de82365b5c7fb4bd76e975522e1294d" + integrity sha512-77/WrDZUWocK0mvA5NTRQyveUf+wsrIc6vyrxpS8tVvYBcX215QbafrJR3KtkpskIzoFLqqNuuYQvxaMjXJ/0g== + dependencies: + figgy-pudding "^3.5.1" + minipass "^3.1.1" + +stable@^0.1.8: + version "0.1.8" + resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" + integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== + +stack-utils@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-1.0.2.tgz#33eba3897788558bebfc2db059dc158ec36cebb8" + integrity sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA== + +state-toggle@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/state-toggle/-/state-toggle-1.0.2.tgz#75e93a61944116b4959d665c8db2d243631d6ddc" + integrity sha512-8LpelPGR0qQM4PnfLiplOQNJcIN1/r2Gy0xKB2zKnIW2YzPMt2sR4I/+gtPjhN7Svh9kw+zqEg2SFwpBO9iNiw== + +static-extend@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" + integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= + dependencies: + define-property "^0.2.5" + object-copy "^0.1.0" + +"statuses@>= 1.4.0 < 2", "statuses@>= 1.5.0 < 2", statuses@~1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" + integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= + +std-env@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/std-env/-/std-env-2.2.1.tgz#2ffa0fdc9e2263e0004c1211966e960948a40f6b" + integrity sha512-IjYQUinA3lg5re/YMlwlfhqNRTzMZMqE+pezevdcTaHceqx8ngEi1alX9nNCk9Sc81fy1fLDeQoaCzeiW1yBOQ== + dependencies: + ci-info "^1.6.0" + +stream-browserify@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.2.tgz#87521d38a44aa7ee91ce1cd2a47df0cb49dd660b" + integrity sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg== + dependencies: + inherits "~2.0.1" + readable-stream "^2.0.2" + +stream-each@^1.1.0: + version "1.2.3" + resolved "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.3.tgz#ebe27a0c389b04fbcc233642952e10731afa9bae" + integrity sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw== + dependencies: + end-of-stream "^1.1.0" + stream-shift "^1.0.0" + +stream-http@^2.7.2: + version "2.8.3" + resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc" + integrity sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw== + dependencies: + builtin-status-codes "^3.0.0" + inherits "^2.0.1" + readable-stream "^2.3.6" + to-arraybuffer "^1.0.0" + xtend "^4.0.0" + +stream-shift@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.1.tgz#d7088281559ab2778424279b0877da3c392d5a3d" + integrity sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ== + +strict-uri-encode@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" + integrity sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM= + +string-width@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" + integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= + dependencies: + code-point-at "^1.0.0" + is-fullwidth-code-point "^1.0.0" + strip-ansi "^3.0.0" + +string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" + integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== + dependencies: + is-fullwidth-code-point "^2.0.0" + strip-ansi "^4.0.0" + +string-width@^4.1.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5" + integrity sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.0" + +string.prototype.trimleft@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz#9bdb8ac6abd6d602b17a4ed321870d2f8dcefc74" + integrity sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag== + dependencies: + define-properties "^1.1.3" + function-bind "^1.1.1" + +string.prototype.trimright@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz#440314b15996c866ce8a0341894d45186200c5d9" + integrity sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g== + dependencies: + define-properties "^1.1.3" + function-bind "^1.1.1" + +string_decoder@^1.0.0, string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + +stringify-object@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/stringify-object/-/stringify-object-3.3.0.tgz#703065aefca19300d3ce88af4f5b3956d7556629" + integrity sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw== + dependencies: + get-own-enumerable-property-symbols "^3.0.0" + is-obj "^1.0.1" + is-regexp "^1.0.0" + +strip-ansi@5.2.0, strip-ansi@^5.1.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" + integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== + dependencies: + ansi-regex "^4.1.0" + +strip-ansi@^3.0.0, strip-ansi@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= + dependencies: + ansi-regex "^2.0.0" + +strip-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= + dependencies: + ansi-regex "^3.0.0" + +strip-ansi@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" + integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== + dependencies: + ansi-regex "^5.0.0" + +strip-bom-string@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-bom-string/-/strip-bom-string-1.0.0.tgz#e5211e9224369fbb81d633a2f00044dc8cedad92" + integrity sha1-5SEekiQ2n7uB1jOi8ABE3IztrZI= + +strip-eof@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" + integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= + +strip-final-newline@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" + integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== + +style-to-object@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/style-to-object/-/style-to-object-0.3.0.tgz#b1b790d205991cc783801967214979ee19a76e46" + integrity sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA== + dependencies: + inline-style-parser "0.1.1" + +style-to-object@^0.2.1: + version "0.2.3" + resolved "https://registry.yarnpkg.com/style-to-object/-/style-to-object-0.2.3.tgz#afcf42bc03846b1e311880c55632a26ad2780bcb" + integrity sha512-1d/k4EY2N7jVLOqf2j04dTc37TPOv/hHxZmvpg8Pdh8UYydxeu/C1W1U4vD8alzf5V2Gt7rLsmkr4dxAlDm9ng== + dependencies: + inline-style-parser "0.1.1" + +stylehacks@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-4.0.3.tgz#6718fcaf4d1e07d8a1318690881e8d96726a71d5" + integrity sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g== + dependencies: + browserslist "^4.0.0" + postcss "^7.0.0" + postcss-selector-parser "^3.0.0" + +supports-color@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" + integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= + +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-color@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3" + integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ== + dependencies: + has-flag "^3.0.0" + +supports-color@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.1.0.tgz#68e32591df73e25ad1c4b49108a2ec507962bfd1" + integrity sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g== + dependencies: + has-flag "^4.0.0" + +svgo@^1.0.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/svgo/-/svgo-1.3.2.tgz#b6dc511c063346c9e415b81e43401145b96d4167" + integrity sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw== + dependencies: + chalk "^2.4.1" + coa "^2.0.2" + css-select "^2.0.0" + css-select-base-adapter "^0.1.1" + css-tree "1.0.0-alpha.37" + csso "^4.0.2" + js-yaml "^3.13.1" + mkdirp "~0.5.1" + object.values "^1.1.0" + sax "~1.2.4" + stable "^0.1.8" + unquote "~1.1.1" + util.promisify "~1.0.0" + +tapable@^1.0.0, tapable@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" + integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== + +terser-webpack-plugin@^1.4.3: + version "1.4.3" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.4.3.tgz#5ecaf2dbdc5fb99745fd06791f46fc9ddb1c9a7c" + integrity sha512-QMxecFz/gHQwteWwSo5nTc6UaICqN1bMedC5sMtUc7y3Ha3Q8y6ZO0iCR8pq4RJC8Hjf0FEPEHZqcMB/+DFCrA== + dependencies: + cacache "^12.0.2" + find-cache-dir "^2.1.0" + is-wsl "^1.1.0" + schema-utils "^1.0.0" + serialize-javascript "^2.1.2" + source-map "^0.6.1" + terser "^4.1.2" + webpack-sources "^1.4.0" + worker-farm "^1.7.0" + +terser-webpack-plugin@^2.2.1: + version "2.3.2" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-2.3.2.tgz#6d3d1b0590c8f729bfbaeb7fb2528b8b62db4c74" + integrity sha512-SmvB/6gtEPv+CJ88MH5zDOsZdKXPS/Uzv2//e90+wM1IHFUhsguPKEILgzqrM1nQ4acRXN/SV4Obr55SXC+0oA== + dependencies: + cacache "^13.0.1" + find-cache-dir "^3.2.0" + jest-worker "^24.9.0" + schema-utils "^2.6.1" + serialize-javascript "^2.1.2" + source-map "^0.6.1" + terser "^4.4.3" + webpack-sources "^1.4.3" + +terser@^4.1.2, terser@^4.3.9, terser@^4.4.3: + version "4.6.3" + resolved "https://registry.yarnpkg.com/terser/-/terser-4.6.3.tgz#e33aa42461ced5238d352d2df2a67f21921f8d87" + integrity sha512-Lw+ieAXmY69d09IIc/yqeBqXpEQIpDGZqT34ui1QWXIUpR2RjbqEkT8X7Lgex19hslSqcWM5iMN2kM11eMsESQ== + dependencies: + commander "^2.20.0" + source-map "~0.6.1" + source-map-support "~0.5.12" + +text-table@0.2.0, text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= + +through2@^2.0.0: + version "2.0.5" + resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" + integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== + dependencies: + readable-stream "~2.3.6" + xtend "~4.0.1" + +through@^2.3.6, through@~2.3.4: + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= + +thunky@^1.0.2: + version "1.1.0" + resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.1.0.tgz#5abaf714a9405db0504732bbccd2cedd9ef9537d" + integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA== + +timers-browserify@^2.0.4: + version "2.0.11" + resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.11.tgz#800b1f3eee272e5bc53ee465a04d0e804c31211f" + integrity sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ== + dependencies: + setimmediate "^1.0.4" + +timsort@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/timsort/-/timsort-0.3.0.tgz#405411a8e7e6339fe64db9a234de11dc31e02bd4" + integrity sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q= + +tiny-emitter@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/tiny-emitter/-/tiny-emitter-2.1.0.tgz#1d1a56edfc51c43e863cbb5382a72330e3555423" + integrity sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q== + +tiny-invariant@^1.0.2: + version "1.0.6" + resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.0.6.tgz#b3f9b38835e36a41c843a3b0907a5a7b3755de73" + integrity sha512-FOyLWWVjG+aC0UqG76V53yAWdXfH8bO6FNmyZOuUrzDzK8DI3/JRY25UD7+g49JWM1LXwymsKERB+DzI0dTEQA== + +tiny-warning@^1.0.0, tiny-warning@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/tiny-warning/-/tiny-warning-1.0.3.tgz#94a30db453df4c643d0fd566060d60a875d84754" + integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA== + +tmp@^0.0.33: + version "0.0.33" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== + dependencies: + os-tmpdir "~1.0.2" + +to-arraybuffer@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" + integrity sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M= + +to-factory@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/to-factory/-/to-factory-1.0.0.tgz#8738af8bd97120ad1d4047972ada5563bf9479b1" + integrity sha1-hzivi9lxIK0dQEeXKtpVY7+UebE= + +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= + +to-object-path@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" + integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= + dependencies: + kind-of "^3.0.2" + +to-regex-range@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" + integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= + dependencies: + is-number "^3.0.0" + repeat-string "^1.6.1" + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +to-regex@^3.0.1, to-regex@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" + integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== + dependencies: + define-property "^2.0.2" + extend-shallow "^3.0.2" + regex-not "^1.0.2" + safe-regex "^1.1.0" + +toidentifier@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" + integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== + +tough-cookie@~2.4.3: + version "2.4.3" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781" + integrity sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ== + dependencies: + psl "^1.1.24" + punycode "^1.4.1" + +tr46@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09" + integrity sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk= + dependencies: + punycode "^2.1.0" + +trim-lines@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/trim-lines/-/trim-lines-1.1.2.tgz#c8adbdbdae21bb5c2766240a661f693afe23e59b" + integrity sha512-3GOuyNeTqk3FAqc3jOJtw7FTjYl94XBR5aD9QnDbK/T4CA9sW/J0l9RoaRPE9wyPP7NF331qnHnvJFBJ+IDkmQ== + +trim-trailing-lines@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/trim-trailing-lines/-/trim-trailing-lines-1.1.2.tgz#d2f1e153161152e9f02fabc670fb40bec2ea2e3a" + integrity sha512-MUjYItdrqqj2zpcHFTkMa9WAv4JHTI6gnRQGPFLrt5L9a6tRMiDnIqYl8JBvu2d2Tc3lWJKQwlGCp0K8AvCM+Q== + +trim@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/trim/-/trim-0.0.1.tgz#5858547f6b290757ee95cccc666fb50084c460dd" + integrity sha1-WFhUf2spB1fulczMZm+1AITEYN0= + +trough@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/trough/-/trough-1.0.4.tgz#3b52b1f13924f460c3fbfd0df69b587dbcbc762e" + integrity sha512-tdzBRDGWcI1OpPVmChbdSKhvSVurznZ8X36AYURAcl+0o2ldlCY2XPzyXNNxwJwwyIU+rIglTCG4kxtNKBQH7Q== + +tryer@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/tryer/-/tryer-1.0.1.tgz#f2c85406800b9b0f74c9f7465b81eaad241252f8" + integrity sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA== + +tslib@^1.9.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.10.0.tgz#c3c19f95973fb0a62973fb09d90d961ee43e5c8a" + integrity sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ== + +tty-browserify@0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" + integrity sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY= + +tunnel-agent@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= + dependencies: + safe-buffer "^5.0.1" + +tweetnacl@^0.14.3, tweetnacl@~0.14.0: + version "0.14.5" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= + +type-fest@^0.8.1: + version "0.8.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" + integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== + +type-is@~1.6.17, type-is@~1.6.18: + version "1.6.18" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" + integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== + dependencies: + media-typer "0.3.0" + mime-types "~2.1.24" + +typedarray@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" + integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= + +unherit@^1.0.4: + version "1.1.2" + resolved "https://registry.yarnpkg.com/unherit/-/unherit-1.1.2.tgz#14f1f397253ee4ec95cec167762e77df83678449" + integrity sha512-W3tMnpaMG7ZY6xe/moK04U9fBhi6wEiCYHUW5Mop/wQHf12+79EQGwxYejNdhEz2mkqkBlGwm7pxmgBKMVUj0w== + dependencies: + inherits "^2.0.1" + xtend "^4.0.1" + +unicode-canonical-property-names-ecmascript@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818" + integrity sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ== + +unicode-match-property-ecmascript@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz#8ed2a32569961bce9227d09cd3ffbb8fed5f020c" + integrity sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg== + dependencies: + unicode-canonical-property-names-ecmascript "^1.0.4" + unicode-property-aliases-ecmascript "^1.0.4" + +unicode-match-property-value-ecmascript@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.1.0.tgz#5b4b426e08d13a80365e0d657ac7a6c1ec46a277" + integrity sha512-hDTHvaBk3RmFzvSl0UVrUmC3PuW9wKVnpoUDYH0JDkSIovzw+J5viQmeYHxVSBptubnr7PbH2e0fnpDRQnQl5g== + +unicode-property-aliases-ecmascript@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.5.tgz#a9cc6cc7ce63a0a3023fc99e341b94431d405a57" + integrity sha512-L5RAqCfXqAwR3RriF8pM0lU0w4Ryf/GgzONwi6KnL1taJQa7x1TCxdJnILX59WIGOwR57IVxn7Nej0fz1Ny6fw== + +unified@8.4.2, unified@^8.4.2: + version "8.4.2" + resolved "https://registry.yarnpkg.com/unified/-/unified-8.4.2.tgz#13ad58b4a437faa2751a4a4c6a16f680c500fff1" + integrity sha512-JCrmN13jI4+h9UAyKEoGcDZV+i1E7BLFuG7OsaDvTXI5P0qhHX+vZO/kOhz9jn8HGENDKbwSeB0nVOg4gVStGA== + dependencies: + bail "^1.0.0" + extend "^3.0.0" + is-plain-obj "^2.0.0" + trough "^1.0.0" + vfile "^4.0.0" + +union-value@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" + integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== + dependencies: + arr-union "^3.1.0" + get-value "^2.0.6" + is-extendable "^0.1.1" + set-value "^2.0.1" + +uniq@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" + integrity sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8= + +uniqs@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/uniqs/-/uniqs-2.0.0.tgz#ffede4b36b25290696e6e165d4a59edb998e6b02" + integrity sha1-/+3ks2slKQaW5uFl1KWe25mOawI= + +unique-filename@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" + integrity sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ== + dependencies: + unique-slug "^2.0.0" + +unique-slug@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.2.tgz#baabce91083fc64e945b0f3ad613e264f7cd4e6c" + integrity sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w== + dependencies: + imurmurhash "^0.1.4" + +unist-builder@1.0.4, unist-builder@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/unist-builder/-/unist-builder-1.0.4.tgz#e1808aed30bd72adc3607f25afecebef4dd59e17" + integrity sha512-v6xbUPP7ILrT15fHGrNyHc1Xda8H3xVhP7/HAIotHOhVPjH5dCXA097C3Rry1Q2O+HbOLCao4hfPB+EYEjHgVg== + dependencies: + object-assign "^4.1.0" + +unist-util-generated@^1.1.0: + version "1.1.5" + resolved "https://registry.yarnpkg.com/unist-util-generated/-/unist-util-generated-1.1.5.tgz#1e903e68467931ebfaea386dae9ea253628acd42" + integrity sha512-1TC+NxQa4N9pNdayCYA1EGUOCAO0Le3fVp7Jzns6lnua/mYgwHo0tz5WUAfrdpNch1RZLHc61VZ1SDgrtNXLSw== + +unist-util-is@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-3.0.0.tgz#d9e84381c2468e82629e4a5be9d7d05a2dd324cd" + integrity sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A== + +unist-util-is@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-4.0.1.tgz#ae3e39b9ad1b138c8e3b9d2f4658ad0031be4610" + integrity sha512-7NYjErP4LJtkEptPR22wO5RsCPnHZZrop7t2SoQzjvpFedCFer4WW8ujj9GI5DkUX7yVcffXLjoURf6h2QUv6Q== + +unist-util-position@^3.0.0: + version "3.0.4" + resolved "https://registry.yarnpkg.com/unist-util-position/-/unist-util-position-3.0.4.tgz#5872be7aec38629b971fdb758051f78817b0040a" + integrity sha512-tWvIbV8goayTjobxDIr4zVTyG+Q7ragMSMeKC3xnPl9xzIc0+she8mxXLM3JVNDDsfARPbCd3XdzkyLdo7fF3g== + +unist-util-remove-position@^1.0.0: + version "1.1.4" + resolved "https://registry.yarnpkg.com/unist-util-remove-position/-/unist-util-remove-position-1.1.4.tgz#ec037348b6102c897703eee6d0294ca4755a2020" + integrity sha512-tLqd653ArxJIPnKII6LMZwH+mb5q+n/GtXQZo6S6csPRs5zB0u79Yw8ouR3wTw8wxvdJFhpP6Y7jorWdCgLO0A== + dependencies: + unist-util-visit "^1.1.0" + +unist-util-remove@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/unist-util-remove/-/unist-util-remove-1.0.3.tgz#58ec193dfa84b52d5a055ffbc58e5444eb8031a3" + integrity sha512-mB6nCHCQK0pQffUAcCVmKgIWzG/AXs/V8qpS8K72tMPtOSCMSjDeMc5yN+Ye8rB0FhcE+JvW++o1xRNc0R+++g== + dependencies: + unist-util-is "^3.0.0" + +unist-util-stringify-position@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-2.0.2.tgz#5a3866e7138d55974b640ec69a94bc19e0f3fa12" + integrity sha512-nK5n8OGhZ7ZgUwoUbL8uiVRwAbZyzBsB/Ddrlbu6jwwubFza4oe15KlyEaLNMXQW1svOQq4xesUeqA85YrIUQA== + dependencies: + "@types/unist" "^2.0.2" + +unist-util-visit-parents@^2.0.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-2.1.2.tgz#25e43e55312166f3348cae6743588781d112c1e9" + integrity sha512-DyN5vD4NE3aSeB+PXYNKxzGsfocxp6asDc2XXE3b0ekO2BaRUpBicbbUygfSvYfUz1IkmjFR1YF7dPklraMZ2g== + dependencies: + unist-util-is "^3.0.0" + +unist-util-visit-parents@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-3.0.1.tgz#666883dc8684c6eec04a7e9781cdcd8b4888319f" + integrity sha512-umEOTkm6/y1gIqPrqet55mYqlvGXCia/v1FSc5AveLAI7jFmOAIbqiwcHcviLcusAkEQt1bq2hixCKO9ltMb2Q== + dependencies: + "@types/unist" "^2.0.0" + unist-util-is "^4.0.0" + +unist-util-visit@2.0.1, unist-util-visit@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-2.0.1.tgz#b4e1c1cb414250c6b3cb386b8e461d79312108ae" + integrity sha512-bEDa5S/O8WRDeI1mLaMoKuFFi89AjF+UAoMNxO+bbVdo06q+53Vhq4iiv1PenL6Rx1ZxIpXIzqZoc5HD2I1oMA== + dependencies: + "@types/unist" "^2.0.0" + unist-util-is "^4.0.0" + unist-util-visit-parents "^3.0.0" + +unist-util-visit@^1.0.0, unist-util-visit@^1.1.0, unist-util-visit@^1.4.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-1.4.1.tgz#4724aaa8486e6ee6e26d7ff3c8685960d560b1e3" + integrity sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw== + dependencies: + unist-util-visit-parents "^2.0.0" + +universalify@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" + integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== + +unpipe@1.0.0, unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= + +unquote@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/unquote/-/unquote-1.1.1.tgz#8fded7324ec6e88a0ff8b905e7c098cdc086d544" + integrity sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ= + +unset-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" + integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= + dependencies: + has-value "^0.3.1" + isobject "^3.0.0" + +upath@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" + integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== + +upper-case@^1.1.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/upper-case/-/upper-case-1.1.3.tgz#f6b4501c2ec4cdd26ba78be7222961de77621598" + integrity sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg= + +uri-js@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" + integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ== + dependencies: + punycode "^2.1.0" + +urix@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" + integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= + +url-parse@^1.4.3: + version "1.4.7" + resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.4.7.tgz#a8a83535e8c00a316e403a5db4ac1b9b853ae278" + integrity sha512-d3uaVyzDB9tQoSXFvuSUNFibTd9zxd2bkVrDRvF5TmvWWQwqE4lgYJ5m+x1DbecWkw+LK4RNl2CU1hHuOKPVlg== + dependencies: + querystringify "^2.1.1" + requires-port "^1.0.0" + +url@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" + integrity sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE= + dependencies: + punycode "1.3.2" + querystring "0.2.0" + +use@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" + integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== + +util-deprecate@^1.0.1, util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= + +util.promisify@1.0.0, util.promisify@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.0.tgz#440f7165a459c9a16dc145eb8e72f35687097030" + integrity sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA== + dependencies: + define-properties "^1.1.2" + object.getownpropertydescriptors "^2.0.3" + +util@0.10.3: + version "0.10.3" + resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" + integrity sha1-evsa/lCAUkZInj23/g7TeTNqwPk= + dependencies: + inherits "2.0.1" + +util@^0.11.0: + version "0.11.1" + resolved "https://registry.yarnpkg.com/util/-/util-0.11.1.tgz#3236733720ec64bb27f6e26f421aaa2e1b588d61" + integrity sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ== + dependencies: + inherits "2.0.3" + +utila@^0.4.0, utila@~0.4: + version "0.4.0" + resolved "https://registry.yarnpkg.com/utila/-/utila-0.4.0.tgz#8a16a05d445657a3aea5eecc5b12a4fa5379772c" + integrity sha1-ihagXURWV6Oupe7MWxKk+lN5dyw= + +utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= + +uuid@^3.0.1, uuid@^3.3.2: + version "3.3.3" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.3.tgz#4568f0216e78760ee1dbf3a4d2cf53e224112866" + integrity sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ== + +value-equal@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/value-equal/-/value-equal-1.0.1.tgz#1e0b794c734c5c0cade179c437d356d931a34d6c" + integrity sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw== + +vary@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= + +vendors@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/vendors/-/vendors-1.0.3.tgz#a6467781abd366217c050f8202e7e50cc9eef8c0" + integrity sha512-fOi47nsJP5Wqefa43kyWSg80qF+Q3XA6MUkgi7Hp1HQaKDQW4cQrK2D0P7mmbFtsV1N89am55Yru/nyEwRubcw== + +verror@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" + integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= + dependencies: + assert-plus "^1.0.0" + core-util-is "1.0.2" + extsprintf "^1.2.0" + +vfile-location@^2.0.0: + version "2.0.6" + resolved "https://registry.yarnpkg.com/vfile-location/-/vfile-location-2.0.6.tgz#8a274f39411b8719ea5728802e10d9e0dff1519e" + integrity sha512-sSFdyCP3G6Ka0CEmN83A2YCMKIieHx0EDaj5IDP4g1pa5ZJ4FJDvpO0WODLxo4LUX4oe52gmSCK7Jw4SBghqxA== + +vfile-message@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-2.0.2.tgz#75ba05090ec758fa8420f2c11ce049bcddd8cf3e" + integrity sha512-gNV2Y2fDvDOOqq8bEe7cF3DXU6QgV4uA9zMR2P8tix11l1r7zju3zry3wZ8sx+BEfuO6WQ7z2QzfWTvqHQiwsA== + dependencies: + "@types/unist" "^2.0.0" + unist-util-stringify-position "^2.0.0" + +vfile@^4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/vfile/-/vfile-4.0.2.tgz#71af004d4a710b0e6be99c894655bc56126d5d56" + integrity sha512-yhoTU5cDMSsaeaMfJ5g0bUKYkYmZhAh9fn9TZicxqn+Cw4Z439il2v3oT9S0yjlpqlI74aFOQCt3nOV+pxzlkw== + dependencies: + "@types/unist" "^2.0.0" + is-buffer "^2.0.0" + replace-ext "1.0.0" + unist-util-stringify-position "^2.0.0" + vfile-message "^2.0.0" + +vm-browserify@^1.0.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" + integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ== + +wait-file@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/wait-file/-/wait-file-1.0.5.tgz#377f48795f1765046a41bb0671c142ef8e509ae6" + integrity sha512-udLpJY/eOxlrMm3+XD1RLuF2oT9B7J7wiyR5/9xrvQymS6YR6trWvVhzOldHrVbLwyiRmLj9fcvsjzpSXeZHkw== + dependencies: + "@hapi/joi" "^15.1.0" + fs-extra "^8.1.0" + rx "^4.1.0" + +watchpack@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.6.0.tgz#4bc12c2ebe8aa277a71f1d3f14d685c7b446cd00" + integrity sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA== + dependencies: + chokidar "^2.0.2" + graceful-fs "^4.1.2" + neo-async "^2.5.0" + +wbuf@^1.1.0, wbuf@^1.7.3: + version "1.7.3" + resolved "https://registry.yarnpkg.com/wbuf/-/wbuf-1.7.3.tgz#c1d8d149316d3ea852848895cb6a0bfe887b87df" + integrity sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA== + dependencies: + minimalistic-assert "^1.0.0" + +web-namespaces@^1.0.0, web-namespaces@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/web-namespaces/-/web-namespaces-1.1.3.tgz#9bbf5c99ff0908d2da031f1d732492a96571a83f" + integrity sha512-r8sAtNmgR0WKOKOxzuSgk09JsHlpKlB+uHi937qypOu3PZ17UxPrierFKDye/uNHjNTTEshu5PId8rojIPj/tA== + +webidl-conversions@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" + integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg== + +webpack-bundle-analyzer@^3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-3.6.0.tgz#39b3a8f829ca044682bc6f9e011c95deb554aefd" + integrity sha512-orUfvVYEfBMDXgEKAKVvab5iQ2wXneIEorGNsyuOyVYpjYrI7CUOhhXNDd3huMwQ3vNNWWlGP+hzflMFYNzi2g== + dependencies: + acorn "^6.0.7" + acorn-walk "^6.1.1" + bfj "^6.1.1" + chalk "^2.4.1" + commander "^2.18.0" + ejs "^2.6.1" + express "^4.16.3" + filesize "^3.6.1" + gzip-size "^5.0.0" + lodash "^4.17.15" + mkdirp "^0.5.1" + opener "^1.5.1" + ws "^6.0.0" + +webpack-dev-middleware@^3.7.2: + version "3.7.2" + resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-3.7.2.tgz#0019c3db716e3fa5cecbf64f2ab88a74bab331f3" + integrity sha512-1xC42LxbYoqLNAhV6YzTYacicgMZQTqRd27Sim9wn5hJrX3I5nxYy1SxSd4+gjUFsz1dQFj+yEe6zEVmSkeJjw== + dependencies: + memory-fs "^0.4.1" + mime "^2.4.4" + mkdirp "^0.5.1" + range-parser "^1.2.1" + webpack-log "^2.0.0" + +webpack-dev-server@^3.9.0: + version "3.10.1" + resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-3.10.1.tgz#1ff3e5cccf8e0897aa3f5909c654e623f69b1c0e" + integrity sha512-AGG4+XrrXn4rbZUueyNrQgO4KGnol+0wm3MPdqGLmmA+NofZl3blZQKxZ9BND6RDNuvAK9OMYClhjOSnxpWRoA== + dependencies: + ansi-html "0.0.7" + bonjour "^3.5.0" + chokidar "^2.1.8" + 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" + is-absolute-url "^3.0.3" + killable "^1.0.1" + loglevel "^1.6.6" + opn "^5.5.0" + p-retry "^3.0.1" + portfinder "^1.0.25" + schema-utils "^1.0.0" + selfsigned "^1.10.7" + semver "^6.3.0" + serve-index "^1.9.1" + sockjs "0.3.19" + sockjs-client "1.4.0" + spdy "^4.0.1" + strip-ansi "^3.0.1" + supports-color "^6.1.0" + url "^0.11.0" + webpack-dev-middleware "^3.7.2" + webpack-log "^2.0.0" + ws "^6.2.1" + yargs "12.0.5" + +webpack-log@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/webpack-log/-/webpack-log-2.0.0.tgz#5b7928e0637593f119d32f6227c1e0ac31e1b47f" + integrity sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg== + dependencies: + ansi-colors "^3.0.0" + uuid "^3.3.2" + +webpack-merge@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-4.2.2.tgz#a27c52ea783d1398afd2087f547d7b9d2f43634d" + integrity sha512-TUE1UGoTX2Cd42j3krGYqObZbOD+xF7u28WB7tfUordytSjbWTIjK/8V0amkBfTYN4/pB/GIDlJZZ657BGG19g== + dependencies: + lodash "^4.17.15" + +webpack-sources@^1.1.0, webpack-sources@^1.4.0, webpack-sources@^1.4.1, webpack-sources@^1.4.3: + version "1.4.3" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.4.3.tgz#eedd8ec0b928fbf1cbfe994e22d2d890f330a933" + integrity sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ== + dependencies: + source-list-map "^2.0.0" + source-map "~0.6.1" + +webpack@^4.41.2: + version "4.41.5" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.41.5.tgz#3210f1886bce5310e62bb97204d18c263341b77c" + integrity sha512-wp0Co4vpyumnp3KlkmpM5LWuzvZYayDwM2n17EHFr4qxBBbRokC7DJawPJC7TfSFZ9HZ6GsdH40EBj4UV0nmpw== + dependencies: + "@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.2.1" + ajv "^6.10.2" + ajv-keywords "^3.4.1" + chrome-trace-event "^1.0.2" + enhanced-resolve "^4.1.0" + eslint-scope "^4.0.3" + json-parse-better-errors "^1.0.2" + loader-runner "^2.4.0" + loader-utils "^1.2.3" + memory-fs "^0.4.1" + micromatch "^3.1.10" + mkdirp "^0.5.1" + neo-async "^2.6.1" + node-libs-browser "^2.2.1" + schema-utils "^1.0.0" + tapable "^1.1.3" + terser-webpack-plugin "^1.4.3" + watchpack "^1.6.0" + webpack-sources "^1.4.1" + +webpackbar@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/webpackbar/-/webpackbar-4.0.0.tgz#ee7a87f16077505b5720551af413c8ecd5b1f780" + integrity sha512-k1qRoSL/3BVuINzngj09nIwreD8wxV4grcuhHTD8VJgUbGcy8lQSPqv+bM00B7F+PffwIsQ8ISd4mIwRbr23eQ== + dependencies: + ansi-escapes "^4.2.1" + chalk "^2.4.2" + consola "^2.10.0" + figures "^3.0.0" + pretty-time "^1.1.0" + std-env "^2.2.1" + text-table "^0.2.0" + wrap-ansi "^6.0.0" + +websocket-driver@>=0.5.1: + version "0.7.3" + resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.3.tgz#a2d4e0d4f4f116f1e6297eba58b05d430100e9f9" + integrity sha512-bpxWlvbbB459Mlipc5GBzzZwhoZgGEZLuqPaR0INBGnPAY1vdBX6hPnoFXiw+3yWxDuHyQjO2oXTMyS8A5haFg== + dependencies: + http-parser-js ">=0.4.0 <0.4.11" + safe-buffer ">=5.1.0" + websocket-extensions ">=0.1.1" + +websocket-extensions@>=0.1.1: + version "0.1.3" + resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.3.tgz#5d2ff22977003ec687a4b87073dfbbac146ccf29" + integrity sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg== + +whatwg-url@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-7.1.0.tgz#c2c492f1eca612988efd3d2266be1b9fc6170d06" + integrity sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg== + dependencies: + lodash.sortby "^4.7.0" + tr46 "^1.0.1" + webidl-conversions "^4.0.2" + +which-module@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" + integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= + +which@^1.2.9, which@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + +which@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +worker-farm@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.7.0.tgz#26a94c5391bbca926152002f69b84a4bf772e5a8" + integrity sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw== + dependencies: + errno "~0.1.7" + +worker-rpc@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/worker-rpc/-/worker-rpc-0.1.1.tgz#cb565bd6d7071a8f16660686051e969ad32f54d5" + integrity sha512-P1WjMrUB3qgJNI9jfmpZ/htmBEjFh//6l/5y8SD9hg1Ef5zTTVVoRjTrTEzPrNBQvmhMxkoTsjOXN10GWU7aCg== + dependencies: + microevent.ts "~0.1.1" + +wrap-ansi@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" + integrity sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU= + dependencies: + string-width "^1.0.1" + strip-ansi "^3.0.1" + +wrap-ansi@^6.0.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" + integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + +ws@^6.0.0, ws@^6.2.1: + version "6.2.1" + resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.1.tgz#442fdf0a47ed64f59b6a5d8ff130f4748ed524fb" + integrity sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA== + dependencies: + async-limiter "~1.0.0" + +xml-js@^1.6.11: + version "1.6.11" + resolved "https://registry.yarnpkg.com/xml-js/-/xml-js-1.6.11.tgz#927d2f6947f7f1c19a316dd8eea3614e8b18f8e9" + integrity sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g== + dependencies: + sax "^1.2.4" + +xmlbuilder@^13.0.0: + version "13.0.2" + resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-13.0.2.tgz#02ae33614b6a047d1c32b5389c1fdacb2bce47a7" + integrity sha512-Eux0i2QdDYKbdbA6AM6xE4m6ZTZr4G4xF9kahI2ukSEMCzwce2eX9WlTI5J3s+NU7hpasFsr8hWIONae7LluAQ== + +xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" + integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== + +"y18n@^3.2.1 || ^4.0.0", y18n@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" + integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== + +yallist@^3.0.2: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + +yargs-parser@^11.1.1: + version "11.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-11.1.1.tgz#879a0865973bca9f6bab5cbdf3b1c67ec7d3bcf4" + integrity sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + +yargs@12.0.5: + version "12.0.5" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-12.0.5.tgz#05f5997b609647b64f66b81e3b4b10a368e7ad13" + integrity sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw== + dependencies: + 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" + +zepto@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/zepto/-/zepto-1.2.0.tgz#e127bd9e66fd846be5eab48c1394882f7c0e4f98" + integrity sha1-4Se9nmb9hGvl6rSME5SIL3wOT5g= + +zwitch@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/zwitch/-/zwitch-1.0.4.tgz#93b1b993b13c8926753a41afaf8f27bbfac6be8b" + integrity sha512-YO803/X+13GNaZB7fVopjvHH0uWQKgJkgKnU1YCjxShjKGVuN9PPHHW8g+uFDpkHpSTNi3rCMKMewIcbC1BAYg== From 9cefbbbd50677842d57ac6c6f6857f6cd5a28f6f Mon Sep 17 00:00:00 2001 From: Brendan Zabarauskas Date: Thu, 16 Jan 2020 21:51:50 +1100 Subject: [PATCH 71/88] Improve function docs --- website/docs/reference/functions.md | 46 ++++++++++++++++++++++------- website/docs/reference/records.md | 8 ++++- 2 files changed, 42 insertions(+), 12 deletions(-) diff --git a/website/docs/reference/functions.md b/website/docs/reference/functions.md index 98595e7d7..cb3938e1a 100644 --- a/website/docs/reference/functions.md +++ b/website/docs/reference/functions.md @@ -21,23 +21,41 @@ For example, the function type for adding two 32-bit signed integers together is S32 -> S32 -> S32 ``` -## Introduction +## Construction -:::warning -This section is a work in progress. -::: +Functions are constructed by specifying a list of one-or-more parameter names after a `fun` token, +and then a body term after a `=>` token. +The parameters can then be referred to in the body of the function. -:::warning -This feature is not yet implemented! -::: +```pikelet +fun param-1 param-2 => body +``` -## Elimination +Note that functions must always be constructed in a position where they can find a type annotation. +For example, the following function is ambiguous: -:::warning -This section is a work in progress. +```pikelet +fun x y => x +``` + +This, however is not, because the function type pulled from the record annotation: + +```pikelet +record { + const = fun x y => x, +} : Record { + const : S32 -> String -> S32, +} +``` + +:::note +These are sometimes called _lambda abstractions_ in type theory, +ore _anonymous functions_ in programming languages. ::: -Functions are applied to arguments via [_juxtaposition_][juxtaposition-wikipedia]. +## Elimination + +Functions can be applied to arguments via [_juxtaposition_][juxtaposition-wikipedia]. For example, this is how the identity function might be applied: @@ -49,5 +67,11 @@ id String "hello!" Array 3 String ``` +### Computation + +:::warning +This section is a work in progress. +::: + [currying-wikipedia]: https://en.wikipedia.org/wiki/Currying [juxtaposition-wikipedia]: https://en.wikipedia.org/wiki/Juxtaposition#Mathematics diff --git a/website/docs/reference/records.md b/website/docs/reference/records.md index 2473c0bc5..0349ba3c6 100644 --- a/website/docs/reference/records.md +++ b/website/docs/reference/records.md @@ -15,7 +15,7 @@ Records provide a way of grouping together data. This section is a work in progress. ::: -## Introduction +## Construction :::warning This section is a work in progress. @@ -30,3 +30,9 @@ This section is a work in progress. :::warning This feature is not yet implemented! ::: + +### Computation + +:::warning +This section is a work in progress. +::: From c591b95bd625c03bbff775b1e4deba0d96344ae8 Mon Sep 17 00:00:00 2001 From: Brendan Zabarauskas Date: Thu, 16 Jan 2020 21:53:54 +1100 Subject: [PATCH 72/88] Add more to reference introduction --- website/docs/reference.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/website/docs/reference.md b/website/docs/reference.md index 462a3271f..474e4825e 100644 --- a/website/docs/reference.md +++ b/website/docs/reference.md @@ -9,3 +9,10 @@ keywords: --- Reference-level documentation for the Pikelet programming language. + +This is useful if you want a more in-depth look at each of the language features on their own. + +:::note +This is _not_ a precise description of the Pikelet language. +Implementors should therefore look to the [specification](./specification) to get a better understanding of how an implementation should behave. +::: From 146a312a41aaf5eca2404306f0e949b05ac78add Mon Sep 17 00:00:00 2001 From: Brendan Zabarauskas Date: Thu, 16 Jan 2020 22:09:25 +1100 Subject: [PATCH 73/88] Fix syntax highlighting --- website/src/theme/CodeBlock/pikelet.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/website/src/theme/CodeBlock/pikelet.js b/website/src/theme/CodeBlock/pikelet.js index a0f01727d..30f191765 100644 --- a/website/src/theme/CodeBlock/pikelet.js +++ b/website/src/theme/CodeBlock/pikelet.js @@ -32,7 +32,7 @@ Prism.languages.pikelet = { alias: "string" }, // Keywords - keyword: /\b(?:Record|record)\b/, + keyword: /\b(?:fun|Record|record)\b/, // Builtins builtin: /\b(?:Type|Bool|true|false|U8|U16|U32|U64|S8|S16|S32|S64|F32|F64|String|Char|Array|List)\b/, // Numeric literals @@ -47,6 +47,6 @@ Prism.languages.pikelet = { pattern: /\[|\]|\(|\)|\{|\}/, alias: "punctuation" }, - punctuation: /;|,|:|=/, + punctuation: /;|,|:|=>?/, operator: /->|\.|\^/ }; From 243decbfffba0a6d7a48e7af427e34fbc66fa45f Mon Sep 17 00:00:00 2001 From: Brendan Zabarauskas Date: Thu, 16 Jan 2020 22:11:43 +1100 Subject: [PATCH 74/88] Improve function docs --- website/docs/reference/functions.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/website/docs/reference/functions.md b/website/docs/reference/functions.md index cb3938e1a..8cb179f45 100644 --- a/website/docs/reference/functions.md +++ b/website/docs/reference/functions.md @@ -38,7 +38,8 @@ For example, the following function is ambiguous: fun x y => x ``` -This, however is not, because the function type pulled from the record annotation: +The following function passes the type checker, +because the function type is pulled from the record annotation: ```pikelet record { @@ -73,5 +74,7 @@ Array 3 String This section is a work in progress. ::: +(describe beta-reduction) + [currying-wikipedia]: https://en.wikipedia.org/wiki/Currying [juxtaposition-wikipedia]: https://en.wikipedia.org/wiki/Juxtaposition#Mathematics From f525bab15e817ec90434f4a7a3831aa498b253c2 Mon Sep 17 00:00:00 2001 From: Brendan Zabarauskas Date: Fri, 17 Jan 2020 08:27:58 +1100 Subject: [PATCH 75/88] Add some record examples --- website/docs/reference/records.md | 30 +++++++++++++++++++++++++++--- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/website/docs/reference/records.md b/website/docs/reference/records.md index 0349ba3c6..d2b81257c 100644 --- a/website/docs/reference/records.md +++ b/website/docs/reference/records.md @@ -15,21 +15,45 @@ Records provide a way of grouping together data. This section is a work in progress. ::: +```pikelet +Record { + width : U32, + height : U32, +} +``` + ## Construction :::warning This section is a work in progress. ::: +```pikelet +record { + width = 24, + height = 33, +} : Record { + width : U32, + height : U32, +} +``` + +```pikelet +record { + width = 24 : U32, + height = 33 : U32, +} +``` + ## Elimination :::warning This section is a work in progress. ::: -:::warning -This feature is not yet implemented! -::: +```pikelet +extents.width +``` ### Computation From f5a3a994a8d63d544029524baca47f643ea76f74 Mon Sep 17 00:00:00 2001 From: Brendan Zabarauskas Date: Sat, 18 Jan 2020 09:22:34 +1100 Subject: [PATCH 76/88] =?UTF-8?q?Add=20=E2=80=9CHow=20to=20implement=20dep?= =?UTF-8?q?endent=20type=20theory=E2=80=9D=20to=20bibliography?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- website/docs/reference/bibliography.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/website/docs/reference/bibliography.md b/website/docs/reference/bibliography.md index 123048ce1..2de8aacba 100644 --- a/website/docs/reference/bibliography.md +++ b/website/docs/reference/bibliography.md @@ -9,6 +9,24 @@ keywords: The following resources where helpful when designing and building Pikelet. +### How to implement dependent type theory I + +Andrej Bauer
+Blog Post, 2012.
+[blog](http://math.andrej.com/2012/11/08/how-to-implement-dependent-type-theory-i/) + +### How to implement dependent type theory II + +Andrej Bauer
+Blog Post, 2012.
+[blog](http://math.andrej.com/2012/11/11/how-to-implement-dependent-type-theory-ii/) + +### How to implement dependent type theory III + +Andrej Bauer
+Blog Post, 2012.
+[blog](http://math.andrej.com/2012/11/29/how-to-implement-dependent-type-theory-iii/) + ### A simple type-theoretic language: Mini-TT Thierry Coquand, Yoshiki Kinoshita, Bengt Nordström, and Makoto Takeyama
From b8f53c2d0730a809f45b33d925dde629dd7532cb Mon Sep 17 00:00:00 2001 From: Brendan Zabarauskas Date: Sun, 19 Jan 2020 10:10:35 +1100 Subject: [PATCH 77/88] Add code of conduct --- CODE_OF_CONDUCT.md | 85 ++++++++++++++++++++++++++++++++++++ README.md | 6 +++ website/docs/contributing.md | 8 ++++ 3 files changed, 99 insertions(+) create mode 100644 CODE_OF_CONDUCT.md diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 000000000..1d732b62a --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,85 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +We as members, contributors, and leaders pledge to make participation in our community a harassment-free experience for everyone, regardless of age, body size, visible or invisible disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, religion, or sexual identity and orientation. + +We pledge to act and interact in ways that contribute to an open, welcoming, diverse, inclusive, and healthy community. + +## Our Standards + +Examples of behavior that contributes to a positive environment for our community include: + +* Demonstrating empathy and kindness toward other people +* Being respectful of differing opinions, viewpoints, and experiences +* Giving and gracefully accepting constructive feedback +* Accepting responsibility and apologizing to those affected by our mistakes, and learning from the experience +* Focusing on what is best not just for us as individuals, but for the overall community + +Examples of unacceptable behavior include: + +* The use of sexualized language or imagery, and sexual attention or + advances of any kind +* Trolling, insulting or derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or email + address, without their explicit permission +* Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Enforcement Responsibilities + +Community leaders are responsible for clarifying and enforcing our standards of acceptable behavior and will take appropriate and fair corrective action in response to any behavior that they deem inappropriate, threatening, offensive, or harmful. + +Community leaders have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, and will communicate reasons for moderation decisions when appropriate. + +## Scope + +This Code of Conduct applies within all community spaces, and also applies when an individual is officially representing the community in public spaces. Examples of representing our community include using an official e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be reported to the community leaders responsible for enforcement at [bjzaba@yahoo.com.au](mailto:brendanzab@yahoo.com.au). All complaints will be reviewed and investigated promptly and fairly. + +All community leaders are obligated to respect the privacy and security of the reporter of any incident. + +## Enforcement Guidelines + +Community leaders will follow these Community Impact Guidelines in determining the consequences for any action they deem in violation of this Code of Conduct: + +### 1. Correction + +**Community Impact**: Use of inappropriate language or other behavior deemed unprofessional or unwelcome in the community. + +**Consequence**: A private, written warning from community leaders, providing clarity around the nature of the violation and an explanation of why the behavior was inappropriate. A public apology may be requested. + +### 2. Warning + +**Community Impact**: A violation through a single incident or series of actions. + +**Consequence**: A warning with consequences for continued behavior. No interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, for a specified period of time. This includes avoiding interactions in community spaces as well as external channels like social media. Violating these terms may lead to a temporary or permanent ban. + +### 3. Temporary Ban + +**Community Impact**: A serious violation of community standards, including sustained inappropriate behavior. + +**Consequence**: A temporary ban from any sort of interaction or public communication with the community for a specified period of time. No public or private interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, is allowed during this period. Violating these terms may lead to a permanent ban. + +### 4. Permanent Ban + +**Community Impact**: Demonstrating a pattern of violation of community standards, including sustained inappropriate behavior, harassment of an individual, or aggression toward or disparagement of classes of individuals. + +**Consequence**: A permanent ban from any sort of public interaction within the community. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 2.0, +available at https://www.contributor-covenant.org/version/2/0/code_of_conduct.html. + +Community Impact Guidelines were inspired by [Mozilla's code of conduct enforcement ladder](https://github.com/mozilla/diversity). + +[homepage]: https://www.contributor-covenant.org + +For answers to common questions about this code of conduct, see the FAQ at +https://www.contributor-covenant.org/faq. Translations are available at https://www.contributor-covenant.org/translations. + diff --git a/README.md b/README.md index 90a0ccb83..fda46323d 100644 --- a/README.md +++ b/README.md @@ -6,11 +6,13 @@ [![Build Status][travis-badge]][travis-url] [![Gitter][gitter-badge]][gitter-lobby] +[![Contributor Covenant][code-of-conduct-badge]](CODE_OF_CONDUCT.md) [travis-badge]: https://travis-ci.org/pikelet-lang/pikelet.svg?branch=master [travis-url]: https://travis-ci.org/pikelet-lang/pikelet [gitter-badge]: https://badges.gitter.im/pikelet-lang/pikelet.svg [gitter-lobby]: https://gitter.im/pikelet-lang/Lobby +[code-of-conduct-badge]: https://img.shields.io/badge/Contributor%20Covenant-v2.0%20adopted-ff69b4.svg Pikelet is a small, functional, dependently typed programming language. @@ -28,3 +30,7 @@ whole lot to do before it is even remotely useful to anyone! 😅 ## Roadmap Check out our plans in [the roadmap](./website/docs/contributing/roadmap). + +## Code of Conduct + +Please note that this project is released with a [Code of Conduct](./CODE_OF_CONDUCT). By participating in this project you agree to abide by its terms. diff --git a/website/docs/contributing.md b/website/docs/contributing.md index 9e9d3c0fc..e3c6a2f40 100644 --- a/website/docs/contributing.md +++ b/website/docs/contributing.md @@ -15,6 +15,14 @@ discussions, but we're always more than happy to spend time explaining things. [gitter-lobby]: https://gitter.im/pikelet-lang/Lobby + +## Code of Conduct + +Please note that this project is released with a [Code of Conduct][code-of-conduct]. +By participating in this project you agree to abide by its terms. + +[code-of-conduct]: https://github.com/pikelet-lang/pikelet/blob/master/CODE_OF_CONDUCT.md + :::note Topics might include: From dc516d7efed06c087e43c2d560d7cbbb1d0854ef Mon Sep 17 00:00:00 2001 From: Brendan Zabarauskas Date: Sun, 19 Jan 2020 10:21:30 +1100 Subject: [PATCH 78/88] Use notes instead of warnings for WIP notes --- website/docs/contributing.md | 18 ++++++------------ website/docs/contributing/roadmap.md | 1 - website/docs/guide/data-structures.md | 6 +++--- website/docs/guide/hello-world.md | 5 +++-- website/docs/guide/modular-programming.md | 6 +++--- website/docs/index.md | 2 +- website/docs/reference/functions.md | 2 +- website/docs/reference/records.md | 8 ++++---- website/docs/reference/universes.md | 6 +++--- .../specification/core/bidirectional-typing.md | 2 +- .../specification/core/declarative-typing.md | 2 +- .../core/operational-semantics.md | 2 +- .../docs/specification/surface/elaboration.md | 2 +- 13 files changed, 28 insertions(+), 34 deletions(-) diff --git a/website/docs/contributing.md b/website/docs/contributing.md index e3c6a2f40..301534244 100644 --- a/website/docs/contributing.md +++ b/website/docs/contributing.md @@ -8,13 +8,15 @@ keywords: - pikelet --- -We really want to encourage new contributors to help out! Please come chat with -us [on our Gitter channel][gitter-lobby] - if you have any questions about the -project, or just want to say hi! We sometimes get side-tracked on technical -discussions, but we're always more than happy to spend time explaining things. +We really want to encourage new contributors to help out! +Please come chat with us [on our Gitter channel][gitter-lobby] +if you have any questions about the project, or just want to say hi! [gitter-lobby]: https://gitter.im/pikelet-lang/Lobby +:::note +This section is a work in progress. +::: ## Code of Conduct @@ -23,11 +25,3 @@ By participating in this project you agree to abide by its terms. [code-of-conduct]: https://github.com/pikelet-lang/pikelet/blob/master/CODE_OF_CONDUCT.md -:::note -Topics might include: - -- How to set up the development environment -- Code of conduct -- How to contribute to the language -- A reading list for those wanting to learn about the theory -::: diff --git a/website/docs/contributing/roadmap.md b/website/docs/contributing/roadmap.md index e5332826b..12a28562e 100644 --- a/website/docs/contributing/roadmap.md +++ b/website/docs/contributing/roadmap.md @@ -4,7 +4,6 @@ title: Roadmap sidebar_label: Roadmap keywords: - docs - - roadmap - pikelet --- diff --git a/website/docs/guide/data-structures.md b/website/docs/guide/data-structures.md index 849d78a71..7a04caf17 100644 --- a/website/docs/guide/data-structures.md +++ b/website/docs/guide/data-structures.md @@ -9,18 +9,18 @@ keywords: ## Lists -:::warning +:::note This section is a work in progress. ::: ## Arrays -:::warning +:::note This section is a work in progress. ::: ## Records -:::warning +:::note This section is a work in progress. ::: diff --git a/website/docs/guide/hello-world.md b/website/docs/guide/hello-world.md index 70bade927..247314fac 100644 --- a/website/docs/guide/hello-world.md +++ b/website/docs/guide/hello-world.md @@ -20,6 +20,7 @@ pikelet repl The REPL should appear in the terminal like so: ``` +$ pikelet repl ____ _ __ __ __ / __ \(_) /_____ / /__ / /_ / /_/ / / //_/ _ \/ / _ \/ __/ Version 0.1.0 @@ -45,7 +46,7 @@ By pressing Enter, you can 'normalize' the term, and see its type: ## Effects -:::warning +:::note This section is a work in progress. ::: @@ -65,7 +66,7 @@ Hello world! ## Compiling a standalone executable -:::warning +:::note This section is a work in progress. ::: diff --git a/website/docs/guide/modular-programming.md b/website/docs/guide/modular-programming.md index f7d4c5528..d78950e50 100644 --- a/website/docs/guide/modular-programming.md +++ b/website/docs/guide/modular-programming.md @@ -9,18 +9,18 @@ keywords: ## The need for modularity -:::warning +:::note This section is a work in progress. ::: ## Describing interfaces -:::warning +:::note This section is a work in progress. ::: ## Parameterised modules -:::warning +:::note This section is a work in progress. ::: diff --git a/website/docs/index.md b/website/docs/index.md index 8a638aadd..d48fc5e3b 100644 --- a/website/docs/index.md +++ b/website/docs/index.md @@ -1,6 +1,6 @@ # Pikelet Documentation -:::warning +:::note This section is a work in progress. ::: diff --git a/website/docs/reference/functions.md b/website/docs/reference/functions.md index 8cb179f45..9cb3caf65 100644 --- a/website/docs/reference/functions.md +++ b/website/docs/reference/functions.md @@ -70,7 +70,7 @@ Array 3 String ### Computation -:::warning +:::note This section is a work in progress. ::: diff --git a/website/docs/reference/records.md b/website/docs/reference/records.md index d2b81257c..fd24175b6 100644 --- a/website/docs/reference/records.md +++ b/website/docs/reference/records.md @@ -11,7 +11,7 @@ Records provide a way of grouping together data. ## Formation -:::warning +:::note This section is a work in progress. ::: @@ -24,7 +24,7 @@ Record { ## Construction -:::warning +:::note This section is a work in progress. ::: @@ -47,7 +47,7 @@ record { ## Elimination -:::warning +:::note This section is a work in progress. ::: @@ -57,6 +57,6 @@ extents.width ### Computation -:::warning +:::note This section is a work in progress. ::: diff --git a/website/docs/reference/universes.md b/website/docs/reference/universes.md index 0b9597aa9..d290990a0 100644 --- a/website/docs/reference/universes.md +++ b/website/docs/reference/universes.md @@ -9,7 +9,7 @@ keywords: ## Universe levels -:::warning +:::note This section is a work in progress. ::: @@ -42,12 +42,12 @@ This section is a work in progress. ## Cumulativity -:::warning +:::note This section is a work in progress. ::: ## Lifting terms -:::warning +:::note This section is a work in progress. ::: diff --git a/website/docs/specification/core/bidirectional-typing.md b/website/docs/specification/core/bidirectional-typing.md index dedbc129d..f7f71f5db 100644 --- a/website/docs/specification/core/bidirectional-typing.md +++ b/website/docs/specification/core/bidirectional-typing.md @@ -7,6 +7,6 @@ keywords: - pikelet --- -:::warning +:::note This section is a work in progress. ::: diff --git a/website/docs/specification/core/declarative-typing.md b/website/docs/specification/core/declarative-typing.md index 2855150de..bdeaa395b 100644 --- a/website/docs/specification/core/declarative-typing.md +++ b/website/docs/specification/core/declarative-typing.md @@ -7,6 +7,6 @@ keywords: - pikelet --- -:::warning +:::note This section is a work in progress. ::: diff --git a/website/docs/specification/core/operational-semantics.md b/website/docs/specification/core/operational-semantics.md index 400434092..9e7a30778 100644 --- a/website/docs/specification/core/operational-semantics.md +++ b/website/docs/specification/core/operational-semantics.md @@ -7,7 +7,7 @@ keywords: - pikelet --- -:::warning +:::note This section is a work in progress. ::: diff --git a/website/docs/specification/surface/elaboration.md b/website/docs/specification/surface/elaboration.md index 97a080c82..17547d04a 100644 --- a/website/docs/specification/surface/elaboration.md +++ b/website/docs/specification/surface/elaboration.md @@ -7,6 +7,6 @@ keywords: - pikelet --- -:::warning +:::note This section is a work in progress. ::: From a63cfe03af48d5e08d1abd4c235bcd4b9ae7b441 Mon Sep 17 00:00:00 2001 From: Brendan Zabarauskas Date: Sun, 19 Jan 2020 10:38:06 +1100 Subject: [PATCH 79/88] Move specification inspiration to subdirectory --- website/docs/specification.md | 17 ---------------- website/docs/specification/inspiration.md | 24 +++++++++++++++++++++++ website/sidebars.js | 3 ++- 3 files changed, 26 insertions(+), 18 deletions(-) create mode 100644 website/docs/specification/inspiration.md diff --git a/website/docs/specification.md b/website/docs/specification.md index cac65da1a..bde732fbf 100644 --- a/website/docs/specification.md +++ b/website/docs/specification.md @@ -22,20 +22,3 @@ This will be where we give a comprehensive, formally described specification of - environment We may want to create [some form of markup language for this](https://gist.github.com/brendanzab/47fac049f8b40e449db6a9bd60efa57f), similar to OTT. - -## Inspiration - -Some inspiring language specifications/references: - -- [WebAssembly Specification](https://webassembly.github.io/spec/core/) -- [The Definition of Standard ML](http://sml-family.org/sml97-defn.pdf) -- [Dhall Specification](https://github.com/dhall-lang/dhall-lang/blob/master/standard/README.md) -- [The Ur/Web Manual](http://www.impredicative.com/ur/manual.pdf) -- [Coq Reference Manual: The Gallina specification language](https://coq.inria.fr/refman/language/gallina-specification-language.html) -- [Coq Reference Manual: Calculus of Inductive Constructions](https://coq.inria.fr/refman/language/cic.html) -- [The Isabelle/Isar Reference Manual](http://isabelle.in.tum.de/dist/Isabelle2019/doc/isar-ref.pdf) -- [The Isabelle/Isar Implementation](http://isabelle.in.tum.de/dist/Isabelle2019/doc/implementation.pdf) -- [Specification of Core Agda](https://agda.github.io/agda-spec/core-agda.pdf) -- [Swift Reference](https://docs.swift.org/swift-book/ReferenceManual/AboutTheLanguageReference.html) -- [D Specification](https://dlang.org/spec/spec.html) -- [Rust Reference](https://doc.rust-lang.org/reference/) diff --git a/website/docs/specification/inspiration.md b/website/docs/specification/inspiration.md new file mode 100644 index 000000000..ce185b15c --- /dev/null +++ b/website/docs/specification/inspiration.md @@ -0,0 +1,24 @@ +--- +id: inspiration +title: Inspiration +sidebar_label: Inspiration +keywords: + - docs + - specification + - pikelet +--- + +Some inspiring language specifications/references: + +- [WebAssembly Specification](https://webassembly.github.io/spec/core/) +- [The Definition of Standard ML](http://sml-family.org/sml97-defn.pdf) +- [Dhall Specification](https://github.com/dhall-lang/dhall-lang/blob/master/standard/README.md) +- [The Ur/Web Manual](http://www.impredicative.com/ur/manual.pdf) +- [Coq Reference Manual: The Gallina specification language](https://coq.inria.fr/refman/language/gallina-specification-language.html) +- [Coq Reference Manual: Calculus of Inductive Constructions](https://coq.inria.fr/refman/language/cic.html) +- [The Isabelle/Isar Reference Manual](http://isabelle.in.tum.de/dist/Isabelle2019/doc/isar-ref.pdf) +- [The Isabelle/Isar Implementation](http://isabelle.in.tum.de/dist/Isabelle2019/doc/implementation.pdf) +- [Specification of Core Agda](https://agda.github.io/agda-spec/core-agda.pdf) +- [Swift Reference](https://docs.swift.org/swift-book/ReferenceManual/AboutTheLanguageReference.html) +- [D Specification](https://dlang.org/spec/spec.html) +- [Rust Reference](https://doc.rust-lang.org/reference/) diff --git a/website/sidebars.js b/website/sidebars.js index 96a6146f9..82365dbc0 100755 --- a/website/sidebars.js +++ b/website/sidebars.js @@ -50,7 +50,8 @@ module.exports = { "specification/core/declarative-typing", "specification/core/bidirectional-typing" ] - } + }, + "specification/inspiration" ], contributingSidebar: ["contributing", "contributing/roadmap"] }; From 9e5e3a79de4fdbeca64f4bed93af5a627106e9df Mon Sep 17 00:00:00 2001 From: Brendan Zabarauskas Date: Sun, 19 Jan 2020 12:49:06 +1100 Subject: [PATCH 80/88] Improve Identifier highlighting --- website/src/theme/CodeBlock/pikelet.js | 32 ++++++++++++++++++-------- 1 file changed, 23 insertions(+), 9 deletions(-) diff --git a/website/src/theme/CodeBlock/pikelet.js b/website/src/theme/CodeBlock/pikelet.js index 30f191765..49e7340e3 100644 --- a/website/src/theme/CodeBlock/pikelet.js +++ b/website/src/theme/CodeBlock/pikelet.js @@ -1,8 +1,15 @@ -// Check out some other Prism highlighters for inspiration: -// -// https://github.com/PrismJS/prism/blob/master/components/prism-haskell.js -// https://github.com/PrismJS/prism/blob/master/components/prism-rust.js -// https://github.com/SassDoc/prism-scss-sassdoc/blob/master/prism-scss-sassdoc.js +/** + * Pikelet Prism syntax highlighting. + * + * Check out the Prism language definition docs for more help in extending this: + * https://prismjs.com/extending.html#language-definitions + * + * It might also be helpful to look at some other Prism highlighters for inspiration: + * + * - https://github.com/PrismJS/prism/blob/master/components/prism-haskell.js + * - https://github.com/PrismJS/prism/blob/master/components/prism-rust.js + * - https://github.com/SassDoc/prism-scss-sassdoc/blob/master/prism-scss-sassdoc.js + */ Prism.languages.pikelet = { // Comments. @@ -31,10 +38,17 @@ Prism.languages.pikelet = { pattern: /b?'(?:\\(?:x[0-7][\da-fA-F]|u{(?:[\da-fA-F]_*){1,6}|.)|[^\\\r\n\t'])'/, alias: "string" }, - // Keywords - keyword: /\b(?:fun|Record|record)\b/, - // Builtins - builtin: /\b(?:Type|Bool|true|false|U8|U16|U32|U64|S8|S16|S32|S64|F32|F64|String|Char|Array|List)\b/, + // Identifiers + identifier: { + pattern: /\b(?:[a-zA-Z][a-zA-Z0-9\-]*)\b/, + greedy: true, + inside: { + // Keywords + keyword: /^(?:fun|Record|record)$/, + // Builtins + builtin: /^(?:Type|Bool|true|false|U8|U16|U32|U64|S8|S16|S32|S64|F32|F64|String|Char|Array|List)$/ + } + }, // Numeric literals number: [ /(-|\+)?\b(?:0b[01](?:_?[01])*)(?:_)?\b/, From c51bd056b24441441a5ebad7b799d3c10556d8cc Mon Sep 17 00:00:00 2001 From: Brendan Zabarauskas Date: Sun, 19 Jan 2020 12:49:35 +1100 Subject: [PATCH 81/88] Name reference improvements --- website/docs/reference/names.md | 29 ++++++++++++++++++----------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/website/docs/reference/names.md b/website/docs/reference/names.md index 84443e056..f1c83cb80 100644 --- a/website/docs/reference/names.md +++ b/website/docs/reference/names.md @@ -7,21 +7,12 @@ keywords: - pikelet --- -### Keywords - -The following keywords are reserved by Pikelet: - -- `Record` -- `record` - -:::note -See [Surface language - Lexical syntax - Keywords and identifiers](../specification/surface/lexical-structure#keywords-and-identifiers): keyword -::: - ### Identifiers Names refer to declarations that are currently in scope. +These could either be _global_, or _local_. + ```pikelet make-string Foo-23 @@ -32,6 +23,22 @@ Unicode-String See [Surface language - Lexical syntax - Keywords and identifiers](../specification/surface/lexical-structure#keywords-and-identifiers): ident ::: +### Keywords + +Keywords use the same syntax as [identifiers](#identifiers), but are reserved by Pikelet. + +The following keywords are reserved by Pikelet: + +| Keyword | Purpose | +| ------- | ------- | +| `fun` | [Function construction](./functions#Construction) | +| `Record` | [Record formation](./records#Formation) | +| `record` | [Record construction](./records#Construction) | + +:::note +See [Surface language - Lexical syntax - Keywords and identifiers](../specification/surface/lexical-structure#keywords-and-identifiers): keyword +::: + ### Conventions #### Term names From e7422c56cee9ee8c72204bc9a18fb6294cc10e39 Mon Sep 17 00:00:00 2001 From: Brendan Zabarauskas Date: Sun, 19 Jan 2020 13:08:49 +1100 Subject: [PATCH 82/88] Add more resources to the bibliography --- website/docs/reference/bibliography.md | 52 +++++++++++++++++--------- 1 file changed, 35 insertions(+), 17 deletions(-) diff --git a/website/docs/reference/bibliography.md b/website/docs/reference/bibliography.md index 2de8aacba..958438196 100644 --- a/website/docs/reference/bibliography.md +++ b/website/docs/reference/bibliography.md @@ -12,20 +12,20 @@ The following resources where helpful when designing and building Pikelet. ### How to implement dependent type theory I Andrej Bauer
-Blog Post, 2012.
-[blog](http://math.andrej.com/2012/11/08/how-to-implement-dependent-type-theory-i/) +Blog post, 2012.
+[blog post](http://math.andrej.com/2012/11/08/how-to-implement-dependent-type-theory-i/) ### How to implement dependent type theory II Andrej Bauer
-Blog Post, 2012.
-[blog](http://math.andrej.com/2012/11/11/how-to-implement-dependent-type-theory-ii/) +Blog post, 2012.
+[blog post](http://math.andrej.com/2012/11/11/how-to-implement-dependent-type-theory-ii/) ### How to implement dependent type theory III Andrej Bauer
-Blog Post, 2012.
-[blog](http://math.andrej.com/2012/11/29/how-to-implement-dependent-type-theory-iii/) +Blog post, 2012.
+[blog post](http://math.andrej.com/2012/11/29/how-to-implement-dependent-type-theory-iii/) ### A simple type-theoretic language: Mini-TT @@ -33,27 +33,45 @@ Thierry Coquand, Yoshiki Kinoshita, Bengt Nordström, and Makoto Takeyama
Essays in Honour of Gilles Kahn, 2009.
[paper](http://www.cse.chalmers.se/~bengt/papers/GKminiTT.pdf) +### Bidirectional Typing Rules: A Tutorial + +David Raymond Christiansen
+Tutorial, 2013.
+[paper](http://www.davidchristiansen.dk/tutorials/bidirectional.pdf) + +### Checking Dependent Types with Normalization by Evaluation: A Tutorial + +David Thrane Christiansen
+Web page, 2018 (Last accessed 2020).
+[web page](http://www.davidchristiansen.dk/tutorials/nbe/) + +### A tutorial implementation of a dependently typed lambda calculus + +Andres Löh, Conor McBride, and Wouter Swierstra
+Fundamenta Informaticae XXI, 2001 (Revised 2009).
+[paper](https://www.andres-loeh.de/LambdaPi/LambdaPi.pdf) - +[abstract](https://www.andres-loeh.de/LambdaPi/) + ### Crude but Effective Stratification Conor McBride
-Blog Post, 2011.
-[blog](https://mazzo.li/epilogue/index.html%3Fp=857&cpage=1.html) +Blog post, 2011.
+[blog post](https://mazzo.li/epilogue/index.html%3Fp=857&cpage=1.html) ### Universe Hierarchies Conor McBride
-Blog Post, 2015.
-[blog](https://pigworker.wordpress.com/2015/01/09/universe-hierarchies/) +Blog post, 2015.
+[blog post](https://pigworker.wordpress.com/2015/01/09/universe-hierarchies/) + +### Lecture Notes on Bidirectional Type Checking + +Frank Pfenning
+Lecture Notes, 2004.
+[paper](https://www.cs.cmu.edu/~fp/courses/15312-f04/handouts/15-bidirectional.pdf) ### Dependently typed lambda calculus with a lifting operator Damien Rouhling
Internship Report, 2014.
[paper](http://www-sop.inria.fr/members/Damien.Rouhling/data/internships/M1Report.pdf) - -### A tutorial implementation of a dependently typed lambda calculus - -Andres Löh, Conor McBride, and Wouter Swierstra
-Fundamenta Informaticae XXI, 2001 (Revised 2009).
-[paper](https://www.andres-loeh.de/LambdaPi/LambdaPi.pdf) - -[abstract](https://www.andres-loeh.de/LambdaPi/) From e79029fa6f2d3078a3d289a69bfacd05676c5367 Mon Sep 17 00:00:00 2001 From: Brendan Zabarauskas Date: Sun, 19 Jan 2020 13:12:21 +1100 Subject: [PATCH 83/88] Put header links on the right --- website/docusaurus.config.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/website/docusaurus.config.js b/website/docusaurus.config.js index 85dfbf919..bcd27fb65 100755 --- a/website/docusaurus.config.js +++ b/website/docusaurus.config.js @@ -21,27 +21,27 @@ module.exports = { { label: "Guide", to: "docs/guide", - position: "left" + position: "right" }, { label: "Reference", to: "docs/reference", - position: "left" + position: "right" }, { label: "Specification", to: "docs/specification", - position: "left" + position: "right" }, { label: "Contributing", to: "docs/contributing", - position: "left" + position: "right" }, // { // label: "Blog", // to: "blog", - // position: "left" + // position: "right" // }, { label: "GitHub", From 93d0a04d44656beef27cd7e68bad188ff1588080 Mon Sep 17 00:00:00 2001 From: Brendan Zabarauskas Date: Sun, 19 Jan 2020 13:25:58 +1100 Subject: [PATCH 84/88] Add some more section descriptions to the specification --- website/docs/specification/core/bidirectional-typing.md | 2 ++ website/docs/specification/core/declarative-typing.md | 4 ++++ website/docs/specification/surface/elaboration.md | 2 ++ website/docs/specification/surface/grammar.md | 2 +- 4 files changed, 9 insertions(+), 1 deletion(-) diff --git a/website/docs/specification/core/bidirectional-typing.md b/website/docs/specification/core/bidirectional-typing.md index f7f71f5db..d07b6ecaa 100644 --- a/website/docs/specification/core/bidirectional-typing.md +++ b/website/docs/specification/core/bidirectional-typing.md @@ -7,6 +7,8 @@ keywords: - pikelet --- +This section describes the bidirectional type checker for the core language. + :::note This section is a work in progress. ::: diff --git a/website/docs/specification/core/declarative-typing.md b/website/docs/specification/core/declarative-typing.md index bdeaa395b..9c22bed23 100644 --- a/website/docs/specification/core/declarative-typing.md +++ b/website/docs/specification/core/declarative-typing.md @@ -7,6 +7,10 @@ keywords: - pikelet --- +This section defines the type system declaratively. +Note that this is hard to define a type inference algorithm for, +so instead we refine this to check the language using [bidirectional type checking](./bidirectional-typing) instead. + :::note This section is a work in progress. ::: diff --git a/website/docs/specification/surface/elaboration.md b/website/docs/specification/surface/elaboration.md index 17547d04a..e2deca016 100644 --- a/website/docs/specification/surface/elaboration.md +++ b/website/docs/specification/surface/elaboration.md @@ -7,6 +7,8 @@ keywords: - pikelet --- +This section describes how the surface language is elaborated into the core language. + :::note This section is a work in progress. ::: diff --git a/website/docs/specification/surface/grammar.md b/website/docs/specification/surface/grammar.md index 46e912a45..b0d762aab 100644 --- a/website/docs/specification/surface/grammar.md +++ b/website/docs/specification/surface/grammar.md @@ -7,7 +7,7 @@ keywords: - pikelet --- -This defines the grammar of the surface language. +This section defines the grammar of the surface language. ## Terms From 1ebd20aecacfff24edc1f992f470da2a1b83c5d3 Mon Sep 17 00:00:00 2001 From: Brendan Zabarauskas Date: Sun, 19 Jan 2020 14:17:13 +1100 Subject: [PATCH 85/88] Add a note on field order --- website/docs/reference/records.md | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/website/docs/reference/records.md b/website/docs/reference/records.md index fd24175b6..327c91a00 100644 --- a/website/docs/reference/records.md +++ b/website/docs/reference/records.md @@ -7,13 +7,14 @@ keywords: - pikelet --- -Records provide a way of grouping together data. +Records provide a way of grouping together data into [composite data types][composite-data-types-wikipedia]. + +[composite-data-types-wikipedia]: https://en.wikipedia.org/wiki/Composite_data_type ## Formation -:::note -This section is a work in progress. -::: +A record type is a list of entries, consisting of an entry name, and an entry type. +For example, this is a record that defines `width` and `height` extents: ```pikelet Record { @@ -22,6 +23,23 @@ Record { } ``` +### Field order + +Note that the order of the fields matters, so this would be a different type to +the one defined above: + +```pikelet +Record { + height : U32, + width : U32, +} +``` + +:::note +The field order seems annoying! +It would be nice not to require this in the future. +::: + ## Construction :::note From a1a37265c2d84f0c5ca1092972d4a7142bfcb63b Mon Sep 17 00:00:00 2001 From: Brendan Zabarauskas Date: Sun, 19 Jan 2020 15:04:28 +1100 Subject: [PATCH 86/88] Flesh out guide introduction some more --- website/docs/guide.md | 29 +++++++++++++++++++---------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/website/docs/guide.md b/website/docs/guide.md index a39685dfb..95db2afb0 100644 --- a/website/docs/guide.md +++ b/website/docs/guide.md @@ -8,26 +8,35 @@ keywords: - pikelet --- +Welcome to the _Pikelet Language Guide_. +This book will walk you through some of the features of Pikelet. + +The aim for this guide is to be accessible as possible! +Once you feel comfortable with the basics, +the [Pikelet Reference][reference] is there to provide you with more in-depth descriptions of each of the languages's features. + :::warning Pikelet is still a work in progress! Many features are not implemented yet! If you'd like to see what we hope to tackle next, have a look at [our roadmap](./contributing/roadmap). ::: -A guide for learning Pikelet. +:::note +This guide is still very incomplete! Topics that this guide might cover are: -- motivation for Pikelet -- installation of tools -- first program -- data structures -- modular programming using functions records -- working with universes -- embedding Pikelet in another program -- compiling standalone Pikelet programs -- using Pikelet as a configuration language +- [ ] motivation for Pikelet +- [x] installation of tools +- [ ] first program +- [ ] data structures +- [ ] modular programming using functions records +- [ ] working with universes +- [ ] using Pikelet as a configuration language +- [ ] embedding Pikelet in another program +- [ ] compiling standalone Pikelet programs We should provide links to the corresponding [reference][reference] material where appropriate. +::: [reference]: ../reference/introduction From 8ec964802be605154f7a56961b228ccaf95dd6b2 Mon Sep 17 00:00:00 2001 From: Brendan Zabarauskas Date: Sun, 19 Jan 2020 15:04:46 +1100 Subject: [PATCH 87/88] =?UTF-8?q?Move=20installation=20instructions=20to?= =?UTF-8?q?=20=E2=80=9Cgetting=20started=E2=80=9D=20page?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- website/docs/guide/{installation.md => getting-started.md} | 4 ++-- website/sidebars.js | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) rename website/docs/guide/{installation.md => getting-started.md} (96%) diff --git a/website/docs/guide/installation.md b/website/docs/guide/getting-started.md similarity index 96% rename from website/docs/guide/installation.md rename to website/docs/guide/getting-started.md index 24ccf6b18..a71557cf0 100644 --- a/website/docs/guide/installation.md +++ b/website/docs/guide/getting-started.md @@ -1,6 +1,6 @@ --- -id: installation -title: Installation +id: getting-started +title: Getting Started keywords: - docs - guide diff --git a/website/sidebars.js b/website/sidebars.js index 82365dbc0..3ad7c5907 100755 --- a/website/sidebars.js +++ b/website/sidebars.js @@ -8,7 +8,7 @@ module.exports = { guideSidebar: [ "guide", - "guide/installation", + "guide/getting-started", "guide/hello-world", "guide/data-structures", "guide/modular-programming" From f880151e435b43590503c91a71a5c1336ca0e5df Mon Sep 17 00:00:00 2001 From: Brendan Zabarauskas Date: Sun, 19 Jan 2020 15:44:02 +1100 Subject: [PATCH 88/88] Reformat index page using prettier --- website/src/pages/index.js | 46 ++++++++++++++++++++------------------ 1 file changed, 24 insertions(+), 22 deletions(-) diff --git a/website/src/pages/index.js b/website/src/pages/index.js index 90cff1e1b..74fcee7a8 100755 --- a/website/src/pages/index.js +++ b/website/src/pages/index.js @@ -1,48 +1,48 @@ -import React from 'react'; -import classnames from 'classnames'; -import Layout from '@theme/Layout'; -import Link from '@docusaurus/Link'; -import useDocusaurusContext from '@docusaurus/useDocusaurusContext'; -import useBaseUrl from '@docusaurus/useBaseUrl'; -import styles from './styles.module.css'; +import React from "react"; +import classnames from "classnames"; +import Layout from "@theme/Layout"; +import Link from "@docusaurus/Link"; +import useDocusaurusContext from "@docusaurus/useDocusaurusContext"; +import useBaseUrl from "@docusaurus/useBaseUrl"; +import styles from "./styles.module.css"; const features = [ { title: <>Easy to Use, - imageUrl: 'img/undraw_docusaurus_mountain.svg', + imageUrl: "img/undraw_docusaurus_mountain.svg", description: ( <> Docusaurus was designed from the ground up to be easily installed and used to get your website up and running quickly. - ), + ) }, { title: <>Focus on What Matters, - imageUrl: 'img/undraw_docusaurus_tree.svg', + imageUrl: "img/undraw_docusaurus_tree.svg", description: ( <> Docusaurus lets you focus on your docs, and we'll do the chores. Go ahead and move your docs into the docs directory. - ), + ) }, { title: <>Powered by React, - imageUrl: 'img/undraw_docusaurus_react.svg', + imageUrl: "img/undraw_docusaurus_react.svg", description: ( <> Extend or customize your website layout by reusing React. Docusaurus can be extended while reusing the same header and footer. - ), - }, + ) + } ]; -function Feature({imageUrl, title, description}) { +function Feature({ imageUrl, title, description }) { const imgUrl = useBaseUrl(imageUrl); return ( -
+
{imgUrl && (
{title} @@ -56,22 +56,24 @@ function Feature({imageUrl, title, description}) { function Home() { const context = useDocusaurusContext(); - const {siteConfig = {}} = context; + const { siteConfig = {} } = context; return ( -
+ description="Description will go into a meta tag in " + > +

{siteConfig.title}

{siteConfig.tagline}

+ to={useBaseUrl("guide/getting-started")} + > Get Started