diff --git a/.gitignore b/.gitignore index 9f39915..8e025b0 100644 --- a/.gitignore +++ b/.gitignore @@ -4,5 +4,14 @@ .~lock.* output/* AspectedRouting.sln.DotSettings -AspectedRouting.sln.DotSettings.user -.DS_Store \ No newline at end of file + +#Visual Studio Code +.vscode + +# Node Modules +*/node_modules + +.fake +.ionide + +*/.routeExamples \ No newline at end of file diff --git a/AspectedRouting.Test/AspectedRouting.Test.csproj b/AspectedRouting.Test/AspectedRouting.Test.csproj index 7c88b82..0347b72 100644 --- a/AspectedRouting.Test/AspectedRouting.Test.csproj +++ b/AspectedRouting.Test/AspectedRouting.Test.csproj @@ -1,7 +1,7 @@  - net6.0 + net5.0 false diff --git a/AspectedRouting.Test/FunctionsTest.cs b/AspectedRouting.Test/FunctionsTest.cs index 0aaebfa..f581623 100644 --- a/AspectedRouting.Test/FunctionsTest.cs +++ b/AspectedRouting.Test/FunctionsTest.cs @@ -1,4 +1,3 @@ -using System; using System.Collections.Generic; using System.Linq; using AspectedRouting.IO.jsonParser; @@ -8,472 +7,379 @@ using AspectedRouting.Language.Functions; using AspectedRouting.Language.Typ; using Xunit; -namespace AspectedRouting.Test; - -public class FunctionsTest +namespace AspectedRouting.Test { - private readonly string constString = "{\"$const\": \"a\"}"; - - private readonly string IfDottedConditionJson - = "{" + - "\"$ifdotted\": {\"$eq\": \"yes\"}," + - "\"then\":{\"$const\": \"a\"}," + - "\"else\": {\"$const\": \"b\"}" + - "}"; - - private readonly string IfSimpleConditionJson - = "{" + - "\"$if\": true," + - "\"then\":\"thenResult\"," + - "\"else\": \"elseResult\"}"; - - private IExpression MustMatchJson() + public class FunctionsTest { - var json = "{" + - "\"name\":\"test\"," + - "\"description\":\"test\"," + - "\"$mustMatch\":{\"a\":\"b\",\"x\":\"y\"}}"; - return JsonParser.AspectFromJson(new Context(), json, "test.json"); - } - - private IExpression MustMatchJsonWithOr() - { - var json = "{" + - "\"name\":\"test\"," + - "\"description\":\"test\"," + - "\"$mustMatch\":{\"a\":\"b\",\"x\":\"y\"}}"; - return JsonParser.AspectFromJson(new Context(), json, "test.json"); - } - - [Fact] - public void TestAll_AllTags_Yes() - { - var tagsAx = new Dictionary + private IExpression MustMatchJson() { - { "a", "b" }, - { "x", "y" } - }; + var json = "{" + + "\"name\":\"test\"," + + "\"description\":\"test\"," + + "\"$mustMatch\":{\"a\":\"b\",\"x\":\"y\"}}"; + return JsonParser.AspectFromJson(new Context(), json, "test.json"); + } - var expr = new Apply(MustMatchJson(), new Constant(tagsAx)).Optimize(out _); - var result = expr.Evaluate(new Context()); - Assert.Equal("yes", result); - } - - [Fact] - public void TestAll_NoMatch_No() - { - var tagsAx = new Dictionary + private IExpression MustMatchJsonWithOr() { - { "a", "b" } - }; + var json = "{" + + "\"name\":\"test\"," + + "\"description\":\"test\"," + + "\"$mustMatch\":{\"a\":\"b\",\"x\":\"y\"}}"; + return JsonParser.AspectFromJson(new Context(), json, "test.json"); + } - var expr = new Apply(MustMatchJson(), new Constant(tagsAx)).Optimize(out var _); - var result = expr.Evaluate(new Context()); - Assert.Equal("no", result); - } - - [Fact] - public void TestAll_NoMatchDifferent_No() - { - var tagsAx = new Dictionary + [Fact] + public void TestAll_AllTags_Yes() { - { "a", "b" }, - { "x", "someRandomValue" } - }; + var tagsAx = new Dictionary + { + {"a", "b"}, + {"x", "y"} + }; - var expr = new Apply(MustMatchJson(), new Constant(tagsAx)).Optimize(out _); - var result = expr.Evaluate(new Context()); - Assert.Equal("no", result); - } + var expr = new Apply(MustMatchJson(), new Constant(tagsAx)).Optimize(); + var result = expr.Evaluate(new Context()); + Assert.Equal("yes", result); + } - [Fact] - public void TestParsing_SimpleIf_CorrectExpression() - { - var c = new Context(); - var ifExpr = JsonParser.ParseExpression(c, IfSimpleConditionJson); - - Assert.Single(ifExpr.Types); - Assert.Equal(ifExpr.Types.First(), Typs.String); - - var resultT = ifExpr.Evaluate(c); - Assert.Equal("thenResult", resultT); - resultT = ifExpr.Optimize(out _).Evaluate(c); - Assert.Equal("thenResult", resultT); - } - - [Fact] - public void TestEvaluate_DottedIf_CorrectExpression() - { - var ifExpr = Funcs.IfDotted.Apply( - Funcs.Eq.Apply(new Constant("abc")), - Funcs.Const.Apply(new Constant("a")), - Funcs.Const.Apply(new Constant("b")) - ); - - var c = new Context(); - var ifResultMatch = ifExpr.Evaluate(c, new Constant("abc")); - Assert.Equal("a", ifResultMatch); - - var ifResultNoMatch = ifExpr.Evaluate(c, new Constant("def")); - Assert.Equal("b", ifResultNoMatch); - } - - [Fact] - public void TestParsing_DottedIf_CorrectExpression() - { - var c = new Context(); - var ifExpr = JsonParser.ParseExpression(c, IfDottedConditionJson); - ifExpr = ifExpr.Optimize(out _); - var resultT = ifExpr.Evaluate(c, - new Constant(Typs.String, "yes")); - var resultF = ifExpr.Evaluate(c, - new Constant(Typs.String, "no")); - Assert.Equal("a", resultT); - Assert.Equal("b", resultF); - } - - [Fact] - public void Parse_ConstString_TypeIsFree() - { - var e = JsonParser.ParseExpression(new Context(), constString); - Assert.Single(e.Types); - Assert.Equal(new Curry(new Var("d"), Typs.String), e.Types.First()); - } - - - [Fact] - public void TypeInference_EitherIdConstConst_CorrectType() - { - /* - * id : a -> a - * dot: (b -> c) -> (a -> b) -> a -> c - * const - throw away b: a -> b -> a - * eitherFunc: (a -> b) -> (c -> d) -> (a -> b) - * eitherFunc: (a -> b) -> (c -> d) -> (c -> d) - - * - * All with free vars: - * id: a -> a - * dot: (b -> c) -> (x -> b) -> x -> c - * const: y -> z -> y - * eitherfunc: (d -> e) -> (f -> g) -> (d -> e) - * (d -> e) -> (f -> g) -> (f -> g) - */ - - /* - * (((eitherfunc id) dot) const) - * - * (eitherfunc id) - * [(d -> e) -> (f -> g) -> (d -> e)] (a -> a) - * [(d -> e) -> (f -> g) -> (f -> g)] (a -> a) - * - * Gives: - * d ~ a - * e ~ a - * thus: - * (f -> g) -> (a -> a) - * (f -> g) -> (f -> g) - * - * ((eitherfunc id) dot) - * [(f -> g) -> (a -> a)] ((b -> c) -> (x -> b) -> x -> c) - * [(f -> g) -> (f -> g)] (b -> c) -> (x -> b) -> (x -> c) - * - * Thus: (f -> g) ~ (b -> c) -> ((x -> b) -> x -> c) - * thus: f ~ (b -> c) - * g ~ ((x -> b) -> (x -> c)) - * thus: - * (a -> a) - * (b -> c) -> ((x -> b) -> (x -> c)) - * - * - * - * (((eitherfunc id) dot) const): - * [(a -> a)] (y -> (z -> y)) - * [(b -> c) -> ((x -> b) -> (x -> c))] (y -> (z -> y)) - * - * Thus: case 1: - * a ~ (y -> (z -> y) - * Type is: (y -> z -> y) === typeof(const) - * case2: - * (b -> c) ~ (y -> (z -> y)) - * thus: b ~ y - * c ~ (z -> y) - * ((x -> y) -> (x -> (z -> y)))) - * = ((x -> y) -> x -> z -> y === mix of dot and const - * - */ - - var a = new Var("a"); - var c = new Var("c"); - var d = new Var("d"); - - - var e = Funcs.Either(Funcs.Id, Funcs.Dot, Funcs.Const); - var types = e.Types.ToList(); - Assert.Equal(Curry.ConstructFrom(c, c, d), types[0]); - Assert.Equal(Curry.ConstructFrom( - c, // RESULT TYPE - new Curry(a, c), - a, d - ), types[1]); - } - - - [Fact] - public void RenameVars_Constant_ConstantType() - { - // Funcs.Const.RenameVars(noUse: ["a","b","d","e","f"] should give something like 'c -> g -> c' - var a = new Var("a"); - var b = new Var("b"); - - var c = new Var("c"); - var d = new Var("d"); - - var e = new Var("e"); - var f = new Var("f"); - var newTypes = Funcs.Const.Types.RenameVars(new[] + [Fact] + public void TestAll_NoMatch_No() { - new Curry(e, e), - new Curry(new Curry(b, f), new Curry(new Curry(a, b), new Curry(a, f))) - }).ToList(); - Assert.Single(newTypes); - Assert.Equal(new Curry(c, new Curry(d, c)), - newTypes[0]); - } + var tagsAx = new Dictionary + { + {"a", "b"}, + }; - [Fact] - public void BuildSubstitution_TagsToStringTagsToBool_ShouldUnify() - { - var biggerType = new Curry(Typs.Tags, Typs.String); - var smallerType = new Curry(Typs.Tags, Typs.Bool); - // The expected type (biggerType) on the left, the argument type on the right (as it should be) - var unificationTable = biggerType.UnificationTable(smallerType); - Assert.NotNull(unificationTable); - unificationTable = smallerType.UnificationTable(biggerType); - Assert.Null(unificationTable); - } + var expr = new Apply(MustMatchJson(), new Constant(tagsAx)).Optimize(); + var result = expr.Evaluate(new Context()); + Assert.Equal("no", result); + } - [Fact] - public void BuildSubstitution_TagsToDoubleTagsToPDouble_ShouldUnify() - { - var biggerType = new Curry(Typs.Tags, Typs.Double); - var smallerType = new Curry(Typs.Tags, Typs.PDouble); - var unificationTable = biggerType.UnificationTable(smallerType); - Assert.NotNull(unificationTable); - unificationTable = smallerType.UnificationTable(biggerType); - Assert.Null(unificationTable); - } - - [Fact] - public void BuildSubstitution_DoubleToStringPDoubleToString_ShouldUnify() - { - var biggerType = new Curry(Typs.PDouble, Typs.Bool); - var smallerType = new Curry(Typs.Double, Typs.Bool); - // We expect something that is able to handle PDoubles, but it is able to handle the wider doubles - should be fine - var unificationTable = biggerType.UnificationTable(smallerType); - Assert.NotNull(unificationTable); - unificationTable = smallerType.UnificationTable(biggerType); - Assert.Null(unificationTable); - } - - [Fact] - public void Typechecker_EitherFunc_CorrectType() - { - var id = new Apply(Funcs.EitherFunc, Funcs.Id); - Assert.Equal(2, id.Types.Count()); - - var idconst = new Apply(id, Funcs.Const); - Assert.Equal(2, idconst.Types.Count()); - - var e = - new Apply(idconst, new Constant("a")); - Assert.Equal(2, e.Types.Count()); - } - - [Fact] - public void SpecializeToSmallest_Parse_SmallestType() - { - var smallest = Funcs.Parse.SpecializeToSmallestType(); - Assert.Single(smallest.Types); - Assert.Equal(new Curry(Typs.String, Typs.PDouble), smallest.Types.First()); - } - - [Fact] - public void Unify_TwoSubtypes_DoesNotUnify() - { - var tags2double = new Curry(Typs.Tags, Typs.Double); - var tags2pdouble = new Curry(Typs.Tags, Typs.PDouble); - var unifA = tags2double.Unify(tags2pdouble, true); - Assert.Null(unifA); - var unifB = tags2pdouble.Unify(tags2double, true); - Assert.NotNull(unifB); - - var unifC = tags2double.Unify(tags2pdouble); - Assert.NotNull(unifC); - var unifD = tags2pdouble.Unify(tags2double); - Assert.Null(unifD); - } - - - [Fact] - public void Specialize_WiderType_StillSmallerType() - { - var f = Funcs.Eq; - var strstrb = new Curry( - Typs.String, - new Curry(Typs.String, Typs.Bool)); - var f0 = f.Specialize(strstrb); - Assert.Equal(new[] { strstrb }, f0.Types); - - var strstrstr = new Curry( - Typs.String, - new Curry(Typs.String, Typs.String)); - - var f1 = f.Specialize(strstrstr); - - Assert.Equal(new[] { strstrb, strstrstr }, f1.Types); - } - - [Fact] - public void SpecializeToCommonType() - { - var p0 = Funcs.Parse.Specialize(new Curry(Typs.String, Typs.PDouble)); - var p1 = Funcs.Const.Apply(new Constant(1.0)).Specialize( - new Curry(new Var("a"), Typs.Double)); - - var exprs = new[] { p0, p1 }; - var newTypes = exprs.SpecializeToCommonTypes(out var _); - Assert.Single(newTypes); - - exprs = new[] { p1, p0 }; - newTypes = exprs.SpecializeToCommonTypes(out var _); - Assert.Single(newTypes); - } - - - [Fact] - public void ParseFunction_InvalidInput_NullOutput() - { - var f = Funcs.Parse; - var c = new Context(); - var result = f.Evaluate(c, new Constant("abc")); - - Assert.Null(result); - } - - [Fact] - public void ParseFunction_Duration_TotalMinutes() - { - var f = Funcs.Parse; - var c = new Context(); - var result = f.Evaluate(c, new Constant("01:15")); - - Assert.Equal(75.0, result); - } - - [Fact] - public void ApplyDefaultFunctionWithId_ApplicationIsSuccessfull() - { - var e = new Apply(new Apply(Funcs.Default, new Constant("a")), Funcs.Id); - Assert.Single(e.Types); - - Assert.Equal("string -> string", e.Types.First().ToString()); - } - - [Fact] - public void ApplyFirstMatchOf_FirstMatchIsTaken_50() - { - var tags0 = new Constant(new Dictionary + [Fact] + public void TestAll_NoMatchDifferent_No() { - { "highway", "residential" }, - { "maxspeed", "50" } - }); + var tagsAx = new Dictionary + { + {"a", "b"}, + {"x", "someRandomValue"} + }; - var f = FirstMatchOfWithMaxspeedAndHighway(); - var o = f.Evaluate(new Context(), tags0); - Assert.Equal(50.0, o); - } + var expr = new Apply(MustMatchJson(), new Constant(tagsAx)).Optimize(); + var result = expr.Evaluate(new Context()); + Assert.Equal("no", result); + } + private string IfDottedConditionJson + = "{" + + "\"$ifdotted\": {\"$eq\": \"yes\"}," + + "\"then\":{\"$const\": \"a\"}," + + "\"else\": {\"$const\": \"b\"}" + + "}"; - [Fact] - public void ApplyFirstMatchOf_FirstMatchIsTaken_ResidentialDefault() - { - var tags0 = new Constant(new Dictionary + private string IfSimpleConditionJson + = "{" + + "\"$if\": true," + + "\"then\":\"thenResult\"," + + "\"else\": \"elseResult\"}"; + + [Fact] + public void TestParsing_SimpleIf_CorrectExpression() { - { "highway", "residential" } - }); + var c = new Context(); + var ifExpr = JsonParser.ParseExpression(c, IfSimpleConditionJson); - var f = FirstMatchOfWithMaxspeedAndHighway(); - var o = f.Evaluate(new Context(), tags0); - Assert.Equal(30, o); - } + Assert.Single(ifExpr.Types); + Assert.Equal(ifExpr.Types.First(), Typs.String); - [Fact] - public void ApplyFirstMatchOf_NoMatchIfFound_Null() - { - var tags0 = new Constant(new Dictionary + var resultT = ifExpr.Evaluate(c); + Assert.Equal("thenResult", resultT); + resultT = ifExpr.Optimize().Evaluate(c); + Assert.Equal("thenResult", resultT); + } + + [Fact] + public void TestEvaluate_DottedIf_CorrectExpression() { - { "highway", "unknown" } - }); - - var f = FirstMatchOfWithMaxspeedAndHighway(); - var o = f.Evaluate(new Context(), tags0); - Assert.Equal(null, o); - } - - public IExpression FirstMatchOfWithMaxspeedAndHighway() - { - var order = new Constant(new ListType(Typs.String), new List - { - new Constant("maxspeed"), - new Constant("highway") - }); - - var mapping = - Funcs.StringStringToTags.Apply( - new Mapping( - new List { "maxspeed", "highway" }, - new List - { - Funcs.Parse, - new Mapping( - new List { "residential", "primary" }, - new List { new Constant(30), new Constant(90) } - ) - }) + var ifExpr = Funcs.IfDotted.Apply( + Funcs.Eq.Apply(new Constant("abc")), + Funcs.Const.Apply(new Constant("a")), + Funcs.Const.Apply(new Constant("b")) ); - return Funcs.FirstOf.Apply(order, mapping); + + var c = new Context(); + var ifResultMatch = ifExpr.Evaluate(c, new Constant("abc")); + Assert.Equal("a", ifResultMatch); + + var ifResultNoMatch = ifExpr.Evaluate(c, new Constant("def")); + Assert.Equal("b", ifResultNoMatch); + } + + [Fact] + public void TestParsing_DottedIf_CorrectExpression() + { + var c = new Context(); + var ifExpr = JsonParser.ParseExpression(c, IfDottedConditionJson); + ifExpr = ifExpr.Optimize(); + var resultT = ifExpr.Evaluate(c, + new Constant(Typs.String, "yes")); + var resultF = ifExpr.Evaluate(c, + new Constant(Typs.String, "no")); + Assert.Equal("a", resultT); + Assert.Equal("b", resultF); + } + + + private string constString = "{\"$const\": \"a\"}"; + + [Fact] + public void Parse_ConstString_TypeIsFree() + { + var e = JsonParser.ParseExpression(new Context(), constString); + Assert.Single(e.Types); + Assert.Equal(new Curry(new Var("d"), Typs.String), e.Types.First()); + } + + + [Fact] + public void TypeInference_EitherIdConstConst_CorrectType() + { + /* + * id : a -> a + * dot: (b -> c) -> (a -> b) -> a -> c + * const - throw away b: a -> b -> a + * eitherFunc: (a -> b) -> (c -> d) -> (a -> b) + * eitherFunc: (a -> b) -> (c -> d) -> (c -> d) + + * + * All with free vars: + * id: a -> a + * dot: (b -> c) -> (x -> b) -> x -> c + * const: y -> z -> y + * eitherfunc: (d -> e) -> (f -> g) -> (d -> e) + * (d -> e) -> (f -> g) -> (f -> g) + */ + + /* + * (((eitherfunc id) dot) const) + * + * (eitherfunc id) + * [(d -> e) -> (f -> g) -> (d -> e)] (a -> a) + * [(d -> e) -> (f -> g) -> (f -> g)] (a -> a) + * + * Gives: + * d ~ a + * e ~ a + * thus: + * (f -> g) -> (a -> a) + * (f -> g) -> (f -> g) + * + * ((eitherfunc id) dot) + * [(f -> g) -> (a -> a)] ((b -> c) -> (x -> b) -> x -> c) + * [(f -> g) -> (f -> g)] (b -> c) -> (x -> b) -> (x -> c) + * + * Thus: (f -> g) ~ (b -> c) -> ((x -> b) -> x -> c) + * thus: f ~ (b -> c) + * g ~ ((x -> b) -> (x -> c)) + * thus: + * (a -> a) + * (b -> c) -> ((x -> b) -> (x -> c)) + * + * + * + * (((eitherfunc id) dot) const): + * [(a -> a)] (y -> (z -> y)) + * [(b -> c) -> ((x -> b) -> (x -> c))] (y -> (z -> y)) + * + * Thus: case 1: + * a ~ (y -> (z -> y) + * Type is: (y -> z -> y) === typeof(const) + * case2: + * (b -> c) ~ (y -> (z -> y)) + * thus: b ~ y + * c ~ (z -> y) + * ((x -> y) -> (x -> (z -> y)))) + * = ((x -> y) -> x -> z -> y === mix of dot and const + * + */ + + var a = new Var("a"); + var c = new Var("c"); + var d = new Var("d"); + + + var e = Funcs.Either(Funcs.Id, Funcs.Dot, Funcs.Const); + var types = e.Types.ToList(); + Assert.Equal(Curry.ConstructFrom(c, c, d), types[0]); + Assert.Equal(Curry.ConstructFrom( + c, // RESULT TYPE + new Curry(a, c), + a, d + ), types[1]); + } + + + [Fact] + public void RenameVars_Constant_ConstantType() + { + // Funcs.Const.RenameVars(noUse: ["a","b","d","e","f"] should give something like 'c -> g -> c' + var a = new Var("a"); + var b = new Var("b"); + + var c = new Var("c"); + var d = new Var("d"); + + var e = new Var("e"); + var f = new Var("f"); + var newTypes = Funcs.Const.Types.RenameVars(new[] + { + new Curry(e, e), + new Curry(new Curry(b, f), new Curry(new Curry(a, b), new Curry(a, f))) + }).ToList(); + Assert.Single(newTypes); + Assert.Equal(new Curry(c, new Curry(d, c)), + newTypes[0]); + } + + [Fact] + public void BuildSubstitution_TagsToStringTagsToBool_ShouldUnify() + { + var biggerType = new Curry(Typs.Tags, Typs.String); + var smallerType = new Curry(Typs.Tags, Typs.Bool); + // The expected type (biggerType) on the left, the argument type on the right (as it should be) + var unificationTable = biggerType.UnificationTable(smallerType); + Assert.NotNull(unificationTable); + unificationTable = smallerType.UnificationTable(biggerType); + Assert.Null(unificationTable); + } + + [Fact] + public void BuildSubstitution_TagsToDoubleTagsToPDouble_ShouldUnify() + { + var biggerType = new Curry(Typs.Tags, Typs.Double); + var smallerType = new Curry(Typs.Tags, Typs.PDouble); + var unificationTable = biggerType.UnificationTable(smallerType); + Assert.NotNull(unificationTable); + unificationTable = smallerType.UnificationTable(biggerType); + Assert.Null(unificationTable); + } + + [Fact] + public void BuildSubstitution_DoubleToStringPDoubleToString_ShouldUnify() + { + var biggerType = new Curry(Typs.PDouble, Typs.Bool); + var smallerType = new Curry(Typs.Double, Typs.Bool); + // We expect something that is able to handle PDoubles, but it is able to handle the wider doubles - should be fine + var unificationTable = biggerType.UnificationTable(smallerType); + Assert.NotNull(unificationTable); + unificationTable = smallerType.UnificationTable(biggerType); + Assert.Null(unificationTable); + } + + [Fact] + public void Typechecker_EitherFunc_CorrectType() + { + var id = new Apply(Funcs.EitherFunc, Funcs.Id); + Assert.Equal(2, id.Types.Count()); + + var idconst = new Apply(id, Funcs.Const); + Assert.Equal(2, idconst.Types.Count()); + + var e = + new Apply(idconst, new Constant("a")); + Assert.Equal(2, e.Types.Count()); + } + + [Fact] + public void SpecializeToSmallest_Parse_SmallestType() + { + var smallest = Funcs.Parse.SpecializeToSmallestType(); + Assert.Single(smallest.Types); + Assert.Equal(new Curry(Typs.String, Typs.PDouble), smallest.Types.First()); + } + + [Fact] + public void Unify_TwoSubtypes_DoesNotUnify() + { + var tags2double = new Curry(Typs.Tags, Typs.Double); + var tags2pdouble = new Curry(Typs.Tags, Typs.PDouble); + var unifA = tags2double.Unify(tags2pdouble, true); + Assert.Null(unifA); + var unifB = tags2pdouble.Unify(tags2double, true); + Assert.NotNull(unifB); + + var unifC = tags2double.Unify(tags2pdouble, false); + Assert.NotNull(unifC); + var unifD = tags2pdouble.Unify(tags2double, false); + Assert.Null(unifD); + } + + + [Fact] + public void Specialize_WiderType_StillSmallerType() + { + var f = Funcs.Eq; + var strstrb = new Curry( + Typs.String, + new Curry(Typs.String, Typs.Bool)); + var f0 = f.Specialize(strstrb); + Assert.Equal(new[] {strstrb}, f0.Types); + + var strstrstr = new Curry( + Typs.String, + new Curry(Typs.String, Typs.String)); + + var f1 = f.Specialize(strstrstr); + + Assert.Equal(new[] {strstrb, strstrstr}, f1.Types); + } + + [Fact] + public void SpecializeToCommonType() + { + var p0 = Funcs.Parse.Specialize(new Curry(Typs.String, Typs.PDouble)); + var p1 = Funcs.Const.Apply(new Constant(1.0)).Specialize( + new Curry(new Var("a"), Typs.Double)); + + var exprs = new[] {p0, p1}; + var newTypes = exprs.SpecializeToCommonTypes(out var _); + Assert.Single(newTypes); + + exprs = new[] {p1, p0}; + newTypes = exprs.SpecializeToCommonTypes(out var _); + Assert.Single(newTypes); + } + + + [Fact] + public void ParseFunction_InvalidInput_NullOutput() + { + var f = Funcs.Parse; + var c = new Context(); + var result = f.Evaluate(c, new Constant("abc")); + + Assert.Null(result); + } + + [Fact] + public void ParseFunction_Duration_TotalMinutes() + { + var f = Funcs.Parse; + var c = new Context(); + var result = f.Evaluate(c, new Constant("01:15")); + + Assert.Equal(75.0, result); + } + + [Fact] + public void ApplyDefaultFunctionWithId_ApplicationIsSuccessfull() + { + var e = new Apply(new Apply(Funcs.Default, new Constant("a")), Funcs.Id); + Assert.Single(e.Types); + + Assert.Equal("string -> string", e.Types.First().ToString()); + + } + } - - [Fact] - /** - * Regression test for a misbehaving ifDotted - */ - public void IfDotted_CorrectExpression() - { - var e = Funcs.IfDotted.Apply( - Funcs.Const.Apply(new Parameter("follow_restrictions")), - Funcs.Head.Apply( Funcs.StringStringToTags.Apply( new Mapping(new[] { "oneway" }, new[] { Funcs.Id }))), - Funcs.Const.Apply(new Constant("dont-care")) - ); - - var c = new Context(); - c.AddParameter("follow_restrictions", "yes"); - - var tags = new Dictionary(); - tags["oneway"] = "with"; - - var r = e.Evaluate(c, new Constant(tags)); - Assert.Equal("with", r); - - var c0 = new Context(); - c0.AddParameter("follow_restrictions", "no"); - - - var r0 = e.Evaluate(c0, new Constant(tags)); - Assert.Equal("dont-care", r0); - - - } - } \ No newline at end of file diff --git a/AspectedRouting.Test/LuaPrinterTest.cs b/AspectedRouting.Test/LuaPrinterTest.cs index 39b1774..940b9f3 100644 --- a/AspectedRouting.Test/LuaPrinterTest.cs +++ b/AspectedRouting.Test/LuaPrinterTest.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using AspectedRouting.IO.itinero1; using AspectedRouting.IO.LuaSkeleton; using AspectedRouting.Language; using AspectedRouting.Language.Functions; @@ -12,11 +13,12 @@ namespace AspectedRouting.Test public void ToLua_SimpleMapping_Table() { var mapping = new Mapping( - new[] { "a", "b", "c" }, - new[] { + new[] {"a", "b", "c"}, + new[] + { new Constant(5), new Constant(6), - new Constant(7) + new Constant(7), } ); @@ -32,11 +34,13 @@ namespace AspectedRouting.Test public void ToLua_NestedMapping_Table() { var mapping = new Mapping( - new[] { "a" }, - new[] { - new Mapping(new[] { "b" }, - new[] { - new Constant(42) + new[] {"a"}, + new[] + { + new Mapping(new[] {"b"}, + new[] + { + new Constant(42), } ) } @@ -50,8 +54,10 @@ namespace AspectedRouting.Test public void Sanity_EveryBasicFunction_HasDescription() { var missing = new List(); - foreach (var (_, f) in Funcs.Builtins) { - if (string.IsNullOrEmpty(f.Description)) { + foreach (var (_, f) in Funcs.Builtins) + { + if (string.IsNullOrEmpty(f.Description)) + { missing.Add(f.Name); } } @@ -59,13 +65,15 @@ namespace AspectedRouting.Test Assert.True(0 == missing.Count, "These functions do not have a description: " + string.Join(", ", missing)); } - + [Fact] public void Sanity_EveryBasicFunction_HasArgNames() { var missing = new List(); - foreach (var (_, f) in Funcs.Builtins) { - if (f.ArgNames == null) { + foreach (var (_, f) in Funcs.Builtins) + { + if (f.ArgNames == null) + { missing.Add(f.Name); } } diff --git a/AspectedRouting.Test/MappingTest.cs b/AspectedRouting.Test/MappingTest.cs index 21a07c9..df92b98 100644 --- a/AspectedRouting.Test/MappingTest.cs +++ b/AspectedRouting.Test/MappingTest.cs @@ -9,18 +9,18 @@ namespace AspectedRouting.Test [Fact] public static void SimpleMapping_SimpleHighway_GivesResult() { - var maxspeed = new Mapping(new[] { "residential", "living_street" }, + var maxspeed = new Mapping(new[] {"residential", "living_street"}, new[] { new Constant(30), new Constant(20) } ); - var resMaxspeed = maxspeed.Evaluate(new Context(), new Constant("residential")); - Assert.Equal(30, resMaxspeed); - var livingStreetMaxspeed = maxspeed.Evaluate(new Context(), new Constant("living_street")); - Assert.Equal(20, livingStreetMaxspeed); - var undefinedSpeed = maxspeed.Evaluate(new Context(), new Constant("some_unknown_highway_type")); - Assert.Null(undefinedSpeed); + var resMaxspeed= maxspeed.Evaluate(new Context(), new Constant("residential")); + Assert.Equal(30, resMaxspeed); + var livingStreetMaxspeed= maxspeed.Evaluate(new Context(), new Constant("living_street")); + Assert.Equal(20, livingStreetMaxspeed); + var undefinedSpeed = maxspeed.Evaluate(new Context(), new Constant("some_unknown_highway_type")); + Assert.Null(undefinedSpeed); } } } \ No newline at end of file diff --git a/AspectedRouting.Test/MustMatchTest.cs b/AspectedRouting.Test/MustMatchTest.cs index 81a0d89..fce7ff4 100644 --- a/AspectedRouting.Test/MustMatchTest.cs +++ b/AspectedRouting.Test/MustMatchTest.cs @@ -10,37 +10,37 @@ namespace AspectedRouting.Test [Fact] public void MustMatch_SimpleInput() { - var mapValue = new Mapping(new[] { "residential", "living_street" }, + var mapValue = new Mapping(new[] {"residential", "living_street"}, new[] { new Constant("yes"), new Constant("no") }); - var mapTag = new Mapping(new[] { "highway" }, new[] { mapValue }); + var mapTag = new Mapping(new[] {"highway"}, new[] {mapValue}); var mm = Funcs.MustMatch .Apply( - new Constant(new[] { new Constant("highway") }), + new Constant(new[] {new Constant("highway")}), Funcs.StringStringToTags.Apply(mapTag) ) ; var residential = mm.Apply(new Constant(new Dictionary { - { "highway", "residential" } + {"highway", "residential"} })).Evaluate(new Context()); Assert.Equal("yes", residential); var living = mm.Apply(new Constant(new Dictionary { - { "highway", "living_street" } + {"highway", "living_street"} })).Evaluate(new Context()); Assert.Equal("no", living); var unknown = mm.Apply(new Constant(new Dictionary { - { "highway", "unknown_type" } + {"highway", "unknown_type"} })).Evaluate(new Context()); Assert.Equal("yes", unknown); var missing = mm.Apply(new Constant(new Dictionary { - { "proposed:highway", "unknown_type" } + {"proposed:highway", "unknown_type"} })).Evaluate(new Context()); Assert.Equal("no", missing); } diff --git a/AspectedRouting.Test/OptimizationsTests.cs b/AspectedRouting.Test/OptimizationsTests.cs deleted file mode 100644 index a348bf7..0000000 --- a/AspectedRouting.Test/OptimizationsTests.cs +++ /dev/null @@ -1,151 +0,0 @@ -using AspectedRouting.IO.LuaSkeleton; -using AspectedRouting.Language; -using AspectedRouting.Language.Expression; -using AspectedRouting.Language.Functions; -using AspectedRouting.Language.Typ; -using Xunit; - -namespace AspectedRouting.Test; - -public class OptimizationsTests -{ - [Fact] - public void AppliedListDot_Optimize_ListOfApplications() - { - var lit = new LuaLiteral(Typs.Nat, "tags"); - var e0 = Funcs.ListDot.Apply( - new Constant(new[] - { - Funcs.Eq.Apply(new Constant(5)), - Funcs.Eq.Apply(new Constant(42)) - })); - - var e = e0.Apply(lit).SpecializeToSmallestType(); - var x = e.Optimize(out var sc); - Assert.True(sc); - Assert.Equal( - new Constant(new[] - { - Funcs.Eq.Apply(new Constant(5)).Apply(lit), - Funcs.Eq.Apply(new Constant(42)).Apply(lit) - }).SpecializeToSmallestType().ToString(), x.ToString()); - } - - [Fact] - public void AdvancedApplied_Optimized_ListOfAppliedValues() - { - var legal_access_be = new FunctionCall("$legal_access_be", new Curry(Typs.Tags, Typs.String)); - var legal_access_pedestrian = new FunctionCall("$pedestrian.legal_access", new Curry(Typs.Tags, Typs.String)); - var tags = new LuaLiteral(Typs.Tags, "tags"); - var e = new Apply( // string - Funcs.Head, - new Apply( // list (string) - new Apply( // tags -> list (string) - Funcs.ListDot, - new Constant(new[] - { - legal_access_be, - legal_access_pedestrian - })), - tags)); - var eOpt = e.Optimize(out var sc); - Assert.True(sc); - Assert.Equal( - Funcs.Head.Apply(new Constant( - new[] - { - legal_access_be.Apply(tags), - legal_access_pedestrian.Apply(tags) - } - )).ToString(), - eOpt.ToString() - ); - } - - - [Fact] - public void advancedExpr_Optimize_Works() - { - var e = new Apply( // double - new Apply( // tags -> double - new Apply( // (tags -> double) -> tags -> doubleTag - Funcs.Default, - new Constant(0)), - new Apply( // tags -> double - new Apply( // (tags -> list (double)) -> tags -> double - Funcs.Dot, - Funcs.Head), - new Apply( // tags -> list (double) - Funcs.StringStringToTags, - new Mapping( - new[] - { - "access" - }, - new[] - { - new Mapping( - new[] - { - "private", - "destination", - "permissive" - }, - new[] - { - new Constant(-500), new Constant(-3), new Constant(-1) - } - ) - } - )))), - new LuaLiteral(Typs.Tags, "tags")); - var eOpt = e.Optimize(out var sc); - Assert.True(sc); - Assert.NotEmpty(eOpt.Types); - } - - [Fact] - public void optimizeListdotAway() - { - var tagsToStr = new Curry(Typs.Tags, Typs.PDouble); - var e = new Apply( // pdouble - new Apply( // tags -> pdouble - Funcs.Id, - new Apply( // tags -> pdouble - new Apply( // (tags -> list (pdouble)) -> tags -> pdouble - Funcs.Dot, - Funcs.Min), - new Apply( // tags -> list (pdouble) - Funcs.ListDot, - new Constant(new IExpression[] - { - new FunctionCall("$legal_maxspeed_be", tagsToStr), - new FunctionCall("$car.practical_max_speed", tagsToStr), - new Apply( // tags -> pdouble - Funcs.Const, - new Parameter("#maxspeed")) - })))), - new LuaLiteral(Typs.Tags, "tags")); - var opt = e.SpecializeToSmallestType().Optimize(out var sc); - Assert.True(sc); - - - } - - [Fact] - public void Regression_ShouldOptimize() - { - var e = new Apply( // nat - new Apply( // tags -> nat - new Apply( // nat -> tags -> nat - new Apply( // (nat -> tags -> nat) -> nat -> tags -> nat - Funcs.ConstRight, - Funcs.Id), - Funcs.Const), - new LuaLiteral(Typs.PDouble, "distance")), - new LuaLiteral(Typs.Tags, "tags")).SpecializeToSmallestType(); - var opt = e.Optimize(out var sc); - Assert.True(sc); - - } -} \ No newline at end of file diff --git a/AspectedRouting.Test/RegressionTest.cs b/AspectedRouting.Test/RegressionTest.cs deleted file mode 100644 index 60d3634..0000000 --- a/AspectedRouting.Test/RegressionTest.cs +++ /dev/null @@ -1,52 +0,0 @@ -using System.Collections; -using System.Collections.Generic; -using System.Text.Json; -using AspectedRouting.IO.jsonParser; -using AspectedRouting.Language; -using AspectedRouting.Language.Expression; -using AspectedRouting.Language.Functions; -using AspectedRouting.Language.Typ; -using Xunit; - -namespace AspectedRouting.Test; - -public class RegressionTest -{ - [Fact] - public void IfDotted_ShouldBeParsed() - { - var carOneway = Funcs.Const.Apply(new Constant("result of car.oneway")).Specialize(new Curry( - Typs.Tags, Typs.String)); - - var doc = JsonDocument.Parse("{\"oneway\":{\"$ifdotted\":{\"$const\": \"#follow_restrictions\"},\"then\": \"$car.oneway\",\"else\": {\"$const\": \"both-ignored-restrictions\"}}}"); - - var parsingContext = new Context(); - parsingContext .AddFunction("car.oneway", new AspectMetadata( - carOneway, "car.oneway","oneway function", "test", "with|against|both", - "N/A", false - )); - parsingContext.AddParameter("follow_restrictions","no"); - var aspect = JsonParser.ParseProfileProperty(doc.RootElement,parsingContext, "oneway"); - var oneway = new Dictionary(); - - var c = new Context(); - c .AddFunction("car.oneway", new AspectMetadata( - carOneway, "car.oneway","oneway function", "test", "with|against|both", - "N/A", false - )); - - c.AddParameter("follow_restrictions","yes"); - var result = aspect.Run(c, oneway); - Assert.Equal("result of car.oneway", result); - - var c0 = new Context(); - c0.AddFunction("car.oneway", new AspectMetadata( - carOneway, "car.oneway","oneway function", "test", "with|against|both", - "N/A", false - )); - c0.AddParameter("follow_restrictions","no"); - var result0 = aspect.Run(c0, oneway); - Assert.Equal("both-ignored-restrictions", result0); - - } -} \ No newline at end of file diff --git a/AspectedRouting.Test/Snippets/SnippetTests.cs b/AspectedRouting.Test/Snippets/SnippetTests.cs index a54eaaf..f0c2a10 100644 --- a/AspectedRouting.Test/Snippets/SnippetTests.cs +++ b/AspectedRouting.Test/Snippets/SnippetTests.cs @@ -1,4 +1,3 @@ -using System; using System.Collections.Generic; using AspectedRouting.IO.LuaSkeleton; using AspectedRouting.IO.LuaSnippets; @@ -8,113 +7,85 @@ using AspectedRouting.Language.Functions; using AspectedRouting.Language.Typ; using Xunit; -namespace AspectedRouting.Test.Snippets; - -public class SnippetTests +namespace AspectedRouting.Test.Snippets { - [Fact] - public void DefaultSnippet_SimpleDefault_GetsLua() + public class SnippetTests { - var gen = new DefaultSnippet(); - var lua = new LuaSkeleton(new Context(), true); - var code = gen.Convert(lua, "result", new List + [Fact] + public void DefaultSnippet_SimpleDefault_GetsLua() { - new Constant("the_default_value"), - Funcs.Id, - new Constant("value") - }); - Assert.Contains("if (result == nil) then\n result = \"the_default_value\"", code); - } + var gen = new DefaultSnippet(); + var lua = new LuaSkeleton(new Context(), true); + var code = gen.Convert(lua, "result", new List { + new Constant("the_default_value"), + Funcs.Id, + new Constant("value") + }); + Assert.Contains("if (result == nil) then\n result = \"the_default_value\"", code); + } - [Fact] - public void FirstOfSnippet_SimpleFirstOf_GetLua() - { - var gen = new FirstMatchOfSnippet(); - var lua = new LuaSkeleton(new Context(), true); - - // FirstMatchOf: [a] -> (Tags -> [a]) -> Tags -> a - - // Order: [string] - var order = new Constant(new List + [Fact] + public void FirstOfSnippet_SimpleFirstOf_GetLua() { - new Constant("bicycle"), - new Constant("access") - }); + var gen = new FirstMatchOfSnippet(); + var lua = new LuaSkeleton(new Context(), true); - // Func: (Tags -> [a]) - var func = new Apply( - Funcs.StringStringToTags, - new Mapping( - new[] { "bicycle", "access" }, - new IExpression[] - { - Funcs.Id, - Funcs.Id + // FirstMatchOf: [a] -> (Tags -> [a]) -> Tags -> a + + // Order: [string] + var order = new Constant(new List { + new Constant("bicycle"), + new Constant("access") + }); + + // Func: (Tags -> [a]) + var func = new Apply( + Funcs.StringStringToTags, + new Mapping( + new[] {"bicycle", "access"}, + new IExpression[] { + Funcs.Id, + Funcs.Id + } + ) + ); + + var tags = new LuaLiteral(new[] {Typs.Tags}, "tags"); + + var code = gen.Convert(lua, "result", + new List { + order, + func, + tags } - ) - ); - - var tags = new LuaLiteral(new[] { Typs.Tags }, "tags"); - - var code = gen.Convert(lua, "result", - new List - { - order, - func, - tags - } - ); - // First the more general ones! - Assert.Equal( - "if (tags[\"access\"] ~= nil) then\n result = tags[\"access\"]\n \nend\nif (tags[\"bicycle\"] ~= nil) then\n result = tags[\"bicycle\"]\n \nend\n", - code); - } + ); + // First the more general ones! + Assert.Equal( + "if (tags[\"access\"] ~= nil) then\n result = tags[\"access\"]\n \nend\nif (tags[\"bicycle\"] ~= nil) then\n result = tags[\"bicycle\"]\n \nend\n", + code); + } - [Fact] - public void SimpleMappingSnippet_SimpleMapping_GeneratesLua() - { - var mapping = new Mapping( - new[] { "1", "-1" }, - new IExpression[] - { - new Constant("with"), - new Constant("against") - } - ); - var gen = new SimpleMappingSnippet(mapping); - var code = gen.Convert(new LuaSkeleton(new Context(), true), "result", new List + [Fact] + public void SimpleMappingSnippet_SimpleMapping_GeneratesLua() { - new LuaLiteral(Typs.String, "tags.oneway") - }); + var mapping = new Mapping( + new[] {"1", "-1"}, + new IExpression[] { + new Constant("with"), + new Constant("against") + } + ); + var gen = new SimpleMappingSnippet(mapping); + var code = gen.Convert(new LuaSkeleton(new Context(), true), "result", new List { + new LuaLiteral(Typs.String, "tags.oneway") + }); - var expected = - "local v\nv = tags.oneway\n\nif (v == \"1\") then\n result = \"with\"\nelseif (v == \"-1\") then\n result = \"against\"\nend"; - Assert.Equal(expected, code); - } + var expected = + "local v\nv = tags.oneway\n\nif (v == \"1\") then\n result = \"with\"\nelseif (v == \"-1\") then\n result = \"against\"\nend"; + Assert.Equal(expected, code); + } - - [Fact] - public void ListDotWithHead_GeneratesLua() - { - // (dot head) (stringToTags (mapping speed $ parse)) - var eSub = Funcs.Dot.Apply(Funcs.Head, - new Constant(new[] - { - Funcs.Head.Apply(Funcs.StringStringToTags.Apply( - new Mapping(new List { "_speed" }, new[] { Funcs.Parse }))), - Funcs.Const.Apply(new Constant(Typs.Double, 42)) - }) - ); - var condition = Funcs.Dot.Apply(Funcs.Head, Funcs.StringStringToTags.Apply( - new Mapping(new[] { "route" }, new[] { Funcs.Eq.Apply(new Constant("ferry")) }))); - var e = - Funcs.IfDotted.Apply(condition, eSub); - e = e.Apply(new LuaLiteral(Typs.Tags, "tags")).Finalize().Optimize(out _); - var ctx = new Context(); - var lua = new LuaSkeleton(ctx, true); - var code = IO.LuaSnippets.Snippets.Convert(lua, "varname", e); - Console.WriteLine(code); } } \ No newline at end of file diff --git a/AspectedRouting.Test/TestInterpreter.cs b/AspectedRouting.Test/TestInterpreter.cs index d4cc4d0..6ff1f60 100644 --- a/AspectedRouting.Test/TestInterpreter.cs +++ b/AspectedRouting.Test/TestInterpreter.cs @@ -18,10 +18,11 @@ namespace AspectedRouting.Test "{\"name\": \"legal_maxspeed_be\",\"description\": \"Gives, for each type of highway, which the default legal maxspeed is in Belgium. This file is intended to be reused for in all vehicles, from pedestrian to car. In some cases, a legal maxspeed is not really defined (e.g. on footways). In that case, a socially acceptable speed should be taken (e.g.: a bicycle on a pedestrian path will go say around 12km/h)\",\"unit\": \"km/h\",\"$max\": {\"maxspeed\": \"$parse\",\"highway\": {\"residential\": 30},\"ferry\":5}}"; var aspect = JsonParser.AspectFromJson(null, json, null); - var tags = new Dictionary { - { "maxspeed", "42" }, - { "highway", "residential" }, - { "ferry", "yes" } + var tags = new Dictionary + { + {"maxspeed", "42"}, + {"highway", "residential"}, + {"ferry", "yes"} }; Assert.Equal("tags -> pdouble", string.Join(", ", aspect.Types)); @@ -39,10 +40,11 @@ namespace AspectedRouting.Test var aspect = JsonParser.AspectFromJson(null, json, null); Assert.Equal( - new Dictionary> { - { "maxspeed", new HashSet() }, - { "highway", new HashSet { "residential" } }, - { "ferry", new HashSet() } + new Dictionary> + { + {"maxspeed", new HashSet()}, + {"highway", new HashSet {"residential"}}, + {"ferry", new HashSet()} }, aspect.PossibleTags()); } @@ -77,7 +79,7 @@ namespace AspectedRouting.Test public void EitherFunc_SpecializeToString_Const() { var a = new Constant("a"); - + var mconst = new Apply(new Apply(Funcs.EitherFunc, Funcs.Id), Funcs.Const); var specialized = new Apply(mconst, a).Specialize(Typs.String); @@ -123,7 +125,7 @@ namespace AspectedRouting.Test public void MaxTest() { var ls = new Constant(new ListType(Typs.Double), - new[] { 1.1, 2.0, 3.0 }.Select(d => (object)d)); + new[] {1.1, 2.0, 3.0}.Select(d => (object) d)); Assert.Equal("[1.1, 2, 3] : list (double)", ls.Evaluate(null).Pretty() + " : " + string.Join(", ", ls.Types)); var mx = Funcs.Max.Apply(ls); @@ -162,7 +164,7 @@ namespace AspectedRouting.Test [Fact] public void TestStringGeneration() { - var v = Var.Fresh(new HashSet { "$a", "$b" }); + var v = Var.Fresh(new HashSet {"$a", "$b"}); Assert.Equal("$c", v.Name); } @@ -174,9 +176,9 @@ namespace AspectedRouting.Test var app = new Apply( new Apply( new Apply(Funcs.Id, Funcs.Id), Funcs.Id), a); - var (f, args) = app.DeconstructApply().Value; - Assert.Equal(Funcs.Id.Name, ((Function)f).Name); - Assert.Equal(new List { Funcs.Id, Funcs.Id, a }.Select(e => e.ToString()), + var (f, args ) = app.DeconstructApply().Value; + Assert.Equal(Funcs.Id.Name, ((Function) f).Name); + Assert.Equal(new List {Funcs.Id, Funcs.Id, a}.Select(e => e.ToString()), args.Select(e => e.ToString())); } diff --git a/AspectedRouting.Test/TypingTests.cs b/AspectedRouting.Test/TypingTests.cs index 9878126..c1f6a3f 100644 --- a/AspectedRouting.Test/TypingTests.cs +++ b/AspectedRouting.Test/TypingTests.cs @@ -52,8 +52,8 @@ namespace AspectedRouting.Test new Curry(Typs.Tags, Typs.Double), x ); } - - + + [Fact] public void WidestCommonGround_StringAndString_String() { diff --git a/AspectedRouting.sln.DotSettings.user b/AspectedRouting.sln.DotSettings.user new file mode 100644 index 0000000..3a4c3c8 --- /dev/null +++ b/AspectedRouting.sln.DotSettings.user @@ -0,0 +1,21 @@ + + <SessionState ContinuousTestingMode="0" Name="DefaultSnippet_SimpleDefault_GetsLua" xmlns="urn:schemas-jetbrains-com:jetbrains-ut-session"> + <TestAncestor> + <TestId>xUnit::A1309041-8AAE-42D7-A886-94C9FFC6A28C::.NETCoreApp,Version=v3.1::AspectedRouting.Test.Snippets.SnippetTests</TestId> + <TestId>xUnit::A1309041-8AAE-42D7-A886-94C9FFC6A28C::.NETCoreApp,Version=v3.1::AspectedRouting.Test.TypingTests.SpecializeToCommonTypes_X2PDouble_Y2Double_Gives_X2Double</TestId> + </TestAncestor> +</SessionState> + <SessionState ContinuousTestingMode="0" Name="JoinApply_Id" xmlns="urn:schemas-jetbrains-com:jetbrains-ut-session"> + <TestAncestor> + <TestId>xUnit::A1309041-8AAE-42D7-A886-94C9FFC6A28C::.NETCoreApp,Version=v3.1::AspectedRouting.Test.TypingTests.JoinApply_Id</TestId> + <TestId>xUnit::A1309041-8AAE-42D7-A886-94C9FFC6A28C::.NETCoreApp,Version=v3.1::AspectedRouting.Test.FunctionsTest.ApplyDefaultFunctionWithId_ApplicationIsSuccessfull</TestId> + </TestAncestor> +</SessionState> + + <SessionState ContinuousTestingMode="0" IsActive="True" Name="Integration_TestExamples" xmlns="urn:schemas-jetbrains-com:jetbrains-ut-session"> + <Project Location="/home/pietervdvn/git/AspectedRouting/AspectedRouting.Test" Presentation="&lt;AspectedRouting.Test&gt;" /> +</SessionState> + <SessionState ContinuousTestingMode="0" Name="SpecializeToCommonTypes_ValueAndFuncType_ShouldFail" xmlns="urn:schemas-jetbrains-com:jetbrains-ut-session"> + <Project Location="/home/pietervdvn/git/AspectedRouting/AspectedRouting.Test" Presentation="&lt;AspectedRouting.Test&gt;" /> +</SessionState> + \ No newline at end of file diff --git a/AspectedRouting/AspectedRouting.csproj b/AspectedRouting/AspectedRouting.csproj index 3d8420c..4e00b5b 100644 --- a/AspectedRouting/AspectedRouting.csproj +++ b/AspectedRouting/AspectedRouting.csproj @@ -2,7 +2,7 @@ Exe - net6.0 + net5.0 8 AspectedRouting AspectedRouting @@ -13,9 +13,6 @@ PreserveNewest - PreserveNewest - - PreserveNewest diff --git a/AspectedRouting/IO/LuaSkeleton/LuaLiteral.cs b/AspectedRouting/IO/LuaSkeleton/LuaLiteral.cs index 1a081b2..e36ccf0 100644 --- a/AspectedRouting/IO/LuaSkeleton/LuaLiteral.cs +++ b/AspectedRouting/IO/LuaSkeleton/LuaLiteral.cs @@ -2,7 +2,6 @@ using System; using System.Collections.Generic; using System.Linq; using AspectedRouting.Language; -using AspectedRouting.Language.Typ; using Type = AspectedRouting.Language.Typ.Type; namespace AspectedRouting.IO.LuaSkeleton @@ -10,17 +9,19 @@ namespace AspectedRouting.IO.LuaSkeleton public class LuaLiteral : IExpression { public readonly string Lua; + public IEnumerable Types { get; } - public LuaLiteral(Type type, string lua) : this(new[] { type }, lua) { } + public LuaLiteral(Type type, string lua):this(new [] {type}, lua) + { + + } public LuaLiteral(IEnumerable types, string lua) { Lua = lua; Types = types; } - - public IEnumerable Types { get; } - + public object Evaluate(Context c, params IExpression[] arguments) { throw new NotImplementedException(); @@ -31,46 +32,25 @@ namespace AspectedRouting.IO.LuaSkeleton return this; } - public IExpression PruneTypes(System.Func allowedTypes) + public IExpression PruneTypes(Func allowedTypes) { - var passed = Types.Where(allowedTypes); - if (passed.Any()) - { - return new LuaLiteral(passed, Lua); + var passed = this.Types.Where(allowedTypes); + if (passed.Any()) { + return new LuaLiteral(passed, this.Lua); } return null; } - public IExpression Optimize(out bool somethingChanged) + public IExpression Optimize() { - somethingChanged = false; - return this; + return this; } public void Visit(Func f) { - f(this); - } - - public bool Equals(IExpression other) - { - if (other is LuaLiteral ll) - { - return ll.Lua.Equals(this.Lua); - } - - return false; - } - - public string Repr() - { - if (this.Types.Count() == 1 && this.Types.First() == Typs.Tags) - { - return $"new LuaLiteral(Typs.Tags, \"{this.Lua}\")"; - } - - return $"new LuaLiteral(\"{this.Lua}\")"; + throw new NotImplementedException(); } + } } \ No newline at end of file diff --git a/AspectedRouting/IO/LuaSkeleton/LuaParameterPrinter.Parameters.cs b/AspectedRouting/IO/LuaSkeleton/LuaParameterPrinter.Parameters.cs index 9083e9a..7dfc538 100644 --- a/AspectedRouting/IO/LuaSkeleton/LuaParameterPrinter.Parameters.cs +++ b/AspectedRouting/IO/LuaSkeleton/LuaParameterPrinter.Parameters.cs @@ -6,8 +6,8 @@ namespace AspectedRouting.IO.itinero1 { public class LuaParameterPrinter { - private readonly ProfileMetaData _profile; - private readonly LuaSkeleton.LuaSkeleton _skeleton; + private ProfileMetaData _profile; + private LuaSkeleton.LuaSkeleton _skeleton; public LuaParameterPrinter(ProfileMetaData profile, LuaSkeleton.LuaSkeleton skeleton) { @@ -18,7 +18,8 @@ namespace AspectedRouting.IO.itinero1 public string GenerateDefaultParameters() { - var impl = new List { + var impl = new List() + { "function default_parameters()", " local parameters = {}", DeclareParametersFor(_profile.DefaultParameters), @@ -30,13 +31,18 @@ namespace AspectedRouting.IO.itinero1 } /// - /// Generates a piece of code of the following format: - /// parameters["x"] = a; - /// parameters["y"] = b: - /// ... - /// Where x=a and y=b are defined in the profile - /// Dependencies are added. - /// Note that the caller should still add `local paramaters = default_parameters()` + /// Generates a piece of code of the following format: + /// + /// parameters["x"] = a; + /// parameters["y"] = b: + /// ... + /// + /// Where x=a and y=b are defined in the profile + /// + /// Dependencies are added. + /// + /// Note that the caller should still add `local paramaters = default_parameters()` + /// /// /// /// diff --git a/AspectedRouting/IO/LuaSkeleton/LuaSkeleton.Expressions.cs b/AspectedRouting/IO/LuaSkeleton/LuaSkeleton.Expressions.cs index d8f09b0..87e46e7 100644 --- a/AspectedRouting/IO/LuaSkeleton/LuaSkeleton.Expressions.cs +++ b/AspectedRouting/IO/LuaSkeleton/LuaSkeleton.Expressions.cs @@ -1,7 +1,5 @@ using System; using System.Collections.Generic; -using System.Dynamic; -using System.Globalization; using System.Linq; using System.Text.RegularExpressions; using AspectedRouting.IO.itinero1; @@ -15,16 +13,6 @@ namespace AspectedRouting.IO.LuaSkeleton { public partial class LuaSkeleton { - - internal string ToLuaWithTags(IExpression bare) - { - if (bare == null) - { - throw new NullReferenceException("bare is null"); - } - var opt = bare.Apply(new LuaLiteral(Typs.Tags, "tags")).SpecializeToSmallestType().Optimize(out _); - return this.ToLua(opt); - } internal string ToLua(IExpression bare, string key = "nil", bool forceFirstArgInDot = false) { var collectedMapping = new List(); @@ -38,12 +26,11 @@ namespace AspectedRouting.IO.LuaSkeleton , UnApply( IsFunc(Funcs.StringStringToTags), Assign(collectedMapping)) - ).Invoke(bare)) - { + ).Invoke(bare)) { AddDep(Funcs.FirstOf.Name); return "first_match_of(\n" + " " + ToLua(order.First(), key) + ",\n" + - ("\n" + MappingToLua((Mapping)collectedMapping.First())).Indent().Indent() + + ("\n" + MappingToLua((Mapping) collectedMapping.First())).Indent().Indent() + ",\n tags, result)"; } @@ -54,48 +41,52 @@ namespace AspectedRouting.IO.LuaSkeleton , UnApply( IsFunc(Funcs.StringStringToTags), Assign(collectedMapping)) - ).Invoke(bare)) - { + ).Invoke(bare)) { AddDep(Funcs.MustMatch.Name); return "must_match(" + " " + ToLua(order.First(), key) + "," + - ("\n" + MappingToLua((Mapping)collectedMapping.First())).Indent().Indent() + + ("\n" + MappingToLua((Mapping) collectedMapping.First())).Indent().Indent() + ",\n tags, result)"; } if (UnApply( IsFunc(Funcs.MemberOf), Any - ).Invoke(bare)) - { + ).Invoke(bare)) { AddDep("memberOf"); return "memberOf(funcName, parameters, tags, result)"; } - { - var name = new List(); - var arg = new List(); - if (UnApply( - IsFunctionCall(name), - Assign(arg) - ).Invoke(bare)) - { - var called = _context.DefinedFunctions[name.First()]; - if (called.ProfileInternal) - { - return called.Name; + + var collectedList = new List(); + var func = new List(); + if ( + UnApply( + UnApply(IsFunc(Funcs.Dot), Assign(func)), + UnApply(IsFunc(Funcs.ListDot), + Assign(collectedList))).Invoke(bare)) { + var exprs = (IEnumerable) ((Constant) collectedList.First()).Evaluate(_context); + var luaExprs = new List(); + var funcName = func.First().ToString().TrimStart('$'); + AddDep(funcName); + foreach (var expr in exprs) { + var c = new List(); + if (UnApply(IsFunc(Funcs.Const), Assign(c)).Invoke(expr)) { + luaExprs.Add(ToLua(c.First(), key)); + continue; } - AddDependenciesFor(called); - AddFunction(called); - var usesParams = called.ExpressionImplementation.UsedParameters().Any(); - if (usesParams) - { - return $"{name.First().Replace(".", "_")}({ToLua(arg.First())}, parameters)"; + if (expr.Types.First() is Curry curry + && curry.ArgType.Equals(Typs.Tags)) { + var lua = ToLua(expr, key); + luaExprs.Add(lua); } - return $"{name.First().Replace(".", "_")}({ToLua(arg.First())})"; } + + return "\n " + funcName + "({\n " + string.Join(",\n ", luaExprs) + + "\n })"; } + collectedMapping.Clear(); var dottedFunction = new List(); dottedFunction.Clear(); @@ -107,10 +98,9 @@ namespace AspectedRouting.IO.LuaSkeleton UnApply( IsFunc(Funcs.StringStringToTags), Assign(collectedMapping))).Invoke(bare) - ) - { - var mapping = (Mapping)collectedMapping.First(); - var baseFunc = (Function)dottedFunction.First(); + ) { + var mapping = (Mapping) collectedMapping.First(); + var baseFunc = (Function) dottedFunction.First(); AddDep(baseFunc.Name); AddDep("table_to_list"); @@ -124,44 +114,32 @@ namespace AspectedRouting.IO.LuaSkeleton // The expression might be a function which still expects a string (the value from the tag) as argument if (!(bare is Mapping) && bare.Types.First() is Curry curr && - curr.ArgType.Equals(Typs.String)) - { + curr.ArgType.Equals(Typs.String)) { var applied = new Apply(bare, new Constant(curr.ArgType, ("tags", "\"" + key + "\""))); - return ToLua(applied.Optimize(out _), key); + return ToLua(applied.Optimize(), key); } // The expression might consist of multiple nested functions var fArgs = bare.DeconstructApply(); - if (fArgs != null) - { + if (fArgs != null) { var (f, args) = fArgs.Value; - - if (f is Constant constant) - { + + if(f is Constant constant) { return ConstantToLua(constant); } - - if (!(f is Function baseFunc)) - { + + if (!(f is Function baseFunc)) { throw new ArgumentException("Not a function: " + f); } - if (baseFunc.Name.Equals(Funcs.Id.Name)) - { + if (baseFunc.Name.Equals(Funcs.Id.Name)) { // This is an ugly hack return ToLua(args.First()); } - if (baseFunc.Name.Equals(Funcs.Dot.Name)) - { - if (args.Count == 1) - { - return ToLua(args[0]); - } - - if (forceFirstArgInDot) - { + if (baseFunc.Name.Equals(Funcs.Dot.Name)) { + if (args.Count == 1 || forceFirstArgInDot) { return ToLua(args[0]); } @@ -175,8 +153,7 @@ namespace AspectedRouting.IO.LuaSkeleton AddDep(baseFunc.Name); var argExpressions = new List(); - foreach (var arg in args) - { + foreach (var arg in args) { argExpressions.Add(ToLua(arg, key)); } @@ -185,35 +162,30 @@ namespace AspectedRouting.IO.LuaSkeleton var collected = new List(); - switch (bare) - { + switch (bare) { case LuaLiteral lua: return lua.Lua; case FunctionCall fc: var called = _context.DefinedFunctions[fc.CalledFunctionName]; - if (called.ProfileInternal) - { + if (called.ProfileInternal) { return called.Name; } AddDependenciesFor(called); AddFunction(called); - return $"{fc.CalledFunctionName.AsLuaIdentifier()}(tags, parameters)"; + return $"{fc.CalledFunctionName.AsLuaIdentifier()}(parameters, tags, result)"; case Constant c: return ConstantToLua(c); case Mapping m: return MappingToLua(m).Indent(); case Function f: var fName = f.Name.TrimStart('$'); - if (Funcs.Builtins.ContainsKey(fName)) - { + if (Funcs.Builtins.ContainsKey(fName)) { AddDep(f.Name); } - else - { + else { var definedFunc = _context.DefinedFunctions[fName]; - if (definedFunc.ProfileInternal) - { + if (definedFunc.ProfileInternal) { return f.Name; } @@ -235,31 +207,27 @@ namespace AspectedRouting.IO.LuaSkeleton public string MappingToLua(Mapping m) { var isConstant = true; - var contents = m.StringToResultFunctions.Select(kv => - { - var (key, expr) = kv; - var left = "[\"" + key + "\"]"; + var contents = m.StringToResultFunctions.Select(kv => { + var (key, expr) = kv; + var left = "[\"" + key + "\"]"; - if (Regex.IsMatch(key, "^[a-zA-Z][_a-zA-Z-9]*$")) - { - left = key; + if (Regex.IsMatch(key, "^[a-zA-Z][_a-zA-Z-9]*$")) { + left = key; + } + + var luaExpr = ToLua(expr, key); + if (luaExpr.Contains("tags")) { + isConstant = false; + } + + return left + " = " + luaExpr; } - - var luaExpr = ToLua(expr, key); - if (luaExpr.Contains("tags")) - { - isConstant = false; - } - - return left + " = " + luaExpr; - } ); var mapping = "{\n " + string.Join(",\n ", contents) + "\n}"; - if (_staticTables && isConstant) - { + if (_staticTables && isConstant) { return AddConstant(mapping); } @@ -273,17 +241,16 @@ namespace AspectedRouting.IO.LuaSkeleton /// private string ConstantToLua(Constant c) { - var o = c.Get(); - switch (o) - { + var o = c.Evaluate(_context); + switch (o) { case LuaLiteral lua: return lua.Lua; case IExpression e: - return ToLua(e); + return ConstantToLua(new Constant(e.Types.First(), e.Evaluate(null))); case int i: - return i.ToString(CultureInfo.InvariantCulture); + return "" + i; case double d: - return d.ToString(CultureInfo.InvariantCulture); + return "" + d; case string s: return '"' + s.Replace("\"", "\\\"") + '"'; case null: @@ -291,12 +258,10 @@ namespace AspectedRouting.IO.LuaSkeleton case ValueTuple unpack: return unpack.Item1 + "[" + unpack.Item2 + "]"; case IEnumerable ls: - var t = ((ListType)c.Types.First()).InnerType; - return "{" + string.Join(", ", ls.Select(obj => - { + var t = ((ListType) c.Types.First()).InnerType; + return "{" + string.Join(", ", ls.Select(obj => { var objInConstant = new Constant(t, obj); - if (obj is Constant asConstant) - { + if (obj is Constant asConstant) { objInConstant = asConstant; } diff --git a/AspectedRouting/IO/LuaSkeleton/LuaSkeleton.Function.cs b/AspectedRouting/IO/LuaSkeleton/LuaSkeleton.Function.cs index cffc7a8..a3436a5 100644 --- a/AspectedRouting/IO/LuaSkeleton/LuaSkeleton.Function.cs +++ b/AspectedRouting/IO/LuaSkeleton/LuaSkeleton.Function.cs @@ -1,4 +1,3 @@ -using System; using System.Collections.Generic; using System.Linq; using AspectedRouting.IO.itinero1; @@ -13,8 +12,7 @@ namespace AspectedRouting.IO.LuaSkeleton { public void AddFunction(AspectMetadata meta) { - if (_alreadyAddedFunctions.Contains(meta.Name)) - { + if (_alreadyAddedFunctions.Contains(meta.Name)) { // already added return; } @@ -29,55 +27,49 @@ namespace AspectedRouting.IO.LuaSkeleton var funcNameDeclaration = ""; - meta.Visit(e => - { - if (e is Function f && f.Name.Equals(Funcs.MemberOf.Name)) - { + meta.Visit(e => { + if (e is Function f && f.Name.Equals(Funcs.MemberOf.Name)) { funcNameDeclaration = $"\n local funcName = \"{meta.Name.AsLuaIdentifier()}\""; } return true; }); - var expression = Funcs.Either(Funcs.Id, Funcs.Const, meta.ExpressionImplementation) - .Apply(new LuaLiteral(Typs.Tags, "tags")) - .PruneTypes(t => !(t is Curry)) - .SpecializeToSmallestType() - .Optimize(out _); - if (!expression.Types.Any()) - { - throw new Exception("Could not optimize expression with applied tags"); - } + var expression = meta.ExpressionImplementation; var ctx = Context; _context = _context.WithAspectName(meta.Name); var body = ""; - if (_useSnippets) - { + if (_useSnippets) { + if (expression.Types.First() is Curry c) { + expression = expression.Apply(new LuaLiteral(Typs.Tags, "tags")); + } + body = Utils.Lines( " local r = nil", " " + Snippets.Convert(this, "r", expression).Indent(), " return r" ); } - else - { + else { body = " return " + ToLua(expression); } + var impl = Utils.Lines( "--[[", meta.Description, "", "Unit: " + meta.Unit, "Created by " + meta.Author, + "Originally defined in " + meta.Filepath, "Uses tags: " + string.Join(", ", possibleTags.Keys), "Used parameters: " + string.Join(", ", usedParams), "Number of combintations: " + numberOfCombinations, "Returns values: ", "]]", - "function " + meta.Name.AsLuaIdentifier() + "(tags, parameters)" + funcNameDeclaration, + "function " + meta.Name.AsLuaIdentifier() + "(parameters, tags, result)" + funcNameDeclaration, body, "end" ); diff --git a/AspectedRouting/IO/LuaSkeleton/LuaSkeleton.cs b/AspectedRouting/IO/LuaSkeleton/LuaSkeleton.cs index f4175a3..3a29c18 100644 --- a/AspectedRouting/IO/LuaSkeleton/LuaSkeleton.cs +++ b/AspectedRouting/IO/LuaSkeleton/LuaSkeleton.cs @@ -33,7 +33,7 @@ namespace AspectedRouting.IO.LuaSkeleton public Context Context => _context; - public LuaSkeleton(Context context, bool useSnippets, bool staticTables = false) + public LuaSkeleton(Context context, bool useSnippets, bool staticTables = false) { _context = context; _useSnippets = useSnippets; @@ -42,14 +42,11 @@ namespace AspectedRouting.IO.LuaSkeleton internal void AddDep(string name) { - if (name.StartsWith("mapping")) - { - Console.Error.WriteLine(">>>"); + if (name.StartsWith("mapping")) { throw new Exception("A mapping was added as dependency - this is a bug"); } - if (name.Contains("stringToTags")) - { + if (name.Contains("stringToTags")) { AddDep("table_to_list"); } _dependencies.Add(name); @@ -68,14 +65,11 @@ namespace AspectedRouting.IO.LuaSkeleton public void AddDependenciesFor(IExpression e) { var (_, functionNames) = e.InList().DirectlyAndInderectlyCalled(_context); - foreach (var functionName in functionNames) - { - if (_context.DefinedFunctions.TryGetValue(functionName, out var aspectMeta)) - { + foreach (var functionName in functionNames) { + if (_context.DefinedFunctions.TryGetValue(functionName, out var aspectMeta)) { AddFunction(aspectMeta); } - else - { + else { AddDep(functionName); } } @@ -85,15 +79,12 @@ namespace AspectedRouting.IO.LuaSkeleton { var imps = new List(); - foreach (var name in _dependencies) - { + foreach (var name in _dependencies) { var path = $"IO/lua/{name}.lua"; - if (File.Exists(path)) - { + if (File.Exists(path)) { imps.Add(File.ReadAllText(path)); } - else - { + else { throw new FileNotFoundException(path); } } @@ -115,8 +106,7 @@ namespace AspectedRouting.IO.LuaSkeleton private readonly Dictionary counters = new Dictionary(); public string FreeVar(string key) { - if (!counters.ContainsKey(key)) - { + if (!counters.ContainsKey(key)) { counters[key] = 0; return key; } diff --git a/AspectedRouting/IO/LuaSkeleton/LuaStringExtensions.cs b/AspectedRouting/IO/LuaSkeleton/LuaStringExtensions.cs index 4f46d89..22e360b 100644 --- a/AspectedRouting/IO/LuaSkeleton/LuaStringExtensions.cs +++ b/AspectedRouting/IO/LuaSkeleton/LuaStringExtensions.cs @@ -1,5 +1,4 @@ using System.Collections.Generic; -using System.Globalization; using System.Linq; using System.Text.RegularExpressions; @@ -7,20 +6,20 @@ namespace AspectedRouting.IO.itinero1 { public static class LuaStringExtensions { - + public static string ToLuaTable(this Dictionary tags) { var contents = tags.Select(kv => { var (key, value) = kv; - var left = "[\"" + key .ToString(CultureInfo.InvariantCulture)+ "\"]"; + var left = "[\"" + key + "\"]"; if (Regex.IsMatch(key, "^[a-zA-Z][_a-zA-Z-9]*$")) { left = key; } - return $"{left.ToString(CultureInfo.InvariantCulture)} = \"{value.ToString(CultureInfo.InvariantCulture)}\""; + return $"{left} = \"{value}\""; }); return "{" + string.Join(", ", contents) + "}"; } diff --git a/AspectedRouting/IO/LuaSkeleton/LuaTestPrinter.cs b/AspectedRouting/IO/LuaSkeleton/LuaTestPrinter.cs index 733bbf7..493eefd 100644 --- a/AspectedRouting/IO/LuaSkeleton/LuaTestPrinter.cs +++ b/AspectedRouting/IO/LuaSkeleton/LuaTestPrinter.cs @@ -1,5 +1,4 @@ using System.Collections.Generic; -using System.Globalization; using System.Linq; using AspectedRouting.Tests; @@ -14,17 +13,17 @@ namespace AspectedRouting.IO.itinero1 _skeleton = skeleton; unitTestRunners.ForEach(_skeleton.AddDep); } - - + + public string GenerateFullTestSuite(List profileTests, List aspectTests, bool invertPriority = false) { - + _skeleton.AddDep("inv"); _skeleton.AddDep("double_compare"); var aspectTestSuite = - string.Join("\n\n", + string.Join("\n\n", aspectTests .Where(x => x != null) .Select( @@ -82,8 +81,7 @@ namespace AspectedRouting.IO.itinero1 foreach (var key in keysToCheck) { var newKey = key.Replace(".", "_"); - if (newKey == key) - { + if (newKey == key) { continue; } tags[newKey] = tags[key]; @@ -95,10 +93,9 @@ namespace AspectedRouting.IO.itinero1 tags.Remove("#" + paramName); } - var expectedPriority = expected.Priority.ToString(CultureInfo.InvariantCulture); - if (invertPriority) - { - expectedPriority = $"inv({expectedPriority.ToString(CultureInfo.InvariantCulture)})"; + var expectedPriority = "" + expected.Priority; + if (invertPriority) { + expectedPriority = $"inv({expectedPriority})"; } // Generates something like: @@ -107,7 +104,7 @@ namespace AspectedRouting.IO.itinero1 $"unit_test_profile(behaviour_{testSuite.Profile.Name.AsLuaIdentifier()}_{testSuite.BehaviourName.AsLuaIdentifier()}, " + $"\"{testSuite.BehaviourName}\", " + $"{index}, " + - $"{{access = \"{D(expected.Access)}\", speed = {expected.Speed.ToString(CultureInfo.InvariantCulture)}, oneway = \"{D(expected.Oneway)}\", priority = {expectedPriority} }}, " + + $"{{access = \"{D(expected.Access)}\", speed = {expected.Speed}, oneway = \"{D(expected.Oneway)}\", priority = {expectedPriority} }}, " + tags.ToLuaTable() + ")"; } @@ -121,7 +118,7 @@ namespace AspectedRouting.IO.itinero1 { return ""; } - + var tests = testSuite.Tests .Select((test, i) => GenerateAspectUnitTestCall(fName, i, test.expected, test.tags)) @@ -152,7 +149,8 @@ namespace AspectedRouting.IO.itinero1 _skeleton.AddDep("unitTest"); _skeleton.AddDep("debug_table"); - return $"unit_test({functionToApplyName.AsLuaIdentifier()}, \"{functionToApplyName}\", {index.ToString(CultureInfo.InvariantCulture)}, \"{expected.ToString(CultureInfo.InvariantCulture)}\", {parameters.ToLuaTable()}, {tags.ToLuaTable()})"; + return + $"unit_test({functionToApplyName.AsLuaIdentifier()}, \"{functionToApplyName}\", {index}, \"{expected}\", {parameters.ToLuaTable()}, {tags.ToLuaTable()})"; } diff --git a/AspectedRouting/IO/LuaSnippets/DefaultSnippet.cs b/AspectedRouting/IO/LuaSnippets/DefaultSnippet.cs index f1b52af..aea2be8 100644 --- a/AspectedRouting/IO/LuaSnippets/DefaultSnippet.cs +++ b/AspectedRouting/IO/LuaSnippets/DefaultSnippet.cs @@ -13,13 +13,13 @@ namespace AspectedRouting.IO.LuaSnippets var defaultValue = args[0]; var func = args[1]; var funcArg = args[2]; - + return Snippets.Convert(lua, assignTo, func.Apply(funcArg)) + "\n" - + "if (" + assignTo + " == nil) then\n" - + " " + assignTo + " = " + lua.ToLua(defaultValue) + "\n" - + "end"; - + +"if ("+assignTo+" == nil) then\n" + + " " + assignTo + " = " + lua.ToLua(defaultValue)+"\n" + +"end"; + } } } \ No newline at end of file diff --git a/AspectedRouting/IO/LuaSnippets/FirstMatchOfSnippet.cs b/AspectedRouting/IO/LuaSnippets/FirstMatchOfSnippet.cs index 78a50c5..062fd7d 100644 --- a/AspectedRouting/IO/LuaSnippets/FirstMatchOfSnippet.cs +++ b/AspectedRouting/IO/LuaSnippets/FirstMatchOfSnippet.cs @@ -15,8 +15,7 @@ namespace AspectedRouting.IO.LuaSnippets { var c = lua.Context; - if (!(args[0].Evaluate(c) is List order)) - { + if (!(args[0].Evaluate(c) is List order)) { return null; } @@ -24,19 +23,16 @@ namespace AspectedRouting.IO.LuaSnippets if (!UnApply( IsFunc(Funcs.StringStringToTags), IsMapping(mappings) - ).Invoke(args[1])) - { + ).Invoke(args[1])) { return null; } - if (mappings.Count != 1) - { + if (mappings.Count != 1) { throw new Exception("Multiple possible implementations at this point - should not happen"); } - if (mappings.Count == 0) - { - + if (mappings.Count == 0) { + } var mapping = mappings.First(); var tags = args[2]; @@ -44,35 +40,30 @@ namespace AspectedRouting.IO.LuaSnippets var varName = "tags"; var result = ""; - if (tags is LuaLiteral literal) - { + if (tags is LuaLiteral literal) { varName = literal.Lua; } - else - { + else { result += Snippets.Convert(lua, "tags", tags); } // We _reverse_ the order, so that the _most_ important one is at the _bottom_ // The most important one will then _overwrite_ the result value order.Reverse(); - foreach (var t in order) - { - if (!(t.Evaluate(c) is string key)) - { + foreach (var t in order) { + if (!(t.Evaluate(c) is string key)) { return null; } var func = mapping.StringToResultFunctions[key]; - + result += "if (" + varName + "[\"" + key + "\"] ~= nil) then\n"; - result += " " + Snippets.Convert(lua, assignTo, func.Apply(new LuaLiteral(Typs.String, "tags[\"" + key + "\"]"))).Indent(); + result += " "+Snippets.Convert(lua, assignTo, func.Apply(new LuaLiteral(Typs.String, "tags[\""+key+"\"]"))).Indent(); result += "\n"; result += "end\n"; // note: we do not do an 'elseif' as we have to fallthrough - if (result.Contains("tags[\"nil\"]")) - { - Console.WriteLine("Warning: FirstMatchOf has a 'nil' in the indexes due to expression " + t.ToString()); + if (result.Contains("tags[\"nil\"]")) { + Console.WriteLine("EUHM"); } } diff --git a/AspectedRouting/IO/LuaSnippets/HeadSnippet.cs b/AspectedRouting/IO/LuaSnippets/HeadSnippet.cs index 9b567ce..19796e6 100644 --- a/AspectedRouting/IO/LuaSnippets/HeadSnippet.cs +++ b/AspectedRouting/IO/LuaSnippets/HeadSnippet.cs @@ -20,32 +20,28 @@ namespace AspectedRouting.IO.LuaSnippets UnApply(IsFunc(Funcs.StringStringToTags), IsMapping(mappings)), Assign(actualArgs) - ).Invoke(args[0])) - { + ).Invoke(args[0])) { var actualArg = actualArgs.First(); var mapping = mappings.First(); - if (mapping.StringToResultFunctions.Count != 1) - { + if (mapping.StringToResultFunctions.Count != 1) { return null; } var (key, func) = mapping.StringToResultFunctions.ToList().First(); var result = ""; var tags = ""; - if (actualArg is LuaLiteral l) - { + if (actualArg is LuaLiteral l) { tags = l.Lua; } - else - { + else { tags = lua.FreeVar("tags"); - result += "local " + tags + "\n"; + result += "local " + tags+"\n"; result += Snippets.Convert(lua, tags, actualArg); } - - - + + + var v = lua.FreeVar("value"); result += "local " + v + " = " + tags + "[\"" + key + "\"]\n"; result += Snippets.Convert(lua, assignTo, func.Apply(new LuaLiteral(Typs.String, v))); diff --git a/AspectedRouting/IO/LuaSnippets/IfThenElseDottedSnippet.cs b/AspectedRouting/IO/LuaSnippets/IfThenElseDottedSnippet.cs index f74c10f..6950637 100644 --- a/AspectedRouting/IO/LuaSnippets/IfThenElseDottedSnippet.cs +++ b/AspectedRouting/IO/LuaSnippets/IfThenElseDottedSnippet.cs @@ -11,27 +11,25 @@ namespace AspectedRouting.IO.LuaSnippets public override string Convert(LuaSkeleton.LuaSkeleton lua, string assignTo, List args) { - var fCond = args[0].Optimize(out _); + var fCond = args[0].Optimize(); var fValue = args[1]; IExpression fElse = null; var arg = args[2]; - if (args.Count == 4) - { + if (args.Count == 4) { arg = args[3]; fElse = args[2]; } var c = lua.FreeVar("cond"); var result = ""; - result += "local " + c + "\n"; + result += "local " + c+"\n"; var condApplied = fCond.Apply(arg); var isString = condApplied.Types.First().Equals(Typs.String); - result += Snippets.Convert(lua, c, condApplied) + "\n"; + result += Snippets.Convert(lua, c, condApplied)+"\n"; result += $"if ( {c} or {c} == \"yes\" ) then \n"; - result += " " + Snippets.Convert(lua, assignTo, fValue.Apply(arg)).Indent(); + result += " " + Snippets.Convert(lua, assignTo, fValue.Apply(arg)).Indent() ; - if (fElse != null) - { + if (fElse != null) { result += "else\n"; result += " " + Snippets.Convert(lua, assignTo, fElse.Apply(arg)).Indent(); } diff --git a/AspectedRouting/IO/LuaSnippets/IfThenElseSnippet.cs b/AspectedRouting/IO/LuaSnippets/IfThenElseSnippet.cs index 1f447e4..0adbe63 100644 --- a/AspectedRouting/IO/LuaSnippets/IfThenElseSnippet.cs +++ b/AspectedRouting/IO/LuaSnippets/IfThenElseSnippet.cs @@ -1,9 +1,7 @@ -using System; using System.Collections.Generic; using System.Linq; using AspectedRouting.Language; using AspectedRouting.Language.Typ; -using static AspectedRouting.Language.Deconstruct; namespace AspectedRouting.IO.LuaSnippets { @@ -13,58 +11,29 @@ namespace AspectedRouting.IO.LuaSnippets public override string Convert(LuaSkeleton.LuaSkeleton lua, string assignTo, List args) { - var cond = args[0].Optimize(out _); + var cond = args[0].Optimize(); var ifTrue = args[1]; IExpression ifElse = null; - if (args.Count == 3) - { + if (args.Count == 3) { ifElse = args[2]; } + var c = lua.FreeVar("cond"); + var result = ""; + result += "local " + c+"\n"; + + var isString = cond.Types.First().Equals(Typs.String); + result += Snippets.Convert(lua, c, cond)+"\n"; + result += $"if ( {c} or {c} == \"yes\" ) then \n"; + result += " " + Snippets.Convert(lua, assignTo, ifTrue).Indent() ; - { - var fa = new List(); - if (UnApply( - IsFunc(Funcs.IsNull), - Assign(fa) - ).Invoke(cond)) - { - - if (fa.First().ToString() == ifElse.ToString()) - { - var result = ""; - - // We calculate the value that we need - result += Snippets.Convert(lua, assignTo, ifElse) + "\n"; - result += "if (" + assignTo + " == nil) then\n"; - result += " " + Snippets.Convert(lua, assignTo, ifTrue).Indent(); - result += "end\n"; - return result; - - } - throw new Exception("TODO optimize with default"); - } + if (ifElse != null) { + result += "else\n"; + result += " " + Snippets.Convert(lua, assignTo, ifElse).Indent(); } - { - var c = lua.FreeVar("cond"); - var result = ""; - result += "local " + c + "\n"; - - var isString = cond.Types.First().Equals(Typs.String); - result += Snippets.Convert(lua, c, cond) + "\n"; - result += $"if ( {c} == true or {c} == \"yes\" ) then \n"; - result += " " + Snippets.Convert(lua, assignTo, ifTrue).Indent(); - - if (ifElse != null) - { - result += "else\n"; - result += " " + Snippets.Convert(lua, assignTo, ifElse).Indent(); - } - - result += "end\n"; - return result; - } + result += "end\n"; + return result; } } } \ No newline at end of file diff --git a/AspectedRouting/IO/LuaSnippets/InvSnippet.cs b/AspectedRouting/IO/LuaSnippets/InvSnippet.cs index 5b10e30..07c7f64 100644 --- a/AspectedRouting/IO/LuaSnippets/InvSnippet.cs +++ b/AspectedRouting/IO/LuaSnippets/InvSnippet.cs @@ -10,7 +10,7 @@ namespace AspectedRouting.IO.LuaSnippets { var result = Snippets.Convert(lua, assignTo, args[0]); - result += " " + assignTo + " = 1 / " + assignTo; + result += " "+ assignTo +" = 1 / " + assignTo; return result; } } diff --git a/AspectedRouting/IO/LuaSnippets/ListFoldingSnippet.cs b/AspectedRouting/IO/LuaSnippets/ListFoldingSnippet.cs index 987503a..09119b1 100644 --- a/AspectedRouting/IO/LuaSnippets/ListFoldingSnippet.cs +++ b/AspectedRouting/IO/LuaSnippets/ListFoldingSnippet.cs @@ -21,150 +21,99 @@ namespace AspectedRouting.IO.LuaSnippets public override string Convert(LuaSkeleton.LuaSkeleton lua, string assignTo, List args) { - // Multiply multiplies a list of values - we thus have to handle _each_ arg // Note: we get a single argument which is an expression resulting in a list of values + var listToMultiply = args[0]; + var mappings = new List(); + var arg = new List(); + if (UnApply(UnApply( + IsFunc(Funcs.StringStringToTags), + IsMapping(mappings)), + Assign(arg) + ).Invoke(listToMultiply)) { + var mapping = mappings.First(); - { - var mappings = new List(); - var arg = new List(); - if (args.Count == 1 && UnApply(UnApply( - IsFunc(Funcs.StringStringToTags), - IsMapping(mappings)), - Assign(arg) - ).Invoke(args[0])) - { - var mapping = mappings.First(); - - var result = assignTo + " = " + _neutralValue + "\n"; - var mappingArg = arg.First(); - if (!Equals(mappingArg.Types.First(), Typs.Tags)) - { - return null; - } - - string tags; - if (mappingArg is LuaLiteral literal) - { - tags = literal.Lua; - } - else - { - tags = lua.FreeVar("tags"); - result += "local " + tags + " = nil\n"; - result += Snippets.Convert(lua, tags, mappingArg); - } - - var m = lua.FreeVar("m"); - result += " local " + m + " = nil\n"; - - foreach (var (key, func) in mapping.StringToResultFunctions) - { - result += "if (" + tags + "[\"" + key + "\"] ~= nil) then\n"; - result += m + " = nil\n"; - result += " " + - Snippets.Convert(lua, m, - func.Apply(new LuaLiteral(Typs.String, tags + "[\"" + key + "\"]"))).Indent() + - "\n"; - result += "\n\n if (" + m + " ~= nil) then\n " + - Combine(assignTo, m) + - "\n end\n"; - result += "end\n"; - } - - return result; + var result = assignTo + " = " + _neutralValue + "\n"; + var mappingArg = arg.First(); + if (!Equals(mappingArg.Types.First(), Typs.Tags)) { + return null; } - } - { - // Print a 'listDot', assume 'tags' is the applied argument - var arg = new List(); - var listDotArgs = new List(); - if (args.Count == 1 && UnApply( - UnApply(IsFunc(Funcs.ListDot), - Assign(listDotArgs)), - Assign(arg) - ).Invoke(args[0])) - { - var listDotArg = arg.First(); - if (!(listDotArgs.First().Evaluate(lua.Context) is List functionsToApply)) - { - return null; - } - - var result = " " + assignTo + " = " + _neutralValue + "\n"; - string tags; - if (listDotArg is LuaLiteral literal) - { - tags = literal.Lua; - } - else - { - tags = lua.FreeVar("tags"); - result += " local " + tags + "\n"; - result += Snippets.Convert(lua, tags, listDotArg); - } - - var m = lua.FreeVar("m"); - result += " local " + m + "\n"; - foreach (var func in functionsToApply) - { - result += " " + m + " = nil\n"; - var subMapping = ExtractSubMapping(func); - if (subMapping != null) - { - var (key, f) = subMapping.Value; - var e = f.Apply(new LuaLiteral(Typs.String, tags + "[\"" + key + "\"]")); - e = e.Optimize(out _); - result += Snippets.Convert(lua, m, e).Indent(); - } - else - { - result += Snippets.Convert(lua, m, func.Apply(new LuaLiteral(Typs.Tags, "tags"))); - } - - - result += "\n\n if (" + m + " ~= nil) then\n " + Combine(assignTo, m) + "\n end\n"; - } - - return result; + string tags; + if (mappingArg is LuaLiteral literal) { + tags = literal.Lua; } + else { + tags = lua.FreeVar("tags"); + result += "local " + tags + " = nil\n"; + result += Snippets.Convert(lua, tags, mappingArg); + } + + var m = lua.FreeVar("m"); + result += " local " + m + " = nil\n"; + + foreach (var (key, func) in mapping.StringToResultFunctions) { + result += "if (" + tags + "[\"" + key + "\"] ~= nil) then\n"; + result += m + " = nil\n"; + result += " " + + Snippets.Convert(lua, m, + func.Apply(new LuaLiteral(Typs.String, tags + "[\"" + key + "\"]"))).Indent() + "\n"; + result += "\n\n if (" + m + " ~= nil) then\n " + + Combine(assignTo, m) + + "\n end\n"; + result += "end\n"; + } + + return result; } - - - { - - - var constantArgs = new List(); - if (args.Count == 1 && IsConstant(constantArgs).Invoke(args[0])) - { - if (!(constantArgs.First().Get() is List listItems)) - { - return null; - } - - var result = " " + assignTo + " = " + _neutralValue + "\n"; - - - var m = lua.FreeVar("m"); - result += " local " + m + "\n"; - foreach (var listItem in listItems) - { - result += " " + m + " = nil\n"; - result += Snippets.Convert(lua, m, listItem).Indent(); - result += "\n\n if (" + m + " ~= nil) then\n " + Combine(assignTo, m) + "\n end\n"; - } - - return result; + var listDotArgs = new List(); + if (UnApply( + UnApply(IsFunc(Funcs.ListDot), + Assign(listDotArgs)), + Assign(arg) + ).Invoke(listToMultiply)) { + var listDotArg = arg.First(); + if (!(listDotArgs.First().Evaluate(lua.Context) is List functionsToApply)) { + return null; } + + var result = " " + assignTo + " = " + _neutralValue + "\n"; + string tags; + if (listDotArg is LuaLiteral literal) { + tags = literal.Lua; + } + else { + tags = lua.FreeVar("tags"); + result += " local " + tags + "\n"; + result += Snippets.Convert(lua, tags, listDotArg); + } + + var m = lua.FreeVar("m"); + result += " local " + m + "\n"; + foreach (var func in functionsToApply) { + result += " " + m + " = nil\n"; + var subMapping = ExtractSubMapping(func); + if (subMapping != null) { + var (key, f) = subMapping.Value; + var e = f.Apply(new LuaLiteral(Typs.String, tags + "[\"" + key + "\"]")); + e = e.Optimize(); + result += Snippets.Convert(lua, m, e).Indent(); + } + else { + result += Snippets.Convert(lua, m, func.Apply(new LuaLiteral(Typs.Tags, "tags"))); + } + + + result += "\n\n if (" + m + " ~= nil) then\n " + Combine(assignTo, m) + "\n end\n"; + } + + + return result; } - - Console.Error.WriteLine("ListFoldingSnippet encountered an unsupported expression"); - throw new NotImplementedException(); } @@ -188,11 +137,9 @@ namespace AspectedRouting.IO.LuaSnippets IsFunc(Funcs.StringStringToTags), IsMapping(mappings) ) - ).Invoke(app)) - { + ).Invoke(app)) { var mapping = mappings.First(); - if (mapping.StringToResultFunctions.Count == 1) - { + if (mapping.StringToResultFunctions.Count == 1) { var kv = mapping.StringToResultFunctions.ToList().First(); return (kv.Key, kv.Value); } diff --git a/AspectedRouting/IO/LuaSnippets/LuaSnippet.cs b/AspectedRouting/IO/LuaSnippets/LuaSnippet.cs index 0bb9b5c..75d935d 100644 --- a/AspectedRouting/IO/LuaSnippets/LuaSnippet.cs +++ b/AspectedRouting/IO/LuaSnippets/LuaSnippet.cs @@ -17,7 +17,7 @@ namespace AspectedRouting.IO.LuaSnippets /// public readonly Function ImplementsFunction; - protected LuaSnippet(Function implements) + protected LuaSnippet(Function implements) { ImplementsFunction = implements; } diff --git a/AspectedRouting/IO/LuaSnippets/MaxSnippet.cs b/AspectedRouting/IO/LuaSnippets/MaxSnippet.cs index 98e4e0a..6f4b389 100644 --- a/AspectedRouting/IO/LuaSnippets/MaxSnippet.cs +++ b/AspectedRouting/IO/LuaSnippets/MaxSnippet.cs @@ -7,7 +7,7 @@ namespace AspectedRouting.IO.LuaSnippets public MaxSnippet() : base(Funcs.Max, "nil") { } public override string Combine(string assignTo, string value) { - return Utils.Lines("if ( " + assignTo + " == nil or" + assignTo + " < " + value + " ) then", + return Utils.Lines("if ( "+ assignTo + " == nil or" + assignTo + " < " + value + " ) then", " " + assignTo + " = " + value, "end"); } diff --git a/AspectedRouting/IO/LuaSnippets/MemberOfSnippet.cs b/AspectedRouting/IO/LuaSnippets/MemberOfSnippet.cs index f2d9e63..9df6e86 100644 --- a/AspectedRouting/IO/LuaSnippets/MemberOfSnippet.cs +++ b/AspectedRouting/IO/LuaSnippets/MemberOfSnippet.cs @@ -19,12 +19,10 @@ namespace AspectedRouting.IO.LuaSnippets var tags = ""; var result = ""; - if (tagsToken is LuaLiteral lit) - { + if (tagsToken is LuaLiteral lit) { tags = lit.Lua; } - else - { + else { tags = lua.FreeVar("tags"); result += "local " + tags + "\n"; result += Snippets.Convert(lua, tags, tagsToken); diff --git a/AspectedRouting/IO/LuaSnippets/MustMatchSnippet.cs b/AspectedRouting/IO/LuaSnippets/MustMatchSnippet.cs index 9a590c1..9dbf84f 100644 --- a/AspectedRouting/IO/LuaSnippets/MustMatchSnippet.cs +++ b/AspectedRouting/IO/LuaSnippets/MustMatchSnippet.cs @@ -17,19 +17,17 @@ namespace AspectedRouting.IO.LuaSnippets var result = ""; var neededKeys = lua.FreeVar("neededKeys"); var tags = ""; - if (tagsExpr is LuaLiteral literal) - { + if (tagsExpr is LuaLiteral literal) { tags = literal.Lua; } - else - { - tags = lua.FreeVar("tags"); - result += $"local {tags}"; - result += Snippets.Convert(lua, tags, tagsExpr); + else { + tags = lua.FreeVar("tags"); + result += $"local {tags}"; + result += Snippets.Convert(lua, tags, tagsExpr); } - - + + result += $"local {neededKeys}\n"; result += Snippets.Convert(lua, neededKeys, neededKeysExpr); var key = lua.FreeVar("key"); @@ -38,7 +36,7 @@ namespace AspectedRouting.IO.LuaSnippets result += $" local {value} = {tags}[{key}]\n"; result += $" if ({value} == nil) then\n"; result += $" -- The value is nil, so mustmatch probably fails...\n"; - + throw new System.NotImplementedException(); } } diff --git a/AspectedRouting/IO/LuaSnippets/SimpleMappingSnippet.cs b/AspectedRouting/IO/LuaSnippets/SimpleMappingSnippet.cs index bcfee24..3293a5b 100644 --- a/AspectedRouting/IO/LuaSnippets/SimpleMappingSnippet.cs +++ b/AspectedRouting/IO/LuaSnippets/SimpleMappingSnippet.cs @@ -26,11 +26,9 @@ namespace AspectedRouting.IO.LuaSnippets var vLua = new LuaLiteral(Typs.String, v); var mappings = new List(); - foreach (var kv in _mapping.StringToResultFunctions) - { + foreach (var kv in _mapping.StringToResultFunctions) { var f = kv.Value; - if (f.Types.First() is Curry) - { + if (f.Types.First() is Curry) { f = f.Apply(vLua); } mappings.Add("if (" + v + " == \"" + kv.Key + "\") then\n " + assignTo + " = " + lua.ToLua(f)); diff --git a/AspectedRouting/IO/LuaSnippets/Snippets.cs b/AspectedRouting/IO/LuaSnippets/Snippets.cs index 6bf21de..f231e0c 100644 --- a/AspectedRouting/IO/LuaSnippets/Snippets.cs +++ b/AspectedRouting/IO/LuaSnippets/Snippets.cs @@ -33,44 +33,37 @@ namespace AspectedRouting.IO.LuaSnippets public static string Convert(LuaSkeleton.LuaSkeleton lua, string assignTo, IExpression e) { - var opt = e.Optimize(out _); + var opt = e.Optimize(); // Note that optimization might optimize to a _subtype_ of the original expresion - which is fine! var origType = e.Types.First(); var optType = opt.Types.First(); - if (!origType.Equals(optType) && !origType.IsSuperSet(optType)) - { + if (!origType.Equals(optType) && !origType.IsSuperSet(optType)) { throw new Exception("Optimization went wrong!"); } e = opt; var deconstructed = e.DeconstructApply(); + + if (deconstructed != null){ - if (deconstructed != null) - { - - if (deconstructed.Value.f is Mapping m) - { + if (deconstructed.Value.f is Mapping m) { return new SimpleMappingSnippet(m).Convert(lua, assignTo, deconstructed.Value.args); } - + if (deconstructed.Value.f is Function f - && SnippetsIndex.TryGetValue(f.Name, out var snippet)) - { + && SnippetsIndex.TryGetValue(f.Name, out var snippet)) { var optimized = snippet.Convert(lua, assignTo, deconstructed.Value.args); - if (optimized != null) - { + if (optimized != null) { return optimized + "\n"; } } } - try - { + try { - return assignTo + " = " + lua.ToLua(e) + "\n"; + return assignTo + " = " + lua.ToLua(e)+"\n"; } - catch (Exception) - { + catch (Exception err) { return "print(\"ERROR COMPILER BUG\");\n"; } } diff --git a/AspectedRouting/IO/MdPrinter.cs b/AspectedRouting/IO/MdPrinter.cs index caa9615..65c9f10 100644 --- a/AspectedRouting/IO/MdPrinter.cs +++ b/AspectedRouting/IO/MdPrinter.cs @@ -14,8 +14,7 @@ namespace AspectedRouting.IO { public static void GenerateHelpText(string saveTo = null) { - var format = File.ReadAllText("Format.md"); - var helpText = format + "\n\n" + TypeOverview + + var helpText = TypeOverview + FunctionOverview; if (saveTo == null) diff --git a/AspectedRouting/IO/itinero1/LuaPrinter1.MainFunction.cs b/AspectedRouting/IO/itinero1/LuaPrinter1.MainFunction.cs index 2bc9d1c..1671994 100644 --- a/AspectedRouting/IO/itinero1/LuaPrinter1.MainFunction.cs +++ b/AspectedRouting/IO/itinero1/LuaPrinter1.MainFunction.cs @@ -1,7 +1,6 @@ using System.Collections.Generic; using System.Linq; using AspectedRouting.IO.LuaSkeleton; -using AspectedRouting.IO.LuaSnippets; using AspectedRouting.Language; using AspectedRouting.Language.Functions; using AspectedRouting.Language.Typ; @@ -15,10 +14,10 @@ namespace AspectedRouting.IO.itinero1 private string GenerateMainProfileFunction() { - var access = _skeleton.ToLuaWithTags(_profile.Access); - var oneway = _skeleton.ToLuaWithTags(_profile.Oneway); - var speed = _skeleton.ToLuaWithTags(_profile.Speed); - + var access = _skeleton.ToLua(_profile.Access); + var oneway = _skeleton.ToLua(_profile.Oneway); + var speed = _skeleton.ToLua(_profile.Speed); + var impl = string.Join("\n", "", "", @@ -28,6 +27,7 @@ namespace AspectedRouting.IO.itinero1 "Comfort is calculated as well, based on the parameters which are padded in", "", "Created by " + _profile.Author, + "Originally defined in " + _profile.Filename, "]]", "function " + _profile.Name + "(parameters, tags, result)", "", @@ -54,22 +54,18 @@ namespace AspectedRouting.IO.itinero1 impl += "\n local priority = 0\n "; - var tags = new LuaLiteral(Typs.Tags, "tags"); foreach (var (parameterName, expression) in _profile.Priority) { var paramInLua = _skeleton.ToLua(new Parameter(parameterName)); - var expr = Funcs.Either(Funcs.Id, Funcs.Const, expression).Apply(tags) - .SpecializeToSmallestType() - .PruneTypes(t => !(t is Curry)) - .Optimize(out _); - - if (expr.Types.Any(t => t.Name.Equals(Typs.Bool.Name))) + var exprInLua = _skeleton.ToLua(expression.Optimize(), forceFirstArgInDot: true); + var resultTypes = expression.Types.Select(t => t.Uncurry().Last()); + if (resultTypes.Any(t => t.Name.Equals(Typs.Bool.Name))) { - expr = Funcs.Parse.Apply(expr).SpecializeToSmallestType(); + _skeleton. AddDep("parse"); + exprInLua = "parse(" + exprInLua + ")"; } - var exprInLua = _skeleton.ToLua(expr); impl += "\n " + string.Join("\n ", $"if({paramInLua} ~= 0) then", @@ -78,14 +74,8 @@ namespace AspectedRouting.IO.itinero1 ); } - var scalingFactor = Funcs.Default.Apply(new Constant(Typs.Double, 1.0), _profile.ScalingFactor, tags); impl += string.Join("\n", - " -- Calculate the scaling factor", - " local scalingfactor", - Snippets.Convert(_skeleton, "scalingfactor", scalingFactor.SpecializeToSmallestType()), - "", - "priority = priority * scalingfactor", "", "", " if (priority <= 0) then", @@ -107,10 +97,10 @@ namespace AspectedRouting.IO.itinero1 "end" ); - return impl; + return impl; } - - + + private (string functionName, string implementation) GenerateBehaviourFunction( string behaviourName, Dictionary behaviourParameters) @@ -119,15 +109,9 @@ namespace AspectedRouting.IO.itinero1 var functionName = referenceName.AsLuaIdentifier(); behaviourParameters.TryGetValue("description", out var description); - _skeleton.AddDep("copy_tags"); - var usedkeys = _profile.AllExpressionsFor(behaviourName, _context) - .PossibleTagsRecursive(_context) - .Select(t => "\"" + t.Key + "\"") - .ToHashSet(); - _skeleton.AddDep("remove_relation_prefix"); var impl = string.Join("\n", - "behaviour_" + functionName + "_used_keys = create_set({" + string.Join(", ", usedkeys) + "})", + "", "--[[", description, "]]", @@ -141,7 +125,6 @@ namespace AspectedRouting.IO.itinero1 impl += _parameterPrinter.DeclareParametersFor(behaviourParameters); impl += " " + _profile.Name + "(parameters, tags, result)\n"; - impl += " copy_tags(tags, result.attributes_to_keep, behaviour_" + functionName + "_used_keys)\n"; impl += "end\n"; return (functionName, impl); } diff --git a/AspectedRouting/IO/itinero1/LuaPrinter1.RelationPreprocessor.cs b/AspectedRouting/IO/itinero1/LuaPrinter1.RelationPreprocessor.cs index d33d5ab..445962b 100644 --- a/AspectedRouting/IO/itinero1/LuaPrinter1.RelationPreprocessor.cs +++ b/AspectedRouting/IO/itinero1/LuaPrinter1.RelationPreprocessor.cs @@ -7,7 +7,7 @@ namespace AspectedRouting.IO.itinero1 { public partial class LuaPrinter1 { - + private (string implementation, HashSet extraKeys) GenerateMembershipPreprocessor() { // Extra keys are the names of introduced tag-keys, e.g. '_relation:bicycle_fastest:cycle_highway' @@ -44,7 +44,7 @@ namespace AspectedRouting.IO.itinero1 " legacy_relation_preprocessor(relation_tags, result)" }; _skeleton.AddDep("legacy"); - + foreach (var (calledInFunction, expr) in memberships) { func.Add($"\n\n -- {calledInFunction} ---"); @@ -57,7 +57,7 @@ namespace AspectedRouting.IO.itinero1 func.Add(""); func.Add(" subresult.attributes_to_keep = {}"); func.Add(" parameters = default_parameters()"); - func.Add($" matched = {preProcName}(relation_tags, parameters)"); + func.Add($" matched = {preProcName}(parameters, relation_tags, subresult)"); func.Add(" if (matched) then"); var tagKey = "_relation:" + calledInFunction.AsLuaIdentifier(); extraKeys.Add(tagKey); @@ -90,7 +90,7 @@ namespace AspectedRouting.IO.itinero1 func.Add(" parameters = default_parameters()"); func.Add(_parameterPrinter.DeclareParametersFor(parameters.Where(kv => usedParameters.Contains(kv.Key)) .ToDictionary(kv => kv.Key, kv => kv.Value))); - func.Add($" matched = {preProcName}(relation_tags, parameters)"); + func.Add($" matched = {preProcName}(parameters, relation_tags, subresult)"); func.Add(" if (matched) then"); tagKey = "_relation:" + behaviourName.AsLuaIdentifier() + ":" + calledInFunction.AsLuaIdentifier(); extraKeys.Add(tagKey); diff --git a/AspectedRouting/IO/itinero1/LuaPrinter1.cs b/AspectedRouting/IO/itinero1/LuaPrinter1.cs index 1526367..d88c663 100644 --- a/AspectedRouting/IO/itinero1/LuaPrinter1.cs +++ b/AspectedRouting/IO/itinero1/LuaPrinter1.cs @@ -27,19 +27,18 @@ namespace AspectedRouting.IO.itinero1 _aspectTestSuites = aspectTestSuites?.Where(suite => suite != null) ?.Select(testSuite => testSuite.WithoutRelationTests())?.ToList(); _profileTests = profileTests; - _skeleton = new LuaSkeleton.LuaSkeleton(context, true); + _skeleton = new LuaSkeleton.LuaSkeleton(context, false); _parameterPrinter = new LuaParameterPrinter(profile, _skeleton); } public string ToLua() { - _skeleton.AddDep("spoken_instructions"); + _skeleton.AddDep("spoken_instructions"); var (membershipFunction, extraKeys) = GenerateMembershipPreprocessor(); var (profileOverview, behaviourFunctions) = GenerateProfileFunctions(); var mainFunction = GenerateMainProfileFunction(); - var tests = new LuaTestPrinter(_skeleton, new List { "unitTest", "unitTestProfile" }) - .GenerateFullTestSuite(_profileTests, _aspectTestSuites); + var tests = new LuaTestPrinter(_skeleton, new List{"unitTest","unitTestProfile"}).GenerateFullTestSuite(_profileTests, _aspectTestSuites); var keys = _profile.AllExpressions(_context).PossibleTags().Keys @@ -49,10 +48,10 @@ namespace AspectedRouting.IO.itinero1 var header = new List { - $"-- Itinero 1.0-profile, generated by AspectedRouting.", + $"-- Itinero 1.0-profile, generated by AspectedRouting. Last source file change is {_profile.LastChange:s}", $"name = \"{_profile.Name}\"", "normalize = false", - "vehicle_types = {" + string.Join(", ", _profile.VehicleTyps.Select(s => "\"" + s + "\"")) + "}", + "vehicle_type = {" + string.Join(", ", _profile.VehicleTyps.Select(s => "\"" + s + "\"")) + "}", // meta_whitelist is defined in the profile file, these are tags that are included in the generated route, but are not relevant for determining weights "meta_whitelist = {\n" + string.Join("\n , ", _profile.Metadata.Select(s => "\"" + s + "\"")) @@ -63,15 +62,7 @@ namespace AspectedRouting.IO.itinero1 "", profileOverview, "", - _parameterPrinter.GenerateDefaultParameters(), - "", - "function create_set(list)", - " local set = {}", - " for _, l in ipairs(list) do " + - " set[l] = true" + - " end", - " return set", - "end" + _parameterPrinter.GenerateDefaultParameters() }; @@ -115,7 +106,7 @@ namespace AspectedRouting.IO.itinero1 var behaviourImplementations = new List(); foreach (var (behaviourName, behaviourParameters) in _profile.Behaviours) { - var (functionName, implementation) = GenerateBehaviourFunction(behaviourName, behaviourParameters); + var (functionName, implementation ) = GenerateBehaviourFunction(behaviourName, behaviourParameters); behaviourImplementations.Add(implementation); profiles.Add( string.Join(",\n ", @@ -151,8 +142,6 @@ namespace AspectedRouting.IO.itinero1 "test_all()", "if (not failed_tests and not failed_profile_tests) then", " print(\"Tests OK\")", - "else", - " error(\"Some tests failed\")", "end" ); } diff --git a/AspectedRouting/IO/itinero2/LuaPrinter2.MainFunction.cs b/AspectedRouting/IO/itinero2/LuaPrinter2.MainFunction.cs index a095dc0..2b94e98 100644 --- a/AspectedRouting/IO/itinero2/LuaPrinter2.MainFunction.cs +++ b/AspectedRouting/IO/itinero2/LuaPrinter2.MainFunction.cs @@ -1,11 +1,7 @@ using System; using System.Collections.Generic; -using System.Globalization; using System.Linq; -using AspectedRouting.IO.LuaSkeleton; -using AspectedRouting.IO.LuaSnippets; using AspectedRouting.Language; -using AspectedRouting.Language.Functions; using AspectedRouting.Language.Typ; namespace AspectedRouting.IO.itinero2 @@ -15,43 +11,56 @@ namespace AspectedRouting.IO.itinero2 private string GenerateFactorFunction() { var parameters = new Dictionary(); - foreach (var (name, value) in _profile.DefaultParameters) parameters[name] = value; + foreach (var (name, value) in _profile.DefaultParameters) + { + parameters[name] = value; + } - foreach (var (name, value) in _profile.Behaviours[_behaviourName]) parameters[name] = value; + foreach (var (name, value) in _profile.Behaviours[_behaviourName]) + { + parameters[name] = value; + } var aspects = new List(); - var tags = new LuaLiteral(Typs.Tags, "tags"); + foreach (var (paramName, expr) in _profile.Priority) { var weightExpr = parameters[paramName].Evaluate(_context); - if (!(weightExpr is double weight)) continue; + if (!(weightExpr is double weight)) + { + continue; + } - if (weight == 0) continue; + if (weight == 0) + { + continue; + } // The expression might still have multiple typings, // which take inputs different from 'Tags', so we specialize the expr first - var appliedExpr = Funcs.Either(Funcs.Id, Funcs.Const, expr) - .Apply(tags) - .PruneTypes(tp => !(tp is Curry)); - var exprSpecialized = appliedExpr.Optimize(out _); - - if (exprSpecialized.Types.First().Equals(Typs.Bool) || - exprSpecialized.Types.First().Equals(Typs.String)) - { - _skeleton.AddDep("parse"); - exprSpecialized = Funcs.Parse.Apply(exprSpecialized); + var exprSpecialized = expr; + var resultType = expr.Types.First(); + if (exprSpecialized.Types.Count() >=2) { + exprSpecialized = expr.Specialize(new Curry(Typs.Tags, new Var("a"))); + if (exprSpecialized == null) { + throw new Exception("Could not specialize expression to type tags -> $a"); + } + resultType = (exprSpecialized.Types.First() as Curry).ResultType; } var exprInLua = _skeleton.ToLua(exprSpecialized); - if (exprInLua.Contains("constRight") || exprInLua.Contains("firstArg")) - throw new Exception("Not optimized properly:" + exprSpecialized.Repr()); - aspects.Add(weight.ToString(CultureInfo.InvariantCulture) + " * " + exprInLua.ToString(CultureInfo.InvariantCulture)); + if (resultType.Equals(Typs.Bool) || resultType.Equals(Typs.String)) + { + _skeleton.AddDep("parse"); + exprInLua = "parse(" + exprInLua + ")"; + } + + aspects.Add(weight + " * " + exprInLua); } - var scalingFactor = Funcs.Default.Apply(new Constant(Typs.Double, 1.0), _profile.ScalingFactor, tags) - .SpecializeToSmallestType(); - var code = new List + Console.WriteLine(aspects.Lined()); + var code = new List() { "--[[", "Generates the factor according to the priorities and the parameters for this behaviour", @@ -60,64 +69,12 @@ namespace AspectedRouting.IO.itinero2 "function calculate_priority(parameters, tags, result, access, oneway, speed)", " local distance = 1", " local priority = \n " + string.Join(" +\n ", aspects), - "", - "local scalingfactor", - Snippets.Convert(_skeleton, "scalingfactor", scalingFactor), - " return priority * scalingfactor", + " return priority", "end" }; return code.Lined(); } - private string GenerateTurnCostFunction() - { - var vehicleTypes = _profile.VehicleTyps; - _skeleton.AddDep("containedIn"); - _skeleton.AddDep("str_split"); - _skeleton.AddDep("calculate_turn_cost_factor"); - - - /** - * Calculates the turn cost factor for relation attributes or obstacles. - Keep in mind that there are no true relations in the routerDB anymore, instead the attributes are copied onto a turn cost object. - This turn cost object has a set of sequence of edges and is applied onto the vertex.0 - - Obstacles such as bollards are converted into a turn cost as well. - calculate_turn_cost_factor will be called for this bollard too to calculate the weight. - -If result.factor = -1 if passing is not possible - this is more or less equal to an infinite cost -If result.factor = 0 if no weight/passing is possible -If result.factor is positive, that is the cost. - -There is no forward or backward, so this should always be the same for the same attributes - */ - var parameters = _profile.Behaviours[_behaviourName]; - var tags = new LuaLiteral(Typs.Tags, "attributes"); - var hasAccess = _profile.ObstacleAccess.Apply(tags).SpecializeToSmallestType().Optimize(out _); - var code = new List - { - "--[[ Function called by itinero2 on every turn restriction relation", " ]]", - "function turn_cost_factor(attributes, result)", - " local parameters = default_parameters()", - _parameterPrinter.DeclareParametersFor(parameters), - "local has_access", - Snippets.Convert(_skeleton, "has_access", hasAccess), - "if ( has_access == \"no\" or has_access == \"false\") then", - " result.factor = -1", - "else", - Snippets.Convert(_skeleton, "result.factor", _profile.ObstacleCost.Apply(tags).SpecializeToSmallestType().Optimize(out _)), - "end", - - " -- not known by the profile or invalid value - use the default implementation", - " if (result.factor == nil) then", - " result.factor = calculate_turn_cost_factor(attributes, vehicle_types)", - " end", - "end", - "" - }; - return code.Lined(); - } - private string GenerateMainFunction() { var parameters = _profile.Behaviours[_behaviourName]; @@ -128,7 +85,6 @@ There is no forward or backward, so this should always be the same for the same _skeleton.AddDep("eq"); _skeleton.AddDep("remove_relation_prefix"); - _skeleton.AddDep("debug_table"); var code = new List { "--[[", @@ -152,7 +108,7 @@ There is no forward or backward, so this should always be the same for the same " local parameters = default_parameters()", _parameterPrinter.DeclareParametersFor(parameters), "", - " local oneway = " + _skeleton.ToLuaWithTags(_profile.Oneway).Indent(), + " local oneway = " + _skeleton.ToLua(_profile.Oneway), " tags.oneway = oneway", " -- An aspect describing oneway should give either 'both', 'against' or 'width'", @@ -160,7 +116,7 @@ There is no forward or backward, so this should always be the same for the same "", " -- forward calculation. We set the meta tag '_direction' to 'width' to indicate that we are going forward. The other functions will pick this up", " tags[\"_direction\"] = \"with\"", - " local access_forward = " + _skeleton.ToLuaWithTags(_profile.Access).Indent(), + " local access_forward = " + _skeleton.ToLua(_profile.Access), " if(oneway == \"against\") then", " -- no 'oneway=both' or 'oneway=with', so we can only go back over this segment", " -- we overwrite the 'access_forward'-value with no; whatever it was...", @@ -168,7 +124,7 @@ There is no forward or backward, so this should always be the same for the same " end", " if(access_forward ~= nil and access_forward ~= \"no\" and access_forward ~= false) then", " tags.access = access_forward -- might be relevant, e.g. for 'access=dismount' for bicycles", - " result.forward_speed = " + _skeleton.ToLuaWithTags(_profile.Speed).Indent(), + " result.forward_speed = " + _skeleton.ToLua(_profile.Speed).Indent(), " tags.speed = result.forward_speed", " local priority = calculate_priority(parameters, tags, result, access_forward, oneway, result.forward_speed)", " if (priority <= 0) then", @@ -180,7 +136,7 @@ There is no forward or backward, so this should always be the same for the same "", " -- backward calculation", " tags[\"_direction\"] = \"against\" -- indicate the backward direction to priority calculation", - " local access_backward = " + _skeleton.ToLuaWithTags(_profile.Access).Indent(), + " local access_backward = " + _skeleton.ToLua(_profile.Access), " if(oneway == \"with\") then", " -- no 'oneway=both' or 'oneway=against', so we can only go forward over this segment", " -- we overwrite the 'access_forward'-value with no; whatever it was...", @@ -188,7 +144,7 @@ There is no forward or backward, so this should always be the same for the same " end", " if(access_backward ~= nil and access_backward ~= \"no\" and access_backward ~= false) then", " tags.access = access_backward", - " result.backward_speed = " + _skeleton.ToLuaWithTags(_profile.Speed).Indent(), + " result.backward_speed = " + _skeleton.ToLua(_profile.Speed).Indent(), " tags.speed = result.backward_speed", " local priority = calculate_priority(parameters, tags, result, access_backward, oneway, result.backward_speed)", " if (priority <= 0) then", diff --git a/AspectedRouting/IO/itinero2/LuaPrinter2.cs b/AspectedRouting/IO/itinero2/LuaPrinter2.cs index 1e16d81..c017789 100644 --- a/AspectedRouting/IO/itinero2/LuaPrinter2.cs +++ b/AspectedRouting/IO/itinero2/LuaPrinter2.cs @@ -1,9 +1,9 @@ +using System; using System.Collections.Generic; using System.Linq; using AspectedRouting.IO.itinero1; using AspectedRouting.Language; using AspectedRouting.Language.Expression; -using AspectedRouting.Language.Functions; using AspectedRouting.Tests; namespace AspectedRouting.IO.itinero2 @@ -28,7 +28,7 @@ namespace AspectedRouting.IO.itinero2 private readonly string _behaviourName; private readonly IEnumerable _behaviourTestSuite; private readonly Context _context; - private readonly bool _includeTests; + private readonly DateTime _lastChangeTime; private readonly LuaParameterPrinter _parameterPrinter; private readonly ProfileMetaData _profile; @@ -38,7 +38,7 @@ namespace AspectedRouting.IO.itinero2 public LuaPrinter2(ProfileMetaData profile, string behaviourName, Context context, List aspectTests, IEnumerable behaviourTestSuite, - bool includeTests = true) + DateTime lastChangeTime) { _skeleton = new LuaSkeleton.LuaSkeleton(context, true); _profile = profile; @@ -46,14 +46,45 @@ namespace AspectedRouting.IO.itinero2 _context = context; _aspectTests = aspectTests; _behaviourTestSuite = behaviourTestSuite; - _includeTests = includeTests; + _lastChangeTime = lastChangeTime; _parameterPrinter = new LuaParameterPrinter(_profile, _skeleton); } - private string TestRunner() + public string ToLua() { - return new List - { + var profileDescr = _profile.Behaviours[_behaviourName]["description"].Evaluate(_context).ToString(); + var header = + new List { + $"name = \"{_profile.Name}.{_behaviourName}\"", + $"generationDate = \"{_lastChangeTime:s}\"", + $"description = \"{profileDescr} ({_profile.Description})\"" + }; + + var testPrinter = new LuaTestPrinter(_skeleton, + new List {"unitTestProfile2"}); + var tests = testPrinter.GenerateFullTestSuite( + _behaviourTestSuite.ToList(), + new List(), + true); + var all = new List { + header.Lined(), + "", + GenerateMainFunction(), + "", + GenerateFactorFunction(), + "", + _parameterPrinter.GenerateDefaultParameters(), + "", + "", + string.Join("\n\n", _skeleton.GenerateFunctions()), + "", + string.Join("\n\n", _skeleton.GenerateDependencies()), // Should be AFTER generating the main function! + "", + string.Join("\n\n", _skeleton.GenerateConstants()), + "", + tests, + "", + "if (itinero == nil) then", " itinero = {}", " itinero.log = print", @@ -69,56 +100,7 @@ namespace AspectedRouting.IO.itinero2 "test_all()", "if (not failed_tests and not failed_profile_tests and print ~= nil) then", $" print(\"Tests OK ({_profile.Name}.{_behaviourName})\")", - "else", - " error(\"Some tests failed\")", "end" - }.Lined(); - } - - public string ToLua() - { - var profileDescr = _profile.Behaviours[_behaviourName]["description"].Evaluate(_context).ToString(); - var header = - new List - { - $"name = \"{_profile.Name}.{_behaviourName}\"", - $"description = \"{profileDescr} ({_profile.Description})\"", - "", - "-- The hierarchy of types that this vehicle is; mostly used to check access restrictions", - "vehicle_types = " + - _skeleton.ToLua(new Constant(_profile.VehicleTyps.Select(v => new Constant(v)).ToArray())) - }; - - var tests = ""; - if (_includeTests) { - var testPrinter = new LuaTestPrinter(_skeleton, - new List { "unitTestProfile2" }); - tests = testPrinter.GenerateFullTestSuite( - _behaviourTestSuite.ToList(), - new List(), - true) + "\n\n" + TestRunner(); - } - - var all = new List - { - header.Lined(), - "", - GenerateMainFunction(), - "", - GenerateFactorFunction(), - "", - GenerateTurnCostFunction(), - "", - _parameterPrinter.GenerateDefaultParameters(), - "", - "", - string.Join("\n\n", _skeleton.GenerateFunctions()), - "", - string.Join("\n\n", _skeleton.GenerateDependencies()), // Should be AFTER generating the main function! - "", - string.Join("\n\n", _skeleton.GenerateConstants()), - "", - tests }; return all.Lined(); diff --git a/AspectedRouting/IO/itinero2/Relations.md b/AspectedRouting/IO/itinero2/Relations.md deleted file mode 100644 index 2f0f8f2..0000000 --- a/AspectedRouting/IO/itinero2/Relations.md +++ /dev/null @@ -1,3 +0,0 @@ -# What about relations in Itinero 2.0? - -Relations have moved to the preprocessor, where they do put a tag on the members of the relation. This is done with a TagsFilter \ No newline at end of file diff --git a/AspectedRouting/IO/jsonParser/JsonParser.ParseAspectProfile.cs b/AspectedRouting/IO/jsonParser/JsonParser.ParseAspectProfile.cs index 0077401..f681bdc 100644 --- a/AspectedRouting/IO/jsonParser/JsonParser.ParseAspectProfile.cs +++ b/AspectedRouting/IO/jsonParser/JsonParser.ParseAspectProfile.cs @@ -24,12 +24,9 @@ namespace AspectedRouting.IO.jsonParser return null; } - Console.Write("Parsing " + fileName + "... "); + Console.WriteLine("Parsing " + fileName); - var aspect = doc.RootElement.ParseAspect(fileName, c); - - Console.WriteLine($"\rAspect {aspect.Name} has type {string.Join(",", aspect.ExpressionImplementation.Types)}"); - return aspect; + return doc.RootElement.ParseAspect(fileName, c); } catch (Exception e) { @@ -93,29 +90,16 @@ namespace AspectedRouting.IO.jsonParser filepath + " is not a valid profile; it does not contain the obligated parameter " + name); } - var defaultParameters = e.GetProperty("defaults").ParseParameters(); - - var contextWithParameters = new Context(context); - foreach (var (paramName, paramExpression) in defaultParameters) - { - if (!context.Parameters.TryGetValue(paramName, out var previousParam)) - { - contextWithParameters.AddParameter(paramName, paramExpression); - } - } - var vehicleTypes = GetTopProperty("vehicletypes").EnumerateArray().Select( el => el.GetString()).ToList(); var metadata = GetTopProperty("metadata").EnumerateArray().Select( el => el.GetString()).ToList(); - var access = ParseProfileProperty(e, contextWithParameters, "access").Finalize(); - var oneway = ParseProfileProperty(e, contextWithParameters, "oneway").Finalize(); - var speed = ParseProfileProperty(e, contextWithParameters, "speed").Finalize(); - var scalingFactor = ParseProfileProperty(e, contextWithParameters, "scalingfactor", Funcs.Const.Apply(new Constant(1))).Finalize(); - var obstacle_access = ParseProfileProperty(e, contextWithParameters, "obstacleaccess", Funcs.Const.Apply(new Constant(new Var("any"), null))).Finalize(); - var obstacle_cost = ParseProfileProperty(e, contextWithParameters, "obstaclecost", Funcs.Const.Apply(new Constant(new Var("any0"), null))).Finalize(); + var access = ParseProfileProperty(e, context, "access").Finalize(); + var oneway = ParseProfileProperty(e, context, "oneway").Finalize(); + var speed = ParseProfileProperty(e, context, "speed").Finalize(); + IExpression TagsApplied(IExpression x) { @@ -168,22 +152,22 @@ namespace AspectedRouting.IO.jsonParser author, filepath?.DirectoryName ?? "unknown", vehicleTypes, - defaultParameters, + e.GetProperty("defaults").ParseParameters(), profiles, access, oneway, speed, - obstacle_access, obstacle_cost, weights, - scalingFactor, metadata, lastChange ); } - private static readonly IExpression _mconst = Funcs.EitherFunc.Apply(Funcs.Id, Funcs.Const); + private static readonly IExpression _mconst = + new Apply(new Apply(Funcs.EitherFunc, Funcs.Id), Funcs.Const); - private static readonly IExpression _mappingWrapper = Funcs.EitherFunc.Apply(Funcs.Id, Funcs.StringStringToTags); + private static readonly IExpression _mappingWrapper = + new Apply(new Apply(Funcs.EitherFunc, Funcs.Id), Funcs.StringStringToTags); private static IExpression ParseMapping(IEnumerable allArgs, Context context) { @@ -217,7 +201,7 @@ namespace AspectedRouting.IO.jsonParser { var simpleMapping = new Mapping(keys, exprs); - var wrapped = _mappingWrapper.Apply(simpleMapping); + var wrapped = (IExpression) new Apply(_mappingWrapper, simpleMapping); if (keys.Count == 1) { // We can interpret this directly without going through a list @@ -264,7 +248,7 @@ namespace AspectedRouting.IO.jsonParser var exprs = e.EnumerateArray().Select(json => Funcs.Either(Funcs.Id, Funcs.Const, json.ParseExpression(context))) .ToList(); - + var list = new Constant(exprs); return Funcs.Either(Funcs.Id, Funcs.ListDot, list); } @@ -311,20 +295,13 @@ namespace AspectedRouting.IO.jsonParser if (s.StartsWith("#")) { // This is a parameter, the type of it is free - if (context.Parameters.TryGetValue(s.Substring(1), out var param)) - { - return new Parameter(s).Specialize(param.Types); - - } - return new Parameter(s); } return new Constant(s); } - if (e.ValueKind == JsonValueKind.Null) - { + if (e.ValueKind == JsonValueKind.Null) { return new Constant(new Var("a"), null); } @@ -378,7 +355,7 @@ namespace AspectedRouting.IO.jsonParser foreach (var argName in func.ArgNames.GetRange(1, func.ArgNames.Count - 1)) - // We skip the first argument, that one is already added + // We skip the first argument, that one is already added { args.Add(allExprs[argName]); } @@ -408,7 +385,7 @@ namespace AspectedRouting.IO.jsonParser if (!prop.Name.StartsWith("$")) continue; - var f = (IExpression)Funcs.BuiltinByName(prop.Name); + var f = (IExpression) Funcs.BuiltinByName(prop.Name); if (f == null || f.Types.Count() == 0) { throw new KeyNotFoundException($"The builtin function {prop.Name} was not found"); @@ -437,7 +414,7 @@ namespace AspectedRouting.IO.jsonParser // It gets an extra argument injected var neededKeys = fArg.PossibleTags().Keys.ToList(); var neededKeysArg = new Constant(new ListType(Typs.String), neededKeys); - f = f.Apply(new[] { neededKeysArg }); + f = f.Apply(new[] {neededKeysArg}); } var appliedDot = new Apply(new Apply(Funcs.Dot, f), fArg); @@ -527,7 +504,7 @@ namespace AspectedRouting.IO.jsonParser $"filename is {filepath}, declared name is {name}"); } - var keys = (IEnumerable)expr.PossibleTags()?.Keys ?? new List(); + var keys = (IEnumerable) expr.PossibleTags()?.Keys ?? new List(); foreach (var key in keys) { if (!key.Trim().Equals(key)) @@ -536,6 +513,7 @@ namespace AspectedRouting.IO.jsonParser } } + Console.WriteLine($"Aspect {name} has type {string.Join(",", expr.Types)}"); return new AspectMetadata( expr, name, diff --git a/AspectedRouting/IO/jsonParser/JsonParser.cs b/AspectedRouting/IO/jsonParser/JsonParser.cs index 4a6bcb3..b757519 100644 --- a/AspectedRouting/IO/jsonParser/JsonParser.cs +++ b/AspectedRouting/IO/jsonParser/JsonParser.cs @@ -1,83 +1,60 @@ using System; using System.Collections.Generic; using System.Linq; -using System.Runtime.CompilerServices; using System.Text.Json; using AspectedRouting.Language; using AspectedRouting.Language.Functions; using AspectedRouting.Language.Typ; -[assembly: InternalsVisibleTo("AspectedRouting.Test")] namespace AspectedRouting.IO.jsonParser { public static partial class JsonParser { - internal static IExpression ParseProfileProperty(JsonElement e, Context c, string property, IExpression defaultExpression = null) + private static IExpression ParseProfileProperty(JsonElement e, Context c, string property) { - if (!e.TryGetProperty(property, out var prop)) - { - if (defaultExpression == null) - { - throw new ArgumentException("Not a valid profile: the declaration expression for '" + property + - "' is missing"); - } - - Console.Error.WriteLine("WARNING: no expression defined for " + property + ", using the default instead"); - return defaultExpression; + if (!e.TryGetProperty(property, out var prop)) { + throw new ArgumentException("Not a valid profile: the declaration expression for '" + property + + "' is missing"); } - try - { + try { var expr = ParseExpression(prop, c); - if (!expr.Types.Any()) - { + if (!expr.Types.Any()) { throw new Exception($"Could not parse field {property}, no valid typing for expression found"); } - expr = expr.Optimize(out _); + expr = expr.Optimize(); expr = Funcs.Either(Funcs.Id, Funcs.Const, expr); var specialized = expr.Specialize(new Curry(Typs.Tags, new Var("a"))); - if (specialized == null) - { + if (specialized == null) { throw new ArgumentException("The expression for " + property + " hasn't the right type of 'Tags -> a'; it has types " + string.Join(",", expr.Types) + "\n" + expr.TypeBreakdown()); } - var pruned = specialized.PruneTypes(type => - { - if (!(type is Curry c)) - { + var pruned = specialized.PruneTypes(type => { + if (!(type is Curry c)) { return false; } - if (!Equals(c.ArgType, Typs.Tags)) - { + if (!Equals(c.ArgType, Typs.Tags)) { return false; } - if (c.ResultType is Curry) - { - return false; - } - - if (c.ResultType is ListType) - { + if (c.ResultType is Curry) { return false; } return true; }); - if (pruned.SpecializeToSmallestType().Types.Count() != 1) - { + if (pruned.SpecializeToSmallestType().Types.Count() != 1) { throw new ArgumentException("The expression for " + property + " hasn't the right type of 'Tags -> a'; it has multiple types " + string.Join(",", pruned.Types) + "\n" + pruned.TypeBreakdown()); } - return pruned.Optimize(out _); + return pruned.Optimize(); } - catch (Exception exc) - { + catch (Exception exc) { throw new Exception("While parsing the property " + property, exc); } } @@ -85,25 +62,20 @@ namespace AspectedRouting.IO.jsonParser private static Dictionary ParseParameters(this JsonElement e) { var ps = new Dictionary(); - foreach (var obj in e.EnumerateObject()) - { + foreach (var obj in e.EnumerateObject()) { var nm = obj.Name.TrimStart('#'); - if (nm == "") - { + if (nm == "") { // This is a comment - not a parameter! continue; } - switch (obj.Value.ValueKind) - { + switch (obj.Value.ValueKind) { case JsonValueKind.String: var v = obj.Value.ToString(); - if (v.Equals("yes") || v.Equals("no")) - { + if (v.Equals("yes") || v.Equals("no")) { ps[nm] = new Constant(Typs.Bool, v); } - else - { + else { ps[nm] = new Constant(v); } @@ -134,8 +106,7 @@ namespace AspectedRouting.IO.jsonParser private static string Get(this JsonElement json, string key) { - if (json.TryGetProperty(key, out var p)) - { + if (json.TryGetProperty(key, out var p)) { return p.GetString(); } @@ -144,8 +115,7 @@ namespace AspectedRouting.IO.jsonParser private static string TryGet(this JsonElement json, string key) { - if (json.TryGetProperty(key, out var p)) - { + if (json.TryGetProperty(key, out var p)) { return p.GetString(); } diff --git a/AspectedRouting/IO/lua/calculate_turn_cost_factor.lua b/AspectedRouting/IO/lua/calculate_turn_cost_factor.lua deleted file mode 100644 index 480585e..0000000 --- a/AspectedRouting/IO/lua/calculate_turn_cost_factor.lua +++ /dev/null @@ -1,42 +0,0 @@ ---[[ - - - Returns '0' if the turn is allowed and '-1' if the turn is forbidden. - Only used by itinero 2.0. - - The itinero 2.0 profile outputs a `turn_cost_factor` which immediately calls this one (see LuaPrinter2.MainFunction). - - Dependencies: str_split, containedIn -]] -function calculate_turn_cost_factor(attributes, vehicle_types) - - if (attributes["type"] ~= "restriction") then - -- not a turn restriction; no cost to turn, - return 0 - end - - for _, vehicle_type in pairs(vehicle_types) do - if (attributes["restriction:"..vehicle_type] ~= nil) then - -- There is a turn restriction specifically for one of our vehicle types! - return -1 - end - end - - if (attributes["restriction"] == nil) then - -- Not a turn restriction; no cost to turn - return 0 - end - if (attributes["except"] ~= nil) then - local except_types = str_split(attributes["except"],";") - for _, vehicle_type in pairs(vehicle_types) do - if (containedIn(except_types, vehicle_type)) then - -- This vehicle is exempt from this turn restriction - return 0 - end - end - end - - return -1 -end - - diff --git a/AspectedRouting/IO/lua/copy_tags.lua b/AspectedRouting/IO/lua/copy_tags.lua deleted file mode 100644 index 015f251..0000000 --- a/AspectedRouting/IO/lua/copy_tags.lua +++ /dev/null @@ -1,12 +0,0 @@ - ---[[ -copies all attributes from the source-table into the target-table, -but only if the key is listed in 'whitelist' (which is a set) -]] -function copy_tags(source, target, whitelist) - for k, v in pairs(source) do - if whitelist[k] then - target[k] = v - end - end -end \ No newline at end of file diff --git a/AspectedRouting/IO/lua/create_set.lua b/AspectedRouting/IO/lua/create_set.lua deleted file mode 100644 index 817b739..0000000 --- a/AspectedRouting/IO/lua/create_set.lua +++ /dev/null @@ -1,5 +0,0 @@ -function create_set(list) - local set = {} - for _, l in ipairs(list) do set[l] = true end - return set -end diff --git a/AspectedRouting/IO/lua/if_then_else_dotted.lua b/AspectedRouting/IO/lua/if_then_else_dotted.lua index 4e56a0f..018254e 100644 --- a/AspectedRouting/IO/lua/if_then_else_dotted.lua +++ b/AspectedRouting/IO/lua/if_then_else_dotted.lua @@ -14,6 +14,6 @@ function if_then_else_dotted(conditionf, thnf, elsef, arg) if (condition) then return applyIfNeeded(thnf, arg) else - return applyIfNeeded(elsef, arg) -- if no third parameter is given, 'else' will be nil + return applyIfNeeded(elsef, arg) -- if no third parameter is given, 'els' will be nil end end \ No newline at end of file diff --git a/AspectedRouting/IO/lua/is_null.lua b/AspectedRouting/IO/lua/is_null.lua deleted file mode 100644 index 2bb80b7..0000000 --- a/AspectedRouting/IO/lua/is_null.lua +++ /dev/null @@ -1,3 +0,0 @@ -function is_null(a) - return a == nil; -end \ No newline at end of file diff --git a/AspectedRouting/IO/lua/must_match.lua b/AspectedRouting/IO/lua/must_match.lua index f7cef60..f0d21c4 100644 --- a/AspectedRouting/IO/lua/must_match.lua +++ b/AspectedRouting/IO/lua/must_match.lua @@ -79,7 +79,7 @@ function must_match(needed_keys, table, tags, result) -- Now that we know for sure that every key matches, we add them all to the 'attributes_to_keep' if (result == nil) then - -- euhm, well, seems like we don't care about the attributes_to_keep; early return! + -- euhm, well, seems like we don't are about the attributes_to_keep; early return! return true end for _, key in ipairs(needed_keys) do diff --git a/AspectedRouting/IO/lua/str_split.lua b/AspectedRouting/IO/lua/str_split.lua deleted file mode 100644 index c97c140..0000000 --- a/AspectedRouting/IO/lua/str_split.lua +++ /dev/null @@ -1,14 +0,0 @@ ---[[ - Splits a string on the specified character, e.g. - str_split("abc;def;ghi", ";") will result in a table ["abc","def","ghi"] -]] -function str_split (inputstr, sep) - if sep == nil then - sep = "%s" - end - local t={} - for str in string.gmatch(inputstr, "([^"..sep.."]+)") do - table.insert(t, str) - end - return t -end diff --git a/AspectedRouting/IO/lua/table_to_list.lua b/AspectedRouting/IO/lua/table_to_list.lua index 1316907..8729b88 100644 --- a/AspectedRouting/IO/lua/table_to_list.lua +++ b/AspectedRouting/IO/lua/table_to_list.lua @@ -10,15 +10,11 @@ function table_to_list(tags, result, factor_table) local f = mapping[v] if (f ~= nil) then table.insert(list, f); - if (result.attributes_to_keep ~= nil) then - result.attributes_to_keep[key] = v - end + result.attributes_to_keep[key] = v end else table.insert(list, mapping); - if (result.attributes_to_keep ~= nil) then - result.attributes_to_keep[key] = v - end + result.attributes_to_keep[key] = v end end end diff --git a/AspectedRouting/IO/lua/test.sh b/AspectedRouting/IO/lua/test.sh deleted file mode 100755 index d4a85c3..0000000 --- a/AspectedRouting/IO/lua/test.sh +++ /dev/null @@ -1,30 +0,0 @@ -#! /bin/bash - -echo "" > temp.lua - -for f in `ls` -do - if [[ $f != "temp.lua" && $f != "test.sh" && $f != "not.lua" ]] - then - cat $f >> temp.lua - echo -e "\n\n" >> temp.lua - fi -done - -cat << TESTCODE >> temp.lua - -print("------------ TESTS --------------") - -function expect(expected, actual) - if (actual ~= expected) then - print("Expected "..expected.." but got "..actual) - else - print("OK") - end -end - -expect(-1, calculate_turn_cost_factor({["type"] = "restriction", restriction = "no_left_turn"}, {})) -expect(0, calculate_turn_cost_factor({["type"] = "restriction", restriction = "no_left_turn", except="bicycle;cargo_bike"}, {"bicycle"})) -TESTCODE - -lua temp.lua diff --git a/AspectedRouting/IO/lua/unitTest.lua b/AspectedRouting/IO/lua/unitTest.lua index 8b19638..ced3250 100644 --- a/AspectedRouting/IO/lua/unitTest.lua +++ b/AspectedRouting/IO/lua/unitTest.lua @@ -5,7 +5,8 @@ function unit_test(f, fname, index, expected, parameters, tags) failed_tests = true return end - local actual = f(tags) + local result = {attributes_to_keep = {}} + local actual = f(parameters, tags, result) if(expected == "null" and actual == nil) then -- OK! elseif(tonumber(actual) and tonumber(expected) and math.abs(tonumber(actual) - tonumber(expected)) < 0.1) then diff --git a/AspectedRouting/IO/md/ProfileToMD.cs b/AspectedRouting/IO/md/ProfileToMD.cs deleted file mode 100644 index 18504ac..0000000 --- a/AspectedRouting/IO/md/ProfileToMD.cs +++ /dev/null @@ -1,245 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using AspectedRouting.Language; -using AspectedRouting.Language.Expression; -using AspectedRouting.Tests; - -namespace AspectedRouting.IO.md -{ - internal class MarkDownSection - { - private readonly List parts = new List(); - - public override string ToString() - { - return string.Join("\n\n", parts); - } - - public void AddTitle(string title, int level) - { - var str = ""; - for (var i = 0; i < level; i++) - { - str += "#"; - } - - str += " " + title; - parts.Add(str); - } - - public void Add(params string[] paragraph) - { - parts.Add(string.Join("\n", paragraph)); - } - - public void AddList(List items) - { - parts.Add(string.Join("\n", items.Select(i => " - " + i))); - } - } - - - public class ProfileToMD - { - private readonly string _behaviour; - private readonly Context _c; - private readonly ProfileMetaData _profile; - private readonly MarkDownSection md = new MarkDownSection(); - - public ProfileToMD(ProfileMetaData profile, string behaviour, Context c) - { - _profile = profile; - _behaviour = behaviour; - _c = c.WithAspectName(behaviour); - _c.DefinedFunctions["speed"] = new AspectMetadata(profile.Speed, "speed", "The speed this vehicle is going", - "", "km/h", "", true); - if (!profile.Behaviours.ContainsKey(behaviour)) - { - throw new ArgumentException("Profile does not contain behaviour " + behaviour); - } - } - - private decimal R(double d) - { - return Math.Round((decimal)d, 2); - } - - /** - * Calculates an entry with `speed`, `priority` for the profile - */ - public string TableEntry(string msg, Dictionary tags, ProfileResult? reference, - bool nullOnSame = false) - { - var profile = _profile.Run(_c, _behaviour, tags); - if (!reference.HasValue) - { - return "| " + msg + " | " + profile.Speed + " | " + profile.Priority + " | "; - } - - if (reference.Equals(profile) && nullOnSame) - { - return null; - } - - return "| " + msg + " | " + R(profile.Speed) + " | " + - R(profile.Speed / reference.Value.Speed) + " | " + - R(profile.Priority) + " | " + R(profile.Priority / reference.Value.Priority) + " | " + - profile.Access + " | " + profile.Oneway; - } - - public void addTagsTable(ProfileResult reference, Dictionary> usedTags) - { - var p = _profile; - var b = _profile.Behaviours[_behaviour]; - - var tableEntries = new List(); - foreach (var (key, vals) in usedTags) - { - var values = vals; - if (values.Count == 0 && key == "maxspeed") - { - tableEntries.Add($" | {key}=* (example values below)"); - values = new HashSet { - "20", "30", "50", "70", "90", "120", "150" - }; - } - - if (values.Count == 0) - { - tableEntries.Add($" | {key}=*"); - } - - if (values.Count > 0) - { - foreach (var value in values) - { - var tags = new Dictionary - { - [key] = value - }; - var entry = TableEntry($"{key}={value} ", tags, reference); - if (entry == null) - { - continue; - } - - tableEntries.Add(entry); - } - } - } - - md.Add("| Tags | Speed (km/h) | speedfactor | Priority | priorityfactor | access | oneway | ", - "| ---- | ------------ | ----------- | -------- | --------------- | ----- | ------ |", - string.Join("\n", tableEntries)); - } - - public Dictionary TagsWithPriorityInfluence() - { - - var p = _profile; - var parameters = _profile.ParametersFor(_behaviour); - var withInfluence = new Dictionary(); - - foreach (var kv in p.Priority) - { - if (parameters[kv.Key].Equals(0.0) || parameters[kv.Key].Equals(0)) - { - continue; - } - - withInfluence[kv.Key] = kv.Value; - } - - return withInfluence; - } - - - public string MainFormula() - { - var p = _profile; - var b = _profile.Behaviours[_behaviour]; - - var overridenParams = new HashSet(); - var paramValues = new Dictionary(); - foreach (var kv in p.DefaultParameters) - { - paramValues[kv.Key] = kv.Value.Evaluate(_c); - } - - foreach (var kv in b) - { - paramValues[kv.Key] = kv.Value.Evaluate(_c); - overridenParams.Add(kv.Key); - } - - var mainFormulaParts = p.Priority.Select(delegate (KeyValuePair kv) - { - var key = kv.Key; - var param = paramValues[key]; - if (param.Equals(0) || param.Equals(0.0)) - { - return ""; - } - - if (overridenParams.Contains(key)) - { - param = "**" + param + "**"; - } - - - var called = kv.Value.DirectlyCalled(); - return param + " * `" + string.Join("", called.calledFunctionNames) + "`"; - }); - - var mainFormula = string.Join(" + ", mainFormulaParts.Where(p => p != "")); - return mainFormula; - } - - public override string ToString() - { - var p = _profile; - var b = _profile.Behaviours[_behaviour]; - md.AddTitle($"[{_profile.Name}](./{_profile.Name}.md).{_behaviour}", 1); - - md.Add(p.Description); - - if (b.ContainsKey("description")) - { - md.Add(b["description"].Evaluate(_c).ToString()); - } - - - md.Add("This profile is calculated as following (non-default keys are bold):", MainFormula()); - - var residentialTags = new Dictionary - { - ["highway"] = "residential" - }; - - md.Add("| Tags | Speed (km/h) | Priority", - "| ---- | ----- | ---------- | ", - TableEntry("Residential highway (reference)", residentialTags, null)); - var reference = _profile.Run(_c, _behaviour, residentialTags); - md.AddTitle("Tags influencing priority", 2); - md.Add( - "Priority is what influences which road to take. The routeplanner will search a way where `1/priority` is minimal."); - addTagsTable(reference, TagsWithPriorityInfluence().Values.PossibleTagsRecursive(_c)); - - md.AddTitle("Tags influencing speed", 2); - md.Add( - "Speed is used to calculate how long the trip will take, but does _not_ influence which route is taken. Some profiles do use speed as a factor in priority too - in this case, these tags will be mentioned above too."); - addTagsTable(reference, _profile.Speed.PossibleTagsRecursive(_c)); - - md.AddTitle("Tags influencing access", 2); - md.Add("These tags influence whether or not this road can be taken with this vehicle or behaviour"); - addTagsTable(reference, _profile.Access.PossibleTagsRecursive(_c)); - md.AddTitle("Tags influencing oneway", 2); - md.Add("These tags influence whether or not this road can be taken in all directions or not"); - addTagsTable(reference, _profile.Oneway.PossibleTagsRecursive(_c)); - - - return md.ToString(); - } - } -} \ No newline at end of file diff --git a/AspectedRouting/IO/md/Readme.part0.md b/AspectedRouting/IO/md/Readme.part0.md index 5305a65..01ef155 100644 --- a/AspectedRouting/IO/md/Readme.part0.md +++ b/AspectedRouting/IO/md/Readme.part0.md @@ -2,8 +2,7 @@ ## Introduction -Generating a good route for travellers is hard; especially for cyclists. They can be very picky and the driving style -and purposes are diverse. Think about: +Generating a good route for travellers is hard; especially for cyclists. They can be very picky and the driving style and purposes are diverse. Think about: - A lightweight food delivery driver, who wants to be at their destination as soon as possible - A cargo bike, possibly with a cart or electrically supported, doing heavy delivery @@ -11,18 +10,13 @@ and purposes are diverse. Think about: - Grandma cycling along a canal on sunday afternoon - Someone bringing their kids to school -It is clear that these persona's on top have very different wishes for their route. A road with a high car pressure -won't pose a problem for the food delivery, whereas grandma wouldn't even think about going there. And this is without -mentioning the speed these cyclists drive, where they are allowed to drive, ... +It is clear that these persona's on top have very different wishes for their route. A road with a high car pressure won't pose a problem for the food delivery, whereas grandma wouldn't even think about going there. And this is without mentioning the speed these cyclists drive, where they are allowed to drive, ... -Generating a cycle route for these persons is thus clearly far from simply picking the shortest possible path. On top of -that, a consumer expects the route calculations to be both customizable and to be blazingly fast. +Generating a cycle route for these persons is thus clearly far from simply picking the shortest possible path. On top of that, a consumer expects the route calculations to be both customizable and to be blazingly fast. In order to simplify the generation of these routing profiles, this repository introduces _aspected routing_. -In _aspected routing_, one does not try to tackle the routing problem all at once, but one tries to dissassemble the -preferences of the travellers into multiple, orthogonal aspects. These aspects can then be combined in a linear way, -giving a fast and flexible system. +In _aspected routing_, one does not try to tackle the routing problem all at once, but one tries to dissassemble the preferences of the travellers into multiple, orthogonal aspects. These aspects can then be combined in a linear way, giving a fast and flexible system. Some aspects can be: @@ -44,12 +38,9 @@ Even though this repository is heavily inspired on OpenStreetMap, it can be gene ## Road network assumptions -The only assumptions made are that roads have a **length** and a collection of **tags**, this is a dictionary mapping -strings onto strings. These tags encode the properties of the road (e.g. road classification, name, surface, ...) +The only assumptions made are that roads have a **length** and a collection of **tags**, this is a dictionary mapping strings onto strings. These tags encode the properties of the road (e.g. road classification, name, surface, ...) -OpenStreetMap also has a concept of **relations**. A special function is available for that. However, in a preprocessing -step, the relations that a road is a member of, are converted into tags on every way with a `_network:i:key=value` -format, where `i` is the number of the relation, and `key`=`value` is a tag present on the relation. +OpenStreetMap also has a concept of **relations**. A special function is available for that. However, in a preprocessing step, the relations that a road is a member of, are converted into tags on every way with a `_network:i:key=value` format, where `i` is the number of the relation, and `key`=`value` is a tag present on the relation. ## Describing an aspect diff --git a/AspectedRouting/IO/md/helpText.md b/AspectedRouting/IO/md/helpText.md index 0360cb2..9aa801e 100644 --- a/AspectedRouting/IO/md/helpText.md +++ b/AspectedRouting/IO/md/helpText.md @@ -7,7 +7,6 @@ - string - tags - bool - ## Builtin functions - eq @@ -38,6 +37,7 @@ - eitherFunc - stringToTags + ### Function overview #### eq @@ -49,6 +49,8 @@ $a | $a | string | Returns 'yes' if both values _are_ the same + + Lua implementation: ````lua @@ -62,6 +64,7 @@ end ```` + #### notEq a | b | returns | @@ -72,6 +75,8 @@ bool | bool | OVerloaded function, either boolean not or returns 'yes' if the two passed in values are _not_ the same; + + Lua implementation: ````lua @@ -88,6 +93,7 @@ function notEq(a, b) end ```` + #### not a | b | returns | @@ -98,6 +104,8 @@ bool | bool | OVerloaded function, either boolean not or returns 'yes' if the two passed in values are _not_ the same; + + Lua implementation: ````lua @@ -114,6 +122,7 @@ function notEq(a, b) end ```` + #### inv d | returns | @@ -123,6 +132,8 @@ double | double | Calculates `1/d` + + Lua implementation: ````lua @@ -131,6 +142,7 @@ function inv(n) end ```` + #### default defaultValue | f | returns | @@ -139,6 +151,8 @@ $a | $b -> $a | $b | $a | Calculates function `f` for the given argument. If the result is `null`, the default value is returned instead + + Lua implementation: ````lua @@ -150,6 +164,7 @@ function default(defaultValue, realValue) end ```` + #### parse s | returns | @@ -159,6 +174,8 @@ string | pdouble | Parses a string into a numerical value + + Lua implementation: ````lua @@ -191,6 +208,7 @@ function parse(string) end ```` + #### to_string obj | returns | @@ -199,6 +217,8 @@ $a | string | Converts a value into a human readable string + + Lua implementation: ````lua @@ -207,6 +227,7 @@ function to_string(o) end ```` + #### concat a | b | returns | @@ -215,6 +236,8 @@ string | string | string | Concatenates two strings + + Lua implementation: ````lua @@ -223,6 +246,7 @@ function concat(a, b) end ```` + #### containedIn list | a | returns | @@ -231,6 +255,8 @@ list ($a) | $a | bool | Given a list of values, checks if the argument is contained in the list. + + Lua implementation: ````lua @@ -245,6 +271,7 @@ function containedIn(list, a) end ```` + #### min list | returns | @@ -257,6 +284,8 @@ list (bool) | bool | Out of a list of values, gets the smallest value. IN case of a list of bools, this acts as `and` + + Lua implementation: ````lua @@ -274,6 +303,7 @@ function min(list) end ```` + #### and list | returns | @@ -286,6 +316,8 @@ list (bool) | bool | Out of a list of values, gets the smallest value. IN case of a list of bools, this acts as `and` + + Lua implementation: ````lua @@ -303,6 +335,7 @@ function min(list) end ```` + #### max list | returns | @@ -315,6 +348,8 @@ list (bool) | bool | Returns the biggest value in the list. For a list of booleans, this acts as 'or' + + Lua implementation: ````lua @@ -332,6 +367,7 @@ function max(list) end ```` + #### or list | returns | @@ -344,6 +380,8 @@ list (bool) | bool | Returns the biggest value in the list. For a list of booleans, this acts as 'or' + + Lua implementation: ````lua @@ -361,6 +399,7 @@ function max(list) end ```` + #### sum list | returns | @@ -373,6 +412,8 @@ list (bool) | int | Sums all the numbers in the given list. If the list contains bool, `yes` or `true` will be considered to equal `1` + + Lua implementation: ````lua @@ -388,6 +429,7 @@ function sum(list) end ```` + #### multiply list | returns | @@ -400,6 +442,8 @@ list (bool) | bool | Multiplies all the values in a given list. On a list of booleans, this acts as 'and' or 'all' + + Lua implementation: ````lua @@ -412,6 +456,7 @@ function multiply(list) end ```` + #### firstMatchOf s | returns | @@ -420,6 +465,8 @@ list (string) | tags -> list ($a) | tags | $a | Parses a string into a numerical value + + Lua implementation: ````lua @@ -445,15 +492,18 @@ function first_match_of(tags, result, order_of_keys, table) end ```` + #### mustMatch neededKeys (filled in by parser) | f | returns | --- | --- | --- | list (string) | tags -> list (bool) | tags | bool | -Every key that is used in the subfunction must be present. If, on top, a value is present with a mapping, every -key/value will be executed and must return a value that is not 'no' or 'false' Note that this is a privileged builtin -function, as the parser will automatically inject the keys used in the called function. +Every key that is used in the subfunction must be present. +If, on top, a value is present with a mapping, every key/value will be executed and must return a value that is not 'no' or 'false' +Note that this is a privileged builtin function, as the parser will automatically inject the keys used in the called function. + + Lua implementation: @@ -522,6 +572,7 @@ function must_match(tags, result, needed_keys, table) end ```` + #### memberOf f | tags | returns | @@ -535,18 +586,15 @@ In order to use this for itinero 1.0, the membership _must_ be the top level exp Conceptually, when the aspect is executed for a way, every relation will be used as argument in the subfunction `f` If this subfunction returns 'true', the entire aspect will return true. -In the lua implementation for itinero 1.0, this is implemented slightly different: a -flag `_relation:="yes"` will be set if the aspect matches on every way for where this aspect matches. -However, this plays poorly with parameters (e.g.: what if we want to cycle over a highway which is part of a certain -cycling network with a certain `#network_name`?) Luckily, parameters can only be simple values. To work around this -problem, an extra tag is introduced for _every single -profile_:`_relation::=yes'. The subfunction is thus executed `countOr(relations) * countOf( -profiles)` time, yielding `countOf( -profiles)` tags. The profile function then picks the tags for himself and strips the `:` away from the -key. +In the lua implementation for itinero 1.0, this is implemented slightly different: a flag `_relation:="yes"` will be set if the aspect matches on every way for where this aspect matches. +However, this plays poorly with parameters (e.g.: what if we want to cycle over a highway which is part of a certain cycling network with a certain `#network_name`?) Luckily, parameters can only be simple values. To work around this problem, an extra tag is introduced for _every single profile_:`_relation::=yes'. The subfunction is thus executed `countOr(relations) * countOf(profiles)` time, yielding `countOf(profiles)` tags. The profile function then picks the tags for himself and strips the `:` away from the key. + + In the test.csv, one can simply use `_relation:=yes` to mimic relations in your tests + + Lua implementation: ````lua @@ -562,6 +610,7 @@ function member_of(calledIn, parameters, tags, result) end ```` + #### if_then_else condition | then | else | returns | @@ -569,8 +618,9 @@ condition | then | else | returns | bool | $a | $a | $a | bool | $a | $a | -Selects either one of the branches, depending on the condition.If the `else` branch is not set, `null` is returned in -the condition is false. +Selects either one of the branches, depending on the condition.If the `else` branch is not set, `null` is returned in the condition is false. + + Lua implementation: @@ -584,6 +634,7 @@ function if_then_else(condition, thn, els) end ```` + #### if condition | then | else | returns | @@ -591,8 +642,9 @@ condition | then | else | returns | bool | $a | $a | $a | bool | $a | $a | -Selects either one of the branches, depending on the condition.If the `else` branch is not set, `null` is returned in -the condition is false. +Selects either one of the branches, depending on the condition.If the `else` branch is not set, `null` is returned in the condition is false. + + Lua implementation: @@ -606,6 +658,7 @@ function if_then_else(condition, thn, els) end ```` + #### id a | returns | @@ -614,6 +667,8 @@ $a | $a | Returns the argument unchanged - the identity function. Seems useless at first sight, but useful in parsing + + Lua implementation: ````lua @@ -622,6 +677,7 @@ function id(v) end ```` + #### const a | b | returns | @@ -630,6 +686,8 @@ $a | $b | $a | Small utility function, which takes two arguments `a` and `b` and returns `a`. Used extensively to insert freedom + + Lua implementation: ````lua @@ -638,6 +696,7 @@ function const(a, b) end ```` + #### constRight a | b | returns | @@ -646,20 +705,24 @@ $a | $b | $b | Small utility function, which takes two arguments `a` and `b` and returns `b`. Used extensively to insert freedom + + Lua implementation: ````lua ```` + #### dot f | g | a | returns | --- | --- | --- | --- | $b -> $c | $a -> $b | $a | $c | -Higher order function: converts `f (g a)` into `(dot f g) a`. In other words, this fuses `f` and `g` in a new function, -which allows the argument to be lifted out of the expression +Higher order function: converts `f (g a)` into `(dot f g) a`. In other words, this fuses `f` and `g` in a new function, which allows the argument to be lifted out of the expression + + Lua implementation: @@ -667,14 +730,16 @@ Lua implementation: ```` + #### listDot list | a | returns | --- | --- | --- | list ($a -> $b) | $a | list ($b) | -Listdot takes a list of functions `[f, g, h]` and and an argument `a`. It applies the argument on every single -function.It conveniently lifts the argument out of the list. +Listdot takes a list of functions `[f, g, h]` and and an argument `a`. It applies the argument on every single function.It conveniently lifts the argument out of the list. + + Lua implementation: @@ -683,6 +748,7 @@ Lua implementation: -- listDot ```` + #### eitherFunc f | g | a | returns | @@ -690,24 +756,21 @@ f | g | a | returns | $a -> $b | $c -> $d | $a | $b | $a -> $b | $c -> $d | $c | $d | -EitherFunc is a small utility function, mostly used in the parser. It allows the compiler to choose a function, based on -the types. +EitherFunc is a small utility function, mostly used in the parser. It allows the compiler to choose a function, based on the types. -Consider the mapping `{'someKey':'someValue'}`. Under normal circumstances, this acts as a pointwise-function, -converting the string `someKey` into `someValue`, just like an ordinary dictionary would do. However, in the context -of `mustMatch`, we would prefer this to act as a _check_, that the highway _has_ a key `someKey` which is `someValue`, -thus acting -as `{'someKey': {'$eq':'someValue'}}`. Both behaviours are automatically supported in parsing, by parsing the string as `( -eitherFunc id eq) 'someValue'`. The type system is then able to figure out which implementation is needed. +Consider the mapping `{'someKey':'someValue'}`. Under normal circumstances, this acts as a pointwise-function, converting the string `someKey` into `someValue`, just like an ordinary dictionary would do. However, in the context of `mustMatch`, we would prefer this to act as a _check_, that the highway _has_ a key `someKey` which is `someValue`, thus acting as `{'someKey': {'$eq':'someValue'}}. Both behaviours are automatically supported in parsing, by parsing the string as `(eitherFunc id eq) 'someValue'`. The type system is then able to figure out which implementation is needed. Disclaimer: _you should never ever need this in your profiles_ + + Lua implementation: ````lua ```` + #### stringToTags f | tags | returns | @@ -716,6 +779,8 @@ string -> string -> $a | tags | list ($a) | stringToTags converts a function `string -> string -> a` into a function `tags -> [a]` + + Lua implementation: ````lua diff --git a/AspectedRouting/Language/Analysis.cs b/AspectedRouting/Language/Analysis.cs index 1a903b5..7257fe8 100644 --- a/AspectedRouting/Language/Analysis.cs +++ b/AspectedRouting/Language/Analysis.cs @@ -10,6 +10,7 @@ namespace AspectedRouting.Language { public static class Analysis { + public static Dictionary Types, string inFunction)> UsedParameters( this ProfileMetaData profile, Context context) { @@ -31,7 +32,7 @@ namespace AspectedRouting.Language param.ParamName + " is used\n" + $" in {oldUsage} as {string.Join(",", types)}\n" + $" in {inFunction} as {string.Join(",", param.Types)}\n" + - "which can not be unified"); + $"which can not be unified"); } } else @@ -45,8 +46,6 @@ namespace AspectedRouting.Language AddParams(profile.Access, "profile definition for " + profile.Name + ".access"); AddParams(profile.Oneway, "profile definition for " + profile.Name + ".oneway"); AddParams(profile.Speed, "profile definition for " + profile.Name + ".speed"); - AddParams(profile.ObstacleAccess, "profile definition for " + profile.Name + ".obstacleaccess"); - AddParams(profile.ObstacleCost, "profile definition for " + profile.Name + ".obstaclecost"); foreach (var (key, expr) in profile.Priority) { @@ -158,7 +157,7 @@ namespace AspectedRouting.Language foreach (var fName in toCheck) { - queue.Enqueue(ctx.GetFunction(fName)); + queue.Enqueue(ctx.GetFunction(fName)); } } @@ -167,8 +166,7 @@ namespace AspectedRouting.Language /// - /// Generates an overview of the dependencies of the expression, both which parameters it needs and what other - /// functions (builtin or defined) it needs. + /// Generates an overview of the dependencies of the expression, both which parameters it needs and what other functions (builtin or defined) it needs. /// /// /// @@ -199,7 +197,8 @@ namespace AspectedRouting.Language public static string TypeBreakdown(this IExpression e) { - return e + " : " + string.Join(" ; ", e.Types); + + return e.ToString() + " : "+string.Join(" ; ", e.Types); } public static void SanityCheckProfile(this ProfileMetaData pmd, Context context) @@ -235,7 +234,7 @@ namespace AspectedRouting.Language if (unused.Any()) { Console.WriteLine("[WARNING] A default value is set for parameter, but it is unused: " + - string.Join(", ", unused)); + string.Join(", ", unused)); } var paramsUsedInBehaviour = new HashSet(); @@ -286,7 +285,6 @@ namespace AspectedRouting.Language Console.WriteLine( $"[{pmd.Name}] WARNING: Some parameters only have a default value: {string.Join(", ", defaultOnly)}"); } - } public static void SanityCheck(this IExpression e) @@ -296,19 +294,19 @@ namespace AspectedRouting.Language var order = new List(); var mapping = new List(); if (Deconstruct.UnApply( - Deconstruct.UnApply(Deconstruct.IsFunc(Funcs.FirstOf), Deconstruct.Assign(order)), - Deconstruct.Assign(mapping) - ).Invoke(expr)) + Deconstruct.UnApply(Deconstruct.IsFunc(Funcs.FirstOf), Deconstruct.Assign(order)), + Deconstruct.Assign(mapping) + ).Invoke(expr)) { - var expectedKeys = ((IEnumerable)order.First().Evaluate(null)).Select(o => - { - if (o is IExpression x) + var expectedKeys = ((IEnumerable) order.First().Evaluate(null)).Select(o => { - return (string)x.Evaluate(null); - } + if (o is IExpression x) + { + return (string) x.Evaluate(null); + } - return (string)o; - }) + return (string) o; + }) .ToHashSet(); var actualKeys = mapping.First().PossibleTags().Keys; var missingInOrder = actualKeys.Where(key => !expectedKeys.Contains(key)).ToList(); @@ -340,12 +338,6 @@ namespace AspectedRouting.Language } - /** - * Returns all possible tags which are used in the given expression. - * - * If a tag might match a wildcard, an explicit '*' will be added to the collection. - * This is different from the _other_ possibleTags, which will return an empty set. - */ public static Dictionary> PossibleTags(this IEnumerable exprs) { var usedTags = new Dictionary>(); @@ -361,7 +353,6 @@ namespace AspectedRouting.Language { if (!usedTags.TryGetValue(key, out var collection)) { - // This is the first time we see this collection collection = new HashSet(); usedTags[key] = collection; } @@ -370,85 +361,15 @@ namespace AspectedRouting.Language { collection.Add(v); } - - if (values.Count == 0) - { - collection.Add("*"); - } } } return usedTags; } - public static Dictionary> PossibleTagsRecursive(this IEnumerable exprs, Context c) - { - var usedTags = new Dictionary>(); - foreach (var e in exprs) - { - var possibleTags = e.PossibleTagsRecursive(c); - - if (possibleTags != null) - { - foreach (var tag in possibleTags) - { - usedTags[tag.Key] = tag.Value; - } - } - } - return usedTags; - } - - public static Dictionary> PossibleTagsRecursive(this IExpression e, Context c) - { - var allExpr = new List(); - var queue = new Queue(); - queue.Enqueue(e); - do - { - var next = queue.Dequeue(); - allExpr.Add(next); - next.Visit(expression => - { - if (expression is FunctionCall fc) - { - var called = c.GetFunction(fc.CalledFunctionName); - queue.Enqueue(called); - } - - return true; - }); - } while (queue.Any()); - - var result = new Dictionary>(); - - foreach (var expression in allExpr) - { - var subTags = expression.PossibleTags(); - if (subTags == null) - { - continue; - } - - foreach (var kv in subTags) - { - if (!result.ContainsKey(kv.Key)) - { - result[kv.Key] = new HashSet(); - } - - foreach (var val in kv.Value) - { - result[kv.Key].Add(val); - } - } - } - - return result; - } - /// - /// Returns which tags are used in this calculation + /// Returns which tags are used in this calculation + /// /// /// /// A dictionary containing all possible values. An entry with an empty list indicates a wildcard @@ -522,8 +443,8 @@ namespace AspectedRouting.Language { var mapping = new List(); if (Deconstruct.UnApply(Deconstruct.IsFunc(Funcs.MemberOf), - Deconstruct.Assign(mapping) - ).Invoke(f)) + Deconstruct.Assign(mapping) + ).Invoke(f)) { memberships.Add(calledIn, mapping.First()); return false; diff --git a/AspectedRouting/Language/Context.cs b/AspectedRouting/Language/Context.cs index 0ac1eea..3563785 100644 --- a/AspectedRouting/Language/Context.cs +++ b/AspectedRouting/Language/Context.cs @@ -34,11 +34,6 @@ namespace AspectedRouting.Language Parameters.Add(name, new Constant(value)); } - public void AddParameter(string name, IExpression value) - { - Parameters.Add(name, value); - } - public void AddFunction(string name, AspectMetadata function) { if (Funcs.Builtins.ContainsKey(name)) diff --git a/AspectedRouting/Language/Deconstruct.cs b/AspectedRouting/Language/Deconstruct.cs index 702b6bc..75c8d4b 100644 --- a/AspectedRouting/Language/Deconstruct.cs +++ b/AspectedRouting/Language/Deconstruct.cs @@ -17,8 +17,7 @@ namespace AspectedRouting.Language /// public static (IExpression f, List args)? DeconstructApply(this IExpression e) { - if (!(e is Apply _)) - { + if (!(e is Apply _)) { return null; } @@ -26,8 +25,7 @@ namespace AspectedRouting.Language var fs = new List(); - while (UnApply(Assign(fs), Assign(argss)).Invoke(e)) - { + while (UnApply(Assign(fs), Assign(argss)).Invoke(e)) { e = fs.First(); fs.Clear(); } @@ -39,10 +37,8 @@ namespace AspectedRouting.Language public static Func IsMapping(List collect) { - return e => - { - if (e is Mapping m) - { + return e => { + if (e is Mapping m) { collect.Add(m); return true; } @@ -51,24 +47,10 @@ namespace AspectedRouting.Language }; } - public static Func IsConstant(List collect) - { - return e => - { - if (!(e is Constant c)) - { - return false; - } - - collect.Add(c); - return true; - }; - } public static Func Assign(List collect) { - return e => - { + return e => { collect.Add(e); return true; }; @@ -76,10 +58,8 @@ namespace AspectedRouting.Language public static Func IsFunc(Function f) { - return e => - { - if (!(e is Function fe)) - { + return e => { + if (!(e is Function fe)) { return false; } @@ -87,21 +67,6 @@ namespace AspectedRouting.Language }; } - - public static Func IsFunctionCall(List names) - { - return e => - { - if (!(e is FunctionCall fc)) - { - return false; - } - - names.Add(fc.CalledFunctionName); - return true; - }; - } - public static Func UnApplyAny( Func matchFunc, Func matchArg) @@ -114,28 +79,21 @@ namespace AspectedRouting.Language Func matchArg, bool matchAny = false) { - return e => - { - if (!(e is Apply apply)) - { + return e => { + if (!(e is Apply apply)) { return false; } - foreach (var (_, (f, a)) in apply.FunctionApplications) - { + foreach (var (_, (f, a)) in apply.FunctionApplications) { var doesMatch = matchFunc.Invoke(f) && matchArg.Invoke(a); - if (matchAny) - { - if (doesMatch) - { + if (matchAny) { + if (doesMatch) { return true; } } - else - { - if (!doesMatch) - { - // All must match - otherwise we might have registered a wrong collection + else { + if (!doesMatch) { + // All must match - otherwise we might have registered a wrong collectiin return false; } } diff --git a/AspectedRouting/Language/Expression/Apply.cs b/AspectedRouting/Language/Expression/Apply.cs index 61c4fc5..b1d8e37 100644 --- a/AspectedRouting/Language/Expression/Apply.cs +++ b/AspectedRouting/Language/Expression/Apply.cs @@ -19,8 +19,6 @@ namespace AspectedRouting.Language.Expression /// public readonly Dictionary FunctionApplications; - private IExpression optimizedForm = null; - private Apply(string debugInfo, Dictionary argument) { _debugInfo = debugInfo; @@ -29,18 +27,15 @@ namespace AspectedRouting.Language.Expression public Apply(IExpression f, IExpression argument) { - if (f == null || argument == null) - { + if (f == null || argument == null) { throw new NullReferenceException(); } FunctionApplications = new Dictionary(); var typesCleaned = argument.Types.RenameVars(f.Types).ToList(); - foreach (var funcType in f.Types) - { - if (!(funcType is Curry c)) - { + foreach (var funcType in f.Types) { + if (!(funcType is Curry c)) { continue; } @@ -48,12 +43,10 @@ namespace AspectedRouting.Language.Expression var expectedResultType = c.ResultType; - foreach (var argType in typesCleaned) - { + foreach (var argType in typesCleaned) { // we try to unify the argType with the expected type var substitutions = expectedArgType.UnificationTable(argType); - if (substitutions == null) - { + if (substitutions == null) { continue; } @@ -63,30 +56,25 @@ namespace AspectedRouting.Language.Expression var actualFunction = f.Specialize(new Curry(actualArgType, actualResultType)); var actualArgument = argument.Specialize(actualArgType); - if (actualFunction == null || actualArgument == null) - { + if (actualFunction == null || actualArgument == null) { continue; } - - if (FunctionApplications.ContainsKey(actualResultType)) - { + if (FunctionApplications.ContainsKey(actualResultType)) { continue; } + FunctionApplications.Add(actualResultType, (actualFunction, actualArgument)); } } - if (!FunctionApplications.Any()) - { - try - { - _debugInfo = $"\n{f.Optimize(out var _).TypeBreakdown().Indent()}\n" + + if (!FunctionApplications.Any()) { + try { + _debugInfo = $"\n{f.Optimize().TypeBreakdown().Indent()}\n" + "is given the argument: " + - "(" + argument.Optimize(out var _).TypeBreakdown() + ")"; + "(" + argument.Optimize().TypeBreakdown() + ")"; } - catch (Exception) - { + catch (Exception) { _debugInfo = $"\n (NO OPT) {f.TypeBreakdown().Indent()}\n" + "is given the argument: " + "(" + argument.TypeBreakdown() + ")"; @@ -102,8 +90,7 @@ namespace AspectedRouting.Language.Expression public object Evaluate(Context c, params IExpression[] arguments) { - if (!Types.Any()) - { + if (!Types.Any()) { throw new ArgumentException("Trying to invoke an invalid expression: " + this); } @@ -114,8 +101,7 @@ namespace AspectedRouting.Language.Expression var arg = argExpr; var allArgs = new IExpression[arguments.Length + 1]; allArgs[0] = arg; - for (var i = 0; i < arguments.Length; i++) - { + for (var i = 0; i < arguments.Length; i++) { allArgs[i + 1] = arguments[i]; } @@ -128,42 +114,23 @@ namespace AspectedRouting.Language.Expression return Specialize(allowedTypes); } - public IExpression PruneTypes(System.Func allowedTypes) + public IExpression PruneTypes(Func allowedTypes) { - var passed = FunctionApplications.Where(kv => allowedTypes.Invoke(kv.Key)); - if (!passed.Any()) - { + var passed = this.FunctionApplications.Where(kv => allowedTypes.Invoke(kv.Key)); + if (!passed.Any()) { return null; } - return new Apply("pruned", new Dictionary(passed)); } - public IExpression Optimize(out bool somethingChanged) + public IExpression Optimize() { - if (this.optimizedForm != null) - { - somethingChanged = this.optimizedForm != this; - return this.optimizedForm; - } - this.optimizedForm = this.OptimizeInternal(out somethingChanged); - if (!optimizedForm.Types.Any()) - { - throw new Exception("Optimizing " + this.ToString() + " failed: cannot be typechecked anymore"); - } - return this.optimizedForm; - } - - internal IExpression OptimizeInternal(out bool somethingChanged) - { - if (!Types.Any()) - { + if (Types.Count() == 0) { throw new ArgumentException("This application contain no valid types, so cannot be optimized" + this); } - somethingChanged = false; // (eitherfunc dot id) id - // => (const dot _) id => dot id => id + // => (const dot _) id => dot id => id // or => (constRight _ id) id => id id => id if ( UnApplyAny( @@ -180,37 +147,23 @@ namespace AspectedRouting.Language.Expression Any), IsFunc(Funcs.Id)), IsFunc(Funcs.Id) - ).Invoke(this)) - { - somethingChanged = true; + ).Invoke(this)) { return Funcs.Id; } - if (Types.Count() > 1) - { - // Too much types to optimize: we optimize the subparts instead + if (Types.Count() > 1) { + // Too much types to optimize var optimized = new Dictionary(); - foreach (var (resultType, (f, a)) in FunctionApplications) - { - var fOpt = f.Optimize(out var scf); - var aOpt = a.Optimize(out var sca); - somethingChanged |= scf || sca; + foreach (var (resultType, (f, a)) in FunctionApplications) { + var fOpt = f.Optimize(); + var aOpt = a.Optimize(); optimized.Add(resultType, (fOpt, aOpt)); } - if (somethingChanged) - { - return new Apply(_debugInfo, optimized); - } - - return this; + return new Apply(_debugInfo, optimized); } - - // At this point, we know there only is a single type; - // We can safely assume all the 'assign' will only match a single entry - { // id a => a var arg = new List(); @@ -218,40 +171,11 @@ namespace AspectedRouting.Language.Expression UnApplyAny( IsFunc(Funcs.Id), Assign(arg) - ).Invoke(this)) - { - var argOpt = arg.First().Optimize(out _); - somethingChanged = true; - return argOpt; + ).Invoke(this)) { + return arg.First(); } } - { - var exprs = new List(); - var arg = new List(); - // listDot ([f0, f1, f2, ...]) arg ---> [f0 arg, f1 arg, f2 arg, ...] - if (UnApply( - UnApply( - IsFunc(Funcs.ListDot), - IsConstant(exprs) - ), - Assign(arg) - ).Invoke(this)) - { - var a = arg.First(); - var c = exprs.First(); - if (c.Types.All(t => t is ListType)) - { - // The constant is a list - var o = (List)c.Get(); - somethingChanged = true; - return new Constant( - o.Select(e => e.Apply(a).Optimize(out var _)).ToList() - ); - } - // fallthrough! - } - } { // ifdotted fcondition fthen felse arg => if (fcondition arg) (fthen arg) (felse arg) @@ -270,104 +194,38 @@ namespace AspectedRouting.Language.Expression Assign(fthen)), Assign(felse)), Assign(arg) - ).Invoke(this)) - { + ).Invoke(this)) { var a = arg.First(); - somethingChanged = true; return Funcs.If.Apply( - fcondition.First().Apply(a).Optimize(out var _), - fthen.First().Apply(a).Optimize(out var _), - felse.First().Apply(a).Optimize(out var _) + fcondition.First().Apply(a), + fthen.First().Apply(a), + felse.First().Apply(a) ); } } { - // ifdotted fcondition fthen arg => if (fcondition arg) (fthen arg) (felse arg) - var fcondition = new List(); - var fthen = new List(); - var arg = new List(); - - if ( - this.Types.Any(t => !(t is Curry)) && - UnApply( - UnApply( - UnApply( - IsFunc(Funcs.IfDotted), - Assign(fcondition)), - Assign(fthen)), - Assign(arg) - ).Invoke(this)) - { - var a = arg.First(); - somethingChanged = true; - return - Funcs.If.Apply( - fcondition.First().Apply(a).Optimize(out var _), - fthen.First().Apply(a).Optimize(out var _) - ).Specialize(this.Types).PruneTypes(t => !(t is Curry)).Optimize(out _); - } - } - - { - // (default x f) a --> if (isNull (f a)) x (f a) - var defaultArg = new List(); - var f = new List(); - var a = new List(); - if ( - UnApply( - UnApply( - UnApply( - IsFunc(Funcs.Default), - Assign(defaultArg) - ), - Assign(f) - - ), Assign(a) - ).Invoke(this)) - { - - somethingChanged = true; - var fa = f.First().Apply(a.First()).Optimize(out var _); - return Funcs.If.Apply( - Funcs.IsNull.Apply(fa) - ).Apply(defaultArg).Apply(fa); - } - } - - { - // The fallback case - // We couldn't optimize with a pattern, but the subparts might be optimizable var (f, a) = FunctionApplications.Values.First(); - var (newFa, expr) = OptimizeApplicationPair(f, a, out var changed); - if (expr != null) - { - somethingChanged = true; + var (newFa, expr) = OptimizeApplicationPair(f, a); + if (expr != null) { return expr; } - if (changed) - { - somethingChanged = true; - (f, a) = newFa.Value; - return new Apply(f, a).Optimize(out _); - } + (f, a) = newFa.Value; + return new Apply(f, a); } - return this; } public void Visit(Func visitor) { var continueVisit = visitor(this); - if (!continueVisit) - { + if (!continueVisit) { return; } - foreach (var (_, (f, a)) in FunctionApplications) - { + foreach (var (_, (f, a)) in FunctionApplications) { f.Visit(visitor); a.Visit(visitor); } @@ -377,13 +235,10 @@ namespace AspectedRouting.Language.Expression { var newArgs = new Dictionary(); - foreach (var allowedType in allowedTypes) - { - foreach (var (resultType, (funExpr, argExpr)) in FunctionApplications) - { + foreach (var allowedType in allowedTypes) { + foreach (var (resultType, (funExpr, argExpr)) in FunctionApplications) { var substitutions = resultType.UnificationTable(allowedType, true); - if (substitutions == null) - { + if (substitutions == null) { continue; } @@ -395,8 +250,7 @@ namespace AspectedRouting.Language.Expression var actualFunction = funExpr.Specialize(substitutions); var actualArgument = argExpr.Specialize(substitutions); - if (actualFunction == null || actualArgument == null) - { + if (actualFunction == null || actualArgument == null) { // One of the subexpressions can't be optimized return null; } @@ -405,47 +259,34 @@ namespace AspectedRouting.Language.Expression } } - if (!newArgs.Any()) - { + if (!newArgs.Any()) { return null; } return new Apply(_debugInfo, newArgs); } - private ((IExpression fOpt, IExpression fArg)?, IExpression result) OptimizeApplicationPair( - IExpression fRaw, - IExpression a, - out bool somethingChanged) + private ((IExpression fOpt, IExpression fArg)?, IExpression result) OptimizeApplicationPair(IExpression f, + IExpression a) { - somethingChanged = false; - var f = fRaw.Optimize(out var scf); - somethingChanged |= scf; + f = f.Optimize(); - if (f.Types.Count() == 0) - { - throw new ArgumentException("Optimizing " + f + " failed, no types returned. The original expression\n " + fRaw.ToString() + "has types" + string.Join("\n ", fRaw.Types)); - } + a = a.Optimize(); - a = a.Optimize(out var sca); - somethingChanged |= sca; - switch (f) - { + switch (f) { case Id _: return (null, a); case Apply apply: - if (apply.F is Const _) - { + if (apply.F is Const _) { // (const x) y -> y // apply == (const x) thus we return 'x' and ignore 'a' return (null, apply.A); } - if (apply.F is ConstRight _) - { + if (apply.F is ConstRight _) { // constRight x y -> y // apply == (constRight x) so we return a return (null, a); @@ -459,14 +300,12 @@ namespace AspectedRouting.Language.Expression Assign(f0) ), Assign(f1)).Invoke(apply) - ) - { + ) { // apply == ((dot f0) f1) // ((dot f0) f1) a is the actual expression, but arg is already split of // f0 (f1 arg) // which used to be (f0 . f1) arg - somethingChanged = true; return ((f0.First(), new Apply(f1.First(), a)), null); } @@ -479,82 +318,21 @@ namespace AspectedRouting.Language.Expression public override string ToString() { - if (!FunctionApplications.Any()) - { + if (!FunctionApplications.Any()) { return "NOT-TYPECHECKABLE APPLICATION: " + _debugInfo; } var (f, arg) = FunctionApplications.Values.First(); - if (f is Id _) - { + if (f is Id _) { return arg.ToString(); } var extra = ""; - if (FunctionApplications.Count() > 1) - { + if (FunctionApplications.Count() > 1) { extra = " [" + FunctionApplications.Count + " IMPLEMENTATIONS]"; } return $"({f} {arg.ToString().Indent()})" + extra; } - - public bool Equals(IExpression other) - { - if (!(other is Apply apply)) - { - return false; - } - - var otherOptions = apply.FunctionApplications; - if (otherOptions.Count != FunctionApplications.Count) - { - return false; - } - - foreach (var (type, (otherF, otherA)) in otherOptions) - { - if (!FunctionApplications.TryGetValue(type, out var tuple)) - { - return false; - } - - if (!otherF.Equals(tuple.f)) - { - return false; - } - - if (!otherA.Equals(tuple.a)) - { - return false; - } - } - - return true; - } - - public string Repr() - { - if (this.Types.Count() == 1) - { - var f = this.F.Repr().Replace("\n", "\n "); - var a = this.A.Repr().Replace("\n", "\n "); - - return $"new Apply( // {string.Join(" ; ", this.Types)}\n {f},\n {a})"; - } - - var r = "new Apply("; - - foreach (var (type, (f, a)) in this.FunctionApplications) - { - r += "\n // " + type + "\n"; - r += " | " + f.Repr().Replace("\n", "\n | ") + ",\n"; - r += " | " + a.Repr().Replace("\n", "\n | ") + "\n"; - } - - return r; - - } - } } \ No newline at end of file diff --git a/AspectedRouting/Language/Expression/AspectMetadata.cs b/AspectedRouting/Language/Expression/AspectMetadata.cs index edfa42a..49c09ab 100644 --- a/AspectedRouting/Language/Expression/AspectMetadata.cs +++ b/AspectedRouting/Language/Expression/AspectMetadata.cs @@ -32,6 +32,7 @@ namespace AspectedRouting.Language.Expression public object Evaluate(Context c, params IExpression[] arguments) { + return ExpressionImplementation.Evaluate(c, arguments); } @@ -42,29 +43,20 @@ namespace AspectedRouting.Language.Expression Name, Description, Author, Unit, Filepath); } - public IExpression PruneTypes(Func allowedTypes) + public IExpression PruneTypes(System.Func allowedTypes) { var e = ExpressionImplementation.PruneTypes(allowedTypes); - if (e == null) - { + if (e == null) { return null; } - return new AspectMetadata(e, Name, Description, Author, Unit, Filepath, ProfileInternal); } - public IExpression Optimize(out bool somethingChanged) + public IExpression Optimize() { - var optE = ExpressionImplementation.Optimize(out var sc); - somethingChanged = sc; - if (sc) - { - return new AspectMetadata(optE, - Name, Description, Author, Unit, Filepath); - } - - return this; + return new AspectMetadata(ExpressionImplementation.Optimize(), + Name, Description, Author, Unit, Filepath); } public void Visit(Func f) @@ -82,20 +74,5 @@ namespace AspectedRouting.Language.Expression { return $"# {Name}; {Unit} by {Author}\n\n# by {Author}\n# {Description}\n{ExpressionImplementation}"; } - - public bool Equals(IExpression other) - { - if (other is AspectMetadata amd) - { - return amd.ExpressionImplementation.Equals(ExpressionImplementation); - } - - return false; - } - - public string Repr() - { - return "Aspect_" + Name; - } } } \ No newline at end of file diff --git a/AspectedRouting/Language/Expression/Function.cs b/AspectedRouting/Language/Expression/Function.cs index d6c6a50..85a9e7b 100644 --- a/AspectedRouting/Language/Expression/Function.cs +++ b/AspectedRouting/Language/Expression/Function.cs @@ -37,17 +37,15 @@ namespace AspectedRouting.Language.Expression public IExpression PruneTypes(Func allowedTypes) { var passedTypes = this.Types.Where(allowedTypes); - if (!passedTypes.Any()) - { + if (!passedTypes.Any()) { return null; } return new FunctionCall(this.Name, passedTypes); } - public virtual IExpression Optimize(out bool somethingChanged) + public virtual IExpression Optimize() { - somethingChanged = false; return this; } @@ -73,9 +71,9 @@ namespace AspectedRouting.Language.Expression if (ArgNames == null) { - throw new Exception("ArgNames not set for " + Name); + throw new Exception("ArgNames not set for "+Name); } - + foreach (var n in ArgNames) { dict[n] = new List(); @@ -102,20 +100,5 @@ namespace AspectedRouting.Language.Expression return dict; } - - public bool Equals(IExpression other) - { - if (other is Function f) - { - return f.Name.Equals(this.Name); - } - - return false; - } - - public string Repr() - { - return "Funcs." + this.Name; - } } } \ No newline at end of file diff --git a/AspectedRouting/Language/Expression/FunctionCall.cs b/AspectedRouting/Language/Expression/FunctionCall.cs index a2786cc..0754895 100644 --- a/AspectedRouting/Language/Expression/FunctionCall.cs +++ b/AspectedRouting/Language/Expression/FunctionCall.cs @@ -33,14 +33,9 @@ namespace AspectedRouting.Language.Expression Types = types; } - public FunctionCall(string name, Type type) : this(name, new[] { type }) - { - - } - public object Evaluate(Context c, params IExpression[] arguments) - { - + { + var func = c.GetFunction(_name); c = c.WithAspectName(_name); return func.Evaluate(c, arguments); @@ -60,17 +55,15 @@ namespace AspectedRouting.Language.Expression public IExpression PruneTypes(Func allowedTypes) { var passedTypes = this.Types.Where(allowedTypes); - if (!passedTypes.Any()) - { + if (!passedTypes.Any()) { return null; } return new FunctionCall(this._name, passedTypes); } - public IExpression Optimize(out bool somethingChanged) + public IExpression Optimize() { - somethingChanged = false; return this; } @@ -94,21 +87,6 @@ namespace AspectedRouting.Language.Expression f(this); } - public bool Equals(IExpression other) - { - if (other is FunctionCall fc) - { - return fc._name.Equals(this._name); - } - - return false; - } - - public string Repr() - { - return "new FunctionCall(\"" + this._name + "\")"; - } - public override string ToString() { return $"${_name}"; diff --git a/AspectedRouting/Language/Expression/ProfileMetaData.cs b/AspectedRouting/Language/Expression/ProfileMetaData.cs index bd3bed2..f01b426 100644 --- a/AspectedRouting/Language/Expression/ProfileMetaData.cs +++ b/AspectedRouting/Language/Expression/ProfileMetaData.cs @@ -14,7 +14,7 @@ namespace AspectedRouting.Language.Expression public string Author { get; } public string Filename { get; } public List VehicleTyps { get; } - + /* * Which tags are included in the routerdb but are _not_ used for routeplanning? * Typically these are tags that are useful for navigation (name of the road, is this a tunnel, ...) @@ -28,14 +28,7 @@ namespace AspectedRouting.Language.Expression public IExpression Access { get; } public IExpression Oneway { get; } public IExpression Speed { get; } - - public IExpression ObstacleAccess { get; } - public IExpression ObstacleCost { get; } - public Dictionary Priority { get; } - - public IExpression ScalingFactor { get; } - /** * Moment of last change of any upstream file */ @@ -45,21 +38,17 @@ namespace AspectedRouting.Language.Expression List vehicleTyps, Dictionary defaultParameters, Dictionary> behaviours, IExpression access, IExpression oneway, IExpression speed, - IExpression obstacleAccess, IExpression obstacleCost, - Dictionary priority, IExpression scalingFactor, List metadata, DateTime lastChange) + Dictionary priority, List metadata, DateTime lastChange) { Name = name; Description = description; Author = author; Filename = filename; VehicleTyps = vehicleTyps; - Access = access.Optimize(out _); - Oneway = oneway.Optimize(out _); - Speed = speed.Optimize(out _); - ObstacleAccess = obstacleAccess.Optimize(out _); - ObstacleCost = obstacleCost.Optimize(out _); + Access = access.Optimize(); + Oneway = oneway.Optimize(); + Speed = speed.Optimize(); Priority = priority; - ScalingFactor = scalingFactor; Metadata = metadata; LastChange = lastChange; DefaultParameters = defaultParameters; @@ -68,28 +57,21 @@ namespace AspectedRouting.Language.Expression CheckTypes(Access, "access"); CheckTypes(Oneway, "oneway"); CheckTypes(Speed, "speed"); - CheckTypes(ObstacleAccess, "obstacleaccess"); - CheckTypes(ObstacleCost, "obstaclecost"); + } private static void CheckTypes(IExpression e, string name) { - if (e == null) - { - throw new Exception("No expression given for " + name); - } - if (e.Types.Count() == 1) - { + if (e.Types.Count() == 1) { return; } - throw new Exception("Insufficient specialization: " + name + " has multiple types left, namely " + - e.Types.Pretty()); + throw new Exception("Insufficient specialization: " + name + " has multiple types left, namely " + e.Types.Pretty()); } public List AllExpressions(Context ctx) { - var l = new List { Access, Oneway, Speed, ObstacleAccess, ObstacleCost }; + var l = new List {Access, Oneway, Speed}; l.AddRange(DefaultParameters.Values); l.AddRange(Behaviours.Values.SelectMany(b => b.Values)); l.AddRange(Priority.Values); @@ -106,7 +88,6 @@ namespace AspectedRouting.Language.Expression var called = ctx.GetFunction(fc.CalledFunctionName); allExpr.Add(called); } - return true; }); } @@ -114,48 +95,15 @@ namespace AspectedRouting.Language.Expression return allExpr; } - public List AllExpressionsFor(string behaviourName, Context context) + + public ProfileResult Run(Context c, string behaviour, Dictionary tags) { - var allExpressions = new List + if (!Behaviours.ContainsKey(behaviour)) { - Access, - Oneway, - Speed, - ObstacleAccess, - ObstacleCost - }; - - var behaviourContext = new Context(context); - var behaviourParameters = ParametersFor(behaviourName); - - - foreach (var (paramName, valueexpression) in Priority) - { - var weightingFactor = behaviourParameters[paramName].Evaluate(behaviourContext); - if (weightingFactor is double d) - { - if (d == 0.0) - { - continue; - } - } - - if (weightingFactor is int i) - { - if (i == 0) - { - continue; - } - } - - allExpressions.Add(valueexpression); + throw new ArgumentException( + $"Profile {Name} does not contain the behaviour {behaviour}\nTry one of {string.Join(",", Behaviours.Keys)}"); } - return allExpressions; - } - - public Dictionary ParametersFor(string behaviour) - { var parameters = new Dictionary(); foreach (var (k, v) in DefaultParameters) @@ -168,23 +116,12 @@ namespace AspectedRouting.Language.Expression parameters[k.TrimStart('#')] = v; } - return parameters; - } - - public ProfileResult Run(Context c, string behaviour, Dictionary tags) - { - if (!Behaviours.ContainsKey(behaviour)) - { - throw new ArgumentException( - $"Profile {Name} does not contain the behaviour {behaviour}\nTry one of {string.Join(",", Behaviours.Keys)}"); - } - - c = c.WithParameters(ParametersFor(behaviour)) - .WithAspectName(Name); + c = c.WithParameters(parameters) + .WithAspectName(this.Name); tags = new Dictionary(tags); var canAccess = Access.Run(c, tags); tags["access"] = "" + canAccess; - var speed = (double)Speed.Run(c, tags); + var speed = (double) Speed.Run(c, tags); tags["speed"] = "" + speed; var oneway = Oneway.Run(c, tags); tags["oneway"] = "" + oneway; @@ -201,7 +138,7 @@ namespace AspectedRouting.Language.Expression var weightExplanation = new List(); foreach (var (paramName, expression) in Priority) { - var aspectInfluence = (double)c.Parameters[paramName].Evaluate(c); + var aspectInfluence = (double) c.Parameters[paramName].Evaluate(c); // ReSharper disable once CompareOfFloatsByEqualityOperator if (aspectInfluence == 0) { @@ -209,34 +146,50 @@ namespace AspectedRouting.Language.Expression } - var aspectWeight = new Apply( + var aspectWeightObj = new Apply( Funcs.EitherFunc.Apply(Funcs.Id, Funcs.Const, expression) - , new Constant(tags)).EvaluateDouble(paramName, c); + , new Constant(tags)).Evaluate(c); + double aspectWeight; + switch (aspectWeightObj) + { + case bool b: + aspectWeight = b ? 1.0 : 0.0; + break; + case double d: + aspectWeight = d; + break; + case int j: + aspectWeight = j; + break; + case string s: + if (s.Equals("yes")) + { + aspectWeight = 1.0; + break; + } + else if (s.Equals("no")) + { + aspectWeight = 0.0; + break; + } + + throw new Exception($"Invalid value as result for {paramName}: got string {s}"); + default: + throw new Exception($"Invalid value as result for {paramName}: got object {aspectWeightObj}"); + } weightExplanation.Add($"({paramName} = {aspectInfluence}) * {aspectWeight}"); priority += aspectInfluence * aspectWeight; } - var scalingFactor = Utils.AsDouble(ScalingFactor.Run(c, tags) ?? 1.0, "scalingfactor"); - weightExplanation.Add("Scaling factor: " + scalingFactor); - priority *= scalingFactor; if (priority <= 0) { canAccess = "no"; - weightExplanation.Add("WARNING: access has been set to 'no' as priority is < 0"); } - if (canAccess is string canAccessString && oneway is string onewayString) - { - return new ProfileResult(canAccessString, onewayString, speed, priority, - string.Join("\n ", weightExplanation)); - } - else - { - throw new Exception("CanAccess or oneway are not strings but " + canAccess.GetType() + - " and " + (oneway?.GetType()?.ToString() ?? "")); - } + return new ProfileResult((string) canAccess, (string) oneway, speed, priority, + string.Join("\n ", weightExplanation)); } diff --git a/AspectedRouting/Language/Funcs.cs b/AspectedRouting/Language/Funcs.cs index f840840..b8442e8 100644 --- a/AspectedRouting/Language/Funcs.cs +++ b/AspectedRouting/Language/Funcs.cs @@ -19,7 +19,6 @@ namespace AspectedRouting.Language public static readonly Function Eq = new Eq(); public static readonly Function NotEq = new NotEq(); public static readonly Function Inv = new Inv(); - public static readonly Function IsNull = new IsNull(); public static readonly Function Default = new Default(); @@ -88,14 +87,15 @@ namespace AspectedRouting.Language } var eSmallest = e.SpecializeToSmallestType(); - if (eSmallest == null || !eSmallest.Types.Any()) + if (eSmallest == null || eSmallest.Types.Count() == 0) { throw new Exception("Could not specialize " + e); } + // TODO FIX THIS so that it works // An argument 'optimizes' it's types from 'string -> bool' to 'string -> string' - var eOpt = eSmallest.Optimize(out _); - if (eOpt == null || !eOpt.Types.Any()) + var eOpt = eSmallest.Optimize(); + if (eOpt == null || eOpt.Types.Count() == 0) { throw new Exception("Could not optimize " + eSmallest); } @@ -106,10 +106,6 @@ namespace AspectedRouting.Language public static IExpression SpecializeToSmallestType(this IExpression e) { - if (e == null) - { - throw new Exception("Cannot specialize null to a smallest type"); - } if (e.Types.Count() == 1) { return e; @@ -137,7 +133,7 @@ namespace AspectedRouting.Language } } - return e.Specialize(new[] { smallest }); + return e.Specialize(new[] {smallest}); } public static IExpression Apply(this IExpression function, IEnumerable args) @@ -164,8 +160,7 @@ namespace AspectedRouting.Language var lastArg = args[args.Count - 1]; var firstArgs = args.GetRange(0, args.Count - 1); - var applied = Apply(function, firstArgs); - return new Apply(applied, lastArg); + return new Apply(Apply(function, firstArgs), lastArg); } } } \ No newline at end of file diff --git a/AspectedRouting/Language/Functions/All.cs b/AspectedRouting/Language/Functions/All.cs index be4c6c5..add714c 100644 --- a/AspectedRouting/Language/Functions/All.cs +++ b/AspectedRouting/Language/Functions/All.cs @@ -22,7 +22,7 @@ namespace AspectedRouting.Language.Functions public override object Evaluate(Context c, params IExpression[] arguments) { - var arg = ((IEnumerable)arguments[0].Evaluate(c)).Select(o => (string)o); + var arg = ((IEnumerable) arguments[0].Evaluate(c)).Select(o => (string) o); if (arg.Any(str => str == null || str.Equals("no") || str.Equals("false"))) diff --git a/AspectedRouting/Language/Functions/AtLeast.cs b/AspectedRouting/Language/Functions/AtLeast.cs index 478cf07..b02110f 100644 --- a/AspectedRouting/Language/Functions/AtLeast.cs +++ b/AspectedRouting/Language/Functions/AtLeast.cs @@ -11,7 +11,7 @@ namespace AspectedRouting.Language.Functions public override string Description { get; } = "Returns 'yes' if the second argument is bigger then the first argument. (Works great in combination with $dot)"; - public override List ArgNames { get; } = new List { "minimum", "f", "then", "else" }; + public override List ArgNames { get; } = new List {"minimum", "f", "then","else"}; private static Type a = new Var("a"); private static Type b = new Var("b"); @@ -20,7 +20,7 @@ namespace AspectedRouting.Language.Functions new[] { Curry.ConstructFrom(a, - Typs.Double, + Typs.Double, new Curry(b,Typs.Double), a, a, b), }) @@ -50,7 +50,7 @@ namespace AspectedRouting.Language.Functions var x = arguments[4]; var arg1 = arguments[1].Evaluate(c, x); - + if (minimum == null || arg1 == null) { return null; @@ -60,7 +60,7 @@ namespace AspectedRouting.Language.Functions { minimum = e.Evaluate(c); } - + if (arg1 is IExpression e1) { arg1 = e1.Evaluate(c); @@ -68,12 +68,12 @@ namespace AspectedRouting.Language.Functions if (minimum is int i0) { - minimum = (double)i0; + minimum = (double) i0; } - + if (arg1 is int i1) { - arg1 = (double)i1; + arg1 = (double) i1; } if (minimum is double d0 && arg1 is double d1) @@ -86,7 +86,7 @@ namespace AspectedRouting.Language.Functions return @else; } - throw new InvalidCastException("One of the arguments is not a number: " + minimum + ", " + arg1); + throw new InvalidCastException("One of the arguments is not a number: "+minimum+", "+arg1); } } diff --git a/AspectedRouting/Language/Functions/Concat.cs b/AspectedRouting/Language/Functions/Concat.cs index f40c471..a9a6e92 100644 --- a/AspectedRouting/Language/Functions/Concat.cs +++ b/AspectedRouting/Language/Functions/Concat.cs @@ -7,7 +7,7 @@ namespace AspectedRouting.Language.Functions public class Concat : Function { public override string Description { get; } = "Concatenates two strings"; - public override List ArgNames { get; } = new List { "a", "b" }; + public override List ArgNames { get; } = new List{"a","b"}; public Concat() : base("concat", true, new[] { @@ -33,8 +33,8 @@ namespace AspectedRouting.Language.Functions public override object Evaluate(Context c, params IExpression[] arguments) { - var arg0 = (string)arguments[0].Evaluate(c); - var arg1 = (string)arguments[1].Evaluate(c); + var arg0 = (string) arguments[0].Evaluate(c); + var arg1 = (string) arguments[1].Evaluate(c); return arg0 + arg1; } } diff --git a/AspectedRouting/Language/Functions/Const.cs b/AspectedRouting/Language/Functions/Const.cs index f91baf4..ee419cd 100644 --- a/AspectedRouting/Language/Functions/Const.cs +++ b/AspectedRouting/Language/Functions/Const.cs @@ -10,7 +10,7 @@ namespace AspectedRouting.Language.Functions public override string Description { get; } = "Small utility function, which takes two arguments `a` and `b` and returns `a`. Used extensively to insert freedom"; - public override List ArgNames { get; } = new List { "a", "b" }; + public override List ArgNames { get; } = new List{"a","b"}; public Const() : base("firstArg", true, new[] @@ -19,7 +19,7 @@ namespace AspectedRouting.Language.Functions } ) { - Funcs.AddBuiltin(this, "const"); + Funcs.AddBuiltin(this,"const"); } private Const(IEnumerable types) : base("firstArg", types @@ -27,7 +27,7 @@ namespace AspectedRouting.Language.Functions { } - public override object Evaluate(Context c, params IExpression[] arguments) + public override object Evaluate(Context c,params IExpression[] arguments) { if (arguments.Length == 1) { @@ -35,13 +35,13 @@ namespace AspectedRouting.Language.Functions } var f = arguments[0]; - var args = new IExpression[arguments.Length - 2]; + var args = new IExpression [arguments.Length - 2]; for (var i = 2; i < arguments.Length; i++) { args[i - 2] = arguments[i]; } - return f.Evaluate(c, args); + return f.Evaluate(c,args); } public override IExpression Specialize(IEnumerable allowedTypes) diff --git a/AspectedRouting/Language/Functions/ConstRight.cs b/AspectedRouting/Language/Functions/ConstRight.cs index a9bf4d2..bed89c3 100644 --- a/AspectedRouting/Language/Functions/ConstRight.cs +++ b/AspectedRouting/Language/Functions/ConstRight.cs @@ -6,11 +6,10 @@ using Type = AspectedRouting.Language.Typ.Type; namespace AspectedRouting.Language.Functions { public class ConstRight : Function - { - public override string Description { get; } = - "Small utility function, which takes two arguments `a` and `b` and returns `b`. Used extensively to insert freedom"; + { public override string Description { get; } = + "Small utility function, which takes two arguments `a` and `b` and returns `b`. Used extensively to insert freedom"; - public override List ArgNames { get; } = new List { "a", "b" }; + public override List ArgNames { get; } = new List{"a","b"}; public ConstRight() : base("constRight", true, new[] @@ -26,7 +25,7 @@ namespace AspectedRouting.Language.Functions { } - public override object Evaluate(Context c, params IExpression[] arguments) + public override object Evaluate(Context c,params IExpression[] arguments) { var argsFor1 = new IExpression[arguments.Length - 2]; for (var i = 2; i < arguments.Length; i++) diff --git a/AspectedRouting/Language/Functions/Constant.cs b/AspectedRouting/Language/Functions/Constant.cs index 57746e7..e7de7d4 100644 --- a/AspectedRouting/Language/Functions/Constant.cs +++ b/AspectedRouting/Language/Functions/Constant.cs @@ -14,11 +14,9 @@ namespace AspectedRouting.Language.Functions public Constant(IEnumerable types, object o) { Types = types.ToList(); - if (o is IEnumerable enumerable) - { + if (o is IEnumerable enumerable) { o = enumerable.ToList(); - if (enumerable.Any(x => x == null)) - { + if (enumerable.Any(x => x == null)) { throw new NullReferenceException("Some subexpression is null"); } } @@ -28,12 +26,10 @@ namespace AspectedRouting.Language.Functions public Constant(Type t, object o) { - Types = new List { t }; - if (o is IEnumerable enumerable) - { + Types = new List {t}; + if (o is IEnumerable enumerable) { o = enumerable.ToList(); - if (enumerable.Any(x => x == null)) - { + if (enumerable.Any(x => x == null)) { throw new NullReferenceException("Some subexpression is null"); } } @@ -46,8 +42,7 @@ namespace AspectedRouting.Language.Functions var tps = exprs .SpecializeToCommonTypes(out var specializedVersions) .Select(t => new ListType(t)); - if (specializedVersions.Any(x => x == null)) - { + if (specializedVersions.Any(x => x == null)) { throw new Exception("Specializing to common types failed for " + string.Join(",", exprs.Select(e => e.ToString()))); } @@ -58,50 +53,40 @@ namespace AspectedRouting.Language.Functions public Constant(IReadOnlyCollection exprs) { - try - { + try { + + + Types = exprs .SpecializeToCommonTypes(out var specializedVersions) .Select(t => new ListType(t)) .ToList(); - specializedVersions = specializedVersions.ToList(); - if (specializedVersions.Any(x => x == null)) - { - Console.Error.WriteLine(">> Some subexpressions of the list are null:"); - foreach (var expr in exprs) - { - Console.Error.WriteLine(expr.Repr()); - Console.Error.WriteLine("\n-------------------------\n"); - } - - throw new NullReferenceException("Some subexpression of specialized versions are null"); + if (specializedVersions.Any(x => x == null)) { + throw new NullReferenceException("Some subexpression is null"); } _o = specializedVersions.ToList(); } - catch (Exception e) - { + catch (Exception e) { throw new Exception("While creating a list with members " + - string.Join(", ", exprs.Select(x => x.Optimize(out var _))) + + string.Join(", ", exprs.Select(x => x.Optimize())) + $" {e.Message}", e); } } public Constant(string s) { - Types = new List { Typs.String }; + Types = new List {Typs.String}; _o = s; } public Constant(double d) { - if (d >= 0) - { - Types = new[] { Typs.Double, Typs.PDouble }; + if (d >= 0) { + Types = new[] {Typs.Double, Typs.PDouble}; } - else - { - Types = new[] { Typs.Double }; + else { + Types = new[] {Typs.Double}; } _o = d; @@ -109,13 +94,11 @@ namespace AspectedRouting.Language.Functions public Constant(int i) { - if (i >= 0) - { - Types = new[] { Typs.Double, Typs.Int, Typs.Nat, Typs.PDouble }; + if (i >= 0) { + Types = new[] {Typs.Double, Typs.Nat, Typs.Nat, Typs.PDouble}; } - else - { - Types = new[] { Typs.Double, Typs.Int }; + else { + Types = new[] {Typs.Double, Typs.Int}; } _o = i; @@ -123,17 +106,16 @@ namespace AspectedRouting.Language.Functions public Constant(Dictionary tags) { - Types = new[] { Typs.Tags }; + Types = new[] {Typs.Tags}; _o = tags; } public IEnumerable Types { get; } - public IExpression PruneTypes(Func allowedTypes) + public IExpression PruneTypes(System.Func allowedTypes) { var passedTypes = Types.Where(allowedTypes); - if (!passedTypes.Any()) - { + if (!passedTypes.Any()) { return null; } @@ -142,32 +124,28 @@ namespace AspectedRouting.Language.Functions public object Evaluate(Context c, params IExpression[] args) { - if (_o is IExpression e) - { + if (_o is IExpression e) { return e.Evaluate(c).Pretty(); } - if (Types.Count() > 1) - { + if (Types.Count() > 1) { return _o; } var t = Types.First(); - switch (t) - { + switch (t) { case DoubleType _: case PDoubleType _: - if (_o is int i) - { + if (_o is int i) { return - (double)i; // I know, it seems absurd having to write this as it is nearly the same as the return beneath, but it _is_ needed + (double) i; // I know, it seems absurd having to write this as it is nearly the same as the return beneath, but it _is_ needed } - return (double)_o; + return (double) _o; case IntType _: case NatType _: - return (int)_o; + return (int) _o; } return _o; @@ -177,39 +155,31 @@ namespace AspectedRouting.Language.Functions { var allowedTypes = allowedTypesEnumerable.ToList(); var unified = Types.SpecializeTo(allowedTypes); - if (unified == null) - { + if (unified == null) { return null; } var newO = _o; - if (_o is IExpression e) - { + if (_o is IExpression e) { newO = e.Specialize(allowedTypes); } - if (_o is IEnumerable es) - { + if (_o is IEnumerable es) { var innerTypes = new List(); - foreach (var allowedType in allowedTypes) - { - if (allowedType is ListType listType) - { + foreach (var allowedType in allowedTypes) { + if (allowedType is ListType listType) { innerTypes.Add(listType.InnerType); } } var specializedExpressions = new List(); - foreach (var expr in es) - { - if (expr == null) - { + foreach (var expr in es) { + if (expr == null) { throw new NullReferenceException("Subexpression is null"); } var specialized = expr.Specialize(innerTypes); - if (specialized == null) - { + if (specialized == null) { // If a subexpression can not be specialized, this list cannot be specialized return null; } @@ -223,38 +193,26 @@ namespace AspectedRouting.Language.Functions return new Constant(unified, newO); } - public IExpression Optimize(out bool somethingChanged) + public IExpression Optimize() { - somethingChanged = false; - if (_o is IEnumerable exprs) - { + if (_o is IEnumerable exprs) { // This is a list var optExprs = new List(); - foreach (var expression in exprs) - { - var exprOpt = expression.Optimize(out var sc); - somethingChanged |= sc; - if (exprOpt == null || exprOpt.Types.Count() == 0) - { + foreach (var expression in exprs) { + var exprOpt = expression.Optimize(); + if (exprOpt == null || exprOpt.Types.Count() == 0) { throw new ArgumentException("Non-optimizable expression:" + expression); } optExprs.Add(exprOpt); } - if (somethingChanged) - { - return new Constant(optExprs); - } - - return this; + return new Constant(optExprs); } - if (_o is IExpression expr) - { - // This is a subexpression - somethingChanged = true; - return expr.Optimize(out var _); + if (_o is IExpression expr) { + // This is a list + return new Constant(expr.Types, expr.Optimize()); } return this; @@ -262,15 +220,12 @@ namespace AspectedRouting.Language.Functions public void Visit(Func f) { - if (_o is IExpression e) - { + if (_o is IExpression e) { e.Visit(f); } - if (_o is IEnumerable es) - { - foreach (var x in es) - { + if (_o is IEnumerable es) { + foreach (var x in es) { x.Visit(f); } } @@ -278,28 +233,6 @@ namespace AspectedRouting.Language.Functions f(this); } - public bool Equals(IExpression other) - { - if (other is Constant c) - { - return c._o.Equals(_o); - } - - return false; - } - - public string Repr() - { - if (_o is IEnumerable exprs) - { - return "new Constant(new []{" + - string.Join(",\n ", exprs.Select(e => e.Repr().Replace("\n", "\n "))) - + "})"; - } - - return "new Constant(" + (_o?.ToString() ?? null) + ")"; - } - public void EvaluateAll(Context c, HashSet addTo) { addTo.Add(this); @@ -312,12 +245,7 @@ namespace AspectedRouting.Language.Functions public override string ToString() { - return ObjectExtensions.Pretty(_o); - } - - public object Get() - { - return _o; + return _o.Pretty(); } } @@ -325,24 +253,19 @@ namespace AspectedRouting.Language.Functions { public static string Pretty(this object o, Context context = null) { - switch (o) - { - case null: return "null"; + switch (o) { case Dictionary d: var txt = ""; - foreach (var (k, v) in d) - { + foreach (var (k, v) in d) { txt += $"{k}={v};"; } return $"{{{txt}}}"; case Dictionary> d: var t = ""; - foreach (var (k, v) in d) - { + foreach (var (k, v) in d) { var values = v.Pretty(); - if (!v.Any()) - { + if (!v.Any()) { values = "*"; } @@ -358,7 +281,7 @@ namespace AspectedRouting.Language.Functions case object[] arr: return arr.ToList().Pretty(); case double[] arr: - return arr.Select(d => (object)d).ToList().Pretty(); + return arr.Select(d => (object) d).ToList().Pretty(); case string s: return "\"" + s.Replace("\"", "\\\"") + "\""; case IEnumerable ls: diff --git a/AspectedRouting/Language/Functions/ContainedIn.cs b/AspectedRouting/Language/Functions/ContainedIn.cs index 7e09ec3..7dfc4a3 100644 --- a/AspectedRouting/Language/Functions/ContainedIn.cs +++ b/AspectedRouting/Language/Functions/ContainedIn.cs @@ -9,7 +9,7 @@ namespace AspectedRouting.Language.Functions public override string Description { get; } = "Given a list of values, checks if the argument is contained in the list."; - public override List ArgNames { get; } = new List { "list", "a" }; + public override List ArgNames { get; } = new List{"list","a"}; public ContainedIn() : base("containedIn", true, new[] @@ -30,7 +30,7 @@ namespace AspectedRouting.Language.Functions public override object Evaluate(Context c, params IExpression[] arguments) { - var list = (IEnumerable)arguments[0].Evaluate(c); + var list = (IEnumerable) arguments[0].Evaluate(c); var arg = arguments[1]; var result = new List(); diff --git a/AspectedRouting/Language/Functions/Default.cs b/AspectedRouting/Language/Functions/Default.cs index 88a0b52..3f3f0c1 100644 --- a/AspectedRouting/Language/Functions/Default.cs +++ b/AspectedRouting/Language/Functions/Default.cs @@ -7,11 +7,11 @@ namespace AspectedRouting.Language.Functions { public class Default : Function { - + public override string Description { get; } = "Calculates function `f` for the given argument. If the result is `null`, the default value is returned instead"; - public override List ArgNames { get; } = new List { "defaultValue", "f" }; - + public override List ArgNames { get; } = new List {"defaultValue", "f"}; + private static Var a = new Var("a"); private static Var b = new Var("b"); public Default() : base("default", true, @@ -37,13 +37,13 @@ namespace AspectedRouting.Language.Functions return new Default(unified); } - public override object Evaluate(Context c, params IExpression[] arguments) + public override object Evaluate(Context c,params IExpression[] arguments) { var defaultValue = arguments[0]; var func = arguments[1]; - var args = arguments.ToList().GetRange(2, arguments.Length - 2).ToArray(); + var args= arguments.ToList().GetRange(2, arguments.Length - 2).ToArray(); - var calculated = func.Evaluate(c, args); + var calculated = func.Evaluate(c,args); if (calculated == null) { return defaultValue.Evaluate(c); diff --git a/AspectedRouting/Language/Functions/Dot.cs b/AspectedRouting/Language/Functions/Dot.cs index 47bc61e..9c79eba 100644 --- a/AspectedRouting/Language/Functions/Dot.cs +++ b/AspectedRouting/Language/Functions/Dot.cs @@ -11,7 +11,7 @@ namespace AspectedRouting.Language.Functions public override string Description { get; } = "Higher order function: converts `f (g a)` into `(dot f g) a`. In other words, this fuses `f` and `g` in a new function, which allows the argument to be lifted out of the expression "; - public override List ArgNames { get; } = new List { "f", "g", "a" }; + public override List ArgNames { get; } = new List {"f", "g", "a"}; public static readonly Var A = new Var("a"); public static readonly Var B = new Var("b"); public static readonly Var C = new Var("c"); @@ -36,12 +36,11 @@ namespace AspectedRouting.Language.Functions { if (arguments.Count() <= 2) { - } var f0 = arguments[0]; var f1 = arguments[1]; - var resultType = ((Curry)f1.Types.First()).ResultType; + var resultType = ((Curry) f1.Types.First()).ResultType; var a = arguments[2]; return f0.Evaluate(c, new Constant(resultType, f1.Evaluate(c, a))); } diff --git a/AspectedRouting/Language/Functions/EitherFunc.cs b/AspectedRouting/Language/Functions/EitherFunc.cs index 23cf4f2..27d6b97 100644 --- a/AspectedRouting/Language/Functions/EitherFunc.cs +++ b/AspectedRouting/Language/Functions/EitherFunc.cs @@ -13,12 +13,12 @@ namespace AspectedRouting.Language.Functions "" + "Consider the mapping `{'someKey':'someValue'}`. Under normal circumstances, this acts as a pointwise-function, converting the string `someKey` into `someValue`, just like an ordinary dictionary would do. " + "However, in the context of `mustMatch`, we would prefer this to act as a _check_, that the highway _has_ a key `someKey` which is `someValue`, thus acting as " + - "`{'someKey': {'$eq':'someValue'}}`. " + - "Both behaviours are automatically supported in parsing, by parsing all string as `(eitherFunc id eq) 'someValue'`. " + - "The type system is then able to figure out which implementation is needed an discards the unneeded implementations.\n\n" + + "`{'someKey': {'$eq':'someValue'}}. " + + "Both behaviours are automatically supported in parsing, by parsing the string as `(eitherFunc id eq) 'someValue'`. " + + "The type system is then able to figure out which implementation is needed.\n\n" + "Disclaimer: _you should never ever need this in your profiles_"; - public override List ArgNames { get; } = new List { "f", "g", "a" }; + public override List ArgNames { get; } = new List{"f","g","a"}; private static Var a = new Var("a"); private static Var b = new Var("b"); private static Var c = new Var("c"); @@ -53,7 +53,7 @@ namespace AspectedRouting.Language.Functions { } - public override object Evaluate(Context _, params IExpression[] arguments) + public override object Evaluate(Context _,params IExpression[] arguments) { throw new ArgumentException("EitherFunc not sufficiently specialized"); } diff --git a/AspectedRouting/Language/Functions/Eq.cs b/AspectedRouting/Language/Functions/Eq.cs index c4bd07d..5095ea1 100644 --- a/AspectedRouting/Language/Functions/Eq.cs +++ b/AspectedRouting/Language/Functions/Eq.cs @@ -5,9 +5,8 @@ using AspectedRouting.Language.Typ; namespace AspectedRouting.Language.Functions { public class Eq : Function - { - public override string Description { get; } = "Returns 'yes' if both values _are_ the same"; - public override List ArgNames { get; } = new List { "a", "b" }; + { public override string Description { get; } = "Returns 'yes' if both values _are_ the same"; + public override List ArgNames { get; } = new List{"a","b"}; public Eq() : base("eq", true, new[] { diff --git a/AspectedRouting/Language/Functions/FirstMatchOf.cs b/AspectedRouting/Language/Functions/FirstMatchOf.cs index 78678e7..136e407 100644 --- a/AspectedRouting/Language/Functions/FirstMatchOf.cs +++ b/AspectedRouting/Language/Functions/FirstMatchOf.cs @@ -8,25 +8,22 @@ namespace AspectedRouting.Language.Functions { public class FirstMatchOf : Function { - public override string Description { get; } = "This higher-order function takes a list of keys, a mapping (function over tags) and a collection of tags." + - "It will try the function for the first key (and it's respective value). If the function fails (it gives null), it'll try the next key.\n\n" + - "E.g. `$firstMatchOf ['maxspeed','highway'] {'maxspeed' --> $parse, 'highway' --> {residential --> 30, tertiary --> 50}}` applied on `{maxspeed=70, highway=tertiary}`" + - " will yield `70` as that is the first key in the list; `{highway=residential}` will yield `30`."; - public override List ArgNames { get; } = new List { "s" }; + public override string Description { get; } = "This higherorder function takes a list of keys, a mapping (function over tags) and a collection of tags. It will try the function for the first key (and it's respective value). If the function fails (it gives null), it'll try the next key.\n\n" + + "E.g. `$firstMatchOf ['maxspeed','highway'] {'maxspeed' --> $parse, 'highway' --> {residential --> 30, tertiary --> 50}}` applied on `{maxspeed=70, highway=tertiary}` will yield `70` as that is the first key in the list; `{highway=residential}` will yield `30`."; + public override List ArgNames { get; } = new List {"s"}; public FirstMatchOf() : base("first_match_of", true, new[] { // [String] -> (Tags -> [a]) -> Tags -> a - Curry.ConstructFrom( - new Var("a"), // Result type on top! + Curry.ConstructFrom(new Var("a"), // Result type on top! new ListType(Typs.String), new Curry(Typs.Tags, new ListType(new Var("a"))), Typs.Tags ) }) { - Funcs.AddBuiltin(this, "firstMatchOf"); + Funcs.AddBuiltin( this,"firstMatchOf"); } private FirstMatchOf(IEnumerable types) : base("first_match_of", types) @@ -46,7 +43,7 @@ namespace AspectedRouting.Language.Functions public override object Evaluate(Context c, params IExpression[] arguments) { - var order = ((IEnumerable)arguments[0].Evaluate(c)) + var order = ((IEnumerable) arguments[0].Evaluate(c)) .Select(o => { if (o is string s) @@ -55,11 +52,11 @@ namespace AspectedRouting.Language.Functions } else { - return (string)((IExpression)o).Evaluate(c); + return (string) ((IExpression) o).Evaluate(c); } }); var function = arguments[1]; - var tags = (Dictionary)arguments[2].Evaluate(c); + var tags = (Dictionary) arguments[2].Evaluate(c); var singletonDict = new Dictionary(); @@ -75,7 +72,7 @@ namespace AspectedRouting.Language.Functions continue; } - return ((List)result).First(); + return ((List) result).First(); } return null; diff --git a/AspectedRouting/Language/Functions/HeadFunction.cs b/AspectedRouting/Language/Functions/HeadFunction.cs index 9fa925f..1d97d1c 100644 --- a/AspectedRouting/Language/Functions/HeadFunction.cs +++ b/AspectedRouting/Language/Functions/HeadFunction.cs @@ -15,38 +15,32 @@ namespace AspectedRouting.Language.Functions new Curry(new Var("b"), new ListType(new Var("a"))), new Curry(new Var("b"), new Var("a"))) } - ) - { } + ) { } private HeadFunction(IEnumerable unified) : base("head", unified) { } public override string Description { get; } = "Select the first non-null value of a list; returns 'null' on empty list or on null"; - public override List ArgNames { get; } = new List { "ls" }; + public override List ArgNames { get; } = new List {"ls"}; public override object Evaluate(Context c, params IExpression[] arguments) { object o = arguments[0]; - if (o is Apply app) - { + if (o is Apply app) { o = app.Evaluate(c, arguments.SubArray(1)); } - while (o is IExpression e) - { + while (o is IExpression e) { o = e.Evaluate(c); } - if (!(o is IEnumerable ls)) - { + if (!(o is IEnumerable ls)) { return null; } - foreach (var v in ls) - { - if (v != null) - { + foreach (var v in ls) { + if (v != null) { return v; } } @@ -57,8 +51,7 @@ namespace AspectedRouting.Language.Functions public override IExpression Specialize(IEnumerable allowedTypes) { var unified = Types.SpecializeTo(allowedTypes); - if (unified == null) - { + if (unified == null) { return null; } diff --git a/AspectedRouting/Language/Functions/Id.cs b/AspectedRouting/Language/Functions/Id.cs index 780de37..61ef45d 100644 --- a/AspectedRouting/Language/Functions/Id.cs +++ b/AspectedRouting/Language/Functions/Id.cs @@ -6,9 +6,8 @@ using AspectedRouting.Language.Typ; namespace AspectedRouting.Language.Functions { public class Id : Function - { - public override string Description { get; } = "Returns the argument unchanged - the identity function. Seems useless at first sight, but useful in parsing"; - public override List ArgNames { get; } = new List { "a" }; + { public override string Description { get; } = "Returns the argument unchanged - the identity function. Seems useless at first sight, but useful in parsing"; + public override List ArgNames { get; } = new List{"a"}; public Id() : base("id", true, new[] { @@ -32,9 +31,9 @@ namespace AspectedRouting.Language.Functions return new Id(unified); } - public override object Evaluate(Context c, params IExpression[] arguments) + public override object Evaluate(Context c,params IExpression[] arguments) { - return arguments[0].Evaluate(c, arguments.ToList().GetRange(1, arguments.Length - 1).ToArray()); + return arguments[0].Evaluate(c,arguments.ToList().GetRange(1, arguments.Length-1).ToArray()); } } } \ No newline at end of file diff --git a/AspectedRouting/Language/Functions/If.cs b/AspectedRouting/Language/Functions/If.cs index f799a04..d7cb4e9 100644 --- a/AspectedRouting/Language/Functions/If.cs +++ b/AspectedRouting/Language/Functions/If.cs @@ -10,10 +10,9 @@ namespace AspectedRouting.Language.Functions private static Var b = new Var("b"); public override string Description { get; } = "Selects either one of the branches, depending on the condition." + - " The 'then' branch is returned if the condition returns the string `yes` or `true`." + - " Otherwise, the `else` branch is taken (including if the condition returns `null`)" + - "If the `else` branch is not set, `null` is returned if the condition evaluates to false."; - public override List ArgNames { get; } = new List { "condition", "then", "else" }; + " The 'then' branch is returned if the condition returns the string `yes` or `true`. Otherwise, the `else` branch is taken (including if the condition returns `null`)" + + "If the `else` branch is not set, `null` is returned in the condition is false."; + public override List ArgNames { get; } = new List {"condition", "then", "else"}; public If() : base("if_then_else", true, new[] @@ -34,7 +33,7 @@ namespace AspectedRouting.Language.Functions public override object Evaluate(Context c, params IExpression[] arguments) { - var condition = arguments[0].Evaluate(c); + var condition = arguments[0].Evaluate(c); var then = arguments[1]; IExpression @else = null; if (arguments.Length > 2) diff --git a/AspectedRouting/Language/Functions/IfDotted.cs b/AspectedRouting/Language/Functions/IfDotted.cs index 1149df8..44d8e62 100644 --- a/AspectedRouting/Language/Functions/IfDotted.cs +++ b/AspectedRouting/Language/Functions/IfDotted.cs @@ -1,8 +1,6 @@ -using System; using System.Collections.Generic; using AspectedRouting.Language.Expression; using AspectedRouting.Language.Typ; -using Type = AspectedRouting.Language.Typ.Type; namespace AspectedRouting.Language.Functions { @@ -10,34 +8,34 @@ namespace AspectedRouting.Language.Functions { private static Var a = new Var("a"); private static Var b = new Var("b"); - + public override string Description { get; } = "An if_then_else, but one which takes an extra argument and applies it on the condition, then and else.\n" + "Consider `fc`, `fthen` and `felse` are all functions taking an `a`, then:\n" + - "`(ifDotted fc fthen felse) a` === `(if (fc a) (fthen a) (felse a)`" + + "`(ifDotted fc fthen felse) a` === `(if (fc a) (fthen a) (felse a)" + "Selects either one of the branches, depending on the condition." + " The 'then' branch is returned if the condition returns the string `yes` or `true` or the boolean `true`" + "If the `else` branch is not set, `null` is returned in the condition is false." + "In case the condition returns 'null', then the 'else'-branch is taken."; - public override List ArgNames { get; } = new List { "condition", "then", "else" }; + public override List ArgNames { get; } = new List {"condition", "then", "else"}; public IfDotted() : base("if_then_else_dotted", true, new[] { - - Curry.ConstructFrom(a, + + Curry.ConstructFrom(a, new Curry(b, Typs.Bool), new Curry(b, a), b), - Curry.ConstructFrom(a, + Curry.ConstructFrom(a, new Curry(b, Typs.String), new Curry(b, a), b), - Curry.ConstructFrom(a, + Curry.ConstructFrom(a, new Curry(b, Typs.Bool), new Curry(b, a), new Curry(b, a), b), - Curry.ConstructFrom(a, + Curry.ConstructFrom(a, new Curry(b, Typs.String), new Curry(b, a), new Curry(b, a), @@ -55,18 +53,18 @@ namespace AspectedRouting.Language.Functions public override object Evaluate(Context c, params IExpression[] arguments) { - var conditionfunc = arguments[0]; + var conditionfunc = arguments[0]; var thenfunc = arguments[1]; IExpression elsefunc = null; IExpression argument = arguments[2]; - + if (arguments.Length == 4) { elsefunc = arguments[2]; argument = arguments[3]; } - var condition = ((IExpression)conditionfunc).Apply(argument).Evaluate(c); + var condition = ((IExpression) conditionfunc).Apply(argument).Evaluate(c); if (condition != null && (condition.Equals("yes") || condition.Equals("true") || condition.Equals(true))) { diff --git a/AspectedRouting/Language/Functions/Inv.cs b/AspectedRouting/Language/Functions/Inv.cs index 1d71e22..b924009 100644 --- a/AspectedRouting/Language/Functions/Inv.cs +++ b/AspectedRouting/Language/Functions/Inv.cs @@ -7,7 +7,7 @@ namespace AspectedRouting.Language.Functions public class Inv : Function { public override string Description { get; } = "Calculates `1/d`"; - public override List ArgNames { get; } = new List { "d" }; + public override List ArgNames { get; } = new List {"d"}; public Inv() : base("inv", true, new[] { @@ -23,7 +23,7 @@ namespace AspectedRouting.Language.Functions public override object Evaluate(Context c, params IExpression[] arguments) { - var arg = (double)arguments[0].Evaluate(c); + var arg = (double) arguments[0].Evaluate(c); return 1 / arg; } diff --git a/AspectedRouting/Language/Functions/IsNull.cs b/AspectedRouting/Language/Functions/IsNull.cs deleted file mode 100644 index dafbd79..0000000 --- a/AspectedRouting/Language/Functions/IsNull.cs +++ /dev/null @@ -1,50 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text.RegularExpressions; -using AspectedRouting.Language.Expression; -using AspectedRouting.Language.Typ; -using Type = AspectedRouting.Language.Typ.Type; - -namespace AspectedRouting.Language.Functions -{ - public class IsNull : Function - { - public override string Description { get; } = "Returns true if the given argument is null"; - public override List ArgNames { get; } = new List { "a" }; - - public IsNull() : base("is_null", true, - new[] - { - new Curry(new Var("a"), Typs.Bool), - }) - { - } - - private IsNull(IEnumerable specializedTypes) : base("is_null", specializedTypes) - { - } - - public override IExpression Specialize(IEnumerable allowedTypes) - { - var unified = Types.SpecializeTo(allowedTypes); - if (unified == null) - { - return null; - } - - return new IsNull(unified); - } - - public override object Evaluate(Context c, params IExpression[] arguments) - { - var arg = (string)arguments[0].Evaluate(c); - if (arg == null) - { - return "yes"; - } - - return "no"; - } - } -} \ No newline at end of file diff --git a/AspectedRouting/Language/Functions/ListDot.cs b/AspectedRouting/Language/Functions/ListDot.cs index bbc9299..2ae1ba2 100644 --- a/AspectedRouting/Language/Functions/ListDot.cs +++ b/AspectedRouting/Language/Functions/ListDot.cs @@ -10,7 +10,7 @@ namespace AspectedRouting.Language.Functions "Listdot takes a list of functions `[f, g, h]` and and an argument `a`. It applies the argument on every single function." + "It conveniently lifts the argument out of the list."; - public override List ArgNames { get; } = new List { "list", "a" }; + public override List ArgNames { get; } = new List{"list","a"}; public ListDot() : base("listDot", true, new[] @@ -32,7 +32,7 @@ namespace AspectedRouting.Language.Functions public override object Evaluate(Context c, params IExpression[] arguments) { - var listOfFuncs = (IEnumerable)arguments[0].Evaluate(c); + var listOfFuncs = (IEnumerable) arguments[0].Evaluate(c); var arg = arguments[1]; var result = new List(); diff --git a/AspectedRouting/Language/Functions/Mapping.cs b/AspectedRouting/Language/Functions/Mapping.cs index 2880a8d..d5e1b34 100644 --- a/AspectedRouting/Language/Functions/Mapping.cs +++ b/AspectedRouting/Language/Functions/Mapping.cs @@ -54,7 +54,7 @@ namespace AspectedRouting.Language.Functions var newFunctions = new Dictionary(); - var functionType = unified.Select(c => ((Curry)c).ResultType); + var functionType = unified.Select(c => ((Curry) c).ResultType); var enumerable = functionType.ToList(); foreach (var (k, expr) in StringToResultFunctions) @@ -79,42 +79,40 @@ namespace AspectedRouting.Language.Functions public override object Evaluate(Context c, params IExpression[] arguments) { - + var s = arguments[0].Evaluate(c); while (s is Constant constant) { s = constant.Evaluate(c); } + - - var key = (string)s; + var key = (string) s; var otherARgs = arguments.ToList().GetRange(1, arguments.Length - 1); - if (!StringToResultFunctions.ContainsKey(key)) - { // This is really roundabout, but it has to be + if (!StringToResultFunctions.ContainsKey(key)) { // This is really roundabout, but it has to be return null; } var resultFunction = StringToResultFunctions[key]; - if (resultFunction == null) - { + if (resultFunction == null) { return null; } return resultFunction.Evaluate(c, otherARgs.ToArray()); } - public override IExpression Optimize(out bool somethingChanged) + public override IExpression Optimize() { var optimizedFunctions = new Dictionary(); - somethingChanged = false; + foreach (var (k, e) in StringToResultFunctions) { - var opt = e.Optimize(out var sc); - somethingChanged |= sc; + var opt = e.Optimize(); + + var typeOptStr = string.Join(";", opt.Types); + var typeEStr = string.Join("; ", e.Types); if (!opt.Types.Any()) { - var typeOptStr = string.Join(";", opt.Types); - var typeEStr = string.Join("; ", e.Types); throw new NullReferenceException($"Optimized version is null, has different or empty types: " + $"\n{typeEStr}" + $"\n{typeOptStr}"); @@ -123,13 +121,7 @@ namespace AspectedRouting.Language.Functions optimizedFunctions[k] = opt; } - if (!somethingChanged) - { - return this; - } - return new Mapping(optimizedFunctions); - } public static Mapping Construct(params (string key, IExpression e)[] exprs) diff --git a/AspectedRouting/Language/Functions/Max.cs b/AspectedRouting/Language/Functions/Max.cs index 36f496e..31281f9 100644 --- a/AspectedRouting/Language/Functions/Max.cs +++ b/AspectedRouting/Language/Functions/Max.cs @@ -11,7 +11,7 @@ namespace AspectedRouting.Language.Functions public override string Description { get; } = "Returns the biggest value in the list. For a list of booleans, this acts as 'or'"; - public override List ArgNames { get; } = new List { "list" }; + public override List ArgNames { get; } = new List {"list"}; public Max() : base("max", true, new[] @@ -45,7 +45,7 @@ namespace AspectedRouting.Language.Functions public override object Evaluate(Context c, params IExpression[] arguments) { - var ls = ((IEnumerable)arguments[0].Evaluate(c)).Where(o => o != null); + var ls = ((IEnumerable) arguments[0].Evaluate(c)).Where(o => o != null); var expectedType = (Types.First() as Curry).ResultType; switch (expectedType) diff --git a/AspectedRouting/Language/Functions/MemberOf.cs b/AspectedRouting/Language/Functions/MemberOf.cs index 96aca4f..28d6c50 100644 --- a/AspectedRouting/Language/Functions/MemberOf.cs +++ b/AspectedRouting/Language/Functions/MemberOf.cs @@ -13,8 +13,7 @@ namespace AspectedRouting.Language.Functions new Curry(Typs.Tags, Typs.Bool), new Curry(Typs.Tags, Typs.Bool)) } - ) - { } + ) { } public MemberOf(IEnumerable types) : base("memberOf", types) { } @@ -29,7 +28,7 @@ namespace AspectedRouting.Language.Functions " a flag `_relation:=\"yes\"` will be set if the aspect matches on every way for where this aspect matches.\n" + "However, this plays poorly with parameters (e.g.: what if we want to cycle over a highway which is part of a certain cycling network with a certain `#network_name`?) " + "Luckily, parameters can only be simple values. To work around this problem, an extra tag is introduced for _every single profile_:" + - "`_relation::=yes'. The subfunction is thus executed `countOf(relations) * countOf(profiles)` time, yielding `countOf(profiles)` tags." + + "`_relation::=yes'. The subfunction is thus executed `countOr(relations) * countOf(profiles)` time, yielding `countOf(profiles)` tags." + " The profile function then picks the tags for himself and strips the `:` away from the key.\n\n" + "\n\n" + "In the test.csv, one can simply use `_relation:=yes` to mimic relations in your tests"; @@ -40,43 +39,34 @@ namespace AspectedRouting.Language.Functions public override object Evaluate(Context c, params IExpression[] arguments) { - var tags = (Dictionary)arguments[1].Evaluate(c); + var tags = (Dictionary) arguments[1].Evaluate(c); var name = c.AspectName.TrimStart('$'); - if (tags.TryGetValue("_relation:" + name, out var v)) - { + if (tags.TryGetValue("_relation:" + name, out var v)) { return v; } // In the case of tests, relations might be added with "_relation:1:" // So, we create this table as dictionary var relationTags = new Dictionary>(); - foreach (var tag in tags) - { - if (!tag.Key.StartsWith("_relation:")) - { - continue; - } + foreach (var tag in tags) { + if (tag.Key.StartsWith("_relation:")) { + var keyParts = tag.Key.Split(":"); + if (keyParts.Length != 3) { + continue; + } + var relationName = keyParts[1]; + if (!relationTags.ContainsKey(relationName)) { + relationTags.Add(relationName, new Dictionary()); + } - var keyParts = tag.Key.Split(":"); - if (keyParts.Length != 3) - { - continue; + relationTags[relationName].Add(keyParts[2], tag.Value); } - var relationName = keyParts[1]; - if (!relationTags.ContainsKey(relationName)) - { - relationTags.Add(relationName, new Dictionary()); - } - - relationTags[relationName].Add(keyParts[2], tag.Value); } - foreach (var relationTagging in relationTags) - { + foreach (var relationTagging in relationTags) { var result = arguments[0].Evaluate(c, new Constant(relationTagging.Value)); - if (result.Equals("yes")) - { + if (result.Equals("yes")) { return "yes"; } } @@ -87,8 +77,7 @@ namespace AspectedRouting.Language.Functions public override IExpression Specialize(IEnumerable allowedTypes) { var unified = Types.SpecializeTo(allowedTypes); - if (unified == null) - { + if (unified == null) { return null; } diff --git a/AspectedRouting/Language/Functions/Min.cs b/AspectedRouting/Language/Functions/Min.cs index e4678e4..6619181 100644 --- a/AspectedRouting/Language/Functions/Min.cs +++ b/AspectedRouting/Language/Functions/Min.cs @@ -10,7 +10,7 @@ namespace AspectedRouting.Language.Functions public override string Description { get; } = "Out of a list of values, gets the smallest value. In case of a list of bools, this acts as `and`. Note that 'null'-values are ignored."; - public override List ArgNames { get; } = new List { "list" }; + public override List ArgNames { get; } = new List {"list"}; public Min() : base("min", true, new[] @@ -44,8 +44,8 @@ namespace AspectedRouting.Language.Functions public override object Evaluate(Context c, params IExpression[] arguments) { - var ls = ((IEnumerable)arguments[0].Evaluate(c)).Where(o => o != null); - var expectedType = ((Curry)Types.First()).ResultType; + var ls = ((IEnumerable) arguments[0].Evaluate(c)).Where(o => o != null); + var expectedType = ((Curry) Types.First()).ResultType; switch (expectedType) { @@ -67,7 +67,7 @@ namespace AspectedRouting.Language.Functions o = e.Evaluate(c); } - return (double)o; + return (double) o; }).Min(); default: return ls.Select(o => @@ -77,7 +77,7 @@ namespace AspectedRouting.Language.Functions o = e.Evaluate(c); } - return (int)o; + return (int) o; }).Min(); } } diff --git a/AspectedRouting/Language/Functions/Multiply.cs b/AspectedRouting/Language/Functions/Multiply.cs index 827b4d5..cda49a9 100644 --- a/AspectedRouting/Language/Functions/Multiply.cs +++ b/AspectedRouting/Language/Functions/Multiply.cs @@ -10,7 +10,7 @@ namespace AspectedRouting.Language.Functions public override string Description { get; } = "Multiplies all the values in a given list. On a list of booleans, this acts as 'and' or 'all', as `false` and `no` are interpreted as zero. Null values are ignored and thus considered to be `one`"; - public override List ArgNames { get; } = new List { "list" }; + public override List ArgNames { get; } = new List {"list"}; public Multiply() : base("multiply", true, @@ -43,8 +43,8 @@ namespace AspectedRouting.Language.Functions public override object Evaluate(Context c, params IExpression[] arguments) { - var ls = ((IEnumerable)arguments[0].Evaluate(c)).Where(o => o != null); - var expectedType = ((Curry)Types.First()).ResultType; + var ls = ((IEnumerable) arguments[0].Evaluate(c)).Where(o => o != null); + var expectedType = ((Curry) Types.First()).ResultType; switch (expectedType) @@ -81,7 +81,7 @@ namespace AspectedRouting.Language.Functions o = e.Evaluate(c); } - mult *= (double)o; + mult *= (double) o; } return mult; @@ -95,7 +95,7 @@ namespace AspectedRouting.Language.Functions o = e.Evaluate(c); } - multI *= (int)o; + multI *= (int) o; } return multI; diff --git a/AspectedRouting/Language/Functions/MustMatch.cs b/AspectedRouting/Language/Functions/MustMatch.cs index 3b503d8..8e887e0 100644 --- a/AspectedRouting/Language/Functions/MustMatch.cs +++ b/AspectedRouting/Language/Functions/MustMatch.cs @@ -42,8 +42,7 @@ namespace AspectedRouting.Language.Functions public override IExpression Specialize(IEnumerable allowedTypes) { var unified = Types.SpecializeTo(allowedTypes); - if (unified == null) - { + if (unified == null) { return null; } @@ -52,50 +51,43 @@ namespace AspectedRouting.Language.Functions public override object Evaluate(Context c, params IExpression[] arguments) { - var neededKeys = (IEnumerable)arguments[0].Evaluate(c); + var neededKeys = (IEnumerable) arguments[0].Evaluate(c); var function = arguments[1]; - var tags = (Dictionary)arguments[2].Evaluate(c); + var tags = (Dictionary) arguments[2].Evaluate(c); - foreach (var oo in neededKeys) - { + foreach (var oo in neededKeys) { var o = oo; - while (o is IExpression e) - { + while (o is IExpression e) { o = e.Evaluate(c); } - if (!(o is string tagKey)) - { + if (!(o is string tagKey)) { continue; } - if (!tags.ContainsKey(tagKey)) - { + if (!tags.ContainsKey(tagKey)) { // A required key is missing // Normally, we return no; but there is a second chance // IF the mapping returns 'yes' on null, we make an exception and ignore it var applied = function.Evaluate(c, new Constant(new Dictionary { {tagKey, ""} })); - if (applied == null) - { + if (applied == null) { return "no"; } - if (applied.Equals("yes") || (applied is IEnumerable l && l.Count() > 0 && l.ToList()[0].Equals("yes"))) - { + if (applied.Equals("yes") || (applied is IEnumerable l && l.Count() > 0 && l.ToList()[0].Equals("yes")) ) { continue; // We ignore the absence of the key } return "no"; } } - var result = (IEnumerable)function.Evaluate(c, new Constant(tags)); + var result = (IEnumerable) function.Evaluate(c, new Constant(tags)); if (result.Any(o => o == null || - o is string s && (s.Equals("no") || s.Equals("false")))) - { + o is string s && (s.Equals("no") || s.Equals("false")))) { // The mapped function is executed. If the mapped function gives 'no', null or 'false' for any value, "no" is returned return "no"; } diff --git a/AspectedRouting/Language/Functions/NotEq.cs b/AspectedRouting/Language/Functions/NotEq.cs index 37ff7f6..cd5e9d4 100644 --- a/AspectedRouting/Language/Functions/NotEq.cs +++ b/AspectedRouting/Language/Functions/NotEq.cs @@ -7,14 +7,14 @@ namespace AspectedRouting.Language.Functions public class NotEq : Function { public override string Description { get; } = "OVerloaded function, either boolean not or returns 'yes' if the two passed in values are _not_ the same;"; - public override List ArgNames { get; } = new List { "a", "b" }; + public override List ArgNames { get; } = new List {"a", "b"}; public NotEq() : base("notEq", true, new[] { Curry.ConstructFrom(Typs.Bool, new Var("a"), new Var("a")), Curry.ConstructFrom(Typs.String, new Var("a"), new Var("a")), - new Curry(Typs.Bool, Typs.Bool), + new Curry(Typs.Bool, Typs.Bool), }) { Funcs.AddBuiltin(this, "not"); @@ -43,7 +43,7 @@ namespace AspectedRouting.Language.Functions var booleanArg = arguments[0].Evaluate(c); return booleanArg.Equals("no"); } - + var arg0 = arguments[0].Evaluate(c); var arg1 = arguments[1].Evaluate(c); if ((!(arg0?.Equals(arg1) ?? false))) diff --git a/AspectedRouting/Language/Functions/Parameter.cs b/AspectedRouting/Language/Functions/Parameter.cs index dd9f533..d940bbb 100644 --- a/AspectedRouting/Language/Functions/Parameter.cs +++ b/AspectedRouting/Language/Functions/Parameter.cs @@ -14,7 +14,7 @@ namespace AspectedRouting.Language.Functions public Parameter(string s) { - Types = new[] { new Var("parameter") }; + Types = new[] {new Var("parameter") }; ParamName = s; } @@ -28,7 +28,7 @@ namespace AspectedRouting.Language.Functions { var paramName = ParamName.TrimStart('#'); // context saves paramnames without '#' var value = c?.Parameters?.GetValueOrDefault(paramName, null); - if (value is Constant constant) + if(value is Constant constant) { return constant.Evaluate(c); } @@ -37,11 +37,6 @@ namespace AspectedRouting.Language.Functions public IExpression Specialize(IEnumerable allowedTypes) { - /* var filtered = allowedTypes.Where(at => !(at is Curry)); - if (filtered.Count() == 0) - { - return null; - }*/ var unified = Types.SpecializeTo(allowedTypes); if (unified == null) { @@ -50,24 +45,22 @@ namespace AspectedRouting.Language.Functions return new Parameter(unified, ParamName); } - + public IExpression PruneTypes(System.Func allowedTypes) { var passedTypes = this.Types.Where(allowedTypes); - if (!passedTypes.Any()) - { + if (!passedTypes.Any()) { return null; } return new Parameter(passedTypes, this.ParamName); } - public IExpression Optimize(out bool somethingChanged) + public IExpression Optimize() { - somethingChanged = false; return this; } - + public IExpression OptimizeWithArgument(IExpression arg) { throw new NotSupportedException("Trying to invoke a parameter"); @@ -78,26 +71,9 @@ namespace AspectedRouting.Language.Functions f(this); } - public bool Equals(IExpression other) - { - if (other is Parameter p) - { - return p.ParamName.Equals(this.ParamName); - } - - return false; - } - - public string Repr() - { - return "new Parameter(\"" + this.ParamName + "\")"; - } - public override string ToString() { return ParamName; } - - } } \ No newline at end of file diff --git a/AspectedRouting/Language/Functions/Parse.cs b/AspectedRouting/Language/Functions/Parse.cs index 7205997..1a5652a 100644 --- a/AspectedRouting/Language/Functions/Parse.cs +++ b/AspectedRouting/Language/Functions/Parse.cs @@ -11,7 +11,7 @@ namespace AspectedRouting.Language.Functions public class Parse : Function { public override string Description { get; } = "Parses a string into a numerical value. Returns 'null' if parsing fails or no input is given. If a duration is given (e.g. `01:15`), then the number of minutes (75) is returned"; - public override List ArgNames { get; } = new List { "s" }; + public override List ArgNames { get; } = new List{"s"}; public Parse() : base("parse", true, new[] @@ -39,18 +39,18 @@ namespace AspectedRouting.Language.Functions public override object Evaluate(Context c, params IExpression[] arguments) { - var arg = (string)arguments[0].Evaluate(c); - var expectedType = ((Curry)Types.First()).ResultType; + var arg = (string) arguments[0].Evaluate(c); + var expectedType = ((Curry) Types.First()).ResultType; var duration = Regex.Match(arg, @"^(\d+):(\d+)$"); if (duration.Success) { // This is a duration of the form 'hh:mm' -> we return the total minute count - var hours = int.Parse(duration.Groups[1].Value); - var minutes = int.Parse(duration.Groups[2].Value); - arg = (hours * 60 + minutes).ToString(); + var hours = int.Parse(duration.Groups[1].Value); + var minutes = int.Parse(duration.Groups[2].Value); + arg = (hours * 60 + minutes).ToString(); } - + try { @@ -62,12 +62,12 @@ namespace AspectedRouting.Language.Functions default: return int.Parse(arg); } } - catch (Exception) + catch (Exception e) { Console.Error.WriteLine("Could not parse " + arg + " as " + expectedType); return null; } - + } } } \ No newline at end of file diff --git a/AspectedRouting/Language/Functions/StringStringToTagsFunction.cs b/AspectedRouting/Language/Functions/StringStringToTagsFunction.cs index 52b1cfc..f627c19 100644 --- a/AspectedRouting/Language/Functions/StringStringToTagsFunction.cs +++ b/AspectedRouting/Language/Functions/StringStringToTagsFunction.cs @@ -10,7 +10,7 @@ namespace AspectedRouting.Language.Functions "*stringToTags* converts a function `string -> string -> a` into a function `tags -> [a]`. " + "It is used internally to convert a hash of functions. `stringToTags` shouldn't be needed when implementing profiles."; - public override List ArgNames { get; } = new List { "f", "tags" }; + public override List ArgNames { get; } = new List {"f", "tags"}; private static readonly Type _baseFunction = Curry.ConstructFrom(new Var("a"), Typs.String, Typs.String); @@ -33,9 +33,8 @@ namespace AspectedRouting.Language.Functions public override object Evaluate(Context c, params IExpression[] arguments) { var f = arguments[0]; - var tags = (Dictionary)arguments[1].Evaluate(c); - if (tags == null) - { + var tags = (Dictionary) arguments[1].Evaluate(c); + if (tags == null) { return null; } var result = new List(); diff --git a/AspectedRouting/Language/Functions/Sum.cs b/AspectedRouting/Language/Functions/Sum.cs index d03e7a8..63792f4 100644 --- a/AspectedRouting/Language/Functions/Sum.cs +++ b/AspectedRouting/Language/Functions/Sum.cs @@ -8,7 +8,7 @@ namespace AspectedRouting.Language.Functions public class Sum : Function { public override string Description { get; } = "Sums all the numbers in the given list. If the list is a list of booleans, `yes` or `true` will be considered to equal `1`. Null values are ignored (and thus handled as being `0`)"; - public override List ArgNames { get; } = new List { "list" }; + public override List ArgNames { get; } = new List{"list"}; public Sum() : base("sum", true, new[] @@ -17,7 +17,7 @@ namespace AspectedRouting.Language.Functions new Curry(new ListType(Typs.Int), Typs.Int), new Curry(new ListType(Typs.PDouble), Typs.PDouble), new Curry(new ListType(Typs.Double), Typs.Double), - new Curry(new ListType(Typs.Bool), Typs.Int), + new Curry(new ListType(Typs.Bool), Typs.Int), }) { Funcs.AddBuiltin(this, "plus"); @@ -44,15 +44,15 @@ namespace AspectedRouting.Language.Functions public override object Evaluate(Context c, params IExpression[] arguments) { - var ls = ((IEnumerable)arguments[0] + var ls = ((IEnumerable) arguments[0] .Evaluate(c)) - .Where(o => o != null); + .Where(o => o!=null); var expectedType = (Types.First() as Curry).ResultType; switch (expectedType) { case BoolType _: - var sumB = 0; + var sumB= 0; foreach (var o in ls) { if (o.Equals("yes") || o.Equals("true")) @@ -67,7 +67,7 @@ namespace AspectedRouting.Language.Functions var sum = 0.0; foreach (var o in ls) { - sum += (double)o; + sum += (double) o; } return sum; @@ -75,7 +75,7 @@ namespace AspectedRouting.Language.Functions var sumI = 1; foreach (var o in ls) { - sumI += (int)o; + sumI += (int) o; } return sumI; diff --git a/AspectedRouting/Language/Functions/ToString.cs b/AspectedRouting/Language/Functions/ToString.cs index 5553900..0110cdb 100644 --- a/AspectedRouting/Language/Functions/ToString.cs +++ b/AspectedRouting/Language/Functions/ToString.cs @@ -7,10 +7,10 @@ namespace AspectedRouting.Language.Functions public class ToString : Function { public override string Description { get; } = "Converts a value into a human readable string"; - public override List ArgNames { get; } = new List { "obj" }; + public override List ArgNames { get; } = new List{"obj"}; public ToString() : base("to_string", true, - new[] { new Curry(new Var("a"), Typs.String) }) + new[] {new Curry(new Var("a"), Typs.String)}) { } diff --git a/AspectedRouting/Language/IExpression.cs b/AspectedRouting/Language/IExpression.cs index bf575ba..a47189b 100644 --- a/AspectedRouting/Language/IExpression.cs +++ b/AspectedRouting/Language/IExpression.cs @@ -1,7 +1,6 @@ using System; using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; -using System.IO; using System.Linq; using AspectedRouting.Language.Functions; using AspectedRouting.Language.Typ; @@ -32,83 +31,58 @@ namespace AspectedRouting.Language /// Optimize a single expression, eventually recursively (e.g. a list can optimize all the contents) /// /// - IExpression Optimize(out bool somethingChanged); + IExpression Optimize(); /// /// Optimize with the given argument, e.g. listdot can become a list of applied arguments. + /// By default, this should return 'this.Apply(argument)' /// /// /// // IExpression OptimizeWithArgument(IExpression argument); void Visit(Func f); - - bool Equals(IExpression other); - - /** - * Builds a string representation that can be used to paste into C# test programs - */ - string Repr(); - - } public static class ExpressionExtensions { - - public static void PrintRepr(this IExpression e) - { - Console.WriteLine(e.Repr() + "\n\n-----------\n"); - } public static object Run(this IExpression e, Context c, Dictionary tags) { - try - { + try { var result = e.Apply(new Constant(tags)).Evaluate(c); - while (result is IExpression ex) - { + while (result is IExpression ex) { result = ex.Apply(new Constant(tags)).Evaluate(c); } return result; } - catch (Exception err) - { + catch (Exception err) { throw new Exception($"While evaluating the expression {e} with arguments a list of tags", err); } } - public static double EvaluateDouble(this IExpression e, string paramName, Context c, params IExpression[] arguments) - { - return Utils.AsDouble(e.Evaluate(c, arguments), paramName); - } - public static IExpression Specialize(this IExpression e, Type t) { - if (t == null) - { + if (t == null) { throw new NullReferenceException("Cannot specialize to null"); } - return e.Specialize(new[] { t }); + return e.Specialize(new[] {t}); } public static IExpression Specialize(this IExpression e, Dictionary substitutions) { var newTypes = new HashSet(); - foreach (var oldType in e.Types) - { + foreach (var oldType in e.Types) { var newType = oldType.Substitute(substitutions); - if (newType == null) - { + if (newType == null) { continue; } newTypes.Add(newType); } - if (!newTypes.Any()) - { + if (!newTypes.Any()) { return null; } @@ -135,28 +109,23 @@ namespace AspectedRouting.Language var allExpressions = new HashSet(); specializedExpressions = allExpressions; - foreach (var expr in exprs) - { - if (specializedTypes == null) - { - specializedTypes = expr.Types; // This is t + foreach (var expr in exprs) { + if (specializedTypes == null) { + specializedTypes = expr.Types; } - else - { + else { var newlySpecialized = Typs.WidestCommonTypes(specializedTypes, expr.Types); - if (!newlySpecialized.Any()) - { - throw new ArgumentException("Could not find a common ground for types " + specializedTypes.Pretty() + " and " + expr.Types.Pretty()); + if (!newlySpecialized.Any()) { + throw new ArgumentException("Could not find a common ground for types "+specializedTypes.Pretty()+ " and "+expr.Types.Pretty()); } specializedTypes = newlySpecialized; } - + } - foreach (var expr in exprs) - { + foreach (var expr in exprs) { var e = expr.Specialize(specializedTypes); allExpressions.Add(e); } diff --git a/AspectedRouting/Language/Typ/Curry.cs b/AspectedRouting/Language/Typ/Curry.cs index be27a29..5fa9c22 100644 --- a/AspectedRouting/Language/Typ/Curry.cs +++ b/AspectedRouting/Language/Typ/Curry.cs @@ -14,8 +14,8 @@ namespace AspectedRouting.Language.Typ ArgType = argType; ResultType = resultType; } - - + + private static string ToString(Type argType, Type resultType) { var arg = argType.ToString(); diff --git a/AspectedRouting/Language/Typ/Type.cs b/AspectedRouting/Language/Typ/Type.cs index 881a351..bde25a6 100644 --- a/AspectedRouting/Language/Typ/Type.cs +++ b/AspectedRouting/Language/Typ/Type.cs @@ -10,7 +10,7 @@ namespace AspectedRouting.Language.Typ Typs.AddBuiltin(this); } - + } public string Name { get; } diff --git a/AspectedRouting/Language/Typ/Typs.cs b/AspectedRouting/Language/Typ/Typs.cs index 73971e9..f027689 100644 --- a/AspectedRouting/Language/Typ/Typs.cs +++ b/AspectedRouting/Language/Typ/Typs.cs @@ -30,20 +30,16 @@ namespace AspectedRouting.Language.Typ var results = new HashSet(); allowedTypes = allowedTypes.ToList(); - foreach (var t0 in types0) - { - foreach (var allowed in allowedTypes) - { + foreach (var t0 in types0) { + foreach (var allowed in allowedTypes) { var unified = t0.Unify(allowed, reverseSuperSet); - if (unified != null) - { + if (unified != null) { results.Add(unified); } } } - if (results.Any()) - { + if (results.Any()) { return results; } @@ -63,14 +59,12 @@ namespace AspectedRouting.Language.Typ public static Type Unify(this Type t0, Type t1, bool reverseSuperset = false) { var table = t0.UnificationTable(t1, reverseSuperset); - if (table == null) - { + if (table == null) { return null; } var subbed = t0.Substitute(table); - if (reverseSuperset) - { + if (reverseSuperset) { return SelectSmallestUnion(t1, subbed); } @@ -85,8 +79,7 @@ namespace AspectedRouting.Language.Typ /// private static Type SelectSmallestUnion(this Type wider, Type smaller) { - switch (wider) - { + switch (wider) { case Var a: return a; case ListType l when smaller is ListType lsmaller: @@ -100,8 +93,7 @@ namespace AspectedRouting.Language.Typ cWider.ResultType.SelectSmallestUnion(cSmaller.ResultType); return new Curry(arg, result); default: - if (wider.IsSuperSet(smaller) && !smaller.IsSuperSet(wider)) - { + if (wider.IsSuperSet(smaller) && !smaller.IsSuperSet(wider)) { return smaller; } @@ -119,8 +111,7 @@ namespace AspectedRouting.Language.Typ public static IEnumerable UnifyAll(this Type t0, IEnumerable t1) { var result = t1.Select(t => t0.Unify(t)).ToHashSet(); - if (result.Any(x => x == null)) - { + if (result.Any(x => x == null)) { return null; } @@ -130,8 +121,7 @@ namespace AspectedRouting.Language.Typ public static Type Substitute(this Type t0, Dictionary substitutions) { - switch (t0) - { + switch (t0) { case Var a when substitutions.TryGetValue(a.Name, out var t): return t; case ListType l: @@ -161,8 +151,7 @@ namespace AspectedRouting.Language.Typ bool AddSubs(string key, Type valueToAdd) { - if (substitutionsOn0.TryGetValue(key, out var oldSubs)) - { + if (substitutionsOn0.TryGetValue(key, out var oldSubs)) { return oldSubs.Equals(valueToAdd); } @@ -172,15 +161,12 @@ namespace AspectedRouting.Language.Typ bool AddAllSubs(Dictionary table) { - if (table == null) - { + if (table == null) { return false; } - foreach (var (key, tp) in table) - { - if (!AddSubs(key, tp)) - { + foreach (var (key, tp) in table) { + if (!AddSubs(key, tp)) { return false; } } @@ -188,54 +174,45 @@ namespace AspectedRouting.Language.Typ return true; } - switch (t0) - { + switch (t0) { case Var a: - if (!AddSubs(a.Name, t1)) - { + if (!AddSubs(a.Name, t1)) { return null; } break; - case ListType l0 when t1 is ListType l1: - { - var table = l0.InnerType.UnificationTable(l1.InnerType, reverseSupersetRelation); - if (!AddAllSubs(table)) - { - return null; - } - - break; + case ListType l0 when t1 is ListType l1: { + var table = l0.InnerType.UnificationTable(l1.InnerType, reverseSupersetRelation); + if (!AddAllSubs(table)) { + return null; } - case Curry curry0 when t1 is Curry curry1: - { - // contravariance for arguments: reversed - var tableA = curry0.ArgType.UnificationTable(curry1.ArgType, !reverseSupersetRelation); - var tableB = curry0.ResultType.UnificationTable(curry1.ResultType, reverseSupersetRelation); - if (!(AddAllSubs(tableA) && AddAllSubs(tableB))) - { - return null; - } + break; + } - break; + case Curry curry0 when t1 is Curry curry1: { + // contravariance for arguments: reversed + var tableA = curry0.ArgType.UnificationTable(curry1.ArgType, !reverseSupersetRelation); + var tableB = curry0.ResultType.UnificationTable(curry1.ResultType, reverseSupersetRelation); + if (!(AddAllSubs(tableA) && AddAllSubs(tableB))) { + return null; } + break; + } + default: - if (t1 is Var v) - { + if (t1 is Var v) { AddSubs(v.Name, t0); break; } - if (!reverseSupersetRelation && !t0.IsSuperSet(t1)) - { + if (!reverseSupersetRelation && !t0.IsSuperSet(t1)) { return null; } - if (reverseSupersetRelation && !t1.IsSuperSet(t0)) - { + if (reverseSupersetRelation && !t1.IsSuperSet(t0)) { return null; } @@ -250,28 +227,23 @@ namespace AspectedRouting.Language.Typ // We do not have to worry about overlapping names, as they should be cleaned before calling this method bool appliedTransitivity; - do - { + do { appliedTransitivity = false; var keys = substitutionsOn0.Keys.ToList(); - foreach (var key in keys) - { + foreach (var key in keys) { var val = substitutionsOn0[key]; var usedVars = val.UsedVariables(); var isContained = keys.Any(usedVars.Contains); - if (!isContained) - { + if (!isContained) { continue; } var newVal = val.Substitute(substitutionsOn0); - if (newVal.Equals(val)) - { + if (newVal.Equals(val)) { continue; } - if (newVal.UsedVariables().Contains(key) && !newVal.Equals(new Var(key))) - { + if (newVal.UsedVariables().Contains(key) && !newVal.Equals(new Var(key))) { // The substitution contains itself; and it is bigger then itself // This means that $a is substituted by e.g. ($a -> $x), implying an infinite and contradictory type return null; @@ -288,23 +260,20 @@ namespace AspectedRouting.Language.Typ public static HashSet UsedVariables(this Type t0, HashSet addTo = null) { addTo ??= new HashSet(); - switch (t0) - { + switch (t0) { case Var a: addTo.Add(a.Name); break; - case ListType l0: - { - l0.InnerType.UsedVariables(addTo); - break; - } + case ListType l0: { + l0.InnerType.UsedVariables(addTo); + break; + } - case Curry curry0: - { - curry0.ArgType.UsedVariables(addTo); - curry0.ResultType.UsedVariables(addTo); - break; - } + case Curry curry0: { + curry0.ArgType.UsedVariables(addTo); + curry0.ResultType.UsedVariables(addTo); + break; + } } @@ -313,13 +282,11 @@ namespace AspectedRouting.Language.Typ public static bool IsSuperSet(this Type t0, Type t1) { - if (t0 is Var || t1 is Var) - { + if (t0 is Var || t1 is Var) { return true; } - switch (t0) - { + switch (t0) { case StringType _ when t1 is BoolType _: return true; case DoubleType _ when t1 is PDoubleType _: @@ -338,11 +305,10 @@ namespace AspectedRouting.Language.Typ case ListType l0 when t1 is ListType l1: return l0.InnerType.IsSuperSet(l1.InnerType); - case Curry c0 when t1 is Curry c1: - { - return c0.ResultType.IsSuperSet(c1.ResultType) && - c1.ArgType.IsSuperSet(c0.ArgType); // contravariance for arguments: reversed order! - } + case Curry c0 when t1 is Curry c1: { + return c0.ResultType.IsSuperSet(c1.ResultType) && + c1.ArgType.IsSuperSet(c0.ArgType); // contravariance for arguments: reversed order! + } } @@ -363,8 +329,7 @@ namespace AspectedRouting.Language.Typ // The substitution table var subsTable = new Dictionary(); - foreach (var v in variablesToRename) - { + foreach (var v in variablesToRename) { var newValue = Var.Fresh(alreadyUsed); subsTable.Add(v, newValue); alreadyUsed.Add(newValue.Name); @@ -377,8 +342,7 @@ namespace AspectedRouting.Language.Typ public static List Uncurry(this Type t) { var args = new List(); - while (t is Curry c) - { + while (t is Curry c) { args.Add(c.ArgType); t = c.ResultType; } @@ -401,16 +365,12 @@ namespace AspectedRouting.Language.Typ { var widest = new HashSet(); - foreach (var type0 in t0) - { - foreach (var type1 in t1) - { + foreach (var type0 in t0) { + foreach (var type1 in t1) { var t = WidestCommonType(type0, type1); - if (t != null) - { + if (t != null) { var (type, subsTable) = t.Value; - if (subsTable != null) - { + if (subsTable != null) { type = type.Substitute(subsTable); } widest.Add(type); @@ -437,54 +397,44 @@ namespace AspectedRouting.Language.Typ { // First things first: we try to unify - if (t0 is Curry c0 && t1 is Curry c1) - { + if (t0 is Curry c0 && t1 is Curry c1) { var arg = SmallestCommonType(c0.ArgType, c1.ArgType); var result = WidestCommonType(c0.ResultType, c1.ResultType); - if (arg == null) - { + if (arg == null) { return null; } var (argT, subs0) = arg.Value; - if (result == null) - { + if (result == null) { return null; } var (resultT, subs1) = result.Value; return (new Curry(argT, resultT), MergeDicts(subs0, subs1)); } - - if (t0 is Var v) - { - if (t1 is Var vx) - { - if (v.Name == vx.Name) - { + + if (t0 is Var v) { + if (t1 is Var vx) { + if (v.Name == vx.Name) { return (t0, null); } } - return (t1, new Dictionary { { v.Name, t1 } }); + return (t1, new Dictionary {{v.Name, t1}}); } - if (t1 is Var v1) - { - return (t0, new Dictionary { { v1.Name, t1 } }); + if (t1 is Var v1) { + return (t0, new Dictionary {{v1.Name, t1}}); } - if (t0 == t1 || t0.Equals(t1)) - { + if (t0 == t1 || t0.Equals(t1)) { return (t0, null); } var t0IsSuperT1 = t0.IsSuperSet(t1); var t1IsSuperT0 = t1.IsSuperSet(t0); - if (t0IsSuperT1 && !t1IsSuperT0) - { + if (t0IsSuperT1 && !t1IsSuperT0) { return (t0, null); } - if (t1IsSuperT0 && !t0IsSuperT1) - { + if (t1IsSuperT0 && !t0IsSuperT1) { return (t1, null); } @@ -494,25 +444,20 @@ namespace AspectedRouting.Language.Typ private static Dictionary MergeDicts(Dictionary subs0, Dictionary subs1) { - if (subs0 == null && subs1 == null) - { + if (subs0 == null && subs1 == null) { return null; } var subsTable = new Dictionary(); void AddSubs(Dictionary dict) { - if (dict == null) - { + if (dict == null) { return; } - foreach (var kv in dict) - { - if (subsTable.TryGetValue(kv.Key, out var t)) - { + foreach (var kv in dict) { + if (subsTable.TryGetValue(kv.Key, out var t)) { // We have seen this variable-type-name before... We should check if it matches - if (t.Equals(kv.Value)) - { + if (t.Equals(kv.Value)) { // Ok! No problem! // It is already added anyway, so we continue continue; @@ -522,15 +467,13 @@ namespace AspectedRouting.Language.Typ throw new Exception(t + " != " + kv.Value); } - if (kv.Value is Var v) - { - if (v.Name == kv.Key) - { + if (kv.Value is Var v) { + if (v.Name == kv.Key) { // Well, this is a useless substitution... continue; } } - + subsTable[kv.Key] = kv.Value; } } @@ -538,11 +481,10 @@ namespace AspectedRouting.Language.Typ AddSubs(subs0); AddSubs(subs1); - if (!subsTable.Any()) - { + if (!subsTable.Any()) { return null; } - + return subsTable; } @@ -560,49 +502,41 @@ namespace AspectedRouting.Language.Typ /// public static (Type, Dictionary substitutionTable)? SmallestCommonType(Type t0, Type t1) { - if (t0 is Curry c0 && t1 is Curry c1) - { + if (t0 is Curry c0 && t1 is Curry c1) { var arg = WidestCommonType(c0.ArgType, c1.ArgType); var result = SmallestCommonType(c0.ResultType, c1.ResultType); - if (arg == null) - { + if (arg == null) { return null; } var (argT, subs0) = arg.Value; - if (result == null) - { + if (result == null) { return null; } var (resultT, subs1) = result.Value; return (new Curry(argT, resultT), MergeDicts(subs0, subs1)); } - - - if (t0 is Var v) - { - return (t1, new Dictionary { { v.Name, t1 } }); + + + if (t0 is Var v) { + return (t1, new Dictionary {{v.Name, t1}}); } - if (t1 is Var v1) - { - return (t0, new Dictionary { { v1.Name, t1 } }); + if (t1 is Var v1) { + return (t0, new Dictionary {{v1.Name, t1}}); } - if (t0 == t1 || t0.Equals(t1)) - { + if (t0 == t1 || t0.Equals(t1)) { return (t0, null); } - + var t0IsSuperT1 = t0.IsSuperSet(t1); var t1IsSuperT0 = t1.IsSuperSet(t0); - if (t0IsSuperT1 && !t1IsSuperT0) - { + if (t0IsSuperT1 && !t1IsSuperT0) { return (t0, null); } - if (t1IsSuperT0 && !t0IsSuperT1) - { + if (t1IsSuperT0 && !t0IsSuperT1) { return (t1, null); } diff --git a/AspectedRouting/Printer.cs b/AspectedRouting/Printer.cs deleted file mode 100644 index 000f85c..0000000 --- a/AspectedRouting/Printer.cs +++ /dev/null @@ -1,148 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Net; -using AspectedRouting.IO.itinero1; -using AspectedRouting.IO.itinero2; -using AspectedRouting.IO.md; -using AspectedRouting.Language; -using AspectedRouting.Language.Expression; -using AspectedRouting.Tests; - -namespace AspectedRouting -{ - /** - * Prints to the specified location - */ - public class Printer - { - private readonly List<(AspectMetadata aspect, AspectTestSuite tests)> _aspects; - private readonly Context _context; - private readonly string _outputDirectory; - private readonly ProfileMetaData _profile; - private readonly List _profileTests; - private readonly bool _includeTests; - - public Printer(string outputDirectory, ProfileMetaData profile, Context context, - List<(AspectMetadata aspect, AspectTestSuite tests)> aspects, - List profileTests, bool includeTests) - { - _outputDirectory = outputDirectory; - _profile = profile; - _context = context; - _aspects = aspects; - _profileTests = profileTests; - _includeTests = includeTests; - - - if (!Directory.Exists($"{outputDirectory}/profile-documentation/")) { - Directory.CreateDirectory($"{outputDirectory}/profile-documentation/"); - } - - if (!Directory.Exists($"{outputDirectory}/itinero1/")) { - Directory.CreateDirectory($"{outputDirectory}/itinero1/"); - } - - if (!Directory.Exists($"{outputDirectory}/itinero2/")) { - Directory.CreateDirectory($"{outputDirectory}/itinero2/"); - } - } - - public void PrintUsedTags() - { - var profile = _profile; - var context = _context; - Console.WriteLine("\n\n\n---------- " + profile.Name + - " : used tags and corresponding values --------------"); - foreach (var (key, values) in profile.AllExpressions(context).PossibleTags()) { - var vs = "*"; - if (values.Any()) { - vs = string.Join(", ", values); - } - - Console.WriteLine(key + ": " + vs); - } - - Console.WriteLine("\n\n\n------------------------"); - } - - public void WriteProfile1() - { - var aspectTests = _aspects.Select(a => a.tests).ToList(); - - var luaProfile = new LuaPrinter1(_profile, _context, - aspectTests, - _profileTests - ).ToLua(); - - var itinero1ProfileFile = Path.Combine($"{_outputDirectory}/itinero1/" + _profile.Name + ".lua"); - File.WriteAllText(itinero1ProfileFile, luaProfile); - Console.WriteLine($"Written {new FileInfo(itinero1ProfileFile).FullName}"); - } - - public void WriteAllProfile2() - { - foreach (var (behaviourName,_) in _profile.Behaviours) { - WriteProfile2(behaviourName); - } - } - - public void WriteProfile2(string behaviourName) - { - var aspectTests = _aspects.Select(a => a.tests).ToList(); - - var lua2behaviour = new LuaPrinter2( - _profile, - behaviourName, - _context, - aspectTests, - _profileTests.Where(testsSuite => testsSuite.BehaviourName == behaviourName), - _includeTests - ).ToLua(); - - var itinero2ProfileFile = Path.Combine($"{_outputDirectory}/itinero2/{_profile.Name}.{behaviourName}.lua"); - File.WriteAllText( - itinero2ProfileFile, - lua2behaviour); - Console.WriteLine($"Written {new FileInfo(itinero2ProfileFile).FullName}"); - - - } - - public void PrintMdInfo() - { - var profileMd = new MarkDownSection(); - profileMd.AddTitle(_profile.Name, 1); - - profileMd.Add(_profile.Description); - profileMd.AddTitle("Default parameters", 4); - profileMd.Add("| name | value | ", "| ---- | ---- | ", - string.Join("\n", - _profile.DefaultParameters.Select(delegate(KeyValuePair kv) - { - var v = kv.Value.Evaluate(_context); - if (!(v is string || v is int || v is double)) { - v = "_special value_"; - } - - return $" | {kv.Key} | {v} |"; - })) - ); - foreach (var (behaviourName, vars) in _profile.Behaviours) { - var behaviourMd = new ProfileToMD(_profile, behaviourName, _context); - - File.WriteAllText( - $"{_outputDirectory}/profile-documentation/{_profile.Name}.{behaviourName}.md", - behaviourMd.ToString()); - profileMd.AddTitle($"[{behaviourName}](./{_profile.Name}.{behaviourName}.md)", 2); - profileMd.Add(vars["description"].Evaluate(_context).ToString()); - profileMd.Add(behaviourMd.MainFormula()); - } - - File.WriteAllText( - $"{_outputDirectory}/profile-documentation/{_profile.Name}.md", - profileMd.ToString()); - } - } -} \ No newline at end of file diff --git a/AspectedRouting/Program.cs b/AspectedRouting/Program.cs index b94fe52..003c371 100644 --- a/AspectedRouting/Program.cs +++ b/AspectedRouting/Program.cs @@ -1,10 +1,10 @@ using System; using System.Collections.Generic; -using System.Globalization; using System.IO; using System.Linq; -using System.Threading; using AspectedRouting.IO; +using AspectedRouting.IO.itinero1; +using AspectedRouting.IO.itinero2; using AspectedRouting.IO.jsonParser; using AspectedRouting.Language; using AspectedRouting.Language.Expression; @@ -18,21 +18,19 @@ namespace AspectedRouting this IEnumerable jsonFileNames, List testFileNames, Context context) { var aspects = new List<(AspectMetadata aspect, AspectTestSuite tests)>(); - foreach (var file in jsonFileNames) { + foreach (var file in jsonFileNames) + { var fi = new FileInfo(file); var aspect = JsonParser.AspectFromJson(context, File.ReadAllText(file), fi.Name); - if (aspect == null) { - continue; - } + if (aspect == null) continue; var testName = aspect.Name + ".test.csv"; var testPath = testFileNames.FindTest(testName); AspectTestSuite tests = null; - if (!string.IsNullOrEmpty(testPath) && File.Exists(testPath)) { + if (!string.IsNullOrEmpty(testPath) && File.Exists(testPath)) tests = AspectTestSuite.FromString(aspect, File.ReadAllText(testPath)); - } aspects.Add((aspect, tests)); } @@ -43,13 +41,10 @@ namespace AspectedRouting private static string FindTest(this IEnumerable testFileNames, string testName) { var testPaths = testFileNames.Where(nm => nm.EndsWith(testName)).ToList(); - if (testPaths.Count > 1) { + if (testPaths.Count > 1) Console.WriteLine("[WARNING] Multiple tests found for " + testName + ", using only one arbitrarily"); - } - if (testPaths.Count > 0) { - return testPaths.First(); - } + if (testPaths.Count > 0) return testPaths.First(); return null; } @@ -60,32 +55,35 @@ namespace AspectedRouting { var result = new List<(ProfileMetaData profile, List profileTests)>(); foreach (var jsonFile in jsonFiles) - try { + try + { var profile = JsonParser.ProfileFromJson(context, File.ReadAllText(jsonFile), new FileInfo(jsonFile), lastChange); - if (profile == null) { - continue; - } + if (profile == null) continue; profile.SanityCheckProfile(context); var profileTests = new List(); - foreach (var behaviourName in profile.Behaviours.Keys) { + foreach (var behaviourName in profile.Behaviours.Keys) + { var path = testFiles.FindTest($"{profile.Name}.{behaviourName}.behaviour_test.csv"); - if (path != null && File.Exists(path)) { + if (path != null && File.Exists(path)) + { var test = BehaviourTestSuite.FromString(context, profile, behaviourName, File.ReadAllText(path)); profileTests.Add(test); } - else { + else + { Console.WriteLine($"[{profile.Name}] WARNING: no test found for behaviour {behaviourName}"); } } result.Add((profile, profileTests)); } - catch (Exception e) { + catch (Exception e) + { // PrintError(jsonFile, e); throw new Exception("In the file " + jsonFile, e); } @@ -97,55 +95,58 @@ namespace AspectedRouting { var profile = profiles["emergency_vehicle"]; var behaviour = profile.Behaviours.Keys.First(); - do { + do + { Console.Write(profile.Name + "." + behaviour + " > "); var read = Console.ReadLine(); - if (read == null) { - return; // End of stream has been reached - } + if (read == null) return; // End of stream has been reached - if (read == "") { + if (read == "") + { Console.WriteLine("looƆ sᴉ dɐWʇǝǝɹʇSuǝdO"); continue; } - if (read.Equals("quit")) { - return; - } + if (read.Equals("quit")) return; if (read.Equals("help")) { Console.WriteLine( - Utils.Lines( - "select to change behaviour or to change vehicle", + Utils.Lines("select to change behaviour or to change vehicle", "")); continue; } - if (read.Equals("clear")) { + if (read.Equals("clear")) + { for (var i = 0; i < 80; i++) Console.WriteLine(); continue; } - if (read.StartsWith("select")) { + if (read.StartsWith("select")) + { var beh = read.Substring("select".Length + 1).Trim(); - if (beh.Contains(".")) { + if (beh.Contains(".")) + { var profileName = beh.Split(".")[0]; - if (!profiles.TryGetValue(profileName, out var newProfile)) { + if (!profiles.TryGetValue(profileName, out var newProfile)) + { Console.Error.WriteLine("Profile " + profileName + " not found, ignoring"); continue; } profile = newProfile; - beh = beh.Substring(beh.IndexOf(".", StringComparison.Ordinal) + 1); + beh = beh.Substring(beh.IndexOf(".") + 1); } - if (profile.Behaviours.ContainsKey(beh)) { + if (profile.Behaviours.ContainsKey(beh)) + { behaviour = beh; Console.WriteLine("Switched to " + beh); } - else { + else + { Console.WriteLine("Behaviour not found. Known behaviours are:\n " + string.Join("\n ", profile.Behaviours.Keys)); } @@ -156,27 +157,23 @@ namespace AspectedRouting var tagsRaw = read.Split(";").Select(s => s.Trim()); var tags = new Dictionary(); - foreach (var str in tagsRaw) { - if (str == "") { - continue; - } + foreach (var str in tagsRaw) + { + if (str == "") continue; - try { - var strSplit = str.Split("="); - var k = strSplit[0].Trim(); - var v = strSplit[1].Trim(); - tags[k] = v; - } - catch (Exception) { - Console.Error.WriteLine("Could not parse tag: " + str); - } + var strSplit = str.Split("="); + var k = strSplit[0].Trim(); + var v = strSplit[1].Trim(); + tags[k] = v; } - try { + try + { var result = profile.Run(c, behaviour, tags); Console.WriteLine(result); } - catch (Exception e) { + catch (Exception e) + { Console.WriteLine(e); Console.WriteLine(e.Message); } @@ -186,7 +183,8 @@ namespace AspectedRouting private static void PrintError(string file, Exception exception) { var msg = exception.Message; - while (exception.InnerException != null) { + while (exception.InnerException != null) + { exception = exception.InnerException; msg += "\n " + exception.Message; } @@ -194,59 +192,37 @@ namespace AspectedRouting Console.WriteLine($"Error in the file {file}:\n {msg}"); } - - private static int Main(string[] args) + private static void PrintUsedTags(ProfileMetaData profile, Context context) { - var errMessage = MainWithError(args); - if (errMessage == null) { - return 0; + Console.WriteLine("\n\n\n---------- " + profile.Name + " --------------"); + foreach (var (key, values) in profile.AllExpressions(context).PossibleTags()) + { + var vs = "*"; + if (values.Any()) vs = string.Join(", ", values); + + Console.WriteLine(key + ": " + vs); } - Console.WriteLine(errMessage); - return 1; + Console.WriteLine("\n\n\n------------------------"); } - - private static void WriteOutputFiles(Context context, - List<(AspectMetadata aspect, AspectTestSuite tests)> aspects, string outputDir, - List<(ProfileMetaData profile, List profileTests)> profiles, bool includeTests) + private static void Main(string[] args) { - foreach (var (profile, profileTests) in profiles) { - var printer = new Printer(outputDir, profile, context, aspects, profileTests, includeTests); - printer.PrintUsedTags(); - printer.WriteProfile1(); - printer.PrintMdInfo(); - printer.WriteAllProfile2(); - } - - File.WriteAllText($"{outputDir}/ProfileMetadata.json", - Utils.GenerateExplanationJson(profiles.Select(p => p.profile), context) - ); - File.WriteAllText($"{outputDir}/UsedTags.json", - Utils.GenerateTagsOverview(profiles.Select(p => p.profile), context) - ); + var errMessage = MainWithError(args); + if (errMessage != null) Console.WriteLine(errMessage); } public static string MainWithError(string[] args) { - Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US", false); - if (args.Length < 2) { - return - "Usage: [--include-tests]\n" + - "The flag '--include-tests' will append some self-tests in the lua files"; - } + if (args.Length < 2) + return "Usage: "; var inputDir = args[0]; var outputDir = args[1]; - var includeTests = args.Contains("--include-tests"); - var runRepl = !args.Contains("--no-repl"); - if (!Directory.Exists(outputDir)) { - Directory.CreateDirectory(outputDir); - } + if (!Directory.Exists(outputDir)) Directory.CreateDirectory(outputDir); MdPrinter.GenerateHelpText(outputDir + "helpText.md"); - Console.WriteLine("Written helptext to " + outputDir); var files = Directory.EnumerateFiles(inputDir, "*.json", SearchOption.AllDirectories) @@ -256,10 +232,9 @@ namespace AspectedRouting .ToList(); tests.Sort(); - foreach (var test in tests) { - if (test.EndsWith(".test.csv") || test.EndsWith(".behaviour_test.csv")) { - continue; - } + foreach (var test in tests) + { + if (test.EndsWith(".test.csv") || test.EndsWith(".behaviour_test.csv")) continue; throw new ArgumentException( $"Invalid name for csv file ${test}, should end with either '.behaviour_test.csv' or '.test.csv'"); @@ -272,9 +247,11 @@ namespace AspectedRouting foreach (var (aspect, _) in aspects) context.AddFunction(aspect.Name, aspect); var lastChange = DateTime.UnixEpoch; - foreach (var file in files) { + foreach (var file in files) + { var time = new FileInfo(file).LastWriteTimeUtc; - if (lastChange < time) { + if (lastChange < time) + { lastChange = time; } } @@ -285,33 +262,58 @@ namespace AspectedRouting // With everything parsed and typechecked, time for tests var testsOk = true; foreach (var (aspect, t) in aspects) - if (t == null) { + if (t == null) Console.WriteLine($"[{aspect.Name}] WARNING: no tests found: please add {aspect.Name}.test.csv"); - } - else { + else testsOk &= t.Run(); - } foreach (var (profile, profileTests) in profiles) foreach (var test in profileTests) testsOk &= test.Run(context); - if (testsOk) { - WriteOutputFiles(context, aspects, outputDir, profiles, includeTests); + if (!testsOk) return "Some tests failed, quitting now without generating output"; + + foreach (var (profile, profileTests) in profiles) + { + PrintUsedTags(profile, context); + + var aspectTests = aspects.Select(a => a.tests).ToList(); + var luaProfile = new LuaPrinter1(profile, context, + aspectTests, + profileTests + ).ToLua(); + File.WriteAllText(outputDir + "/" + profile.Name + ".lua", luaProfile); + + foreach (var (behaviourName, _) in profile.Behaviours) + { + var lua2behaviour = new LuaPrinter2( + profile, + behaviourName, + context, + aspectTests, + profileTests.Where(testsSuite => testsSuite.BehaviourName == behaviourName), + lastChange + ).ToLua(); + if (!Directory.Exists($"{outputDir}/itinero2/")) + Directory.CreateDirectory($"{outputDir}/itinero2/"); + File.WriteAllText( + $"{outputDir}/itinero2/{profile.Name}.{behaviourName}.lua", + lua2behaviour); + } } + File.WriteAllText($"{outputDir}/ProfileMetadata.json", + Utils.GenerateExplanationJson(profiles.Select(p => p.profile), context) + ); - if (runRepl) { + if (!args.Contains("--no-repl")) Repl(context, profiles .Select(p => p.profile) .ToDictionary(p => p.Name, p => p)); - } - else { + else Console.WriteLine("Not starting REPL as --no-repl is specified"); - } - - return !testsOk ? "Some tests failed, quitting now without generating output" : null; + return null; } } } \ No newline at end of file diff --git a/AspectedRouting/Tests/AspectTestSuite.cs b/AspectedRouting/Tests/AspectTestSuite.cs index dc5a1d7..236bd96 100644 --- a/AspectedRouting/Tests/AspectTestSuite.cs +++ b/AspectedRouting/Tests/AspectTestSuite.cs @@ -1,6 +1,5 @@ using System; using System.Collections.Generic; -using System.Globalization; using System.Linq; using AspectedRouting.Language; using AspectedRouting.Language.Expression; @@ -17,8 +16,7 @@ namespace AspectedRouting.Tests AspectMetadata functionToApply, IEnumerable<(string expected, Dictionary tags)> tests) { - if (functionToApply == null) - { + if (functionToApply == null) { throw new NullReferenceException("functionToApply is null"); } @@ -34,10 +32,8 @@ namespace AspectedRouting.Tests var tests = new List<(string, Dictionary)>(); - foreach (var test in all.GetRange(1, all.Count - 1)) - { - if (string.IsNullOrEmpty(test.Trim())) - { + foreach (var test in all.GetRange(1, all.Count - 1)) { + if (string.IsNullOrEmpty(test.Trim())) { continue; } @@ -45,11 +41,9 @@ namespace AspectedRouting.Tests var expected = testData[0]; var vals = testData.GetRange(1, testData.Count - 1); var tags = new Dictionary(); - for (var i = 0; i < keys.Count; i++) - { - if (i < vals.Count && !string.IsNullOrEmpty(vals[i])) - { - tags[keys[i]] = vals[i].Trim(new[] { '"' }).Replace("\"", "\\\""); + for (var i = 0; i < keys.Count; i++) { + if (i < vals.Count && !string.IsNullOrEmpty(vals[i])) { + tags[keys[i]] = vals[i].Trim(new []{'"'}).Replace("\"","\\\""); } } @@ -66,10 +60,8 @@ namespace AspectedRouting.Tests public AspectTestSuite WithoutRelationTests() { var newTests = new List<(string expected, Dictionary tags)>(); - foreach (var (expected, tags) in Tests) - { - if (tags.Keys.Any(key => key.StartsWith("_relation") && key.Split(":").Length == 3)) - { + foreach (var (expected, tags) in Tests) { + if (tags.Keys.Any(key => key.StartsWith("_relation") && key.Split(":").Length ==3)) { continue; } newTests.Add((expected, tags)); @@ -83,57 +75,46 @@ namespace AspectedRouting.Tests { var failed = false; var testCase = 0; - foreach (var test in Tests) - { + foreach (var test in Tests) { testCase++; var context = new Context().WithAspectName("unittest"); - foreach (var (key, value) in test.tags) - { - if (key.StartsWith("#")) - { + foreach (var (key, value) in test.tags) { + if (key.StartsWith("#")) { context.AddParameter(key, value); } } - try - { + try { var actual = FunctionToApply.Evaluate(context, new Constant(test.tags)); - if (string.IsNullOrWhiteSpace(test.expected)) - { + if (string.IsNullOrWhiteSpace(test.expected)) { failed = true; Console.WriteLine( $"[{FunctionToApply.Name}] Line {testCase + 1} failed:\n The expected value is not defined or only whitespace. Do you want null? Write null in your test as expected value\n"); continue; } - if (test.expected == "null" && actual == null) - { + if (test.expected == "null" && actual == null) { // Test ok continue; } - if (actual == null) - { + if (actual == null) { Console.WriteLine( $"[{FunctionToApply.Name}] Line {testCase + 1} failed:\n Expected: {test.expected}\n actual value is not defined (null)\n tags: {test.tags.Pretty()}\n"); failed = true; continue; } - - var doesMatch = (actual is double d && Math.Abs(double.Parse(test.expected, NumberStyles.Any, CultureInfo.InvariantCulture) - d) < 0.0001) - || actual.ToString().Equals(test.expected); - - if (!doesMatch) - { + if (!actual.ToString().Equals(test.expected) && + !(actual is double actualD && Math.Abs(double.Parse(test.expected) - actualD) < 0.0001) + ) { failed = true; Console.WriteLine( $"[{FunctionToApply.Name}] Line {testCase + 1} failed:\n Expected: {test.expected}\n actual: {actual}\n tags: {test.tags.Pretty()}\n"); } } - catch (Exception e) - { + catch (Exception e) { Console.WriteLine( $"[{FunctionToApply.Name}] Line {testCase + 1} ERROR:\n Expected: {test.expected}\n error message: {e.Message}\n tags: {test.tags.Pretty()}\n"); Console.WriteLine(e); diff --git a/AspectedRouting/Tests/ProfileResult.cs b/AspectedRouting/Tests/ProfileResult.cs index 8010671..6db5499 100644 --- a/AspectedRouting/Tests/ProfileResult.cs +++ b/AspectedRouting/Tests/ProfileResult.cs @@ -20,38 +20,27 @@ namespace AspectedRouting.Tests private static string str(string s) { - if (s == null) - { + if (s == null) { return ""; } - if (s == "") - { + if (s == "") { return ""; } return s; - } - + } + public override string ToString() { return string.Join("\n ", - " access " + str(Access), - "oneway " + str(Oneway), - "speed " + Speed, - "priority " + Priority, - "because \n " + str(PriorityExplanation) + " access "+str(Access), + "oneway "+str(Oneway), + "speed "+Speed, + "priority "+Priority, + "because \n "+str(PriorityExplanation) ); } - - public override bool Equals(object? obj) - { - if (!(obj is ProfileResult other)) - { - return false; - } - return other.Access == this.Access && other.Oneway == this.Oneway && other.Priority == this.Priority && other.Speed == this.Speed; - } } } \ No newline at end of file diff --git a/AspectedRouting/Tests/ProfileTestSuite.cs b/AspectedRouting/Tests/ProfileTestSuite.cs index 8a71d94..ab71a11 100644 --- a/AspectedRouting/Tests/ProfileTestSuite.cs +++ b/AspectedRouting/Tests/ProfileTestSuite.cs @@ -1,6 +1,5 @@ using System; using System.Collections.Generic; -using System.Globalization; using System.Linq; using AspectedRouting.Language; using AspectedRouting.Language.Expression; @@ -69,13 +68,13 @@ namespace AspectedRouting.Tests var speed = 0.0; if (!string.IsNullOrEmpty(testData[2])) { - speed = double.Parse(testData[2], NumberStyles.Any, CultureInfo.InvariantCulture); + speed = double.Parse(testData[2]); } var weight = 0.0; if (!string.IsNullOrEmpty(testData[3])) { - weight = double.Parse(testData[3], NumberStyles.Any, CultureInfo.InvariantCulture); + weight = double.Parse(testData[3]); } @@ -98,7 +97,7 @@ namespace AspectedRouting.Tests { if (i < vals.Count && !string.IsNullOrEmpty(vals[i])) { - tags[keys[i]] = vals[i].Trim(new[] { '\"' }).Replace("\"", "\\\""); + tags[keys[i]] = vals[i].Trim(new []{'\"'}).Replace("\"","\\\""); } } @@ -140,10 +139,10 @@ namespace AspectedRouting.Tests public bool RunTest(Context c, int i, ProfileResult expected, Dictionary tags) { - void Err(string message, object exp, object act, string extra = "") + void Err(string message, object exp, object act) { Console.WriteLine( - $"[{Profile.Name}.{BehaviourName}]: Test on line {i + 1} failed: {message}: expected {exp} but got {act};\n{extra}\n {{{tags.Pretty()}}}"); + $"[{Profile.Name}.{BehaviourName}]: Test on line {i + 1} failed: {message}; expected {exp} but got {act}\n {{{tags.Pretty()}}}"); } var actual = Profile.Run(c, BehaviourName, tags); @@ -178,19 +177,10 @@ namespace AspectedRouting.Tests if (Math.Abs(actual.Priority - expected.Priority) > 0.0001) { - Err($"weight incorrect", + Err($"weight incorrect. Calculation is {string.Join(" + ", actual.PriorityExplanation)}", expected.Priority, - actual.Priority, - $"Calculation is \n{actual.PriorityExplanation}"); - success = false; - } - - if (actual.Priority >= 100 || actual.Priority <= -100) - {/* - Err($"priority is not within range of -100 and +100. This is needed due to a bug in Itinero2.0, see https://github.com/itinero/routing2/issues/30", - actual.Priority + " < 100 && -100 < "+actual.Priority, actual.Priority); - success = false;*/ + success = false; } diff --git a/AspectedRouting/Utils.cs b/AspectedRouting/Utils.cs index d294008..2c33394 100644 --- a/AspectedRouting/Utils.cs +++ b/AspectedRouting/Utils.cs @@ -15,7 +15,7 @@ namespace AspectedRouting public static List InList(this T t) { - return new List { t }; + return new List {t}; } public static string Lined(this IEnumerable lines) @@ -31,7 +31,9 @@ namespace AspectedRouting public static int Multiply(this IEnumerable ints) { var factor = 1; - foreach (var i in ints) factor += i; + foreach (var i in ints) { + factor += i; + } return factor; } @@ -48,34 +50,6 @@ namespace AspectedRouting return data.SubArray(index, data.Length - index); } - public static string Quoted(this string s) - { - return "\"" + s + "\""; - } - - public static string GenerateTagsOverview(IEnumerable profiles, Context context) - { - var allExpressions = new List(); - foreach (var profile in profiles) - foreach (var behaviour in profile.Behaviours) - allExpressions.AddRange(profile.AllExpressions(context)); - - var explanations = new List(); - foreach (var tag in allExpressions.PossibleTags()) - { - var values = new List(tag.Value); - values.Sort(); - explanations.Add(tag.Key.Quoted() + ": [" + - string.Join(", ", values.Select(v => v.Quoted())) - + "]"); - } - - explanations.Sort(); - - - return "{\n " + string.Join(",\n ", explanations) + "\n}"; - } - /// /// Generates a JSON file where all the profiles are listed, together with descriptions and other metadata. /// Useful for other apps, e.g. the routing api to have @@ -88,65 +62,32 @@ namespace AspectedRouting { var metaItems = new List(); - foreach (var profile in profiles) - { + foreach (var profile in profiles) { var profileName = profile.Name; var author = profile.Author; var profileDescription = profile.Description; - foreach (var behaviour in profile.Behaviours) - { + foreach (var behaviour in profile.Behaviours) { var behaviourDescription = behaviour.Value["description"].Evaluate(new Context()) as string; behaviourDescription ??= ""; - var keys = new List(); - foreach (var tag in profile.AllExpressions(context).PossibleTags()) keys.Add(tag.Key.Quoted()); - - var meta = new Dictionary - { - { "name", behaviour.Key }, - { "type", profileName }, - { "author", author }, - { "description", behaviourDescription + " (" + profileDescription + ")" } + var keys = string.Join(", ", + profile.AllExpressions(context).PossibleTags().Select(tag => $"\"{tag.Key}\"") + ); + var meta = new Dictionary { + {"name", behaviour.Key}, + {"type", profileName}, + {"author", author}, + {"description", behaviourDescription + " (" + profileDescription + ")"} }; + var json = string.Join(",", meta.Select(d => $"\"{d.Key}\": \"{d.Value}\"")); - - metaItems.Add($"{{{json}, " + - $"\"usedKeys\": [{string.Join(", ", keys)}] }}\n"); + metaItems.Add("{" + json + ", \"usedKeys\": [" + keys + "] }\n"); } } return "[" + string.Join(",\n", metaItems) + "]"; } - - /** - * Parses an object, converts it to a double. - * throws an exception if not a double - */ - public static double AsDouble(object obj, string paramName) - { - if (obj == null) - { - throw new Exception($"Invalid value as result for {paramName}: got null"); - } - switch (obj) - { - case bool b: - return b ? 1.0 : 0.0; - case double d: - return d; - case int j: - return j; - case string s: - if (s.Equals("yes")) return 1.0; - - if (s.Equals("no")) return 0.0; - - throw new Exception($"Invalid value as result for {paramName}: got string {s}"); - default: - throw new Exception($"Invalid value as result for {paramName}: got object {obj}"); - } - } } } \ No newline at end of file diff --git a/BuildingAProfile.md b/BuildingAProfile.md index f9fe50c..32a2ed6 100644 --- a/BuildingAProfile.md +++ b/BuildingAProfile.md @@ -33,7 +33,7 @@ To call a function in an aspect, one creates a hash in the JSON where exactly on } ``` -Interpreting the above expression will aways yield `no` when evaluating, as the parameters have different values. The type of the above expression is thus `Bool`. +Interpreting the above expression will always yield `no` when evaluating, as the parameters have different values. The type of the above expression is thus `Bool`. If no key has a function invocation (thus no key starts with `$`), the hash is interpreted as a mapping: diff --git a/AspectedRouting/Format.md b/Examples/Format.md similarity index 60% rename from AspectedRouting/Format.md rename to Examples/Format.md index 176c9fb..3220ae7 100644 --- a/AspectedRouting/Format.md +++ b/Examples/Format.md @@ -1,53 +1,3 @@ -# Building a profile - -A profile is a .json-file, which consists of a few metadatafields (which are simple strings), -some expressions to calculate values based on tags, a list of parameters with their default values and -a list of profiles containing the actual parameter value for that profile. - - -# Vehicle.json - -- Metadata: these tags will be copied to the routerdb, but can not be used for routeplanning. A prime example is `name` (the streetname), as it is useful for routeplanning but very useful for navigation afterwards -- vehicletypes: used for turn restrictions, legacy for use with itinero 1.0 -- defaults: a dictionary of `{"#paramName": "value"}`, used in determining the weight of an edge. note: the `#` has to be included -- `access` is a field in the vehicle file. It should be an expression returning a string. If (and only if) this string is `no`, the way will be marked as not accessible and no more values will be calculated. All other values are regarded as being accessible. When calculated, the tag `access` with the calculated value is written into the tag table for the other aspects to use. - - `oneway` is a field in the vehicle file. It should be an expression returning `both`, `with` or `against`. - When calculated, the tag `oneway` is added to the tags for the other aspects to be calculated. - - `speed`: an expression indicating how fast the vehicle can go there. It should take into account legal, practical and social aspects. An example expression could be `{"$min", ["$legal_maxspeed", "#defaultspeed"]}` -- `obstacleaccess` and `obstaclecost` are two (optional) expressions that calculate whether an obstacle can be passed and if so, if there is a penalty for this. See detailed explanations below - -- `priorities`: a table of `{'#paramName', expression}` determining the priority (1/cost) of a way, per meter. The formula used is `paramName * expression + paramName0 * expression0 + ...` (`speed`, `access` and `oneway` can be used here as tags indicate the earlier defined respective aspects). Use a weight == 1 to get the shortest route or `$speed` to get the fastest route -- `scalingfactor` works in tandem with priority. The _total_ resistance of a link is `priority * scalingfactor`. If this function returns `null`, this will be defaulted to 1. - - -# Calculating oneway and forward/backward speeds - -There are two possibilities in order to calculate the possible direction of a traveller can go over an edge: - -1) This can be indicated explicitely with the 'oneway'-field. If this expression returns `both`, the edge is traversable in two directions. If it is either `with` or `against`, then it is not -2) This can be indicated with having a speed or factor which is equal to (or smaller then) 0, in conjunction with a `_direction=with` or `_direction=against` tag. Bicycle lanes are an excellent example for this: a `cycleway:right=yes; cycleway:left=no`, the speed and factor for `_direction=with` could be far greater then for `_direction=against` - -Note that `_direction=with` and `_direction=against` are _not_ supported in Itinero1.0 profiles. For maximal compatibility and programming comfort, a mixture of both techniques should be used. For example, one aspect interpreting the legal onewayness in tandem with one aspect determining comfort by direction is optimal. - -# Obstacle costs - -(Note: this only works with itinero2.0) - -Obstacles are objects which are encountered on nodes, e.g. bollards, traffic lights but also turn restrictions. - -The first property for this is `obstacleaccess` which calculates wether or not a vehicle can pass the obstacle. -The possible values are: - -- "no" of "false": the current vehicle _cannot_ pass this obstacle and should take a different route -- "yes", "true", `null` or any other value: the current vehicle _can_ pass this obstacle. The turn cost will be calculated - -If `obstacleaccess` is not `no` or `false`, then `obstaclecost` will be triggered. This possible return values are: - -- a positive number, indicating the cost for passing this obstacle -- 0: there is no cost to cross this obstacle -- null: this profile has no knowledge of a cost. Use the default implementation to check for turn restrictions - -If the resulting cost is null, the default implementation will be used. # Functions @@ -64,15 +14,31 @@ Aspects can use the following (extra) tags: - `access` will become the value calculated in the field `access` (not available to calculate access) - `oneway` will become the value calculated in the field `oneway` (not available to calculate access and speed) -## Why is `access`, `oneway` and `speed` copied onto the tags? -`speed` is copied in order for the profile to be able to make a `fast` profile (and accessible as `$speed`). -Access is copied so that `highway=cycleway` and `highway=cycleway;bicycle=designated` will render the same result. +# Vehicle.json +- Metdata: these tags will be copied to the routerdb, but can not be used for routeplanning. A prime example is `name` (the streetname), as it is useful for routeplanning but very useful for navigation afterwards +- vehicletypes: used for turn restrictions, legacy for use with itinero 1.0 +- defaults: a dictionary of `{"#paramName": "value"}`, used in determining the weight of an edge. note: the `#` has to be included +- `access` is a field in the vehicle file. It should be an expression returning a string. If (and only if) this string is `no`, the way will be marked as not accessible and no more values will be calculated. All other values are regarded as being accessible. When calculated, the tag `access` with the calculated value is written into the tag table or the other aspects to use. + - `oneway` is a field in the vehicle file. It should be an expression returning `both`, `with` or `against`. + When calculated, the tag `oneway` is added to the tags for the other aspects to be calculated. + - `speed`: an expression indicating how fast the vehicle can go there. It should take into account legal, practical and social aspects. An example expression could be `{"$min", ["$legal_maxspeed", "#defaultspeed"]}` + +- `priorities`: a table of `{'#paramName', expression}` determining the priority (1/cost) of a way, per meter. The formula used is `paramName * expression + paramName0 * expression0 + ...` (`speed`, `access` and `oneway` can be used here as tags indicate the earlier defined respective aspects). Use a weight == 1 to get the shortest route or `$speed` to get the fastest route + +# Calculating oneway and forward/backward speeds + +There are two possibilities in order to calculate the possible direction of a traveller can go over an edge: + +1) This can be indicated explicitely with the 'oneway'-field. If this expression returns `both`, the edge is traversable in two directions. If it is either `with` or `against`, then it is not +2) This can be indicated with having a speed or factor which is equal to (or smaller then) 0, in conjunction with a `_direction=with` or `_direction=against` tag. Bicycle lanes are an excellent example for this: a `cycleway:right=yes; cycleway:left=no`, the speed and factor for `_direction=with` could be far greater then for `_direction=against` + +Note that `_direction=with` and `_direction=against` are _not_ supported in Itinero1.0 profiles. For maximal compatibility and programming comfort, a mixture of both techniques should be used. For example, one aspect interpreting the legal onewayness in tandem with one aspect determining comfort by direction is optimal. # Pitfalls "$all" should not be used together with a mapping: it checks if all _present_ keys return true or yes (or some other value); it does _not_ check that all the specified keys in the mapping are present. -For this, an additional 'mustHaveKeys' should be added added +For this, an additional 'mustHaveKeys' should be added added \ No newline at end of file diff --git a/javascript/.babelrc b/javascript/.babelrc new file mode 100644 index 0000000..69fe715 --- /dev/null +++ b/javascript/.babelrc @@ -0,0 +1,3 @@ +{ + "presets": ["@babel/preset-env"] +} diff --git a/javascript/.npmignore b/javascript/.npmignore new file mode 100644 index 0000000..e381350 --- /dev/null +++ b/javascript/.npmignore @@ -0,0 +1,17 @@ +# Node modules +node_modules +npm_debug.log + +# Git +.git + +# Apple +.DS_Store + + +# Route Examples +.routeExamples +.tagExamples + +# Visual Studio Code +.vscode \ No newline at end of file diff --git a/javascript/.tagExamples/example.js b/javascript/.tagExamples/example.js new file mode 100644 index 0000000..660bfb1 --- /dev/null +++ b/javascript/.tagExamples/example.js @@ -0,0 +1,38 @@ +/** + * Example tags + */ + const tags1 = { + "highway": "residential", // 1 // Expect "yes" + "surface": "paved", // 0.99 +} + +const tags2 = { + "bicycle": "yes", // Expect "yes" + "cycleway": "lane", + "highway": "secondary", + "maxspeed": "50", +} + +const tags3 = { + "cyclestreet": "yes", + "highway": "residential", // Expect "yes" + "maxspeed": "30", + "surface": "asphalt" +} + +const tags4 = { + "highway": "track", // Expect "yes" + "surface": "asphalt", + "incline": "10%" +} + +const tags5 = { + "access": "no", // Expect "no" + "bicycle": "official", + "area": "yes" +} + +const tags6 = { + "surface":"dirt", + "highway":"track", +} diff --git a/javascript/BuildingAProfile.md b/javascript/BuildingAProfile.md new file mode 100644 index 0000000..f9fe50c --- /dev/null +++ b/javascript/BuildingAProfile.md @@ -0,0 +1,220 @@ +# Building a routeplanner + +This document was originally written as blog post. It gives a practical, example first example to build a custom route planner. + +In order to deploy: + +- Build your profile by creating the relevant `.json`-files in a directory; take a peek at `Examples` +- Run the project: `cd AspectedRouting && dotnet run ` (make sure the outputDirectory is _not_ a subdirectory of the input directory) +- In outputDir, you will find a bunch of lua-scripts which can be used with itinero + +## A step by step example for an aspect + +Let us recreate (a small part) of the legal access aspect for cyclists. The file will answer the question: __can a bicycle enter this road?__ + +First, we start with some metadata: + +``` +"name": "bicycle.legal_access", + "description": "Can a bicycle enter this road segment?", + "unit": "Yes, No", +``` + +The `name` field is an important one, as the aspect can be called with it in other files. The `description` and `unit`-fields however are purely as documentation - but are nonetheless important. Writing down exactly what an aspect means helps to clarify what is calculated before coding it and makes life easier down the road. + +### Building the access-function + +To call a function in an aspect, one creates a hash in the JSON where exactly one key starts with a `$`. The rest of the key determines which function is called, the value of the key is its first argument whereas the other keys in the hash function as other parameters. One could for example check that two values are the same with: + +``` +{ + "$eq": "someValue", + "b": "otherValue" +} +``` + +Interpreting the above expression will aways yield `no` when evaluating, as the parameters have different values. The type of the above expression is thus `Bool`. + +If no key has a function invocation (thus no key starts with `$`), the hash is interpreted as a mapping: + +``` +{ + "yes": "yes" + "no": "no" + "customers": "no" +} + +``` + +The above expression is a function of type `string -> double`. If invoked, it will convert `yes` into the value `yes` and `customers` into the value `no`. Any string not in the mapping will result in `null`. + + +Every expression in AspectedRouting is implicitly yet strongly typed at compile time. Having types around is cool and good for correctness, but can be constraining and the cause of boilerplate. Therefore, expressions are allowed to have _multiple_ types. Due to the context of how it is called and what the parameters of functions are, the compiler can determine exaclty which type is meant. + +For example, a mapping like above can also be used to match OSM-keys: + +``` +{ + "access": { + "yes": "no", + "no": "no", + "customers":"no" + }, + "bicycle": "$id", + "construction": "no" +} +``` + +There is a lot to unpack here. A mapping as above is either a function taking a `string` and returning a value, or it is a function taking a `Tags`-collection and returning a collection of calculated values. + +For example, passing in the collection `access=customers` in the above function will result into the value `["no"]`. Passing `access=dismount;bicycle=yes` will result in `[null, "yes"]` - the value corresponding with `access` is passed into the mapping `{"yes":"yes", "customers":"no", ...}` where no match is found resulting in `null`. The value for `bicycle` is passed into the `$id` function which simply passes back its argument. + +At last, there is the cryptical `"construction":"no"`. This expression indicates that if a construction-tag is present, the resulting value should always be `no`. But how does it work exactly? When writing a constant (such as `"no"`) in an Aspected-Routing file, it is interpreted as either being the literal constant _or_ as being a function which ignores the parameter! `"no"` has thus the types `string` and `a -> string`. When used in a single mapping with type `string -> string` it is clear the first one is meant, when used in a tagsmapping with type `Tags -> string` (e.g. `{"key": "f"}`, the type of the function `f` should be `string -> b`, clearly indicating that `"no"` should be interpreted as the function which ignores the parameter. If this sounds like magic to you - don't worry about it too much. In practice, you just type what feels logical and it'll work out. + +#### Combining multiple tags + +The above aspect is already pretty close to a working access-calculation for cyclists - but we still have a collection of values, not a single one. We have a clear order in which we want to evaluate the tags. This too can be done with a builtin function, namely `$firstMatchOf` with the type `[string] -> (Tags -> [a]) -> (Tags -> a)`. For those not familiar with this notation for the types, this reads as: given a list of `string` and a function (which converts tags into a list of `a`), I'll give back a function that converts `Tags` into some `a` + +It is used in the following way: + +``` +{ + "$firstMatchOf":["bicycle", "construction", "access"], + "f": { ... above code ... } +} +``` + +At last, what if _none_ of the tags match? What do we do then? For that, there is `$default: a -> (x -> a) -> (x -> a)`. More comprehensively, this function needs a (default) value `a`, and a function calculating some `a` based on `x` and it'll give back a function that calculates an `a` based on an `x`. + +Here too is an example clearer then trying to explain it: + +``` +{ + "$default": "no", + "f": { ... above code ... } +} + +``` + +#### Combining everything + +Everything together, this gives a very basic implementation of where a cyclists can cycle! If we throw it all together, we get the following JSON file: + + +``` +{ + + "name": "bicycle.legal_access", + "description": "Gives, for each type of highway, whether or not a normal bicycle can enter legally.\nNote that legal access is a bit 'grey' in the case of roads marked private and permissive, in which case these values are returned ", + "unit": "yes, no", + + + "$default": "no", + "f": { + "$firstMatchOf": ["bicycle", "construction", "access"], + "f": { + "access": { + "yes": "no", + "no": "no", + "customers":"no" + }, + "bicycle": "$id", + "construction": "no" + } + } +} + +``` + +It should be noted that the _actual_ implementation is more complicated then that. There are more tags to keep track of, but the above explanation should be enough to get a grasp of [legal-access-aspect for bicycles](https://github.com/pietervdvn/AspectedRouting/blob/master/Examples/bicycle/aspects/bicycle.legal_access.json). An overview of all the functions and available types, have a look [here](https://github.com/pietervdvn/AspectedRouting/blob/master/Examples/TypesAndFunctions.md) + +### Building a profile + +Having accessibility alone isn't enough to create a route planner for cyclists. In a similar way, one can create an aspect that defines [if the street is a oneway](https://github.com/pietervdvn/AspectedRouting/blob/master/Examples/bicycle/aspects/bicycle.oneway.json) or how [comfortable a street is](https://github.com/pietervdvn/AspectedRouting/blob/master/Examples/bicycle/aspects/bicycle.comfort.json). (Please note that the linked examples are stripped down examples. Our actual routeplanner has a few more aspect files and more tags). + +At last, we have to combine those aspects into something that actually creates the profile. This is done by another JSON-file, such as [this one](https://github.com/pietervdvn/AspectedRouting/blob/master/Examples/bicycle/bicycle.json). Lets break it down: + +``` +{ + "name": "bicycle", + "description": "Profile for a normal bicycle", +``` + +This is some metadata, mostly meant for humans. + +``` + + "defaults": { + "#maxspeed": 20, + "#timeNeeded": 0, + "#comfort": 0, + "#distance": 0, + }, +``` + +This declares some variables, which can only be used in the scope of the profile. Variables always start with `#` and are either a `number`, a `boolean` or a `string`. They are used to below the actual aspects of the profile: + +``` + "access": "$bicycle.legal_access", +``` +This states when a segment is accessible. It expects a function `Tags -> string` and a segment is considered not accessible if this value is `"no"`; it is accessible otherwise. + +``` + "oneway": "$bicycle.oneway", +``` +This indicates if the street is a oneway, it expects a function `Tags -> string` where the resulting value is one of `both`,`with` or `against` + + +``` + "speed": { + "$min": [ + "#defaultSpeed", + "$legal_maxspeed_be" + ] + }, +``` + +This states how fast a bicycle would be going on the segment; it expects a function `Tags -> number`. It is the first interesting case: both the variable `#maxspeed` (defined in `defaults`) is used, together with a function calculating the _legal_ max speed for a road segment. The lowest of the two is taken, by the function `$min` + +``` + "behaviours": { + "fastest": { + "description": "The fastest route to your destination", + "#timeNeeded": 1, + }, + "shortest": { + "description": "The shortest route, independent of of speed", + "#distance": 1, + }, + "comfort": { + "description": "A comfortable route preferring well-paved roads, smaller roads and a bit of scenery at the cost of speed", + "#comfort": 1 + }, + "electric":{ + "description": "An electrical bicycle", + "#maxspeed": 25, + "#comfort":1, + "#timeNeeded": 5 + }, + "electric_fastest":{ + "description": "An electrical bicycle, focussed on speed", + "#maxspeed": 25, + } + }, +``` + +The above code defines _behaviours_ of the cyclist. It allows to overwrite a variable which influences the routeplanning. For example, the behavour `electrical` above will overwrite the maxspeed, changing the `speed`-aspect at the top of the file. However, these variables are most important in the priority below: + +``` + "priority": { + "#comfort": "$bicycle.comfort", + "#timeNeeded": "$speed", + "#distance": "$distance", + } +} + +``` + +The priority is the core of the customizibility and calculates the priority of the segment. First, the function on the right is calculated with the tags of the segment - e.g. for a segment with tags `highway=residential;surface=sett;` this will yield `{"#comfort": 0.9, "#timeNeeded": 25, "#distance": 1}`. + +These values are multiplied with the variables and summed, giving the _priority_ of the segment - where the variable are set by the requested profile; e.g. for `electrical` this will yield `(#comfort = 1) * 0.9 + (#timeNeeded = 5) * 25 + (#distance = 0) * 1`, giving the priority of `125.9`. The _cost_ per meter is then the inverted value, thus `1 / 125.9` or approximately `0.008/m`. This cost seems relatively low - but that doesn't matter as all costs are in the same range. diff --git a/javascript/README.md b/javascript/README.md new file mode 100644 index 0000000..014944c --- /dev/null +++ b/javascript/README.md @@ -0,0 +1,23 @@ +# StressMap interpreter +CLI program that generates a stress score based on a RuleSet JSON file and a tag object. + +## Installation +`npm i mapcomplete-stressmap` + +## How to use +This program can be used from the command line interface: +`node mapcomplete-stressmap [ruleset.json] [tags object]` + +Example tags: +```json +{ + "cyclestreet": "yes", + "highway": "residential", // Expect "yes" + "maxspeed": "30", + "surface": "asphalt" +} +``` + +Guidelines on JSON Ruleset (from [AspectedRouting](https://www.github.com/pietervdvn/AspectedRouting.git)) + +[Building a Profile](./BuildingAProfile.md) diff --git a/javascript/RuleSet.js b/javascript/RuleSet.js new file mode 100644 index 0000000..d50fdd2 --- /dev/null +++ b/javascript/RuleSet.js @@ -0,0 +1,191 @@ +/** + * RuleSet Class + * Constructor + * @param name {string} Name of RuleSet + * @param defaultValue {number} Default score value + * @param values {object} Main data object + */ +class RuleSet { + constructor(config) { + delete config["name"] + delete config["unit"] + delete config["description"] + this.program = config + } + + + /** + * getScore calculates a score for the RuleSet + * @param tags {object} Active tags to compare against + */ + runProgram(tags, program = this.program) { + if (typeof program !== "object") { + return program; + } + + let functionName /*: string*/ = undefined; + let functionArguments /*: any */ = undefined + let otherValues = {} + Object.entries(program).forEach( + entry => { + const [key, value] = entry + if (key.startsWith("$")) { + functionName = key + functionArguments = value + } else { + otherValues[key] = value + } + } + ) + + if (functionName === undefined) { + return this.interpretAsDictionary(program, tags) + } + + if (functionName === '$multiply') { + return this.multiplyScore(tags, functionArguments); + } else if (functionName === '$firstMatchOf') { + this.order = keys; + return this.getFirstMatchScore(tags); + } else if (functionName === '$min') { + return this.getMinValue(tags, functionArguments); + } else if (functionName === '$max') { + return this.getMaxValue(tags, functionArguments); + } else if (functionName === '$default') { + return this.defaultV(functionArguments, otherValues, tags) + } else { + console.error(`Error: Program ${functionName} is not implemented yet. ${JSON.stringify(program)}`); + } + } + + /** + * Given a 'program' without function invocation, interprets it as a dictionary + * + * E.g., given the program + * + * { + * highway: { + * residential: 30, + * living_street: 20 + * }, + * surface: { + * sett : 0.9 + * } + * + * } + * + * in combination with the tags {highway: residential}, + * + * the result should be [30, undefined]; + * + * For the tags {highway: residential, surface: sett} we should get [30, 0.9] + * + * + * @param program + * @param tags + * @return {(undefined|*)[]} + */ + interpretAsDictionary(program, tags) { + return Object.entries(tags).map(tag => { + const [key, value] = tag; + const propertyValue = program[key] + if (propertyValue === undefined) { + return undefined + } + if (typeof propertyValue !== "object") { + return propertyValue + } + return propertyValue[value] + }); + } + + defaultV(subProgram, otherArgs, tags) { + const normalProgram = Object.entries(otherArgs)[0][1] + const value = this.runProgram(tags, normalProgram) + if (value !== undefined) { + return value; + } + return this.runProgram(tags, subProgram) + } + + /** + * Multiplies the default score with the proper values + * @param tags {object} the active tags to check against + * @param subprogram which should generate a list of values + * @returns score after multiplication + */ + multiplyScore(tags, subprogram) { + let number = 1 + this.runProgram(tags, subprogram).filter(r => r !== undefined).forEach(r => number *= parseFloat(r)) + return number.toFixed(2); + } + + getFirstMatchScore(tags) { + let matchFound = false; + let match = ""; + let i = 0; + + for (let key of this.order) { + i++; + for (let entry of Object.entries(JSON.parse(tags))) { + const [tagKey, tagValue] = entry; + + if (key === tagKey) { + const valueReply = this.checkValues(entry); + + if (!!valueReply) { + match = valueReply; + matchFound = true; + return match; + } + } + } + } + + if (!matchFound) { + match = this.defaultValue; + return match; + } + } + + checkValues(tag) { + const [tagKey, tagValue] = tag; + const options = Object.entries(this.scoreValues[1]) + + for (let option of options) { + const [optKey, optValues] = option; + + if (optKey === tagKey) { + return optValues[`${tagValue}`]; + } + } + return null; + } + + getMinValue(tags, subprogram) { + console.log("Running min with", tags, subprogram) + const minArr = subprogram.map(part => { + if (typeof (part) === 'object') { + const calculatedValue = this.runProgram(tags, part) + return parseFloat(calculatedValue) + } else { + return parseFloat(part); + } + }).filter(v => !isNaN(v)); + return Math.min(...minArr); + } + + getMaxValue(tags, subprogram) { + const maxArr = subprogram.map(part => { + if (typeof (part) === 'object') { + return parseFloat(this.runProgram(tags, part)) + } else { + return parseFloat(part); + } + }).filter(v => !isNaN(v)); + return Math.max(...maxArr); + } +} + + +export default RuleSet; \ No newline at end of file diff --git a/javascript/__tests__/ruleSetTests.js b/javascript/__tests__/ruleSetTests.js new file mode 100644 index 0000000..850218a --- /dev/null +++ b/javascript/__tests__/ruleSetTests.js @@ -0,0 +1,68 @@ +import { expect, jest } from '@jest/globals'; +import RuleSet from '../RuleSet.js'; + +describe('RuleSet', () => { + const exampleJSON = { + "name": "real.name", + "$default": "1", + "value": { + "$multiply": { + "example": { + "score": "1.2" + }, + "other": { + "thing": "1", + "something": "1.2", + "other_thing": "1.4" + } + }, + "$firstMatchOf": [ + "area", + "empty", + "things" + ], + "value": { + "area": { + "yes": "no" + }, + "access:": { + "no": "no", + "customers": "private" + }, + "$multiply": { + "access": { + "dismount": 0.15 + }, + "highway": { + "path": 0.5 + } + } + + }, + + } + }; + const tags = { + "example": "score", + "other": "something", + "highway": "track", + "surface": "sett", + "cycleway": "lane" + } + test('it should resolve', () => { + const ruleSet = exampleJSON; + const { name, $default, $multiply, value} = ruleSet; + + if (!!value) { + const currentSet = new RuleSet(name, $default, value); + currentSet.runProgram(tags); + expect(currentSet.runProgram).resolves; + expect(currentSet.toString).resolves; + } else { + const currentSet = new RuleSet(name, $default, {$multiply}); + currentSet.toString(); + currentSet.runProgram(tags); + } + + }) +}) diff --git a/javascript/index.js b/javascript/index.js new file mode 100644 index 0000000..6574b4a --- /dev/null +++ b/javascript/index.js @@ -0,0 +1,7 @@ +import interpret from './interpret.js'; +import RuleSet from './RuleSet.js'; + +export { + interpret, + RuleSet +}; diff --git a/javascript/interpret.js b/javascript/interpret.js new file mode 100644 index 0000000..9319b86 --- /dev/null +++ b/javascript/interpret.js @@ -0,0 +1,37 @@ +/** + * Import packages + */ +import fs from 'fs'; +import {argv} from 'process'; +import RuleSet from './RuleSet.js'; + +const app = { + init() { + if (!!argv && argv.length < 4) { + console.info(`Invalid command. In order to run the JavaScript interpreter please use the following format: + > node index.js [ruleset JSON file] [tags]`) + } else if (!!argv && argv.length === 4) { + const definitionFile = argv[2]; + const tags = argv[3]; + const result = this.interpret(definitionFile, tags); + console.log(result) + } + }, + /** + * Interpret JsonFile and apply it as a tag. To use with CLI only + * @param definitionFile {any} JSON input defining the score distribution + * @param tags {any} OSM tags as key/value pairs + */ + interpret(definitionFile, tags) { + if (typeof tags === "string") { + tags = JSON.parse(tags) + } + const rawData = fs.readFileSync(definitionFile); + const program = JSON.parse(rawData); + return new RuleSet(program).runProgram(tags) + } +}; + +app.init(); + +export default app; diff --git a/javascript/package-lock.json b/javascript/package-lock.json new file mode 100644 index 0000000..e4dba26 --- /dev/null +++ b/javascript/package-lock.json @@ -0,0 +1,9616 @@ +{ + "name": "js-interpreter", + "version": "1.0.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "js-interpreter", + "version": "1.0.0", + "license": "MIT", + "devDependencies": { + "@babel/preset-env": "^7.14.7", + "@types/jest": "^26.0.24", + "@types/node": "^16.3.1", + "babel-jest": "^27.0.6", + "jest": "^27.0.6", + "ts-node": "^10.1.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.14.5.tgz", + "integrity": "sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.14.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.14.7.tgz", + "integrity": "sha512-nS6dZaISCXJ3+518CWiBfEr//gHyMO02uDxBkXTKZDN5POruCnOZ1N4YBRZDCabwF8nZMWBpRxIicmXtBs+fvw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.14.6", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.14.6.tgz", + "integrity": "sha512-gJnOEWSqTk96qG5BoIrl5bVtc23DCycmIePPYnamY9RboYdI4nFy5vAQMSl81O5K/W0sLDWfGysnOECC+KUUCA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.14.5", + "@babel/generator": "^7.14.5", + "@babel/helper-compilation-targets": "^7.14.5", + "@babel/helper-module-transforms": "^7.14.5", + "@babel/helpers": "^7.14.6", + "@babel/parser": "^7.14.6", + "@babel/template": "^7.14.5", + "@babel/traverse": "^7.14.5", + "@babel/types": "^7.14.5", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.1.2", + "semver": "^6.3.0", + "source-map": "^0.5.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@babel/generator": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.14.5.tgz", + "integrity": "sha512-y3rlP+/G25OIX3mYKKIOlQRcqj7YgrvHxOLbVmyLJ9bPmi5ttvUmpydVjcFjZphOktWuA7ovbx91ECloWTfjIA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.14.5", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/generator/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.14.5.tgz", + "integrity": "sha512-EivH9EgBIb+G8ij1B2jAwSH36WnGvkQSEC6CkX/6v6ZFlw5fVOHvsgGF4uiEHO2GzMvunZb6tDLQEQSdrdocrA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.14.5.tgz", + "integrity": "sha512-YTA/Twn0vBXDVGJuAX6PwW7x5zQei1luDDo2Pl6q1qZ7hVNl0RZrhHCQG/ArGpR29Vl7ETiB8eJyrvpuRp300w==", + "dev": true, + "dependencies": { + "@babel/helper-explode-assignable-expression": "^7.14.5", + "@babel/types": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.14.5.tgz", + "integrity": "sha512-v+QtZqXEiOnpO6EYvlImB6zCD2Lel06RzOPzmkz/D/XgQiUu3C/Jb1LOqSt/AIA34TYi/Q+KlT8vTQrgdxkbLw==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.14.5", + "@babel/helper-validator-option": "^7.14.5", + "browserslist": "^4.16.6", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.14.6", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.14.6.tgz", + "integrity": "sha512-Z6gsfGofTxH/+LQXqYEK45kxmcensbzmk/oi8DmaQytlQCgqNZt9XQF8iqlI/SeXWVjaMNxvYvzaYw+kh42mDg==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.14.5", + "@babel/helper-function-name": "^7.14.5", + "@babel/helper-member-expression-to-functions": "^7.14.5", + "@babel/helper-optimise-call-expression": "^7.14.5", + "@babel/helper-replace-supers": "^7.14.5", + "@babel/helper-split-export-declaration": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.14.5.tgz", + "integrity": "sha512-TLawwqpOErY2HhWbGJ2nZT5wSkR192QpN+nBg1THfBfftrlvOh+WbhrxXCH4q4xJ9Gl16BGPR/48JA+Ryiho/A==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.14.5", + "regexpu-core": "^4.7.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.2.3.tgz", + "integrity": "sha512-RH3QDAfRMzj7+0Nqu5oqgO5q9mFtQEVvCRsi8qCEfzLR9p2BHfn5FzhSB2oj1fF7I2+DcTORkYaQ6aTR9Cofew==", + "dev": true, + "dependencies": { + "@babel/helper-compilation-targets": "^7.13.0", + "@babel/helper-module-imports": "^7.12.13", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/traverse": "^7.13.0", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2", + "semver": "^6.1.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0-0" + } + }, + "node_modules/@babel/helper-explode-assignable-expression": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.14.5.tgz", + "integrity": "sha512-Htb24gnGJdIGT4vnRKMdoXiOIlqOLmdiUYpAQ0mYfgVT/GDm8GOYhgi4GL+hMKrkiPRohO4ts34ELFsGAPQLDQ==", + "dev": true, + "dependencies": { + "@babel/types": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.14.5.tgz", + "integrity": "sha512-Gjna0AsXWfFvrAuX+VKcN/aNNWonizBj39yGwUzVDVTlMYJMK2Wp6xdpy72mfArFq5uK+NOuexfzZlzI1z9+AQ==", + "dev": true, + "dependencies": { + "@babel/helper-get-function-arity": "^7.14.5", + "@babel/template": "^7.14.5", + "@babel/types": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-get-function-arity": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.14.5.tgz", + "integrity": "sha512-I1Db4Shst5lewOM4V+ZKJzQ0JGGaZ6VY1jYvMghRjqs6DWgxLCIyFt30GlnKkfUeFLpJt2vzbMVEXVSXlIFYUg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.14.5.tgz", + "integrity": "sha512-R1PXiz31Uc0Vxy4OEOm07x0oSjKAdPPCh3tPivn/Eo8cvz6gveAeuyUUPB21Hoiif0uoPQSSdhIPS3352nvdyQ==", + "dev": true, + "dependencies": { + "@babel/types": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.14.7", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.14.7.tgz", + "integrity": "sha512-TMUt4xKxJn6ccjcOW7c4hlwyJArizskAhoSTOCkA0uZ+KghIaci0Qg9R043kUMWI9mtQfgny+NQ5QATnZ+paaA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.14.5.tgz", + "integrity": "sha512-SwrNHu5QWS84XlHwGYPDtCxcA0hrSlL2yhWYLgeOc0w7ccOl2qv4s/nARI0aYZW+bSwAL5CukeXA47B/1NKcnQ==", + "dev": true, + "dependencies": { + "@babel/types": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.14.5.tgz", + "integrity": "sha512-iXpX4KW8LVODuAieD7MzhNjmM6dzYY5tfRqT+R9HDXWl0jPn/djKmA+G9s/2C2T9zggw5tK1QNqZ70USfedOwA==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.14.5", + "@babel/helper-replace-supers": "^7.14.5", + "@babel/helper-simple-access": "^7.14.5", + "@babel/helper-split-export-declaration": "^7.14.5", + "@babel/helper-validator-identifier": "^7.14.5", + "@babel/template": "^7.14.5", + "@babel/traverse": "^7.14.5", + "@babel/types": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.14.5.tgz", + "integrity": "sha512-IqiLIrODUOdnPU9/F8ib1Fx2ohlgDhxnIDU7OEVi+kAbEZcyiF7BLU8W6PfvPi9LzztjS7kcbzbmL7oG8kD6VA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz", + "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.14.5.tgz", + "integrity": "sha512-rLQKdQU+HYlxBwQIj8dk4/0ENOUEhA/Z0l4hN8BexpvmSMN9oA9EagjnhnDpNsRdWCfjwa4mn/HyBXO9yhQP6A==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.14.5", + "@babel/helper-wrap-function": "^7.14.5", + "@babel/types": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.14.5.tgz", + "integrity": "sha512-3i1Qe9/8x/hCHINujn+iuHy+mMRLoc77b2nI9TB0zjH1hvn9qGlXjWlggdwUcju36PkPCy/lpM7LLUdcTyH4Ow==", + "dev": true, + "dependencies": { + "@babel/helper-member-expression-to-functions": "^7.14.5", + "@babel/helper-optimise-call-expression": "^7.14.5", + "@babel/traverse": "^7.14.5", + "@babel/types": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.14.5.tgz", + "integrity": "sha512-nfBN9xvmCt6nrMZjfhkl7i0oTV3yxR4/FztsbOASyTvVcoYd0TRHh7eMLdlEcCqobydC0LAF3LtC92Iwxo0wyw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.14.5.tgz", + "integrity": "sha512-dmqZB7mrb94PZSAOYtr+ZN5qt5owZIAgqtoTuqiFbHFtxgEcmQlRJVI+bO++fciBunXtB6MK7HrzrfcAzIz2NQ==", + "dev": true, + "dependencies": { + "@babel/types": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.14.5.tgz", + "integrity": "sha512-hprxVPu6e5Kdp2puZUmvOGjaLv9TCe58E/Fl6hRq4YiVQxIcNvuq6uTM2r1mT/oPskuS9CgR+I94sqAYv0NGKA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.5.tgz", + "integrity": "sha512-5lsetuxCLilmVGyiLEfoHBRX8UCFD+1m2x3Rj97WrW3V7H3u4RWRXA4evMjImCsin2J2YT0QaVDGf+z8ondbAg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz", + "integrity": "sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.14.5.tgz", + "integrity": "sha512-YEdjTCq+LNuNS1WfxsDCNpgXkJaIyqco6DAelTUjT4f2KIWC1nBcaCaSdHTBqQVLnTBexBcVcFhLSU1KnYuePQ==", + "dev": true, + "dependencies": { + "@babel/helper-function-name": "^7.14.5", + "@babel/template": "^7.14.5", + "@babel/traverse": "^7.14.5", + "@babel/types": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.14.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.14.6.tgz", + "integrity": "sha512-yesp1ENQBiLI+iYHSJdoZKUtRpfTlL1grDIX9NRlAVppljLw/4tTyYupIB7uIYmC3stW/imAv8EqaKaS/ibmeA==", + "dev": true, + "dependencies": { + "@babel/template": "^7.14.5", + "@babel/traverse": "^7.14.5", + "@babel/types": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", + "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.14.5", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/parser": { + "version": "7.14.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.7.tgz", + "integrity": "sha512-X67Z5y+VBJuHB/RjwECp8kSl5uYi0BvRbNeWqkaJCVh+LiTPl19WBUfG627psSgp9rSf6ojuXghQM3ha6qHHdA==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.14.5.tgz", + "integrity": "sha512-ZoJS2XCKPBfTmL122iP6NM9dOg+d4lc9fFk3zxc8iDjvt8Pk4+TlsHSKhIPf6X+L5ORCdBzqMZDjL/WHj7WknQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.14.5", + "@babel/plugin-proposal-optional-chaining": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, + "node_modules/@babel/plugin-proposal-async-generator-functions": { + "version": "7.14.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.14.7.tgz", + "integrity": "sha512-RK8Wj7lXLY3bqei69/cc25gwS5puEc3dknoFPFbqfy3XxYQBQFvu4ioWpafMBAB+L9NyptQK4nMOa5Xz16og8Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-remap-async-to-generator": "^7.14.5", + "@babel/plugin-syntax-async-generators": "^7.8.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-class-properties": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.14.5.tgz", + "integrity": "sha512-q/PLpv5Ko4dVc1LYMpCY7RVAAO4uk55qPwrIuJ5QJ8c6cVuAmhu7I/49JOppXL6gXf7ZHzpRVEUZdYoPLM04Gg==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.14.5.tgz", + "integrity": "sha512-KBAH5ksEnYHCegqseI5N9skTdxgJdmDoAOc0uXa+4QMYKeZD0w5IARh4FMlTNtaHhbB8v+KzMdTgxMMzsIy6Yg==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-proposal-dynamic-import": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.14.5.tgz", + "integrity": "sha512-ExjiNYc3HDN5PXJx+bwC50GIx/KKanX2HiggnIUAYedbARdImiCU4RhhHfdf0Kd7JNXGpsBBBCOm+bBVy3Gb0g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-export-namespace-from": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.14.5.tgz", + "integrity": "sha512-g5POA32bXPMmSBu5Dx/iZGLGnKmKPc5AiY7qfZgurzrCYgIztDlHFbznSNCoQuv57YQLnQfaDi7dxCtLDIdXdA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-json-strings": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.14.5.tgz", + "integrity": "sha512-NSq2fczJYKVRIsUJyNxrVUMhB27zb7N7pOFGQOhBKJrChbGcgEAqyZrmZswkPk18VMurEeJAaICbfm57vUeTbQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-json-strings": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-logical-assignment-operators": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.14.5.tgz", + "integrity": "sha512-YGn2AvZAo9TwyhlLvCCWxD90Xq8xJ4aSgaX3G5D/8DW94L8aaT+dS5cSP+Z06+rCJERGSr9GxMBZ601xoc2taw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.14.5.tgz", + "integrity": "sha512-gun/SOnMqjSb98Nkaq2rTKMwervfdAoz6NphdY0vTfuzMfryj+tDGb2n6UkDKwez+Y8PZDhE3D143v6Gepp4Hg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-numeric-separator": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.14.5.tgz", + "integrity": "sha512-yiclALKe0vyZRZE0pS6RXgjUOt87GWv6FYa5zqj15PvhOGFO69R5DusPlgK/1K5dVnCtegTiWu9UaBSrLLJJBg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-object-rest-spread": { + "version": "7.14.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.14.7.tgz", + "integrity": "sha512-082hsZz+sVabfmDWo1Oct1u1AgbKbUAyVgmX4otIc7bdsRgHBXwTwb3DpDmD4Eyyx6DNiuz5UAATT655k+kL5g==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.14.7", + "@babel/helper-compilation-targets": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-optional-catch-binding": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.14.5.tgz", + "integrity": "sha512-3Oyiixm0ur7bzO5ybNcZFlmVsygSIQgdOa7cTfOYCMY+wEPAYhZAJxi3mixKFCTCKUhQXuCTtQ1MzrpL3WT8ZQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-optional-chaining": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.14.5.tgz", + "integrity": "sha512-ycz+VOzo2UbWNI1rQXxIuMOzrDdHGrI23fRiz/Si2R4kv2XZQ1BK8ccdHwehMKBlcH/joGW/tzrUmo67gbJHlQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.14.5", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-private-methods": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.14.5.tgz", + "integrity": "sha512-838DkdUA1u+QTCplatfq4B7+1lnDa/+QMI89x5WZHBcnNv+47N8QEj2k9I2MUU9xIv8XJ4XvPCviM/Dj7Uwt9g==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-62EyfyA3WA0mZiF2e2IV9mc9Ghwxcg8YTu8BS4Wss4Y3PY725OmS9M0qLORbJwLqFtGh+jiE4wAmocK2CTUK2Q==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.14.5", + "@babel/helper-create-class-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-unicode-property-regex": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.14.5.tgz", + "integrity": "sha512-6axIeOU5LnY471KenAB9vI8I5j7NQ2d652hIYwVyRfgaZT5UpiqFKCuVXCDMSrU+3VFafnu2c5m3lrWIlr6A5Q==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.14.5.tgz", + "integrity": "sha512-u6OXzDaIXjEstBRRoBCQ/uKQKlbuaeE5in0RvWdA4pN6AhqxTIwUsnHPU1CFZA/amYObMsuWhYfRl3Ch90HD0Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.14.5.tgz", + "integrity": "sha512-KOnO0l4+tD5IfOdi4x8C1XmEIRWUjNRV8wc6K2vz/3e8yAOoZZvsRXRRIF/yo/MAOFb4QjtAw9xSxMXbSMRy8A==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.14.5.tgz", + "integrity": "sha512-szkbzQ0mNk0rpu76fzDdqSyPu0MuvpXgC+6rz5rpMb5OIRxdmHfQxrktL8CYolL2d8luMCZTR0DpIMIdL27IjA==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-remap-async-to-generator": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.14.5.tgz", + "integrity": "sha512-dtqWqdWZ5NqBX3KzsVCWfQI3A53Ft5pWFCT2eCVUftWZgjc5DpDponbIF1+c+7cSGk2wN0YK7HGL/ezfRbpKBQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.14.5.tgz", + "integrity": "sha512-LBYm4ZocNgoCqyxMLoOnwpsmQ18HWTQvql64t3GvMUzLQrNoV1BDG0lNftC8QKYERkZgCCT/7J5xWGObGAyHDw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.14.5.tgz", + "integrity": "sha512-J4VxKAMykM06K/64z9rwiL6xnBHgB1+FVspqvlgCdwD1KUbQNfszeKVVOMh59w3sztHYIZDgnhOC4WbdEfHFDA==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.14.5", + "@babel/helper-function-name": "^7.14.5", + "@babel/helper-optimise-call-expression": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-replace-supers": "^7.14.5", + "@babel/helper-split-export-declaration": "^7.14.5", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.14.5.tgz", + "integrity": "sha512-pWM+E4283UxaVzLb8UBXv4EIxMovU4zxT1OPnpHJcmnvyY9QbPPTKZfEj31EUvG3/EQRbYAGaYEUZ4yWOBC2xg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.14.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.14.7.tgz", + "integrity": "sha512-0mDE99nK+kVh3xlc5vKwB6wnP9ecuSj+zQCa/n0voENtP/zymdT4HH6QEb65wjjcbqr1Jb/7z9Qp7TF5FtwYGw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.14.5.tgz", + "integrity": "sha512-loGlnBdj02MDsFaHhAIJzh7euK89lBrGIdM9EAtHFo6xKygCUGuuWe07o1oZVk287amtW1n0808sQM99aZt3gw==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.14.5.tgz", + "integrity": "sha512-iJjbI53huKbPDAsJ8EmVmvCKeeq21bAze4fu9GBQtSLqfvzj2oRuHVx4ZkDwEhg1htQ+5OBZh/Ab0XDf5iBZ7A==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.14.5.tgz", + "integrity": "sha512-jFazJhMBc9D27o9jDnIE5ZErI0R0m7PbKXVq77FFvqFbzvTMuv8jaAwLZ5PviOLSFttqKIW0/wxNSDbjLk0tYA==", + "dev": true, + "dependencies": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.14.5.tgz", + "integrity": "sha512-CfmqxSUZzBl0rSjpoQSFoR9UEj3HzbGuGNL21/iFTmjb5gFggJp3ph0xR1YBhexmLoKRHzgxuFvty2xdSt6gTA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.14.5.tgz", + "integrity": "sha512-vbO6kv0fIzZ1GpmGQuvbwwm+O4Cbm2NrPzwlup9+/3fdkuzo1YqOZcXw26+YUJB84Ja7j9yURWposEHLYwxUfQ==", + "dev": true, + "dependencies": { + "@babel/helper-function-name": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.14.5.tgz", + "integrity": "sha512-ql33+epql2F49bi8aHXxvLURHkxJbSmMKl9J5yHqg4PLtdE6Uc48CH1GS6TQvZ86eoB/ApZXwm7jlA+B3kra7A==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.14.5.tgz", + "integrity": "sha512-WkNXxH1VXVTKarWFqmso83xl+2V3Eo28YY5utIkbsmXoItO8Q3aZxN4BTS2k0hz9dGUloHK26mJMyQEYfkn/+Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.14.5.tgz", + "integrity": "sha512-3lpOU8Vxmp3roC4vzFpSdEpGUWSMsHFreTWOMMLzel2gNGfHE5UWIh/LN6ghHs2xurUp4jRFYMUIZhuFbody1g==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "babel-plugin-dynamic-import-node": "^2.3.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.14.5.tgz", + "integrity": "sha512-en8GfBtgnydoao2PS+87mKyw62k02k7kJ9ltbKe0fXTHrQmG6QZZflYuGI1VVG7sVpx4E1n7KBpNlPb8m78J+A==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-simple-access": "^7.14.5", + "babel-plugin-dynamic-import-node": "^2.3.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.14.5.tgz", + "integrity": "sha512-mNMQdvBEE5DcMQaL5LbzXFMANrQjd2W7FPzg34Y4yEz7dBgdaC+9B84dSO+/1Wba98zoDbInctCDo4JGxz1VYA==", + "dev": true, + "dependencies": { + "@babel/helper-hoist-variables": "^7.14.5", + "@babel/helper-module-transforms": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-validator-identifier": "^7.14.5", + "babel-plugin-dynamic-import-node": "^2.3.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.14.5.tgz", + "integrity": "sha512-RfPGoagSngC06LsGUYyM9QWSXZ8MysEjDJTAea1lqRjNECE3y0qIJF/qbvJxc4oA4s99HumIMdXOrd+TdKaAAA==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.14.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.14.7.tgz", + "integrity": "sha512-DTNOTaS7TkW97xsDMrp7nycUVh6sn/eq22VaxWfEdzuEbRsiaOU0pqU7DlyUGHVsbQbSghvjKRpEl+nUCKGQSg==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.14.5.tgz", + "integrity": "sha512-Nx054zovz6IIRWEB49RDRuXGI4Gy0GMgqG0cII9L3MxqgXz/+rgII+RU58qpo4g7tNEx1jG7rRVH4ihZoP4esQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.14.5.tgz", + "integrity": "sha512-MKfOBWzK0pZIrav9z/hkRqIk/2bTv9qvxHzPQc12RcVkMOzpIKnFCNYJip00ssKWYkd8Sf5g0Wr7pqJ+cmtuFg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-replace-supers": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.14.5.tgz", + "integrity": "sha512-Tl7LWdr6HUxTmzQtzuU14SqbgrSKmaR77M0OKyq4njZLQTPfOvzblNKyNkGwOfEFCEx7KeYHQHDI0P3F02IVkA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.14.5.tgz", + "integrity": "sha512-r1uilDthkgXW8Z1vJz2dKYLV1tuw2xsbrp3MrZmD99Wh9vsfKoob+JTgri5VUb/JqyKRXotlOtwgu4stIYCmnw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.14.5.tgz", + "integrity": "sha512-NVIY1W3ITDP5xQl50NgTKlZ0GrotKtLna08/uGY6ErQt6VEQZXla86x/CTddm5gZdcr+5GSsvMeTmWA5Ii6pkg==", + "dev": true, + "dependencies": { + "regenerator-transform": "^0.14.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.14.5.tgz", + "integrity": "sha512-cv4F2rv1nD4qdexOGsRQXJrOcyb5CrgjUH9PKrrtyhSDBNWGxd0UIitjyJiWagS+EbUGjG++22mGH1Pub8D6Vg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.14.5.tgz", + "integrity": "sha512-xLucks6T1VmGsTB+GWK5Pl9Jl5+nRXD1uoFdA5TSO6xtiNjtXTjKkmPdFXVLGlK5A2/or/wQMKfmQ2Y0XJfn5g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.14.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.14.6.tgz", + "integrity": "sha512-Zr0x0YroFJku7n7+/HH3A2eIrGMjbmAIbJSVv0IZ+t3U2WUQUA64S/oeied2e+MaGSjmt4alzBCsK9E8gh+fag==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.14.5.tgz", + "integrity": "sha512-Z7F7GyvEMzIIbwnziAZmnSNpdijdr4dWt+FJNBnBLz5mwDFkqIXU9wmBcWWad3QeJF5hMTkRe4dAq2sUZiG+8A==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.14.5.tgz", + "integrity": "sha512-22btZeURqiepOfuy/VkFr+zStqlujWaarpMErvay7goJS6BWwdd6BY9zQyDLDa4x2S3VugxFb162IZ4m/S/+Gg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.14.5.tgz", + "integrity": "sha512-lXzLD30ffCWseTbMQzrvDWqljvZlHkXU+CnseMhkMNqU1sASnCsz3tSzAaH3vCUXb9PHeUb90ZT1BdFTm1xxJw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.14.5.tgz", + "integrity": "sha512-crTo4jATEOjxj7bt9lbYXcBAM3LZaUrbP2uUdxb6WIorLmjNKSpHfIybgY4B8SRpbf8tEVIWH3Vtm7ayCrKocA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.14.5.tgz", + "integrity": "sha512-UygduJpC5kHeCiRw/xDVzC+wj8VaYSoKl5JNVmbP7MadpNinAm3SvZCxZ42H37KZBKztz46YC73i9yV34d0Tzw==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.14.7", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.14.7.tgz", + "integrity": "sha512-itOGqCKLsSUl0Y+1nSfhbuuOlTs0MJk2Iv7iSH+XT/mR8U1zRLO7NjWlYXB47yhK4J/7j+HYty/EhFZDYKa/VA==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.14.7", + "@babel/helper-compilation-targets": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-validator-option": "^7.14.5", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.14.5", + "@babel/plugin-proposal-async-generator-functions": "^7.14.7", + "@babel/plugin-proposal-class-properties": "^7.14.5", + "@babel/plugin-proposal-class-static-block": "^7.14.5", + "@babel/plugin-proposal-dynamic-import": "^7.14.5", + "@babel/plugin-proposal-export-namespace-from": "^7.14.5", + "@babel/plugin-proposal-json-strings": "^7.14.5", + "@babel/plugin-proposal-logical-assignment-operators": "^7.14.5", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.14.5", + "@babel/plugin-proposal-numeric-separator": "^7.14.5", + "@babel/plugin-proposal-object-rest-spread": "^7.14.7", + "@babel/plugin-proposal-optional-catch-binding": "^7.14.5", + "@babel/plugin-proposal-optional-chaining": "^7.14.5", + "@babel/plugin-proposal-private-methods": "^7.14.5", + "@babel/plugin-proposal-private-property-in-object": "^7.14.5", + "@babel/plugin-proposal-unicode-property-regex": "^7.14.5", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-transform-arrow-functions": "^7.14.5", + "@babel/plugin-transform-async-to-generator": "^7.14.5", + "@babel/plugin-transform-block-scoped-functions": "^7.14.5", + "@babel/plugin-transform-block-scoping": "^7.14.5", + "@babel/plugin-transform-classes": "^7.14.5", + "@babel/plugin-transform-computed-properties": "^7.14.5", + "@babel/plugin-transform-destructuring": "^7.14.7", + "@babel/plugin-transform-dotall-regex": "^7.14.5", + "@babel/plugin-transform-duplicate-keys": "^7.14.5", + "@babel/plugin-transform-exponentiation-operator": "^7.14.5", + "@babel/plugin-transform-for-of": "^7.14.5", + "@babel/plugin-transform-function-name": "^7.14.5", + "@babel/plugin-transform-literals": "^7.14.5", + "@babel/plugin-transform-member-expression-literals": "^7.14.5", + "@babel/plugin-transform-modules-amd": "^7.14.5", + "@babel/plugin-transform-modules-commonjs": "^7.14.5", + "@babel/plugin-transform-modules-systemjs": "^7.14.5", + "@babel/plugin-transform-modules-umd": "^7.14.5", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.14.7", + "@babel/plugin-transform-new-target": "^7.14.5", + "@babel/plugin-transform-object-super": "^7.14.5", + "@babel/plugin-transform-parameters": "^7.14.5", + "@babel/plugin-transform-property-literals": "^7.14.5", + "@babel/plugin-transform-regenerator": "^7.14.5", + "@babel/plugin-transform-reserved-words": "^7.14.5", + "@babel/plugin-transform-shorthand-properties": "^7.14.5", + "@babel/plugin-transform-spread": "^7.14.6", + "@babel/plugin-transform-sticky-regex": "^7.14.5", + "@babel/plugin-transform-template-literals": "^7.14.5", + "@babel/plugin-transform-typeof-symbol": "^7.14.5", + "@babel/plugin-transform-unicode-escapes": "^7.14.5", + "@babel/plugin-transform-unicode-regex": "^7.14.5", + "@babel/preset-modules": "^0.1.4", + "@babel/types": "^7.14.5", + "babel-plugin-polyfill-corejs2": "^0.2.2", + "babel-plugin-polyfill-corejs3": "^0.2.2", + "babel-plugin-polyfill-regenerator": "^0.2.2", + "core-js-compat": "^3.15.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.4.tgz", + "integrity": "sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", + "@babel/plugin-transform-dotall-regex": "^7.4.4", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.14.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.14.6.tgz", + "integrity": "sha512-/PCB2uJ7oM44tz8YhC4Z/6PeOKXp4K588f+5M3clr1M4zbqztlo0XEfJ2LEzj/FgwfgGcIdl8n7YYjTCI0BYwg==", + "dev": true, + "dependencies": { + "regenerator-runtime": "^0.13.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.14.5.tgz", + "integrity": "sha512-6Z3Po85sfxRGachLULUhOmvAaOo7xCvqGQtxINai2mEGPFm6pQ4z5QInFnUrRpfoSV60BnjyF5F3c+15fxFV1g==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.14.5", + "@babel/parser": "^7.14.5", + "@babel/types": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.14.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.14.7.tgz", + "integrity": "sha512-9vDr5NzHu27wgwejuKL7kIOm4bwEtaPQ4Z6cpCmjSuaRqpH/7xc4qcGEscwMqlkwgcXl6MvqoAjZkQ24uSdIZQ==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.14.5", + "@babel/generator": "^7.14.5", + "@babel/helper-function-name": "^7.14.5", + "@babel/helper-hoist-variables": "^7.14.5", + "@babel/helper-split-export-declaration": "^7.14.5", + "@babel/parser": "^7.14.7", + "@babel/types": "^7.14.5", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.5.tgz", + "integrity": "sha512-M/NzBpEL95I5Hh4dwhin5JlE7EzO5PHMAuzjxss3tiOBD46KfQvVedN/3jEPZvdRvtsK2222XfdHogNIttFgcg==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.14.5", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-27.0.6.tgz", + "integrity": "sha512-fMlIBocSHPZ3JxgWiDNW/KPj6s+YRd0hicb33IrmelCcjXo/pXPwvuiKFmZz+XuqI/1u7nbUK10zSsWL/1aegg==", + "dev": true, + "dependencies": { + "@jest/types": "^27.0.6", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^27.0.6", + "jest-util": "^27.0.6", + "slash": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/core": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-27.0.6.tgz", + "integrity": "sha512-SsYBm3yhqOn5ZLJCtccaBcvD/ccTLCeuDv8U41WJH/V1MW5eKUkeMHT9U+Pw/v1m1AIWlnIW/eM2XzQr0rEmow==", + "dev": true, + "dependencies": { + "@jest/console": "^27.0.6", + "@jest/reporters": "^27.0.6", + "@jest/test-result": "^27.0.6", + "@jest/transform": "^27.0.6", + "@jest/types": "^27.0.6", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.8.1", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "jest-changed-files": "^27.0.6", + "jest-config": "^27.0.6", + "jest-haste-map": "^27.0.6", + "jest-message-util": "^27.0.6", + "jest-regex-util": "^27.0.6", + "jest-resolve": "^27.0.6", + "jest-resolve-dependencies": "^27.0.6", + "jest-runner": "^27.0.6", + "jest-runtime": "^27.0.6", + "jest-snapshot": "^27.0.6", + "jest-util": "^27.0.6", + "jest-validate": "^27.0.6", + "jest-watcher": "^27.0.6", + "micromatch": "^4.0.4", + "p-each-series": "^2.1.0", + "rimraf": "^3.0.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/environment": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-27.0.6.tgz", + "integrity": "sha512-4XywtdhwZwCpPJ/qfAkqExRsERW+UaoSRStSHCCiQTUpoYdLukj+YJbQSFrZjhlUDRZeNiU9SFH0u7iNimdiIg==", + "dev": true, + "dependencies": { + "@jest/fake-timers": "^27.0.6", + "@jest/types": "^27.0.6", + "@types/node": "*", + "jest-mock": "^27.0.6" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/fake-timers": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.0.6.tgz", + "integrity": "sha512-sqd+xTWtZ94l3yWDKnRTdvTeZ+A/V7SSKrxsrOKSqdyddb9CeNRF8fbhAU0D7ZJBpTTW2nbp6MftmKJDZfW2LQ==", + "dev": true, + "dependencies": { + "@jest/types": "^27.0.6", + "@sinonjs/fake-timers": "^7.0.2", + "@types/node": "*", + "jest-message-util": "^27.0.6", + "jest-mock": "^27.0.6", + "jest-util": "^27.0.6" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/globals": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-27.0.6.tgz", + "integrity": "sha512-DdTGCP606rh9bjkdQ7VvChV18iS7q0IMJVP1piwTWyWskol4iqcVwthZmoJEf7obE1nc34OpIyoVGPeqLC+ryw==", + "dev": true, + "dependencies": { + "@jest/environment": "^27.0.6", + "@jest/types": "^27.0.6", + "expect": "^27.0.6" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/reporters": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-27.0.6.tgz", + "integrity": "sha512-TIkBt09Cb2gptji3yJXb3EE+eVltW6BjO7frO7NEfjI9vSIYoISi5R3aI3KpEDXlB1xwB+97NXIqz84qYeYsfA==", + "dev": true, + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^27.0.6", + "@jest/test-result": "^27.0.6", + "@jest/transform": "^27.0.6", + "@jest/types": "^27.0.6", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.2", + "graceful-fs": "^4.2.4", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^4.0.3", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.0.2", + "jest-haste-map": "^27.0.6", + "jest-resolve": "^27.0.6", + "jest-util": "^27.0.6", + "jest-worker": "^27.0.6", + "slash": "^3.0.0", + "source-map": "^0.6.0", + "string-length": "^4.0.1", + "terminal-link": "^2.0.0", + "v8-to-istanbul": "^8.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/source-map": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-27.0.6.tgz", + "integrity": "sha512-Fek4mi5KQrqmlY07T23JRi0e7Z9bXTOOD86V/uS0EIW4PClvPDqZOyFlLpNJheS6QI0FNX1CgmPjtJ4EA/2M+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0", + "graceful-fs": "^4.2.4", + "source-map": "^0.6.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/test-result": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-27.0.6.tgz", + "integrity": "sha512-ja/pBOMTufjX4JLEauLxE3LQBPaI2YjGFtXexRAjt1I/MbfNlMx0sytSX3tn5hSLzQsR3Qy2rd0hc1BWojtj9w==", + "dev": true, + "dependencies": { + "@jest/console": "^27.0.6", + "@jest/types": "^27.0.6", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/test-sequencer": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.0.6.tgz", + "integrity": "sha512-bISzNIApazYOlTHDum9PwW22NOyDa6VI31n6JucpjTVM0jD6JDgqEZ9+yn575nDdPF0+4csYDxNNW13NvFQGZA==", + "dev": true, + "dependencies": { + "@jest/test-result": "^27.0.6", + "graceful-fs": "^4.2.4", + "jest-haste-map": "^27.0.6", + "jest-runtime": "^27.0.6" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/transform": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-27.0.6.tgz", + "integrity": "sha512-rj5Dw+mtIcntAUnMlW/Vju5mr73u8yg+irnHwzgtgoeI6cCPOvUwQ0D1uQtc/APmWgvRweEb1g05pkUpxH3iCA==", + "dev": true, + "dependencies": { + "@babel/core": "^7.1.0", + "@jest/types": "^27.0.6", + "babel-plugin-istanbul": "^6.0.0", + "chalk": "^4.0.0", + "convert-source-map": "^1.4.0", + "fast-json-stable-stringify": "^2.0.0", + "graceful-fs": "^4.2.4", + "jest-haste-map": "^27.0.6", + "jest-regex-util": "^27.0.6", + "jest-util": "^27.0.6", + "micromatch": "^4.0.4", + "pirates": "^4.0.1", + "slash": "^3.0.0", + "source-map": "^0.6.1", + "write-file-atomic": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/types": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.0.6.tgz", + "integrity": "sha512-aSquT1qa9Pik26JK5/3rvnYb4bGtm1VFNesHKmNTwmPIgOrixvhL2ghIvFRNEpzy3gU+rUgjIF/KodbkFAl++g==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@sinonjs/commons": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", + "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", + "dev": true, + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-7.1.2.tgz", + "integrity": "sha512-iQADsW4LBMISqZ6Ci1dupJL9pprqwcVFTcOsEmQOEhW+KLCVn/Y4Jrvg2k19fIHCp+iFprriYPTdRcQR8NbUPg==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^1.7.0" + } + }, + "node_modules/@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.8.tgz", + "integrity": "sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg==", + "dev": true + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.9.tgz", + "integrity": "sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw==", + "dev": true + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.1.tgz", + "integrity": "sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg==", + "dev": true + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.1.tgz", + "integrity": "sha512-FTgBI767POY/lKNDNbIzgAX6miIDBs6NTCbdlDb8TrWovHsSvaVIZDlTqym29C6UqhzwcJx4CYr+AlrMywA0cA==", + "dev": true + }, + "node_modules/@types/babel__core": { + "version": "7.1.15", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.15.tgz", + "integrity": "sha512-bxlMKPDbY8x5h6HBwVzEOk2C8fb6SLfYQ5Jw3uBYuYF1lfWk/kbLd81la82vrIkBb0l+JdmrZaDikPrNxpS/Ew==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.3.tgz", + "integrity": "sha512-/GWCmzJWqV7diQW54smJZzWbSFf4QYtF71WCKhcx6Ru/tFyQIY2eiiITcCAeuPbNSvT9YCGkVMqqvSk2Z0mXiA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", + "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.14.2.tgz", + "integrity": "sha512-K2waXdXBi2302XUdcHcR1jCeU0LL4TD9HRs/gk0N2Xvrht+G/BfJa4QObBQZfhMdxiCpV3COl5Nfq4uKTeTnJA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.3.0" + } + }, + "node_modules/@types/graceful-fs": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz", + "integrity": "sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", + "integrity": "sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw==", + "dev": true + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", + "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/jest": { + "version": "26.0.24", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-26.0.24.tgz", + "integrity": "sha512-E/X5Vib8BWqZNRlDxj9vYXhsDwPYbPINqKF9BsnSoon4RQ0D9moEuLD8txgyypFLH7J4+Lho9Nr/c8H0Fi+17w==", + "dev": true, + "dependencies": { + "jest-diff": "^26.0.0", + "pretty-format": "^26.0.0" + } + }, + "node_modules/@types/jest/node_modules/@jest/types": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@types/jest/node_modules/@types/yargs": { + "version": "15.0.14", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.14.tgz", + "integrity": "sha512-yEJzHoxf6SyQGhBhIYGXQDSCkJjB6HohDShto7m8vaKg9Yp0Yn8+71J9eakh2bnPg6BfsH9PRMhiRTZnd4eXGQ==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/jest/node_modules/diff-sequences": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.6.2.tgz", + "integrity": "sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q==", + "dev": true, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@types/jest/node_modules/jest-diff": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-26.6.2.tgz", + "integrity": "sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^26.6.2", + "jest-get-type": "^26.3.0", + "pretty-format": "^26.6.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@types/jest/node_modules/jest-get-type": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz", + "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==", + "dev": true, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@types/jest/node_modules/pretty-format": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", + "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.2", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@types/node": { + "version": "16.3.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.3.1.tgz", + "integrity": "sha512-N87VuQi7HEeRJkhzovao/JviiqKjDKMVKxKMfUvSKw+MbkbW8R0nA3fi/MQhhlxV2fQ+2ReM+/Nt4efdrJx3zA==", + "dev": true + }, + "node_modules/@types/prettier": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.3.2.tgz", + "integrity": "sha512-eI5Yrz3Qv4KPUa/nSIAi0h+qX0XyewOliug5F2QAtuRg6Kjg6jfmxe1GIwoIRhZspD1A0RP8ANrPwvEXXtRFog==", + "dev": true + }, + "node_modules/@types/stack-utils": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", + "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", + "dev": true + }, + "node_modules/@types/yargs": { + "version": "16.0.4", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.4.tgz", + "integrity": "sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "20.2.1", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-20.2.1.tgz", + "integrity": "sha512-7tFImggNeNBVMsn0vLrpn1H1uPrUBdnARPTpZoitY37ZrdJREzf7I16tMrlK3hen349gr1NYh8CmZQa7CTG6Aw==", + "dev": true + }, + "node_modules/abab": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", + "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==", + "dev": true + }, + "node_modules/acorn": { + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.4.1.tgz", + "integrity": "sha512-asabaBSkEKosYKMITunzX177CXxQ4Q8BSSzMTKD+FefUhipQC70gfW5SiUDhYQ3vk8G+81HqQk7Fv9OXwwn9KA==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-globals": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", + "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", + "dev": true, + "dependencies": { + "acorn": "^7.1.1", + "acorn-walk": "^7.1.1" + } + }, + "node_modules/acorn-globals/node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true + }, + "node_modules/babel-jest": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.0.6.tgz", + "integrity": "sha512-iTJyYLNc4wRofASmofpOc5NK9QunwMk+TLFgGXsTFS8uEqmd8wdI7sga0FPe2oVH3b5Agt/EAK1QjPEuKL8VfA==", + "dev": true, + "dependencies": { + "@jest/transform": "^27.0.6", + "@jest/types": "^27.0.6", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.0.0", + "babel-preset-jest": "^27.0.6", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "slash": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.8.0" + } + }, + "node_modules/babel-plugin-dynamic-import-node": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", + "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", + "dev": true, + "dependencies": { + "object.assign": "^4.1.0" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz", + "integrity": "sha512-AF55rZXpe7trmEylbaE1Gv54wn6rwU03aptvRoVIGP8YykoSxqdVLV1TfwflBCE/QtHmqtP8SWlTENqbK8GCSQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^4.0.0", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-jest-hoist": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.0.6.tgz", + "integrity": "sha512-CewFeM9Vv2gM7Yr9n5eyyLVPRSiBnk6lKZRjgwYnGKSl9M14TMn2vkN02wTF04OGuSDLEzlWiMzvjXuW9mB6Gw==", + "dev": true, + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.0.0", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.2.2.tgz", + "integrity": "sha512-kISrENsJ0z5dNPq5eRvcctITNHYXWOA4DUZRFYCz3jYCcvTb/A546LIddmoGNMVYg2U38OyFeNosQwI9ENTqIQ==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.13.11", + "@babel/helper-define-polyfill-provider": "^0.2.2", + "semver": "^6.1.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.3.tgz", + "integrity": "sha512-rCOFzEIJpJEAU14XCcV/erIf/wZQMmMT5l5vXOpL5uoznyOGfDIjPj6FVytMvtzaKSTSVKouOCTPJ5OMUZH30g==", + "dev": true, + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.2.2", + "core-js-compat": "^3.14.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.2.2.tgz", + "integrity": "sha512-Goy5ghsc21HgPDFtzRkSirpZVW35meGoTmTOb2bxqdl60ghub4xOidgNTHaZfQ2FaxQsKmwvXtOAkcIS4SMBWg==", + "dev": true, + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.2.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-preset-current-node-syntax": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", + "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", + "dev": true, + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.8.3", + "@babel/plugin-syntax-import-meta": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-top-level-await": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/babel-preset-jest": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-27.0.6.tgz", + "integrity": "sha512-WObA0/Biw2LrVVwZkF/2GqbOdzhKD6Fkdwhoy9ASIrOWr/zodcSpQh72JOkEn6NWyjmnPDjNSqaGN4KnpKzhXw==", + "dev": true, + "dependencies": { + "babel-plugin-jest-hoist": "^27.0.6", + "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browser-process-hrtime": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", + "dev": true + }, + "node_modules/browserslist": { + "version": "4.16.6", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.6.tgz", + "integrity": "sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ==", + "dev": true, + "dependencies": { + "caniuse-lite": "^1.0.30001219", + "colorette": "^1.2.2", + "electron-to-chromium": "^1.3.723", + "escalade": "^3.1.1", + "node-releases": "^1.1.71" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + } + }, + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "dev": true + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001244", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001244.tgz", + "integrity": "sha512-Wb4UFZPkPoJoKKVfELPWytRzpemjP/s0pe22NriANru1NoI+5bGNxzKtk7edYL8rmCWTfQO8eRiF0pn1Dqzx7Q==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + } + }, + "node_modules/chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/ci-info": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.2.0.tgz", + "integrity": "sha512-dVqRX7fLUm8J6FgHJ418XuIgDLZDkYcDFTeL6TA2gt5WlIZUQrrH6EZrNClwT/H0FateUsZkGIOPRrLbP+PR9A==", + "dev": true + }, + "node_modules/cjs-module-lexer": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.1.tgz", + "integrity": "sha512-jVamGdJPDeuQilKhvVn1h3knuMOZzr8QDnpk+M9aMlCaMkTDd6fBWPhiDqFvFZ07pL0liqabAiuy8SY4jGHeaw==", + "dev": true + }, + "node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "dev": true, + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/collect-v8-coverage": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", + "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", + "dev": true + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/colorette": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", + "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==", + "dev": true + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "node_modules/convert-source-map": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", + "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.1" + } + }, + "node_modules/core-js-compat": { + "version": "3.15.2", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.15.2.tgz", + "integrity": "sha512-Wp+BJVvwopjI+A1EFqm2dwUmWYXrvucmtIB2LgXn/Rb+gWPKYxtmb4GKHGKG/KGF1eK9jfjzT38DITbTOCX/SQ==", + "dev": true, + "dependencies": { + "browserslist": "^4.16.6", + "semver": "7.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-compat/node_modules/semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cssom": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", + "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", + "dev": true + }, + "node_modules/cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "dev": true, + "dependencies": { + "cssom": "~0.3.6" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cssstyle/node_modules/cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "dev": true + }, + "node_modules/data-urls": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", + "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", + "dev": true, + "dependencies": { + "abab": "^2.0.3", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decimal.js": { + "version": "10.3.1", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.3.1.tgz", + "integrity": "sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ==", + "dev": true + }, + "node_modules/dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=", + "dev": true + }, + "node_modules/deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "node_modules/deepmerge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "dependencies": { + "object-keys": "^1.0.12" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/diff-sequences": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.0.6.tgz", + "integrity": "sha512-ag6wfpBFyNXZ0p8pcuIDS//D8H062ZQJ3fzYxjpmeKjnz8W4pekL3AI8VohmyZmsWW2PWaHgjsmqR6L13101VQ==", + "dev": true, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/domexception": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", + "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", + "dev": true, + "dependencies": { + "webidl-conversions": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/domexception/node_modules/webidl-conversions": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", + "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.3.774", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.774.tgz", + "integrity": "sha512-Fggh17Q1yyv1uMzq8Qn1Ci58P50qcRXMXd2MBcB9sxo6rJxjUutWcNw8uCm3gFWMdcblBO6mDT5HzX/RVRRECA==", + "dev": true + }, + "node_modules/emittery": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.8.1.tgz", + "integrity": "sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/escodegen": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", + "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", + "dev": true, + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expect": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/expect/-/expect-27.0.6.tgz", + "integrity": "sha512-psNLt8j2kwg42jGBDSfAlU49CEZxejN1f1PlANWDZqIhBOVU/c2Pm888FcjWJzFewhIsNWfZJeLjUjtKGiPuSw==", + "dev": true, + "dependencies": { + "@jest/types": "^27.0.6", + "ansi-styles": "^5.0.0", + "jest-get-type": "^27.0.6", + "jest-matcher-utils": "^27.0.6", + "jest-message-util": "^27.0.6", + "jest-regex-util": "^27.0.6" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/expect/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "node_modules/fb-watchman": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", + "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==", + "dev": true, + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/form-data": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob": { + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "dev": true, + "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" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", + "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", + "dev": true + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/html-encoding-sniffer": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", + "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", + "dev": true, + "dependencies": { + "whatwg-encoding": "^1.0.5" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "node_modules/http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "dev": true, + "dependencies": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", + "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "dev": true, + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/import-local": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.2.tgz", + "integrity": "sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA==", + "dev": true, + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/is-ci": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.0.tgz", + "integrity": "sha512-kDXyttuLeslKAHYL/K28F2YkM3x5jvFPEw3yXbRptXydjD9rpLEz+C5K5iutY9ZiUu6AP41JdvRQwF4Iqs4ZCQ==", + "dev": true, + "dependencies": { + "ci-info": "^3.1.1" + }, + "bin": { + "is-ci": "bin.js" + } + }, + "node_modules/is-core-module": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.5.0.tgz", + "integrity": "sha512-TXCMSDsEHMEEZ6eCA8rwRDbLu55MRGmrctljsBX/2v1d9/GzqHOxW5c5oPSgrUt2vBFXebu9rGqckXGPWOlYpg==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", + "dev": true + }, + "node_modules/is-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", + "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", + "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", + "dev": true, + "dependencies": { + "@babel/core": "^7.7.5", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.0.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "dev": true, + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz", + "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-reports": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz", + "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==", + "dev": true, + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest/-/jest-27.0.6.tgz", + "integrity": "sha512-EjV8aETrsD0wHl7CKMibKwQNQc3gIRBXlTikBmmHUeVMKaPFxdcUIBfoDqTSXDoGJIivAYGqCWVlzCSaVjPQsA==", + "dev": true, + "dependencies": { + "@jest/core": "^27.0.6", + "import-local": "^3.0.2", + "jest-cli": "^27.0.6" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-changed-files": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-27.0.6.tgz", + "integrity": "sha512-BuL/ZDauaq5dumYh5y20sn4IISnf1P9A0TDswTxUi84ORGtVa86ApuBHqICL0vepqAnZiY6a7xeSPWv2/yy4eA==", + "dev": true, + "dependencies": { + "@jest/types": "^27.0.6", + "execa": "^5.0.0", + "throat": "^6.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-circus": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-27.0.6.tgz", + "integrity": "sha512-OJlsz6BBeX9qR+7O9lXefWoc2m9ZqcZ5Ohlzz0pTEAG4xMiZUJoacY8f4YDHxgk0oKYxj277AfOk9w6hZYvi1Q==", + "dev": true, + "dependencies": { + "@jest/environment": "^27.0.6", + "@jest/test-result": "^27.0.6", + "@jest/types": "^27.0.6", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^0.7.0", + "expect": "^27.0.6", + "is-generator-fn": "^2.0.0", + "jest-each": "^27.0.6", + "jest-matcher-utils": "^27.0.6", + "jest-message-util": "^27.0.6", + "jest-runtime": "^27.0.6", + "jest-snapshot": "^27.0.6", + "jest-util": "^27.0.6", + "pretty-format": "^27.0.6", + "slash": "^3.0.0", + "stack-utils": "^2.0.3", + "throat": "^6.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-config": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-27.0.6.tgz", + "integrity": "sha512-JZRR3I1Plr2YxPBhgqRspDE2S5zprbga3swYNrvY3HfQGu7p/GjyLOqwrYad97tX3U3mzT53TPHVmozacfP/3w==", + "dev": true, + "dependencies": { + "@babel/core": "^7.1.0", + "@jest/test-sequencer": "^27.0.6", + "@jest/types": "^27.0.6", + "babel-jest": "^27.0.6", + "chalk": "^4.0.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.1", + "graceful-fs": "^4.2.4", + "is-ci": "^3.0.0", + "jest-circus": "^27.0.6", + "jest-environment-jsdom": "^27.0.6", + "jest-environment-node": "^27.0.6", + "jest-get-type": "^27.0.6", + "jest-jasmine2": "^27.0.6", + "jest-regex-util": "^27.0.6", + "jest-resolve": "^27.0.6", + "jest-runner": "^27.0.6", + "jest-util": "^27.0.6", + "jest-validate": "^27.0.6", + "micromatch": "^4.0.4", + "pretty-format": "^27.0.6" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "ts-node": { + "optional": true + } + } + }, + "node_modules/jest-diff": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.0.6.tgz", + "integrity": "sha512-Z1mqgkTCSYaFgwTlP/NUiRzdqgxmmhzHY1Tq17zL94morOHfHu3K4bgSgl+CR4GLhpV8VxkuOYuIWnQ9LnFqmg==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^27.0.6", + "jest-get-type": "^27.0.6", + "pretty-format": "^27.0.6" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-docblock": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-27.0.6.tgz", + "integrity": "sha512-Fid6dPcjwepTFraz0YxIMCi7dejjJ/KL9FBjPYhBp4Sv1Y9PdhImlKZqYU555BlN4TQKaTc+F2Av1z+anVyGkA==", + "dev": true, + "dependencies": { + "detect-newline": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-each": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-27.0.6.tgz", + "integrity": "sha512-m6yKcV3bkSWrUIjxkE9OC0mhBZZdhovIW5ergBYirqnkLXkyEn3oUUF/QZgyecA1cF1QFyTE8bRRl8Tfg1pfLA==", + "dev": true, + "dependencies": { + "@jest/types": "^27.0.6", + "chalk": "^4.0.0", + "jest-get-type": "^27.0.6", + "jest-util": "^27.0.6", + "pretty-format": "^27.0.6" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-environment-jsdom": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-27.0.6.tgz", + "integrity": "sha512-FvetXg7lnXL9+78H+xUAsra3IeZRTiegA3An01cWeXBspKXUhAwMM9ycIJ4yBaR0L7HkoMPaZsozCLHh4T8fuw==", + "dev": true, + "dependencies": { + "@jest/environment": "^27.0.6", + "@jest/fake-timers": "^27.0.6", + "@jest/types": "^27.0.6", + "@types/node": "*", + "jest-mock": "^27.0.6", + "jest-util": "^27.0.6", + "jsdom": "^16.6.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-environment-node": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.0.6.tgz", + "integrity": "sha512-+Vi6yLrPg/qC81jfXx3IBlVnDTI6kmRr08iVa2hFCWmJt4zha0XW7ucQltCAPhSR0FEKEoJ3i+W4E6T0s9is0w==", + "dev": true, + "dependencies": { + "@jest/environment": "^27.0.6", + "@jest/fake-timers": "^27.0.6", + "@jest/types": "^27.0.6", + "@types/node": "*", + "jest-mock": "^27.0.6", + "jest-util": "^27.0.6" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-get-type": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.0.6.tgz", + "integrity": "sha512-XTkK5exIeUbbveehcSR8w0bhH+c0yloW/Wpl+9vZrjzztCPWrxhHwkIFpZzCt71oRBsgxmuUfxEqOYoZI2macg==", + "dev": true, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-haste-map": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.0.6.tgz", + "integrity": "sha512-4ldjPXX9h8doB2JlRzg9oAZ2p6/GpQUNAeiYXqcpmrKbP0Qev0wdZlxSMOmz8mPOEnt4h6qIzXFLDi8RScX/1w==", + "dev": true, + "dependencies": { + "@jest/types": "^27.0.6", + "@types/graceful-fs": "^4.1.2", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.4", + "jest-regex-util": "^27.0.6", + "jest-serializer": "^27.0.6", + "jest-util": "^27.0.6", + "jest-worker": "^27.0.6", + "micromatch": "^4.0.4", + "walker": "^1.0.7" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/jest-jasmine2": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.0.6.tgz", + "integrity": "sha512-cjpH2sBy+t6dvCeKBsHpW41mjHzXgsavaFMp+VWRf0eR4EW8xASk1acqmljFtK2DgyIECMv2yCdY41r2l1+4iA==", + "dev": true, + "dependencies": { + "@babel/traverse": "^7.1.0", + "@jest/environment": "^27.0.6", + "@jest/source-map": "^27.0.6", + "@jest/test-result": "^27.0.6", + "@jest/types": "^27.0.6", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "expect": "^27.0.6", + "is-generator-fn": "^2.0.0", + "jest-each": "^27.0.6", + "jest-matcher-utils": "^27.0.6", + "jest-message-util": "^27.0.6", + "jest-runtime": "^27.0.6", + "jest-snapshot": "^27.0.6", + "jest-util": "^27.0.6", + "pretty-format": "^27.0.6", + "throat": "^6.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-leak-detector": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-27.0.6.tgz", + "integrity": "sha512-2/d6n2wlH5zEcdctX4zdbgX8oM61tb67PQt4Xh8JFAIy6LRKUnX528HulkaG6nD5qDl5vRV1NXejCe1XRCH5gQ==", + "dev": true, + "dependencies": { + "jest-get-type": "^27.0.6", + "pretty-format": "^27.0.6" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-matcher-utils": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.0.6.tgz", + "integrity": "sha512-OFgF2VCQx9vdPSYTHWJ9MzFCehs20TsyFi6bIHbk5V1u52zJOnvF0Y/65z3GLZHKRuTgVPY4Z6LVePNahaQ+tA==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^27.0.6", + "jest-get-type": "^27.0.6", + "pretty-format": "^27.0.6" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-message-util": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.0.6.tgz", + "integrity": "sha512-rBxIs2XK7rGy+zGxgi+UJKP6WqQ+KrBbD1YMj517HYN3v2BG66t3Xan3FWqYHKZwjdB700KiAJ+iES9a0M+ixw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^27.0.6", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "micromatch": "^4.0.4", + "pretty-format": "^27.0.6", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-mock": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.0.6.tgz", + "integrity": "sha512-lzBETUoK8cSxts2NYXSBWT+EJNzmUVtVVwS1sU9GwE1DLCfGsngg+ZVSIe0yd0ZSm+y791esiuo+WSwpXJQ5Bw==", + "dev": true, + "dependencies": { + "@jest/types": "^27.0.6", + "@types/node": "*" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-pnp-resolver": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", + "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==", + "dev": true, + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } + }, + "node_modules/jest-regex-util": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.0.6.tgz", + "integrity": "sha512-SUhPzBsGa1IKm8hx2F4NfTGGp+r7BXJ4CulsZ1k2kI+mGLG+lxGrs76veN2LF/aUdGosJBzKgXmNCw+BzFqBDQ==", + "dev": true, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-resolve": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.0.6.tgz", + "integrity": "sha512-yKmIgw2LgTh7uAJtzv8UFHGF7Dm7XfvOe/LQ3Txv101fLM8cx2h1QVwtSJ51Q/SCxpIiKfVn6G2jYYMDNHZteA==", + "dev": true, + "dependencies": { + "@jest/types": "^27.0.6", + "chalk": "^4.0.0", + "escalade": "^3.1.1", + "graceful-fs": "^4.2.4", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^27.0.6", + "jest-validate": "^27.0.6", + "resolve": "^1.20.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-resolve-dependencies": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.0.6.tgz", + "integrity": "sha512-mg9x9DS3BPAREWKCAoyg3QucCr0n6S8HEEsqRCKSPjPcu9HzRILzhdzY3imsLoZWeosEbJZz6TKasveczzpJZA==", + "dev": true, + "dependencies": { + "@jest/types": "^27.0.6", + "jest-regex-util": "^27.0.6", + "jest-snapshot": "^27.0.6" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-runner": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-27.0.6.tgz", + "integrity": "sha512-W3Bz5qAgaSChuivLn+nKOgjqNxM7O/9JOJoKDCqThPIg2sH/d4A/lzyiaFgnb9V1/w29Le11NpzTJSzga1vyYQ==", + "dev": true, + "dependencies": { + "@jest/console": "^27.0.6", + "@jest/environment": "^27.0.6", + "@jest/test-result": "^27.0.6", + "@jest/transform": "^27.0.6", + "@jest/types": "^27.0.6", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.8.1", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "jest-docblock": "^27.0.6", + "jest-environment-jsdom": "^27.0.6", + "jest-environment-node": "^27.0.6", + "jest-haste-map": "^27.0.6", + "jest-leak-detector": "^27.0.6", + "jest-message-util": "^27.0.6", + "jest-resolve": "^27.0.6", + "jest-runtime": "^27.0.6", + "jest-util": "^27.0.6", + "jest-worker": "^27.0.6", + "source-map-support": "^0.5.6", + "throat": "^6.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-runtime": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.0.6.tgz", + "integrity": "sha512-BhvHLRVfKibYyqqEFkybsznKwhrsu7AWx2F3y9G9L95VSIN3/ZZ9vBpm/XCS2bS+BWz3sSeNGLzI3TVQ0uL85Q==", + "dev": true, + "dependencies": { + "@jest/console": "^27.0.6", + "@jest/environment": "^27.0.6", + "@jest/fake-timers": "^27.0.6", + "@jest/globals": "^27.0.6", + "@jest/source-map": "^27.0.6", + "@jest/test-result": "^27.0.6", + "@jest/transform": "^27.0.6", + "@jest/types": "^27.0.6", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.4", + "jest-haste-map": "^27.0.6", + "jest-message-util": "^27.0.6", + "jest-mock": "^27.0.6", + "jest-regex-util": "^27.0.6", + "jest-resolve": "^27.0.6", + "jest-snapshot": "^27.0.6", + "jest-util": "^27.0.6", + "jest-validate": "^27.0.6", + "slash": "^3.0.0", + "strip-bom": "^4.0.0", + "yargs": "^16.0.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-serializer": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-27.0.6.tgz", + "integrity": "sha512-PtGdVK9EGC7dsaziskfqaAPib6wTViY3G8E5wz9tLVPhHyiDNTZn/xjZ4khAw+09QkoOVpn7vF5nPSN6dtBexA==", + "dev": true, + "dependencies": { + "@types/node": "*", + "graceful-fs": "^4.2.4" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-snapshot": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.0.6.tgz", + "integrity": "sha512-NTHaz8He+ATUagUgE7C/UtFcRoHqR2Gc+KDfhQIyx+VFgwbeEMjeP+ILpUTLosZn/ZtbNdCF5LkVnN/l+V751A==", + "dev": true, + "dependencies": { + "@babel/core": "^7.7.2", + "@babel/generator": "^7.7.2", + "@babel/parser": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/traverse": "^7.7.2", + "@babel/types": "^7.0.0", + "@jest/transform": "^27.0.6", + "@jest/types": "^27.0.6", + "@types/babel__traverse": "^7.0.4", + "@types/prettier": "^2.1.5", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^27.0.6", + "graceful-fs": "^4.2.4", + "jest-diff": "^27.0.6", + "jest-get-type": "^27.0.6", + "jest-haste-map": "^27.0.6", + "jest-matcher-utils": "^27.0.6", + "jest-message-util": "^27.0.6", + "jest-resolve": "^27.0.6", + "jest-util": "^27.0.6", + "natural-compare": "^1.4.0", + "pretty-format": "^27.0.6", + "semver": "^7.3.2" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-util": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.0.6.tgz", + "integrity": "sha512-1JjlaIh+C65H/F7D11GNkGDDZtDfMEM8EBXsvd+l/cxtgQ6QhxuloOaiayt89DxUvDarbVhqI98HhgrM1yliFQ==", + "dev": true, + "dependencies": { + "@jest/types": "^27.0.6", + "@types/node": "*", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "is-ci": "^3.0.0", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-validate": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-27.0.6.tgz", + "integrity": "sha512-yhZZOaMH3Zg6DC83n60pLmdU1DQE46DW+KLozPiPbSbPhlXXaiUTDlhHQhHFpaqIFRrInko1FHXjTRpjWRuWfA==", + "dev": true, + "dependencies": { + "@jest/types": "^27.0.6", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^27.0.6", + "leven": "^3.1.0", + "pretty-format": "^27.0.6" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-validate/node_modules/camelcase": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", + "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-watcher": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-27.0.6.tgz", + "integrity": "sha512-/jIoKBhAP00/iMGnTwUBLgvxkn7vsOweDrOTSPzc7X9uOyUtJIDthQBTI1EXz90bdkrxorUZVhJwiB69gcHtYQ==", + "dev": true, + "dependencies": { + "@jest/test-result": "^27.0.6", + "@jest/types": "^27.0.6", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "jest-util": "^27.0.6", + "string-length": "^4.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-worker": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.0.6.tgz", + "integrity": "sha512-qupxcj/dRuA3xHPMUd40gr2EaAurFbkwzOh7wfPaeE9id7hyjURRQoqNfHifHK3XjJU6YJJUQKILGUnwGPEOCA==", + "dev": true, + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/jest/node_modules/jest-cli": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-27.0.6.tgz", + "integrity": "sha512-qUUVlGb9fdKir3RDE+B10ULI+LQrz+MCflEH2UJyoUjoHHCbxDrMxSzjQAPUMsic4SncI62ofYCcAvW6+6rhhg==", + "dev": true, + "dependencies": { + "@jest/core": "^27.0.6", + "@jest/test-result": "^27.0.6", + "@jest/types": "^27.0.6", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "import-local": "^3.0.2", + "jest-config": "^27.0.6", + "jest-util": "^27.0.6", + "jest-validate": "^27.0.6", + "prompts": "^2.0.1", + "yargs": "^16.0.3" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsdom": { + "version": "16.6.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.6.0.tgz", + "integrity": "sha512-Ty1vmF4NHJkolaEmdjtxTfSfkdb8Ywarwf63f+F8/mDD1uLSSWDxDuMiZxiPhwunLrn9LOSVItWj4bLYsLN3Dg==", + "dev": true, + "dependencies": { + "abab": "^2.0.5", + "acorn": "^8.2.4", + "acorn-globals": "^6.0.0", + "cssom": "^0.4.4", + "cssstyle": "^2.3.0", + "data-urls": "^2.0.0", + "decimal.js": "^10.2.1", + "domexception": "^2.0.1", + "escodegen": "^2.0.0", + "form-data": "^3.0.0", + "html-encoding-sniffer": "^2.0.1", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.0", + "parse5": "6.0.1", + "saxes": "^5.0.1", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.0.0", + "w3c-hr-time": "^1.0.2", + "w3c-xmlserializer": "^2.0.0", + "webidl-conversions": "^6.1.0", + "whatwg-encoding": "^1.0.5", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.5.0", + "ws": "^7.4.5", + "xml-name-validator": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "canvas": "^2.5.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json5": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", + "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", + "dev": true, + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "dependencies": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=", + "dev": true + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "node_modules/makeerror": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", + "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", + "dev": true, + "dependencies": { + "tmpl": "1.0.x" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "dev": true, + "dependencies": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime-db": { + "version": "1.48.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.48.0.tgz", + "integrity": "sha512-FM3QwxV+TnZYQ2aRqhlKBMHxk10lTbMt3bBkMAp54ddrNeVSfcQYOOKuGuy3Ddrm38I04If834fOUSq1yzslJQ==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.31", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.31.tgz", + "integrity": "sha512-XGZnNzm3QvgKxa8dpzyhFTHmpP3l5YNusmne07VUOXxou9CqUqYa/HBy124RqtVh/O2pECas/MOcsDgpilPOPg==", + "dev": true, + "dependencies": { + "mime-db": "1.48.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", + "dev": true + }, + "node_modules/node-modules-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", + "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/node-releases": { + "version": "1.1.73", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.73.tgz", + "integrity": "sha512-uW7fodD6pyW2FZNZnp/Z3hvWKeEW1Y8R1+1CnErE8cXFXzl5blBOoVB41CvMer6P6Q0S5FXDwcHgFd1Wj0U9zg==", + "dev": true + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nwsapi": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", + "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==", + "dev": true + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, + "dependencies": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-each-series": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.2.0.tgz", + "integrity": "sha512-ycIL2+1V32th+8scbpTvyHNaHe02z0sjgh91XXjAk+ZeXoPN4Z46DVUnzdso0aX4KckKw0FNNFHdjZ2UsZvxiA==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "dev": true + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", + "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pirates": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", + "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", + "dev": true, + "dependencies": { + "node-modules-regexp": "^1.0.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/pretty-format": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.0.6.tgz", + "integrity": "sha512-8tGD7gBIENgzqA+UBzObyWqQ5B778VIFZA/S66cclyd5YkFLYs2Js7gxDKf0MXtTc9zcS7t1xhdfcElJ3YIvkQ==", + "dev": true, + "dependencies": { + "@jest/types": "^27.0.6", + "ansi-regex": "^5.0.0", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/prompts": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.1.tgz", + "integrity": "sha512-EQyfIuO2hPDsX1L/blblV+H7I0knhgAd82cVneCwcdND9B8AuCDuRcBH6yIcG4dFzlOUqbazQqwGjx5xmsNLuQ==", + "dev": true, + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/psl": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", + "dev": true + }, + "node_modules/punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "dev": true + }, + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "dev": true + }, + "node_modules/regenerate-unicode-properties": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz", + "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==", + "dev": true, + "dependencies": { + "regenerate": "^1.4.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.13.7", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", + "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==", + "dev": true + }, + "node_modules/regenerator-transform": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz", + "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.8.4" + } + }, + "node_modules/regexpu-core": { + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.1.tgz", + "integrity": "sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ==", + "dev": true, + "dependencies": { + "regenerate": "^1.4.0", + "regenerate-unicode-properties": "^8.2.0", + "regjsgen": "^0.5.1", + "regjsparser": "^0.6.4", + "unicode-match-property-ecmascript": "^1.0.4", + "unicode-match-property-value-ecmascript": "^1.2.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regjsgen": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz", + "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==", + "dev": true + }, + "node_modules/regjsparser": { + "version": "0.6.9", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.9.tgz", + "integrity": "sha512-ZqbNRz1SNjLAiYuwY0zoXW8Ne675IX5q+YHioAGbCw4X96Mjl2+dcX9B2ciaeyYjViDAfvIjFpQjJgLttTEERQ==", + "dev": true, + "dependencies": { + "jsesc": "~0.5.0" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/regjsparser/node_modules/jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "dev": true, + "dependencies": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "node_modules/saxes": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", + "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", + "dev": true, + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", + "dev": true + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "node_modules/stack-utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-gL//fkxfWUsIlFL2Tl42Cl6+HFALEaB1FU76I/Fy+oZjRreP7OPMXFlGbxM7NQsI0ZpUfw76sHnv0WNYuTb7Iw==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/stack-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dev": true, + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-width": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", + "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-hyperlinks": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz", + "integrity": "sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true + }, + "node_modules/terminal-link": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", + "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", + "dev": true, + "dependencies": { + "ansi-escapes": "^4.2.1", + "supports-hyperlinks": "^2.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/throat": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/throat/-/throat-6.0.1.tgz", + "integrity": "sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w==", + "dev": true + }, + "node_modules/tmpl": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", + "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=", + "dev": true + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tough-cookie": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz", + "integrity": "sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==", + "dev": true, + "dependencies": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.1.2" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tr46": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", + "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", + "dev": true, + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ts-node": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.1.0.tgz", + "integrity": "sha512-6szn3+J9WyG2hE+5W8e0ruZrzyk1uFLYye6IGMBadnOzDh8aP7t8CbFpsfCiEx2+wMixAhjFt7lOZC4+l+WbEA==", + "dev": true, + "dependencies": { + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "source-map-support": "^0.5.17", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "dependencies": { + "prelude-ls": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dev": true, + "dependencies": { + "is-typedarray": "^1.0.0" + } + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", + "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", + "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", + "dev": true, + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^1.0.4", + "unicode-property-aliases-ecmascript": "^1.0.4" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz", + "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz", + "integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/v8-to-istanbul": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-8.0.0.tgz", + "integrity": "sha512-LkmXi8UUNxnCC+JlH7/fsfsKr5AU110l+SYGJimWNkWhxbN5EyeOtm1MJ0hhvqMMOhGwBj1Fp70Yv9i+hX0QAg==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0", + "source-map": "^0.7.3" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/v8-to-istanbul/node_modules/source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/w3c-hr-time": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", + "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", + "dev": true, + "dependencies": { + "browser-process-hrtime": "^1.0.0" + } + }, + "node_modules/w3c-xmlserializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", + "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", + "dev": true, + "dependencies": { + "xml-name-validator": "^3.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/walker": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", + "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", + "dev": true, + "dependencies": { + "makeerror": "1.0.x" + } + }, + "node_modules/webidl-conversions": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", + "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", + "dev": true, + "engines": { + "node": ">=10.4" + } + }, + "node_modules/whatwg-encoding": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", + "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", + "dev": true, + "dependencies": { + "iconv-lite": "0.4.24" + } + }, + "node_modules/whatwg-mimetype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", + "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", + "dev": true + }, + "node_modules/whatwg-url": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", + "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", + "dev": true, + "dependencies": { + "lodash": "^4.7.0", + "tr46": "^2.1.0", + "webidl-conversions": "^6.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "node_modules/write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "node_modules/ws": { + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.3.tgz", + "integrity": "sha512-kQ/dHIzuLrS6Je9+uv81ueZomEwH0qVYstcAQ4/Z93K8zeko9gtAbttJWzoC5ukqXY1PpoouV3+VSOqEAFt5wg==", + "dev": true, + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xml-name-validator": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", + "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", + "dev": true + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "engines": { + "node": ">=6" + } + } + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.14.5.tgz", + "integrity": "sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.14.5" + } + }, + "@babel/compat-data": { + "version": "7.14.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.14.7.tgz", + "integrity": "sha512-nS6dZaISCXJ3+518CWiBfEr//gHyMO02uDxBkXTKZDN5POruCnOZ1N4YBRZDCabwF8nZMWBpRxIicmXtBs+fvw==", + "dev": true + }, + "@babel/core": { + "version": "7.14.6", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.14.6.tgz", + "integrity": "sha512-gJnOEWSqTk96qG5BoIrl5bVtc23DCycmIePPYnamY9RboYdI4nFy5vAQMSl81O5K/W0sLDWfGysnOECC+KUUCA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.14.5", + "@babel/generator": "^7.14.5", + "@babel/helper-compilation-targets": "^7.14.5", + "@babel/helper-module-transforms": "^7.14.5", + "@babel/helpers": "^7.14.6", + "@babel/parser": "^7.14.6", + "@babel/template": "^7.14.5", + "@babel/traverse": "^7.14.5", + "@babel/types": "^7.14.5", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.1.2", + "semver": "^6.3.0", + "source-map": "^0.5.0" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "@babel/generator": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.14.5.tgz", + "integrity": "sha512-y3rlP+/G25OIX3mYKKIOlQRcqj7YgrvHxOLbVmyLJ9bPmi5ttvUmpydVjcFjZphOktWuA7ovbx91ECloWTfjIA==", + "dev": true, + "requires": { + "@babel/types": "^7.14.5", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "@babel/helper-annotate-as-pure": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.14.5.tgz", + "integrity": "sha512-EivH9EgBIb+G8ij1B2jAwSH36WnGvkQSEC6CkX/6v6ZFlw5fVOHvsgGF4uiEHO2GzMvunZb6tDLQEQSdrdocrA==", + "dev": true, + "requires": { + "@babel/types": "^7.14.5" + } + }, + "@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.14.5.tgz", + "integrity": "sha512-YTA/Twn0vBXDVGJuAX6PwW7x5zQei1luDDo2Pl6q1qZ7hVNl0RZrhHCQG/ArGpR29Vl7ETiB8eJyrvpuRp300w==", + "dev": true, + "requires": { + "@babel/helper-explode-assignable-expression": "^7.14.5", + "@babel/types": "^7.14.5" + } + }, + "@babel/helper-compilation-targets": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.14.5.tgz", + "integrity": "sha512-v+QtZqXEiOnpO6EYvlImB6zCD2Lel06RzOPzmkz/D/XgQiUu3C/Jb1LOqSt/AIA34TYi/Q+KlT8vTQrgdxkbLw==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.14.5", + "@babel/helper-validator-option": "^7.14.5", + "browserslist": "^4.16.6", + "semver": "^6.3.0" + } + }, + "@babel/helper-create-class-features-plugin": { + "version": "7.14.6", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.14.6.tgz", + "integrity": "sha512-Z6gsfGofTxH/+LQXqYEK45kxmcensbzmk/oi8DmaQytlQCgqNZt9XQF8iqlI/SeXWVjaMNxvYvzaYw+kh42mDg==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.14.5", + "@babel/helper-function-name": "^7.14.5", + "@babel/helper-member-expression-to-functions": "^7.14.5", + "@babel/helper-optimise-call-expression": "^7.14.5", + "@babel/helper-replace-supers": "^7.14.5", + "@babel/helper-split-export-declaration": "^7.14.5" + } + }, + "@babel/helper-create-regexp-features-plugin": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.14.5.tgz", + "integrity": "sha512-TLawwqpOErY2HhWbGJ2nZT5wSkR192QpN+nBg1THfBfftrlvOh+WbhrxXCH4q4xJ9Gl16BGPR/48JA+Ryiho/A==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.14.5", + "regexpu-core": "^4.7.1" + } + }, + "@babel/helper-define-polyfill-provider": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.2.3.tgz", + "integrity": "sha512-RH3QDAfRMzj7+0Nqu5oqgO5q9mFtQEVvCRsi8qCEfzLR9p2BHfn5FzhSB2oj1fF7I2+DcTORkYaQ6aTR9Cofew==", + "dev": true, + "requires": { + "@babel/helper-compilation-targets": "^7.13.0", + "@babel/helper-module-imports": "^7.12.13", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/traverse": "^7.13.0", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2", + "semver": "^6.1.2" + } + }, + "@babel/helper-explode-assignable-expression": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.14.5.tgz", + "integrity": "sha512-Htb24gnGJdIGT4vnRKMdoXiOIlqOLmdiUYpAQ0mYfgVT/GDm8GOYhgi4GL+hMKrkiPRohO4ts34ELFsGAPQLDQ==", + "dev": true, + "requires": { + "@babel/types": "^7.14.5" + } + }, + "@babel/helper-function-name": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.14.5.tgz", + "integrity": "sha512-Gjna0AsXWfFvrAuX+VKcN/aNNWonizBj39yGwUzVDVTlMYJMK2Wp6xdpy72mfArFq5uK+NOuexfzZlzI1z9+AQ==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.14.5", + "@babel/template": "^7.14.5", + "@babel/types": "^7.14.5" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.14.5.tgz", + "integrity": "sha512-I1Db4Shst5lewOM4V+ZKJzQ0JGGaZ6VY1jYvMghRjqs6DWgxLCIyFt30GlnKkfUeFLpJt2vzbMVEXVSXlIFYUg==", + "dev": true, + "requires": { + "@babel/types": "^7.14.5" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.14.5.tgz", + "integrity": "sha512-R1PXiz31Uc0Vxy4OEOm07x0oSjKAdPPCh3tPivn/Eo8cvz6gveAeuyUUPB21Hoiif0uoPQSSdhIPS3352nvdyQ==", + "dev": true, + "requires": { + "@babel/types": "^7.14.5" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.14.7", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.14.7.tgz", + "integrity": "sha512-TMUt4xKxJn6ccjcOW7c4hlwyJArizskAhoSTOCkA0uZ+KghIaci0Qg9R043kUMWI9mtQfgny+NQ5QATnZ+paaA==", + "dev": true, + "requires": { + "@babel/types": "^7.14.5" + } + }, + "@babel/helper-module-imports": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.14.5.tgz", + "integrity": "sha512-SwrNHu5QWS84XlHwGYPDtCxcA0hrSlL2yhWYLgeOc0w7ccOl2qv4s/nARI0aYZW+bSwAL5CukeXA47B/1NKcnQ==", + "dev": true, + "requires": { + "@babel/types": "^7.14.5" + } + }, + "@babel/helper-module-transforms": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.14.5.tgz", + "integrity": "sha512-iXpX4KW8LVODuAieD7MzhNjmM6dzYY5tfRqT+R9HDXWl0jPn/djKmA+G9s/2C2T9zggw5tK1QNqZ70USfedOwA==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.14.5", + "@babel/helper-replace-supers": "^7.14.5", + "@babel/helper-simple-access": "^7.14.5", + "@babel/helper-split-export-declaration": "^7.14.5", + "@babel/helper-validator-identifier": "^7.14.5", + "@babel/template": "^7.14.5", + "@babel/traverse": "^7.14.5", + "@babel/types": "^7.14.5" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.14.5.tgz", + "integrity": "sha512-IqiLIrODUOdnPU9/F8ib1Fx2ohlgDhxnIDU7OEVi+kAbEZcyiF7BLU8W6PfvPi9LzztjS7kcbzbmL7oG8kD6VA==", + "dev": true, + "requires": { + "@babel/types": "^7.14.5" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz", + "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==", + "dev": true + }, + "@babel/helper-remap-async-to-generator": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.14.5.tgz", + "integrity": "sha512-rLQKdQU+HYlxBwQIj8dk4/0ENOUEhA/Z0l4hN8BexpvmSMN9oA9EagjnhnDpNsRdWCfjwa4mn/HyBXO9yhQP6A==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.14.5", + "@babel/helper-wrap-function": "^7.14.5", + "@babel/types": "^7.14.5" + } + }, + "@babel/helper-replace-supers": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.14.5.tgz", + "integrity": "sha512-3i1Qe9/8x/hCHINujn+iuHy+mMRLoc77b2nI9TB0zjH1hvn9qGlXjWlggdwUcju36PkPCy/lpM7LLUdcTyH4Ow==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.14.5", + "@babel/helper-optimise-call-expression": "^7.14.5", + "@babel/traverse": "^7.14.5", + "@babel/types": "^7.14.5" + } + }, + "@babel/helper-simple-access": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.14.5.tgz", + "integrity": "sha512-nfBN9xvmCt6nrMZjfhkl7i0oTV3yxR4/FztsbOASyTvVcoYd0TRHh7eMLdlEcCqobydC0LAF3LtC92Iwxo0wyw==", + "dev": true, + "requires": { + "@babel/types": "^7.14.5" + } + }, + "@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.14.5.tgz", + "integrity": "sha512-dmqZB7mrb94PZSAOYtr+ZN5qt5owZIAgqtoTuqiFbHFtxgEcmQlRJVI+bO++fciBunXtB6MK7HrzrfcAzIz2NQ==", + "dev": true, + "requires": { + "@babel/types": "^7.14.5" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.14.5.tgz", + "integrity": "sha512-hprxVPu6e5Kdp2puZUmvOGjaLv9TCe58E/Fl6hRq4YiVQxIcNvuq6uTM2r1mT/oPskuS9CgR+I94sqAYv0NGKA==", + "dev": true, + "requires": { + "@babel/types": "^7.14.5" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.5.tgz", + "integrity": "sha512-5lsetuxCLilmVGyiLEfoHBRX8UCFD+1m2x3Rj97WrW3V7H3u4RWRXA4evMjImCsin2J2YT0QaVDGf+z8ondbAg==", + "dev": true + }, + "@babel/helper-validator-option": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz", + "integrity": "sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow==", + "dev": true + }, + "@babel/helper-wrap-function": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.14.5.tgz", + "integrity": "sha512-YEdjTCq+LNuNS1WfxsDCNpgXkJaIyqco6DAelTUjT4f2KIWC1nBcaCaSdHTBqQVLnTBexBcVcFhLSU1KnYuePQ==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.14.5", + "@babel/template": "^7.14.5", + "@babel/traverse": "^7.14.5", + "@babel/types": "^7.14.5" + } + }, + "@babel/helpers": { + "version": "7.14.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.14.6.tgz", + "integrity": "sha512-yesp1ENQBiLI+iYHSJdoZKUtRpfTlL1grDIX9NRlAVppljLw/4tTyYupIB7uIYmC3stW/imAv8EqaKaS/ibmeA==", + "dev": true, + "requires": { + "@babel/template": "^7.14.5", + "@babel/traverse": "^7.14.5", + "@babel/types": "^7.14.5" + } + }, + "@babel/highlight": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", + "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.14.5", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "@babel/parser": { + "version": "7.14.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.7.tgz", + "integrity": "sha512-X67Z5y+VBJuHB/RjwECp8kSl5uYi0BvRbNeWqkaJCVh+LiTPl19WBUfG627psSgp9rSf6ojuXghQM3ha6qHHdA==", + "dev": true + }, + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.14.5.tgz", + "integrity": "sha512-ZoJS2XCKPBfTmL122iP6NM9dOg+d4lc9fFk3zxc8iDjvt8Pk4+TlsHSKhIPf6X+L5ORCdBzqMZDjL/WHj7WknQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.14.5", + "@babel/plugin-proposal-optional-chaining": "^7.14.5" + } + }, + "@babel/plugin-proposal-async-generator-functions": { + "version": "7.14.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.14.7.tgz", + "integrity": "sha512-RK8Wj7lXLY3bqei69/cc25gwS5puEc3dknoFPFbqfy3XxYQBQFvu4ioWpafMBAB+L9NyptQK4nMOa5Xz16og8Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-remap-async-to-generator": "^7.14.5", + "@babel/plugin-syntax-async-generators": "^7.8.4" + } + }, + "@babel/plugin-proposal-class-properties": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.14.5.tgz", + "integrity": "sha512-q/PLpv5Ko4dVc1LYMpCY7RVAAO4uk55qPwrIuJ5QJ8c6cVuAmhu7I/49JOppXL6gXf7ZHzpRVEUZdYoPLM04Gg==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-proposal-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.14.5.tgz", + "integrity": "sha512-KBAH5ksEnYHCegqseI5N9skTdxgJdmDoAOc0uXa+4QMYKeZD0w5IARh4FMlTNtaHhbB8v+KzMdTgxMMzsIy6Yg==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + } + }, + "@babel/plugin-proposal-dynamic-import": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.14.5.tgz", + "integrity": "sha512-ExjiNYc3HDN5PXJx+bwC50GIx/KKanX2HiggnIUAYedbARdImiCU4RhhHfdf0Kd7JNXGpsBBBCOm+bBVy3Gb0g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + } + }, + "@babel/plugin-proposal-export-namespace-from": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.14.5.tgz", + "integrity": "sha512-g5POA32bXPMmSBu5Dx/iZGLGnKmKPc5AiY7qfZgurzrCYgIztDlHFbznSNCoQuv57YQLnQfaDi7dxCtLDIdXdA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + } + }, + "@babel/plugin-proposal-json-strings": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.14.5.tgz", + "integrity": "sha512-NSq2fczJYKVRIsUJyNxrVUMhB27zb7N7pOFGQOhBKJrChbGcgEAqyZrmZswkPk18VMurEeJAaICbfm57vUeTbQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-json-strings": "^7.8.3" + } + }, + "@babel/plugin-proposal-logical-assignment-operators": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.14.5.tgz", + "integrity": "sha512-YGn2AvZAo9TwyhlLvCCWxD90Xq8xJ4aSgaX3G5D/8DW94L8aaT+dS5cSP+Z06+rCJERGSr9GxMBZ601xoc2taw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + } + }, + "@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.14.5.tgz", + "integrity": "sha512-gun/SOnMqjSb98Nkaq2rTKMwervfdAoz6NphdY0vTfuzMfryj+tDGb2n6UkDKwez+Y8PZDhE3D143v6Gepp4Hg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + } + }, + "@babel/plugin-proposal-numeric-separator": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.14.5.tgz", + "integrity": "sha512-yiclALKe0vyZRZE0pS6RXgjUOt87GWv6FYa5zqj15PvhOGFO69R5DusPlgK/1K5dVnCtegTiWu9UaBSrLLJJBg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + } + }, + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.14.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.14.7.tgz", + "integrity": "sha512-082hsZz+sVabfmDWo1Oct1u1AgbKbUAyVgmX4otIc7bdsRgHBXwTwb3DpDmD4Eyyx6DNiuz5UAATT655k+kL5g==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.14.7", + "@babel/helper-compilation-targets": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.14.5" + } + }, + "@babel/plugin-proposal-optional-catch-binding": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.14.5.tgz", + "integrity": "sha512-3Oyiixm0ur7bzO5ybNcZFlmVsygSIQgdOa7cTfOYCMY+wEPAYhZAJxi3mixKFCTCKUhQXuCTtQ1MzrpL3WT8ZQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + } + }, + "@babel/plugin-proposal-optional-chaining": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.14.5.tgz", + "integrity": "sha512-ycz+VOzo2UbWNI1rQXxIuMOzrDdHGrI23fRiz/Si2R4kv2XZQ1BK8ccdHwehMKBlcH/joGW/tzrUmo67gbJHlQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.14.5", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + } + }, + "@babel/plugin-proposal-private-methods": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.14.5.tgz", + "integrity": "sha512-838DkdUA1u+QTCplatfq4B7+1lnDa/+QMI89x5WZHBcnNv+47N8QEj2k9I2MUU9xIv8XJ4XvPCviM/Dj7Uwt9g==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-proposal-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-62EyfyA3WA0mZiF2e2IV9mc9Ghwxcg8YTu8BS4Wss4Y3PY725OmS9M0qLORbJwLqFtGh+jiE4wAmocK2CTUK2Q==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.14.5", + "@babel/helper-create-class-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + } + }, + "@babel/plugin-proposal-unicode-property-regex": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.14.5.tgz", + "integrity": "sha512-6axIeOU5LnY471KenAB9vI8I5j7NQ2d652hIYwVyRfgaZT5UpiqFKCuVXCDMSrU+3VFafnu2c5m3lrWIlr6A5Q==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-typescript": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.14.5.tgz", + "integrity": "sha512-u6OXzDaIXjEstBRRoBCQ/uKQKlbuaeE5in0RvWdA4pN6AhqxTIwUsnHPU1CFZA/amYObMsuWhYfRl3Ch90HD0Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-arrow-functions": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.14.5.tgz", + "integrity": "sha512-KOnO0l4+tD5IfOdi4x8C1XmEIRWUjNRV8wc6K2vz/3e8yAOoZZvsRXRRIF/yo/MAOFb4QjtAw9xSxMXbSMRy8A==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-async-to-generator": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.14.5.tgz", + "integrity": "sha512-szkbzQ0mNk0rpu76fzDdqSyPu0MuvpXgC+6rz5rpMb5OIRxdmHfQxrktL8CYolL2d8luMCZTR0DpIMIdL27IjA==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-remap-async-to-generator": "^7.14.5" + } + }, + "@babel/plugin-transform-block-scoped-functions": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.14.5.tgz", + "integrity": "sha512-dtqWqdWZ5NqBX3KzsVCWfQI3A53Ft5pWFCT2eCVUftWZgjc5DpDponbIF1+c+7cSGk2wN0YK7HGL/ezfRbpKBQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-block-scoping": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.14.5.tgz", + "integrity": "sha512-LBYm4ZocNgoCqyxMLoOnwpsmQ18HWTQvql64t3GvMUzLQrNoV1BDG0lNftC8QKYERkZgCCT/7J5xWGObGAyHDw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-classes": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.14.5.tgz", + "integrity": "sha512-J4VxKAMykM06K/64z9rwiL6xnBHgB1+FVspqvlgCdwD1KUbQNfszeKVVOMh59w3sztHYIZDgnhOC4WbdEfHFDA==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.14.5", + "@babel/helper-function-name": "^7.14.5", + "@babel/helper-optimise-call-expression": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-replace-supers": "^7.14.5", + "@babel/helper-split-export-declaration": "^7.14.5", + "globals": "^11.1.0" + } + }, + "@babel/plugin-transform-computed-properties": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.14.5.tgz", + "integrity": "sha512-pWM+E4283UxaVzLb8UBXv4EIxMovU4zxT1OPnpHJcmnvyY9QbPPTKZfEj31EUvG3/EQRbYAGaYEUZ4yWOBC2xg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-destructuring": { + "version": "7.14.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.14.7.tgz", + "integrity": "sha512-0mDE99nK+kVh3xlc5vKwB6wnP9ecuSj+zQCa/n0voENtP/zymdT4HH6QEb65wjjcbqr1Jb/7z9Qp7TF5FtwYGw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-dotall-regex": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.14.5.tgz", + "integrity": "sha512-loGlnBdj02MDsFaHhAIJzh7euK89lBrGIdM9EAtHFo6xKygCUGuuWe07o1oZVk287amtW1n0808sQM99aZt3gw==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-duplicate-keys": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.14.5.tgz", + "integrity": "sha512-iJjbI53huKbPDAsJ8EmVmvCKeeq21bAze4fu9GBQtSLqfvzj2oRuHVx4ZkDwEhg1htQ+5OBZh/Ab0XDf5iBZ7A==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-exponentiation-operator": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.14.5.tgz", + "integrity": "sha512-jFazJhMBc9D27o9jDnIE5ZErI0R0m7PbKXVq77FFvqFbzvTMuv8jaAwLZ5PviOLSFttqKIW0/wxNSDbjLk0tYA==", + "dev": true, + "requires": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-for-of": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.14.5.tgz", + "integrity": "sha512-CfmqxSUZzBl0rSjpoQSFoR9UEj3HzbGuGNL21/iFTmjb5gFggJp3ph0xR1YBhexmLoKRHzgxuFvty2xdSt6gTA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-function-name": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.14.5.tgz", + "integrity": "sha512-vbO6kv0fIzZ1GpmGQuvbwwm+O4Cbm2NrPzwlup9+/3fdkuzo1YqOZcXw26+YUJB84Ja7j9yURWposEHLYwxUfQ==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-literals": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.14.5.tgz", + "integrity": "sha512-ql33+epql2F49bi8aHXxvLURHkxJbSmMKl9J5yHqg4PLtdE6Uc48CH1GS6TQvZ86eoB/ApZXwm7jlA+B3kra7A==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-member-expression-literals": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.14.5.tgz", + "integrity": "sha512-WkNXxH1VXVTKarWFqmso83xl+2V3Eo28YY5utIkbsmXoItO8Q3aZxN4BTS2k0hz9dGUloHK26mJMyQEYfkn/+Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-modules-amd": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.14.5.tgz", + "integrity": "sha512-3lpOU8Vxmp3roC4vzFpSdEpGUWSMsHFreTWOMMLzel2gNGfHE5UWIh/LN6ghHs2xurUp4jRFYMUIZhuFbody1g==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-commonjs": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.14.5.tgz", + "integrity": "sha512-en8GfBtgnydoao2PS+87mKyw62k02k7kJ9ltbKe0fXTHrQmG6QZZflYuGI1VVG7sVpx4E1n7KBpNlPb8m78J+A==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-simple-access": "^7.14.5", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-systemjs": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.14.5.tgz", + "integrity": "sha512-mNMQdvBEE5DcMQaL5LbzXFMANrQjd2W7FPzg34Y4yEz7dBgdaC+9B84dSO+/1Wba98zoDbInctCDo4JGxz1VYA==", + "dev": true, + "requires": { + "@babel/helper-hoist-variables": "^7.14.5", + "@babel/helper-module-transforms": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-validator-identifier": "^7.14.5", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-umd": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.14.5.tgz", + "integrity": "sha512-RfPGoagSngC06LsGUYyM9QWSXZ8MysEjDJTAea1lqRjNECE3y0qIJF/qbvJxc4oA4s99HumIMdXOrd+TdKaAAA==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.14.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.14.7.tgz", + "integrity": "sha512-DTNOTaS7TkW97xsDMrp7nycUVh6sn/eq22VaxWfEdzuEbRsiaOU0pqU7DlyUGHVsbQbSghvjKRpEl+nUCKGQSg==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.14.5" + } + }, + "@babel/plugin-transform-new-target": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.14.5.tgz", + "integrity": "sha512-Nx054zovz6IIRWEB49RDRuXGI4Gy0GMgqG0cII9L3MxqgXz/+rgII+RU58qpo4g7tNEx1jG7rRVH4ihZoP4esQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-object-super": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.14.5.tgz", + "integrity": "sha512-MKfOBWzK0pZIrav9z/hkRqIk/2bTv9qvxHzPQc12RcVkMOzpIKnFCNYJip00ssKWYkd8Sf5g0Wr7pqJ+cmtuFg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-replace-supers": "^7.14.5" + } + }, + "@babel/plugin-transform-parameters": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.14.5.tgz", + "integrity": "sha512-Tl7LWdr6HUxTmzQtzuU14SqbgrSKmaR77M0OKyq4njZLQTPfOvzblNKyNkGwOfEFCEx7KeYHQHDI0P3F02IVkA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-property-literals": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.14.5.tgz", + "integrity": "sha512-r1uilDthkgXW8Z1vJz2dKYLV1tuw2xsbrp3MrZmD99Wh9vsfKoob+JTgri5VUb/JqyKRXotlOtwgu4stIYCmnw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-regenerator": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.14.5.tgz", + "integrity": "sha512-NVIY1W3ITDP5xQl50NgTKlZ0GrotKtLna08/uGY6ErQt6VEQZXla86x/CTddm5gZdcr+5GSsvMeTmWA5Ii6pkg==", + "dev": true, + "requires": { + "regenerator-transform": "^0.14.2" + } + }, + "@babel/plugin-transform-reserved-words": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.14.5.tgz", + "integrity": "sha512-cv4F2rv1nD4qdexOGsRQXJrOcyb5CrgjUH9PKrrtyhSDBNWGxd0UIitjyJiWagS+EbUGjG++22mGH1Pub8D6Vg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-shorthand-properties": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.14.5.tgz", + "integrity": "sha512-xLucks6T1VmGsTB+GWK5Pl9Jl5+nRXD1uoFdA5TSO6xtiNjtXTjKkmPdFXVLGlK5A2/or/wQMKfmQ2Y0XJfn5g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-spread": { + "version": "7.14.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.14.6.tgz", + "integrity": "sha512-Zr0x0YroFJku7n7+/HH3A2eIrGMjbmAIbJSVv0IZ+t3U2WUQUA64S/oeied2e+MaGSjmt4alzBCsK9E8gh+fag==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.14.5" + } + }, + "@babel/plugin-transform-sticky-regex": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.14.5.tgz", + "integrity": "sha512-Z7F7GyvEMzIIbwnziAZmnSNpdijdr4dWt+FJNBnBLz5mwDFkqIXU9wmBcWWad3QeJF5hMTkRe4dAq2sUZiG+8A==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-template-literals": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.14.5.tgz", + "integrity": "sha512-22btZeURqiepOfuy/VkFr+zStqlujWaarpMErvay7goJS6BWwdd6BY9zQyDLDa4x2S3VugxFb162IZ4m/S/+Gg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-typeof-symbol": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.14.5.tgz", + "integrity": "sha512-lXzLD30ffCWseTbMQzrvDWqljvZlHkXU+CnseMhkMNqU1sASnCsz3tSzAaH3vCUXb9PHeUb90ZT1BdFTm1xxJw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-unicode-escapes": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.14.5.tgz", + "integrity": "sha512-crTo4jATEOjxj7bt9lbYXcBAM3LZaUrbP2uUdxb6WIorLmjNKSpHfIybgY4B8SRpbf8tEVIWH3Vtm7ayCrKocA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-unicode-regex": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.14.5.tgz", + "integrity": "sha512-UygduJpC5kHeCiRw/xDVzC+wj8VaYSoKl5JNVmbP7MadpNinAm3SvZCxZ42H37KZBKztz46YC73i9yV34d0Tzw==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/preset-env": { + "version": "7.14.7", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.14.7.tgz", + "integrity": "sha512-itOGqCKLsSUl0Y+1nSfhbuuOlTs0MJk2Iv7iSH+XT/mR8U1zRLO7NjWlYXB47yhK4J/7j+HYty/EhFZDYKa/VA==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.14.7", + "@babel/helper-compilation-targets": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-validator-option": "^7.14.5", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.14.5", + "@babel/plugin-proposal-async-generator-functions": "^7.14.7", + "@babel/plugin-proposal-class-properties": "^7.14.5", + "@babel/plugin-proposal-class-static-block": "^7.14.5", + "@babel/plugin-proposal-dynamic-import": "^7.14.5", + "@babel/plugin-proposal-export-namespace-from": "^7.14.5", + "@babel/plugin-proposal-json-strings": "^7.14.5", + "@babel/plugin-proposal-logical-assignment-operators": "^7.14.5", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.14.5", + "@babel/plugin-proposal-numeric-separator": "^7.14.5", + "@babel/plugin-proposal-object-rest-spread": "^7.14.7", + "@babel/plugin-proposal-optional-catch-binding": "^7.14.5", + "@babel/plugin-proposal-optional-chaining": "^7.14.5", + "@babel/plugin-proposal-private-methods": "^7.14.5", + "@babel/plugin-proposal-private-property-in-object": "^7.14.5", + "@babel/plugin-proposal-unicode-property-regex": "^7.14.5", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-transform-arrow-functions": "^7.14.5", + "@babel/plugin-transform-async-to-generator": "^7.14.5", + "@babel/plugin-transform-block-scoped-functions": "^7.14.5", + "@babel/plugin-transform-block-scoping": "^7.14.5", + "@babel/plugin-transform-classes": "^7.14.5", + "@babel/plugin-transform-computed-properties": "^7.14.5", + "@babel/plugin-transform-destructuring": "^7.14.7", + "@babel/plugin-transform-dotall-regex": "^7.14.5", + "@babel/plugin-transform-duplicate-keys": "^7.14.5", + "@babel/plugin-transform-exponentiation-operator": "^7.14.5", + "@babel/plugin-transform-for-of": "^7.14.5", + "@babel/plugin-transform-function-name": "^7.14.5", + "@babel/plugin-transform-literals": "^7.14.5", + "@babel/plugin-transform-member-expression-literals": "^7.14.5", + "@babel/plugin-transform-modules-amd": "^7.14.5", + "@babel/plugin-transform-modules-commonjs": "^7.14.5", + "@babel/plugin-transform-modules-systemjs": "^7.14.5", + "@babel/plugin-transform-modules-umd": "^7.14.5", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.14.7", + "@babel/plugin-transform-new-target": "^7.14.5", + "@babel/plugin-transform-object-super": "^7.14.5", + "@babel/plugin-transform-parameters": "^7.14.5", + "@babel/plugin-transform-property-literals": "^7.14.5", + "@babel/plugin-transform-regenerator": "^7.14.5", + "@babel/plugin-transform-reserved-words": "^7.14.5", + "@babel/plugin-transform-shorthand-properties": "^7.14.5", + "@babel/plugin-transform-spread": "^7.14.6", + "@babel/plugin-transform-sticky-regex": "^7.14.5", + "@babel/plugin-transform-template-literals": "^7.14.5", + "@babel/plugin-transform-typeof-symbol": "^7.14.5", + "@babel/plugin-transform-unicode-escapes": "^7.14.5", + "@babel/plugin-transform-unicode-regex": "^7.14.5", + "@babel/preset-modules": "^0.1.4", + "@babel/types": "^7.14.5", + "babel-plugin-polyfill-corejs2": "^0.2.2", + "babel-plugin-polyfill-corejs3": "^0.2.2", + "babel-plugin-polyfill-regenerator": "^0.2.2", + "core-js-compat": "^3.15.0", + "semver": "^6.3.0" + } + }, + "@babel/preset-modules": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.4.tgz", + "integrity": "sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", + "@babel/plugin-transform-dotall-regex": "^7.4.4", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + } + }, + "@babel/runtime": { + "version": "7.14.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.14.6.tgz", + "integrity": "sha512-/PCB2uJ7oM44tz8YhC4Z/6PeOKXp4K588f+5M3clr1M4zbqztlo0XEfJ2LEzj/FgwfgGcIdl8n7YYjTCI0BYwg==", + "dev": true, + "requires": { + "regenerator-runtime": "^0.13.4" + } + }, + "@babel/template": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.14.5.tgz", + "integrity": "sha512-6Z3Po85sfxRGachLULUhOmvAaOo7xCvqGQtxINai2mEGPFm6pQ4z5QInFnUrRpfoSV60BnjyF5F3c+15fxFV1g==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.14.5", + "@babel/parser": "^7.14.5", + "@babel/types": "^7.14.5" + } + }, + "@babel/traverse": { + "version": "7.14.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.14.7.tgz", + "integrity": "sha512-9vDr5NzHu27wgwejuKL7kIOm4bwEtaPQ4Z6cpCmjSuaRqpH/7xc4qcGEscwMqlkwgcXl6MvqoAjZkQ24uSdIZQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.14.5", + "@babel/generator": "^7.14.5", + "@babel/helper-function-name": "^7.14.5", + "@babel/helper-hoist-variables": "^7.14.5", + "@babel/helper-split-export-declaration": "^7.14.5", + "@babel/parser": "^7.14.7", + "@babel/types": "^7.14.5", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.5.tgz", + "integrity": "sha512-M/NzBpEL95I5Hh4dwhin5JlE7EzO5PHMAuzjxss3tiOBD46KfQvVedN/3jEPZvdRvtsK2222XfdHogNIttFgcg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.14.5", + "to-fast-properties": "^2.0.0" + } + }, + "@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true + }, + "@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "requires": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + } + }, + "@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true + }, + "@jest/console": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-27.0.6.tgz", + "integrity": "sha512-fMlIBocSHPZ3JxgWiDNW/KPj6s+YRd0hicb33IrmelCcjXo/pXPwvuiKFmZz+XuqI/1u7nbUK10zSsWL/1aegg==", + "dev": true, + "requires": { + "@jest/types": "^27.0.6", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^27.0.6", + "jest-util": "^27.0.6", + "slash": "^3.0.0" + } + }, + "@jest/core": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-27.0.6.tgz", + "integrity": "sha512-SsYBm3yhqOn5ZLJCtccaBcvD/ccTLCeuDv8U41WJH/V1MW5eKUkeMHT9U+Pw/v1m1AIWlnIW/eM2XzQr0rEmow==", + "dev": true, + "requires": { + "@jest/console": "^27.0.6", + "@jest/reporters": "^27.0.6", + "@jest/test-result": "^27.0.6", + "@jest/transform": "^27.0.6", + "@jest/types": "^27.0.6", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.8.1", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "jest-changed-files": "^27.0.6", + "jest-config": "^27.0.6", + "jest-haste-map": "^27.0.6", + "jest-message-util": "^27.0.6", + "jest-regex-util": "^27.0.6", + "jest-resolve": "^27.0.6", + "jest-resolve-dependencies": "^27.0.6", + "jest-runner": "^27.0.6", + "jest-runtime": "^27.0.6", + "jest-snapshot": "^27.0.6", + "jest-util": "^27.0.6", + "jest-validate": "^27.0.6", + "jest-watcher": "^27.0.6", + "micromatch": "^4.0.4", + "p-each-series": "^2.1.0", + "rimraf": "^3.0.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "@jest/environment": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-27.0.6.tgz", + "integrity": "sha512-4XywtdhwZwCpPJ/qfAkqExRsERW+UaoSRStSHCCiQTUpoYdLukj+YJbQSFrZjhlUDRZeNiU9SFH0u7iNimdiIg==", + "dev": true, + "requires": { + "@jest/fake-timers": "^27.0.6", + "@jest/types": "^27.0.6", + "@types/node": "*", + "jest-mock": "^27.0.6" + } + }, + "@jest/fake-timers": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.0.6.tgz", + "integrity": "sha512-sqd+xTWtZ94l3yWDKnRTdvTeZ+A/V7SSKrxsrOKSqdyddb9CeNRF8fbhAU0D7ZJBpTTW2nbp6MftmKJDZfW2LQ==", + "dev": true, + "requires": { + "@jest/types": "^27.0.6", + "@sinonjs/fake-timers": "^7.0.2", + "@types/node": "*", + "jest-message-util": "^27.0.6", + "jest-mock": "^27.0.6", + "jest-util": "^27.0.6" + } + }, + "@jest/globals": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-27.0.6.tgz", + "integrity": "sha512-DdTGCP606rh9bjkdQ7VvChV18iS7q0IMJVP1piwTWyWskol4iqcVwthZmoJEf7obE1nc34OpIyoVGPeqLC+ryw==", + "dev": true, + "requires": { + "@jest/environment": "^27.0.6", + "@jest/types": "^27.0.6", + "expect": "^27.0.6" + } + }, + "@jest/reporters": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-27.0.6.tgz", + "integrity": "sha512-TIkBt09Cb2gptji3yJXb3EE+eVltW6BjO7frO7NEfjI9vSIYoISi5R3aI3KpEDXlB1xwB+97NXIqz84qYeYsfA==", + "dev": true, + "requires": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^27.0.6", + "@jest/test-result": "^27.0.6", + "@jest/transform": "^27.0.6", + "@jest/types": "^27.0.6", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.2", + "graceful-fs": "^4.2.4", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^4.0.3", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.0.2", + "jest-haste-map": "^27.0.6", + "jest-resolve": "^27.0.6", + "jest-util": "^27.0.6", + "jest-worker": "^27.0.6", + "slash": "^3.0.0", + "source-map": "^0.6.0", + "string-length": "^4.0.1", + "terminal-link": "^2.0.0", + "v8-to-istanbul": "^8.0.0" + } + }, + "@jest/source-map": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-27.0.6.tgz", + "integrity": "sha512-Fek4mi5KQrqmlY07T23JRi0e7Z9bXTOOD86V/uS0EIW4PClvPDqZOyFlLpNJheS6QI0FNX1CgmPjtJ4EA/2M+g==", + "dev": true, + "requires": { + "callsites": "^3.0.0", + "graceful-fs": "^4.2.4", + "source-map": "^0.6.0" + } + }, + "@jest/test-result": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-27.0.6.tgz", + "integrity": "sha512-ja/pBOMTufjX4JLEauLxE3LQBPaI2YjGFtXexRAjt1I/MbfNlMx0sytSX3tn5hSLzQsR3Qy2rd0hc1BWojtj9w==", + "dev": true, + "requires": { + "@jest/console": "^27.0.6", + "@jest/types": "^27.0.6", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + } + }, + "@jest/test-sequencer": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.0.6.tgz", + "integrity": "sha512-bISzNIApazYOlTHDum9PwW22NOyDa6VI31n6JucpjTVM0jD6JDgqEZ9+yn575nDdPF0+4csYDxNNW13NvFQGZA==", + "dev": true, + "requires": { + "@jest/test-result": "^27.0.6", + "graceful-fs": "^4.2.4", + "jest-haste-map": "^27.0.6", + "jest-runtime": "^27.0.6" + } + }, + "@jest/transform": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-27.0.6.tgz", + "integrity": "sha512-rj5Dw+mtIcntAUnMlW/Vju5mr73u8yg+irnHwzgtgoeI6cCPOvUwQ0D1uQtc/APmWgvRweEb1g05pkUpxH3iCA==", + "dev": true, + "requires": { + "@babel/core": "^7.1.0", + "@jest/types": "^27.0.6", + "babel-plugin-istanbul": "^6.0.0", + "chalk": "^4.0.0", + "convert-source-map": "^1.4.0", + "fast-json-stable-stringify": "^2.0.0", + "graceful-fs": "^4.2.4", + "jest-haste-map": "^27.0.6", + "jest-regex-util": "^27.0.6", + "jest-util": "^27.0.6", + "micromatch": "^4.0.4", + "pirates": "^4.0.1", + "slash": "^3.0.0", + "source-map": "^0.6.1", + "write-file-atomic": "^3.0.0" + } + }, + "@jest/types": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.0.6.tgz", + "integrity": "sha512-aSquT1qa9Pik26JK5/3rvnYb4bGtm1VFNesHKmNTwmPIgOrixvhL2ghIvFRNEpzy3gU+rUgjIF/KodbkFAl++g==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + } + }, + "@sinonjs/commons": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", + "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", + "dev": true, + "requires": { + "type-detect": "4.0.8" + } + }, + "@sinonjs/fake-timers": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-7.1.2.tgz", + "integrity": "sha512-iQADsW4LBMISqZ6Ci1dupJL9pprqwcVFTcOsEmQOEhW+KLCVn/Y4Jrvg2k19fIHCp+iFprriYPTdRcQR8NbUPg==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.7.0" + } + }, + "@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "dev": true + }, + "@tsconfig/node10": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.8.tgz", + "integrity": "sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg==", + "dev": true + }, + "@tsconfig/node12": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.9.tgz", + "integrity": "sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw==", + "dev": true + }, + "@tsconfig/node14": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.1.tgz", + "integrity": "sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg==", + "dev": true + }, + "@tsconfig/node16": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.1.tgz", + "integrity": "sha512-FTgBI767POY/lKNDNbIzgAX6miIDBs6NTCbdlDb8TrWovHsSvaVIZDlTqym29C6UqhzwcJx4CYr+AlrMywA0cA==", + "dev": true + }, + "@types/babel__core": { + "version": "7.1.15", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.15.tgz", + "integrity": "sha512-bxlMKPDbY8x5h6HBwVzEOk2C8fb6SLfYQ5Jw3uBYuYF1lfWk/kbLd81la82vrIkBb0l+JdmrZaDikPrNxpS/Ew==", + "dev": true, + "requires": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "@types/babel__generator": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.3.tgz", + "integrity": "sha512-/GWCmzJWqV7diQW54smJZzWbSFf4QYtF71WCKhcx6Ru/tFyQIY2eiiITcCAeuPbNSvT9YCGkVMqqvSk2Z0mXiA==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@types/babel__template": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", + "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", + "dev": true, + "requires": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@types/babel__traverse": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.14.2.tgz", + "integrity": "sha512-K2waXdXBi2302XUdcHcR1jCeU0LL4TD9HRs/gk0N2Xvrht+G/BfJa4QObBQZfhMdxiCpV3COl5Nfq4uKTeTnJA==", + "dev": true, + "requires": { + "@babel/types": "^7.3.0" + } + }, + "@types/graceful-fs": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz", + "integrity": "sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/istanbul-lib-coverage": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", + "integrity": "sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw==", + "dev": true + }, + "@types/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "*" + } + }, + "@types/istanbul-reports": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", + "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", + "dev": true, + "requires": { + "@types/istanbul-lib-report": "*" + } + }, + "@types/jest": { + "version": "26.0.24", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-26.0.24.tgz", + "integrity": "sha512-E/X5Vib8BWqZNRlDxj9vYXhsDwPYbPINqKF9BsnSoon4RQ0D9moEuLD8txgyypFLH7J4+Lho9Nr/c8H0Fi+17w==", + "dev": true, + "requires": { + "jest-diff": "^26.0.0", + "pretty-format": "^26.0.0" + }, + "dependencies": { + "@jest/types": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + } + }, + "@types/yargs": { + "version": "15.0.14", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.14.tgz", + "integrity": "sha512-yEJzHoxf6SyQGhBhIYGXQDSCkJjB6HohDShto7m8vaKg9Yp0Yn8+71J9eakh2bnPg6BfsH9PRMhiRTZnd4eXGQ==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "diff-sequences": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.6.2.tgz", + "integrity": "sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q==", + "dev": true + }, + "jest-diff": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-26.6.2.tgz", + "integrity": "sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA==", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "diff-sequences": "^26.6.2", + "jest-get-type": "^26.3.0", + "pretty-format": "^26.6.2" + } + }, + "jest-get-type": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz", + "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==", + "dev": true + }, + "pretty-format": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", + "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^17.0.1" + } + } + } + }, + "@types/node": { + "version": "16.3.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.3.1.tgz", + "integrity": "sha512-N87VuQi7HEeRJkhzovao/JviiqKjDKMVKxKMfUvSKw+MbkbW8R0nA3fi/MQhhlxV2fQ+2ReM+/Nt4efdrJx3zA==", + "dev": true + }, + "@types/prettier": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.3.2.tgz", + "integrity": "sha512-eI5Yrz3Qv4KPUa/nSIAi0h+qX0XyewOliug5F2QAtuRg6Kjg6jfmxe1GIwoIRhZspD1A0RP8ANrPwvEXXtRFog==", + "dev": true + }, + "@types/stack-utils": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", + "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", + "dev": true + }, + "@types/yargs": { + "version": "16.0.4", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.4.tgz", + "integrity": "sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "@types/yargs-parser": { + "version": "20.2.1", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-20.2.1.tgz", + "integrity": "sha512-7tFImggNeNBVMsn0vLrpn1H1uPrUBdnARPTpZoitY37ZrdJREzf7I16tMrlK3hen349gr1NYh8CmZQa7CTG6Aw==", + "dev": true + }, + "abab": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", + "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==", + "dev": true + }, + "acorn": { + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.4.1.tgz", + "integrity": "sha512-asabaBSkEKosYKMITunzX177CXxQ4Q8BSSzMTKD+FefUhipQC70gfW5SiUDhYQ3vk8G+81HqQk7Fv9OXwwn9KA==", + "dev": true + }, + "acorn-globals": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", + "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", + "dev": true, + "requires": { + "acorn": "^7.1.1", + "acorn-walk": "^7.1.1" + }, + "dependencies": { + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true + } + } + }, + "acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "dev": true + }, + "agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "requires": { + "debug": "4" + } + }, + "ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "requires": { + "type-fest": "^0.21.3" + } + }, + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true + }, + "babel-jest": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.0.6.tgz", + "integrity": "sha512-iTJyYLNc4wRofASmofpOc5NK9QunwMk+TLFgGXsTFS8uEqmd8wdI7sga0FPe2oVH3b5Agt/EAK1QjPEuKL8VfA==", + "dev": true, + "requires": { + "@jest/transform": "^27.0.6", + "@jest/types": "^27.0.6", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.0.0", + "babel-preset-jest": "^27.0.6", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "slash": "^3.0.0" + } + }, + "babel-plugin-dynamic-import-node": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", + "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", + "dev": true, + "requires": { + "object.assign": "^4.1.0" + } + }, + "babel-plugin-istanbul": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz", + "integrity": "sha512-AF55rZXpe7trmEylbaE1Gv54wn6rwU03aptvRoVIGP8YykoSxqdVLV1TfwflBCE/QtHmqtP8SWlTENqbK8GCSQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^4.0.0", + "test-exclude": "^6.0.0" + } + }, + "babel-plugin-jest-hoist": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.0.6.tgz", + "integrity": "sha512-CewFeM9Vv2gM7Yr9n5eyyLVPRSiBnk6lKZRjgwYnGKSl9M14TMn2vkN02wTF04OGuSDLEzlWiMzvjXuW9mB6Gw==", + "dev": true, + "requires": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.0.0", + "@types/babel__traverse": "^7.0.6" + } + }, + "babel-plugin-polyfill-corejs2": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.2.2.tgz", + "integrity": "sha512-kISrENsJ0z5dNPq5eRvcctITNHYXWOA4DUZRFYCz3jYCcvTb/A546LIddmoGNMVYg2U38OyFeNosQwI9ENTqIQ==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.13.11", + "@babel/helper-define-polyfill-provider": "^0.2.2", + "semver": "^6.1.1" + } + }, + "babel-plugin-polyfill-corejs3": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.3.tgz", + "integrity": "sha512-rCOFzEIJpJEAU14XCcV/erIf/wZQMmMT5l5vXOpL5uoznyOGfDIjPj6FVytMvtzaKSTSVKouOCTPJ5OMUZH30g==", + "dev": true, + "requires": { + "@babel/helper-define-polyfill-provider": "^0.2.2", + "core-js-compat": "^3.14.0" + } + }, + "babel-plugin-polyfill-regenerator": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.2.2.tgz", + "integrity": "sha512-Goy5ghsc21HgPDFtzRkSirpZVW35meGoTmTOb2bxqdl60ghub4xOidgNTHaZfQ2FaxQsKmwvXtOAkcIS4SMBWg==", + "dev": true, + "requires": { + "@babel/helper-define-polyfill-provider": "^0.2.2" + } + }, + "babel-preset-current-node-syntax": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", + "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", + "dev": true, + "requires": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.8.3", + "@babel/plugin-syntax-import-meta": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-top-level-await": "^7.8.3" + } + }, + "babel-preset-jest": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-27.0.6.tgz", + "integrity": "sha512-WObA0/Biw2LrVVwZkF/2GqbOdzhKD6Fkdwhoy9ASIrOWr/zodcSpQh72JOkEn6NWyjmnPDjNSqaGN4KnpKzhXw==", + "dev": true, + "requires": { + "babel-plugin-jest-hoist": "^27.0.6", + "babel-preset-current-node-syntax": "^1.0.0" + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "browser-process-hrtime": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", + "dev": true + }, + "browserslist": { + "version": "4.16.6", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.6.tgz", + "integrity": "sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001219", + "colorette": "^1.2.2", + "electron-to-chromium": "^1.3.723", + "escalade": "^3.1.1", + "node-releases": "^1.1.71" + } + }, + "bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "requires": { + "node-int64": "^0.4.0" + } + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "dev": true + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "caniuse-lite": { + "version": "1.0.30001244", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001244.tgz", + "integrity": "sha512-Wb4UFZPkPoJoKKVfELPWytRzpemjP/s0pe22NriANru1NoI+5bGNxzKtk7edYL8rmCWTfQO8eRiF0pn1Dqzx7Q==", + "dev": true + }, + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true + }, + "ci-info": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.2.0.tgz", + "integrity": "sha512-dVqRX7fLUm8J6FgHJ418XuIgDLZDkYcDFTeL6TA2gt5WlIZUQrrH6EZrNClwT/H0FateUsZkGIOPRrLbP+PR9A==", + "dev": true + }, + "cjs-module-lexer": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.1.tgz", + "integrity": "sha512-jVamGdJPDeuQilKhvVn1h3knuMOZzr8QDnpk+M9aMlCaMkTDd6fBWPhiDqFvFZ07pL0liqabAiuy8SY4jGHeaw==", + "dev": true + }, + "cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "dev": true + }, + "collect-v8-coverage": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", + "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", + "dev": true + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "colorette": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", + "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==", + "dev": true + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "convert-source-map": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", + "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "core-js-compat": { + "version": "3.15.2", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.15.2.tgz", + "integrity": "sha512-Wp+BJVvwopjI+A1EFqm2dwUmWYXrvucmtIB2LgXn/Rb+gWPKYxtmb4GKHGKG/KGF1eK9jfjzT38DITbTOCX/SQ==", + "dev": true, + "requires": { + "browserslist": "^4.16.6", + "semver": "7.0.0" + }, + "dependencies": { + "semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", + "dev": true + } + } + }, + "create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "cssom": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", + "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", + "dev": true + }, + "cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "dev": true, + "requires": { + "cssom": "~0.3.6" + }, + "dependencies": { + "cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "dev": true + } + } + }, + "data-urls": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", + "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", + "dev": true, + "requires": { + "abab": "^2.0.3", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.0.0" + } + }, + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "decimal.js": { + "version": "10.3.1", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.3.1.tgz", + "integrity": "sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ==", + "dev": true + }, + "dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=", + "dev": true + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "deepmerge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", + "dev": true + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true + }, + "detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true + }, + "diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true + }, + "diff-sequences": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.0.6.tgz", + "integrity": "sha512-ag6wfpBFyNXZ0p8pcuIDS//D8H062ZQJ3fzYxjpmeKjnz8W4pekL3AI8VohmyZmsWW2PWaHgjsmqR6L13101VQ==", + "dev": true + }, + "domexception": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", + "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", + "dev": true, + "requires": { + "webidl-conversions": "^5.0.0" + }, + "dependencies": { + "webidl-conversions": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", + "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", + "dev": true + } + } + }, + "electron-to-chromium": { + "version": "1.3.774", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.774.tgz", + "integrity": "sha512-Fggh17Q1yyv1uMzq8Qn1Ci58P50qcRXMXd2MBcB9sxo6rJxjUutWcNw8uCm3gFWMdcblBO6mDT5HzX/RVRRECA==", + "dev": true + }, + "emittery": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.8.1.tgz", + "integrity": "sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==", + "dev": true + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "escodegen": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", + "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", + "dev": true, + "requires": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + } + }, + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", + "dev": true + }, + "expect": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/expect/-/expect-27.0.6.tgz", + "integrity": "sha512-psNLt8j2kwg42jGBDSfAlU49CEZxejN1f1PlANWDZqIhBOVU/c2Pm888FcjWJzFewhIsNWfZJeLjUjtKGiPuSw==", + "dev": true, + "requires": { + "@jest/types": "^27.0.6", + "ansi-styles": "^5.0.0", + "jest-get-type": "^27.0.6", + "jest-matcher-utils": "^27.0.6", + "jest-message-util": "^27.0.6", + "jest-regex-util": "^27.0.6" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true + } + } + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "fb-watchman": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", + "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==", + "dev": true, + "requires": { + "bser": "2.1.1" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "form-data": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, + "get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true + }, + "get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true + }, + "glob": { + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + }, + "graceful-fs": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", + "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", + "dev": true + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", + "dev": true + }, + "html-encoding-sniffer": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", + "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", + "dev": true, + "requires": { + "whatwg-encoding": "^1.0.5" + } + }, + "html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "dev": true, + "requires": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + } + }, + "https-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", + "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "dev": true, + "requires": { + "agent-base": "6", + "debug": "4" + } + }, + "human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "import-local": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.2.tgz", + "integrity": "sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA==", + "dev": true, + "requires": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "is-ci": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.0.tgz", + "integrity": "sha512-kDXyttuLeslKAHYL/K28F2YkM3x5jvFPEw3yXbRptXydjD9rpLEz+C5K5iutY9ZiUu6AP41JdvRQwF4Iqs4ZCQ==", + "dev": true, + "requires": { + "ci-info": "^3.1.1" + } + }, + "is-core-module": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.5.0.tgz", + "integrity": "sha512-TXCMSDsEHMEEZ6eCA8rwRDbLu55MRGmrctljsBX/2v1d9/GzqHOxW5c5oPSgrUt2vBFXebu9rGqckXGPWOlYpg==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", + "dev": true + }, + "is-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", + "dev": true + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "istanbul-lib-coverage": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", + "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==", + "dev": true + }, + "istanbul-lib-instrument": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", + "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", + "dev": true, + "requires": { + "@babel/core": "^7.7.5", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.0.0", + "semver": "^6.3.0" + } + }, + "istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + } + }, + "istanbul-lib-source-maps": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz", + "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + } + }, + "istanbul-reports": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz", + "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==", + "dev": true, + "requires": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + } + }, + "jest": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest/-/jest-27.0.6.tgz", + "integrity": "sha512-EjV8aETrsD0wHl7CKMibKwQNQc3gIRBXlTikBmmHUeVMKaPFxdcUIBfoDqTSXDoGJIivAYGqCWVlzCSaVjPQsA==", + "dev": true, + "requires": { + "@jest/core": "^27.0.6", + "import-local": "^3.0.2", + "jest-cli": "^27.0.6" + }, + "dependencies": { + "jest-cli": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-27.0.6.tgz", + "integrity": "sha512-qUUVlGb9fdKir3RDE+B10ULI+LQrz+MCflEH2UJyoUjoHHCbxDrMxSzjQAPUMsic4SncI62ofYCcAvW6+6rhhg==", + "dev": true, + "requires": { + "@jest/core": "^27.0.6", + "@jest/test-result": "^27.0.6", + "@jest/types": "^27.0.6", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "import-local": "^3.0.2", + "jest-config": "^27.0.6", + "jest-util": "^27.0.6", + "jest-validate": "^27.0.6", + "prompts": "^2.0.1", + "yargs": "^16.0.3" + } + } + } + }, + "jest-changed-files": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-27.0.6.tgz", + "integrity": "sha512-BuL/ZDauaq5dumYh5y20sn4IISnf1P9A0TDswTxUi84ORGtVa86ApuBHqICL0vepqAnZiY6a7xeSPWv2/yy4eA==", + "dev": true, + "requires": { + "@jest/types": "^27.0.6", + "execa": "^5.0.0", + "throat": "^6.0.1" + } + }, + "jest-circus": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-27.0.6.tgz", + "integrity": "sha512-OJlsz6BBeX9qR+7O9lXefWoc2m9ZqcZ5Ohlzz0pTEAG4xMiZUJoacY8f4YDHxgk0oKYxj277AfOk9w6hZYvi1Q==", + "dev": true, + "requires": { + "@jest/environment": "^27.0.6", + "@jest/test-result": "^27.0.6", + "@jest/types": "^27.0.6", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^0.7.0", + "expect": "^27.0.6", + "is-generator-fn": "^2.0.0", + "jest-each": "^27.0.6", + "jest-matcher-utils": "^27.0.6", + "jest-message-util": "^27.0.6", + "jest-runtime": "^27.0.6", + "jest-snapshot": "^27.0.6", + "jest-util": "^27.0.6", + "pretty-format": "^27.0.6", + "slash": "^3.0.0", + "stack-utils": "^2.0.3", + "throat": "^6.0.1" + } + }, + "jest-config": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-27.0.6.tgz", + "integrity": "sha512-JZRR3I1Plr2YxPBhgqRspDE2S5zprbga3swYNrvY3HfQGu7p/GjyLOqwrYad97tX3U3mzT53TPHVmozacfP/3w==", + "dev": true, + "requires": { + "@babel/core": "^7.1.0", + "@jest/test-sequencer": "^27.0.6", + "@jest/types": "^27.0.6", + "babel-jest": "^27.0.6", + "chalk": "^4.0.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.1", + "graceful-fs": "^4.2.4", + "is-ci": "^3.0.0", + "jest-circus": "^27.0.6", + "jest-environment-jsdom": "^27.0.6", + "jest-environment-node": "^27.0.6", + "jest-get-type": "^27.0.6", + "jest-jasmine2": "^27.0.6", + "jest-regex-util": "^27.0.6", + "jest-resolve": "^27.0.6", + "jest-runner": "^27.0.6", + "jest-util": "^27.0.6", + "jest-validate": "^27.0.6", + "micromatch": "^4.0.4", + "pretty-format": "^27.0.6" + } + }, + "jest-diff": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.0.6.tgz", + "integrity": "sha512-Z1mqgkTCSYaFgwTlP/NUiRzdqgxmmhzHY1Tq17zL94morOHfHu3K4bgSgl+CR4GLhpV8VxkuOYuIWnQ9LnFqmg==", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "diff-sequences": "^27.0.6", + "jest-get-type": "^27.0.6", + "pretty-format": "^27.0.6" + } + }, + "jest-docblock": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-27.0.6.tgz", + "integrity": "sha512-Fid6dPcjwepTFraz0YxIMCi7dejjJ/KL9FBjPYhBp4Sv1Y9PdhImlKZqYU555BlN4TQKaTc+F2Av1z+anVyGkA==", + "dev": true, + "requires": { + "detect-newline": "^3.0.0" + } + }, + "jest-each": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-27.0.6.tgz", + "integrity": "sha512-m6yKcV3bkSWrUIjxkE9OC0mhBZZdhovIW5ergBYirqnkLXkyEn3oUUF/QZgyecA1cF1QFyTE8bRRl8Tfg1pfLA==", + "dev": true, + "requires": { + "@jest/types": "^27.0.6", + "chalk": "^4.0.0", + "jest-get-type": "^27.0.6", + "jest-util": "^27.0.6", + "pretty-format": "^27.0.6" + } + }, + "jest-environment-jsdom": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-27.0.6.tgz", + "integrity": "sha512-FvetXg7lnXL9+78H+xUAsra3IeZRTiegA3An01cWeXBspKXUhAwMM9ycIJ4yBaR0L7HkoMPaZsozCLHh4T8fuw==", + "dev": true, + "requires": { + "@jest/environment": "^27.0.6", + "@jest/fake-timers": "^27.0.6", + "@jest/types": "^27.0.6", + "@types/node": "*", + "jest-mock": "^27.0.6", + "jest-util": "^27.0.6", + "jsdom": "^16.6.0" + } + }, + "jest-environment-node": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.0.6.tgz", + "integrity": "sha512-+Vi6yLrPg/qC81jfXx3IBlVnDTI6kmRr08iVa2hFCWmJt4zha0XW7ucQltCAPhSR0FEKEoJ3i+W4E6T0s9is0w==", + "dev": true, + "requires": { + "@jest/environment": "^27.0.6", + "@jest/fake-timers": "^27.0.6", + "@jest/types": "^27.0.6", + "@types/node": "*", + "jest-mock": "^27.0.6", + "jest-util": "^27.0.6" + } + }, + "jest-get-type": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.0.6.tgz", + "integrity": "sha512-XTkK5exIeUbbveehcSR8w0bhH+c0yloW/Wpl+9vZrjzztCPWrxhHwkIFpZzCt71oRBsgxmuUfxEqOYoZI2macg==", + "dev": true + }, + "jest-haste-map": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.0.6.tgz", + "integrity": "sha512-4ldjPXX9h8doB2JlRzg9oAZ2p6/GpQUNAeiYXqcpmrKbP0Qev0wdZlxSMOmz8mPOEnt4h6qIzXFLDi8RScX/1w==", + "dev": true, + "requires": { + "@jest/types": "^27.0.6", + "@types/graceful-fs": "^4.1.2", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "fsevents": "^2.3.2", + "graceful-fs": "^4.2.4", + "jest-regex-util": "^27.0.6", + "jest-serializer": "^27.0.6", + "jest-util": "^27.0.6", + "jest-worker": "^27.0.6", + "micromatch": "^4.0.4", + "walker": "^1.0.7" + } + }, + "jest-jasmine2": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.0.6.tgz", + "integrity": "sha512-cjpH2sBy+t6dvCeKBsHpW41mjHzXgsavaFMp+VWRf0eR4EW8xASk1acqmljFtK2DgyIECMv2yCdY41r2l1+4iA==", + "dev": true, + "requires": { + "@babel/traverse": "^7.1.0", + "@jest/environment": "^27.0.6", + "@jest/source-map": "^27.0.6", + "@jest/test-result": "^27.0.6", + "@jest/types": "^27.0.6", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "expect": "^27.0.6", + "is-generator-fn": "^2.0.0", + "jest-each": "^27.0.6", + "jest-matcher-utils": "^27.0.6", + "jest-message-util": "^27.0.6", + "jest-runtime": "^27.0.6", + "jest-snapshot": "^27.0.6", + "jest-util": "^27.0.6", + "pretty-format": "^27.0.6", + "throat": "^6.0.1" + } + }, + "jest-leak-detector": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-27.0.6.tgz", + "integrity": "sha512-2/d6n2wlH5zEcdctX4zdbgX8oM61tb67PQt4Xh8JFAIy6LRKUnX528HulkaG6nD5qDl5vRV1NXejCe1XRCH5gQ==", + "dev": true, + "requires": { + "jest-get-type": "^27.0.6", + "pretty-format": "^27.0.6" + } + }, + "jest-matcher-utils": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.0.6.tgz", + "integrity": "sha512-OFgF2VCQx9vdPSYTHWJ9MzFCehs20TsyFi6bIHbk5V1u52zJOnvF0Y/65z3GLZHKRuTgVPY4Z6LVePNahaQ+tA==", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "jest-diff": "^27.0.6", + "jest-get-type": "^27.0.6", + "pretty-format": "^27.0.6" + } + }, + "jest-message-util": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.0.6.tgz", + "integrity": "sha512-rBxIs2XK7rGy+zGxgi+UJKP6WqQ+KrBbD1YMj517HYN3v2BG66t3Xan3FWqYHKZwjdB700KiAJ+iES9a0M+ixw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^27.0.6", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "micromatch": "^4.0.4", + "pretty-format": "^27.0.6", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + } + }, + "jest-mock": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.0.6.tgz", + "integrity": "sha512-lzBETUoK8cSxts2NYXSBWT+EJNzmUVtVVwS1sU9GwE1DLCfGsngg+ZVSIe0yd0ZSm+y791esiuo+WSwpXJQ5Bw==", + "dev": true, + "requires": { + "@jest/types": "^27.0.6", + "@types/node": "*" + } + }, + "jest-pnp-resolver": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", + "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==", + "dev": true, + "requires": {} + }, + "jest-regex-util": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.0.6.tgz", + "integrity": "sha512-SUhPzBsGa1IKm8hx2F4NfTGGp+r7BXJ4CulsZ1k2kI+mGLG+lxGrs76veN2LF/aUdGosJBzKgXmNCw+BzFqBDQ==", + "dev": true + }, + "jest-resolve": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.0.6.tgz", + "integrity": "sha512-yKmIgw2LgTh7uAJtzv8UFHGF7Dm7XfvOe/LQ3Txv101fLM8cx2h1QVwtSJ51Q/SCxpIiKfVn6G2jYYMDNHZteA==", + "dev": true, + "requires": { + "@jest/types": "^27.0.6", + "chalk": "^4.0.0", + "escalade": "^3.1.1", + "graceful-fs": "^4.2.4", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^27.0.6", + "jest-validate": "^27.0.6", + "resolve": "^1.20.0", + "slash": "^3.0.0" + } + }, + "jest-resolve-dependencies": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.0.6.tgz", + "integrity": "sha512-mg9x9DS3BPAREWKCAoyg3QucCr0n6S8HEEsqRCKSPjPcu9HzRILzhdzY3imsLoZWeosEbJZz6TKasveczzpJZA==", + "dev": true, + "requires": { + "@jest/types": "^27.0.6", + "jest-regex-util": "^27.0.6", + "jest-snapshot": "^27.0.6" + } + }, + "jest-runner": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-27.0.6.tgz", + "integrity": "sha512-W3Bz5qAgaSChuivLn+nKOgjqNxM7O/9JOJoKDCqThPIg2sH/d4A/lzyiaFgnb9V1/w29Le11NpzTJSzga1vyYQ==", + "dev": true, + "requires": { + "@jest/console": "^27.0.6", + "@jest/environment": "^27.0.6", + "@jest/test-result": "^27.0.6", + "@jest/transform": "^27.0.6", + "@jest/types": "^27.0.6", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.8.1", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "jest-docblock": "^27.0.6", + "jest-environment-jsdom": "^27.0.6", + "jest-environment-node": "^27.0.6", + "jest-haste-map": "^27.0.6", + "jest-leak-detector": "^27.0.6", + "jest-message-util": "^27.0.6", + "jest-resolve": "^27.0.6", + "jest-runtime": "^27.0.6", + "jest-util": "^27.0.6", + "jest-worker": "^27.0.6", + "source-map-support": "^0.5.6", + "throat": "^6.0.1" + } + }, + "jest-runtime": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.0.6.tgz", + "integrity": "sha512-BhvHLRVfKibYyqqEFkybsznKwhrsu7AWx2F3y9G9L95VSIN3/ZZ9vBpm/XCS2bS+BWz3sSeNGLzI3TVQ0uL85Q==", + "dev": true, + "requires": { + "@jest/console": "^27.0.6", + "@jest/environment": "^27.0.6", + "@jest/fake-timers": "^27.0.6", + "@jest/globals": "^27.0.6", + "@jest/source-map": "^27.0.6", + "@jest/test-result": "^27.0.6", + "@jest/transform": "^27.0.6", + "@jest/types": "^27.0.6", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.4", + "jest-haste-map": "^27.0.6", + "jest-message-util": "^27.0.6", + "jest-mock": "^27.0.6", + "jest-regex-util": "^27.0.6", + "jest-resolve": "^27.0.6", + "jest-snapshot": "^27.0.6", + "jest-util": "^27.0.6", + "jest-validate": "^27.0.6", + "slash": "^3.0.0", + "strip-bom": "^4.0.0", + "yargs": "^16.0.3" + } + }, + "jest-serializer": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-27.0.6.tgz", + "integrity": "sha512-PtGdVK9EGC7dsaziskfqaAPib6wTViY3G8E5wz9tLVPhHyiDNTZn/xjZ4khAw+09QkoOVpn7vF5nPSN6dtBexA==", + "dev": true, + "requires": { + "@types/node": "*", + "graceful-fs": "^4.2.4" + } + }, + "jest-snapshot": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.0.6.tgz", + "integrity": "sha512-NTHaz8He+ATUagUgE7C/UtFcRoHqR2Gc+KDfhQIyx+VFgwbeEMjeP+ILpUTLosZn/ZtbNdCF5LkVnN/l+V751A==", + "dev": true, + "requires": { + "@babel/core": "^7.7.2", + "@babel/generator": "^7.7.2", + "@babel/parser": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/traverse": "^7.7.2", + "@babel/types": "^7.0.0", + "@jest/transform": "^27.0.6", + "@jest/types": "^27.0.6", + "@types/babel__traverse": "^7.0.4", + "@types/prettier": "^2.1.5", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^27.0.6", + "graceful-fs": "^4.2.4", + "jest-diff": "^27.0.6", + "jest-get-type": "^27.0.6", + "jest-haste-map": "^27.0.6", + "jest-matcher-utils": "^27.0.6", + "jest-message-util": "^27.0.6", + "jest-resolve": "^27.0.6", + "jest-util": "^27.0.6", + "natural-compare": "^1.4.0", + "pretty-format": "^27.0.6", + "semver": "^7.3.2" + }, + "dependencies": { + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "jest-util": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.0.6.tgz", + "integrity": "sha512-1JjlaIh+C65H/F7D11GNkGDDZtDfMEM8EBXsvd+l/cxtgQ6QhxuloOaiayt89DxUvDarbVhqI98HhgrM1yliFQ==", + "dev": true, + "requires": { + "@jest/types": "^27.0.6", + "@types/node": "*", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "is-ci": "^3.0.0", + "picomatch": "^2.2.3" + } + }, + "jest-validate": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-27.0.6.tgz", + "integrity": "sha512-yhZZOaMH3Zg6DC83n60pLmdU1DQE46DW+KLozPiPbSbPhlXXaiUTDlhHQhHFpaqIFRrInko1FHXjTRpjWRuWfA==", + "dev": true, + "requires": { + "@jest/types": "^27.0.6", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^27.0.6", + "leven": "^3.1.0", + "pretty-format": "^27.0.6" + }, + "dependencies": { + "camelcase": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", + "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", + "dev": true + } + } + }, + "jest-watcher": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-27.0.6.tgz", + "integrity": "sha512-/jIoKBhAP00/iMGnTwUBLgvxkn7vsOweDrOTSPzc7X9uOyUtJIDthQBTI1EXz90bdkrxorUZVhJwiB69gcHtYQ==", + "dev": true, + "requires": { + "@jest/test-result": "^27.0.6", + "@jest/types": "^27.0.6", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "jest-util": "^27.0.6", + "string-length": "^4.0.1" + } + }, + "jest-worker": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.0.6.tgz", + "integrity": "sha512-qupxcj/dRuA3xHPMUd40gr2EaAurFbkwzOh7wfPaeE9id7hyjURRQoqNfHifHK3XjJU6YJJUQKILGUnwGPEOCA==", + "dev": true, + "requires": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "dependencies": { + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "jsdom": { + "version": "16.6.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.6.0.tgz", + "integrity": "sha512-Ty1vmF4NHJkolaEmdjtxTfSfkdb8Ywarwf63f+F8/mDD1uLSSWDxDuMiZxiPhwunLrn9LOSVItWj4bLYsLN3Dg==", + "dev": true, + "requires": { + "abab": "^2.0.5", + "acorn": "^8.2.4", + "acorn-globals": "^6.0.0", + "cssom": "^0.4.4", + "cssstyle": "^2.3.0", + "data-urls": "^2.0.0", + "decimal.js": "^10.2.1", + "domexception": "^2.0.1", + "escodegen": "^2.0.0", + "form-data": "^3.0.0", + "html-encoding-sniffer": "^2.0.1", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.0", + "parse5": "6.0.1", + "saxes": "^5.0.1", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.0.0", + "w3c-hr-time": "^1.0.2", + "w3c-xmlserializer": "^2.0.0", + "webidl-conversions": "^6.1.0", + "whatwg-encoding": "^1.0.5", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.5.0", + "ws": "^7.4.5", + "xml-name-validator": "^3.0.0" + } + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "json5": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", + "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true + }, + "leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=", + "dev": true + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "requires": { + "semver": "^6.0.0" + } + }, + "make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "makeerror": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", + "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", + "dev": true, + "requires": { + "tmpl": "1.0.x" + } + }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + } + }, + "mime-db": { + "version": "1.48.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.48.0.tgz", + "integrity": "sha512-FM3QwxV+TnZYQ2aRqhlKBMHxk10lTbMt3bBkMAp54ddrNeVSfcQYOOKuGuy3Ddrm38I04If834fOUSq1yzslJQ==", + "dev": true + }, + "mime-types": { + "version": "2.1.31", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.31.tgz", + "integrity": "sha512-XGZnNzm3QvgKxa8dpzyhFTHmpP3l5YNusmne07VUOXxou9CqUqYa/HBy124RqtVh/O2pECas/MOcsDgpilPOPg==", + "dev": true, + "requires": { + "mime-db": "1.48.0" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", + "dev": true + }, + "node-modules-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", + "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=", + "dev": true + }, + "node-releases": { + "version": "1.1.73", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.73.tgz", + "integrity": "sha512-uW7fodD6pyW2FZNZnp/Z3hvWKeEW1Y8R1+1CnErE8cXFXzl5blBOoVB41CvMer6P6Q0S5FXDwcHgFd1Wj0U9zg==", + "dev": true + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "requires": { + "path-key": "^3.0.0" + } + }, + "nwsapi": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", + "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==", + "dev": true + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, + "object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + } + }, + "p-each-series": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.2.0.tgz", + "integrity": "sha512-ycIL2+1V32th+8scbpTvyHNaHe02z0sjgh91XXjAk+ZeXoPN4Z46DVUnzdso0aX4KckKw0FNNFHdjZ2UsZvxiA==", + "dev": true + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "dev": true + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "picomatch": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", + "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", + "dev": true + }, + "pirates": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", + "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", + "dev": true, + "requires": { + "node-modules-regexp": "^1.0.0" + } + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "requires": { + "find-up": "^4.0.0" + } + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true + }, + "pretty-format": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.0.6.tgz", + "integrity": "sha512-8tGD7gBIENgzqA+UBzObyWqQ5B778VIFZA/S66cclyd5YkFLYs2Js7gxDKf0MXtTc9zcS7t1xhdfcElJ3YIvkQ==", + "dev": true, + "requires": { + "@jest/types": "^27.0.6", + "ansi-regex": "^5.0.0", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true + } + } + }, + "prompts": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.1.tgz", + "integrity": "sha512-EQyfIuO2hPDsX1L/blblV+H7I0knhgAd82cVneCwcdND9B8AuCDuRcBH6yIcG4dFzlOUqbazQqwGjx5xmsNLuQ==", + "dev": true, + "requires": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + } + }, + "psl": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", + "dev": true + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + }, + "react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "dev": true + }, + "regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "dev": true + }, + "regenerate-unicode-properties": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz", + "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==", + "dev": true, + "requires": { + "regenerate": "^1.4.0" + } + }, + "regenerator-runtime": { + "version": "0.13.7", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", + "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==", + "dev": true + }, + "regenerator-transform": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz", + "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==", + "dev": true, + "requires": { + "@babel/runtime": "^7.8.4" + } + }, + "regexpu-core": { + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.1.tgz", + "integrity": "sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ==", + "dev": true, + "requires": { + "regenerate": "^1.4.0", + "regenerate-unicode-properties": "^8.2.0", + "regjsgen": "^0.5.1", + "regjsparser": "^0.6.4", + "unicode-match-property-ecmascript": "^1.0.4", + "unicode-match-property-value-ecmascript": "^1.2.0" + } + }, + "regjsgen": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz", + "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==", + "dev": true + }, + "regjsparser": { + "version": "0.6.9", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.9.tgz", + "integrity": "sha512-ZqbNRz1SNjLAiYuwY0zoXW8Ne675IX5q+YHioAGbCw4X96Mjl2+dcX9B2ciaeyYjViDAfvIjFpQjJgLttTEERQ==", + "dev": true, + "requires": { + "jsesc": "~0.5.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true + } + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "resolve": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "dev": true, + "requires": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + } + }, + "resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "requires": { + "resolve-from": "^5.0.0" + } + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "saxes": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", + "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", + "dev": true, + "requires": { + "xmlchars": "^2.2.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", + "dev": true + }, + "sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "source-map-support": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "stack-utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-gL//fkxfWUsIlFL2Tl42Cl6+HFALEaB1FU76I/Fy+oZjRreP7OPMXFlGbxM7NQsI0ZpUfw76sHnv0WNYuTb7Iw==", + "dev": true, + "requires": { + "escape-string-regexp": "^2.0.0" + }, + "dependencies": { + "escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true + } + } + }, + "string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dev": true, + "requires": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + } + }, + "string-width": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", + "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true + }, + "strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "supports-hyperlinks": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz", + "integrity": "sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ==", + "dev": true, + "requires": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + } + }, + "symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true + }, + "terminal-link": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", + "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", + "dev": true, + "requires": { + "ansi-escapes": "^4.2.1", + "supports-hyperlinks": "^2.0.0" + } + }, + "test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "requires": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + } + }, + "throat": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/throat/-/throat-6.0.1.tgz", + "integrity": "sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w==", + "dev": true + }, + "tmpl": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", + "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=", + "dev": true + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "tough-cookie": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz", + "integrity": "sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==", + "dev": true, + "requires": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.1.2" + } + }, + "tr46": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", + "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", + "dev": true, + "requires": { + "punycode": "^2.1.1" + } + }, + "ts-node": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.1.0.tgz", + "integrity": "sha512-6szn3+J9WyG2hE+5W8e0ruZrzyk1uFLYye6IGMBadnOzDh8aP7t8CbFpsfCiEx2+wMixAhjFt7lOZC4+l+WbEA==", + "dev": true, + "requires": { + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "source-map-support": "^0.5.17", + "yn": "3.1.1" + } + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2" + } + }, + "type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true + }, + "type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true + }, + "typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dev": true, + "requires": { + "is-typedarray": "^1.0.0" + } + }, + "unicode-canonical-property-names-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", + "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==", + "dev": true + }, + "unicode-match-property-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", + "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", + "dev": true, + "requires": { + "unicode-canonical-property-names-ecmascript": "^1.0.4", + "unicode-property-aliases-ecmascript": "^1.0.4" + } + }, + "unicode-match-property-value-ecmascript": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz", + "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==", + "dev": true + }, + "unicode-property-aliases-ecmascript": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz", + "integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==", + "dev": true + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true + }, + "v8-to-istanbul": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-8.0.0.tgz", + "integrity": "sha512-LkmXi8UUNxnCC+JlH7/fsfsKr5AU110l+SYGJimWNkWhxbN5EyeOtm1MJ0hhvqMMOhGwBj1Fp70Yv9i+hX0QAg==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0", + "source-map": "^0.7.3" + }, + "dependencies": { + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true + } + } + }, + "w3c-hr-time": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", + "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", + "dev": true, + "requires": { + "browser-process-hrtime": "^1.0.0" + } + }, + "w3c-xmlserializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", + "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", + "dev": true, + "requires": { + "xml-name-validator": "^3.0.0" + } + }, + "walker": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", + "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", + "dev": true, + "requires": { + "makeerror": "1.0.x" + } + }, + "webidl-conversions": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", + "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", + "dev": true + }, + "whatwg-encoding": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", + "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", + "dev": true, + "requires": { + "iconv-lite": "0.4.24" + } + }, + "whatwg-mimetype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", + "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", + "dev": true + }, + "whatwg-url": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", + "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", + "dev": true, + "requires": { + "lodash": "^4.7.0", + "tr46": "^2.1.0", + "webidl-conversions": "^6.1.0" + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "ws": { + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.3.tgz", + "integrity": "sha512-kQ/dHIzuLrS6Je9+uv81ueZomEwH0qVYstcAQ4/Z93K8zeko9gtAbttJWzoC5ukqXY1PpoouV3+VSOqEAFt5wg==", + "dev": true, + "requires": {} + }, + "xml-name-validator": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", + "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", + "dev": true + }, + "xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true + }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + } + }, + "yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true + }, + "yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true + } + } +} diff --git a/javascript/package.json b/javascript/package.json new file mode 100644 index 0000000..67004b0 --- /dev/null +++ b/javascript/package.json @@ -0,0 +1,26 @@ +{ + "name": "aspected-routing", + "version": "0.2.0", + "description": "Calculates a score based on a .Json-file which contains an Aspected-Routing function. This is a (partial) javascript port", + "main": "index.js", + "type": "module", + "scripts": { + "test": "jest" + }, + "jest": { + "transform": { + "^.+\\.jsx?$": "babel-jest" + } + }, + "keywords": [], + "author": "Charlotte Delvaux", + "license": "MIT", + "devDependencies": { + "@babel/preset-env": "^7.14.7", + "@types/jest": "^26.0.24", + "@types/node": "^16.3.1", + "babel-jest": "^27.0.6", + "jest": "^27.0.6", + "ts-node": "^10.1.0" + } +}