From 15032e5fbda564b774e68097b8a81876a9c7e95e Mon Sep 17 00:00:00 2001 From: Hadrian Tang Date: Thu, 22 Jan 2026 03:22:58 +0800 Subject: [PATCH 1/2] Place set union and minus at same precedence, place xor above or in precedence, fix chained comparison parsing --- Sources/AngouriMath/Convenience/MathS.cs | 2 +- Sources/AngouriMath/Core/Antlr/AngouriMath.g | 90 +- .../AngouriMath/Core/Antlr/AngouriMath.interp | 11 +- .../AngouriMath/Core/Antlr/AngouriMath.tokens | 4 +- .../Core/Antlr/AngouriMathBaseListener.cs | 52 +- .../Core/Antlr/AngouriMathLexer.cs | 692 ++++--- .../Core/Antlr/AngouriMathLexer.interp | 4 +- .../Core/Antlr/AngouriMathLexer.tokens | 4 +- .../Core/Antlr/AngouriMathListener.cs | 46 +- .../Core/Antlr/AngouriMathParser.cs | 1740 ++++++++--------- .../Discrete/Entity.Discrete.Classes.cs | 2 +- .../Discrete/Entity.Discrete.Definition.cs | 31 + .../Core/Entity/Entity.Definition.cs | 10 +- .../Functions/Continuous/Differentiation.cs | 2 +- .../Integration/IntegralPatterns.cs | 4 +- .../EquationSolver/ExponentialSolver.cs | 2 +- ...aluation.Continuous.Arithmetics.Classes.cs | 8 +- ...luation.Continuous.Trigonometry.Classes.cs | 12 +- .../Output/ToString/ToString.Omni.Classes.cs | 2 +- .../Patterns/Patterns.Common.cs | 20 +- .../Patterns/Patterns.EqualityInequality.cs | 20 +- .../Simplification/Patterns/Patterns.Power.cs | 2 +- .../Simplification/Patterns/Patterns.Sets.cs | 2 +- .../Functions/Simplification/Simplificator.cs | 4 +- .../UnitTests/Calculus/IntegrationTest.cs | 34 +- .../UnitTests/Common/InnerSimplifyTest.cs | 2 +- .../UnitTests/Convenience/FromStringTest.cs | 13 +- .../Tests/UnitTests/Convenience/LatexTest.cs | 19 +- .../UnitTests/Convenience/PriorityTest.cs | 25 +- 29 files changed, 1319 insertions(+), 1540 deletions(-) diff --git a/Sources/AngouriMath/Convenience/MathS.cs b/Sources/AngouriMath/Convenience/MathS.cs index ea08c5d11..e8464ac51 100644 --- a/Sources/AngouriMath/Convenience/MathS.cs +++ b/Sources/AngouriMath/Convenience/MathS.cs @@ -2380,7 +2380,7 @@ public static IEnumerable TaylorTerms(Entity expr, params (Variable expr /// Unhandled exception. AngouriMath.Core.Exceptions.CannotEvalException /// /// - public static Entity Equality(Entity a, Entity b) => a.Equalizes(b); + public static Entity Equality(Entity a, Entity b) => a.EqualTo(b); /// Left argument node of which the greater than node will be taken /// Right argument node of which the greater than node function will be taken diff --git a/Sources/AngouriMath/Core/Antlr/AngouriMath.g b/Sources/AngouriMath/Core/Antlr/AngouriMath.g index 36929bb97..4416d022b 100644 --- a/Sources/AngouriMath/Core/Antlr/AngouriMath.g +++ b/Sources/AngouriMath/Core/Antlr/AngouriMath.g @@ -114,31 +114,23 @@ Sets set_operator_intersection returns[Entity value] : left = sum_expression { $value = $left.value; } - ( - 'intersect' right = sum_expression { $value = $value.Intersect($right.value); } | - '/\\' right = sum_expression { $value = $value.Intersect($right.value); } + ( 'intersect' right = sum_expression { $value = $value.Intersect($right.value); } + | '/\\' right = sum_expression { $value = $value.Intersect($right.value); } )* ; -set_operator_union returns[Entity value] +set_operator_union_setsubtraction returns[Entity value] : left = set_operator_intersection { $value = $left.value; } - ( - 'unite' right = set_operator_intersection { $value = $value.Unite($right.value); } | - '\\/' right = set_operator_intersection { $value = $value.Unite($right.value); } - )* - ; - -set_operator_setsubtraction returns[Entity value] - : left = set_operator_union { $value = $left.value; } - ( - 'setsubtract' right = set_operator_union { $value = $value.SetSubtract($right.value); } | - '\\' right = set_operator_union { $value = $value.SetSubtract($right.value); } + ( 'unite' right = set_operator_intersection { $value = $value.Unite($right.value); } + | '\\/' right = set_operator_intersection { $value = $value.Unite($right.value); } + | 'setsubtract' right = set_operator_intersection { $value = $value.SetSubtract($right.value); } + | '\\' right = set_operator_intersection { $value = $value.SetSubtract($right.value); } )* ; in_operator returns[Entity value] - : m1 = set_operator_setsubtraction { $value = $m1.value; } - ('in' m2 = set_operator_setsubtraction { $value = $value.In($m2.value); })* + : m1 = set_operator_union_setsubtraction { $value = $m1.value; } + ('in' m2 = set_operator_union_setsubtraction { $value = $value.In($m2.value); })* ; @@ -148,32 +140,40 @@ Equality/inequality nodes */ -inequality_expression returns[Entity value] - : m1 = in_operator { $value = $m1.value; } +comparison_expression returns[Entity value] + @init { List terms = []; List operators = []; } + : m1 = in_operator { terms.Add($m1.value); } ( - '>=' m2 = in_operator { $value = $value >= $m2.value; } | - '<=' m2 = in_operator { $value = $value <= $m2.value; } | - '>' m2 = in_operator { $value = $value > $m2.value; } | - '<' m2 = in_operator { $value = $value < $m2.value; } | - 'equalizes' m2 = in_operator { $value = MathS.Equality($value, $m2.value); })* + ('>=' { operators.Add(">="); } | + '<=' { operators.Add("<="); } | + '>' { operators.Add(">"); } | + '<' { operators.Add("<"); } | + '=' { operators.Add("="); } | + '<>' { operators.Add("<>"); }) + m2 = in_operator { terms.Add($m2.value); } + )* + { + if (terms.Count == 1) + $value = terms[0]; + else + // Create chain: a < b = c < d becomes (a < b) and (b = c) and (c < d) + for (int i = 0; i < operators.Count; i++) + { + var connective = operators[i] switch + { // Directly construct the nodes instead of using convenience methods to avoid built-in chained comparisons + ">=" => new GreaterOrEqualf(terms[i], terms[i + 1]), + "<=" => new LessOrEqualf(terms[i], terms[i + 1]), + ">" => new Greaterf(terms[i], terms[i + 1]), + "<" => new Lessf(terms[i], terms[i + 1]), + "=" => new Equalsf(terms[i], terms[i + 1]), + "<>" => !new Equalsf(terms[i], terms[i + 1]), + _ => throw new AngouriBugException($"Unknown operator in chained comparison: {operators[i]}") + }; + if (i == 0) $value = connective; else $value &= connective; + } + } ; -terms_list returns[List terms] - @init { $terms = new(); } - : ('=' term = inequality_expression { $terms.Add($term.value); })+ - ; - -equality_expression returns[Entity value] - : expr = inequality_expression { $value = $expr.value; } (terms_list - { - var list = $terms_list.terms.Prepend($value).ToArray(); - List eqTerms = new(); - for (int i = 0; i < list.Length - 1; i++) - eqTerms.Add(list[i].Equalizes(list[i + 1])); - $value = eqTerms.Aggregate((eq1, eq2) => eq1 & eq2); - })? - ; - /* Boolean nodes @@ -181,9 +181,9 @@ Boolean nodes */ negate_expression returns[Entity value] - : 'not' op = equality_expression { $value = !$op.value; } + : 'not' op = comparison_expression { $value = !$op.value; } | 'not' opn = negate_expression { $value = !$opn.value; } - | op = equality_expression { $value = $op.value; } + | op = comparison_expression { $value = $op.value; } ; and_expression returns[Entity value] @@ -200,8 +200,8 @@ xor_expression returns[Entity value] or_expression returns[Entity value] : m1 = xor_expression { $value = $m1.value; } - ('or' m2 = xor_expression { $value = $value | $m2.value; } | - '|' m2 = xor_expression { $value = $value | $m2.value; })* + ( 'or' m2 = xor_expression { $value = $value | $m2.value; } + | '|' m2 = xor_expression { $value = $value | $m2.value; })* ; implies_expression returns[Entity value] @@ -218,7 +218,7 @@ Keyword nodes provided_expression returns[Entity value] : expr = implies_expression { $value = $expr.value; } - ('provided' pred = implies_expression { $value = $value.Provided($pred.value); })* + ('provided' pred = provided_expression { $value = $value.Provided($pred.value); })? ; /* diff --git a/Sources/AngouriMath/Core/Antlr/AngouriMath.interp b/Sources/AngouriMath/Core/Antlr/AngouriMath.interp index 3e1e80b4b..5d630d62d 100644 --- a/Sources/AngouriMath/Core/Antlr/AngouriMath.interp +++ b/Sources/AngouriMath/Core/Antlr/AngouriMath.interp @@ -17,8 +17,8 @@ null '<=' '>' '<' -'equalizes' '=' +'<>' 'not' 'and' '&' @@ -266,12 +266,9 @@ unary_expression mult_expression sum_expression set_operator_intersection -set_operator_union -set_operator_setsubtraction +set_operator_union_setsubtraction in_operator -inequality_expression -terms_list -equality_expression +comparison_expression negate_expression and_expression xor_expression @@ -287,4 +284,4 @@ statement atn: -[4, 1, 127, 804, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 3, 0, 58, 8, 0, 1, 1, 1, 1, 1, 1, 1, 1, 4, 1, 64, 8, 1, 11, 1, 12, 1, 65, 1, 1, 1, 1, 1, 1, 1, 1, 4, 1, 72, 8, 1, 11, 1, 12, 1, 73, 3, 1, 76, 8, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 3, 2, 83, 8, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 3, 3, 93, 8, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 3, 3, 103, 8, 3, 1, 3, 1, 3, 1, 3, 3, 3, 108, 8, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 5, 4, 120, 8, 4, 10, 4, 12, 4, 123, 9, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 5, 5, 135, 8, 5, 10, 5, 12, 5, 138, 9, 5, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 5, 6, 150, 8, 6, 10, 6, 12, 6, 153, 9, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 5, 7, 165, 8, 7, 10, 7, 12, 7, 168, 9, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 5, 8, 180, 8, 8, 10, 8, 12, 8, 183, 9, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 5, 9, 191, 8, 9, 10, 9, 12, 9, 194, 9, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 5, 10, 218, 8, 10, 10, 10, 12, 10, 221, 9, 10, 1, 11, 1, 11, 1, 11, 1, 11, 4, 11, 227, 8, 11, 11, 11, 12, 11, 228, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 3, 12, 236, 8, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 3, 13, 249, 8, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 5, 14, 261, 8, 14, 10, 14, 12, 14, 264, 9, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 5, 15, 272, 8, 15, 10, 15, 12, 15, 275, 9, 15, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 5, 16, 287, 8, 16, 10, 16, 12, 16, 290, 9, 16, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 5, 17, 302, 8, 17, 10, 17, 12, 17, 305, 9, 17, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 5, 18, 313, 8, 18, 10, 18, 12, 18, 316, 9, 18, 1, 19, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 5, 20, 327, 8, 20, 10, 20, 12, 20, 330, 9, 20, 3, 20, 332, 8, 20, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 3, 23, 798, 8, 23, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 0, 0, 25, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 0, 0, 910, 0, 57, 1, 0, 0, 0, 2, 75, 1, 0, 0, 0, 4, 77, 1, 0, 0, 0, 6, 107, 1, 0, 0, 0, 8, 109, 1, 0, 0, 0, 10, 124, 1, 0, 0, 0, 12, 139, 1, 0, 0, 0, 14, 154, 1, 0, 0, 0, 16, 169, 1, 0, 0, 0, 18, 184, 1, 0, 0, 0, 20, 195, 1, 0, 0, 0, 22, 226, 1, 0, 0, 0, 24, 230, 1, 0, 0, 0, 26, 248, 1, 0, 0, 0, 28, 250, 1, 0, 0, 0, 30, 265, 1, 0, 0, 0, 32, 276, 1, 0, 0, 0, 34, 291, 1, 0, 0, 0, 36, 306, 1, 0, 0, 0, 38, 317, 1, 0, 0, 0, 40, 331, 1, 0, 0, 0, 42, 333, 1, 0, 0, 0, 44, 339, 1, 0, 0, 0, 46, 797, 1, 0, 0, 0, 48, 799, 1, 0, 0, 0, 50, 51, 3, 46, 23, 0, 51, 52, 5, 1, 0, 0, 52, 53, 6, 0, -1, 0, 53, 58, 1, 0, 0, 0, 54, 55, 3, 46, 23, 0, 55, 56, 6, 0, -1, 0, 56, 58, 1, 0, 0, 0, 57, 50, 1, 0, 0, 0, 57, 54, 1, 0, 0, 0, 58, 1, 1, 0, 0, 0, 59, 60, 5, 2, 0, 0, 60, 61, 3, 0, 0, 0, 61, 62, 6, 1, -1, 0, 62, 64, 1, 0, 0, 0, 63, 59, 1, 0, 0, 0, 64, 65, 1, 0, 0, 0, 65, 63, 1, 0, 0, 0, 65, 66, 1, 0, 0, 0, 66, 76, 1, 0, 0, 0, 67, 68, 5, 2, 0, 0, 68, 69, 3, 6, 3, 0, 69, 70, 6, 1, -1, 0, 70, 72, 1, 0, 0, 0, 71, 67, 1, 0, 0, 0, 72, 73, 1, 0, 0, 0, 73, 71, 1, 0, 0, 0, 73, 74, 1, 0, 0, 0, 74, 76, 1, 0, 0, 0, 75, 63, 1, 0, 0, 0, 75, 71, 1, 0, 0, 0, 76, 3, 1, 0, 0, 0, 77, 78, 3, 0, 0, 0, 78, 82, 6, 2, -1, 0, 79, 80, 3, 2, 1, 0, 80, 81, 6, 2, -1, 0, 81, 83, 1, 0, 0, 0, 82, 79, 1, 0, 0, 0, 82, 83, 1, 0, 0, 0, 83, 5, 1, 0, 0, 0, 84, 85, 5, 3, 0, 0, 85, 86, 3, 4, 2, 0, 86, 87, 6, 3, -1, 0, 87, 93, 1, 0, 0, 0, 88, 89, 5, 4, 0, 0, 89, 90, 3, 4, 2, 0, 90, 91, 6, 3, -1, 0, 91, 93, 1, 0, 0, 0, 92, 84, 1, 0, 0, 0, 92, 88, 1, 0, 0, 0, 93, 108, 1, 0, 0, 0, 94, 95, 5, 3, 0, 0, 95, 96, 3, 6, 3, 0, 96, 97, 6, 3, -1, 0, 97, 103, 1, 0, 0, 0, 98, 99, 5, 4, 0, 0, 99, 100, 3, 6, 3, 0, 100, 101, 6, 3, -1, 0, 101, 103, 1, 0, 0, 0, 102, 94, 1, 0, 0, 0, 102, 98, 1, 0, 0, 0, 103, 108, 1, 0, 0, 0, 104, 105, 3, 4, 2, 0, 105, 106, 6, 3, -1, 0, 106, 108, 1, 0, 0, 0, 107, 92, 1, 0, 0, 0, 107, 102, 1, 0, 0, 0, 107, 104, 1, 0, 0, 0, 108, 7, 1, 0, 0, 0, 109, 110, 3, 6, 3, 0, 110, 121, 6, 4, -1, 0, 111, 112, 5, 5, 0, 0, 112, 113, 3, 6, 3, 0, 113, 114, 6, 4, -1, 0, 114, 120, 1, 0, 0, 0, 115, 116, 5, 6, 0, 0, 116, 117, 3, 6, 3, 0, 117, 118, 6, 4, -1, 0, 118, 120, 1, 0, 0, 0, 119, 111, 1, 0, 0, 0, 119, 115, 1, 0, 0, 0, 120, 123, 1, 0, 0, 0, 121, 119, 1, 0, 0, 0, 121, 122, 1, 0, 0, 0, 122, 9, 1, 0, 0, 0, 123, 121, 1, 0, 0, 0, 124, 125, 3, 8, 4, 0, 125, 136, 6, 5, -1, 0, 126, 127, 5, 4, 0, 0, 127, 128, 3, 8, 4, 0, 128, 129, 6, 5, -1, 0, 129, 135, 1, 0, 0, 0, 130, 131, 5, 3, 0, 0, 131, 132, 3, 8, 4, 0, 132, 133, 6, 5, -1, 0, 133, 135, 1, 0, 0, 0, 134, 126, 1, 0, 0, 0, 134, 130, 1, 0, 0, 0, 135, 138, 1, 0, 0, 0, 136, 134, 1, 0, 0, 0, 136, 137, 1, 0, 0, 0, 137, 11, 1, 0, 0, 0, 138, 136, 1, 0, 0, 0, 139, 140, 3, 10, 5, 0, 140, 151, 6, 6, -1, 0, 141, 142, 5, 7, 0, 0, 142, 143, 3, 10, 5, 0, 143, 144, 6, 6, -1, 0, 144, 150, 1, 0, 0, 0, 145, 146, 5, 8, 0, 0, 146, 147, 3, 10, 5, 0, 147, 148, 6, 6, -1, 0, 148, 150, 1, 0, 0, 0, 149, 141, 1, 0, 0, 0, 149, 145, 1, 0, 0, 0, 150, 153, 1, 0, 0, 0, 151, 149, 1, 0, 0, 0, 151, 152, 1, 0, 0, 0, 152, 13, 1, 0, 0, 0, 153, 151, 1, 0, 0, 0, 154, 155, 3, 12, 6, 0, 155, 166, 6, 7, -1, 0, 156, 157, 5, 9, 0, 0, 157, 158, 3, 12, 6, 0, 158, 159, 6, 7, -1, 0, 159, 165, 1, 0, 0, 0, 160, 161, 5, 10, 0, 0, 161, 162, 3, 12, 6, 0, 162, 163, 6, 7, -1, 0, 163, 165, 1, 0, 0, 0, 164, 156, 1, 0, 0, 0, 164, 160, 1, 0, 0, 0, 165, 168, 1, 0, 0, 0, 166, 164, 1, 0, 0, 0, 166, 167, 1, 0, 0, 0, 167, 15, 1, 0, 0, 0, 168, 166, 1, 0, 0, 0, 169, 170, 3, 14, 7, 0, 170, 181, 6, 8, -1, 0, 171, 172, 5, 11, 0, 0, 172, 173, 3, 14, 7, 0, 173, 174, 6, 8, -1, 0, 174, 180, 1, 0, 0, 0, 175, 176, 5, 12, 0, 0, 176, 177, 3, 14, 7, 0, 177, 178, 6, 8, -1, 0, 178, 180, 1, 0, 0, 0, 179, 171, 1, 0, 0, 0, 179, 175, 1, 0, 0, 0, 180, 183, 1, 0, 0, 0, 181, 179, 1, 0, 0, 0, 181, 182, 1, 0, 0, 0, 182, 17, 1, 0, 0, 0, 183, 181, 1, 0, 0, 0, 184, 185, 3, 16, 8, 0, 185, 192, 6, 9, -1, 0, 186, 187, 5, 13, 0, 0, 187, 188, 3, 16, 8, 0, 188, 189, 6, 9, -1, 0, 189, 191, 1, 0, 0, 0, 190, 186, 1, 0, 0, 0, 191, 194, 1, 0, 0, 0, 192, 190, 1, 0, 0, 0, 192, 193, 1, 0, 0, 0, 193, 19, 1, 0, 0, 0, 194, 192, 1, 0, 0, 0, 195, 196, 3, 18, 9, 0, 196, 219, 6, 10, -1, 0, 197, 198, 5, 14, 0, 0, 198, 199, 3, 18, 9, 0, 199, 200, 6, 10, -1, 0, 200, 218, 1, 0, 0, 0, 201, 202, 5, 15, 0, 0, 202, 203, 3, 18, 9, 0, 203, 204, 6, 10, -1, 0, 204, 218, 1, 0, 0, 0, 205, 206, 5, 16, 0, 0, 206, 207, 3, 18, 9, 0, 207, 208, 6, 10, -1, 0, 208, 218, 1, 0, 0, 0, 209, 210, 5, 17, 0, 0, 210, 211, 3, 18, 9, 0, 211, 212, 6, 10, -1, 0, 212, 218, 1, 0, 0, 0, 213, 214, 5, 18, 0, 0, 214, 215, 3, 18, 9, 0, 215, 216, 6, 10, -1, 0, 216, 218, 1, 0, 0, 0, 217, 197, 1, 0, 0, 0, 217, 201, 1, 0, 0, 0, 217, 205, 1, 0, 0, 0, 217, 209, 1, 0, 0, 0, 217, 213, 1, 0, 0, 0, 218, 221, 1, 0, 0, 0, 219, 217, 1, 0, 0, 0, 219, 220, 1, 0, 0, 0, 220, 21, 1, 0, 0, 0, 221, 219, 1, 0, 0, 0, 222, 223, 5, 19, 0, 0, 223, 224, 3, 20, 10, 0, 224, 225, 6, 11, -1, 0, 225, 227, 1, 0, 0, 0, 226, 222, 1, 0, 0, 0, 227, 228, 1, 0, 0, 0, 228, 226, 1, 0, 0, 0, 228, 229, 1, 0, 0, 0, 229, 23, 1, 0, 0, 0, 230, 231, 3, 20, 10, 0, 231, 235, 6, 12, -1, 0, 232, 233, 3, 22, 11, 0, 233, 234, 6, 12, -1, 0, 234, 236, 1, 0, 0, 0, 235, 232, 1, 0, 0, 0, 235, 236, 1, 0, 0, 0, 236, 25, 1, 0, 0, 0, 237, 238, 5, 20, 0, 0, 238, 239, 3, 24, 12, 0, 239, 240, 6, 13, -1, 0, 240, 249, 1, 0, 0, 0, 241, 242, 5, 20, 0, 0, 242, 243, 3, 26, 13, 0, 243, 244, 6, 13, -1, 0, 244, 249, 1, 0, 0, 0, 245, 246, 3, 24, 12, 0, 246, 247, 6, 13, -1, 0, 247, 249, 1, 0, 0, 0, 248, 237, 1, 0, 0, 0, 248, 241, 1, 0, 0, 0, 248, 245, 1, 0, 0, 0, 249, 27, 1, 0, 0, 0, 250, 251, 3, 26, 13, 0, 251, 262, 6, 14, -1, 0, 252, 253, 5, 21, 0, 0, 253, 254, 3, 26, 13, 0, 254, 255, 6, 14, -1, 0, 255, 261, 1, 0, 0, 0, 256, 257, 5, 22, 0, 0, 257, 258, 3, 26, 13, 0, 258, 259, 6, 14, -1, 0, 259, 261, 1, 0, 0, 0, 260, 252, 1, 0, 0, 0, 260, 256, 1, 0, 0, 0, 261, 264, 1, 0, 0, 0, 262, 260, 1, 0, 0, 0, 262, 263, 1, 0, 0, 0, 263, 29, 1, 0, 0, 0, 264, 262, 1, 0, 0, 0, 265, 266, 3, 28, 14, 0, 266, 273, 6, 15, -1, 0, 267, 268, 5, 23, 0, 0, 268, 269, 3, 28, 14, 0, 269, 270, 6, 15, -1, 0, 270, 272, 1, 0, 0, 0, 271, 267, 1, 0, 0, 0, 272, 275, 1, 0, 0, 0, 273, 271, 1, 0, 0, 0, 273, 274, 1, 0, 0, 0, 274, 31, 1, 0, 0, 0, 275, 273, 1, 0, 0, 0, 276, 277, 3, 30, 15, 0, 277, 288, 6, 16, -1, 0, 278, 279, 5, 24, 0, 0, 279, 280, 3, 30, 15, 0, 280, 281, 6, 16, -1, 0, 281, 287, 1, 0, 0, 0, 282, 283, 5, 25, 0, 0, 283, 284, 3, 30, 15, 0, 284, 285, 6, 16, -1, 0, 285, 287, 1, 0, 0, 0, 286, 278, 1, 0, 0, 0, 286, 282, 1, 0, 0, 0, 287, 290, 1, 0, 0, 0, 288, 286, 1, 0, 0, 0, 288, 289, 1, 0, 0, 0, 289, 33, 1, 0, 0, 0, 290, 288, 1, 0, 0, 0, 291, 292, 3, 32, 16, 0, 292, 303, 6, 17, -1, 0, 293, 294, 5, 26, 0, 0, 294, 295, 3, 32, 16, 0, 295, 296, 6, 17, -1, 0, 296, 302, 1, 0, 0, 0, 297, 298, 5, 27, 0, 0, 298, 299, 3, 32, 16, 0, 299, 300, 6, 17, -1, 0, 300, 302, 1, 0, 0, 0, 301, 293, 1, 0, 0, 0, 301, 297, 1, 0, 0, 0, 302, 305, 1, 0, 0, 0, 303, 301, 1, 0, 0, 0, 303, 304, 1, 0, 0, 0, 304, 35, 1, 0, 0, 0, 305, 303, 1, 0, 0, 0, 306, 307, 3, 34, 17, 0, 307, 314, 6, 18, -1, 0, 308, 309, 5, 28, 0, 0, 309, 310, 3, 34, 17, 0, 310, 311, 6, 18, -1, 0, 311, 313, 1, 0, 0, 0, 312, 308, 1, 0, 0, 0, 313, 316, 1, 0, 0, 0, 314, 312, 1, 0, 0, 0, 314, 315, 1, 0, 0, 0, 315, 37, 1, 0, 0, 0, 316, 314, 1, 0, 0, 0, 317, 318, 3, 36, 18, 0, 318, 319, 6, 19, -1, 0, 319, 39, 1, 0, 0, 0, 320, 321, 3, 38, 19, 0, 321, 328, 6, 20, -1, 0, 322, 323, 5, 29, 0, 0, 323, 324, 3, 38, 19, 0, 324, 325, 6, 20, -1, 0, 325, 327, 1, 0, 0, 0, 326, 322, 1, 0, 0, 0, 327, 330, 1, 0, 0, 0, 328, 326, 1, 0, 0, 0, 328, 329, 1, 0, 0, 0, 329, 332, 1, 0, 0, 0, 330, 328, 1, 0, 0, 0, 331, 320, 1, 0, 0, 0, 331, 332, 1, 0, 0, 0, 332, 41, 1, 0, 0, 0, 333, 334, 3, 38, 19, 0, 334, 335, 6, 21, -1, 0, 335, 336, 5, 30, 0, 0, 336, 337, 3, 38, 19, 0, 337, 338, 6, 21, -1, 0, 338, 43, 1, 0, 0, 0, 339, 340, 3, 38, 19, 0, 340, 341, 6, 22, -1, 0, 341, 342, 5, 31, 0, 0, 342, 343, 3, 38, 19, 0, 343, 344, 6, 22, -1, 0, 344, 45, 1, 0, 0, 0, 345, 346, 5, 32, 0, 0, 346, 798, 6, 23, -1, 0, 347, 348, 5, 33, 0, 0, 348, 798, 6, 23, -1, 0, 349, 350, 5, 122, 0, 0, 350, 798, 6, 23, -1, 0, 351, 352, 5, 124, 0, 0, 352, 798, 6, 23, -1, 0, 353, 354, 5, 123, 0, 0, 354, 798, 6, 23, -1, 0, 355, 356, 5, 125, 0, 0, 356, 798, 6, 23, -1, 0, 357, 358, 5, 34, 0, 0, 358, 359, 3, 38, 19, 0, 359, 360, 5, 35, 0, 0, 360, 361, 6, 23, -1, 0, 361, 798, 1, 0, 0, 0, 362, 363, 5, 36, 0, 0, 363, 364, 3, 40, 20, 0, 364, 365, 5, 37, 0, 0, 365, 366, 6, 23, -1, 0, 366, 798, 1, 0, 0, 0, 367, 368, 5, 36, 0, 0, 368, 369, 3, 40, 20, 0, 369, 370, 5, 38, 0, 0, 370, 371, 6, 23, -1, 0, 371, 798, 1, 0, 0, 0, 372, 373, 5, 39, 0, 0, 373, 374, 3, 42, 21, 0, 374, 375, 5, 40, 0, 0, 375, 376, 6, 23, -1, 0, 376, 798, 1, 0, 0, 0, 377, 378, 5, 36, 0, 0, 378, 379, 3, 42, 21, 0, 379, 380, 5, 40, 0, 0, 380, 381, 6, 23, -1, 0, 381, 798, 1, 0, 0, 0, 382, 383, 5, 36, 0, 0, 383, 384, 3, 42, 21, 0, 384, 385, 5, 38, 0, 0, 385, 386, 6, 23, -1, 0, 386, 798, 1, 0, 0, 0, 387, 388, 5, 39, 0, 0, 388, 389, 3, 42, 21, 0, 389, 390, 5, 38, 0, 0, 390, 391, 6, 23, -1, 0, 391, 798, 1, 0, 0, 0, 392, 393, 5, 39, 0, 0, 393, 394, 3, 38, 19, 0, 394, 395, 5, 40, 0, 0, 395, 396, 6, 23, -1, 0, 396, 798, 1, 0, 0, 0, 397, 398, 5, 41, 0, 0, 398, 399, 3, 44, 22, 0, 399, 400, 5, 42, 0, 0, 400, 401, 6, 23, -1, 0, 401, 798, 1, 0, 0, 0, 402, 403, 5, 41, 0, 0, 403, 404, 3, 40, 20, 0, 404, 405, 5, 42, 0, 0, 405, 406, 6, 23, -1, 0, 406, 798, 1, 0, 0, 0, 407, 408, 5, 43, 0, 0, 408, 409, 3, 40, 20, 0, 409, 410, 5, 40, 0, 0, 410, 411, 6, 23, -1, 0, 411, 798, 1, 0, 0, 0, 412, 413, 5, 44, 0, 0, 413, 414, 3, 40, 20, 0, 414, 415, 5, 40, 0, 0, 415, 416, 6, 23, -1, 0, 416, 798, 1, 0, 0, 0, 417, 418, 5, 45, 0, 0, 418, 419, 3, 40, 20, 0, 419, 420, 5, 40, 0, 0, 420, 421, 6, 23, -1, 0, 421, 798, 1, 0, 0, 0, 422, 423, 5, 46, 0, 0, 423, 424, 3, 40, 20, 0, 424, 425, 5, 40, 0, 0, 425, 426, 6, 23, -1, 0, 426, 798, 1, 0, 0, 0, 427, 428, 5, 47, 0, 0, 428, 429, 3, 40, 20, 0, 429, 430, 5, 40, 0, 0, 430, 431, 6, 23, -1, 0, 431, 798, 1, 0, 0, 0, 432, 433, 5, 48, 0, 0, 433, 434, 3, 40, 20, 0, 434, 435, 5, 40, 0, 0, 435, 436, 6, 23, -1, 0, 436, 798, 1, 0, 0, 0, 437, 438, 5, 49, 0, 0, 438, 439, 3, 40, 20, 0, 439, 440, 5, 40, 0, 0, 440, 441, 6, 23, -1, 0, 441, 798, 1, 0, 0, 0, 442, 443, 5, 50, 0, 0, 443, 444, 3, 40, 20, 0, 444, 445, 5, 40, 0, 0, 445, 446, 6, 23, -1, 0, 446, 798, 1, 0, 0, 0, 447, 448, 5, 51, 0, 0, 448, 449, 3, 40, 20, 0, 449, 450, 5, 40, 0, 0, 450, 451, 6, 23, -1, 0, 451, 798, 1, 0, 0, 0, 452, 453, 5, 52, 0, 0, 453, 454, 3, 40, 20, 0, 454, 455, 5, 40, 0, 0, 455, 456, 6, 23, -1, 0, 456, 798, 1, 0, 0, 0, 457, 458, 5, 53, 0, 0, 458, 459, 3, 40, 20, 0, 459, 460, 5, 40, 0, 0, 460, 461, 6, 23, -1, 0, 461, 798, 1, 0, 0, 0, 462, 463, 5, 54, 0, 0, 463, 464, 3, 40, 20, 0, 464, 465, 5, 40, 0, 0, 465, 466, 6, 23, -1, 0, 466, 798, 1, 0, 0, 0, 467, 468, 5, 55, 0, 0, 468, 469, 3, 40, 20, 0, 469, 470, 5, 40, 0, 0, 470, 471, 6, 23, -1, 0, 471, 798, 1, 0, 0, 0, 472, 473, 5, 56, 0, 0, 473, 474, 3, 40, 20, 0, 474, 475, 5, 40, 0, 0, 475, 476, 6, 23, -1, 0, 476, 798, 1, 0, 0, 0, 477, 478, 5, 57, 0, 0, 478, 479, 3, 40, 20, 0, 479, 480, 5, 40, 0, 0, 480, 481, 6, 23, -1, 0, 481, 798, 1, 0, 0, 0, 482, 483, 5, 58, 0, 0, 483, 484, 3, 40, 20, 0, 484, 485, 5, 40, 0, 0, 485, 486, 6, 23, -1, 0, 486, 798, 1, 0, 0, 0, 487, 488, 5, 59, 0, 0, 488, 489, 3, 40, 20, 0, 489, 490, 5, 40, 0, 0, 490, 491, 6, 23, -1, 0, 491, 798, 1, 0, 0, 0, 492, 493, 5, 60, 0, 0, 493, 494, 3, 40, 20, 0, 494, 495, 5, 40, 0, 0, 495, 496, 6, 23, -1, 0, 496, 798, 1, 0, 0, 0, 497, 498, 5, 61, 0, 0, 498, 499, 3, 40, 20, 0, 499, 500, 5, 40, 0, 0, 500, 501, 6, 23, -1, 0, 501, 798, 1, 0, 0, 0, 502, 503, 5, 62, 0, 0, 503, 504, 3, 40, 20, 0, 504, 505, 5, 40, 0, 0, 505, 506, 6, 23, -1, 0, 506, 798, 1, 0, 0, 0, 507, 508, 5, 63, 0, 0, 508, 509, 3, 40, 20, 0, 509, 510, 5, 40, 0, 0, 510, 511, 6, 23, -1, 0, 511, 798, 1, 0, 0, 0, 512, 513, 5, 64, 0, 0, 513, 514, 3, 40, 20, 0, 514, 515, 5, 40, 0, 0, 515, 516, 6, 23, -1, 0, 516, 798, 1, 0, 0, 0, 517, 518, 5, 65, 0, 0, 518, 519, 3, 40, 20, 0, 519, 520, 5, 40, 0, 0, 520, 521, 6, 23, -1, 0, 521, 798, 1, 0, 0, 0, 522, 523, 5, 66, 0, 0, 523, 524, 3, 40, 20, 0, 524, 525, 5, 40, 0, 0, 525, 526, 6, 23, -1, 0, 526, 798, 1, 0, 0, 0, 527, 528, 5, 67, 0, 0, 528, 529, 3, 40, 20, 0, 529, 530, 5, 40, 0, 0, 530, 531, 6, 23, -1, 0, 531, 798, 1, 0, 0, 0, 532, 533, 5, 68, 0, 0, 533, 534, 3, 40, 20, 0, 534, 535, 5, 40, 0, 0, 535, 536, 6, 23, -1, 0, 536, 798, 1, 0, 0, 0, 537, 538, 5, 69, 0, 0, 538, 539, 3, 40, 20, 0, 539, 540, 5, 40, 0, 0, 540, 541, 6, 23, -1, 0, 541, 798, 1, 0, 0, 0, 542, 543, 5, 70, 0, 0, 543, 544, 3, 40, 20, 0, 544, 545, 5, 40, 0, 0, 545, 546, 6, 23, -1, 0, 546, 798, 1, 0, 0, 0, 547, 548, 5, 71, 0, 0, 548, 549, 3, 40, 20, 0, 549, 550, 5, 40, 0, 0, 550, 551, 6, 23, -1, 0, 551, 798, 1, 0, 0, 0, 552, 553, 5, 72, 0, 0, 553, 554, 3, 40, 20, 0, 554, 555, 5, 40, 0, 0, 555, 556, 6, 23, -1, 0, 556, 798, 1, 0, 0, 0, 557, 558, 5, 73, 0, 0, 558, 559, 3, 40, 20, 0, 559, 560, 5, 40, 0, 0, 560, 561, 6, 23, -1, 0, 561, 798, 1, 0, 0, 0, 562, 563, 5, 74, 0, 0, 563, 564, 3, 40, 20, 0, 564, 565, 5, 40, 0, 0, 565, 566, 6, 23, -1, 0, 566, 798, 1, 0, 0, 0, 567, 568, 5, 75, 0, 0, 568, 569, 3, 40, 20, 0, 569, 570, 5, 40, 0, 0, 570, 571, 6, 23, -1, 0, 571, 798, 1, 0, 0, 0, 572, 573, 5, 76, 0, 0, 573, 574, 3, 40, 20, 0, 574, 575, 5, 40, 0, 0, 575, 576, 6, 23, -1, 0, 576, 798, 1, 0, 0, 0, 577, 578, 5, 77, 0, 0, 578, 579, 3, 40, 20, 0, 579, 580, 5, 40, 0, 0, 580, 581, 6, 23, -1, 0, 581, 798, 1, 0, 0, 0, 582, 583, 5, 78, 0, 0, 583, 584, 3, 40, 20, 0, 584, 585, 5, 40, 0, 0, 585, 586, 6, 23, -1, 0, 586, 798, 1, 0, 0, 0, 587, 588, 5, 79, 0, 0, 588, 589, 3, 40, 20, 0, 589, 590, 5, 40, 0, 0, 590, 591, 6, 23, -1, 0, 591, 798, 1, 0, 0, 0, 592, 593, 5, 80, 0, 0, 593, 594, 3, 40, 20, 0, 594, 595, 5, 40, 0, 0, 595, 596, 6, 23, -1, 0, 596, 798, 1, 0, 0, 0, 597, 598, 5, 81, 0, 0, 598, 599, 3, 40, 20, 0, 599, 600, 5, 40, 0, 0, 600, 601, 6, 23, -1, 0, 601, 798, 1, 0, 0, 0, 602, 603, 5, 82, 0, 0, 603, 604, 3, 40, 20, 0, 604, 605, 5, 40, 0, 0, 605, 606, 6, 23, -1, 0, 606, 798, 1, 0, 0, 0, 607, 608, 5, 83, 0, 0, 608, 609, 3, 40, 20, 0, 609, 610, 5, 40, 0, 0, 610, 611, 6, 23, -1, 0, 611, 798, 1, 0, 0, 0, 612, 613, 5, 84, 0, 0, 613, 614, 3, 40, 20, 0, 614, 615, 5, 40, 0, 0, 615, 616, 6, 23, -1, 0, 616, 798, 1, 0, 0, 0, 617, 618, 5, 85, 0, 0, 618, 619, 3, 40, 20, 0, 619, 620, 5, 40, 0, 0, 620, 621, 6, 23, -1, 0, 621, 798, 1, 0, 0, 0, 622, 623, 5, 86, 0, 0, 623, 624, 3, 40, 20, 0, 624, 625, 5, 40, 0, 0, 625, 626, 6, 23, -1, 0, 626, 798, 1, 0, 0, 0, 627, 628, 5, 87, 0, 0, 628, 629, 3, 40, 20, 0, 629, 630, 5, 40, 0, 0, 630, 631, 6, 23, -1, 0, 631, 798, 1, 0, 0, 0, 632, 633, 5, 88, 0, 0, 633, 634, 3, 40, 20, 0, 634, 635, 5, 40, 0, 0, 635, 636, 6, 23, -1, 0, 636, 798, 1, 0, 0, 0, 637, 638, 5, 89, 0, 0, 638, 639, 3, 40, 20, 0, 639, 640, 5, 40, 0, 0, 640, 641, 6, 23, -1, 0, 641, 798, 1, 0, 0, 0, 642, 643, 5, 90, 0, 0, 643, 644, 3, 40, 20, 0, 644, 645, 5, 40, 0, 0, 645, 646, 6, 23, -1, 0, 646, 798, 1, 0, 0, 0, 647, 648, 5, 91, 0, 0, 648, 649, 3, 40, 20, 0, 649, 650, 5, 40, 0, 0, 650, 651, 6, 23, -1, 0, 651, 798, 1, 0, 0, 0, 652, 653, 5, 92, 0, 0, 653, 654, 3, 40, 20, 0, 654, 655, 5, 40, 0, 0, 655, 656, 6, 23, -1, 0, 656, 798, 1, 0, 0, 0, 657, 658, 5, 93, 0, 0, 658, 659, 3, 40, 20, 0, 659, 660, 5, 40, 0, 0, 660, 661, 6, 23, -1, 0, 661, 798, 1, 0, 0, 0, 662, 663, 5, 94, 0, 0, 663, 664, 3, 40, 20, 0, 664, 665, 5, 40, 0, 0, 665, 666, 6, 23, -1, 0, 666, 798, 1, 0, 0, 0, 667, 668, 5, 95, 0, 0, 668, 669, 3, 40, 20, 0, 669, 670, 5, 40, 0, 0, 670, 671, 6, 23, -1, 0, 671, 798, 1, 0, 0, 0, 672, 673, 5, 96, 0, 0, 673, 674, 3, 40, 20, 0, 674, 675, 5, 40, 0, 0, 675, 676, 6, 23, -1, 0, 676, 798, 1, 0, 0, 0, 677, 678, 5, 97, 0, 0, 678, 679, 3, 40, 20, 0, 679, 680, 5, 40, 0, 0, 680, 681, 6, 23, -1, 0, 681, 798, 1, 0, 0, 0, 682, 683, 5, 98, 0, 0, 683, 684, 3, 40, 20, 0, 684, 685, 5, 40, 0, 0, 685, 686, 6, 23, -1, 0, 686, 798, 1, 0, 0, 0, 687, 688, 5, 99, 0, 0, 688, 689, 3, 40, 20, 0, 689, 690, 5, 40, 0, 0, 690, 691, 6, 23, -1, 0, 691, 798, 1, 0, 0, 0, 692, 693, 5, 100, 0, 0, 693, 694, 3, 40, 20, 0, 694, 695, 5, 40, 0, 0, 695, 696, 6, 23, -1, 0, 696, 798, 1, 0, 0, 0, 697, 698, 5, 101, 0, 0, 698, 699, 3, 40, 20, 0, 699, 700, 5, 40, 0, 0, 700, 701, 6, 23, -1, 0, 701, 798, 1, 0, 0, 0, 702, 703, 5, 102, 0, 0, 703, 704, 3, 40, 20, 0, 704, 705, 5, 40, 0, 0, 705, 706, 6, 23, -1, 0, 706, 798, 1, 0, 0, 0, 707, 708, 5, 103, 0, 0, 708, 709, 3, 40, 20, 0, 709, 710, 5, 40, 0, 0, 710, 711, 6, 23, -1, 0, 711, 798, 1, 0, 0, 0, 712, 713, 5, 104, 0, 0, 713, 714, 3, 40, 20, 0, 714, 715, 5, 40, 0, 0, 715, 716, 6, 23, -1, 0, 716, 798, 1, 0, 0, 0, 717, 718, 5, 105, 0, 0, 718, 719, 3, 40, 20, 0, 719, 720, 5, 40, 0, 0, 720, 721, 6, 23, -1, 0, 721, 798, 1, 0, 0, 0, 722, 723, 5, 106, 0, 0, 723, 724, 3, 40, 20, 0, 724, 725, 5, 40, 0, 0, 725, 726, 6, 23, -1, 0, 726, 798, 1, 0, 0, 0, 727, 728, 5, 107, 0, 0, 728, 729, 3, 40, 20, 0, 729, 730, 5, 40, 0, 0, 730, 731, 6, 23, -1, 0, 731, 798, 1, 0, 0, 0, 732, 733, 5, 108, 0, 0, 733, 734, 3, 40, 20, 0, 734, 735, 5, 40, 0, 0, 735, 736, 6, 23, -1, 0, 736, 798, 1, 0, 0, 0, 737, 738, 5, 109, 0, 0, 738, 739, 3, 40, 20, 0, 739, 740, 5, 40, 0, 0, 740, 741, 6, 23, -1, 0, 741, 798, 1, 0, 0, 0, 742, 743, 5, 110, 0, 0, 743, 744, 3, 40, 20, 0, 744, 745, 5, 40, 0, 0, 745, 746, 6, 23, -1, 0, 746, 798, 1, 0, 0, 0, 747, 748, 5, 111, 0, 0, 748, 749, 3, 40, 20, 0, 749, 750, 5, 40, 0, 0, 750, 751, 6, 23, -1, 0, 751, 798, 1, 0, 0, 0, 752, 753, 5, 112, 0, 0, 753, 754, 3, 40, 20, 0, 754, 755, 5, 40, 0, 0, 755, 756, 6, 23, -1, 0, 756, 798, 1, 0, 0, 0, 757, 758, 5, 113, 0, 0, 758, 759, 3, 40, 20, 0, 759, 760, 5, 40, 0, 0, 760, 761, 6, 23, -1, 0, 761, 798, 1, 0, 0, 0, 762, 763, 5, 114, 0, 0, 763, 764, 3, 40, 20, 0, 764, 765, 5, 40, 0, 0, 765, 766, 6, 23, -1, 0, 766, 798, 1, 0, 0, 0, 767, 768, 5, 115, 0, 0, 768, 769, 3, 40, 20, 0, 769, 770, 5, 40, 0, 0, 770, 771, 6, 23, -1, 0, 771, 798, 1, 0, 0, 0, 772, 773, 5, 116, 0, 0, 773, 774, 3, 40, 20, 0, 774, 775, 5, 40, 0, 0, 775, 776, 6, 23, -1, 0, 776, 798, 1, 0, 0, 0, 777, 778, 5, 117, 0, 0, 778, 779, 3, 40, 20, 0, 779, 780, 5, 40, 0, 0, 780, 781, 6, 23, -1, 0, 781, 798, 1, 0, 0, 0, 782, 783, 5, 118, 0, 0, 783, 784, 3, 40, 20, 0, 784, 785, 5, 40, 0, 0, 785, 786, 6, 23, -1, 0, 786, 798, 1, 0, 0, 0, 787, 788, 5, 119, 0, 0, 788, 789, 3, 40, 20, 0, 789, 790, 5, 40, 0, 0, 790, 791, 6, 23, -1, 0, 791, 798, 1, 0, 0, 0, 792, 793, 5, 120, 0, 0, 793, 794, 3, 40, 20, 0, 794, 795, 5, 40, 0, 0, 795, 796, 6, 23, -1, 0, 796, 798, 1, 0, 0, 0, 797, 345, 1, 0, 0, 0, 797, 347, 1, 0, 0, 0, 797, 349, 1, 0, 0, 0, 797, 351, 1, 0, 0, 0, 797, 353, 1, 0, 0, 0, 797, 355, 1, 0, 0, 0, 797, 357, 1, 0, 0, 0, 797, 362, 1, 0, 0, 0, 797, 367, 1, 0, 0, 0, 797, 372, 1, 0, 0, 0, 797, 377, 1, 0, 0, 0, 797, 382, 1, 0, 0, 0, 797, 387, 1, 0, 0, 0, 797, 392, 1, 0, 0, 0, 797, 397, 1, 0, 0, 0, 797, 402, 1, 0, 0, 0, 797, 407, 1, 0, 0, 0, 797, 412, 1, 0, 0, 0, 797, 417, 1, 0, 0, 0, 797, 422, 1, 0, 0, 0, 797, 427, 1, 0, 0, 0, 797, 432, 1, 0, 0, 0, 797, 437, 1, 0, 0, 0, 797, 442, 1, 0, 0, 0, 797, 447, 1, 0, 0, 0, 797, 452, 1, 0, 0, 0, 797, 457, 1, 0, 0, 0, 797, 462, 1, 0, 0, 0, 797, 467, 1, 0, 0, 0, 797, 472, 1, 0, 0, 0, 797, 477, 1, 0, 0, 0, 797, 482, 1, 0, 0, 0, 797, 487, 1, 0, 0, 0, 797, 492, 1, 0, 0, 0, 797, 497, 1, 0, 0, 0, 797, 502, 1, 0, 0, 0, 797, 507, 1, 0, 0, 0, 797, 512, 1, 0, 0, 0, 797, 517, 1, 0, 0, 0, 797, 522, 1, 0, 0, 0, 797, 527, 1, 0, 0, 0, 797, 532, 1, 0, 0, 0, 797, 537, 1, 0, 0, 0, 797, 542, 1, 0, 0, 0, 797, 547, 1, 0, 0, 0, 797, 552, 1, 0, 0, 0, 797, 557, 1, 0, 0, 0, 797, 562, 1, 0, 0, 0, 797, 567, 1, 0, 0, 0, 797, 572, 1, 0, 0, 0, 797, 577, 1, 0, 0, 0, 797, 582, 1, 0, 0, 0, 797, 587, 1, 0, 0, 0, 797, 592, 1, 0, 0, 0, 797, 597, 1, 0, 0, 0, 797, 602, 1, 0, 0, 0, 797, 607, 1, 0, 0, 0, 797, 612, 1, 0, 0, 0, 797, 617, 1, 0, 0, 0, 797, 622, 1, 0, 0, 0, 797, 627, 1, 0, 0, 0, 797, 632, 1, 0, 0, 0, 797, 637, 1, 0, 0, 0, 797, 642, 1, 0, 0, 0, 797, 647, 1, 0, 0, 0, 797, 652, 1, 0, 0, 0, 797, 657, 1, 0, 0, 0, 797, 662, 1, 0, 0, 0, 797, 667, 1, 0, 0, 0, 797, 672, 1, 0, 0, 0, 797, 677, 1, 0, 0, 0, 797, 682, 1, 0, 0, 0, 797, 687, 1, 0, 0, 0, 797, 692, 1, 0, 0, 0, 797, 697, 1, 0, 0, 0, 797, 702, 1, 0, 0, 0, 797, 707, 1, 0, 0, 0, 797, 712, 1, 0, 0, 0, 797, 717, 1, 0, 0, 0, 797, 722, 1, 0, 0, 0, 797, 727, 1, 0, 0, 0, 797, 732, 1, 0, 0, 0, 797, 737, 1, 0, 0, 0, 797, 742, 1, 0, 0, 0, 797, 747, 1, 0, 0, 0, 797, 752, 1, 0, 0, 0, 797, 757, 1, 0, 0, 0, 797, 762, 1, 0, 0, 0, 797, 767, 1, 0, 0, 0, 797, 772, 1, 0, 0, 0, 797, 777, 1, 0, 0, 0, 797, 782, 1, 0, 0, 0, 797, 787, 1, 0, 0, 0, 797, 792, 1, 0, 0, 0, 798, 47, 1, 0, 0, 0, 799, 800, 3, 38, 19, 0, 800, 801, 5, 0, 0, 1, 801, 802, 6, 24, -1, 0, 802, 49, 1, 0, 0, 0, 35, 57, 65, 73, 75, 82, 92, 102, 107, 119, 121, 134, 136, 149, 151, 164, 166, 179, 181, 192, 217, 219, 228, 235, 248, 260, 262, 273, 286, 288, 301, 303, 314, 328, 331, 797] \ No newline at end of file +[4, 1, 127, 772, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 3, 0, 52, 8, 0, 1, 1, 1, 1, 1, 1, 1, 1, 4, 1, 58, 8, 1, 11, 1, 12, 1, 59, 1, 1, 1, 1, 1, 1, 1, 1, 4, 1, 66, 8, 1, 11, 1, 12, 1, 67, 3, 1, 70, 8, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 3, 2, 77, 8, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 3, 3, 87, 8, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 3, 3, 97, 8, 3, 1, 3, 1, 3, 1, 3, 3, 3, 102, 8, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 5, 4, 114, 8, 4, 10, 4, 12, 4, 117, 9, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 5, 5, 129, 8, 5, 10, 5, 12, 5, 132, 9, 5, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 5, 6, 144, 8, 6, 10, 6, 12, 6, 147, 9, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 5, 7, 167, 8, 7, 10, 7, 12, 7, 170, 9, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 5, 8, 178, 8, 8, 10, 8, 12, 8, 181, 9, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 3, 9, 197, 8, 9, 1, 9, 1, 9, 1, 9, 5, 9, 202, 8, 9, 10, 9, 12, 9, 205, 9, 9, 1, 9, 1, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 3, 10, 220, 8, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 5, 11, 232, 8, 11, 10, 11, 12, 11, 235, 9, 11, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 5, 12, 243, 8, 12, 10, 12, 12, 12, 246, 9, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 5, 13, 258, 8, 13, 10, 13, 12, 13, 261, 9, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 5, 14, 273, 8, 14, 10, 14, 12, 14, 276, 9, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 3, 15, 284, 8, 15, 1, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 5, 17, 295, 8, 17, 10, 17, 12, 17, 298, 9, 17, 3, 17, 300, 8, 17, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 3, 20, 766, 8, 20, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 0, 0, 22, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 0, 0, 880, 0, 51, 1, 0, 0, 0, 2, 69, 1, 0, 0, 0, 4, 71, 1, 0, 0, 0, 6, 101, 1, 0, 0, 0, 8, 103, 1, 0, 0, 0, 10, 118, 1, 0, 0, 0, 12, 133, 1, 0, 0, 0, 14, 148, 1, 0, 0, 0, 16, 171, 1, 0, 0, 0, 18, 182, 1, 0, 0, 0, 20, 219, 1, 0, 0, 0, 22, 221, 1, 0, 0, 0, 24, 236, 1, 0, 0, 0, 26, 247, 1, 0, 0, 0, 28, 262, 1, 0, 0, 0, 30, 277, 1, 0, 0, 0, 32, 285, 1, 0, 0, 0, 34, 299, 1, 0, 0, 0, 36, 301, 1, 0, 0, 0, 38, 307, 1, 0, 0, 0, 40, 765, 1, 0, 0, 0, 42, 767, 1, 0, 0, 0, 44, 45, 3, 40, 20, 0, 45, 46, 5, 1, 0, 0, 46, 47, 6, 0, -1, 0, 47, 52, 1, 0, 0, 0, 48, 49, 3, 40, 20, 0, 49, 50, 6, 0, -1, 0, 50, 52, 1, 0, 0, 0, 51, 44, 1, 0, 0, 0, 51, 48, 1, 0, 0, 0, 52, 1, 1, 0, 0, 0, 53, 54, 5, 2, 0, 0, 54, 55, 3, 0, 0, 0, 55, 56, 6, 1, -1, 0, 56, 58, 1, 0, 0, 0, 57, 53, 1, 0, 0, 0, 58, 59, 1, 0, 0, 0, 59, 57, 1, 0, 0, 0, 59, 60, 1, 0, 0, 0, 60, 70, 1, 0, 0, 0, 61, 62, 5, 2, 0, 0, 62, 63, 3, 6, 3, 0, 63, 64, 6, 1, -1, 0, 64, 66, 1, 0, 0, 0, 65, 61, 1, 0, 0, 0, 66, 67, 1, 0, 0, 0, 67, 65, 1, 0, 0, 0, 67, 68, 1, 0, 0, 0, 68, 70, 1, 0, 0, 0, 69, 57, 1, 0, 0, 0, 69, 65, 1, 0, 0, 0, 70, 3, 1, 0, 0, 0, 71, 72, 3, 0, 0, 0, 72, 76, 6, 2, -1, 0, 73, 74, 3, 2, 1, 0, 74, 75, 6, 2, -1, 0, 75, 77, 1, 0, 0, 0, 76, 73, 1, 0, 0, 0, 76, 77, 1, 0, 0, 0, 77, 5, 1, 0, 0, 0, 78, 79, 5, 3, 0, 0, 79, 80, 3, 4, 2, 0, 80, 81, 6, 3, -1, 0, 81, 87, 1, 0, 0, 0, 82, 83, 5, 4, 0, 0, 83, 84, 3, 4, 2, 0, 84, 85, 6, 3, -1, 0, 85, 87, 1, 0, 0, 0, 86, 78, 1, 0, 0, 0, 86, 82, 1, 0, 0, 0, 87, 102, 1, 0, 0, 0, 88, 89, 5, 3, 0, 0, 89, 90, 3, 6, 3, 0, 90, 91, 6, 3, -1, 0, 91, 97, 1, 0, 0, 0, 92, 93, 5, 4, 0, 0, 93, 94, 3, 6, 3, 0, 94, 95, 6, 3, -1, 0, 95, 97, 1, 0, 0, 0, 96, 88, 1, 0, 0, 0, 96, 92, 1, 0, 0, 0, 97, 102, 1, 0, 0, 0, 98, 99, 3, 4, 2, 0, 99, 100, 6, 3, -1, 0, 100, 102, 1, 0, 0, 0, 101, 86, 1, 0, 0, 0, 101, 96, 1, 0, 0, 0, 101, 98, 1, 0, 0, 0, 102, 7, 1, 0, 0, 0, 103, 104, 3, 6, 3, 0, 104, 115, 6, 4, -1, 0, 105, 106, 5, 5, 0, 0, 106, 107, 3, 6, 3, 0, 107, 108, 6, 4, -1, 0, 108, 114, 1, 0, 0, 0, 109, 110, 5, 6, 0, 0, 110, 111, 3, 6, 3, 0, 111, 112, 6, 4, -1, 0, 112, 114, 1, 0, 0, 0, 113, 105, 1, 0, 0, 0, 113, 109, 1, 0, 0, 0, 114, 117, 1, 0, 0, 0, 115, 113, 1, 0, 0, 0, 115, 116, 1, 0, 0, 0, 116, 9, 1, 0, 0, 0, 117, 115, 1, 0, 0, 0, 118, 119, 3, 8, 4, 0, 119, 130, 6, 5, -1, 0, 120, 121, 5, 4, 0, 0, 121, 122, 3, 8, 4, 0, 122, 123, 6, 5, -1, 0, 123, 129, 1, 0, 0, 0, 124, 125, 5, 3, 0, 0, 125, 126, 3, 8, 4, 0, 126, 127, 6, 5, -1, 0, 127, 129, 1, 0, 0, 0, 128, 120, 1, 0, 0, 0, 128, 124, 1, 0, 0, 0, 129, 132, 1, 0, 0, 0, 130, 128, 1, 0, 0, 0, 130, 131, 1, 0, 0, 0, 131, 11, 1, 0, 0, 0, 132, 130, 1, 0, 0, 0, 133, 134, 3, 10, 5, 0, 134, 145, 6, 6, -1, 0, 135, 136, 5, 7, 0, 0, 136, 137, 3, 10, 5, 0, 137, 138, 6, 6, -1, 0, 138, 144, 1, 0, 0, 0, 139, 140, 5, 8, 0, 0, 140, 141, 3, 10, 5, 0, 141, 142, 6, 6, -1, 0, 142, 144, 1, 0, 0, 0, 143, 135, 1, 0, 0, 0, 143, 139, 1, 0, 0, 0, 144, 147, 1, 0, 0, 0, 145, 143, 1, 0, 0, 0, 145, 146, 1, 0, 0, 0, 146, 13, 1, 0, 0, 0, 147, 145, 1, 0, 0, 0, 148, 149, 3, 12, 6, 0, 149, 168, 6, 7, -1, 0, 150, 151, 5, 9, 0, 0, 151, 152, 3, 12, 6, 0, 152, 153, 6, 7, -1, 0, 153, 167, 1, 0, 0, 0, 154, 155, 5, 10, 0, 0, 155, 156, 3, 12, 6, 0, 156, 157, 6, 7, -1, 0, 157, 167, 1, 0, 0, 0, 158, 159, 5, 11, 0, 0, 159, 160, 3, 12, 6, 0, 160, 161, 6, 7, -1, 0, 161, 167, 1, 0, 0, 0, 162, 163, 5, 12, 0, 0, 163, 164, 3, 12, 6, 0, 164, 165, 6, 7, -1, 0, 165, 167, 1, 0, 0, 0, 166, 150, 1, 0, 0, 0, 166, 154, 1, 0, 0, 0, 166, 158, 1, 0, 0, 0, 166, 162, 1, 0, 0, 0, 167, 170, 1, 0, 0, 0, 168, 166, 1, 0, 0, 0, 168, 169, 1, 0, 0, 0, 169, 15, 1, 0, 0, 0, 170, 168, 1, 0, 0, 0, 171, 172, 3, 14, 7, 0, 172, 179, 6, 8, -1, 0, 173, 174, 5, 13, 0, 0, 174, 175, 3, 14, 7, 0, 175, 176, 6, 8, -1, 0, 176, 178, 1, 0, 0, 0, 177, 173, 1, 0, 0, 0, 178, 181, 1, 0, 0, 0, 179, 177, 1, 0, 0, 0, 179, 180, 1, 0, 0, 0, 180, 17, 1, 0, 0, 0, 181, 179, 1, 0, 0, 0, 182, 183, 3, 16, 8, 0, 183, 203, 6, 9, -1, 0, 184, 185, 5, 14, 0, 0, 185, 197, 6, 9, -1, 0, 186, 187, 5, 15, 0, 0, 187, 197, 6, 9, -1, 0, 188, 189, 5, 16, 0, 0, 189, 197, 6, 9, -1, 0, 190, 191, 5, 17, 0, 0, 191, 197, 6, 9, -1, 0, 192, 193, 5, 18, 0, 0, 193, 197, 6, 9, -1, 0, 194, 195, 5, 19, 0, 0, 195, 197, 6, 9, -1, 0, 196, 184, 1, 0, 0, 0, 196, 186, 1, 0, 0, 0, 196, 188, 1, 0, 0, 0, 196, 190, 1, 0, 0, 0, 196, 192, 1, 0, 0, 0, 196, 194, 1, 0, 0, 0, 197, 198, 1, 0, 0, 0, 198, 199, 3, 16, 8, 0, 199, 200, 6, 9, -1, 0, 200, 202, 1, 0, 0, 0, 201, 196, 1, 0, 0, 0, 202, 205, 1, 0, 0, 0, 203, 201, 1, 0, 0, 0, 203, 204, 1, 0, 0, 0, 204, 206, 1, 0, 0, 0, 205, 203, 1, 0, 0, 0, 206, 207, 6, 9, -1, 0, 207, 19, 1, 0, 0, 0, 208, 209, 5, 20, 0, 0, 209, 210, 3, 18, 9, 0, 210, 211, 6, 10, -1, 0, 211, 220, 1, 0, 0, 0, 212, 213, 5, 20, 0, 0, 213, 214, 3, 20, 10, 0, 214, 215, 6, 10, -1, 0, 215, 220, 1, 0, 0, 0, 216, 217, 3, 18, 9, 0, 217, 218, 6, 10, -1, 0, 218, 220, 1, 0, 0, 0, 219, 208, 1, 0, 0, 0, 219, 212, 1, 0, 0, 0, 219, 216, 1, 0, 0, 0, 220, 21, 1, 0, 0, 0, 221, 222, 3, 20, 10, 0, 222, 233, 6, 11, -1, 0, 223, 224, 5, 21, 0, 0, 224, 225, 3, 20, 10, 0, 225, 226, 6, 11, -1, 0, 226, 232, 1, 0, 0, 0, 227, 228, 5, 22, 0, 0, 228, 229, 3, 20, 10, 0, 229, 230, 6, 11, -1, 0, 230, 232, 1, 0, 0, 0, 231, 223, 1, 0, 0, 0, 231, 227, 1, 0, 0, 0, 232, 235, 1, 0, 0, 0, 233, 231, 1, 0, 0, 0, 233, 234, 1, 0, 0, 0, 234, 23, 1, 0, 0, 0, 235, 233, 1, 0, 0, 0, 236, 237, 3, 22, 11, 0, 237, 244, 6, 12, -1, 0, 238, 239, 5, 23, 0, 0, 239, 240, 3, 22, 11, 0, 240, 241, 6, 12, -1, 0, 241, 243, 1, 0, 0, 0, 242, 238, 1, 0, 0, 0, 243, 246, 1, 0, 0, 0, 244, 242, 1, 0, 0, 0, 244, 245, 1, 0, 0, 0, 245, 25, 1, 0, 0, 0, 246, 244, 1, 0, 0, 0, 247, 248, 3, 24, 12, 0, 248, 259, 6, 13, -1, 0, 249, 250, 5, 24, 0, 0, 250, 251, 3, 24, 12, 0, 251, 252, 6, 13, -1, 0, 252, 258, 1, 0, 0, 0, 253, 254, 5, 25, 0, 0, 254, 255, 3, 24, 12, 0, 255, 256, 6, 13, -1, 0, 256, 258, 1, 0, 0, 0, 257, 249, 1, 0, 0, 0, 257, 253, 1, 0, 0, 0, 258, 261, 1, 0, 0, 0, 259, 257, 1, 0, 0, 0, 259, 260, 1, 0, 0, 0, 260, 27, 1, 0, 0, 0, 261, 259, 1, 0, 0, 0, 262, 263, 3, 26, 13, 0, 263, 274, 6, 14, -1, 0, 264, 265, 5, 26, 0, 0, 265, 266, 3, 26, 13, 0, 266, 267, 6, 14, -1, 0, 267, 273, 1, 0, 0, 0, 268, 269, 5, 27, 0, 0, 269, 270, 3, 26, 13, 0, 270, 271, 6, 14, -1, 0, 271, 273, 1, 0, 0, 0, 272, 264, 1, 0, 0, 0, 272, 268, 1, 0, 0, 0, 273, 276, 1, 0, 0, 0, 274, 272, 1, 0, 0, 0, 274, 275, 1, 0, 0, 0, 275, 29, 1, 0, 0, 0, 276, 274, 1, 0, 0, 0, 277, 278, 3, 28, 14, 0, 278, 283, 6, 15, -1, 0, 279, 280, 5, 28, 0, 0, 280, 281, 3, 30, 15, 0, 281, 282, 6, 15, -1, 0, 282, 284, 1, 0, 0, 0, 283, 279, 1, 0, 0, 0, 283, 284, 1, 0, 0, 0, 284, 31, 1, 0, 0, 0, 285, 286, 3, 30, 15, 0, 286, 287, 6, 16, -1, 0, 287, 33, 1, 0, 0, 0, 288, 289, 3, 32, 16, 0, 289, 296, 6, 17, -1, 0, 290, 291, 5, 29, 0, 0, 291, 292, 3, 32, 16, 0, 292, 293, 6, 17, -1, 0, 293, 295, 1, 0, 0, 0, 294, 290, 1, 0, 0, 0, 295, 298, 1, 0, 0, 0, 296, 294, 1, 0, 0, 0, 296, 297, 1, 0, 0, 0, 297, 300, 1, 0, 0, 0, 298, 296, 1, 0, 0, 0, 299, 288, 1, 0, 0, 0, 299, 300, 1, 0, 0, 0, 300, 35, 1, 0, 0, 0, 301, 302, 3, 32, 16, 0, 302, 303, 6, 18, -1, 0, 303, 304, 5, 30, 0, 0, 304, 305, 3, 32, 16, 0, 305, 306, 6, 18, -1, 0, 306, 37, 1, 0, 0, 0, 307, 308, 3, 32, 16, 0, 308, 309, 6, 19, -1, 0, 309, 310, 5, 31, 0, 0, 310, 311, 3, 32, 16, 0, 311, 312, 6, 19, -1, 0, 312, 39, 1, 0, 0, 0, 313, 314, 5, 32, 0, 0, 314, 766, 6, 20, -1, 0, 315, 316, 5, 33, 0, 0, 316, 766, 6, 20, -1, 0, 317, 318, 5, 122, 0, 0, 318, 766, 6, 20, -1, 0, 319, 320, 5, 124, 0, 0, 320, 766, 6, 20, -1, 0, 321, 322, 5, 123, 0, 0, 322, 766, 6, 20, -1, 0, 323, 324, 5, 125, 0, 0, 324, 766, 6, 20, -1, 0, 325, 326, 5, 34, 0, 0, 326, 327, 3, 32, 16, 0, 327, 328, 5, 35, 0, 0, 328, 329, 6, 20, -1, 0, 329, 766, 1, 0, 0, 0, 330, 331, 5, 36, 0, 0, 331, 332, 3, 34, 17, 0, 332, 333, 5, 37, 0, 0, 333, 334, 6, 20, -1, 0, 334, 766, 1, 0, 0, 0, 335, 336, 5, 36, 0, 0, 336, 337, 3, 34, 17, 0, 337, 338, 5, 38, 0, 0, 338, 339, 6, 20, -1, 0, 339, 766, 1, 0, 0, 0, 340, 341, 5, 39, 0, 0, 341, 342, 3, 36, 18, 0, 342, 343, 5, 40, 0, 0, 343, 344, 6, 20, -1, 0, 344, 766, 1, 0, 0, 0, 345, 346, 5, 36, 0, 0, 346, 347, 3, 36, 18, 0, 347, 348, 5, 40, 0, 0, 348, 349, 6, 20, -1, 0, 349, 766, 1, 0, 0, 0, 350, 351, 5, 36, 0, 0, 351, 352, 3, 36, 18, 0, 352, 353, 5, 38, 0, 0, 353, 354, 6, 20, -1, 0, 354, 766, 1, 0, 0, 0, 355, 356, 5, 39, 0, 0, 356, 357, 3, 36, 18, 0, 357, 358, 5, 38, 0, 0, 358, 359, 6, 20, -1, 0, 359, 766, 1, 0, 0, 0, 360, 361, 5, 39, 0, 0, 361, 362, 3, 32, 16, 0, 362, 363, 5, 40, 0, 0, 363, 364, 6, 20, -1, 0, 364, 766, 1, 0, 0, 0, 365, 366, 5, 41, 0, 0, 366, 367, 3, 38, 19, 0, 367, 368, 5, 42, 0, 0, 368, 369, 6, 20, -1, 0, 369, 766, 1, 0, 0, 0, 370, 371, 5, 41, 0, 0, 371, 372, 3, 34, 17, 0, 372, 373, 5, 42, 0, 0, 373, 374, 6, 20, -1, 0, 374, 766, 1, 0, 0, 0, 375, 376, 5, 43, 0, 0, 376, 377, 3, 34, 17, 0, 377, 378, 5, 40, 0, 0, 378, 379, 6, 20, -1, 0, 379, 766, 1, 0, 0, 0, 380, 381, 5, 44, 0, 0, 381, 382, 3, 34, 17, 0, 382, 383, 5, 40, 0, 0, 383, 384, 6, 20, -1, 0, 384, 766, 1, 0, 0, 0, 385, 386, 5, 45, 0, 0, 386, 387, 3, 34, 17, 0, 387, 388, 5, 40, 0, 0, 388, 389, 6, 20, -1, 0, 389, 766, 1, 0, 0, 0, 390, 391, 5, 46, 0, 0, 391, 392, 3, 34, 17, 0, 392, 393, 5, 40, 0, 0, 393, 394, 6, 20, -1, 0, 394, 766, 1, 0, 0, 0, 395, 396, 5, 47, 0, 0, 396, 397, 3, 34, 17, 0, 397, 398, 5, 40, 0, 0, 398, 399, 6, 20, -1, 0, 399, 766, 1, 0, 0, 0, 400, 401, 5, 48, 0, 0, 401, 402, 3, 34, 17, 0, 402, 403, 5, 40, 0, 0, 403, 404, 6, 20, -1, 0, 404, 766, 1, 0, 0, 0, 405, 406, 5, 49, 0, 0, 406, 407, 3, 34, 17, 0, 407, 408, 5, 40, 0, 0, 408, 409, 6, 20, -1, 0, 409, 766, 1, 0, 0, 0, 410, 411, 5, 50, 0, 0, 411, 412, 3, 34, 17, 0, 412, 413, 5, 40, 0, 0, 413, 414, 6, 20, -1, 0, 414, 766, 1, 0, 0, 0, 415, 416, 5, 51, 0, 0, 416, 417, 3, 34, 17, 0, 417, 418, 5, 40, 0, 0, 418, 419, 6, 20, -1, 0, 419, 766, 1, 0, 0, 0, 420, 421, 5, 52, 0, 0, 421, 422, 3, 34, 17, 0, 422, 423, 5, 40, 0, 0, 423, 424, 6, 20, -1, 0, 424, 766, 1, 0, 0, 0, 425, 426, 5, 53, 0, 0, 426, 427, 3, 34, 17, 0, 427, 428, 5, 40, 0, 0, 428, 429, 6, 20, -1, 0, 429, 766, 1, 0, 0, 0, 430, 431, 5, 54, 0, 0, 431, 432, 3, 34, 17, 0, 432, 433, 5, 40, 0, 0, 433, 434, 6, 20, -1, 0, 434, 766, 1, 0, 0, 0, 435, 436, 5, 55, 0, 0, 436, 437, 3, 34, 17, 0, 437, 438, 5, 40, 0, 0, 438, 439, 6, 20, -1, 0, 439, 766, 1, 0, 0, 0, 440, 441, 5, 56, 0, 0, 441, 442, 3, 34, 17, 0, 442, 443, 5, 40, 0, 0, 443, 444, 6, 20, -1, 0, 444, 766, 1, 0, 0, 0, 445, 446, 5, 57, 0, 0, 446, 447, 3, 34, 17, 0, 447, 448, 5, 40, 0, 0, 448, 449, 6, 20, -1, 0, 449, 766, 1, 0, 0, 0, 450, 451, 5, 58, 0, 0, 451, 452, 3, 34, 17, 0, 452, 453, 5, 40, 0, 0, 453, 454, 6, 20, -1, 0, 454, 766, 1, 0, 0, 0, 455, 456, 5, 59, 0, 0, 456, 457, 3, 34, 17, 0, 457, 458, 5, 40, 0, 0, 458, 459, 6, 20, -1, 0, 459, 766, 1, 0, 0, 0, 460, 461, 5, 60, 0, 0, 461, 462, 3, 34, 17, 0, 462, 463, 5, 40, 0, 0, 463, 464, 6, 20, -1, 0, 464, 766, 1, 0, 0, 0, 465, 466, 5, 61, 0, 0, 466, 467, 3, 34, 17, 0, 467, 468, 5, 40, 0, 0, 468, 469, 6, 20, -1, 0, 469, 766, 1, 0, 0, 0, 470, 471, 5, 62, 0, 0, 471, 472, 3, 34, 17, 0, 472, 473, 5, 40, 0, 0, 473, 474, 6, 20, -1, 0, 474, 766, 1, 0, 0, 0, 475, 476, 5, 63, 0, 0, 476, 477, 3, 34, 17, 0, 477, 478, 5, 40, 0, 0, 478, 479, 6, 20, -1, 0, 479, 766, 1, 0, 0, 0, 480, 481, 5, 64, 0, 0, 481, 482, 3, 34, 17, 0, 482, 483, 5, 40, 0, 0, 483, 484, 6, 20, -1, 0, 484, 766, 1, 0, 0, 0, 485, 486, 5, 65, 0, 0, 486, 487, 3, 34, 17, 0, 487, 488, 5, 40, 0, 0, 488, 489, 6, 20, -1, 0, 489, 766, 1, 0, 0, 0, 490, 491, 5, 66, 0, 0, 491, 492, 3, 34, 17, 0, 492, 493, 5, 40, 0, 0, 493, 494, 6, 20, -1, 0, 494, 766, 1, 0, 0, 0, 495, 496, 5, 67, 0, 0, 496, 497, 3, 34, 17, 0, 497, 498, 5, 40, 0, 0, 498, 499, 6, 20, -1, 0, 499, 766, 1, 0, 0, 0, 500, 501, 5, 68, 0, 0, 501, 502, 3, 34, 17, 0, 502, 503, 5, 40, 0, 0, 503, 504, 6, 20, -1, 0, 504, 766, 1, 0, 0, 0, 505, 506, 5, 69, 0, 0, 506, 507, 3, 34, 17, 0, 507, 508, 5, 40, 0, 0, 508, 509, 6, 20, -1, 0, 509, 766, 1, 0, 0, 0, 510, 511, 5, 70, 0, 0, 511, 512, 3, 34, 17, 0, 512, 513, 5, 40, 0, 0, 513, 514, 6, 20, -1, 0, 514, 766, 1, 0, 0, 0, 515, 516, 5, 71, 0, 0, 516, 517, 3, 34, 17, 0, 517, 518, 5, 40, 0, 0, 518, 519, 6, 20, -1, 0, 519, 766, 1, 0, 0, 0, 520, 521, 5, 72, 0, 0, 521, 522, 3, 34, 17, 0, 522, 523, 5, 40, 0, 0, 523, 524, 6, 20, -1, 0, 524, 766, 1, 0, 0, 0, 525, 526, 5, 73, 0, 0, 526, 527, 3, 34, 17, 0, 527, 528, 5, 40, 0, 0, 528, 529, 6, 20, -1, 0, 529, 766, 1, 0, 0, 0, 530, 531, 5, 74, 0, 0, 531, 532, 3, 34, 17, 0, 532, 533, 5, 40, 0, 0, 533, 534, 6, 20, -1, 0, 534, 766, 1, 0, 0, 0, 535, 536, 5, 75, 0, 0, 536, 537, 3, 34, 17, 0, 537, 538, 5, 40, 0, 0, 538, 539, 6, 20, -1, 0, 539, 766, 1, 0, 0, 0, 540, 541, 5, 76, 0, 0, 541, 542, 3, 34, 17, 0, 542, 543, 5, 40, 0, 0, 543, 544, 6, 20, -1, 0, 544, 766, 1, 0, 0, 0, 545, 546, 5, 77, 0, 0, 546, 547, 3, 34, 17, 0, 547, 548, 5, 40, 0, 0, 548, 549, 6, 20, -1, 0, 549, 766, 1, 0, 0, 0, 550, 551, 5, 78, 0, 0, 551, 552, 3, 34, 17, 0, 552, 553, 5, 40, 0, 0, 553, 554, 6, 20, -1, 0, 554, 766, 1, 0, 0, 0, 555, 556, 5, 79, 0, 0, 556, 557, 3, 34, 17, 0, 557, 558, 5, 40, 0, 0, 558, 559, 6, 20, -1, 0, 559, 766, 1, 0, 0, 0, 560, 561, 5, 80, 0, 0, 561, 562, 3, 34, 17, 0, 562, 563, 5, 40, 0, 0, 563, 564, 6, 20, -1, 0, 564, 766, 1, 0, 0, 0, 565, 566, 5, 81, 0, 0, 566, 567, 3, 34, 17, 0, 567, 568, 5, 40, 0, 0, 568, 569, 6, 20, -1, 0, 569, 766, 1, 0, 0, 0, 570, 571, 5, 82, 0, 0, 571, 572, 3, 34, 17, 0, 572, 573, 5, 40, 0, 0, 573, 574, 6, 20, -1, 0, 574, 766, 1, 0, 0, 0, 575, 576, 5, 83, 0, 0, 576, 577, 3, 34, 17, 0, 577, 578, 5, 40, 0, 0, 578, 579, 6, 20, -1, 0, 579, 766, 1, 0, 0, 0, 580, 581, 5, 84, 0, 0, 581, 582, 3, 34, 17, 0, 582, 583, 5, 40, 0, 0, 583, 584, 6, 20, -1, 0, 584, 766, 1, 0, 0, 0, 585, 586, 5, 85, 0, 0, 586, 587, 3, 34, 17, 0, 587, 588, 5, 40, 0, 0, 588, 589, 6, 20, -1, 0, 589, 766, 1, 0, 0, 0, 590, 591, 5, 86, 0, 0, 591, 592, 3, 34, 17, 0, 592, 593, 5, 40, 0, 0, 593, 594, 6, 20, -1, 0, 594, 766, 1, 0, 0, 0, 595, 596, 5, 87, 0, 0, 596, 597, 3, 34, 17, 0, 597, 598, 5, 40, 0, 0, 598, 599, 6, 20, -1, 0, 599, 766, 1, 0, 0, 0, 600, 601, 5, 88, 0, 0, 601, 602, 3, 34, 17, 0, 602, 603, 5, 40, 0, 0, 603, 604, 6, 20, -1, 0, 604, 766, 1, 0, 0, 0, 605, 606, 5, 89, 0, 0, 606, 607, 3, 34, 17, 0, 607, 608, 5, 40, 0, 0, 608, 609, 6, 20, -1, 0, 609, 766, 1, 0, 0, 0, 610, 611, 5, 90, 0, 0, 611, 612, 3, 34, 17, 0, 612, 613, 5, 40, 0, 0, 613, 614, 6, 20, -1, 0, 614, 766, 1, 0, 0, 0, 615, 616, 5, 91, 0, 0, 616, 617, 3, 34, 17, 0, 617, 618, 5, 40, 0, 0, 618, 619, 6, 20, -1, 0, 619, 766, 1, 0, 0, 0, 620, 621, 5, 92, 0, 0, 621, 622, 3, 34, 17, 0, 622, 623, 5, 40, 0, 0, 623, 624, 6, 20, -1, 0, 624, 766, 1, 0, 0, 0, 625, 626, 5, 93, 0, 0, 626, 627, 3, 34, 17, 0, 627, 628, 5, 40, 0, 0, 628, 629, 6, 20, -1, 0, 629, 766, 1, 0, 0, 0, 630, 631, 5, 94, 0, 0, 631, 632, 3, 34, 17, 0, 632, 633, 5, 40, 0, 0, 633, 634, 6, 20, -1, 0, 634, 766, 1, 0, 0, 0, 635, 636, 5, 95, 0, 0, 636, 637, 3, 34, 17, 0, 637, 638, 5, 40, 0, 0, 638, 639, 6, 20, -1, 0, 639, 766, 1, 0, 0, 0, 640, 641, 5, 96, 0, 0, 641, 642, 3, 34, 17, 0, 642, 643, 5, 40, 0, 0, 643, 644, 6, 20, -1, 0, 644, 766, 1, 0, 0, 0, 645, 646, 5, 97, 0, 0, 646, 647, 3, 34, 17, 0, 647, 648, 5, 40, 0, 0, 648, 649, 6, 20, -1, 0, 649, 766, 1, 0, 0, 0, 650, 651, 5, 98, 0, 0, 651, 652, 3, 34, 17, 0, 652, 653, 5, 40, 0, 0, 653, 654, 6, 20, -1, 0, 654, 766, 1, 0, 0, 0, 655, 656, 5, 99, 0, 0, 656, 657, 3, 34, 17, 0, 657, 658, 5, 40, 0, 0, 658, 659, 6, 20, -1, 0, 659, 766, 1, 0, 0, 0, 660, 661, 5, 100, 0, 0, 661, 662, 3, 34, 17, 0, 662, 663, 5, 40, 0, 0, 663, 664, 6, 20, -1, 0, 664, 766, 1, 0, 0, 0, 665, 666, 5, 101, 0, 0, 666, 667, 3, 34, 17, 0, 667, 668, 5, 40, 0, 0, 668, 669, 6, 20, -1, 0, 669, 766, 1, 0, 0, 0, 670, 671, 5, 102, 0, 0, 671, 672, 3, 34, 17, 0, 672, 673, 5, 40, 0, 0, 673, 674, 6, 20, -1, 0, 674, 766, 1, 0, 0, 0, 675, 676, 5, 103, 0, 0, 676, 677, 3, 34, 17, 0, 677, 678, 5, 40, 0, 0, 678, 679, 6, 20, -1, 0, 679, 766, 1, 0, 0, 0, 680, 681, 5, 104, 0, 0, 681, 682, 3, 34, 17, 0, 682, 683, 5, 40, 0, 0, 683, 684, 6, 20, -1, 0, 684, 766, 1, 0, 0, 0, 685, 686, 5, 105, 0, 0, 686, 687, 3, 34, 17, 0, 687, 688, 5, 40, 0, 0, 688, 689, 6, 20, -1, 0, 689, 766, 1, 0, 0, 0, 690, 691, 5, 106, 0, 0, 691, 692, 3, 34, 17, 0, 692, 693, 5, 40, 0, 0, 693, 694, 6, 20, -1, 0, 694, 766, 1, 0, 0, 0, 695, 696, 5, 107, 0, 0, 696, 697, 3, 34, 17, 0, 697, 698, 5, 40, 0, 0, 698, 699, 6, 20, -1, 0, 699, 766, 1, 0, 0, 0, 700, 701, 5, 108, 0, 0, 701, 702, 3, 34, 17, 0, 702, 703, 5, 40, 0, 0, 703, 704, 6, 20, -1, 0, 704, 766, 1, 0, 0, 0, 705, 706, 5, 109, 0, 0, 706, 707, 3, 34, 17, 0, 707, 708, 5, 40, 0, 0, 708, 709, 6, 20, -1, 0, 709, 766, 1, 0, 0, 0, 710, 711, 5, 110, 0, 0, 711, 712, 3, 34, 17, 0, 712, 713, 5, 40, 0, 0, 713, 714, 6, 20, -1, 0, 714, 766, 1, 0, 0, 0, 715, 716, 5, 111, 0, 0, 716, 717, 3, 34, 17, 0, 717, 718, 5, 40, 0, 0, 718, 719, 6, 20, -1, 0, 719, 766, 1, 0, 0, 0, 720, 721, 5, 112, 0, 0, 721, 722, 3, 34, 17, 0, 722, 723, 5, 40, 0, 0, 723, 724, 6, 20, -1, 0, 724, 766, 1, 0, 0, 0, 725, 726, 5, 113, 0, 0, 726, 727, 3, 34, 17, 0, 727, 728, 5, 40, 0, 0, 728, 729, 6, 20, -1, 0, 729, 766, 1, 0, 0, 0, 730, 731, 5, 114, 0, 0, 731, 732, 3, 34, 17, 0, 732, 733, 5, 40, 0, 0, 733, 734, 6, 20, -1, 0, 734, 766, 1, 0, 0, 0, 735, 736, 5, 115, 0, 0, 736, 737, 3, 34, 17, 0, 737, 738, 5, 40, 0, 0, 738, 739, 6, 20, -1, 0, 739, 766, 1, 0, 0, 0, 740, 741, 5, 116, 0, 0, 741, 742, 3, 34, 17, 0, 742, 743, 5, 40, 0, 0, 743, 744, 6, 20, -1, 0, 744, 766, 1, 0, 0, 0, 745, 746, 5, 117, 0, 0, 746, 747, 3, 34, 17, 0, 747, 748, 5, 40, 0, 0, 748, 749, 6, 20, -1, 0, 749, 766, 1, 0, 0, 0, 750, 751, 5, 118, 0, 0, 751, 752, 3, 34, 17, 0, 752, 753, 5, 40, 0, 0, 753, 754, 6, 20, -1, 0, 754, 766, 1, 0, 0, 0, 755, 756, 5, 119, 0, 0, 756, 757, 3, 34, 17, 0, 757, 758, 5, 40, 0, 0, 758, 759, 6, 20, -1, 0, 759, 766, 1, 0, 0, 0, 760, 761, 5, 120, 0, 0, 761, 762, 3, 34, 17, 0, 762, 763, 5, 40, 0, 0, 763, 764, 6, 20, -1, 0, 764, 766, 1, 0, 0, 0, 765, 313, 1, 0, 0, 0, 765, 315, 1, 0, 0, 0, 765, 317, 1, 0, 0, 0, 765, 319, 1, 0, 0, 0, 765, 321, 1, 0, 0, 0, 765, 323, 1, 0, 0, 0, 765, 325, 1, 0, 0, 0, 765, 330, 1, 0, 0, 0, 765, 335, 1, 0, 0, 0, 765, 340, 1, 0, 0, 0, 765, 345, 1, 0, 0, 0, 765, 350, 1, 0, 0, 0, 765, 355, 1, 0, 0, 0, 765, 360, 1, 0, 0, 0, 765, 365, 1, 0, 0, 0, 765, 370, 1, 0, 0, 0, 765, 375, 1, 0, 0, 0, 765, 380, 1, 0, 0, 0, 765, 385, 1, 0, 0, 0, 765, 390, 1, 0, 0, 0, 765, 395, 1, 0, 0, 0, 765, 400, 1, 0, 0, 0, 765, 405, 1, 0, 0, 0, 765, 410, 1, 0, 0, 0, 765, 415, 1, 0, 0, 0, 765, 420, 1, 0, 0, 0, 765, 425, 1, 0, 0, 0, 765, 430, 1, 0, 0, 0, 765, 435, 1, 0, 0, 0, 765, 440, 1, 0, 0, 0, 765, 445, 1, 0, 0, 0, 765, 450, 1, 0, 0, 0, 765, 455, 1, 0, 0, 0, 765, 460, 1, 0, 0, 0, 765, 465, 1, 0, 0, 0, 765, 470, 1, 0, 0, 0, 765, 475, 1, 0, 0, 0, 765, 480, 1, 0, 0, 0, 765, 485, 1, 0, 0, 0, 765, 490, 1, 0, 0, 0, 765, 495, 1, 0, 0, 0, 765, 500, 1, 0, 0, 0, 765, 505, 1, 0, 0, 0, 765, 510, 1, 0, 0, 0, 765, 515, 1, 0, 0, 0, 765, 520, 1, 0, 0, 0, 765, 525, 1, 0, 0, 0, 765, 530, 1, 0, 0, 0, 765, 535, 1, 0, 0, 0, 765, 540, 1, 0, 0, 0, 765, 545, 1, 0, 0, 0, 765, 550, 1, 0, 0, 0, 765, 555, 1, 0, 0, 0, 765, 560, 1, 0, 0, 0, 765, 565, 1, 0, 0, 0, 765, 570, 1, 0, 0, 0, 765, 575, 1, 0, 0, 0, 765, 580, 1, 0, 0, 0, 765, 585, 1, 0, 0, 0, 765, 590, 1, 0, 0, 0, 765, 595, 1, 0, 0, 0, 765, 600, 1, 0, 0, 0, 765, 605, 1, 0, 0, 0, 765, 610, 1, 0, 0, 0, 765, 615, 1, 0, 0, 0, 765, 620, 1, 0, 0, 0, 765, 625, 1, 0, 0, 0, 765, 630, 1, 0, 0, 0, 765, 635, 1, 0, 0, 0, 765, 640, 1, 0, 0, 0, 765, 645, 1, 0, 0, 0, 765, 650, 1, 0, 0, 0, 765, 655, 1, 0, 0, 0, 765, 660, 1, 0, 0, 0, 765, 665, 1, 0, 0, 0, 765, 670, 1, 0, 0, 0, 765, 675, 1, 0, 0, 0, 765, 680, 1, 0, 0, 0, 765, 685, 1, 0, 0, 0, 765, 690, 1, 0, 0, 0, 765, 695, 1, 0, 0, 0, 765, 700, 1, 0, 0, 0, 765, 705, 1, 0, 0, 0, 765, 710, 1, 0, 0, 0, 765, 715, 1, 0, 0, 0, 765, 720, 1, 0, 0, 0, 765, 725, 1, 0, 0, 0, 765, 730, 1, 0, 0, 0, 765, 735, 1, 0, 0, 0, 765, 740, 1, 0, 0, 0, 765, 745, 1, 0, 0, 0, 765, 750, 1, 0, 0, 0, 765, 755, 1, 0, 0, 0, 765, 760, 1, 0, 0, 0, 766, 41, 1, 0, 0, 0, 767, 768, 3, 32, 16, 0, 768, 769, 5, 0, 0, 1, 769, 770, 6, 21, -1, 0, 770, 43, 1, 0, 0, 0, 31, 51, 59, 67, 69, 76, 86, 96, 101, 113, 115, 128, 130, 143, 145, 166, 168, 179, 196, 203, 219, 231, 233, 244, 257, 259, 272, 274, 283, 296, 299, 765] \ No newline at end of file diff --git a/Sources/AngouriMath/Core/Antlr/AngouriMath.tokens b/Sources/AngouriMath/Core/Antlr/AngouriMath.tokens index 4eb67b898..4e3c5f209 100644 --- a/Sources/AngouriMath/Core/Antlr/AngouriMath.tokens +++ b/Sources/AngouriMath/Core/Antlr/AngouriMath.tokens @@ -142,8 +142,8 @@ WS=127 '<='=15 '>'=16 '<'=17 -'equalizes'=18 -'='=19 +'='=18 +'<>'=19 'not'=20 'and'=21 '&'=22 diff --git a/Sources/AngouriMath/Core/Antlr/AngouriMathBaseListener.cs b/Sources/AngouriMath/Core/Antlr/AngouriMathBaseListener.cs index 2454ab59d..28ed89a4f 100644 --- a/Sources/AngouriMath/Core/Antlr/AngouriMathBaseListener.cs +++ b/Sources/AngouriMath/Core/Antlr/AngouriMathBaseListener.cs @@ -121,29 +121,17 @@ public virtual void EnterSet_operator_intersection([NotNull] AngouriMathParser.S /// The parse tree. public virtual void ExitSet_operator_intersection([NotNull] AngouriMathParser.Set_operator_intersectionContext context) { } /// - /// Enter a parse tree produced by . + /// Enter a parse tree produced by . /// The default implementation does nothing. /// /// The parse tree. - public virtual void EnterSet_operator_union([NotNull] AngouriMathParser.Set_operator_unionContext context) { } + public virtual void EnterSet_operator_union_setsubtraction([NotNull] AngouriMathParser.Set_operator_union_setsubtractionContext context) { } /// - /// Exit a parse tree produced by . + /// Exit a parse tree produced by . /// The default implementation does nothing. /// /// The parse tree. - public virtual void ExitSet_operator_union([NotNull] AngouriMathParser.Set_operator_unionContext context) { } - /// - /// Enter a parse tree produced by . - /// The default implementation does nothing. - /// - /// The parse tree. - public virtual void EnterSet_operator_setsubtraction([NotNull] AngouriMathParser.Set_operator_setsubtractionContext context) { } - /// - /// Exit a parse tree produced by . - /// The default implementation does nothing. - /// - /// The parse tree. - public virtual void ExitSet_operator_setsubtraction([NotNull] AngouriMathParser.Set_operator_setsubtractionContext context) { } + public virtual void ExitSet_operator_union_setsubtraction([NotNull] AngouriMathParser.Set_operator_union_setsubtractionContext context) { } /// /// Enter a parse tree produced by . /// The default implementation does nothing. @@ -157,41 +145,17 @@ public virtual void EnterIn_operator([NotNull] AngouriMathParser.In_operatorCont /// The parse tree. public virtual void ExitIn_operator([NotNull] AngouriMathParser.In_operatorContext context) { } /// - /// Enter a parse tree produced by . - /// The default implementation does nothing. - /// - /// The parse tree. - public virtual void EnterInequality_expression([NotNull] AngouriMathParser.Inequality_expressionContext context) { } - /// - /// Exit a parse tree produced by . - /// The default implementation does nothing. - /// - /// The parse tree. - public virtual void ExitInequality_expression([NotNull] AngouriMathParser.Inequality_expressionContext context) { } - /// - /// Enter a parse tree produced by . - /// The default implementation does nothing. - /// - /// The parse tree. - public virtual void EnterTerms_list([NotNull] AngouriMathParser.Terms_listContext context) { } - /// - /// Exit a parse tree produced by . - /// The default implementation does nothing. - /// - /// The parse tree. - public virtual void ExitTerms_list([NotNull] AngouriMathParser.Terms_listContext context) { } - /// - /// Enter a parse tree produced by . + /// Enter a parse tree produced by . /// The default implementation does nothing. /// /// The parse tree. - public virtual void EnterEquality_expression([NotNull] AngouriMathParser.Equality_expressionContext context) { } + public virtual void EnterComparison_expression([NotNull] AngouriMathParser.Comparison_expressionContext context) { } /// - /// Exit a parse tree produced by . + /// Exit a parse tree produced by . /// The default implementation does nothing. /// /// The parse tree. - public virtual void ExitEquality_expression([NotNull] AngouriMathParser.Equality_expressionContext context) { } + public virtual void ExitComparison_expression([NotNull] AngouriMathParser.Comparison_expressionContext context) { } /// /// Enter a parse tree produced by . /// The default implementation does nothing. diff --git a/Sources/AngouriMath/Core/Antlr/AngouriMathLexer.cs b/Sources/AngouriMath/Core/Antlr/AngouriMathLexer.cs index 67be7876c..16aaeef1b 100644 --- a/Sources/AngouriMath/Core/Antlr/AngouriMathLexer.cs +++ b/Sources/AngouriMath/Core/Antlr/AngouriMathLexer.cs @@ -101,13 +101,13 @@ public AngouriMathLexer(ICharStream input, TextWriter output, TextWriter errorOu private static readonly string[] _LiteralNames = { null, "'!'", "'^'", "'-'", "'+'", "'*'", "'/'", "'intersect'", "'/\\'", "'unite'", "'\\/'", "'setsubtract'", "'\\'", "'in'", "'>='", "'<='", "'>'", - "'<'", "'equalizes'", "'='", "'not'", "'and'", "'&'", "'xor'", "'or'", - "'|'", "'implies'", "'->'", "'provided'", "','", "';'", "':'", "'+oo'", - "'-oo'", "'(|'", "'|)'", "'['", "']T'", "']'", "'('", "')'", "'{'", "'}'", - "'log('", "'sqrt('", "'cbrt('", "'sqr('", "'ln('", "'sin('", "'cos('", - "'tan('", "'cotan('", "'cot('", "'sec('", "'cosec('", "'csc('", "'arcsin('", - "'arccos('", "'arctan('", "'arccotan('", "'arcsec('", "'arccosec('", "'arccsc('", - "'acsc('", "'asin('", "'acos('", "'atan('", "'acotan('", "'asec('", "'acosec('", + "'<'", "'='", "'<>'", "'not'", "'and'", "'&'", "'xor'", "'or'", "'|'", + "'implies'", "'->'", "'provided'", "','", "';'", "':'", "'+oo'", "'-oo'", + "'(|'", "'|)'", "'['", "']T'", "']'", "'('", "')'", "'{'", "'}'", "'log('", + "'sqrt('", "'cbrt('", "'sqr('", "'ln('", "'sin('", "'cos('", "'tan('", + "'cotan('", "'cot('", "'sec('", "'cosec('", "'csc('", "'arcsin('", "'arccos('", + "'arctan('", "'arccotan('", "'arcsec('", "'arccosec('", "'arccsc('", "'acsc('", + "'asin('", "'acos('", "'atan('", "'acotan('", "'asec('", "'acosec('", "'acot('", "'arccot('", "'sinh('", "'sh('", "'cosh('", "'ch('", "'tanh('", "'th('", "'cotanh('", "'coth('", "'cth('", "'sech('", "'sch('", "'cosech('", "'csch('", "'asinh('", "'arsinh('", "'arsh('", "'acosh('", "'arcosh('", @@ -160,7 +160,7 @@ static AngouriMathLexer() { } } private static int[] _serializedATN = { - 4,0,127,1084,6,-1,2,0,7,0,2,1,7,1,2,2,7,2,2,3,7,3,2,4,7,4,2,5,7,5,2,6, + 4,0,127,1077,6,-1,2,0,7,0,2,1,7,1,2,2,7,2,2,3,7,3,2,4,7,4,2,5,7,5,2,6, 7,6,2,7,7,7,2,8,7,8,2,9,7,9,2,10,7,10,2,11,7,11,2,12,7,12,2,13,7,13,2, 14,7,14,2,15,7,15,2,16,7,16,2,17,7,17,2,18,7,18,2,19,7,19,2,20,7,20,2, 21,7,21,2,22,7,22,2,23,7,23,2,24,7,24,2,25,7,25,2,26,7,26,2,27,7,27,2, @@ -182,345 +182,343 @@ static AngouriMathLexer() { 1,0,1,1,1,1,1,2,1,2,1,3,1,3,1,4,1,4,1,5,1,5,1,6,1,6,1,6,1,6,1,6,1,6,1, 6,1,6,1,6,1,6,1,7,1,7,1,7,1,8,1,8,1,8,1,8,1,8,1,8,1,9,1,9,1,9,1,10,1,10, 1,10,1,10,1,10,1,10,1,10,1,10,1,10,1,10,1,10,1,10,1,11,1,11,1,12,1,12, - 1,12,1,13,1,13,1,13,1,14,1,14,1,14,1,15,1,15,1,16,1,16,1,17,1,17,1,17, - 1,17,1,17,1,17,1,17,1,17,1,17,1,17,1,18,1,18,1,19,1,19,1,19,1,19,1,20, - 1,20,1,20,1,20,1,21,1,21,1,22,1,22,1,22,1,22,1,23,1,23,1,23,1,24,1,24, - 1,25,1,25,1,25,1,25,1,25,1,25,1,25,1,25,1,26,1,26,1,26,1,27,1,27,1,27, - 1,27,1,27,1,27,1,27,1,27,1,27,1,28,1,28,1,29,1,29,1,30,1,30,1,31,1,31, - 1,31,1,31,1,32,1,32,1,32,1,32,1,33,1,33,1,33,1,34,1,34,1,34,1,35,1,35, - 1,36,1,36,1,36,1,37,1,37,1,38,1,38,1,39,1,39,1,40,1,40,1,41,1,41,1,42, - 1,42,1,42,1,42,1,42,1,43,1,43,1,43,1,43,1,43,1,43,1,44,1,44,1,44,1,44, - 1,44,1,44,1,45,1,45,1,45,1,45,1,45,1,46,1,46,1,46,1,46,1,47,1,47,1,47, - 1,47,1,47,1,48,1,48,1,48,1,48,1,48,1,49,1,49,1,49,1,49,1,49,1,50,1,50, - 1,50,1,50,1,50,1,50,1,50,1,51,1,51,1,51,1,51,1,51,1,52,1,52,1,52,1,52, - 1,52,1,53,1,53,1,53,1,53,1,53,1,53,1,53,1,54,1,54,1,54,1,54,1,54,1,55, - 1,55,1,55,1,55,1,55,1,55,1,55,1,55,1,56,1,56,1,56,1,56,1,56,1,56,1,56, - 1,56,1,57,1,57,1,57,1,57,1,57,1,57,1,57,1,57,1,58,1,58,1,58,1,58,1,58, - 1,58,1,58,1,58,1,58,1,58,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,60, - 1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,61,1,61,1,61,1,61,1,61, - 1,61,1,61,1,61,1,62,1,62,1,62,1,62,1,62,1,62,1,63,1,63,1,63,1,63,1,63, - 1,63,1,64,1,64,1,64,1,64,1,64,1,64,1,65,1,65,1,65,1,65,1,65,1,65,1,66, - 1,66,1,66,1,66,1,66,1,66,1,66,1,66,1,67,1,67,1,67,1,67,1,67,1,67,1,68, - 1,68,1,68,1,68,1,68,1,68,1,68,1,68,1,69,1,69,1,69,1,69,1,69,1,69,1,70, - 1,70,1,70,1,70,1,70,1,70,1,70,1,70,1,71,1,71,1,71,1,71,1,71,1,71,1,72, - 1,72,1,72,1,72,1,73,1,73,1,73,1,73,1,73,1,73,1,74,1,74,1,74,1,74,1,75, - 1,75,1,75,1,75,1,75,1,75,1,76,1,76,1,76,1,76,1,77,1,77,1,77,1,77,1,77, - 1,77,1,77,1,77,1,78,1,78,1,78,1,78,1,78,1,78,1,79,1,79,1,79,1,79,1,79, - 1,80,1,80,1,80,1,80,1,80,1,80,1,81,1,81,1,81,1,81,1,81,1,82,1,82,1,82, - 1,82,1,82,1,82,1,82,1,82,1,83,1,83,1,83,1,83,1,83,1,83,1,84,1,84,1,84, - 1,84,1,84,1,84,1,84,1,85,1,85,1,85,1,85,1,85,1,85,1,85,1,85,1,86,1,86, - 1,86,1,86,1,86,1,86,1,87,1,87,1,87,1,87,1,87,1,87,1,87,1,88,1,88,1,88, - 1,88,1,88,1,88,1,88,1,88,1,89,1,89,1,89,1,89,1,89,1,89,1,90,1,90,1,90, - 1,90,1,90,1,90,1,90,1,91,1,91,1,91,1,91,1,91,1,91,1,91,1,91,1,92,1,92, - 1,92,1,92,1,92,1,92,1,93,1,93,1,93,1,93,1,93,1,93,1,93,1,94,1,94,1,94, - 1,94,1,94,1,94,1,94,1,94,1,95,1,95,1,95,1,95,1,95,1,95,1,95,1,95,1,95, - 1,96,1,96,1,96,1,96,1,96,1,96,1,96,1,96,1,96,1,96,1,97,1,97,1,97,1,97, - 1,97,1,97,1,97,1,98,1,98,1,98,1,98,1,98,1,98,1,98,1,99,1,99,1,99,1,99, - 1,99,1,99,1,99,1,99,1,100,1,100,1,100,1,100,1,100,1,100,1,100,1,101,1, - 101,1,101,1,101,1,101,1,101,1,101,1,101,1,101,1,102,1,102,1,102,1,102, - 1,102,1,102,1,102,1,102,1,102,1,102,1,103,1,103,1,103,1,103,1,103,1,103, - 1,103,1,103,1,104,1,104,1,104,1,104,1,104,1,104,1,104,1,105,1,105,1,105, - 1,105,1,105,1,105,1,105,1,106,1,106,1,106,1,106,1,106,1,106,1,106,1,106, - 1,106,1,106,1,106,1,106,1,107,1,107,1,107,1,107,1,107,1,107,1,107,1,107, - 1,107,1,107,1,108,1,108,1,108,1,108,1,108,1,108,1,108,1,109,1,109,1,109, - 1,109,1,109,1,109,1,109,1,109,1,109,1,109,1,109,1,110,1,110,1,110,1,110, - 1,110,1,110,1,110,1,110,1,110,1,110,1,110,1,110,1,111,1,111,1,111,1,111, - 1,111,1,111,1,111,1,111,1,112,1,112,1,112,1,112,1,112,1,113,1,113,1,113, - 1,113,1,113,1,113,1,114,1,114,1,114,1,114,1,114,1,115,1,115,1,115,1,115, - 1,115,1,116,1,116,1,116,1,116,1,116,1,116,1,116,1,116,1,117,1,117,1,117, - 1,117,1,117,1,117,1,117,1,117,1,117,1,117,1,117,1,118,1,118,1,118,1,118, - 1,118,1,118,1,118,1,119,1,119,1,119,1,119,1,119,1,119,1,119,1,119,1,120, - 3,120,952,8,120,1,120,4,120,955,8,120,11,120,12,120,956,1,120,1,120,1, - 121,1,121,3,121,963,8,121,1,121,4,121,966,8,121,11,121,12,121,967,1,122, - 4,122,971,8,122,11,122,12,122,972,1,122,1,122,5,122,977,8,122,10,122,12, - 122,980,9,122,1,122,3,122,983,8,122,1,122,3,122,986,8,122,1,122,3,122, - 989,8,122,1,122,4,122,992,8,122,11,122,12,122,993,1,122,3,122,997,8,122, - 1,122,3,122,1000,8,122,1,122,3,122,1003,8,122,1,123,1,123,1,123,1,123, - 1,123,1,123,1,123,1,123,1,123,1,123,3,123,1015,8,123,1,124,1,124,1,124, - 1,124,1,124,1,124,1,124,1,124,1,124,1,124,1,124,1,124,1,124,1,124,1,124, - 1,124,1,124,1,124,3,124,1035,8,124,1,125,4,125,1038,8,125,11,125,12,125, - 1039,1,125,1,125,4,125,1044,8,125,11,125,12,125,1045,3,125,1048,8,125, - 1,126,1,126,1,126,1,126,5,126,1054,8,126,10,126,12,126,1057,9,126,1,126, - 3,126,1060,8,126,1,126,1,126,1,126,1,126,1,126,5,126,1067,8,126,10,126, - 12,126,1070,9,126,1,126,1,126,3,126,1074,8,126,1,126,1,126,1,127,4,127, - 1079,8,127,11,127,12,127,1080,1,127,1,127,1,1068,0,128,1,1,3,2,5,3,7,4, - 9,5,11,6,13,7,15,8,17,9,19,10,21,11,23,12,25,13,27,14,29,15,31,16,33,17, - 35,18,37,19,39,20,41,21,43,22,45,23,47,24,49,25,51,26,53,27,55,28,57,29, - 59,30,61,31,63,32,65,33,67,34,69,35,71,36,73,37,75,38,77,39,79,40,81,41, - 83,42,85,43,87,44,89,45,91,46,93,47,95,48,97,49,99,50,101,51,103,52,105, - 53,107,54,109,55,111,56,113,57,115,58,117,59,119,60,121,61,123,62,125, - 63,127,64,129,65,131,66,133,67,135,68,137,69,139,70,141,71,143,72,145, - 73,147,74,149,75,151,76,153,77,155,78,157,79,159,80,161,81,163,82,165, - 83,167,84,169,85,171,86,173,87,175,88,177,89,179,90,181,91,183,92,185, - 93,187,94,189,95,191,96,193,97,195,98,197,99,199,100,201,101,203,102,205, - 103,207,104,209,105,211,106,213,107,215,108,217,109,219,110,221,111,223, - 112,225,113,227,114,229,115,231,116,233,117,235,118,237,119,239,120,241, - 121,243,0,245,122,247,123,249,124,251,125,253,126,255,127,1,0,6,2,0,69, - 69,101,101,2,0,43,43,45,45,4,0,65,90,97,122,880,1279,7936,8191,5,0,48, - 57,65,90,97,122,880,1279,7936,8191,2,0,10,10,13,13,2,0,9,9,32,32,1111, - 0,1,1,0,0,0,0,3,1,0,0,0,0,5,1,0,0,0,0,7,1,0,0,0,0,9,1,0,0,0,0,11,1,0,0, - 0,0,13,1,0,0,0,0,15,1,0,0,0,0,17,1,0,0,0,0,19,1,0,0,0,0,21,1,0,0,0,0,23, - 1,0,0,0,0,25,1,0,0,0,0,27,1,0,0,0,0,29,1,0,0,0,0,31,1,0,0,0,0,33,1,0,0, - 0,0,35,1,0,0,0,0,37,1,0,0,0,0,39,1,0,0,0,0,41,1,0,0,0,0,43,1,0,0,0,0,45, - 1,0,0,0,0,47,1,0,0,0,0,49,1,0,0,0,0,51,1,0,0,0,0,53,1,0,0,0,0,55,1,0,0, - 0,0,57,1,0,0,0,0,59,1,0,0,0,0,61,1,0,0,0,0,63,1,0,0,0,0,65,1,0,0,0,0,67, - 1,0,0,0,0,69,1,0,0,0,0,71,1,0,0,0,0,73,1,0,0,0,0,75,1,0,0,0,0,77,1,0,0, - 0,0,79,1,0,0,0,0,81,1,0,0,0,0,83,1,0,0,0,0,85,1,0,0,0,0,87,1,0,0,0,0,89, - 1,0,0,0,0,91,1,0,0,0,0,93,1,0,0,0,0,95,1,0,0,0,0,97,1,0,0,0,0,99,1,0,0, - 0,0,101,1,0,0,0,0,103,1,0,0,0,0,105,1,0,0,0,0,107,1,0,0,0,0,109,1,0,0, - 0,0,111,1,0,0,0,0,113,1,0,0,0,0,115,1,0,0,0,0,117,1,0,0,0,0,119,1,0,0, - 0,0,121,1,0,0,0,0,123,1,0,0,0,0,125,1,0,0,0,0,127,1,0,0,0,0,129,1,0,0, - 0,0,131,1,0,0,0,0,133,1,0,0,0,0,135,1,0,0,0,0,137,1,0,0,0,0,139,1,0,0, - 0,0,141,1,0,0,0,0,143,1,0,0,0,0,145,1,0,0,0,0,147,1,0,0,0,0,149,1,0,0, - 0,0,151,1,0,0,0,0,153,1,0,0,0,0,155,1,0,0,0,0,157,1,0,0,0,0,159,1,0,0, - 0,0,161,1,0,0,0,0,163,1,0,0,0,0,165,1,0,0,0,0,167,1,0,0,0,0,169,1,0,0, - 0,0,171,1,0,0,0,0,173,1,0,0,0,0,175,1,0,0,0,0,177,1,0,0,0,0,179,1,0,0, - 0,0,181,1,0,0,0,0,183,1,0,0,0,0,185,1,0,0,0,0,187,1,0,0,0,0,189,1,0,0, - 0,0,191,1,0,0,0,0,193,1,0,0,0,0,195,1,0,0,0,0,197,1,0,0,0,0,199,1,0,0, - 0,0,201,1,0,0,0,0,203,1,0,0,0,0,205,1,0,0,0,0,207,1,0,0,0,0,209,1,0,0, - 0,0,211,1,0,0,0,0,213,1,0,0,0,0,215,1,0,0,0,0,217,1,0,0,0,0,219,1,0,0, - 0,0,221,1,0,0,0,0,223,1,0,0,0,0,225,1,0,0,0,0,227,1,0,0,0,0,229,1,0,0, - 0,0,231,1,0,0,0,0,233,1,0,0,0,0,235,1,0,0,0,0,237,1,0,0,0,0,239,1,0,0, - 0,0,241,1,0,0,0,0,245,1,0,0,0,0,247,1,0,0,0,0,249,1,0,0,0,0,251,1,0,0, - 0,0,253,1,0,0,0,0,255,1,0,0,0,1,257,1,0,0,0,3,259,1,0,0,0,5,261,1,0,0, - 0,7,263,1,0,0,0,9,265,1,0,0,0,11,267,1,0,0,0,13,269,1,0,0,0,15,279,1,0, - 0,0,17,282,1,0,0,0,19,288,1,0,0,0,21,291,1,0,0,0,23,303,1,0,0,0,25,305, - 1,0,0,0,27,308,1,0,0,0,29,311,1,0,0,0,31,314,1,0,0,0,33,316,1,0,0,0,35, - 318,1,0,0,0,37,328,1,0,0,0,39,330,1,0,0,0,41,334,1,0,0,0,43,338,1,0,0, - 0,45,340,1,0,0,0,47,344,1,0,0,0,49,347,1,0,0,0,51,349,1,0,0,0,53,357,1, - 0,0,0,55,360,1,0,0,0,57,369,1,0,0,0,59,371,1,0,0,0,61,373,1,0,0,0,63,375, - 1,0,0,0,65,379,1,0,0,0,67,383,1,0,0,0,69,386,1,0,0,0,71,389,1,0,0,0,73, - 391,1,0,0,0,75,394,1,0,0,0,77,396,1,0,0,0,79,398,1,0,0,0,81,400,1,0,0, - 0,83,402,1,0,0,0,85,404,1,0,0,0,87,409,1,0,0,0,89,415,1,0,0,0,91,421,1, - 0,0,0,93,426,1,0,0,0,95,430,1,0,0,0,97,435,1,0,0,0,99,440,1,0,0,0,101, - 445,1,0,0,0,103,452,1,0,0,0,105,457,1,0,0,0,107,462,1,0,0,0,109,469,1, - 0,0,0,111,474,1,0,0,0,113,482,1,0,0,0,115,490,1,0,0,0,117,498,1,0,0,0, - 119,508,1,0,0,0,121,516,1,0,0,0,123,526,1,0,0,0,125,534,1,0,0,0,127,540, - 1,0,0,0,129,546,1,0,0,0,131,552,1,0,0,0,133,558,1,0,0,0,135,566,1,0,0, - 0,137,572,1,0,0,0,139,580,1,0,0,0,141,586,1,0,0,0,143,594,1,0,0,0,145, - 600,1,0,0,0,147,604,1,0,0,0,149,610,1,0,0,0,151,614,1,0,0,0,153,620,1, - 0,0,0,155,624,1,0,0,0,157,632,1,0,0,0,159,638,1,0,0,0,161,643,1,0,0,0, - 163,649,1,0,0,0,165,654,1,0,0,0,167,662,1,0,0,0,169,668,1,0,0,0,171,675, - 1,0,0,0,173,683,1,0,0,0,175,689,1,0,0,0,177,696,1,0,0,0,179,704,1,0,0, - 0,181,710,1,0,0,0,183,717,1,0,0,0,185,725,1,0,0,0,187,731,1,0,0,0,189, - 738,1,0,0,0,191,746,1,0,0,0,193,755,1,0,0,0,195,765,1,0,0,0,197,772,1, - 0,0,0,199,779,1,0,0,0,201,787,1,0,0,0,203,794,1,0,0,0,205,803,1,0,0,0, - 207,813,1,0,0,0,209,821,1,0,0,0,211,828,1,0,0,0,213,835,1,0,0,0,215,847, - 1,0,0,0,217,857,1,0,0,0,219,864,1,0,0,0,221,875,1,0,0,0,223,887,1,0,0, - 0,225,895,1,0,0,0,227,900,1,0,0,0,229,906,1,0,0,0,231,911,1,0,0,0,233, - 916,1,0,0,0,235,924,1,0,0,0,237,935,1,0,0,0,239,942,1,0,0,0,241,954,1, - 0,0,0,243,960,1,0,0,0,245,1002,1,0,0,0,247,1014,1,0,0,0,249,1034,1,0,0, - 0,251,1037,1,0,0,0,253,1073,1,0,0,0,255,1078,1,0,0,0,257,258,5,33,0,0, - 258,2,1,0,0,0,259,260,5,94,0,0,260,4,1,0,0,0,261,262,5,45,0,0,262,6,1, - 0,0,0,263,264,5,43,0,0,264,8,1,0,0,0,265,266,5,42,0,0,266,10,1,0,0,0,267, - 268,5,47,0,0,268,12,1,0,0,0,269,270,5,105,0,0,270,271,5,110,0,0,271,272, - 5,116,0,0,272,273,5,101,0,0,273,274,5,114,0,0,274,275,5,115,0,0,275,276, - 5,101,0,0,276,277,5,99,0,0,277,278,5,116,0,0,278,14,1,0,0,0,279,280,5, - 47,0,0,280,281,5,92,0,0,281,16,1,0,0,0,282,283,5,117,0,0,283,284,5,110, - 0,0,284,285,5,105,0,0,285,286,5,116,0,0,286,287,5,101,0,0,287,18,1,0,0, - 0,288,289,5,92,0,0,289,290,5,47,0,0,290,20,1,0,0,0,291,292,5,115,0,0,292, - 293,5,101,0,0,293,294,5,116,0,0,294,295,5,115,0,0,295,296,5,117,0,0,296, - 297,5,98,0,0,297,298,5,116,0,0,298,299,5,114,0,0,299,300,5,97,0,0,300, - 301,5,99,0,0,301,302,5,116,0,0,302,22,1,0,0,0,303,304,5,92,0,0,304,24, - 1,0,0,0,305,306,5,105,0,0,306,307,5,110,0,0,307,26,1,0,0,0,308,309,5,62, - 0,0,309,310,5,61,0,0,310,28,1,0,0,0,311,312,5,60,0,0,312,313,5,61,0,0, - 313,30,1,0,0,0,314,315,5,62,0,0,315,32,1,0,0,0,316,317,5,60,0,0,317,34, - 1,0,0,0,318,319,5,101,0,0,319,320,5,113,0,0,320,321,5,117,0,0,321,322, - 5,97,0,0,322,323,5,108,0,0,323,324,5,105,0,0,324,325,5,122,0,0,325,326, - 5,101,0,0,326,327,5,115,0,0,327,36,1,0,0,0,328,329,5,61,0,0,329,38,1,0, - 0,0,330,331,5,110,0,0,331,332,5,111,0,0,332,333,5,116,0,0,333,40,1,0,0, - 0,334,335,5,97,0,0,335,336,5,110,0,0,336,337,5,100,0,0,337,42,1,0,0,0, - 338,339,5,38,0,0,339,44,1,0,0,0,340,341,5,120,0,0,341,342,5,111,0,0,342, - 343,5,114,0,0,343,46,1,0,0,0,344,345,5,111,0,0,345,346,5,114,0,0,346,48, - 1,0,0,0,347,348,5,124,0,0,348,50,1,0,0,0,349,350,5,105,0,0,350,351,5,109, - 0,0,351,352,5,112,0,0,352,353,5,108,0,0,353,354,5,105,0,0,354,355,5,101, - 0,0,355,356,5,115,0,0,356,52,1,0,0,0,357,358,5,45,0,0,358,359,5,62,0,0, - 359,54,1,0,0,0,360,361,5,112,0,0,361,362,5,114,0,0,362,363,5,111,0,0,363, - 364,5,118,0,0,364,365,5,105,0,0,365,366,5,100,0,0,366,367,5,101,0,0,367, - 368,5,100,0,0,368,56,1,0,0,0,369,370,5,44,0,0,370,58,1,0,0,0,371,372,5, - 59,0,0,372,60,1,0,0,0,373,374,5,58,0,0,374,62,1,0,0,0,375,376,5,43,0,0, - 376,377,5,111,0,0,377,378,5,111,0,0,378,64,1,0,0,0,379,380,5,45,0,0,380, - 381,5,111,0,0,381,382,5,111,0,0,382,66,1,0,0,0,383,384,5,40,0,0,384,385, - 5,124,0,0,385,68,1,0,0,0,386,387,5,124,0,0,387,388,5,41,0,0,388,70,1,0, - 0,0,389,390,5,91,0,0,390,72,1,0,0,0,391,392,5,93,0,0,392,393,5,84,0,0, - 393,74,1,0,0,0,394,395,5,93,0,0,395,76,1,0,0,0,396,397,5,40,0,0,397,78, - 1,0,0,0,398,399,5,41,0,0,399,80,1,0,0,0,400,401,5,123,0,0,401,82,1,0,0, - 0,402,403,5,125,0,0,403,84,1,0,0,0,404,405,5,108,0,0,405,406,5,111,0,0, - 406,407,5,103,0,0,407,408,5,40,0,0,408,86,1,0,0,0,409,410,5,115,0,0,410, - 411,5,113,0,0,411,412,5,114,0,0,412,413,5,116,0,0,413,414,5,40,0,0,414, - 88,1,0,0,0,415,416,5,99,0,0,416,417,5,98,0,0,417,418,5,114,0,0,418,419, - 5,116,0,0,419,420,5,40,0,0,420,90,1,0,0,0,421,422,5,115,0,0,422,423,5, - 113,0,0,423,424,5,114,0,0,424,425,5,40,0,0,425,92,1,0,0,0,426,427,5,108, - 0,0,427,428,5,110,0,0,428,429,5,40,0,0,429,94,1,0,0,0,430,431,5,115,0, - 0,431,432,5,105,0,0,432,433,5,110,0,0,433,434,5,40,0,0,434,96,1,0,0,0, - 435,436,5,99,0,0,436,437,5,111,0,0,437,438,5,115,0,0,438,439,5,40,0,0, - 439,98,1,0,0,0,440,441,5,116,0,0,441,442,5,97,0,0,442,443,5,110,0,0,443, - 444,5,40,0,0,444,100,1,0,0,0,445,446,5,99,0,0,446,447,5,111,0,0,447,448, - 5,116,0,0,448,449,5,97,0,0,449,450,5,110,0,0,450,451,5,40,0,0,451,102, - 1,0,0,0,452,453,5,99,0,0,453,454,5,111,0,0,454,455,5,116,0,0,455,456,5, - 40,0,0,456,104,1,0,0,0,457,458,5,115,0,0,458,459,5,101,0,0,459,460,5,99, - 0,0,460,461,5,40,0,0,461,106,1,0,0,0,462,463,5,99,0,0,463,464,5,111,0, - 0,464,465,5,115,0,0,465,466,5,101,0,0,466,467,5,99,0,0,467,468,5,40,0, - 0,468,108,1,0,0,0,469,470,5,99,0,0,470,471,5,115,0,0,471,472,5,99,0,0, - 472,473,5,40,0,0,473,110,1,0,0,0,474,475,5,97,0,0,475,476,5,114,0,0,476, - 477,5,99,0,0,477,478,5,115,0,0,478,479,5,105,0,0,479,480,5,110,0,0,480, - 481,5,40,0,0,481,112,1,0,0,0,482,483,5,97,0,0,483,484,5,114,0,0,484,485, - 5,99,0,0,485,486,5,99,0,0,486,487,5,111,0,0,487,488,5,115,0,0,488,489, - 5,40,0,0,489,114,1,0,0,0,490,491,5,97,0,0,491,492,5,114,0,0,492,493,5, - 99,0,0,493,494,5,116,0,0,494,495,5,97,0,0,495,496,5,110,0,0,496,497,5, - 40,0,0,497,116,1,0,0,0,498,499,5,97,0,0,499,500,5,114,0,0,500,501,5,99, - 0,0,501,502,5,99,0,0,502,503,5,111,0,0,503,504,5,116,0,0,504,505,5,97, - 0,0,505,506,5,110,0,0,506,507,5,40,0,0,507,118,1,0,0,0,508,509,5,97,0, - 0,509,510,5,114,0,0,510,511,5,99,0,0,511,512,5,115,0,0,512,513,5,101,0, - 0,513,514,5,99,0,0,514,515,5,40,0,0,515,120,1,0,0,0,516,517,5,97,0,0,517, - 518,5,114,0,0,518,519,5,99,0,0,519,520,5,99,0,0,520,521,5,111,0,0,521, - 522,5,115,0,0,522,523,5,101,0,0,523,524,5,99,0,0,524,525,5,40,0,0,525, - 122,1,0,0,0,526,527,5,97,0,0,527,528,5,114,0,0,528,529,5,99,0,0,529,530, - 5,99,0,0,530,531,5,115,0,0,531,532,5,99,0,0,532,533,5,40,0,0,533,124,1, - 0,0,0,534,535,5,97,0,0,535,536,5,99,0,0,536,537,5,115,0,0,537,538,5,99, - 0,0,538,539,5,40,0,0,539,126,1,0,0,0,540,541,5,97,0,0,541,542,5,115,0, - 0,542,543,5,105,0,0,543,544,5,110,0,0,544,545,5,40,0,0,545,128,1,0,0,0, - 546,547,5,97,0,0,547,548,5,99,0,0,548,549,5,111,0,0,549,550,5,115,0,0, - 550,551,5,40,0,0,551,130,1,0,0,0,552,553,5,97,0,0,553,554,5,116,0,0,554, - 555,5,97,0,0,555,556,5,110,0,0,556,557,5,40,0,0,557,132,1,0,0,0,558,559, - 5,97,0,0,559,560,5,99,0,0,560,561,5,111,0,0,561,562,5,116,0,0,562,563, - 5,97,0,0,563,564,5,110,0,0,564,565,5,40,0,0,565,134,1,0,0,0,566,567,5, - 97,0,0,567,568,5,115,0,0,568,569,5,101,0,0,569,570,5,99,0,0,570,571,5, - 40,0,0,571,136,1,0,0,0,572,573,5,97,0,0,573,574,5,99,0,0,574,575,5,111, - 0,0,575,576,5,115,0,0,576,577,5,101,0,0,577,578,5,99,0,0,578,579,5,40, - 0,0,579,138,1,0,0,0,580,581,5,97,0,0,581,582,5,99,0,0,582,583,5,111,0, - 0,583,584,5,116,0,0,584,585,5,40,0,0,585,140,1,0,0,0,586,587,5,97,0,0, - 587,588,5,114,0,0,588,589,5,99,0,0,589,590,5,99,0,0,590,591,5,111,0,0, - 591,592,5,116,0,0,592,593,5,40,0,0,593,142,1,0,0,0,594,595,5,115,0,0,595, - 596,5,105,0,0,596,597,5,110,0,0,597,598,5,104,0,0,598,599,5,40,0,0,599, - 144,1,0,0,0,600,601,5,115,0,0,601,602,5,104,0,0,602,603,5,40,0,0,603,146, - 1,0,0,0,604,605,5,99,0,0,605,606,5,111,0,0,606,607,5,115,0,0,607,608,5, - 104,0,0,608,609,5,40,0,0,609,148,1,0,0,0,610,611,5,99,0,0,611,612,5,104, - 0,0,612,613,5,40,0,0,613,150,1,0,0,0,614,615,5,116,0,0,615,616,5,97,0, - 0,616,617,5,110,0,0,617,618,5,104,0,0,618,619,5,40,0,0,619,152,1,0,0,0, - 620,621,5,116,0,0,621,622,5,104,0,0,622,623,5,40,0,0,623,154,1,0,0,0,624, - 625,5,99,0,0,625,626,5,111,0,0,626,627,5,116,0,0,627,628,5,97,0,0,628, - 629,5,110,0,0,629,630,5,104,0,0,630,631,5,40,0,0,631,156,1,0,0,0,632,633, - 5,99,0,0,633,634,5,111,0,0,634,635,5,116,0,0,635,636,5,104,0,0,636,637, - 5,40,0,0,637,158,1,0,0,0,638,639,5,99,0,0,639,640,5,116,0,0,640,641,5, - 104,0,0,641,642,5,40,0,0,642,160,1,0,0,0,643,644,5,115,0,0,644,645,5,101, - 0,0,645,646,5,99,0,0,646,647,5,104,0,0,647,648,5,40,0,0,648,162,1,0,0, - 0,649,650,5,115,0,0,650,651,5,99,0,0,651,652,5,104,0,0,652,653,5,40,0, - 0,653,164,1,0,0,0,654,655,5,99,0,0,655,656,5,111,0,0,656,657,5,115,0,0, - 657,658,5,101,0,0,658,659,5,99,0,0,659,660,5,104,0,0,660,661,5,40,0,0, - 661,166,1,0,0,0,662,663,5,99,0,0,663,664,5,115,0,0,664,665,5,99,0,0,665, - 666,5,104,0,0,666,667,5,40,0,0,667,168,1,0,0,0,668,669,5,97,0,0,669,670, - 5,115,0,0,670,671,5,105,0,0,671,672,5,110,0,0,672,673,5,104,0,0,673,674, - 5,40,0,0,674,170,1,0,0,0,675,676,5,97,0,0,676,677,5,114,0,0,677,678,5, - 115,0,0,678,679,5,105,0,0,679,680,5,110,0,0,680,681,5,104,0,0,681,682, - 5,40,0,0,682,172,1,0,0,0,683,684,5,97,0,0,684,685,5,114,0,0,685,686,5, - 115,0,0,686,687,5,104,0,0,687,688,5,40,0,0,688,174,1,0,0,0,689,690,5,97, - 0,0,690,691,5,99,0,0,691,692,5,111,0,0,692,693,5,115,0,0,693,694,5,104, - 0,0,694,695,5,40,0,0,695,176,1,0,0,0,696,697,5,97,0,0,697,698,5,114,0, - 0,698,699,5,99,0,0,699,700,5,111,0,0,700,701,5,115,0,0,701,702,5,104,0, - 0,702,703,5,40,0,0,703,178,1,0,0,0,704,705,5,97,0,0,705,706,5,114,0,0, - 706,707,5,99,0,0,707,708,5,104,0,0,708,709,5,40,0,0,709,180,1,0,0,0,710, - 711,5,97,0,0,711,712,5,116,0,0,712,713,5,97,0,0,713,714,5,110,0,0,714, - 715,5,104,0,0,715,716,5,40,0,0,716,182,1,0,0,0,717,718,5,97,0,0,718,719, - 5,114,0,0,719,720,5,116,0,0,720,721,5,97,0,0,721,722,5,110,0,0,722,723, - 5,104,0,0,723,724,5,40,0,0,724,184,1,0,0,0,725,726,5,97,0,0,726,727,5, - 114,0,0,727,728,5,116,0,0,728,729,5,104,0,0,729,730,5,40,0,0,730,186,1, - 0,0,0,731,732,5,97,0,0,732,733,5,99,0,0,733,734,5,111,0,0,734,735,5,116, - 0,0,735,736,5,104,0,0,736,737,5,40,0,0,737,188,1,0,0,0,738,739,5,97,0, - 0,739,740,5,114,0,0,740,741,5,99,0,0,741,742,5,111,0,0,742,743,5,116,0, - 0,743,744,5,104,0,0,744,745,5,40,0,0,745,190,1,0,0,0,746,747,5,97,0,0, - 747,748,5,99,0,0,748,749,5,111,0,0,749,750,5,116,0,0,750,751,5,97,0,0, - 751,752,5,110,0,0,752,753,5,104,0,0,753,754,5,40,0,0,754,192,1,0,0,0,755, - 756,5,97,0,0,756,757,5,114,0,0,757,758,5,99,0,0,758,759,5,111,0,0,759, - 760,5,116,0,0,760,761,5,97,0,0,761,762,5,110,0,0,762,763,5,104,0,0,763, - 764,5,40,0,0,764,194,1,0,0,0,765,766,5,97,0,0,766,767,5,114,0,0,767,768, - 5,99,0,0,768,769,5,116,0,0,769,770,5,104,0,0,770,771,5,40,0,0,771,196, - 1,0,0,0,772,773,5,97,0,0,773,774,5,115,0,0,774,775,5,101,0,0,775,776,5, - 99,0,0,776,777,5,104,0,0,777,778,5,40,0,0,778,198,1,0,0,0,779,780,5,97, - 0,0,780,781,5,114,0,0,781,782,5,115,0,0,782,783,5,101,0,0,783,784,5,99, - 0,0,784,785,5,104,0,0,785,786,5,40,0,0,786,200,1,0,0,0,787,788,5,97,0, - 0,788,789,5,114,0,0,789,790,5,115,0,0,790,791,5,99,0,0,791,792,5,104,0, - 0,792,793,5,40,0,0,793,202,1,0,0,0,794,795,5,97,0,0,795,796,5,99,0,0,796, - 797,5,111,0,0,797,798,5,115,0,0,798,799,5,101,0,0,799,800,5,99,0,0,800, - 801,5,104,0,0,801,802,5,40,0,0,802,204,1,0,0,0,803,804,5,97,0,0,804,805, - 5,114,0,0,805,806,5,99,0,0,806,807,5,111,0,0,807,808,5,115,0,0,808,809, - 5,101,0,0,809,810,5,99,0,0,810,811,5,104,0,0,811,812,5,40,0,0,812,206, - 1,0,0,0,813,814,5,97,0,0,814,815,5,114,0,0,815,816,5,99,0,0,816,817,5, - 115,0,0,817,818,5,99,0,0,818,819,5,104,0,0,819,820,5,40,0,0,820,208,1, - 0,0,0,821,822,5,97,0,0,822,823,5,99,0,0,823,824,5,115,0,0,824,825,5,99, - 0,0,825,826,5,104,0,0,826,827,5,40,0,0,827,210,1,0,0,0,828,829,5,103,0, - 0,829,830,5,97,0,0,830,831,5,109,0,0,831,832,5,109,0,0,832,833,5,97,0, - 0,833,834,5,40,0,0,834,212,1,0,0,0,835,836,5,100,0,0,836,837,5,101,0,0, - 837,838,5,114,0,0,838,839,5,105,0,0,839,840,5,118,0,0,840,841,5,97,0,0, - 841,842,5,116,0,0,842,843,5,105,0,0,843,844,5,118,0,0,844,845,5,101,0, - 0,845,846,5,40,0,0,846,214,1,0,0,0,847,848,5,105,0,0,848,849,5,110,0,0, - 849,850,5,116,0,0,850,851,5,101,0,0,851,852,5,103,0,0,852,853,5,114,0, - 0,853,854,5,97,0,0,854,855,5,108,0,0,855,856,5,40,0,0,856,216,1,0,0,0, - 857,858,5,108,0,0,858,859,5,105,0,0,859,860,5,109,0,0,860,861,5,105,0, - 0,861,862,5,116,0,0,862,863,5,40,0,0,863,218,1,0,0,0,864,865,5,108,0,0, - 865,866,5,105,0,0,866,867,5,109,0,0,867,868,5,105,0,0,868,869,5,116,0, - 0,869,870,5,108,0,0,870,871,5,101,0,0,871,872,5,102,0,0,872,873,5,116, - 0,0,873,874,5,40,0,0,874,220,1,0,0,0,875,876,5,108,0,0,876,877,5,105,0, - 0,877,878,5,109,0,0,878,879,5,105,0,0,879,880,5,116,0,0,880,881,5,114, - 0,0,881,882,5,105,0,0,882,883,5,103,0,0,883,884,5,104,0,0,884,885,5,116, - 0,0,885,886,5,40,0,0,886,222,1,0,0,0,887,888,5,115,0,0,888,889,5,105,0, - 0,889,890,5,103,0,0,890,891,5,110,0,0,891,892,5,117,0,0,892,893,5,109, - 0,0,893,894,5,40,0,0,894,224,1,0,0,0,895,896,5,115,0,0,896,897,5,103,0, - 0,897,898,5,110,0,0,898,899,5,40,0,0,899,226,1,0,0,0,900,901,5,115,0,0, - 901,902,5,105,0,0,902,903,5,103,0,0,903,904,5,110,0,0,904,905,5,40,0,0, - 905,228,1,0,0,0,906,907,5,97,0,0,907,908,5,98,0,0,908,909,5,115,0,0,909, - 910,5,40,0,0,910,230,1,0,0,0,911,912,5,112,0,0,912,913,5,104,0,0,913,914, - 5,105,0,0,914,915,5,40,0,0,915,232,1,0,0,0,916,917,5,100,0,0,917,918,5, - 111,0,0,918,919,5,109,0,0,919,920,5,97,0,0,920,921,5,105,0,0,921,922,5, - 110,0,0,922,923,5,40,0,0,923,234,1,0,0,0,924,925,5,112,0,0,925,926,5,105, - 0,0,926,927,5,101,0,0,927,928,5,99,0,0,928,929,5,101,0,0,929,930,5,119, - 0,0,930,931,5,105,0,0,931,932,5,115,0,0,932,933,5,101,0,0,933,934,5,40, - 0,0,934,236,1,0,0,0,935,936,5,97,0,0,936,937,5,112,0,0,937,938,5,112,0, - 0,938,939,5,108,0,0,939,940,5,121,0,0,940,941,5,40,0,0,941,238,1,0,0,0, - 942,943,5,108,0,0,943,944,5,97,0,0,944,945,5,109,0,0,945,946,5,98,0,0, - 946,947,5,100,0,0,947,948,5,97,0,0,948,949,5,40,0,0,949,240,1,0,0,0,950, - 952,5,13,0,0,951,950,1,0,0,0,951,952,1,0,0,0,952,953,1,0,0,0,953,955,5, - 10,0,0,954,951,1,0,0,0,955,956,1,0,0,0,956,954,1,0,0,0,956,957,1,0,0,0, - 957,958,1,0,0,0,958,959,6,120,0,0,959,242,1,0,0,0,960,962,7,0,0,0,961, - 963,7,1,0,0,962,961,1,0,0,0,962,963,1,0,0,0,963,965,1,0,0,0,964,966,2, - 48,57,0,965,964,1,0,0,0,966,967,1,0,0,0,967,965,1,0,0,0,967,968,1,0,0, - 0,968,244,1,0,0,0,969,971,2,48,57,0,970,969,1,0,0,0,971,972,1,0,0,0,972, - 970,1,0,0,0,972,973,1,0,0,0,973,974,1,0,0,0,974,978,5,46,0,0,975,977,2, - 48,57,0,976,975,1,0,0,0,977,980,1,0,0,0,978,976,1,0,0,0,978,979,1,0,0, - 0,979,982,1,0,0,0,980,978,1,0,0,0,981,983,3,243,121,0,982,981,1,0,0,0, - 982,983,1,0,0,0,983,985,1,0,0,0,984,986,5,105,0,0,985,984,1,0,0,0,985, - 986,1,0,0,0,986,1003,1,0,0,0,987,989,5,46,0,0,988,987,1,0,0,0,988,989, - 1,0,0,0,989,991,1,0,0,0,990,992,2,48,57,0,991,990,1,0,0,0,992,993,1,0, - 0,0,993,991,1,0,0,0,993,994,1,0,0,0,994,996,1,0,0,0,995,997,3,243,121, - 0,996,995,1,0,0,0,996,997,1,0,0,0,997,999,1,0,0,0,998,1000,5,105,0,0,999, - 998,1,0,0,0,999,1000,1,0,0,0,1000,1003,1,0,0,0,1001,1003,5,105,0,0,1002, - 970,1,0,0,0,1002,988,1,0,0,0,1002,1001,1,0,0,0,1003,246,1,0,0,0,1004,1005, - 5,67,0,0,1005,1015,5,67,0,0,1006,1007,5,82,0,0,1007,1015,5,82,0,0,1008, - 1009,5,81,0,0,1009,1015,5,81,0,0,1010,1011,5,90,0,0,1011,1015,5,90,0,0, - 1012,1013,5,66,0,0,1013,1015,5,66,0,0,1014,1004,1,0,0,0,1014,1006,1,0, - 0,0,1014,1008,1,0,0,0,1014,1010,1,0,0,0,1014,1012,1,0,0,0,1015,248,1,0, - 0,0,1016,1017,5,116,0,0,1017,1018,5,114,0,0,1018,1019,5,117,0,0,1019,1035, - 5,101,0,0,1020,1021,5,84,0,0,1021,1022,5,114,0,0,1022,1023,5,117,0,0,1023, - 1035,5,101,0,0,1024,1025,5,102,0,0,1025,1026,5,97,0,0,1026,1027,5,108, - 0,0,1027,1028,5,115,0,0,1028,1035,5,101,0,0,1029,1030,5,70,0,0,1030,1031, - 5,97,0,0,1031,1032,5,108,0,0,1032,1033,5,115,0,0,1033,1035,5,101,0,0,1034, - 1016,1,0,0,0,1034,1020,1,0,0,0,1034,1024,1,0,0,0,1034,1029,1,0,0,0,1035, - 250,1,0,0,0,1036,1038,7,2,0,0,1037,1036,1,0,0,0,1038,1039,1,0,0,0,1039, - 1037,1,0,0,0,1039,1040,1,0,0,0,1040,1047,1,0,0,0,1041,1043,5,95,0,0,1042, - 1044,7,3,0,0,1043,1042,1,0,0,0,1044,1045,1,0,0,0,1045,1043,1,0,0,0,1045, - 1046,1,0,0,0,1046,1048,1,0,0,0,1047,1041,1,0,0,0,1047,1048,1,0,0,0,1048, - 252,1,0,0,0,1049,1050,5,47,0,0,1050,1051,5,47,0,0,1051,1055,1,0,0,0,1052, - 1054,8,4,0,0,1053,1052,1,0,0,0,1054,1057,1,0,0,0,1055,1053,1,0,0,0,1055, - 1056,1,0,0,0,1056,1059,1,0,0,0,1057,1055,1,0,0,0,1058,1060,5,13,0,0,1059, - 1058,1,0,0,0,1059,1060,1,0,0,0,1060,1061,1,0,0,0,1061,1074,5,10,0,0,1062, - 1063,5,47,0,0,1063,1064,5,42,0,0,1064,1068,1,0,0,0,1065,1067,9,0,0,0,1066, - 1065,1,0,0,0,1067,1070,1,0,0,0,1068,1069,1,0,0,0,1068,1066,1,0,0,0,1069, - 1071,1,0,0,0,1070,1068,1,0,0,0,1071,1072,5,42,0,0,1072,1074,5,47,0,0,1073, - 1049,1,0,0,0,1073,1062,1,0,0,0,1074,1075,1,0,0,0,1075,1076,6,126,0,0,1076, - 254,1,0,0,0,1077,1079,7,5,0,0,1078,1077,1,0,0,0,1079,1080,1,0,0,0,1080, - 1078,1,0,0,0,1080,1081,1,0,0,0,1081,1082,1,0,0,0,1082,1083,6,127,0,0,1083, - 256,1,0,0,0,24,0,951,956,962,967,972,978,982,985,988,993,996,999,1002, - 1014,1034,1039,1045,1047,1055,1059,1068,1073,1080,1,6,0,0 + 1,12,1,13,1,13,1,13,1,14,1,14,1,14,1,15,1,15,1,16,1,16,1,17,1,17,1,18, + 1,18,1,18,1,19,1,19,1,19,1,19,1,20,1,20,1,20,1,20,1,21,1,21,1,22,1,22, + 1,22,1,22,1,23,1,23,1,23,1,24,1,24,1,25,1,25,1,25,1,25,1,25,1,25,1,25, + 1,25,1,26,1,26,1,26,1,27,1,27,1,27,1,27,1,27,1,27,1,27,1,27,1,27,1,28, + 1,28,1,29,1,29,1,30,1,30,1,31,1,31,1,31,1,31,1,32,1,32,1,32,1,32,1,33, + 1,33,1,33,1,34,1,34,1,34,1,35,1,35,1,36,1,36,1,36,1,37,1,37,1,38,1,38, + 1,39,1,39,1,40,1,40,1,41,1,41,1,42,1,42,1,42,1,42,1,42,1,43,1,43,1,43, + 1,43,1,43,1,43,1,44,1,44,1,44,1,44,1,44,1,44,1,45,1,45,1,45,1,45,1,45, + 1,46,1,46,1,46,1,46,1,47,1,47,1,47,1,47,1,47,1,48,1,48,1,48,1,48,1,48, + 1,49,1,49,1,49,1,49,1,49,1,50,1,50,1,50,1,50,1,50,1,50,1,50,1,51,1,51, + 1,51,1,51,1,51,1,52,1,52,1,52,1,52,1,52,1,53,1,53,1,53,1,53,1,53,1,53, + 1,53,1,54,1,54,1,54,1,54,1,54,1,55,1,55,1,55,1,55,1,55,1,55,1,55,1,55, + 1,56,1,56,1,56,1,56,1,56,1,56,1,56,1,56,1,57,1,57,1,57,1,57,1,57,1,57, + 1,57,1,57,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,59,1,59, + 1,59,1,59,1,59,1,59,1,59,1,59,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60, + 1,60,1,60,1,61,1,61,1,61,1,61,1,61,1,61,1,61,1,61,1,62,1,62,1,62,1,62, + 1,62,1,62,1,63,1,63,1,63,1,63,1,63,1,63,1,64,1,64,1,64,1,64,1,64,1,64, + 1,65,1,65,1,65,1,65,1,65,1,65,1,66,1,66,1,66,1,66,1,66,1,66,1,66,1,66, + 1,67,1,67,1,67,1,67,1,67,1,67,1,68,1,68,1,68,1,68,1,68,1,68,1,68,1,68, + 1,69,1,69,1,69,1,69,1,69,1,69,1,70,1,70,1,70,1,70,1,70,1,70,1,70,1,70, + 1,71,1,71,1,71,1,71,1,71,1,71,1,72,1,72,1,72,1,72,1,73,1,73,1,73,1,73, + 1,73,1,73,1,74,1,74,1,74,1,74,1,75,1,75,1,75,1,75,1,75,1,75,1,76,1,76, + 1,76,1,76,1,77,1,77,1,77,1,77,1,77,1,77,1,77,1,77,1,78,1,78,1,78,1,78, + 1,78,1,78,1,79,1,79,1,79,1,79,1,79,1,80,1,80,1,80,1,80,1,80,1,80,1,81, + 1,81,1,81,1,81,1,81,1,82,1,82,1,82,1,82,1,82,1,82,1,82,1,82,1,83,1,83, + 1,83,1,83,1,83,1,83,1,84,1,84,1,84,1,84,1,84,1,84,1,84,1,85,1,85,1,85, + 1,85,1,85,1,85,1,85,1,85,1,86,1,86,1,86,1,86,1,86,1,86,1,87,1,87,1,87, + 1,87,1,87,1,87,1,87,1,88,1,88,1,88,1,88,1,88,1,88,1,88,1,88,1,89,1,89, + 1,89,1,89,1,89,1,89,1,90,1,90,1,90,1,90,1,90,1,90,1,90,1,91,1,91,1,91, + 1,91,1,91,1,91,1,91,1,91,1,92,1,92,1,92,1,92,1,92,1,92,1,93,1,93,1,93, + 1,93,1,93,1,93,1,93,1,94,1,94,1,94,1,94,1,94,1,94,1,94,1,94,1,95,1,95, + 1,95,1,95,1,95,1,95,1,95,1,95,1,95,1,96,1,96,1,96,1,96,1,96,1,96,1,96, + 1,96,1,96,1,96,1,97,1,97,1,97,1,97,1,97,1,97,1,97,1,98,1,98,1,98,1,98, + 1,98,1,98,1,98,1,99,1,99,1,99,1,99,1,99,1,99,1,99,1,99,1,100,1,100,1,100, + 1,100,1,100,1,100,1,100,1,101,1,101,1,101,1,101,1,101,1,101,1,101,1,101, + 1,101,1,102,1,102,1,102,1,102,1,102,1,102,1,102,1,102,1,102,1,102,1,103, + 1,103,1,103,1,103,1,103,1,103,1,103,1,103,1,104,1,104,1,104,1,104,1,104, + 1,104,1,104,1,105,1,105,1,105,1,105,1,105,1,105,1,105,1,106,1,106,1,106, + 1,106,1,106,1,106,1,106,1,106,1,106,1,106,1,106,1,106,1,107,1,107,1,107, + 1,107,1,107,1,107,1,107,1,107,1,107,1,107,1,108,1,108,1,108,1,108,1,108, + 1,108,1,108,1,109,1,109,1,109,1,109,1,109,1,109,1,109,1,109,1,109,1,109, + 1,109,1,110,1,110,1,110,1,110,1,110,1,110,1,110,1,110,1,110,1,110,1,110, + 1,110,1,111,1,111,1,111,1,111,1,111,1,111,1,111,1,111,1,112,1,112,1,112, + 1,112,1,112,1,113,1,113,1,113,1,113,1,113,1,113,1,114,1,114,1,114,1,114, + 1,114,1,115,1,115,1,115,1,115,1,115,1,116,1,116,1,116,1,116,1,116,1,116, + 1,116,1,116,1,117,1,117,1,117,1,117,1,117,1,117,1,117,1,117,1,117,1,117, + 1,117,1,118,1,118,1,118,1,118,1,118,1,118,1,118,1,119,1,119,1,119,1,119, + 1,119,1,119,1,119,1,119,1,120,3,120,945,8,120,1,120,4,120,948,8,120,11, + 120,12,120,949,1,120,1,120,1,121,1,121,3,121,956,8,121,1,121,4,121,959, + 8,121,11,121,12,121,960,1,122,4,122,964,8,122,11,122,12,122,965,1,122, + 1,122,5,122,970,8,122,10,122,12,122,973,9,122,1,122,3,122,976,8,122,1, + 122,3,122,979,8,122,1,122,3,122,982,8,122,1,122,4,122,985,8,122,11,122, + 12,122,986,1,122,3,122,990,8,122,1,122,3,122,993,8,122,1,122,3,122,996, + 8,122,1,123,1,123,1,123,1,123,1,123,1,123,1,123,1,123,1,123,1,123,3,123, + 1008,8,123,1,124,1,124,1,124,1,124,1,124,1,124,1,124,1,124,1,124,1,124, + 1,124,1,124,1,124,1,124,1,124,1,124,1,124,1,124,3,124,1028,8,124,1,125, + 4,125,1031,8,125,11,125,12,125,1032,1,125,1,125,4,125,1037,8,125,11,125, + 12,125,1038,3,125,1041,8,125,1,126,1,126,1,126,1,126,5,126,1047,8,126, + 10,126,12,126,1050,9,126,1,126,3,126,1053,8,126,1,126,1,126,1,126,1,126, + 1,126,5,126,1060,8,126,10,126,12,126,1063,9,126,1,126,1,126,3,126,1067, + 8,126,1,126,1,126,1,127,4,127,1072,8,127,11,127,12,127,1073,1,127,1,127, + 1,1061,0,128,1,1,3,2,5,3,7,4,9,5,11,6,13,7,15,8,17,9,19,10,21,11,23,12, + 25,13,27,14,29,15,31,16,33,17,35,18,37,19,39,20,41,21,43,22,45,23,47,24, + 49,25,51,26,53,27,55,28,57,29,59,30,61,31,63,32,65,33,67,34,69,35,71,36, + 73,37,75,38,77,39,79,40,81,41,83,42,85,43,87,44,89,45,91,46,93,47,95,48, + 97,49,99,50,101,51,103,52,105,53,107,54,109,55,111,56,113,57,115,58,117, + 59,119,60,121,61,123,62,125,63,127,64,129,65,131,66,133,67,135,68,137, + 69,139,70,141,71,143,72,145,73,147,74,149,75,151,76,153,77,155,78,157, + 79,159,80,161,81,163,82,165,83,167,84,169,85,171,86,173,87,175,88,177, + 89,179,90,181,91,183,92,185,93,187,94,189,95,191,96,193,97,195,98,197, + 99,199,100,201,101,203,102,205,103,207,104,209,105,211,106,213,107,215, + 108,217,109,219,110,221,111,223,112,225,113,227,114,229,115,231,116,233, + 117,235,118,237,119,239,120,241,121,243,0,245,122,247,123,249,124,251, + 125,253,126,255,127,1,0,6,2,0,69,69,101,101,2,0,43,43,45,45,4,0,65,90, + 97,122,880,1279,7936,8191,5,0,48,57,65,90,97,122,880,1279,7936,8191,2, + 0,10,10,13,13,2,0,9,9,32,32,1104,0,1,1,0,0,0,0,3,1,0,0,0,0,5,1,0,0,0,0, + 7,1,0,0,0,0,9,1,0,0,0,0,11,1,0,0,0,0,13,1,0,0,0,0,15,1,0,0,0,0,17,1,0, + 0,0,0,19,1,0,0,0,0,21,1,0,0,0,0,23,1,0,0,0,0,25,1,0,0,0,0,27,1,0,0,0,0, + 29,1,0,0,0,0,31,1,0,0,0,0,33,1,0,0,0,0,35,1,0,0,0,0,37,1,0,0,0,0,39,1, + 0,0,0,0,41,1,0,0,0,0,43,1,0,0,0,0,45,1,0,0,0,0,47,1,0,0,0,0,49,1,0,0,0, + 0,51,1,0,0,0,0,53,1,0,0,0,0,55,1,0,0,0,0,57,1,0,0,0,0,59,1,0,0,0,0,61, + 1,0,0,0,0,63,1,0,0,0,0,65,1,0,0,0,0,67,1,0,0,0,0,69,1,0,0,0,0,71,1,0,0, + 0,0,73,1,0,0,0,0,75,1,0,0,0,0,77,1,0,0,0,0,79,1,0,0,0,0,81,1,0,0,0,0,83, + 1,0,0,0,0,85,1,0,0,0,0,87,1,0,0,0,0,89,1,0,0,0,0,91,1,0,0,0,0,93,1,0,0, + 0,0,95,1,0,0,0,0,97,1,0,0,0,0,99,1,0,0,0,0,101,1,0,0,0,0,103,1,0,0,0,0, + 105,1,0,0,0,0,107,1,0,0,0,0,109,1,0,0,0,0,111,1,0,0,0,0,113,1,0,0,0,0, + 115,1,0,0,0,0,117,1,0,0,0,0,119,1,0,0,0,0,121,1,0,0,0,0,123,1,0,0,0,0, + 125,1,0,0,0,0,127,1,0,0,0,0,129,1,0,0,0,0,131,1,0,0,0,0,133,1,0,0,0,0, + 135,1,0,0,0,0,137,1,0,0,0,0,139,1,0,0,0,0,141,1,0,0,0,0,143,1,0,0,0,0, + 145,1,0,0,0,0,147,1,0,0,0,0,149,1,0,0,0,0,151,1,0,0,0,0,153,1,0,0,0,0, + 155,1,0,0,0,0,157,1,0,0,0,0,159,1,0,0,0,0,161,1,0,0,0,0,163,1,0,0,0,0, + 165,1,0,0,0,0,167,1,0,0,0,0,169,1,0,0,0,0,171,1,0,0,0,0,173,1,0,0,0,0, + 175,1,0,0,0,0,177,1,0,0,0,0,179,1,0,0,0,0,181,1,0,0,0,0,183,1,0,0,0,0, + 185,1,0,0,0,0,187,1,0,0,0,0,189,1,0,0,0,0,191,1,0,0,0,0,193,1,0,0,0,0, + 195,1,0,0,0,0,197,1,0,0,0,0,199,1,0,0,0,0,201,1,0,0,0,0,203,1,0,0,0,0, + 205,1,0,0,0,0,207,1,0,0,0,0,209,1,0,0,0,0,211,1,0,0,0,0,213,1,0,0,0,0, + 215,1,0,0,0,0,217,1,0,0,0,0,219,1,0,0,0,0,221,1,0,0,0,0,223,1,0,0,0,0, + 225,1,0,0,0,0,227,1,0,0,0,0,229,1,0,0,0,0,231,1,0,0,0,0,233,1,0,0,0,0, + 235,1,0,0,0,0,237,1,0,0,0,0,239,1,0,0,0,0,241,1,0,0,0,0,245,1,0,0,0,0, + 247,1,0,0,0,0,249,1,0,0,0,0,251,1,0,0,0,0,253,1,0,0,0,0,255,1,0,0,0,1, + 257,1,0,0,0,3,259,1,0,0,0,5,261,1,0,0,0,7,263,1,0,0,0,9,265,1,0,0,0,11, + 267,1,0,0,0,13,269,1,0,0,0,15,279,1,0,0,0,17,282,1,0,0,0,19,288,1,0,0, + 0,21,291,1,0,0,0,23,303,1,0,0,0,25,305,1,0,0,0,27,308,1,0,0,0,29,311,1, + 0,0,0,31,314,1,0,0,0,33,316,1,0,0,0,35,318,1,0,0,0,37,320,1,0,0,0,39,323, + 1,0,0,0,41,327,1,0,0,0,43,331,1,0,0,0,45,333,1,0,0,0,47,337,1,0,0,0,49, + 340,1,0,0,0,51,342,1,0,0,0,53,350,1,0,0,0,55,353,1,0,0,0,57,362,1,0,0, + 0,59,364,1,0,0,0,61,366,1,0,0,0,63,368,1,0,0,0,65,372,1,0,0,0,67,376,1, + 0,0,0,69,379,1,0,0,0,71,382,1,0,0,0,73,384,1,0,0,0,75,387,1,0,0,0,77,389, + 1,0,0,0,79,391,1,0,0,0,81,393,1,0,0,0,83,395,1,0,0,0,85,397,1,0,0,0,87, + 402,1,0,0,0,89,408,1,0,0,0,91,414,1,0,0,0,93,419,1,0,0,0,95,423,1,0,0, + 0,97,428,1,0,0,0,99,433,1,0,0,0,101,438,1,0,0,0,103,445,1,0,0,0,105,450, + 1,0,0,0,107,455,1,0,0,0,109,462,1,0,0,0,111,467,1,0,0,0,113,475,1,0,0, + 0,115,483,1,0,0,0,117,491,1,0,0,0,119,501,1,0,0,0,121,509,1,0,0,0,123, + 519,1,0,0,0,125,527,1,0,0,0,127,533,1,0,0,0,129,539,1,0,0,0,131,545,1, + 0,0,0,133,551,1,0,0,0,135,559,1,0,0,0,137,565,1,0,0,0,139,573,1,0,0,0, + 141,579,1,0,0,0,143,587,1,0,0,0,145,593,1,0,0,0,147,597,1,0,0,0,149,603, + 1,0,0,0,151,607,1,0,0,0,153,613,1,0,0,0,155,617,1,0,0,0,157,625,1,0,0, + 0,159,631,1,0,0,0,161,636,1,0,0,0,163,642,1,0,0,0,165,647,1,0,0,0,167, + 655,1,0,0,0,169,661,1,0,0,0,171,668,1,0,0,0,173,676,1,0,0,0,175,682,1, + 0,0,0,177,689,1,0,0,0,179,697,1,0,0,0,181,703,1,0,0,0,183,710,1,0,0,0, + 185,718,1,0,0,0,187,724,1,0,0,0,189,731,1,0,0,0,191,739,1,0,0,0,193,748, + 1,0,0,0,195,758,1,0,0,0,197,765,1,0,0,0,199,772,1,0,0,0,201,780,1,0,0, + 0,203,787,1,0,0,0,205,796,1,0,0,0,207,806,1,0,0,0,209,814,1,0,0,0,211, + 821,1,0,0,0,213,828,1,0,0,0,215,840,1,0,0,0,217,850,1,0,0,0,219,857,1, + 0,0,0,221,868,1,0,0,0,223,880,1,0,0,0,225,888,1,0,0,0,227,893,1,0,0,0, + 229,899,1,0,0,0,231,904,1,0,0,0,233,909,1,0,0,0,235,917,1,0,0,0,237,928, + 1,0,0,0,239,935,1,0,0,0,241,947,1,0,0,0,243,953,1,0,0,0,245,995,1,0,0, + 0,247,1007,1,0,0,0,249,1027,1,0,0,0,251,1030,1,0,0,0,253,1066,1,0,0,0, + 255,1071,1,0,0,0,257,258,5,33,0,0,258,2,1,0,0,0,259,260,5,94,0,0,260,4, + 1,0,0,0,261,262,5,45,0,0,262,6,1,0,0,0,263,264,5,43,0,0,264,8,1,0,0,0, + 265,266,5,42,0,0,266,10,1,0,0,0,267,268,5,47,0,0,268,12,1,0,0,0,269,270, + 5,105,0,0,270,271,5,110,0,0,271,272,5,116,0,0,272,273,5,101,0,0,273,274, + 5,114,0,0,274,275,5,115,0,0,275,276,5,101,0,0,276,277,5,99,0,0,277,278, + 5,116,0,0,278,14,1,0,0,0,279,280,5,47,0,0,280,281,5,92,0,0,281,16,1,0, + 0,0,282,283,5,117,0,0,283,284,5,110,0,0,284,285,5,105,0,0,285,286,5,116, + 0,0,286,287,5,101,0,0,287,18,1,0,0,0,288,289,5,92,0,0,289,290,5,47,0,0, + 290,20,1,0,0,0,291,292,5,115,0,0,292,293,5,101,0,0,293,294,5,116,0,0,294, + 295,5,115,0,0,295,296,5,117,0,0,296,297,5,98,0,0,297,298,5,116,0,0,298, + 299,5,114,0,0,299,300,5,97,0,0,300,301,5,99,0,0,301,302,5,116,0,0,302, + 22,1,0,0,0,303,304,5,92,0,0,304,24,1,0,0,0,305,306,5,105,0,0,306,307,5, + 110,0,0,307,26,1,0,0,0,308,309,5,62,0,0,309,310,5,61,0,0,310,28,1,0,0, + 0,311,312,5,60,0,0,312,313,5,61,0,0,313,30,1,0,0,0,314,315,5,62,0,0,315, + 32,1,0,0,0,316,317,5,60,0,0,317,34,1,0,0,0,318,319,5,61,0,0,319,36,1,0, + 0,0,320,321,5,60,0,0,321,322,5,62,0,0,322,38,1,0,0,0,323,324,5,110,0,0, + 324,325,5,111,0,0,325,326,5,116,0,0,326,40,1,0,0,0,327,328,5,97,0,0,328, + 329,5,110,0,0,329,330,5,100,0,0,330,42,1,0,0,0,331,332,5,38,0,0,332,44, + 1,0,0,0,333,334,5,120,0,0,334,335,5,111,0,0,335,336,5,114,0,0,336,46,1, + 0,0,0,337,338,5,111,0,0,338,339,5,114,0,0,339,48,1,0,0,0,340,341,5,124, + 0,0,341,50,1,0,0,0,342,343,5,105,0,0,343,344,5,109,0,0,344,345,5,112,0, + 0,345,346,5,108,0,0,346,347,5,105,0,0,347,348,5,101,0,0,348,349,5,115, + 0,0,349,52,1,0,0,0,350,351,5,45,0,0,351,352,5,62,0,0,352,54,1,0,0,0,353, + 354,5,112,0,0,354,355,5,114,0,0,355,356,5,111,0,0,356,357,5,118,0,0,357, + 358,5,105,0,0,358,359,5,100,0,0,359,360,5,101,0,0,360,361,5,100,0,0,361, + 56,1,0,0,0,362,363,5,44,0,0,363,58,1,0,0,0,364,365,5,59,0,0,365,60,1,0, + 0,0,366,367,5,58,0,0,367,62,1,0,0,0,368,369,5,43,0,0,369,370,5,111,0,0, + 370,371,5,111,0,0,371,64,1,0,0,0,372,373,5,45,0,0,373,374,5,111,0,0,374, + 375,5,111,0,0,375,66,1,0,0,0,376,377,5,40,0,0,377,378,5,124,0,0,378,68, + 1,0,0,0,379,380,5,124,0,0,380,381,5,41,0,0,381,70,1,0,0,0,382,383,5,91, + 0,0,383,72,1,0,0,0,384,385,5,93,0,0,385,386,5,84,0,0,386,74,1,0,0,0,387, + 388,5,93,0,0,388,76,1,0,0,0,389,390,5,40,0,0,390,78,1,0,0,0,391,392,5, + 41,0,0,392,80,1,0,0,0,393,394,5,123,0,0,394,82,1,0,0,0,395,396,5,125,0, + 0,396,84,1,0,0,0,397,398,5,108,0,0,398,399,5,111,0,0,399,400,5,103,0,0, + 400,401,5,40,0,0,401,86,1,0,0,0,402,403,5,115,0,0,403,404,5,113,0,0,404, + 405,5,114,0,0,405,406,5,116,0,0,406,407,5,40,0,0,407,88,1,0,0,0,408,409, + 5,99,0,0,409,410,5,98,0,0,410,411,5,114,0,0,411,412,5,116,0,0,412,413, + 5,40,0,0,413,90,1,0,0,0,414,415,5,115,0,0,415,416,5,113,0,0,416,417,5, + 114,0,0,417,418,5,40,0,0,418,92,1,0,0,0,419,420,5,108,0,0,420,421,5,110, + 0,0,421,422,5,40,0,0,422,94,1,0,0,0,423,424,5,115,0,0,424,425,5,105,0, + 0,425,426,5,110,0,0,426,427,5,40,0,0,427,96,1,0,0,0,428,429,5,99,0,0,429, + 430,5,111,0,0,430,431,5,115,0,0,431,432,5,40,0,0,432,98,1,0,0,0,433,434, + 5,116,0,0,434,435,5,97,0,0,435,436,5,110,0,0,436,437,5,40,0,0,437,100, + 1,0,0,0,438,439,5,99,0,0,439,440,5,111,0,0,440,441,5,116,0,0,441,442,5, + 97,0,0,442,443,5,110,0,0,443,444,5,40,0,0,444,102,1,0,0,0,445,446,5,99, + 0,0,446,447,5,111,0,0,447,448,5,116,0,0,448,449,5,40,0,0,449,104,1,0,0, + 0,450,451,5,115,0,0,451,452,5,101,0,0,452,453,5,99,0,0,453,454,5,40,0, + 0,454,106,1,0,0,0,455,456,5,99,0,0,456,457,5,111,0,0,457,458,5,115,0,0, + 458,459,5,101,0,0,459,460,5,99,0,0,460,461,5,40,0,0,461,108,1,0,0,0,462, + 463,5,99,0,0,463,464,5,115,0,0,464,465,5,99,0,0,465,466,5,40,0,0,466,110, + 1,0,0,0,467,468,5,97,0,0,468,469,5,114,0,0,469,470,5,99,0,0,470,471,5, + 115,0,0,471,472,5,105,0,0,472,473,5,110,0,0,473,474,5,40,0,0,474,112,1, + 0,0,0,475,476,5,97,0,0,476,477,5,114,0,0,477,478,5,99,0,0,478,479,5,99, + 0,0,479,480,5,111,0,0,480,481,5,115,0,0,481,482,5,40,0,0,482,114,1,0,0, + 0,483,484,5,97,0,0,484,485,5,114,0,0,485,486,5,99,0,0,486,487,5,116,0, + 0,487,488,5,97,0,0,488,489,5,110,0,0,489,490,5,40,0,0,490,116,1,0,0,0, + 491,492,5,97,0,0,492,493,5,114,0,0,493,494,5,99,0,0,494,495,5,99,0,0,495, + 496,5,111,0,0,496,497,5,116,0,0,497,498,5,97,0,0,498,499,5,110,0,0,499, + 500,5,40,0,0,500,118,1,0,0,0,501,502,5,97,0,0,502,503,5,114,0,0,503,504, + 5,99,0,0,504,505,5,115,0,0,505,506,5,101,0,0,506,507,5,99,0,0,507,508, + 5,40,0,0,508,120,1,0,0,0,509,510,5,97,0,0,510,511,5,114,0,0,511,512,5, + 99,0,0,512,513,5,99,0,0,513,514,5,111,0,0,514,515,5,115,0,0,515,516,5, + 101,0,0,516,517,5,99,0,0,517,518,5,40,0,0,518,122,1,0,0,0,519,520,5,97, + 0,0,520,521,5,114,0,0,521,522,5,99,0,0,522,523,5,99,0,0,523,524,5,115, + 0,0,524,525,5,99,0,0,525,526,5,40,0,0,526,124,1,0,0,0,527,528,5,97,0,0, + 528,529,5,99,0,0,529,530,5,115,0,0,530,531,5,99,0,0,531,532,5,40,0,0,532, + 126,1,0,0,0,533,534,5,97,0,0,534,535,5,115,0,0,535,536,5,105,0,0,536,537, + 5,110,0,0,537,538,5,40,0,0,538,128,1,0,0,0,539,540,5,97,0,0,540,541,5, + 99,0,0,541,542,5,111,0,0,542,543,5,115,0,0,543,544,5,40,0,0,544,130,1, + 0,0,0,545,546,5,97,0,0,546,547,5,116,0,0,547,548,5,97,0,0,548,549,5,110, + 0,0,549,550,5,40,0,0,550,132,1,0,0,0,551,552,5,97,0,0,552,553,5,99,0,0, + 553,554,5,111,0,0,554,555,5,116,0,0,555,556,5,97,0,0,556,557,5,110,0,0, + 557,558,5,40,0,0,558,134,1,0,0,0,559,560,5,97,0,0,560,561,5,115,0,0,561, + 562,5,101,0,0,562,563,5,99,0,0,563,564,5,40,0,0,564,136,1,0,0,0,565,566, + 5,97,0,0,566,567,5,99,0,0,567,568,5,111,0,0,568,569,5,115,0,0,569,570, + 5,101,0,0,570,571,5,99,0,0,571,572,5,40,0,0,572,138,1,0,0,0,573,574,5, + 97,0,0,574,575,5,99,0,0,575,576,5,111,0,0,576,577,5,116,0,0,577,578,5, + 40,0,0,578,140,1,0,0,0,579,580,5,97,0,0,580,581,5,114,0,0,581,582,5,99, + 0,0,582,583,5,99,0,0,583,584,5,111,0,0,584,585,5,116,0,0,585,586,5,40, + 0,0,586,142,1,0,0,0,587,588,5,115,0,0,588,589,5,105,0,0,589,590,5,110, + 0,0,590,591,5,104,0,0,591,592,5,40,0,0,592,144,1,0,0,0,593,594,5,115,0, + 0,594,595,5,104,0,0,595,596,5,40,0,0,596,146,1,0,0,0,597,598,5,99,0,0, + 598,599,5,111,0,0,599,600,5,115,0,0,600,601,5,104,0,0,601,602,5,40,0,0, + 602,148,1,0,0,0,603,604,5,99,0,0,604,605,5,104,0,0,605,606,5,40,0,0,606, + 150,1,0,0,0,607,608,5,116,0,0,608,609,5,97,0,0,609,610,5,110,0,0,610,611, + 5,104,0,0,611,612,5,40,0,0,612,152,1,0,0,0,613,614,5,116,0,0,614,615,5, + 104,0,0,615,616,5,40,0,0,616,154,1,0,0,0,617,618,5,99,0,0,618,619,5,111, + 0,0,619,620,5,116,0,0,620,621,5,97,0,0,621,622,5,110,0,0,622,623,5,104, + 0,0,623,624,5,40,0,0,624,156,1,0,0,0,625,626,5,99,0,0,626,627,5,111,0, + 0,627,628,5,116,0,0,628,629,5,104,0,0,629,630,5,40,0,0,630,158,1,0,0,0, + 631,632,5,99,0,0,632,633,5,116,0,0,633,634,5,104,0,0,634,635,5,40,0,0, + 635,160,1,0,0,0,636,637,5,115,0,0,637,638,5,101,0,0,638,639,5,99,0,0,639, + 640,5,104,0,0,640,641,5,40,0,0,641,162,1,0,0,0,642,643,5,115,0,0,643,644, + 5,99,0,0,644,645,5,104,0,0,645,646,5,40,0,0,646,164,1,0,0,0,647,648,5, + 99,0,0,648,649,5,111,0,0,649,650,5,115,0,0,650,651,5,101,0,0,651,652,5, + 99,0,0,652,653,5,104,0,0,653,654,5,40,0,0,654,166,1,0,0,0,655,656,5,99, + 0,0,656,657,5,115,0,0,657,658,5,99,0,0,658,659,5,104,0,0,659,660,5,40, + 0,0,660,168,1,0,0,0,661,662,5,97,0,0,662,663,5,115,0,0,663,664,5,105,0, + 0,664,665,5,110,0,0,665,666,5,104,0,0,666,667,5,40,0,0,667,170,1,0,0,0, + 668,669,5,97,0,0,669,670,5,114,0,0,670,671,5,115,0,0,671,672,5,105,0,0, + 672,673,5,110,0,0,673,674,5,104,0,0,674,675,5,40,0,0,675,172,1,0,0,0,676, + 677,5,97,0,0,677,678,5,114,0,0,678,679,5,115,0,0,679,680,5,104,0,0,680, + 681,5,40,0,0,681,174,1,0,0,0,682,683,5,97,0,0,683,684,5,99,0,0,684,685, + 5,111,0,0,685,686,5,115,0,0,686,687,5,104,0,0,687,688,5,40,0,0,688,176, + 1,0,0,0,689,690,5,97,0,0,690,691,5,114,0,0,691,692,5,99,0,0,692,693,5, + 111,0,0,693,694,5,115,0,0,694,695,5,104,0,0,695,696,5,40,0,0,696,178,1, + 0,0,0,697,698,5,97,0,0,698,699,5,114,0,0,699,700,5,99,0,0,700,701,5,104, + 0,0,701,702,5,40,0,0,702,180,1,0,0,0,703,704,5,97,0,0,704,705,5,116,0, + 0,705,706,5,97,0,0,706,707,5,110,0,0,707,708,5,104,0,0,708,709,5,40,0, + 0,709,182,1,0,0,0,710,711,5,97,0,0,711,712,5,114,0,0,712,713,5,116,0,0, + 713,714,5,97,0,0,714,715,5,110,0,0,715,716,5,104,0,0,716,717,5,40,0,0, + 717,184,1,0,0,0,718,719,5,97,0,0,719,720,5,114,0,0,720,721,5,116,0,0,721, + 722,5,104,0,0,722,723,5,40,0,0,723,186,1,0,0,0,724,725,5,97,0,0,725,726, + 5,99,0,0,726,727,5,111,0,0,727,728,5,116,0,0,728,729,5,104,0,0,729,730, + 5,40,0,0,730,188,1,0,0,0,731,732,5,97,0,0,732,733,5,114,0,0,733,734,5, + 99,0,0,734,735,5,111,0,0,735,736,5,116,0,0,736,737,5,104,0,0,737,738,5, + 40,0,0,738,190,1,0,0,0,739,740,5,97,0,0,740,741,5,99,0,0,741,742,5,111, + 0,0,742,743,5,116,0,0,743,744,5,97,0,0,744,745,5,110,0,0,745,746,5,104, + 0,0,746,747,5,40,0,0,747,192,1,0,0,0,748,749,5,97,0,0,749,750,5,114,0, + 0,750,751,5,99,0,0,751,752,5,111,0,0,752,753,5,116,0,0,753,754,5,97,0, + 0,754,755,5,110,0,0,755,756,5,104,0,0,756,757,5,40,0,0,757,194,1,0,0,0, + 758,759,5,97,0,0,759,760,5,114,0,0,760,761,5,99,0,0,761,762,5,116,0,0, + 762,763,5,104,0,0,763,764,5,40,0,0,764,196,1,0,0,0,765,766,5,97,0,0,766, + 767,5,115,0,0,767,768,5,101,0,0,768,769,5,99,0,0,769,770,5,104,0,0,770, + 771,5,40,0,0,771,198,1,0,0,0,772,773,5,97,0,0,773,774,5,114,0,0,774,775, + 5,115,0,0,775,776,5,101,0,0,776,777,5,99,0,0,777,778,5,104,0,0,778,779, + 5,40,0,0,779,200,1,0,0,0,780,781,5,97,0,0,781,782,5,114,0,0,782,783,5, + 115,0,0,783,784,5,99,0,0,784,785,5,104,0,0,785,786,5,40,0,0,786,202,1, + 0,0,0,787,788,5,97,0,0,788,789,5,99,0,0,789,790,5,111,0,0,790,791,5,115, + 0,0,791,792,5,101,0,0,792,793,5,99,0,0,793,794,5,104,0,0,794,795,5,40, + 0,0,795,204,1,0,0,0,796,797,5,97,0,0,797,798,5,114,0,0,798,799,5,99,0, + 0,799,800,5,111,0,0,800,801,5,115,0,0,801,802,5,101,0,0,802,803,5,99,0, + 0,803,804,5,104,0,0,804,805,5,40,0,0,805,206,1,0,0,0,806,807,5,97,0,0, + 807,808,5,114,0,0,808,809,5,99,0,0,809,810,5,115,0,0,810,811,5,99,0,0, + 811,812,5,104,0,0,812,813,5,40,0,0,813,208,1,0,0,0,814,815,5,97,0,0,815, + 816,5,99,0,0,816,817,5,115,0,0,817,818,5,99,0,0,818,819,5,104,0,0,819, + 820,5,40,0,0,820,210,1,0,0,0,821,822,5,103,0,0,822,823,5,97,0,0,823,824, + 5,109,0,0,824,825,5,109,0,0,825,826,5,97,0,0,826,827,5,40,0,0,827,212, + 1,0,0,0,828,829,5,100,0,0,829,830,5,101,0,0,830,831,5,114,0,0,831,832, + 5,105,0,0,832,833,5,118,0,0,833,834,5,97,0,0,834,835,5,116,0,0,835,836, + 5,105,0,0,836,837,5,118,0,0,837,838,5,101,0,0,838,839,5,40,0,0,839,214, + 1,0,0,0,840,841,5,105,0,0,841,842,5,110,0,0,842,843,5,116,0,0,843,844, + 5,101,0,0,844,845,5,103,0,0,845,846,5,114,0,0,846,847,5,97,0,0,847,848, + 5,108,0,0,848,849,5,40,0,0,849,216,1,0,0,0,850,851,5,108,0,0,851,852,5, + 105,0,0,852,853,5,109,0,0,853,854,5,105,0,0,854,855,5,116,0,0,855,856, + 5,40,0,0,856,218,1,0,0,0,857,858,5,108,0,0,858,859,5,105,0,0,859,860,5, + 109,0,0,860,861,5,105,0,0,861,862,5,116,0,0,862,863,5,108,0,0,863,864, + 5,101,0,0,864,865,5,102,0,0,865,866,5,116,0,0,866,867,5,40,0,0,867,220, + 1,0,0,0,868,869,5,108,0,0,869,870,5,105,0,0,870,871,5,109,0,0,871,872, + 5,105,0,0,872,873,5,116,0,0,873,874,5,114,0,0,874,875,5,105,0,0,875,876, + 5,103,0,0,876,877,5,104,0,0,877,878,5,116,0,0,878,879,5,40,0,0,879,222, + 1,0,0,0,880,881,5,115,0,0,881,882,5,105,0,0,882,883,5,103,0,0,883,884, + 5,110,0,0,884,885,5,117,0,0,885,886,5,109,0,0,886,887,5,40,0,0,887,224, + 1,0,0,0,888,889,5,115,0,0,889,890,5,103,0,0,890,891,5,110,0,0,891,892, + 5,40,0,0,892,226,1,0,0,0,893,894,5,115,0,0,894,895,5,105,0,0,895,896,5, + 103,0,0,896,897,5,110,0,0,897,898,5,40,0,0,898,228,1,0,0,0,899,900,5,97, + 0,0,900,901,5,98,0,0,901,902,5,115,0,0,902,903,5,40,0,0,903,230,1,0,0, + 0,904,905,5,112,0,0,905,906,5,104,0,0,906,907,5,105,0,0,907,908,5,40,0, + 0,908,232,1,0,0,0,909,910,5,100,0,0,910,911,5,111,0,0,911,912,5,109,0, + 0,912,913,5,97,0,0,913,914,5,105,0,0,914,915,5,110,0,0,915,916,5,40,0, + 0,916,234,1,0,0,0,917,918,5,112,0,0,918,919,5,105,0,0,919,920,5,101,0, + 0,920,921,5,99,0,0,921,922,5,101,0,0,922,923,5,119,0,0,923,924,5,105,0, + 0,924,925,5,115,0,0,925,926,5,101,0,0,926,927,5,40,0,0,927,236,1,0,0,0, + 928,929,5,97,0,0,929,930,5,112,0,0,930,931,5,112,0,0,931,932,5,108,0,0, + 932,933,5,121,0,0,933,934,5,40,0,0,934,238,1,0,0,0,935,936,5,108,0,0,936, + 937,5,97,0,0,937,938,5,109,0,0,938,939,5,98,0,0,939,940,5,100,0,0,940, + 941,5,97,0,0,941,942,5,40,0,0,942,240,1,0,0,0,943,945,5,13,0,0,944,943, + 1,0,0,0,944,945,1,0,0,0,945,946,1,0,0,0,946,948,5,10,0,0,947,944,1,0,0, + 0,948,949,1,0,0,0,949,947,1,0,0,0,949,950,1,0,0,0,950,951,1,0,0,0,951, + 952,6,120,0,0,952,242,1,0,0,0,953,955,7,0,0,0,954,956,7,1,0,0,955,954, + 1,0,0,0,955,956,1,0,0,0,956,958,1,0,0,0,957,959,2,48,57,0,958,957,1,0, + 0,0,959,960,1,0,0,0,960,958,1,0,0,0,960,961,1,0,0,0,961,244,1,0,0,0,962, + 964,2,48,57,0,963,962,1,0,0,0,964,965,1,0,0,0,965,963,1,0,0,0,965,966, + 1,0,0,0,966,967,1,0,0,0,967,971,5,46,0,0,968,970,2,48,57,0,969,968,1,0, + 0,0,970,973,1,0,0,0,971,969,1,0,0,0,971,972,1,0,0,0,972,975,1,0,0,0,973, + 971,1,0,0,0,974,976,3,243,121,0,975,974,1,0,0,0,975,976,1,0,0,0,976,978, + 1,0,0,0,977,979,5,105,0,0,978,977,1,0,0,0,978,979,1,0,0,0,979,996,1,0, + 0,0,980,982,5,46,0,0,981,980,1,0,0,0,981,982,1,0,0,0,982,984,1,0,0,0,983, + 985,2,48,57,0,984,983,1,0,0,0,985,986,1,0,0,0,986,984,1,0,0,0,986,987, + 1,0,0,0,987,989,1,0,0,0,988,990,3,243,121,0,989,988,1,0,0,0,989,990,1, + 0,0,0,990,992,1,0,0,0,991,993,5,105,0,0,992,991,1,0,0,0,992,993,1,0,0, + 0,993,996,1,0,0,0,994,996,5,105,0,0,995,963,1,0,0,0,995,981,1,0,0,0,995, + 994,1,0,0,0,996,246,1,0,0,0,997,998,5,67,0,0,998,1008,5,67,0,0,999,1000, + 5,82,0,0,1000,1008,5,82,0,0,1001,1002,5,81,0,0,1002,1008,5,81,0,0,1003, + 1004,5,90,0,0,1004,1008,5,90,0,0,1005,1006,5,66,0,0,1006,1008,5,66,0,0, + 1007,997,1,0,0,0,1007,999,1,0,0,0,1007,1001,1,0,0,0,1007,1003,1,0,0,0, + 1007,1005,1,0,0,0,1008,248,1,0,0,0,1009,1010,5,116,0,0,1010,1011,5,114, + 0,0,1011,1012,5,117,0,0,1012,1028,5,101,0,0,1013,1014,5,84,0,0,1014,1015, + 5,114,0,0,1015,1016,5,117,0,0,1016,1028,5,101,0,0,1017,1018,5,102,0,0, + 1018,1019,5,97,0,0,1019,1020,5,108,0,0,1020,1021,5,115,0,0,1021,1028,5, + 101,0,0,1022,1023,5,70,0,0,1023,1024,5,97,0,0,1024,1025,5,108,0,0,1025, + 1026,5,115,0,0,1026,1028,5,101,0,0,1027,1009,1,0,0,0,1027,1013,1,0,0,0, + 1027,1017,1,0,0,0,1027,1022,1,0,0,0,1028,250,1,0,0,0,1029,1031,7,2,0,0, + 1030,1029,1,0,0,0,1031,1032,1,0,0,0,1032,1030,1,0,0,0,1032,1033,1,0,0, + 0,1033,1040,1,0,0,0,1034,1036,5,95,0,0,1035,1037,7,3,0,0,1036,1035,1,0, + 0,0,1037,1038,1,0,0,0,1038,1036,1,0,0,0,1038,1039,1,0,0,0,1039,1041,1, + 0,0,0,1040,1034,1,0,0,0,1040,1041,1,0,0,0,1041,252,1,0,0,0,1042,1043,5, + 47,0,0,1043,1044,5,47,0,0,1044,1048,1,0,0,0,1045,1047,8,4,0,0,1046,1045, + 1,0,0,0,1047,1050,1,0,0,0,1048,1046,1,0,0,0,1048,1049,1,0,0,0,1049,1052, + 1,0,0,0,1050,1048,1,0,0,0,1051,1053,5,13,0,0,1052,1051,1,0,0,0,1052,1053, + 1,0,0,0,1053,1054,1,0,0,0,1054,1067,5,10,0,0,1055,1056,5,47,0,0,1056,1057, + 5,42,0,0,1057,1061,1,0,0,0,1058,1060,9,0,0,0,1059,1058,1,0,0,0,1060,1063, + 1,0,0,0,1061,1062,1,0,0,0,1061,1059,1,0,0,0,1062,1064,1,0,0,0,1063,1061, + 1,0,0,0,1064,1065,5,42,0,0,1065,1067,5,47,0,0,1066,1042,1,0,0,0,1066,1055, + 1,0,0,0,1067,1068,1,0,0,0,1068,1069,6,126,0,0,1069,254,1,0,0,0,1070,1072, + 7,5,0,0,1071,1070,1,0,0,0,1072,1073,1,0,0,0,1073,1071,1,0,0,0,1073,1074, + 1,0,0,0,1074,1075,1,0,0,0,1075,1076,6,127,0,0,1076,256,1,0,0,0,24,0,944, + 949,955,960,965,971,975,978,981,986,989,992,995,1007,1027,1032,1038,1040, + 1048,1052,1061,1066,1073,1,6,0,0 }; public static readonly ATN _ATN = diff --git a/Sources/AngouriMath/Core/Antlr/AngouriMathLexer.interp b/Sources/AngouriMath/Core/Antlr/AngouriMathLexer.interp index cde39258c..e97778ba8 100644 --- a/Sources/AngouriMath/Core/Antlr/AngouriMathLexer.interp +++ b/Sources/AngouriMath/Core/Antlr/AngouriMathLexer.interp @@ -17,8 +17,8 @@ null '<=' '>' '<' -'equalizes' '=' +'<>' 'not' 'and' '&' @@ -396,4 +396,4 @@ mode names: DEFAULT_MODE atn: -[4, 0, 127, 1084, 6, -1, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 2, 41, 7, 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 2, 45, 7, 45, 2, 46, 7, 46, 2, 47, 7, 47, 2, 48, 7, 48, 2, 49, 7, 49, 2, 50, 7, 50, 2, 51, 7, 51, 2, 52, 7, 52, 2, 53, 7, 53, 2, 54, 7, 54, 2, 55, 7, 55, 2, 56, 7, 56, 2, 57, 7, 57, 2, 58, 7, 58, 2, 59, 7, 59, 2, 60, 7, 60, 2, 61, 7, 61, 2, 62, 7, 62, 2, 63, 7, 63, 2, 64, 7, 64, 2, 65, 7, 65, 2, 66, 7, 66, 2, 67, 7, 67, 2, 68, 7, 68, 2, 69, 7, 69, 2, 70, 7, 70, 2, 71, 7, 71, 2, 72, 7, 72, 2, 73, 7, 73, 2, 74, 7, 74, 2, 75, 7, 75, 2, 76, 7, 76, 2, 77, 7, 77, 2, 78, 7, 78, 2, 79, 7, 79, 2, 80, 7, 80, 2, 81, 7, 81, 2, 82, 7, 82, 2, 83, 7, 83, 2, 84, 7, 84, 2, 85, 7, 85, 2, 86, 7, 86, 2, 87, 7, 87, 2, 88, 7, 88, 2, 89, 7, 89, 2, 90, 7, 90, 2, 91, 7, 91, 2, 92, 7, 92, 2, 93, 7, 93, 2, 94, 7, 94, 2, 95, 7, 95, 2, 96, 7, 96, 2, 97, 7, 97, 2, 98, 7, 98, 2, 99, 7, 99, 2, 100, 7, 100, 2, 101, 7, 101, 2, 102, 7, 102, 2, 103, 7, 103, 2, 104, 7, 104, 2, 105, 7, 105, 2, 106, 7, 106, 2, 107, 7, 107, 2, 108, 7, 108, 2, 109, 7, 109, 2, 110, 7, 110, 2, 111, 7, 111, 2, 112, 7, 112, 2, 113, 7, 113, 2, 114, 7, 114, 2, 115, 7, 115, 2, 116, 7, 116, 2, 117, 7, 117, 2, 118, 7, 118, 2, 119, 7, 119, 2, 120, 7, 120, 2, 121, 7, 121, 2, 122, 7, 122, 2, 123, 7, 123, 2, 124, 7, 124, 2, 125, 7, 125, 2, 126, 7, 126, 2, 127, 7, 127, 1, 0, 1, 0, 1, 1, 1, 1, 1, 2, 1, 2, 1, 3, 1, 3, 1, 4, 1, 4, 1, 5, 1, 5, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 9, 1, 9, 1, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 18, 1, 18, 1, 19, 1, 19, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 20, 1, 21, 1, 21, 1, 22, 1, 22, 1, 22, 1, 22, 1, 23, 1, 23, 1, 23, 1, 24, 1, 24, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 26, 1, 26, 1, 26, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 28, 1, 28, 1, 29, 1, 29, 1, 30, 1, 30, 1, 31, 1, 31, 1, 31, 1, 31, 1, 32, 1, 32, 1, 32, 1, 32, 1, 33, 1, 33, 1, 33, 1, 34, 1, 34, 1, 34, 1, 35, 1, 35, 1, 36, 1, 36, 1, 36, 1, 37, 1, 37, 1, 38, 1, 38, 1, 39, 1, 39, 1, 40, 1, 40, 1, 41, 1, 41, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 46, 1, 46, 1, 46, 1, 46, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 72, 1, 72, 1, 72, 1, 72, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 74, 1, 74, 1, 74, 1, 74, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 76, 1, 76, 1, 76, 1, 76, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 84, 1, 84, 1, 84, 1, 84, 1, 84, 1, 84, 1, 84, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 88, 1, 88, 1, 88, 1, 88, 1, 88, 1, 88, 1, 88, 1, 88, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 1, 90, 1, 90, 1, 90, 1, 90, 1, 90, 1, 90, 1, 90, 1, 91, 1, 91, 1, 91, 1, 91, 1, 91, 1, 91, 1, 91, 1, 91, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 96, 1, 96, 1, 96, 1, 96, 1, 96, 1, 96, 1, 96, 1, 96, 1, 96, 1, 96, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 99, 1, 99, 1, 99, 1, 99, 1, 99, 1, 99, 1, 99, 1, 99, 1, 100, 1, 100, 1, 100, 1, 100, 1, 100, 1, 100, 1, 100, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 102, 1, 102, 1, 102, 1, 102, 1, 102, 1, 102, 1, 102, 1, 102, 1, 102, 1, 102, 1, 103, 1, 103, 1, 103, 1, 103, 1, 103, 1, 103, 1, 103, 1, 103, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 118, 1, 118, 1, 118, 1, 118, 1, 118, 1, 118, 1, 118, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 120, 3, 120, 952, 8, 120, 1, 120, 4, 120, 955, 8, 120, 11, 120, 12, 120, 956, 1, 120, 1, 120, 1, 121, 1, 121, 3, 121, 963, 8, 121, 1, 121, 4, 121, 966, 8, 121, 11, 121, 12, 121, 967, 1, 122, 4, 122, 971, 8, 122, 11, 122, 12, 122, 972, 1, 122, 1, 122, 5, 122, 977, 8, 122, 10, 122, 12, 122, 980, 9, 122, 1, 122, 3, 122, 983, 8, 122, 1, 122, 3, 122, 986, 8, 122, 1, 122, 3, 122, 989, 8, 122, 1, 122, 4, 122, 992, 8, 122, 11, 122, 12, 122, 993, 1, 122, 3, 122, 997, 8, 122, 1, 122, 3, 122, 1000, 8, 122, 1, 122, 3, 122, 1003, 8, 122, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 3, 123, 1015, 8, 123, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 3, 124, 1035, 8, 124, 1, 125, 4, 125, 1038, 8, 125, 11, 125, 12, 125, 1039, 1, 125, 1, 125, 4, 125, 1044, 8, 125, 11, 125, 12, 125, 1045, 3, 125, 1048, 8, 125, 1, 126, 1, 126, 1, 126, 1, 126, 5, 126, 1054, 8, 126, 10, 126, 12, 126, 1057, 9, 126, 1, 126, 3, 126, 1060, 8, 126, 1, 126, 1, 126, 1, 126, 1, 126, 1, 126, 5, 126, 1067, 8, 126, 10, 126, 12, 126, 1070, 9, 126, 1, 126, 1, 126, 3, 126, 1074, 8, 126, 1, 126, 1, 126, 1, 127, 4, 127, 1079, 8, 127, 11, 127, 12, 127, 1080, 1, 127, 1, 127, 1, 1068, 0, 128, 1, 1, 3, 2, 5, 3, 7, 4, 9, 5, 11, 6, 13, 7, 15, 8, 17, 9, 19, 10, 21, 11, 23, 12, 25, 13, 27, 14, 29, 15, 31, 16, 33, 17, 35, 18, 37, 19, 39, 20, 41, 21, 43, 22, 45, 23, 47, 24, 49, 25, 51, 26, 53, 27, 55, 28, 57, 29, 59, 30, 61, 31, 63, 32, 65, 33, 67, 34, 69, 35, 71, 36, 73, 37, 75, 38, 77, 39, 79, 40, 81, 41, 83, 42, 85, 43, 87, 44, 89, 45, 91, 46, 93, 47, 95, 48, 97, 49, 99, 50, 101, 51, 103, 52, 105, 53, 107, 54, 109, 55, 111, 56, 113, 57, 115, 58, 117, 59, 119, 60, 121, 61, 123, 62, 125, 63, 127, 64, 129, 65, 131, 66, 133, 67, 135, 68, 137, 69, 139, 70, 141, 71, 143, 72, 145, 73, 147, 74, 149, 75, 151, 76, 153, 77, 155, 78, 157, 79, 159, 80, 161, 81, 163, 82, 165, 83, 167, 84, 169, 85, 171, 86, 173, 87, 175, 88, 177, 89, 179, 90, 181, 91, 183, 92, 185, 93, 187, 94, 189, 95, 191, 96, 193, 97, 195, 98, 197, 99, 199, 100, 201, 101, 203, 102, 205, 103, 207, 104, 209, 105, 211, 106, 213, 107, 215, 108, 217, 109, 219, 110, 221, 111, 223, 112, 225, 113, 227, 114, 229, 115, 231, 116, 233, 117, 235, 118, 237, 119, 239, 120, 241, 121, 243, 0, 245, 122, 247, 123, 249, 124, 251, 125, 253, 126, 255, 127, 1, 0, 6, 2, 0, 69, 69, 101, 101, 2, 0, 43, 43, 45, 45, 4, 0, 65, 90, 97, 122, 880, 1279, 7936, 8191, 5, 0, 48, 57, 65, 90, 97, 122, 880, 1279, 7936, 8191, 2, 0, 10, 10, 13, 13, 2, 0, 9, 9, 32, 32, 1111, 0, 1, 1, 0, 0, 0, 0, 3, 1, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 7, 1, 0, 0, 0, 0, 9, 1, 0, 0, 0, 0, 11, 1, 0, 0, 0, 0, 13, 1, 0, 0, 0, 0, 15, 1, 0, 0, 0, 0, 17, 1, 0, 0, 0, 0, 19, 1, 0, 0, 0, 0, 21, 1, 0, 0, 0, 0, 23, 1, 0, 0, 0, 0, 25, 1, 0, 0, 0, 0, 27, 1, 0, 0, 0, 0, 29, 1, 0, 0, 0, 0, 31, 1, 0, 0, 0, 0, 33, 1, 0, 0, 0, 0, 35, 1, 0, 0, 0, 0, 37, 1, 0, 0, 0, 0, 39, 1, 0, 0, 0, 0, 41, 1, 0, 0, 0, 0, 43, 1, 0, 0, 0, 0, 45, 1, 0, 0, 0, 0, 47, 1, 0, 0, 0, 0, 49, 1, 0, 0, 0, 0, 51, 1, 0, 0, 0, 0, 53, 1, 0, 0, 0, 0, 55, 1, 0, 0, 0, 0, 57, 1, 0, 0, 0, 0, 59, 1, 0, 0, 0, 0, 61, 1, 0, 0, 0, 0, 63, 1, 0, 0, 0, 0, 65, 1, 0, 0, 0, 0, 67, 1, 0, 0, 0, 0, 69, 1, 0, 0, 0, 0, 71, 1, 0, 0, 0, 0, 73, 1, 0, 0, 0, 0, 75, 1, 0, 0, 0, 0, 77, 1, 0, 0, 0, 0, 79, 1, 0, 0, 0, 0, 81, 1, 0, 0, 0, 0, 83, 1, 0, 0, 0, 0, 85, 1, 0, 0, 0, 0, 87, 1, 0, 0, 0, 0, 89, 1, 0, 0, 0, 0, 91, 1, 0, 0, 0, 0, 93, 1, 0, 0, 0, 0, 95, 1, 0, 0, 0, 0, 97, 1, 0, 0, 0, 0, 99, 1, 0, 0, 0, 0, 101, 1, 0, 0, 0, 0, 103, 1, 0, 0, 0, 0, 105, 1, 0, 0, 0, 0, 107, 1, 0, 0, 0, 0, 109, 1, 0, 0, 0, 0, 111, 1, 0, 0, 0, 0, 113, 1, 0, 0, 0, 0, 115, 1, 0, 0, 0, 0, 117, 1, 0, 0, 0, 0, 119, 1, 0, 0, 0, 0, 121, 1, 0, 0, 0, 0, 123, 1, 0, 0, 0, 0, 125, 1, 0, 0, 0, 0, 127, 1, 0, 0, 0, 0, 129, 1, 0, 0, 0, 0, 131, 1, 0, 0, 0, 0, 133, 1, 0, 0, 0, 0, 135, 1, 0, 0, 0, 0, 137, 1, 0, 0, 0, 0, 139, 1, 0, 0, 0, 0, 141, 1, 0, 0, 0, 0, 143, 1, 0, 0, 0, 0, 145, 1, 0, 0, 0, 0, 147, 1, 0, 0, 0, 0, 149, 1, 0, 0, 0, 0, 151, 1, 0, 0, 0, 0, 153, 1, 0, 0, 0, 0, 155, 1, 0, 0, 0, 0, 157, 1, 0, 0, 0, 0, 159, 1, 0, 0, 0, 0, 161, 1, 0, 0, 0, 0, 163, 1, 0, 0, 0, 0, 165, 1, 0, 0, 0, 0, 167, 1, 0, 0, 0, 0, 169, 1, 0, 0, 0, 0, 171, 1, 0, 0, 0, 0, 173, 1, 0, 0, 0, 0, 175, 1, 0, 0, 0, 0, 177, 1, 0, 0, 0, 0, 179, 1, 0, 0, 0, 0, 181, 1, 0, 0, 0, 0, 183, 1, 0, 0, 0, 0, 185, 1, 0, 0, 0, 0, 187, 1, 0, 0, 0, 0, 189, 1, 0, 0, 0, 0, 191, 1, 0, 0, 0, 0, 193, 1, 0, 0, 0, 0, 195, 1, 0, 0, 0, 0, 197, 1, 0, 0, 0, 0, 199, 1, 0, 0, 0, 0, 201, 1, 0, 0, 0, 0, 203, 1, 0, 0, 0, 0, 205, 1, 0, 0, 0, 0, 207, 1, 0, 0, 0, 0, 209, 1, 0, 0, 0, 0, 211, 1, 0, 0, 0, 0, 213, 1, 0, 0, 0, 0, 215, 1, 0, 0, 0, 0, 217, 1, 0, 0, 0, 0, 219, 1, 0, 0, 0, 0, 221, 1, 0, 0, 0, 0, 223, 1, 0, 0, 0, 0, 225, 1, 0, 0, 0, 0, 227, 1, 0, 0, 0, 0, 229, 1, 0, 0, 0, 0, 231, 1, 0, 0, 0, 0, 233, 1, 0, 0, 0, 0, 235, 1, 0, 0, 0, 0, 237, 1, 0, 0, 0, 0, 239, 1, 0, 0, 0, 0, 241, 1, 0, 0, 0, 0, 245, 1, 0, 0, 0, 0, 247, 1, 0, 0, 0, 0, 249, 1, 0, 0, 0, 0, 251, 1, 0, 0, 0, 0, 253, 1, 0, 0, 0, 0, 255, 1, 0, 0, 0, 1, 257, 1, 0, 0, 0, 3, 259, 1, 0, 0, 0, 5, 261, 1, 0, 0, 0, 7, 263, 1, 0, 0, 0, 9, 265, 1, 0, 0, 0, 11, 267, 1, 0, 0, 0, 13, 269, 1, 0, 0, 0, 15, 279, 1, 0, 0, 0, 17, 282, 1, 0, 0, 0, 19, 288, 1, 0, 0, 0, 21, 291, 1, 0, 0, 0, 23, 303, 1, 0, 0, 0, 25, 305, 1, 0, 0, 0, 27, 308, 1, 0, 0, 0, 29, 311, 1, 0, 0, 0, 31, 314, 1, 0, 0, 0, 33, 316, 1, 0, 0, 0, 35, 318, 1, 0, 0, 0, 37, 328, 1, 0, 0, 0, 39, 330, 1, 0, 0, 0, 41, 334, 1, 0, 0, 0, 43, 338, 1, 0, 0, 0, 45, 340, 1, 0, 0, 0, 47, 344, 1, 0, 0, 0, 49, 347, 1, 0, 0, 0, 51, 349, 1, 0, 0, 0, 53, 357, 1, 0, 0, 0, 55, 360, 1, 0, 0, 0, 57, 369, 1, 0, 0, 0, 59, 371, 1, 0, 0, 0, 61, 373, 1, 0, 0, 0, 63, 375, 1, 0, 0, 0, 65, 379, 1, 0, 0, 0, 67, 383, 1, 0, 0, 0, 69, 386, 1, 0, 0, 0, 71, 389, 1, 0, 0, 0, 73, 391, 1, 0, 0, 0, 75, 394, 1, 0, 0, 0, 77, 396, 1, 0, 0, 0, 79, 398, 1, 0, 0, 0, 81, 400, 1, 0, 0, 0, 83, 402, 1, 0, 0, 0, 85, 404, 1, 0, 0, 0, 87, 409, 1, 0, 0, 0, 89, 415, 1, 0, 0, 0, 91, 421, 1, 0, 0, 0, 93, 426, 1, 0, 0, 0, 95, 430, 1, 0, 0, 0, 97, 435, 1, 0, 0, 0, 99, 440, 1, 0, 0, 0, 101, 445, 1, 0, 0, 0, 103, 452, 1, 0, 0, 0, 105, 457, 1, 0, 0, 0, 107, 462, 1, 0, 0, 0, 109, 469, 1, 0, 0, 0, 111, 474, 1, 0, 0, 0, 113, 482, 1, 0, 0, 0, 115, 490, 1, 0, 0, 0, 117, 498, 1, 0, 0, 0, 119, 508, 1, 0, 0, 0, 121, 516, 1, 0, 0, 0, 123, 526, 1, 0, 0, 0, 125, 534, 1, 0, 0, 0, 127, 540, 1, 0, 0, 0, 129, 546, 1, 0, 0, 0, 131, 552, 1, 0, 0, 0, 133, 558, 1, 0, 0, 0, 135, 566, 1, 0, 0, 0, 137, 572, 1, 0, 0, 0, 139, 580, 1, 0, 0, 0, 141, 586, 1, 0, 0, 0, 143, 594, 1, 0, 0, 0, 145, 600, 1, 0, 0, 0, 147, 604, 1, 0, 0, 0, 149, 610, 1, 0, 0, 0, 151, 614, 1, 0, 0, 0, 153, 620, 1, 0, 0, 0, 155, 624, 1, 0, 0, 0, 157, 632, 1, 0, 0, 0, 159, 638, 1, 0, 0, 0, 161, 643, 1, 0, 0, 0, 163, 649, 1, 0, 0, 0, 165, 654, 1, 0, 0, 0, 167, 662, 1, 0, 0, 0, 169, 668, 1, 0, 0, 0, 171, 675, 1, 0, 0, 0, 173, 683, 1, 0, 0, 0, 175, 689, 1, 0, 0, 0, 177, 696, 1, 0, 0, 0, 179, 704, 1, 0, 0, 0, 181, 710, 1, 0, 0, 0, 183, 717, 1, 0, 0, 0, 185, 725, 1, 0, 0, 0, 187, 731, 1, 0, 0, 0, 189, 738, 1, 0, 0, 0, 191, 746, 1, 0, 0, 0, 193, 755, 1, 0, 0, 0, 195, 765, 1, 0, 0, 0, 197, 772, 1, 0, 0, 0, 199, 779, 1, 0, 0, 0, 201, 787, 1, 0, 0, 0, 203, 794, 1, 0, 0, 0, 205, 803, 1, 0, 0, 0, 207, 813, 1, 0, 0, 0, 209, 821, 1, 0, 0, 0, 211, 828, 1, 0, 0, 0, 213, 835, 1, 0, 0, 0, 215, 847, 1, 0, 0, 0, 217, 857, 1, 0, 0, 0, 219, 864, 1, 0, 0, 0, 221, 875, 1, 0, 0, 0, 223, 887, 1, 0, 0, 0, 225, 895, 1, 0, 0, 0, 227, 900, 1, 0, 0, 0, 229, 906, 1, 0, 0, 0, 231, 911, 1, 0, 0, 0, 233, 916, 1, 0, 0, 0, 235, 924, 1, 0, 0, 0, 237, 935, 1, 0, 0, 0, 239, 942, 1, 0, 0, 0, 241, 954, 1, 0, 0, 0, 243, 960, 1, 0, 0, 0, 245, 1002, 1, 0, 0, 0, 247, 1014, 1, 0, 0, 0, 249, 1034, 1, 0, 0, 0, 251, 1037, 1, 0, 0, 0, 253, 1073, 1, 0, 0, 0, 255, 1078, 1, 0, 0, 0, 257, 258, 5, 33, 0, 0, 258, 2, 1, 0, 0, 0, 259, 260, 5, 94, 0, 0, 260, 4, 1, 0, 0, 0, 261, 262, 5, 45, 0, 0, 262, 6, 1, 0, 0, 0, 263, 264, 5, 43, 0, 0, 264, 8, 1, 0, 0, 0, 265, 266, 5, 42, 0, 0, 266, 10, 1, 0, 0, 0, 267, 268, 5, 47, 0, 0, 268, 12, 1, 0, 0, 0, 269, 270, 5, 105, 0, 0, 270, 271, 5, 110, 0, 0, 271, 272, 5, 116, 0, 0, 272, 273, 5, 101, 0, 0, 273, 274, 5, 114, 0, 0, 274, 275, 5, 115, 0, 0, 275, 276, 5, 101, 0, 0, 276, 277, 5, 99, 0, 0, 277, 278, 5, 116, 0, 0, 278, 14, 1, 0, 0, 0, 279, 280, 5, 47, 0, 0, 280, 281, 5, 92, 0, 0, 281, 16, 1, 0, 0, 0, 282, 283, 5, 117, 0, 0, 283, 284, 5, 110, 0, 0, 284, 285, 5, 105, 0, 0, 285, 286, 5, 116, 0, 0, 286, 287, 5, 101, 0, 0, 287, 18, 1, 0, 0, 0, 288, 289, 5, 92, 0, 0, 289, 290, 5, 47, 0, 0, 290, 20, 1, 0, 0, 0, 291, 292, 5, 115, 0, 0, 292, 293, 5, 101, 0, 0, 293, 294, 5, 116, 0, 0, 294, 295, 5, 115, 0, 0, 295, 296, 5, 117, 0, 0, 296, 297, 5, 98, 0, 0, 297, 298, 5, 116, 0, 0, 298, 299, 5, 114, 0, 0, 299, 300, 5, 97, 0, 0, 300, 301, 5, 99, 0, 0, 301, 302, 5, 116, 0, 0, 302, 22, 1, 0, 0, 0, 303, 304, 5, 92, 0, 0, 304, 24, 1, 0, 0, 0, 305, 306, 5, 105, 0, 0, 306, 307, 5, 110, 0, 0, 307, 26, 1, 0, 0, 0, 308, 309, 5, 62, 0, 0, 309, 310, 5, 61, 0, 0, 310, 28, 1, 0, 0, 0, 311, 312, 5, 60, 0, 0, 312, 313, 5, 61, 0, 0, 313, 30, 1, 0, 0, 0, 314, 315, 5, 62, 0, 0, 315, 32, 1, 0, 0, 0, 316, 317, 5, 60, 0, 0, 317, 34, 1, 0, 0, 0, 318, 319, 5, 101, 0, 0, 319, 320, 5, 113, 0, 0, 320, 321, 5, 117, 0, 0, 321, 322, 5, 97, 0, 0, 322, 323, 5, 108, 0, 0, 323, 324, 5, 105, 0, 0, 324, 325, 5, 122, 0, 0, 325, 326, 5, 101, 0, 0, 326, 327, 5, 115, 0, 0, 327, 36, 1, 0, 0, 0, 328, 329, 5, 61, 0, 0, 329, 38, 1, 0, 0, 0, 330, 331, 5, 110, 0, 0, 331, 332, 5, 111, 0, 0, 332, 333, 5, 116, 0, 0, 333, 40, 1, 0, 0, 0, 334, 335, 5, 97, 0, 0, 335, 336, 5, 110, 0, 0, 336, 337, 5, 100, 0, 0, 337, 42, 1, 0, 0, 0, 338, 339, 5, 38, 0, 0, 339, 44, 1, 0, 0, 0, 340, 341, 5, 120, 0, 0, 341, 342, 5, 111, 0, 0, 342, 343, 5, 114, 0, 0, 343, 46, 1, 0, 0, 0, 344, 345, 5, 111, 0, 0, 345, 346, 5, 114, 0, 0, 346, 48, 1, 0, 0, 0, 347, 348, 5, 124, 0, 0, 348, 50, 1, 0, 0, 0, 349, 350, 5, 105, 0, 0, 350, 351, 5, 109, 0, 0, 351, 352, 5, 112, 0, 0, 352, 353, 5, 108, 0, 0, 353, 354, 5, 105, 0, 0, 354, 355, 5, 101, 0, 0, 355, 356, 5, 115, 0, 0, 356, 52, 1, 0, 0, 0, 357, 358, 5, 45, 0, 0, 358, 359, 5, 62, 0, 0, 359, 54, 1, 0, 0, 0, 360, 361, 5, 112, 0, 0, 361, 362, 5, 114, 0, 0, 362, 363, 5, 111, 0, 0, 363, 364, 5, 118, 0, 0, 364, 365, 5, 105, 0, 0, 365, 366, 5, 100, 0, 0, 366, 367, 5, 101, 0, 0, 367, 368, 5, 100, 0, 0, 368, 56, 1, 0, 0, 0, 369, 370, 5, 44, 0, 0, 370, 58, 1, 0, 0, 0, 371, 372, 5, 59, 0, 0, 372, 60, 1, 0, 0, 0, 373, 374, 5, 58, 0, 0, 374, 62, 1, 0, 0, 0, 375, 376, 5, 43, 0, 0, 376, 377, 5, 111, 0, 0, 377, 378, 5, 111, 0, 0, 378, 64, 1, 0, 0, 0, 379, 380, 5, 45, 0, 0, 380, 381, 5, 111, 0, 0, 381, 382, 5, 111, 0, 0, 382, 66, 1, 0, 0, 0, 383, 384, 5, 40, 0, 0, 384, 385, 5, 124, 0, 0, 385, 68, 1, 0, 0, 0, 386, 387, 5, 124, 0, 0, 387, 388, 5, 41, 0, 0, 388, 70, 1, 0, 0, 0, 389, 390, 5, 91, 0, 0, 390, 72, 1, 0, 0, 0, 391, 392, 5, 93, 0, 0, 392, 393, 5, 84, 0, 0, 393, 74, 1, 0, 0, 0, 394, 395, 5, 93, 0, 0, 395, 76, 1, 0, 0, 0, 396, 397, 5, 40, 0, 0, 397, 78, 1, 0, 0, 0, 398, 399, 5, 41, 0, 0, 399, 80, 1, 0, 0, 0, 400, 401, 5, 123, 0, 0, 401, 82, 1, 0, 0, 0, 402, 403, 5, 125, 0, 0, 403, 84, 1, 0, 0, 0, 404, 405, 5, 108, 0, 0, 405, 406, 5, 111, 0, 0, 406, 407, 5, 103, 0, 0, 407, 408, 5, 40, 0, 0, 408, 86, 1, 0, 0, 0, 409, 410, 5, 115, 0, 0, 410, 411, 5, 113, 0, 0, 411, 412, 5, 114, 0, 0, 412, 413, 5, 116, 0, 0, 413, 414, 5, 40, 0, 0, 414, 88, 1, 0, 0, 0, 415, 416, 5, 99, 0, 0, 416, 417, 5, 98, 0, 0, 417, 418, 5, 114, 0, 0, 418, 419, 5, 116, 0, 0, 419, 420, 5, 40, 0, 0, 420, 90, 1, 0, 0, 0, 421, 422, 5, 115, 0, 0, 422, 423, 5, 113, 0, 0, 423, 424, 5, 114, 0, 0, 424, 425, 5, 40, 0, 0, 425, 92, 1, 0, 0, 0, 426, 427, 5, 108, 0, 0, 427, 428, 5, 110, 0, 0, 428, 429, 5, 40, 0, 0, 429, 94, 1, 0, 0, 0, 430, 431, 5, 115, 0, 0, 431, 432, 5, 105, 0, 0, 432, 433, 5, 110, 0, 0, 433, 434, 5, 40, 0, 0, 434, 96, 1, 0, 0, 0, 435, 436, 5, 99, 0, 0, 436, 437, 5, 111, 0, 0, 437, 438, 5, 115, 0, 0, 438, 439, 5, 40, 0, 0, 439, 98, 1, 0, 0, 0, 440, 441, 5, 116, 0, 0, 441, 442, 5, 97, 0, 0, 442, 443, 5, 110, 0, 0, 443, 444, 5, 40, 0, 0, 444, 100, 1, 0, 0, 0, 445, 446, 5, 99, 0, 0, 446, 447, 5, 111, 0, 0, 447, 448, 5, 116, 0, 0, 448, 449, 5, 97, 0, 0, 449, 450, 5, 110, 0, 0, 450, 451, 5, 40, 0, 0, 451, 102, 1, 0, 0, 0, 452, 453, 5, 99, 0, 0, 453, 454, 5, 111, 0, 0, 454, 455, 5, 116, 0, 0, 455, 456, 5, 40, 0, 0, 456, 104, 1, 0, 0, 0, 457, 458, 5, 115, 0, 0, 458, 459, 5, 101, 0, 0, 459, 460, 5, 99, 0, 0, 460, 461, 5, 40, 0, 0, 461, 106, 1, 0, 0, 0, 462, 463, 5, 99, 0, 0, 463, 464, 5, 111, 0, 0, 464, 465, 5, 115, 0, 0, 465, 466, 5, 101, 0, 0, 466, 467, 5, 99, 0, 0, 467, 468, 5, 40, 0, 0, 468, 108, 1, 0, 0, 0, 469, 470, 5, 99, 0, 0, 470, 471, 5, 115, 0, 0, 471, 472, 5, 99, 0, 0, 472, 473, 5, 40, 0, 0, 473, 110, 1, 0, 0, 0, 474, 475, 5, 97, 0, 0, 475, 476, 5, 114, 0, 0, 476, 477, 5, 99, 0, 0, 477, 478, 5, 115, 0, 0, 478, 479, 5, 105, 0, 0, 479, 480, 5, 110, 0, 0, 480, 481, 5, 40, 0, 0, 481, 112, 1, 0, 0, 0, 482, 483, 5, 97, 0, 0, 483, 484, 5, 114, 0, 0, 484, 485, 5, 99, 0, 0, 485, 486, 5, 99, 0, 0, 486, 487, 5, 111, 0, 0, 487, 488, 5, 115, 0, 0, 488, 489, 5, 40, 0, 0, 489, 114, 1, 0, 0, 0, 490, 491, 5, 97, 0, 0, 491, 492, 5, 114, 0, 0, 492, 493, 5, 99, 0, 0, 493, 494, 5, 116, 0, 0, 494, 495, 5, 97, 0, 0, 495, 496, 5, 110, 0, 0, 496, 497, 5, 40, 0, 0, 497, 116, 1, 0, 0, 0, 498, 499, 5, 97, 0, 0, 499, 500, 5, 114, 0, 0, 500, 501, 5, 99, 0, 0, 501, 502, 5, 99, 0, 0, 502, 503, 5, 111, 0, 0, 503, 504, 5, 116, 0, 0, 504, 505, 5, 97, 0, 0, 505, 506, 5, 110, 0, 0, 506, 507, 5, 40, 0, 0, 507, 118, 1, 0, 0, 0, 508, 509, 5, 97, 0, 0, 509, 510, 5, 114, 0, 0, 510, 511, 5, 99, 0, 0, 511, 512, 5, 115, 0, 0, 512, 513, 5, 101, 0, 0, 513, 514, 5, 99, 0, 0, 514, 515, 5, 40, 0, 0, 515, 120, 1, 0, 0, 0, 516, 517, 5, 97, 0, 0, 517, 518, 5, 114, 0, 0, 518, 519, 5, 99, 0, 0, 519, 520, 5, 99, 0, 0, 520, 521, 5, 111, 0, 0, 521, 522, 5, 115, 0, 0, 522, 523, 5, 101, 0, 0, 523, 524, 5, 99, 0, 0, 524, 525, 5, 40, 0, 0, 525, 122, 1, 0, 0, 0, 526, 527, 5, 97, 0, 0, 527, 528, 5, 114, 0, 0, 528, 529, 5, 99, 0, 0, 529, 530, 5, 99, 0, 0, 530, 531, 5, 115, 0, 0, 531, 532, 5, 99, 0, 0, 532, 533, 5, 40, 0, 0, 533, 124, 1, 0, 0, 0, 534, 535, 5, 97, 0, 0, 535, 536, 5, 99, 0, 0, 536, 537, 5, 115, 0, 0, 537, 538, 5, 99, 0, 0, 538, 539, 5, 40, 0, 0, 539, 126, 1, 0, 0, 0, 540, 541, 5, 97, 0, 0, 541, 542, 5, 115, 0, 0, 542, 543, 5, 105, 0, 0, 543, 544, 5, 110, 0, 0, 544, 545, 5, 40, 0, 0, 545, 128, 1, 0, 0, 0, 546, 547, 5, 97, 0, 0, 547, 548, 5, 99, 0, 0, 548, 549, 5, 111, 0, 0, 549, 550, 5, 115, 0, 0, 550, 551, 5, 40, 0, 0, 551, 130, 1, 0, 0, 0, 552, 553, 5, 97, 0, 0, 553, 554, 5, 116, 0, 0, 554, 555, 5, 97, 0, 0, 555, 556, 5, 110, 0, 0, 556, 557, 5, 40, 0, 0, 557, 132, 1, 0, 0, 0, 558, 559, 5, 97, 0, 0, 559, 560, 5, 99, 0, 0, 560, 561, 5, 111, 0, 0, 561, 562, 5, 116, 0, 0, 562, 563, 5, 97, 0, 0, 563, 564, 5, 110, 0, 0, 564, 565, 5, 40, 0, 0, 565, 134, 1, 0, 0, 0, 566, 567, 5, 97, 0, 0, 567, 568, 5, 115, 0, 0, 568, 569, 5, 101, 0, 0, 569, 570, 5, 99, 0, 0, 570, 571, 5, 40, 0, 0, 571, 136, 1, 0, 0, 0, 572, 573, 5, 97, 0, 0, 573, 574, 5, 99, 0, 0, 574, 575, 5, 111, 0, 0, 575, 576, 5, 115, 0, 0, 576, 577, 5, 101, 0, 0, 577, 578, 5, 99, 0, 0, 578, 579, 5, 40, 0, 0, 579, 138, 1, 0, 0, 0, 580, 581, 5, 97, 0, 0, 581, 582, 5, 99, 0, 0, 582, 583, 5, 111, 0, 0, 583, 584, 5, 116, 0, 0, 584, 585, 5, 40, 0, 0, 585, 140, 1, 0, 0, 0, 586, 587, 5, 97, 0, 0, 587, 588, 5, 114, 0, 0, 588, 589, 5, 99, 0, 0, 589, 590, 5, 99, 0, 0, 590, 591, 5, 111, 0, 0, 591, 592, 5, 116, 0, 0, 592, 593, 5, 40, 0, 0, 593, 142, 1, 0, 0, 0, 594, 595, 5, 115, 0, 0, 595, 596, 5, 105, 0, 0, 596, 597, 5, 110, 0, 0, 597, 598, 5, 104, 0, 0, 598, 599, 5, 40, 0, 0, 599, 144, 1, 0, 0, 0, 600, 601, 5, 115, 0, 0, 601, 602, 5, 104, 0, 0, 602, 603, 5, 40, 0, 0, 603, 146, 1, 0, 0, 0, 604, 605, 5, 99, 0, 0, 605, 606, 5, 111, 0, 0, 606, 607, 5, 115, 0, 0, 607, 608, 5, 104, 0, 0, 608, 609, 5, 40, 0, 0, 609, 148, 1, 0, 0, 0, 610, 611, 5, 99, 0, 0, 611, 612, 5, 104, 0, 0, 612, 613, 5, 40, 0, 0, 613, 150, 1, 0, 0, 0, 614, 615, 5, 116, 0, 0, 615, 616, 5, 97, 0, 0, 616, 617, 5, 110, 0, 0, 617, 618, 5, 104, 0, 0, 618, 619, 5, 40, 0, 0, 619, 152, 1, 0, 0, 0, 620, 621, 5, 116, 0, 0, 621, 622, 5, 104, 0, 0, 622, 623, 5, 40, 0, 0, 623, 154, 1, 0, 0, 0, 624, 625, 5, 99, 0, 0, 625, 626, 5, 111, 0, 0, 626, 627, 5, 116, 0, 0, 627, 628, 5, 97, 0, 0, 628, 629, 5, 110, 0, 0, 629, 630, 5, 104, 0, 0, 630, 631, 5, 40, 0, 0, 631, 156, 1, 0, 0, 0, 632, 633, 5, 99, 0, 0, 633, 634, 5, 111, 0, 0, 634, 635, 5, 116, 0, 0, 635, 636, 5, 104, 0, 0, 636, 637, 5, 40, 0, 0, 637, 158, 1, 0, 0, 0, 638, 639, 5, 99, 0, 0, 639, 640, 5, 116, 0, 0, 640, 641, 5, 104, 0, 0, 641, 642, 5, 40, 0, 0, 642, 160, 1, 0, 0, 0, 643, 644, 5, 115, 0, 0, 644, 645, 5, 101, 0, 0, 645, 646, 5, 99, 0, 0, 646, 647, 5, 104, 0, 0, 647, 648, 5, 40, 0, 0, 648, 162, 1, 0, 0, 0, 649, 650, 5, 115, 0, 0, 650, 651, 5, 99, 0, 0, 651, 652, 5, 104, 0, 0, 652, 653, 5, 40, 0, 0, 653, 164, 1, 0, 0, 0, 654, 655, 5, 99, 0, 0, 655, 656, 5, 111, 0, 0, 656, 657, 5, 115, 0, 0, 657, 658, 5, 101, 0, 0, 658, 659, 5, 99, 0, 0, 659, 660, 5, 104, 0, 0, 660, 661, 5, 40, 0, 0, 661, 166, 1, 0, 0, 0, 662, 663, 5, 99, 0, 0, 663, 664, 5, 115, 0, 0, 664, 665, 5, 99, 0, 0, 665, 666, 5, 104, 0, 0, 666, 667, 5, 40, 0, 0, 667, 168, 1, 0, 0, 0, 668, 669, 5, 97, 0, 0, 669, 670, 5, 115, 0, 0, 670, 671, 5, 105, 0, 0, 671, 672, 5, 110, 0, 0, 672, 673, 5, 104, 0, 0, 673, 674, 5, 40, 0, 0, 674, 170, 1, 0, 0, 0, 675, 676, 5, 97, 0, 0, 676, 677, 5, 114, 0, 0, 677, 678, 5, 115, 0, 0, 678, 679, 5, 105, 0, 0, 679, 680, 5, 110, 0, 0, 680, 681, 5, 104, 0, 0, 681, 682, 5, 40, 0, 0, 682, 172, 1, 0, 0, 0, 683, 684, 5, 97, 0, 0, 684, 685, 5, 114, 0, 0, 685, 686, 5, 115, 0, 0, 686, 687, 5, 104, 0, 0, 687, 688, 5, 40, 0, 0, 688, 174, 1, 0, 0, 0, 689, 690, 5, 97, 0, 0, 690, 691, 5, 99, 0, 0, 691, 692, 5, 111, 0, 0, 692, 693, 5, 115, 0, 0, 693, 694, 5, 104, 0, 0, 694, 695, 5, 40, 0, 0, 695, 176, 1, 0, 0, 0, 696, 697, 5, 97, 0, 0, 697, 698, 5, 114, 0, 0, 698, 699, 5, 99, 0, 0, 699, 700, 5, 111, 0, 0, 700, 701, 5, 115, 0, 0, 701, 702, 5, 104, 0, 0, 702, 703, 5, 40, 0, 0, 703, 178, 1, 0, 0, 0, 704, 705, 5, 97, 0, 0, 705, 706, 5, 114, 0, 0, 706, 707, 5, 99, 0, 0, 707, 708, 5, 104, 0, 0, 708, 709, 5, 40, 0, 0, 709, 180, 1, 0, 0, 0, 710, 711, 5, 97, 0, 0, 711, 712, 5, 116, 0, 0, 712, 713, 5, 97, 0, 0, 713, 714, 5, 110, 0, 0, 714, 715, 5, 104, 0, 0, 715, 716, 5, 40, 0, 0, 716, 182, 1, 0, 0, 0, 717, 718, 5, 97, 0, 0, 718, 719, 5, 114, 0, 0, 719, 720, 5, 116, 0, 0, 720, 721, 5, 97, 0, 0, 721, 722, 5, 110, 0, 0, 722, 723, 5, 104, 0, 0, 723, 724, 5, 40, 0, 0, 724, 184, 1, 0, 0, 0, 725, 726, 5, 97, 0, 0, 726, 727, 5, 114, 0, 0, 727, 728, 5, 116, 0, 0, 728, 729, 5, 104, 0, 0, 729, 730, 5, 40, 0, 0, 730, 186, 1, 0, 0, 0, 731, 732, 5, 97, 0, 0, 732, 733, 5, 99, 0, 0, 733, 734, 5, 111, 0, 0, 734, 735, 5, 116, 0, 0, 735, 736, 5, 104, 0, 0, 736, 737, 5, 40, 0, 0, 737, 188, 1, 0, 0, 0, 738, 739, 5, 97, 0, 0, 739, 740, 5, 114, 0, 0, 740, 741, 5, 99, 0, 0, 741, 742, 5, 111, 0, 0, 742, 743, 5, 116, 0, 0, 743, 744, 5, 104, 0, 0, 744, 745, 5, 40, 0, 0, 745, 190, 1, 0, 0, 0, 746, 747, 5, 97, 0, 0, 747, 748, 5, 99, 0, 0, 748, 749, 5, 111, 0, 0, 749, 750, 5, 116, 0, 0, 750, 751, 5, 97, 0, 0, 751, 752, 5, 110, 0, 0, 752, 753, 5, 104, 0, 0, 753, 754, 5, 40, 0, 0, 754, 192, 1, 0, 0, 0, 755, 756, 5, 97, 0, 0, 756, 757, 5, 114, 0, 0, 757, 758, 5, 99, 0, 0, 758, 759, 5, 111, 0, 0, 759, 760, 5, 116, 0, 0, 760, 761, 5, 97, 0, 0, 761, 762, 5, 110, 0, 0, 762, 763, 5, 104, 0, 0, 763, 764, 5, 40, 0, 0, 764, 194, 1, 0, 0, 0, 765, 766, 5, 97, 0, 0, 766, 767, 5, 114, 0, 0, 767, 768, 5, 99, 0, 0, 768, 769, 5, 116, 0, 0, 769, 770, 5, 104, 0, 0, 770, 771, 5, 40, 0, 0, 771, 196, 1, 0, 0, 0, 772, 773, 5, 97, 0, 0, 773, 774, 5, 115, 0, 0, 774, 775, 5, 101, 0, 0, 775, 776, 5, 99, 0, 0, 776, 777, 5, 104, 0, 0, 777, 778, 5, 40, 0, 0, 778, 198, 1, 0, 0, 0, 779, 780, 5, 97, 0, 0, 780, 781, 5, 114, 0, 0, 781, 782, 5, 115, 0, 0, 782, 783, 5, 101, 0, 0, 783, 784, 5, 99, 0, 0, 784, 785, 5, 104, 0, 0, 785, 786, 5, 40, 0, 0, 786, 200, 1, 0, 0, 0, 787, 788, 5, 97, 0, 0, 788, 789, 5, 114, 0, 0, 789, 790, 5, 115, 0, 0, 790, 791, 5, 99, 0, 0, 791, 792, 5, 104, 0, 0, 792, 793, 5, 40, 0, 0, 793, 202, 1, 0, 0, 0, 794, 795, 5, 97, 0, 0, 795, 796, 5, 99, 0, 0, 796, 797, 5, 111, 0, 0, 797, 798, 5, 115, 0, 0, 798, 799, 5, 101, 0, 0, 799, 800, 5, 99, 0, 0, 800, 801, 5, 104, 0, 0, 801, 802, 5, 40, 0, 0, 802, 204, 1, 0, 0, 0, 803, 804, 5, 97, 0, 0, 804, 805, 5, 114, 0, 0, 805, 806, 5, 99, 0, 0, 806, 807, 5, 111, 0, 0, 807, 808, 5, 115, 0, 0, 808, 809, 5, 101, 0, 0, 809, 810, 5, 99, 0, 0, 810, 811, 5, 104, 0, 0, 811, 812, 5, 40, 0, 0, 812, 206, 1, 0, 0, 0, 813, 814, 5, 97, 0, 0, 814, 815, 5, 114, 0, 0, 815, 816, 5, 99, 0, 0, 816, 817, 5, 115, 0, 0, 817, 818, 5, 99, 0, 0, 818, 819, 5, 104, 0, 0, 819, 820, 5, 40, 0, 0, 820, 208, 1, 0, 0, 0, 821, 822, 5, 97, 0, 0, 822, 823, 5, 99, 0, 0, 823, 824, 5, 115, 0, 0, 824, 825, 5, 99, 0, 0, 825, 826, 5, 104, 0, 0, 826, 827, 5, 40, 0, 0, 827, 210, 1, 0, 0, 0, 828, 829, 5, 103, 0, 0, 829, 830, 5, 97, 0, 0, 830, 831, 5, 109, 0, 0, 831, 832, 5, 109, 0, 0, 832, 833, 5, 97, 0, 0, 833, 834, 5, 40, 0, 0, 834, 212, 1, 0, 0, 0, 835, 836, 5, 100, 0, 0, 836, 837, 5, 101, 0, 0, 837, 838, 5, 114, 0, 0, 838, 839, 5, 105, 0, 0, 839, 840, 5, 118, 0, 0, 840, 841, 5, 97, 0, 0, 841, 842, 5, 116, 0, 0, 842, 843, 5, 105, 0, 0, 843, 844, 5, 118, 0, 0, 844, 845, 5, 101, 0, 0, 845, 846, 5, 40, 0, 0, 846, 214, 1, 0, 0, 0, 847, 848, 5, 105, 0, 0, 848, 849, 5, 110, 0, 0, 849, 850, 5, 116, 0, 0, 850, 851, 5, 101, 0, 0, 851, 852, 5, 103, 0, 0, 852, 853, 5, 114, 0, 0, 853, 854, 5, 97, 0, 0, 854, 855, 5, 108, 0, 0, 855, 856, 5, 40, 0, 0, 856, 216, 1, 0, 0, 0, 857, 858, 5, 108, 0, 0, 858, 859, 5, 105, 0, 0, 859, 860, 5, 109, 0, 0, 860, 861, 5, 105, 0, 0, 861, 862, 5, 116, 0, 0, 862, 863, 5, 40, 0, 0, 863, 218, 1, 0, 0, 0, 864, 865, 5, 108, 0, 0, 865, 866, 5, 105, 0, 0, 866, 867, 5, 109, 0, 0, 867, 868, 5, 105, 0, 0, 868, 869, 5, 116, 0, 0, 869, 870, 5, 108, 0, 0, 870, 871, 5, 101, 0, 0, 871, 872, 5, 102, 0, 0, 872, 873, 5, 116, 0, 0, 873, 874, 5, 40, 0, 0, 874, 220, 1, 0, 0, 0, 875, 876, 5, 108, 0, 0, 876, 877, 5, 105, 0, 0, 877, 878, 5, 109, 0, 0, 878, 879, 5, 105, 0, 0, 879, 880, 5, 116, 0, 0, 880, 881, 5, 114, 0, 0, 881, 882, 5, 105, 0, 0, 882, 883, 5, 103, 0, 0, 883, 884, 5, 104, 0, 0, 884, 885, 5, 116, 0, 0, 885, 886, 5, 40, 0, 0, 886, 222, 1, 0, 0, 0, 887, 888, 5, 115, 0, 0, 888, 889, 5, 105, 0, 0, 889, 890, 5, 103, 0, 0, 890, 891, 5, 110, 0, 0, 891, 892, 5, 117, 0, 0, 892, 893, 5, 109, 0, 0, 893, 894, 5, 40, 0, 0, 894, 224, 1, 0, 0, 0, 895, 896, 5, 115, 0, 0, 896, 897, 5, 103, 0, 0, 897, 898, 5, 110, 0, 0, 898, 899, 5, 40, 0, 0, 899, 226, 1, 0, 0, 0, 900, 901, 5, 115, 0, 0, 901, 902, 5, 105, 0, 0, 902, 903, 5, 103, 0, 0, 903, 904, 5, 110, 0, 0, 904, 905, 5, 40, 0, 0, 905, 228, 1, 0, 0, 0, 906, 907, 5, 97, 0, 0, 907, 908, 5, 98, 0, 0, 908, 909, 5, 115, 0, 0, 909, 910, 5, 40, 0, 0, 910, 230, 1, 0, 0, 0, 911, 912, 5, 112, 0, 0, 912, 913, 5, 104, 0, 0, 913, 914, 5, 105, 0, 0, 914, 915, 5, 40, 0, 0, 915, 232, 1, 0, 0, 0, 916, 917, 5, 100, 0, 0, 917, 918, 5, 111, 0, 0, 918, 919, 5, 109, 0, 0, 919, 920, 5, 97, 0, 0, 920, 921, 5, 105, 0, 0, 921, 922, 5, 110, 0, 0, 922, 923, 5, 40, 0, 0, 923, 234, 1, 0, 0, 0, 924, 925, 5, 112, 0, 0, 925, 926, 5, 105, 0, 0, 926, 927, 5, 101, 0, 0, 927, 928, 5, 99, 0, 0, 928, 929, 5, 101, 0, 0, 929, 930, 5, 119, 0, 0, 930, 931, 5, 105, 0, 0, 931, 932, 5, 115, 0, 0, 932, 933, 5, 101, 0, 0, 933, 934, 5, 40, 0, 0, 934, 236, 1, 0, 0, 0, 935, 936, 5, 97, 0, 0, 936, 937, 5, 112, 0, 0, 937, 938, 5, 112, 0, 0, 938, 939, 5, 108, 0, 0, 939, 940, 5, 121, 0, 0, 940, 941, 5, 40, 0, 0, 941, 238, 1, 0, 0, 0, 942, 943, 5, 108, 0, 0, 943, 944, 5, 97, 0, 0, 944, 945, 5, 109, 0, 0, 945, 946, 5, 98, 0, 0, 946, 947, 5, 100, 0, 0, 947, 948, 5, 97, 0, 0, 948, 949, 5, 40, 0, 0, 949, 240, 1, 0, 0, 0, 950, 952, 5, 13, 0, 0, 951, 950, 1, 0, 0, 0, 951, 952, 1, 0, 0, 0, 952, 953, 1, 0, 0, 0, 953, 955, 5, 10, 0, 0, 954, 951, 1, 0, 0, 0, 955, 956, 1, 0, 0, 0, 956, 954, 1, 0, 0, 0, 956, 957, 1, 0, 0, 0, 957, 958, 1, 0, 0, 0, 958, 959, 6, 120, 0, 0, 959, 242, 1, 0, 0, 0, 960, 962, 7, 0, 0, 0, 961, 963, 7, 1, 0, 0, 962, 961, 1, 0, 0, 0, 962, 963, 1, 0, 0, 0, 963, 965, 1, 0, 0, 0, 964, 966, 2, 48, 57, 0, 965, 964, 1, 0, 0, 0, 966, 967, 1, 0, 0, 0, 967, 965, 1, 0, 0, 0, 967, 968, 1, 0, 0, 0, 968, 244, 1, 0, 0, 0, 969, 971, 2, 48, 57, 0, 970, 969, 1, 0, 0, 0, 971, 972, 1, 0, 0, 0, 972, 970, 1, 0, 0, 0, 972, 973, 1, 0, 0, 0, 973, 974, 1, 0, 0, 0, 974, 978, 5, 46, 0, 0, 975, 977, 2, 48, 57, 0, 976, 975, 1, 0, 0, 0, 977, 980, 1, 0, 0, 0, 978, 976, 1, 0, 0, 0, 978, 979, 1, 0, 0, 0, 979, 982, 1, 0, 0, 0, 980, 978, 1, 0, 0, 0, 981, 983, 3, 243, 121, 0, 982, 981, 1, 0, 0, 0, 982, 983, 1, 0, 0, 0, 983, 985, 1, 0, 0, 0, 984, 986, 5, 105, 0, 0, 985, 984, 1, 0, 0, 0, 985, 986, 1, 0, 0, 0, 986, 1003, 1, 0, 0, 0, 987, 989, 5, 46, 0, 0, 988, 987, 1, 0, 0, 0, 988, 989, 1, 0, 0, 0, 989, 991, 1, 0, 0, 0, 990, 992, 2, 48, 57, 0, 991, 990, 1, 0, 0, 0, 992, 993, 1, 0, 0, 0, 993, 991, 1, 0, 0, 0, 993, 994, 1, 0, 0, 0, 994, 996, 1, 0, 0, 0, 995, 997, 3, 243, 121, 0, 996, 995, 1, 0, 0, 0, 996, 997, 1, 0, 0, 0, 997, 999, 1, 0, 0, 0, 998, 1000, 5, 105, 0, 0, 999, 998, 1, 0, 0, 0, 999, 1000, 1, 0, 0, 0, 1000, 1003, 1, 0, 0, 0, 1001, 1003, 5, 105, 0, 0, 1002, 970, 1, 0, 0, 0, 1002, 988, 1, 0, 0, 0, 1002, 1001, 1, 0, 0, 0, 1003, 246, 1, 0, 0, 0, 1004, 1005, 5, 67, 0, 0, 1005, 1015, 5, 67, 0, 0, 1006, 1007, 5, 82, 0, 0, 1007, 1015, 5, 82, 0, 0, 1008, 1009, 5, 81, 0, 0, 1009, 1015, 5, 81, 0, 0, 1010, 1011, 5, 90, 0, 0, 1011, 1015, 5, 90, 0, 0, 1012, 1013, 5, 66, 0, 0, 1013, 1015, 5, 66, 0, 0, 1014, 1004, 1, 0, 0, 0, 1014, 1006, 1, 0, 0, 0, 1014, 1008, 1, 0, 0, 0, 1014, 1010, 1, 0, 0, 0, 1014, 1012, 1, 0, 0, 0, 1015, 248, 1, 0, 0, 0, 1016, 1017, 5, 116, 0, 0, 1017, 1018, 5, 114, 0, 0, 1018, 1019, 5, 117, 0, 0, 1019, 1035, 5, 101, 0, 0, 1020, 1021, 5, 84, 0, 0, 1021, 1022, 5, 114, 0, 0, 1022, 1023, 5, 117, 0, 0, 1023, 1035, 5, 101, 0, 0, 1024, 1025, 5, 102, 0, 0, 1025, 1026, 5, 97, 0, 0, 1026, 1027, 5, 108, 0, 0, 1027, 1028, 5, 115, 0, 0, 1028, 1035, 5, 101, 0, 0, 1029, 1030, 5, 70, 0, 0, 1030, 1031, 5, 97, 0, 0, 1031, 1032, 5, 108, 0, 0, 1032, 1033, 5, 115, 0, 0, 1033, 1035, 5, 101, 0, 0, 1034, 1016, 1, 0, 0, 0, 1034, 1020, 1, 0, 0, 0, 1034, 1024, 1, 0, 0, 0, 1034, 1029, 1, 0, 0, 0, 1035, 250, 1, 0, 0, 0, 1036, 1038, 7, 2, 0, 0, 1037, 1036, 1, 0, 0, 0, 1038, 1039, 1, 0, 0, 0, 1039, 1037, 1, 0, 0, 0, 1039, 1040, 1, 0, 0, 0, 1040, 1047, 1, 0, 0, 0, 1041, 1043, 5, 95, 0, 0, 1042, 1044, 7, 3, 0, 0, 1043, 1042, 1, 0, 0, 0, 1044, 1045, 1, 0, 0, 0, 1045, 1043, 1, 0, 0, 0, 1045, 1046, 1, 0, 0, 0, 1046, 1048, 1, 0, 0, 0, 1047, 1041, 1, 0, 0, 0, 1047, 1048, 1, 0, 0, 0, 1048, 252, 1, 0, 0, 0, 1049, 1050, 5, 47, 0, 0, 1050, 1051, 5, 47, 0, 0, 1051, 1055, 1, 0, 0, 0, 1052, 1054, 8, 4, 0, 0, 1053, 1052, 1, 0, 0, 0, 1054, 1057, 1, 0, 0, 0, 1055, 1053, 1, 0, 0, 0, 1055, 1056, 1, 0, 0, 0, 1056, 1059, 1, 0, 0, 0, 1057, 1055, 1, 0, 0, 0, 1058, 1060, 5, 13, 0, 0, 1059, 1058, 1, 0, 0, 0, 1059, 1060, 1, 0, 0, 0, 1060, 1061, 1, 0, 0, 0, 1061, 1074, 5, 10, 0, 0, 1062, 1063, 5, 47, 0, 0, 1063, 1064, 5, 42, 0, 0, 1064, 1068, 1, 0, 0, 0, 1065, 1067, 9, 0, 0, 0, 1066, 1065, 1, 0, 0, 0, 1067, 1070, 1, 0, 0, 0, 1068, 1069, 1, 0, 0, 0, 1068, 1066, 1, 0, 0, 0, 1069, 1071, 1, 0, 0, 0, 1070, 1068, 1, 0, 0, 0, 1071, 1072, 5, 42, 0, 0, 1072, 1074, 5, 47, 0, 0, 1073, 1049, 1, 0, 0, 0, 1073, 1062, 1, 0, 0, 0, 1074, 1075, 1, 0, 0, 0, 1075, 1076, 6, 126, 0, 0, 1076, 254, 1, 0, 0, 0, 1077, 1079, 7, 5, 0, 0, 1078, 1077, 1, 0, 0, 0, 1079, 1080, 1, 0, 0, 0, 1080, 1078, 1, 0, 0, 0, 1080, 1081, 1, 0, 0, 0, 1081, 1082, 1, 0, 0, 0, 1082, 1083, 6, 127, 0, 0, 1083, 256, 1, 0, 0, 0, 24, 0, 951, 956, 962, 967, 972, 978, 982, 985, 988, 993, 996, 999, 1002, 1014, 1034, 1039, 1045, 1047, 1055, 1059, 1068, 1073, 1080, 1, 6, 0, 0] \ No newline at end of file +[4, 0, 127, 1077, 6, -1, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 2, 41, 7, 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 2, 45, 7, 45, 2, 46, 7, 46, 2, 47, 7, 47, 2, 48, 7, 48, 2, 49, 7, 49, 2, 50, 7, 50, 2, 51, 7, 51, 2, 52, 7, 52, 2, 53, 7, 53, 2, 54, 7, 54, 2, 55, 7, 55, 2, 56, 7, 56, 2, 57, 7, 57, 2, 58, 7, 58, 2, 59, 7, 59, 2, 60, 7, 60, 2, 61, 7, 61, 2, 62, 7, 62, 2, 63, 7, 63, 2, 64, 7, 64, 2, 65, 7, 65, 2, 66, 7, 66, 2, 67, 7, 67, 2, 68, 7, 68, 2, 69, 7, 69, 2, 70, 7, 70, 2, 71, 7, 71, 2, 72, 7, 72, 2, 73, 7, 73, 2, 74, 7, 74, 2, 75, 7, 75, 2, 76, 7, 76, 2, 77, 7, 77, 2, 78, 7, 78, 2, 79, 7, 79, 2, 80, 7, 80, 2, 81, 7, 81, 2, 82, 7, 82, 2, 83, 7, 83, 2, 84, 7, 84, 2, 85, 7, 85, 2, 86, 7, 86, 2, 87, 7, 87, 2, 88, 7, 88, 2, 89, 7, 89, 2, 90, 7, 90, 2, 91, 7, 91, 2, 92, 7, 92, 2, 93, 7, 93, 2, 94, 7, 94, 2, 95, 7, 95, 2, 96, 7, 96, 2, 97, 7, 97, 2, 98, 7, 98, 2, 99, 7, 99, 2, 100, 7, 100, 2, 101, 7, 101, 2, 102, 7, 102, 2, 103, 7, 103, 2, 104, 7, 104, 2, 105, 7, 105, 2, 106, 7, 106, 2, 107, 7, 107, 2, 108, 7, 108, 2, 109, 7, 109, 2, 110, 7, 110, 2, 111, 7, 111, 2, 112, 7, 112, 2, 113, 7, 113, 2, 114, 7, 114, 2, 115, 7, 115, 2, 116, 7, 116, 2, 117, 7, 117, 2, 118, 7, 118, 2, 119, 7, 119, 2, 120, 7, 120, 2, 121, 7, 121, 2, 122, 7, 122, 2, 123, 7, 123, 2, 124, 7, 124, 2, 125, 7, 125, 2, 126, 7, 126, 2, 127, 7, 127, 1, 0, 1, 0, 1, 1, 1, 1, 1, 2, 1, 2, 1, 3, 1, 3, 1, 4, 1, 4, 1, 5, 1, 5, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 9, 1, 9, 1, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 16, 1, 16, 1, 17, 1, 17, 1, 18, 1, 18, 1, 18, 1, 19, 1, 19, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 20, 1, 21, 1, 21, 1, 22, 1, 22, 1, 22, 1, 22, 1, 23, 1, 23, 1, 23, 1, 24, 1, 24, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 26, 1, 26, 1, 26, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 28, 1, 28, 1, 29, 1, 29, 1, 30, 1, 30, 1, 31, 1, 31, 1, 31, 1, 31, 1, 32, 1, 32, 1, 32, 1, 32, 1, 33, 1, 33, 1, 33, 1, 34, 1, 34, 1, 34, 1, 35, 1, 35, 1, 36, 1, 36, 1, 36, 1, 37, 1, 37, 1, 38, 1, 38, 1, 39, 1, 39, 1, 40, 1, 40, 1, 41, 1, 41, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 46, 1, 46, 1, 46, 1, 46, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 72, 1, 72, 1, 72, 1, 72, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 74, 1, 74, 1, 74, 1, 74, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 76, 1, 76, 1, 76, 1, 76, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 84, 1, 84, 1, 84, 1, 84, 1, 84, 1, 84, 1, 84, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 88, 1, 88, 1, 88, 1, 88, 1, 88, 1, 88, 1, 88, 1, 88, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 1, 90, 1, 90, 1, 90, 1, 90, 1, 90, 1, 90, 1, 90, 1, 91, 1, 91, 1, 91, 1, 91, 1, 91, 1, 91, 1, 91, 1, 91, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 96, 1, 96, 1, 96, 1, 96, 1, 96, 1, 96, 1, 96, 1, 96, 1, 96, 1, 96, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 99, 1, 99, 1, 99, 1, 99, 1, 99, 1, 99, 1, 99, 1, 99, 1, 100, 1, 100, 1, 100, 1, 100, 1, 100, 1, 100, 1, 100, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 102, 1, 102, 1, 102, 1, 102, 1, 102, 1, 102, 1, 102, 1, 102, 1, 102, 1, 102, 1, 103, 1, 103, 1, 103, 1, 103, 1, 103, 1, 103, 1, 103, 1, 103, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 118, 1, 118, 1, 118, 1, 118, 1, 118, 1, 118, 1, 118, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 120, 3, 120, 945, 8, 120, 1, 120, 4, 120, 948, 8, 120, 11, 120, 12, 120, 949, 1, 120, 1, 120, 1, 121, 1, 121, 3, 121, 956, 8, 121, 1, 121, 4, 121, 959, 8, 121, 11, 121, 12, 121, 960, 1, 122, 4, 122, 964, 8, 122, 11, 122, 12, 122, 965, 1, 122, 1, 122, 5, 122, 970, 8, 122, 10, 122, 12, 122, 973, 9, 122, 1, 122, 3, 122, 976, 8, 122, 1, 122, 3, 122, 979, 8, 122, 1, 122, 3, 122, 982, 8, 122, 1, 122, 4, 122, 985, 8, 122, 11, 122, 12, 122, 986, 1, 122, 3, 122, 990, 8, 122, 1, 122, 3, 122, 993, 8, 122, 1, 122, 3, 122, 996, 8, 122, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 3, 123, 1008, 8, 123, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 3, 124, 1028, 8, 124, 1, 125, 4, 125, 1031, 8, 125, 11, 125, 12, 125, 1032, 1, 125, 1, 125, 4, 125, 1037, 8, 125, 11, 125, 12, 125, 1038, 3, 125, 1041, 8, 125, 1, 126, 1, 126, 1, 126, 1, 126, 5, 126, 1047, 8, 126, 10, 126, 12, 126, 1050, 9, 126, 1, 126, 3, 126, 1053, 8, 126, 1, 126, 1, 126, 1, 126, 1, 126, 1, 126, 5, 126, 1060, 8, 126, 10, 126, 12, 126, 1063, 9, 126, 1, 126, 1, 126, 3, 126, 1067, 8, 126, 1, 126, 1, 126, 1, 127, 4, 127, 1072, 8, 127, 11, 127, 12, 127, 1073, 1, 127, 1, 127, 1, 1061, 0, 128, 1, 1, 3, 2, 5, 3, 7, 4, 9, 5, 11, 6, 13, 7, 15, 8, 17, 9, 19, 10, 21, 11, 23, 12, 25, 13, 27, 14, 29, 15, 31, 16, 33, 17, 35, 18, 37, 19, 39, 20, 41, 21, 43, 22, 45, 23, 47, 24, 49, 25, 51, 26, 53, 27, 55, 28, 57, 29, 59, 30, 61, 31, 63, 32, 65, 33, 67, 34, 69, 35, 71, 36, 73, 37, 75, 38, 77, 39, 79, 40, 81, 41, 83, 42, 85, 43, 87, 44, 89, 45, 91, 46, 93, 47, 95, 48, 97, 49, 99, 50, 101, 51, 103, 52, 105, 53, 107, 54, 109, 55, 111, 56, 113, 57, 115, 58, 117, 59, 119, 60, 121, 61, 123, 62, 125, 63, 127, 64, 129, 65, 131, 66, 133, 67, 135, 68, 137, 69, 139, 70, 141, 71, 143, 72, 145, 73, 147, 74, 149, 75, 151, 76, 153, 77, 155, 78, 157, 79, 159, 80, 161, 81, 163, 82, 165, 83, 167, 84, 169, 85, 171, 86, 173, 87, 175, 88, 177, 89, 179, 90, 181, 91, 183, 92, 185, 93, 187, 94, 189, 95, 191, 96, 193, 97, 195, 98, 197, 99, 199, 100, 201, 101, 203, 102, 205, 103, 207, 104, 209, 105, 211, 106, 213, 107, 215, 108, 217, 109, 219, 110, 221, 111, 223, 112, 225, 113, 227, 114, 229, 115, 231, 116, 233, 117, 235, 118, 237, 119, 239, 120, 241, 121, 243, 0, 245, 122, 247, 123, 249, 124, 251, 125, 253, 126, 255, 127, 1, 0, 6, 2, 0, 69, 69, 101, 101, 2, 0, 43, 43, 45, 45, 4, 0, 65, 90, 97, 122, 880, 1279, 7936, 8191, 5, 0, 48, 57, 65, 90, 97, 122, 880, 1279, 7936, 8191, 2, 0, 10, 10, 13, 13, 2, 0, 9, 9, 32, 32, 1104, 0, 1, 1, 0, 0, 0, 0, 3, 1, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 7, 1, 0, 0, 0, 0, 9, 1, 0, 0, 0, 0, 11, 1, 0, 0, 0, 0, 13, 1, 0, 0, 0, 0, 15, 1, 0, 0, 0, 0, 17, 1, 0, 0, 0, 0, 19, 1, 0, 0, 0, 0, 21, 1, 0, 0, 0, 0, 23, 1, 0, 0, 0, 0, 25, 1, 0, 0, 0, 0, 27, 1, 0, 0, 0, 0, 29, 1, 0, 0, 0, 0, 31, 1, 0, 0, 0, 0, 33, 1, 0, 0, 0, 0, 35, 1, 0, 0, 0, 0, 37, 1, 0, 0, 0, 0, 39, 1, 0, 0, 0, 0, 41, 1, 0, 0, 0, 0, 43, 1, 0, 0, 0, 0, 45, 1, 0, 0, 0, 0, 47, 1, 0, 0, 0, 0, 49, 1, 0, 0, 0, 0, 51, 1, 0, 0, 0, 0, 53, 1, 0, 0, 0, 0, 55, 1, 0, 0, 0, 0, 57, 1, 0, 0, 0, 0, 59, 1, 0, 0, 0, 0, 61, 1, 0, 0, 0, 0, 63, 1, 0, 0, 0, 0, 65, 1, 0, 0, 0, 0, 67, 1, 0, 0, 0, 0, 69, 1, 0, 0, 0, 0, 71, 1, 0, 0, 0, 0, 73, 1, 0, 0, 0, 0, 75, 1, 0, 0, 0, 0, 77, 1, 0, 0, 0, 0, 79, 1, 0, 0, 0, 0, 81, 1, 0, 0, 0, 0, 83, 1, 0, 0, 0, 0, 85, 1, 0, 0, 0, 0, 87, 1, 0, 0, 0, 0, 89, 1, 0, 0, 0, 0, 91, 1, 0, 0, 0, 0, 93, 1, 0, 0, 0, 0, 95, 1, 0, 0, 0, 0, 97, 1, 0, 0, 0, 0, 99, 1, 0, 0, 0, 0, 101, 1, 0, 0, 0, 0, 103, 1, 0, 0, 0, 0, 105, 1, 0, 0, 0, 0, 107, 1, 0, 0, 0, 0, 109, 1, 0, 0, 0, 0, 111, 1, 0, 0, 0, 0, 113, 1, 0, 0, 0, 0, 115, 1, 0, 0, 0, 0, 117, 1, 0, 0, 0, 0, 119, 1, 0, 0, 0, 0, 121, 1, 0, 0, 0, 0, 123, 1, 0, 0, 0, 0, 125, 1, 0, 0, 0, 0, 127, 1, 0, 0, 0, 0, 129, 1, 0, 0, 0, 0, 131, 1, 0, 0, 0, 0, 133, 1, 0, 0, 0, 0, 135, 1, 0, 0, 0, 0, 137, 1, 0, 0, 0, 0, 139, 1, 0, 0, 0, 0, 141, 1, 0, 0, 0, 0, 143, 1, 0, 0, 0, 0, 145, 1, 0, 0, 0, 0, 147, 1, 0, 0, 0, 0, 149, 1, 0, 0, 0, 0, 151, 1, 0, 0, 0, 0, 153, 1, 0, 0, 0, 0, 155, 1, 0, 0, 0, 0, 157, 1, 0, 0, 0, 0, 159, 1, 0, 0, 0, 0, 161, 1, 0, 0, 0, 0, 163, 1, 0, 0, 0, 0, 165, 1, 0, 0, 0, 0, 167, 1, 0, 0, 0, 0, 169, 1, 0, 0, 0, 0, 171, 1, 0, 0, 0, 0, 173, 1, 0, 0, 0, 0, 175, 1, 0, 0, 0, 0, 177, 1, 0, 0, 0, 0, 179, 1, 0, 0, 0, 0, 181, 1, 0, 0, 0, 0, 183, 1, 0, 0, 0, 0, 185, 1, 0, 0, 0, 0, 187, 1, 0, 0, 0, 0, 189, 1, 0, 0, 0, 0, 191, 1, 0, 0, 0, 0, 193, 1, 0, 0, 0, 0, 195, 1, 0, 0, 0, 0, 197, 1, 0, 0, 0, 0, 199, 1, 0, 0, 0, 0, 201, 1, 0, 0, 0, 0, 203, 1, 0, 0, 0, 0, 205, 1, 0, 0, 0, 0, 207, 1, 0, 0, 0, 0, 209, 1, 0, 0, 0, 0, 211, 1, 0, 0, 0, 0, 213, 1, 0, 0, 0, 0, 215, 1, 0, 0, 0, 0, 217, 1, 0, 0, 0, 0, 219, 1, 0, 0, 0, 0, 221, 1, 0, 0, 0, 0, 223, 1, 0, 0, 0, 0, 225, 1, 0, 0, 0, 0, 227, 1, 0, 0, 0, 0, 229, 1, 0, 0, 0, 0, 231, 1, 0, 0, 0, 0, 233, 1, 0, 0, 0, 0, 235, 1, 0, 0, 0, 0, 237, 1, 0, 0, 0, 0, 239, 1, 0, 0, 0, 0, 241, 1, 0, 0, 0, 0, 245, 1, 0, 0, 0, 0, 247, 1, 0, 0, 0, 0, 249, 1, 0, 0, 0, 0, 251, 1, 0, 0, 0, 0, 253, 1, 0, 0, 0, 0, 255, 1, 0, 0, 0, 1, 257, 1, 0, 0, 0, 3, 259, 1, 0, 0, 0, 5, 261, 1, 0, 0, 0, 7, 263, 1, 0, 0, 0, 9, 265, 1, 0, 0, 0, 11, 267, 1, 0, 0, 0, 13, 269, 1, 0, 0, 0, 15, 279, 1, 0, 0, 0, 17, 282, 1, 0, 0, 0, 19, 288, 1, 0, 0, 0, 21, 291, 1, 0, 0, 0, 23, 303, 1, 0, 0, 0, 25, 305, 1, 0, 0, 0, 27, 308, 1, 0, 0, 0, 29, 311, 1, 0, 0, 0, 31, 314, 1, 0, 0, 0, 33, 316, 1, 0, 0, 0, 35, 318, 1, 0, 0, 0, 37, 320, 1, 0, 0, 0, 39, 323, 1, 0, 0, 0, 41, 327, 1, 0, 0, 0, 43, 331, 1, 0, 0, 0, 45, 333, 1, 0, 0, 0, 47, 337, 1, 0, 0, 0, 49, 340, 1, 0, 0, 0, 51, 342, 1, 0, 0, 0, 53, 350, 1, 0, 0, 0, 55, 353, 1, 0, 0, 0, 57, 362, 1, 0, 0, 0, 59, 364, 1, 0, 0, 0, 61, 366, 1, 0, 0, 0, 63, 368, 1, 0, 0, 0, 65, 372, 1, 0, 0, 0, 67, 376, 1, 0, 0, 0, 69, 379, 1, 0, 0, 0, 71, 382, 1, 0, 0, 0, 73, 384, 1, 0, 0, 0, 75, 387, 1, 0, 0, 0, 77, 389, 1, 0, 0, 0, 79, 391, 1, 0, 0, 0, 81, 393, 1, 0, 0, 0, 83, 395, 1, 0, 0, 0, 85, 397, 1, 0, 0, 0, 87, 402, 1, 0, 0, 0, 89, 408, 1, 0, 0, 0, 91, 414, 1, 0, 0, 0, 93, 419, 1, 0, 0, 0, 95, 423, 1, 0, 0, 0, 97, 428, 1, 0, 0, 0, 99, 433, 1, 0, 0, 0, 101, 438, 1, 0, 0, 0, 103, 445, 1, 0, 0, 0, 105, 450, 1, 0, 0, 0, 107, 455, 1, 0, 0, 0, 109, 462, 1, 0, 0, 0, 111, 467, 1, 0, 0, 0, 113, 475, 1, 0, 0, 0, 115, 483, 1, 0, 0, 0, 117, 491, 1, 0, 0, 0, 119, 501, 1, 0, 0, 0, 121, 509, 1, 0, 0, 0, 123, 519, 1, 0, 0, 0, 125, 527, 1, 0, 0, 0, 127, 533, 1, 0, 0, 0, 129, 539, 1, 0, 0, 0, 131, 545, 1, 0, 0, 0, 133, 551, 1, 0, 0, 0, 135, 559, 1, 0, 0, 0, 137, 565, 1, 0, 0, 0, 139, 573, 1, 0, 0, 0, 141, 579, 1, 0, 0, 0, 143, 587, 1, 0, 0, 0, 145, 593, 1, 0, 0, 0, 147, 597, 1, 0, 0, 0, 149, 603, 1, 0, 0, 0, 151, 607, 1, 0, 0, 0, 153, 613, 1, 0, 0, 0, 155, 617, 1, 0, 0, 0, 157, 625, 1, 0, 0, 0, 159, 631, 1, 0, 0, 0, 161, 636, 1, 0, 0, 0, 163, 642, 1, 0, 0, 0, 165, 647, 1, 0, 0, 0, 167, 655, 1, 0, 0, 0, 169, 661, 1, 0, 0, 0, 171, 668, 1, 0, 0, 0, 173, 676, 1, 0, 0, 0, 175, 682, 1, 0, 0, 0, 177, 689, 1, 0, 0, 0, 179, 697, 1, 0, 0, 0, 181, 703, 1, 0, 0, 0, 183, 710, 1, 0, 0, 0, 185, 718, 1, 0, 0, 0, 187, 724, 1, 0, 0, 0, 189, 731, 1, 0, 0, 0, 191, 739, 1, 0, 0, 0, 193, 748, 1, 0, 0, 0, 195, 758, 1, 0, 0, 0, 197, 765, 1, 0, 0, 0, 199, 772, 1, 0, 0, 0, 201, 780, 1, 0, 0, 0, 203, 787, 1, 0, 0, 0, 205, 796, 1, 0, 0, 0, 207, 806, 1, 0, 0, 0, 209, 814, 1, 0, 0, 0, 211, 821, 1, 0, 0, 0, 213, 828, 1, 0, 0, 0, 215, 840, 1, 0, 0, 0, 217, 850, 1, 0, 0, 0, 219, 857, 1, 0, 0, 0, 221, 868, 1, 0, 0, 0, 223, 880, 1, 0, 0, 0, 225, 888, 1, 0, 0, 0, 227, 893, 1, 0, 0, 0, 229, 899, 1, 0, 0, 0, 231, 904, 1, 0, 0, 0, 233, 909, 1, 0, 0, 0, 235, 917, 1, 0, 0, 0, 237, 928, 1, 0, 0, 0, 239, 935, 1, 0, 0, 0, 241, 947, 1, 0, 0, 0, 243, 953, 1, 0, 0, 0, 245, 995, 1, 0, 0, 0, 247, 1007, 1, 0, 0, 0, 249, 1027, 1, 0, 0, 0, 251, 1030, 1, 0, 0, 0, 253, 1066, 1, 0, 0, 0, 255, 1071, 1, 0, 0, 0, 257, 258, 5, 33, 0, 0, 258, 2, 1, 0, 0, 0, 259, 260, 5, 94, 0, 0, 260, 4, 1, 0, 0, 0, 261, 262, 5, 45, 0, 0, 262, 6, 1, 0, 0, 0, 263, 264, 5, 43, 0, 0, 264, 8, 1, 0, 0, 0, 265, 266, 5, 42, 0, 0, 266, 10, 1, 0, 0, 0, 267, 268, 5, 47, 0, 0, 268, 12, 1, 0, 0, 0, 269, 270, 5, 105, 0, 0, 270, 271, 5, 110, 0, 0, 271, 272, 5, 116, 0, 0, 272, 273, 5, 101, 0, 0, 273, 274, 5, 114, 0, 0, 274, 275, 5, 115, 0, 0, 275, 276, 5, 101, 0, 0, 276, 277, 5, 99, 0, 0, 277, 278, 5, 116, 0, 0, 278, 14, 1, 0, 0, 0, 279, 280, 5, 47, 0, 0, 280, 281, 5, 92, 0, 0, 281, 16, 1, 0, 0, 0, 282, 283, 5, 117, 0, 0, 283, 284, 5, 110, 0, 0, 284, 285, 5, 105, 0, 0, 285, 286, 5, 116, 0, 0, 286, 287, 5, 101, 0, 0, 287, 18, 1, 0, 0, 0, 288, 289, 5, 92, 0, 0, 289, 290, 5, 47, 0, 0, 290, 20, 1, 0, 0, 0, 291, 292, 5, 115, 0, 0, 292, 293, 5, 101, 0, 0, 293, 294, 5, 116, 0, 0, 294, 295, 5, 115, 0, 0, 295, 296, 5, 117, 0, 0, 296, 297, 5, 98, 0, 0, 297, 298, 5, 116, 0, 0, 298, 299, 5, 114, 0, 0, 299, 300, 5, 97, 0, 0, 300, 301, 5, 99, 0, 0, 301, 302, 5, 116, 0, 0, 302, 22, 1, 0, 0, 0, 303, 304, 5, 92, 0, 0, 304, 24, 1, 0, 0, 0, 305, 306, 5, 105, 0, 0, 306, 307, 5, 110, 0, 0, 307, 26, 1, 0, 0, 0, 308, 309, 5, 62, 0, 0, 309, 310, 5, 61, 0, 0, 310, 28, 1, 0, 0, 0, 311, 312, 5, 60, 0, 0, 312, 313, 5, 61, 0, 0, 313, 30, 1, 0, 0, 0, 314, 315, 5, 62, 0, 0, 315, 32, 1, 0, 0, 0, 316, 317, 5, 60, 0, 0, 317, 34, 1, 0, 0, 0, 318, 319, 5, 61, 0, 0, 319, 36, 1, 0, 0, 0, 320, 321, 5, 60, 0, 0, 321, 322, 5, 62, 0, 0, 322, 38, 1, 0, 0, 0, 323, 324, 5, 110, 0, 0, 324, 325, 5, 111, 0, 0, 325, 326, 5, 116, 0, 0, 326, 40, 1, 0, 0, 0, 327, 328, 5, 97, 0, 0, 328, 329, 5, 110, 0, 0, 329, 330, 5, 100, 0, 0, 330, 42, 1, 0, 0, 0, 331, 332, 5, 38, 0, 0, 332, 44, 1, 0, 0, 0, 333, 334, 5, 120, 0, 0, 334, 335, 5, 111, 0, 0, 335, 336, 5, 114, 0, 0, 336, 46, 1, 0, 0, 0, 337, 338, 5, 111, 0, 0, 338, 339, 5, 114, 0, 0, 339, 48, 1, 0, 0, 0, 340, 341, 5, 124, 0, 0, 341, 50, 1, 0, 0, 0, 342, 343, 5, 105, 0, 0, 343, 344, 5, 109, 0, 0, 344, 345, 5, 112, 0, 0, 345, 346, 5, 108, 0, 0, 346, 347, 5, 105, 0, 0, 347, 348, 5, 101, 0, 0, 348, 349, 5, 115, 0, 0, 349, 52, 1, 0, 0, 0, 350, 351, 5, 45, 0, 0, 351, 352, 5, 62, 0, 0, 352, 54, 1, 0, 0, 0, 353, 354, 5, 112, 0, 0, 354, 355, 5, 114, 0, 0, 355, 356, 5, 111, 0, 0, 356, 357, 5, 118, 0, 0, 357, 358, 5, 105, 0, 0, 358, 359, 5, 100, 0, 0, 359, 360, 5, 101, 0, 0, 360, 361, 5, 100, 0, 0, 361, 56, 1, 0, 0, 0, 362, 363, 5, 44, 0, 0, 363, 58, 1, 0, 0, 0, 364, 365, 5, 59, 0, 0, 365, 60, 1, 0, 0, 0, 366, 367, 5, 58, 0, 0, 367, 62, 1, 0, 0, 0, 368, 369, 5, 43, 0, 0, 369, 370, 5, 111, 0, 0, 370, 371, 5, 111, 0, 0, 371, 64, 1, 0, 0, 0, 372, 373, 5, 45, 0, 0, 373, 374, 5, 111, 0, 0, 374, 375, 5, 111, 0, 0, 375, 66, 1, 0, 0, 0, 376, 377, 5, 40, 0, 0, 377, 378, 5, 124, 0, 0, 378, 68, 1, 0, 0, 0, 379, 380, 5, 124, 0, 0, 380, 381, 5, 41, 0, 0, 381, 70, 1, 0, 0, 0, 382, 383, 5, 91, 0, 0, 383, 72, 1, 0, 0, 0, 384, 385, 5, 93, 0, 0, 385, 386, 5, 84, 0, 0, 386, 74, 1, 0, 0, 0, 387, 388, 5, 93, 0, 0, 388, 76, 1, 0, 0, 0, 389, 390, 5, 40, 0, 0, 390, 78, 1, 0, 0, 0, 391, 392, 5, 41, 0, 0, 392, 80, 1, 0, 0, 0, 393, 394, 5, 123, 0, 0, 394, 82, 1, 0, 0, 0, 395, 396, 5, 125, 0, 0, 396, 84, 1, 0, 0, 0, 397, 398, 5, 108, 0, 0, 398, 399, 5, 111, 0, 0, 399, 400, 5, 103, 0, 0, 400, 401, 5, 40, 0, 0, 401, 86, 1, 0, 0, 0, 402, 403, 5, 115, 0, 0, 403, 404, 5, 113, 0, 0, 404, 405, 5, 114, 0, 0, 405, 406, 5, 116, 0, 0, 406, 407, 5, 40, 0, 0, 407, 88, 1, 0, 0, 0, 408, 409, 5, 99, 0, 0, 409, 410, 5, 98, 0, 0, 410, 411, 5, 114, 0, 0, 411, 412, 5, 116, 0, 0, 412, 413, 5, 40, 0, 0, 413, 90, 1, 0, 0, 0, 414, 415, 5, 115, 0, 0, 415, 416, 5, 113, 0, 0, 416, 417, 5, 114, 0, 0, 417, 418, 5, 40, 0, 0, 418, 92, 1, 0, 0, 0, 419, 420, 5, 108, 0, 0, 420, 421, 5, 110, 0, 0, 421, 422, 5, 40, 0, 0, 422, 94, 1, 0, 0, 0, 423, 424, 5, 115, 0, 0, 424, 425, 5, 105, 0, 0, 425, 426, 5, 110, 0, 0, 426, 427, 5, 40, 0, 0, 427, 96, 1, 0, 0, 0, 428, 429, 5, 99, 0, 0, 429, 430, 5, 111, 0, 0, 430, 431, 5, 115, 0, 0, 431, 432, 5, 40, 0, 0, 432, 98, 1, 0, 0, 0, 433, 434, 5, 116, 0, 0, 434, 435, 5, 97, 0, 0, 435, 436, 5, 110, 0, 0, 436, 437, 5, 40, 0, 0, 437, 100, 1, 0, 0, 0, 438, 439, 5, 99, 0, 0, 439, 440, 5, 111, 0, 0, 440, 441, 5, 116, 0, 0, 441, 442, 5, 97, 0, 0, 442, 443, 5, 110, 0, 0, 443, 444, 5, 40, 0, 0, 444, 102, 1, 0, 0, 0, 445, 446, 5, 99, 0, 0, 446, 447, 5, 111, 0, 0, 447, 448, 5, 116, 0, 0, 448, 449, 5, 40, 0, 0, 449, 104, 1, 0, 0, 0, 450, 451, 5, 115, 0, 0, 451, 452, 5, 101, 0, 0, 452, 453, 5, 99, 0, 0, 453, 454, 5, 40, 0, 0, 454, 106, 1, 0, 0, 0, 455, 456, 5, 99, 0, 0, 456, 457, 5, 111, 0, 0, 457, 458, 5, 115, 0, 0, 458, 459, 5, 101, 0, 0, 459, 460, 5, 99, 0, 0, 460, 461, 5, 40, 0, 0, 461, 108, 1, 0, 0, 0, 462, 463, 5, 99, 0, 0, 463, 464, 5, 115, 0, 0, 464, 465, 5, 99, 0, 0, 465, 466, 5, 40, 0, 0, 466, 110, 1, 0, 0, 0, 467, 468, 5, 97, 0, 0, 468, 469, 5, 114, 0, 0, 469, 470, 5, 99, 0, 0, 470, 471, 5, 115, 0, 0, 471, 472, 5, 105, 0, 0, 472, 473, 5, 110, 0, 0, 473, 474, 5, 40, 0, 0, 474, 112, 1, 0, 0, 0, 475, 476, 5, 97, 0, 0, 476, 477, 5, 114, 0, 0, 477, 478, 5, 99, 0, 0, 478, 479, 5, 99, 0, 0, 479, 480, 5, 111, 0, 0, 480, 481, 5, 115, 0, 0, 481, 482, 5, 40, 0, 0, 482, 114, 1, 0, 0, 0, 483, 484, 5, 97, 0, 0, 484, 485, 5, 114, 0, 0, 485, 486, 5, 99, 0, 0, 486, 487, 5, 116, 0, 0, 487, 488, 5, 97, 0, 0, 488, 489, 5, 110, 0, 0, 489, 490, 5, 40, 0, 0, 490, 116, 1, 0, 0, 0, 491, 492, 5, 97, 0, 0, 492, 493, 5, 114, 0, 0, 493, 494, 5, 99, 0, 0, 494, 495, 5, 99, 0, 0, 495, 496, 5, 111, 0, 0, 496, 497, 5, 116, 0, 0, 497, 498, 5, 97, 0, 0, 498, 499, 5, 110, 0, 0, 499, 500, 5, 40, 0, 0, 500, 118, 1, 0, 0, 0, 501, 502, 5, 97, 0, 0, 502, 503, 5, 114, 0, 0, 503, 504, 5, 99, 0, 0, 504, 505, 5, 115, 0, 0, 505, 506, 5, 101, 0, 0, 506, 507, 5, 99, 0, 0, 507, 508, 5, 40, 0, 0, 508, 120, 1, 0, 0, 0, 509, 510, 5, 97, 0, 0, 510, 511, 5, 114, 0, 0, 511, 512, 5, 99, 0, 0, 512, 513, 5, 99, 0, 0, 513, 514, 5, 111, 0, 0, 514, 515, 5, 115, 0, 0, 515, 516, 5, 101, 0, 0, 516, 517, 5, 99, 0, 0, 517, 518, 5, 40, 0, 0, 518, 122, 1, 0, 0, 0, 519, 520, 5, 97, 0, 0, 520, 521, 5, 114, 0, 0, 521, 522, 5, 99, 0, 0, 522, 523, 5, 99, 0, 0, 523, 524, 5, 115, 0, 0, 524, 525, 5, 99, 0, 0, 525, 526, 5, 40, 0, 0, 526, 124, 1, 0, 0, 0, 527, 528, 5, 97, 0, 0, 528, 529, 5, 99, 0, 0, 529, 530, 5, 115, 0, 0, 530, 531, 5, 99, 0, 0, 531, 532, 5, 40, 0, 0, 532, 126, 1, 0, 0, 0, 533, 534, 5, 97, 0, 0, 534, 535, 5, 115, 0, 0, 535, 536, 5, 105, 0, 0, 536, 537, 5, 110, 0, 0, 537, 538, 5, 40, 0, 0, 538, 128, 1, 0, 0, 0, 539, 540, 5, 97, 0, 0, 540, 541, 5, 99, 0, 0, 541, 542, 5, 111, 0, 0, 542, 543, 5, 115, 0, 0, 543, 544, 5, 40, 0, 0, 544, 130, 1, 0, 0, 0, 545, 546, 5, 97, 0, 0, 546, 547, 5, 116, 0, 0, 547, 548, 5, 97, 0, 0, 548, 549, 5, 110, 0, 0, 549, 550, 5, 40, 0, 0, 550, 132, 1, 0, 0, 0, 551, 552, 5, 97, 0, 0, 552, 553, 5, 99, 0, 0, 553, 554, 5, 111, 0, 0, 554, 555, 5, 116, 0, 0, 555, 556, 5, 97, 0, 0, 556, 557, 5, 110, 0, 0, 557, 558, 5, 40, 0, 0, 558, 134, 1, 0, 0, 0, 559, 560, 5, 97, 0, 0, 560, 561, 5, 115, 0, 0, 561, 562, 5, 101, 0, 0, 562, 563, 5, 99, 0, 0, 563, 564, 5, 40, 0, 0, 564, 136, 1, 0, 0, 0, 565, 566, 5, 97, 0, 0, 566, 567, 5, 99, 0, 0, 567, 568, 5, 111, 0, 0, 568, 569, 5, 115, 0, 0, 569, 570, 5, 101, 0, 0, 570, 571, 5, 99, 0, 0, 571, 572, 5, 40, 0, 0, 572, 138, 1, 0, 0, 0, 573, 574, 5, 97, 0, 0, 574, 575, 5, 99, 0, 0, 575, 576, 5, 111, 0, 0, 576, 577, 5, 116, 0, 0, 577, 578, 5, 40, 0, 0, 578, 140, 1, 0, 0, 0, 579, 580, 5, 97, 0, 0, 580, 581, 5, 114, 0, 0, 581, 582, 5, 99, 0, 0, 582, 583, 5, 99, 0, 0, 583, 584, 5, 111, 0, 0, 584, 585, 5, 116, 0, 0, 585, 586, 5, 40, 0, 0, 586, 142, 1, 0, 0, 0, 587, 588, 5, 115, 0, 0, 588, 589, 5, 105, 0, 0, 589, 590, 5, 110, 0, 0, 590, 591, 5, 104, 0, 0, 591, 592, 5, 40, 0, 0, 592, 144, 1, 0, 0, 0, 593, 594, 5, 115, 0, 0, 594, 595, 5, 104, 0, 0, 595, 596, 5, 40, 0, 0, 596, 146, 1, 0, 0, 0, 597, 598, 5, 99, 0, 0, 598, 599, 5, 111, 0, 0, 599, 600, 5, 115, 0, 0, 600, 601, 5, 104, 0, 0, 601, 602, 5, 40, 0, 0, 602, 148, 1, 0, 0, 0, 603, 604, 5, 99, 0, 0, 604, 605, 5, 104, 0, 0, 605, 606, 5, 40, 0, 0, 606, 150, 1, 0, 0, 0, 607, 608, 5, 116, 0, 0, 608, 609, 5, 97, 0, 0, 609, 610, 5, 110, 0, 0, 610, 611, 5, 104, 0, 0, 611, 612, 5, 40, 0, 0, 612, 152, 1, 0, 0, 0, 613, 614, 5, 116, 0, 0, 614, 615, 5, 104, 0, 0, 615, 616, 5, 40, 0, 0, 616, 154, 1, 0, 0, 0, 617, 618, 5, 99, 0, 0, 618, 619, 5, 111, 0, 0, 619, 620, 5, 116, 0, 0, 620, 621, 5, 97, 0, 0, 621, 622, 5, 110, 0, 0, 622, 623, 5, 104, 0, 0, 623, 624, 5, 40, 0, 0, 624, 156, 1, 0, 0, 0, 625, 626, 5, 99, 0, 0, 626, 627, 5, 111, 0, 0, 627, 628, 5, 116, 0, 0, 628, 629, 5, 104, 0, 0, 629, 630, 5, 40, 0, 0, 630, 158, 1, 0, 0, 0, 631, 632, 5, 99, 0, 0, 632, 633, 5, 116, 0, 0, 633, 634, 5, 104, 0, 0, 634, 635, 5, 40, 0, 0, 635, 160, 1, 0, 0, 0, 636, 637, 5, 115, 0, 0, 637, 638, 5, 101, 0, 0, 638, 639, 5, 99, 0, 0, 639, 640, 5, 104, 0, 0, 640, 641, 5, 40, 0, 0, 641, 162, 1, 0, 0, 0, 642, 643, 5, 115, 0, 0, 643, 644, 5, 99, 0, 0, 644, 645, 5, 104, 0, 0, 645, 646, 5, 40, 0, 0, 646, 164, 1, 0, 0, 0, 647, 648, 5, 99, 0, 0, 648, 649, 5, 111, 0, 0, 649, 650, 5, 115, 0, 0, 650, 651, 5, 101, 0, 0, 651, 652, 5, 99, 0, 0, 652, 653, 5, 104, 0, 0, 653, 654, 5, 40, 0, 0, 654, 166, 1, 0, 0, 0, 655, 656, 5, 99, 0, 0, 656, 657, 5, 115, 0, 0, 657, 658, 5, 99, 0, 0, 658, 659, 5, 104, 0, 0, 659, 660, 5, 40, 0, 0, 660, 168, 1, 0, 0, 0, 661, 662, 5, 97, 0, 0, 662, 663, 5, 115, 0, 0, 663, 664, 5, 105, 0, 0, 664, 665, 5, 110, 0, 0, 665, 666, 5, 104, 0, 0, 666, 667, 5, 40, 0, 0, 667, 170, 1, 0, 0, 0, 668, 669, 5, 97, 0, 0, 669, 670, 5, 114, 0, 0, 670, 671, 5, 115, 0, 0, 671, 672, 5, 105, 0, 0, 672, 673, 5, 110, 0, 0, 673, 674, 5, 104, 0, 0, 674, 675, 5, 40, 0, 0, 675, 172, 1, 0, 0, 0, 676, 677, 5, 97, 0, 0, 677, 678, 5, 114, 0, 0, 678, 679, 5, 115, 0, 0, 679, 680, 5, 104, 0, 0, 680, 681, 5, 40, 0, 0, 681, 174, 1, 0, 0, 0, 682, 683, 5, 97, 0, 0, 683, 684, 5, 99, 0, 0, 684, 685, 5, 111, 0, 0, 685, 686, 5, 115, 0, 0, 686, 687, 5, 104, 0, 0, 687, 688, 5, 40, 0, 0, 688, 176, 1, 0, 0, 0, 689, 690, 5, 97, 0, 0, 690, 691, 5, 114, 0, 0, 691, 692, 5, 99, 0, 0, 692, 693, 5, 111, 0, 0, 693, 694, 5, 115, 0, 0, 694, 695, 5, 104, 0, 0, 695, 696, 5, 40, 0, 0, 696, 178, 1, 0, 0, 0, 697, 698, 5, 97, 0, 0, 698, 699, 5, 114, 0, 0, 699, 700, 5, 99, 0, 0, 700, 701, 5, 104, 0, 0, 701, 702, 5, 40, 0, 0, 702, 180, 1, 0, 0, 0, 703, 704, 5, 97, 0, 0, 704, 705, 5, 116, 0, 0, 705, 706, 5, 97, 0, 0, 706, 707, 5, 110, 0, 0, 707, 708, 5, 104, 0, 0, 708, 709, 5, 40, 0, 0, 709, 182, 1, 0, 0, 0, 710, 711, 5, 97, 0, 0, 711, 712, 5, 114, 0, 0, 712, 713, 5, 116, 0, 0, 713, 714, 5, 97, 0, 0, 714, 715, 5, 110, 0, 0, 715, 716, 5, 104, 0, 0, 716, 717, 5, 40, 0, 0, 717, 184, 1, 0, 0, 0, 718, 719, 5, 97, 0, 0, 719, 720, 5, 114, 0, 0, 720, 721, 5, 116, 0, 0, 721, 722, 5, 104, 0, 0, 722, 723, 5, 40, 0, 0, 723, 186, 1, 0, 0, 0, 724, 725, 5, 97, 0, 0, 725, 726, 5, 99, 0, 0, 726, 727, 5, 111, 0, 0, 727, 728, 5, 116, 0, 0, 728, 729, 5, 104, 0, 0, 729, 730, 5, 40, 0, 0, 730, 188, 1, 0, 0, 0, 731, 732, 5, 97, 0, 0, 732, 733, 5, 114, 0, 0, 733, 734, 5, 99, 0, 0, 734, 735, 5, 111, 0, 0, 735, 736, 5, 116, 0, 0, 736, 737, 5, 104, 0, 0, 737, 738, 5, 40, 0, 0, 738, 190, 1, 0, 0, 0, 739, 740, 5, 97, 0, 0, 740, 741, 5, 99, 0, 0, 741, 742, 5, 111, 0, 0, 742, 743, 5, 116, 0, 0, 743, 744, 5, 97, 0, 0, 744, 745, 5, 110, 0, 0, 745, 746, 5, 104, 0, 0, 746, 747, 5, 40, 0, 0, 747, 192, 1, 0, 0, 0, 748, 749, 5, 97, 0, 0, 749, 750, 5, 114, 0, 0, 750, 751, 5, 99, 0, 0, 751, 752, 5, 111, 0, 0, 752, 753, 5, 116, 0, 0, 753, 754, 5, 97, 0, 0, 754, 755, 5, 110, 0, 0, 755, 756, 5, 104, 0, 0, 756, 757, 5, 40, 0, 0, 757, 194, 1, 0, 0, 0, 758, 759, 5, 97, 0, 0, 759, 760, 5, 114, 0, 0, 760, 761, 5, 99, 0, 0, 761, 762, 5, 116, 0, 0, 762, 763, 5, 104, 0, 0, 763, 764, 5, 40, 0, 0, 764, 196, 1, 0, 0, 0, 765, 766, 5, 97, 0, 0, 766, 767, 5, 115, 0, 0, 767, 768, 5, 101, 0, 0, 768, 769, 5, 99, 0, 0, 769, 770, 5, 104, 0, 0, 770, 771, 5, 40, 0, 0, 771, 198, 1, 0, 0, 0, 772, 773, 5, 97, 0, 0, 773, 774, 5, 114, 0, 0, 774, 775, 5, 115, 0, 0, 775, 776, 5, 101, 0, 0, 776, 777, 5, 99, 0, 0, 777, 778, 5, 104, 0, 0, 778, 779, 5, 40, 0, 0, 779, 200, 1, 0, 0, 0, 780, 781, 5, 97, 0, 0, 781, 782, 5, 114, 0, 0, 782, 783, 5, 115, 0, 0, 783, 784, 5, 99, 0, 0, 784, 785, 5, 104, 0, 0, 785, 786, 5, 40, 0, 0, 786, 202, 1, 0, 0, 0, 787, 788, 5, 97, 0, 0, 788, 789, 5, 99, 0, 0, 789, 790, 5, 111, 0, 0, 790, 791, 5, 115, 0, 0, 791, 792, 5, 101, 0, 0, 792, 793, 5, 99, 0, 0, 793, 794, 5, 104, 0, 0, 794, 795, 5, 40, 0, 0, 795, 204, 1, 0, 0, 0, 796, 797, 5, 97, 0, 0, 797, 798, 5, 114, 0, 0, 798, 799, 5, 99, 0, 0, 799, 800, 5, 111, 0, 0, 800, 801, 5, 115, 0, 0, 801, 802, 5, 101, 0, 0, 802, 803, 5, 99, 0, 0, 803, 804, 5, 104, 0, 0, 804, 805, 5, 40, 0, 0, 805, 206, 1, 0, 0, 0, 806, 807, 5, 97, 0, 0, 807, 808, 5, 114, 0, 0, 808, 809, 5, 99, 0, 0, 809, 810, 5, 115, 0, 0, 810, 811, 5, 99, 0, 0, 811, 812, 5, 104, 0, 0, 812, 813, 5, 40, 0, 0, 813, 208, 1, 0, 0, 0, 814, 815, 5, 97, 0, 0, 815, 816, 5, 99, 0, 0, 816, 817, 5, 115, 0, 0, 817, 818, 5, 99, 0, 0, 818, 819, 5, 104, 0, 0, 819, 820, 5, 40, 0, 0, 820, 210, 1, 0, 0, 0, 821, 822, 5, 103, 0, 0, 822, 823, 5, 97, 0, 0, 823, 824, 5, 109, 0, 0, 824, 825, 5, 109, 0, 0, 825, 826, 5, 97, 0, 0, 826, 827, 5, 40, 0, 0, 827, 212, 1, 0, 0, 0, 828, 829, 5, 100, 0, 0, 829, 830, 5, 101, 0, 0, 830, 831, 5, 114, 0, 0, 831, 832, 5, 105, 0, 0, 832, 833, 5, 118, 0, 0, 833, 834, 5, 97, 0, 0, 834, 835, 5, 116, 0, 0, 835, 836, 5, 105, 0, 0, 836, 837, 5, 118, 0, 0, 837, 838, 5, 101, 0, 0, 838, 839, 5, 40, 0, 0, 839, 214, 1, 0, 0, 0, 840, 841, 5, 105, 0, 0, 841, 842, 5, 110, 0, 0, 842, 843, 5, 116, 0, 0, 843, 844, 5, 101, 0, 0, 844, 845, 5, 103, 0, 0, 845, 846, 5, 114, 0, 0, 846, 847, 5, 97, 0, 0, 847, 848, 5, 108, 0, 0, 848, 849, 5, 40, 0, 0, 849, 216, 1, 0, 0, 0, 850, 851, 5, 108, 0, 0, 851, 852, 5, 105, 0, 0, 852, 853, 5, 109, 0, 0, 853, 854, 5, 105, 0, 0, 854, 855, 5, 116, 0, 0, 855, 856, 5, 40, 0, 0, 856, 218, 1, 0, 0, 0, 857, 858, 5, 108, 0, 0, 858, 859, 5, 105, 0, 0, 859, 860, 5, 109, 0, 0, 860, 861, 5, 105, 0, 0, 861, 862, 5, 116, 0, 0, 862, 863, 5, 108, 0, 0, 863, 864, 5, 101, 0, 0, 864, 865, 5, 102, 0, 0, 865, 866, 5, 116, 0, 0, 866, 867, 5, 40, 0, 0, 867, 220, 1, 0, 0, 0, 868, 869, 5, 108, 0, 0, 869, 870, 5, 105, 0, 0, 870, 871, 5, 109, 0, 0, 871, 872, 5, 105, 0, 0, 872, 873, 5, 116, 0, 0, 873, 874, 5, 114, 0, 0, 874, 875, 5, 105, 0, 0, 875, 876, 5, 103, 0, 0, 876, 877, 5, 104, 0, 0, 877, 878, 5, 116, 0, 0, 878, 879, 5, 40, 0, 0, 879, 222, 1, 0, 0, 0, 880, 881, 5, 115, 0, 0, 881, 882, 5, 105, 0, 0, 882, 883, 5, 103, 0, 0, 883, 884, 5, 110, 0, 0, 884, 885, 5, 117, 0, 0, 885, 886, 5, 109, 0, 0, 886, 887, 5, 40, 0, 0, 887, 224, 1, 0, 0, 0, 888, 889, 5, 115, 0, 0, 889, 890, 5, 103, 0, 0, 890, 891, 5, 110, 0, 0, 891, 892, 5, 40, 0, 0, 892, 226, 1, 0, 0, 0, 893, 894, 5, 115, 0, 0, 894, 895, 5, 105, 0, 0, 895, 896, 5, 103, 0, 0, 896, 897, 5, 110, 0, 0, 897, 898, 5, 40, 0, 0, 898, 228, 1, 0, 0, 0, 899, 900, 5, 97, 0, 0, 900, 901, 5, 98, 0, 0, 901, 902, 5, 115, 0, 0, 902, 903, 5, 40, 0, 0, 903, 230, 1, 0, 0, 0, 904, 905, 5, 112, 0, 0, 905, 906, 5, 104, 0, 0, 906, 907, 5, 105, 0, 0, 907, 908, 5, 40, 0, 0, 908, 232, 1, 0, 0, 0, 909, 910, 5, 100, 0, 0, 910, 911, 5, 111, 0, 0, 911, 912, 5, 109, 0, 0, 912, 913, 5, 97, 0, 0, 913, 914, 5, 105, 0, 0, 914, 915, 5, 110, 0, 0, 915, 916, 5, 40, 0, 0, 916, 234, 1, 0, 0, 0, 917, 918, 5, 112, 0, 0, 918, 919, 5, 105, 0, 0, 919, 920, 5, 101, 0, 0, 920, 921, 5, 99, 0, 0, 921, 922, 5, 101, 0, 0, 922, 923, 5, 119, 0, 0, 923, 924, 5, 105, 0, 0, 924, 925, 5, 115, 0, 0, 925, 926, 5, 101, 0, 0, 926, 927, 5, 40, 0, 0, 927, 236, 1, 0, 0, 0, 928, 929, 5, 97, 0, 0, 929, 930, 5, 112, 0, 0, 930, 931, 5, 112, 0, 0, 931, 932, 5, 108, 0, 0, 932, 933, 5, 121, 0, 0, 933, 934, 5, 40, 0, 0, 934, 238, 1, 0, 0, 0, 935, 936, 5, 108, 0, 0, 936, 937, 5, 97, 0, 0, 937, 938, 5, 109, 0, 0, 938, 939, 5, 98, 0, 0, 939, 940, 5, 100, 0, 0, 940, 941, 5, 97, 0, 0, 941, 942, 5, 40, 0, 0, 942, 240, 1, 0, 0, 0, 943, 945, 5, 13, 0, 0, 944, 943, 1, 0, 0, 0, 944, 945, 1, 0, 0, 0, 945, 946, 1, 0, 0, 0, 946, 948, 5, 10, 0, 0, 947, 944, 1, 0, 0, 0, 948, 949, 1, 0, 0, 0, 949, 947, 1, 0, 0, 0, 949, 950, 1, 0, 0, 0, 950, 951, 1, 0, 0, 0, 951, 952, 6, 120, 0, 0, 952, 242, 1, 0, 0, 0, 953, 955, 7, 0, 0, 0, 954, 956, 7, 1, 0, 0, 955, 954, 1, 0, 0, 0, 955, 956, 1, 0, 0, 0, 956, 958, 1, 0, 0, 0, 957, 959, 2, 48, 57, 0, 958, 957, 1, 0, 0, 0, 959, 960, 1, 0, 0, 0, 960, 958, 1, 0, 0, 0, 960, 961, 1, 0, 0, 0, 961, 244, 1, 0, 0, 0, 962, 964, 2, 48, 57, 0, 963, 962, 1, 0, 0, 0, 964, 965, 1, 0, 0, 0, 965, 963, 1, 0, 0, 0, 965, 966, 1, 0, 0, 0, 966, 967, 1, 0, 0, 0, 967, 971, 5, 46, 0, 0, 968, 970, 2, 48, 57, 0, 969, 968, 1, 0, 0, 0, 970, 973, 1, 0, 0, 0, 971, 969, 1, 0, 0, 0, 971, 972, 1, 0, 0, 0, 972, 975, 1, 0, 0, 0, 973, 971, 1, 0, 0, 0, 974, 976, 3, 243, 121, 0, 975, 974, 1, 0, 0, 0, 975, 976, 1, 0, 0, 0, 976, 978, 1, 0, 0, 0, 977, 979, 5, 105, 0, 0, 978, 977, 1, 0, 0, 0, 978, 979, 1, 0, 0, 0, 979, 996, 1, 0, 0, 0, 980, 982, 5, 46, 0, 0, 981, 980, 1, 0, 0, 0, 981, 982, 1, 0, 0, 0, 982, 984, 1, 0, 0, 0, 983, 985, 2, 48, 57, 0, 984, 983, 1, 0, 0, 0, 985, 986, 1, 0, 0, 0, 986, 984, 1, 0, 0, 0, 986, 987, 1, 0, 0, 0, 987, 989, 1, 0, 0, 0, 988, 990, 3, 243, 121, 0, 989, 988, 1, 0, 0, 0, 989, 990, 1, 0, 0, 0, 990, 992, 1, 0, 0, 0, 991, 993, 5, 105, 0, 0, 992, 991, 1, 0, 0, 0, 992, 993, 1, 0, 0, 0, 993, 996, 1, 0, 0, 0, 994, 996, 5, 105, 0, 0, 995, 963, 1, 0, 0, 0, 995, 981, 1, 0, 0, 0, 995, 994, 1, 0, 0, 0, 996, 246, 1, 0, 0, 0, 997, 998, 5, 67, 0, 0, 998, 1008, 5, 67, 0, 0, 999, 1000, 5, 82, 0, 0, 1000, 1008, 5, 82, 0, 0, 1001, 1002, 5, 81, 0, 0, 1002, 1008, 5, 81, 0, 0, 1003, 1004, 5, 90, 0, 0, 1004, 1008, 5, 90, 0, 0, 1005, 1006, 5, 66, 0, 0, 1006, 1008, 5, 66, 0, 0, 1007, 997, 1, 0, 0, 0, 1007, 999, 1, 0, 0, 0, 1007, 1001, 1, 0, 0, 0, 1007, 1003, 1, 0, 0, 0, 1007, 1005, 1, 0, 0, 0, 1008, 248, 1, 0, 0, 0, 1009, 1010, 5, 116, 0, 0, 1010, 1011, 5, 114, 0, 0, 1011, 1012, 5, 117, 0, 0, 1012, 1028, 5, 101, 0, 0, 1013, 1014, 5, 84, 0, 0, 1014, 1015, 5, 114, 0, 0, 1015, 1016, 5, 117, 0, 0, 1016, 1028, 5, 101, 0, 0, 1017, 1018, 5, 102, 0, 0, 1018, 1019, 5, 97, 0, 0, 1019, 1020, 5, 108, 0, 0, 1020, 1021, 5, 115, 0, 0, 1021, 1028, 5, 101, 0, 0, 1022, 1023, 5, 70, 0, 0, 1023, 1024, 5, 97, 0, 0, 1024, 1025, 5, 108, 0, 0, 1025, 1026, 5, 115, 0, 0, 1026, 1028, 5, 101, 0, 0, 1027, 1009, 1, 0, 0, 0, 1027, 1013, 1, 0, 0, 0, 1027, 1017, 1, 0, 0, 0, 1027, 1022, 1, 0, 0, 0, 1028, 250, 1, 0, 0, 0, 1029, 1031, 7, 2, 0, 0, 1030, 1029, 1, 0, 0, 0, 1031, 1032, 1, 0, 0, 0, 1032, 1030, 1, 0, 0, 0, 1032, 1033, 1, 0, 0, 0, 1033, 1040, 1, 0, 0, 0, 1034, 1036, 5, 95, 0, 0, 1035, 1037, 7, 3, 0, 0, 1036, 1035, 1, 0, 0, 0, 1037, 1038, 1, 0, 0, 0, 1038, 1036, 1, 0, 0, 0, 1038, 1039, 1, 0, 0, 0, 1039, 1041, 1, 0, 0, 0, 1040, 1034, 1, 0, 0, 0, 1040, 1041, 1, 0, 0, 0, 1041, 252, 1, 0, 0, 0, 1042, 1043, 5, 47, 0, 0, 1043, 1044, 5, 47, 0, 0, 1044, 1048, 1, 0, 0, 0, 1045, 1047, 8, 4, 0, 0, 1046, 1045, 1, 0, 0, 0, 1047, 1050, 1, 0, 0, 0, 1048, 1046, 1, 0, 0, 0, 1048, 1049, 1, 0, 0, 0, 1049, 1052, 1, 0, 0, 0, 1050, 1048, 1, 0, 0, 0, 1051, 1053, 5, 13, 0, 0, 1052, 1051, 1, 0, 0, 0, 1052, 1053, 1, 0, 0, 0, 1053, 1054, 1, 0, 0, 0, 1054, 1067, 5, 10, 0, 0, 1055, 1056, 5, 47, 0, 0, 1056, 1057, 5, 42, 0, 0, 1057, 1061, 1, 0, 0, 0, 1058, 1060, 9, 0, 0, 0, 1059, 1058, 1, 0, 0, 0, 1060, 1063, 1, 0, 0, 0, 1061, 1062, 1, 0, 0, 0, 1061, 1059, 1, 0, 0, 0, 1062, 1064, 1, 0, 0, 0, 1063, 1061, 1, 0, 0, 0, 1064, 1065, 5, 42, 0, 0, 1065, 1067, 5, 47, 0, 0, 1066, 1042, 1, 0, 0, 0, 1066, 1055, 1, 0, 0, 0, 1067, 1068, 1, 0, 0, 0, 1068, 1069, 6, 126, 0, 0, 1069, 254, 1, 0, 0, 0, 1070, 1072, 7, 5, 0, 0, 1071, 1070, 1, 0, 0, 0, 1072, 1073, 1, 0, 0, 0, 1073, 1071, 1, 0, 0, 0, 1073, 1074, 1, 0, 0, 0, 1074, 1075, 1, 0, 0, 0, 1075, 1076, 6, 127, 0, 0, 1076, 256, 1, 0, 0, 0, 24, 0, 944, 949, 955, 960, 965, 971, 975, 978, 981, 986, 989, 992, 995, 1007, 1027, 1032, 1038, 1040, 1048, 1052, 1061, 1066, 1073, 1, 6, 0, 0] \ No newline at end of file diff --git a/Sources/AngouriMath/Core/Antlr/AngouriMathLexer.tokens b/Sources/AngouriMath/Core/Antlr/AngouriMathLexer.tokens index 4eb67b898..4e3c5f209 100644 --- a/Sources/AngouriMath/Core/Antlr/AngouriMathLexer.tokens +++ b/Sources/AngouriMath/Core/Antlr/AngouriMathLexer.tokens @@ -142,8 +142,8 @@ WS=127 '<='=15 '>'=16 '<'=17 -'equalizes'=18 -'='=19 +'='=18 +'<>'=19 'not'=20 'and'=21 '&'=22 diff --git a/Sources/AngouriMath/Core/Antlr/AngouriMathListener.cs b/Sources/AngouriMath/Core/Antlr/AngouriMathListener.cs index ad43cc14f..e1a44e91e 100644 --- a/Sources/AngouriMath/Core/Antlr/AngouriMathListener.cs +++ b/Sources/AngouriMath/Core/Antlr/AngouriMathListener.cs @@ -102,25 +102,15 @@ internal interface IAngouriMathListener : IParseTreeListener { /// The parse tree. void ExitSet_operator_intersection([NotNull] AngouriMathParser.Set_operator_intersectionContext context); /// - /// Enter a parse tree produced by . + /// Enter a parse tree produced by . /// /// The parse tree. - void EnterSet_operator_union([NotNull] AngouriMathParser.Set_operator_unionContext context); + void EnterSet_operator_union_setsubtraction([NotNull] AngouriMathParser.Set_operator_union_setsubtractionContext context); /// - /// Exit a parse tree produced by . + /// Exit a parse tree produced by . /// /// The parse tree. - void ExitSet_operator_union([NotNull] AngouriMathParser.Set_operator_unionContext context); - /// - /// Enter a parse tree produced by . - /// - /// The parse tree. - void EnterSet_operator_setsubtraction([NotNull] AngouriMathParser.Set_operator_setsubtractionContext context); - /// - /// Exit a parse tree produced by . - /// - /// The parse tree. - void ExitSet_operator_setsubtraction([NotNull] AngouriMathParser.Set_operator_setsubtractionContext context); + void ExitSet_operator_union_setsubtraction([NotNull] AngouriMathParser.Set_operator_union_setsubtractionContext context); /// /// Enter a parse tree produced by . /// @@ -132,35 +122,15 @@ internal interface IAngouriMathListener : IParseTreeListener { /// The parse tree. void ExitIn_operator([NotNull] AngouriMathParser.In_operatorContext context); /// - /// Enter a parse tree produced by . - /// - /// The parse tree. - void EnterInequality_expression([NotNull] AngouriMathParser.Inequality_expressionContext context); - /// - /// Exit a parse tree produced by . - /// - /// The parse tree. - void ExitInequality_expression([NotNull] AngouriMathParser.Inequality_expressionContext context); - /// - /// Enter a parse tree produced by . - /// - /// The parse tree. - void EnterTerms_list([NotNull] AngouriMathParser.Terms_listContext context); - /// - /// Exit a parse tree produced by . - /// - /// The parse tree. - void ExitTerms_list([NotNull] AngouriMathParser.Terms_listContext context); - /// - /// Enter a parse tree produced by . + /// Enter a parse tree produced by . /// /// The parse tree. - void EnterEquality_expression([NotNull] AngouriMathParser.Equality_expressionContext context); + void EnterComparison_expression([NotNull] AngouriMathParser.Comparison_expressionContext context); /// - /// Exit a parse tree produced by . + /// Exit a parse tree produced by . /// /// The parse tree. - void ExitEquality_expression([NotNull] AngouriMathParser.Equality_expressionContext context); + void ExitComparison_expression([NotNull] AngouriMathParser.Comparison_expressionContext context); /// /// Enter a parse tree produced by . /// diff --git a/Sources/AngouriMath/Core/Antlr/AngouriMathParser.cs b/Sources/AngouriMath/Core/Antlr/AngouriMathParser.cs index 62854badb..ad9e447ee 100644 --- a/Sources/AngouriMath/Core/Antlr/AngouriMathParser.cs +++ b/Sources/AngouriMath/Core/Antlr/AngouriMathParser.cs @@ -68,18 +68,16 @@ public const int public const int RULE_factorial_expression = 0, RULE_power_list = 1, RULE_power_expression = 2, RULE_unary_expression = 3, RULE_mult_expression = 4, RULE_sum_expression = 5, - RULE_set_operator_intersection = 6, RULE_set_operator_union = 7, RULE_set_operator_setsubtraction = 8, - RULE_in_operator = 9, RULE_inequality_expression = 10, RULE_terms_list = 11, - RULE_equality_expression = 12, RULE_negate_expression = 13, RULE_and_expression = 14, - RULE_xor_expression = 15, RULE_or_expression = 16, RULE_implies_expression = 17, - RULE_provided_expression = 18, RULE_expression = 19, RULE_function_arguments = 20, - RULE_interval_arguments = 21, RULE_cset_arguments = 22, RULE_atom = 23, - RULE_statement = 24; + RULE_set_operator_intersection = 6, RULE_set_operator_union_setsubtraction = 7, + RULE_in_operator = 8, RULE_comparison_expression = 9, RULE_negate_expression = 10, + RULE_and_expression = 11, RULE_xor_expression = 12, RULE_or_expression = 13, + RULE_implies_expression = 14, RULE_provided_expression = 15, RULE_expression = 16, + RULE_function_arguments = 17, RULE_interval_arguments = 18, RULE_cset_arguments = 19, + RULE_atom = 20, RULE_statement = 21; public static readonly string[] ruleNames = { "factorial_expression", "power_list", "power_expression", "unary_expression", - "mult_expression", "sum_expression", "set_operator_intersection", "set_operator_union", - "set_operator_setsubtraction", "in_operator", "inequality_expression", - "terms_list", "equality_expression", "negate_expression", "and_expression", + "mult_expression", "sum_expression", "set_operator_intersection", "set_operator_union_setsubtraction", + "in_operator", "comparison_expression", "negate_expression", "and_expression", "xor_expression", "or_expression", "implies_expression", "provided_expression", "expression", "function_arguments", "interval_arguments", "cset_arguments", "atom", "statement" @@ -88,13 +86,13 @@ public const int private static readonly string[] _LiteralNames = { null, "'!'", "'^'", "'-'", "'+'", "'*'", "'/'", "'intersect'", "'/\\'", "'unite'", "'\\/'", "'setsubtract'", "'\\'", "'in'", "'>='", "'<='", "'>'", - "'<'", "'equalizes'", "'='", "'not'", "'and'", "'&'", "'xor'", "'or'", - "'|'", "'implies'", "'->'", "'provided'", "','", "';'", "':'", "'+oo'", - "'-oo'", "'(|'", "'|)'", "'['", "']T'", "']'", "'('", "')'", "'{'", "'}'", - "'log('", "'sqrt('", "'cbrt('", "'sqr('", "'ln('", "'sin('", "'cos('", - "'tan('", "'cotan('", "'cot('", "'sec('", "'cosec('", "'csc('", "'arcsin('", - "'arccos('", "'arctan('", "'arccotan('", "'arcsec('", "'arccosec('", "'arccsc('", - "'acsc('", "'asin('", "'acos('", "'atan('", "'acotan('", "'asec('", "'acosec('", + "'<'", "'='", "'<>'", "'not'", "'and'", "'&'", "'xor'", "'or'", "'|'", + "'implies'", "'->'", "'provided'", "','", "';'", "':'", "'+oo'", "'-oo'", + "'(|'", "'|)'", "'['", "']T'", "']'", "'('", "')'", "'{'", "'}'", "'log('", + "'sqrt('", "'cbrt('", "'sqr('", "'ln('", "'sin('", "'cos('", "'tan('", + "'cotan('", "'cot('", "'sec('", "'cosec('", "'csc('", "'arcsin('", "'arccos('", + "'arctan('", "'arccotan('", "'arcsec('", "'arccosec('", "'arccsc('", "'acsc('", + "'asin('", "'acos('", "'atan('", "'acotan('", "'asec('", "'acosec('", "'acot('", "'arccot('", "'sinh('", "'sh('", "'cosh('", "'ch('", "'tanh('", "'th('", "'cotanh('", "'coth('", "'cth('", "'sech('", "'sch('", "'cosech('", "'csch('", "'asinh('", "'arsinh('", "'arsh('", "'acosh('", "'arcosh('", @@ -185,15 +183,15 @@ public Factorial_expressionContext factorial_expression() { Factorial_expressionContext _localctx = new Factorial_expressionContext(Context, State); EnterRule(_localctx, 0, RULE_factorial_expression); try { - State = 57; + State = 51; ErrorHandler.Sync(this); switch ( Interpreter.AdaptivePredict(TokenStream,0,Context) ) { case 1: EnterOuterAlt(_localctx, 1); { - State = 50; + State = 44; _localctx.p = atom(); - State = 51; + State = 45; Match(T__0); _localctx.value = MathS.Factorial(_localctx.p.value); } @@ -201,7 +199,7 @@ public Factorial_expressionContext factorial_expression() { case 2: EnterOuterAlt(_localctx, 2); { - State = 54; + State = 48; _localctx.p = atom(); _localctx.value = _localctx.p.value; } @@ -259,13 +257,13 @@ public Power_listContext power_list() { _localctx.value = new(); try { int _alt; - State = 75; + State = 69; ErrorHandler.Sync(this); switch ( Interpreter.AdaptivePredict(TokenStream,3,Context) ) { case 1: EnterOuterAlt(_localctx, 1); { - State = 63; + State = 57; ErrorHandler.Sync(this); _alt = 1; do { @@ -273,9 +271,9 @@ public Power_listContext power_list() { case 1: { { - State = 59; + State = 53; Match(T__1); - State = 60; + State = 54; _localctx._factorial_expression = factorial_expression(); _localctx.value.Add(_localctx._factorial_expression.value); } @@ -284,7 +282,7 @@ public Power_listContext power_list() { default: throw new NoViableAltException(this); } - State = 65; + State = 59; ErrorHandler.Sync(this); _alt = Interpreter.AdaptivePredict(TokenStream,1,Context); } while ( _alt!=2 && _alt!=global::Antlr4.Runtime.Atn.ATN.INVALID_ALT_NUMBER ); @@ -293,7 +291,7 @@ public Power_listContext power_list() { case 2: EnterOuterAlt(_localctx, 2); { - State = 71; + State = 65; ErrorHandler.Sync(this); _alt = 1; do { @@ -301,9 +299,9 @@ public Power_listContext power_list() { case 1: { { - State = 67; + State = 61; Match(T__1); - State = 68; + State = 62; _localctx._unary_expression = unary_expression(); _localctx.value.Add(_localctx._unary_expression.value); } @@ -312,7 +310,7 @@ public Power_listContext power_list() { default: throw new NoViableAltException(this); } - State = 73; + State = 67; ErrorHandler.Sync(this); _alt = Interpreter.AdaptivePredict(TokenStream,2,Context); } while ( _alt!=2 && _alt!=global::Antlr4.Runtime.Atn.ATN.INVALID_ALT_NUMBER ); @@ -365,15 +363,15 @@ public Power_expressionContext power_expression() { try { EnterOuterAlt(_localctx, 1); { - State = 77; + State = 71; _localctx._factorial_expression = factorial_expression(); _localctx.value = _localctx._factorial_expression.value; - State = 82; + State = 76; ErrorHandler.Sync(this); switch ( Interpreter.AdaptivePredict(TokenStream,4,Context) ) { case 1: { - State = 79; + State = 73; _localctx._power_list = power_list(); _localctx.value = _localctx._power_list.value @@ -429,29 +427,29 @@ public Unary_expressionContext unary_expression() { Unary_expressionContext _localctx = new Unary_expressionContext(Context, State); EnterRule(_localctx, 6, RULE_unary_expression); try { - State = 107; + State = 101; ErrorHandler.Sync(this); switch ( Interpreter.AdaptivePredict(TokenStream,7,Context) ) { case 1: EnterOuterAlt(_localctx, 1); { - State = 92; + State = 86; ErrorHandler.Sync(this); switch (TokenStream.LA(1)) { case T__2: { - State = 84; + State = 78; Match(T__2); - State = 85; + State = 79; _localctx.p = power_expression(); _localctx.value = _localctx.p.value is Number num ? -num : -_localctx.p.value; } break; case T__3: { - State = 88; + State = 82; Match(T__3); - State = 89; + State = 83; _localctx.p = power_expression(); _localctx.value = _localctx.p.value; } @@ -464,23 +462,23 @@ public Unary_expressionContext unary_expression() { case 2: EnterOuterAlt(_localctx, 2); { - State = 102; + State = 96; ErrorHandler.Sync(this); switch (TokenStream.LA(1)) { case T__2: { - State = 94; + State = 88; Match(T__2); - State = 95; + State = 89; _localctx.u = unary_expression(); _localctx.value = -_localctx.u.value; } break; case T__3: { - State = 98; + State = 92; Match(T__3); - State = 99; + State = 93; _localctx.u = unary_expression(); _localctx.value = _localctx.u.value; } @@ -493,7 +491,7 @@ public Unary_expressionContext unary_expression() { case 3: EnterOuterAlt(_localctx, 3); { - State = 104; + State = 98; _localctx.p = power_expression(); _localctx.value = _localctx.p.value; } @@ -546,31 +544,31 @@ public Mult_expressionContext mult_expression() { try { EnterOuterAlt(_localctx, 1); { - State = 109; + State = 103; _localctx.u1 = unary_expression(); _localctx.value = _localctx.u1.value; - State = 121; + State = 115; ErrorHandler.Sync(this); _la = TokenStream.LA(1); while (_la==T__4 || _la==T__5) { { - State = 119; + State = 113; ErrorHandler.Sync(this); switch (TokenStream.LA(1)) { case T__4: { - State = 111; + State = 105; Match(T__4); - State = 112; + State = 106; _localctx.u2 = unary_expression(); _localctx.value = _localctx.value * _localctx.u2.value; } break; case T__5: { - State = 115; + State = 109; Match(T__5); - State = 116; + State = 110; _localctx.u2 = unary_expression(); _localctx.value = _localctx.value / _localctx.u2.value; } @@ -579,7 +577,7 @@ public Mult_expressionContext mult_expression() { throw new NoViableAltException(this); } } - State = 123; + State = 117; ErrorHandler.Sync(this); _la = TokenStream.LA(1); } @@ -631,31 +629,31 @@ public Sum_expressionContext sum_expression() { try { EnterOuterAlt(_localctx, 1); { - State = 124; + State = 118; _localctx.m1 = mult_expression(); _localctx.value = _localctx.m1.value; - State = 136; + State = 130; ErrorHandler.Sync(this); _la = TokenStream.LA(1); while (_la==T__2 || _la==T__3) { { - State = 134; + State = 128; ErrorHandler.Sync(this); switch (TokenStream.LA(1)) { case T__3: { - State = 126; + State = 120; Match(T__3); - State = 127; + State = 121; _localctx.m2 = mult_expression(); _localctx.value = _localctx.value + _localctx.m2.value; } break; case T__2: { - State = 130; + State = 124; Match(T__2); - State = 131; + State = 125; _localctx.m2 = mult_expression(); _localctx.value = _localctx.value - _localctx.m2.value; } @@ -664,7 +662,7 @@ public Sum_expressionContext sum_expression() { throw new NoViableAltException(this); } } - State = 138; + State = 132; ErrorHandler.Sync(this); _la = TokenStream.LA(1); } @@ -716,31 +714,31 @@ public Set_operator_intersectionContext set_operator_intersection() { try { EnterOuterAlt(_localctx, 1); { - State = 139; + State = 133; _localctx.left = sum_expression(); _localctx.value = _localctx.left.value; - State = 151; + State = 145; ErrorHandler.Sync(this); _la = TokenStream.LA(1); while (_la==T__6 || _la==T__7) { { - State = 149; + State = 143; ErrorHandler.Sync(this); switch (TokenStream.LA(1)) { case T__6: { - State = 141; + State = 135; Match(T__6); - State = 142; + State = 136; _localctx.right = sum_expression(); _localctx.value = _localctx.value.Intersect(_localctx.right.value); } break; case T__7: { - State = 145; + State = 139; Match(T__7); - State = 146; + State = 140; _localctx.right = sum_expression(); _localctx.value = _localctx.value.Intersect(_localctx.right.value); } @@ -749,7 +747,7 @@ public Set_operator_intersectionContext set_operator_intersection() { throw new NoViableAltException(this); } } - State = 153; + State = 147; ErrorHandler.Sync(this); _la = TokenStream.LA(1); } @@ -766,7 +764,7 @@ public Set_operator_intersectionContext set_operator_intersection() { return _localctx; } - internal partial class Set_operator_unionContext : ParserRuleContext { + internal partial class Set_operator_union_setsubtractionContext : ParserRuleContext { public Entity value; public Set_operator_intersectionContext left; public Set_operator_intersectionContext right; @@ -776,142 +774,75 @@ [System.Diagnostics.DebuggerNonUserCode] public Set_operator_intersectionContext [System.Diagnostics.DebuggerNonUserCode] public Set_operator_intersectionContext set_operator_intersection(int i) { return GetRuleContext(i); } - public Set_operator_unionContext(ParserRuleContext parent, int invokingState) + public Set_operator_union_setsubtractionContext(ParserRuleContext parent, int invokingState) : base(parent, invokingState) { } - public override int RuleIndex { get { return RULE_set_operator_union; } } + public override int RuleIndex { get { return RULE_set_operator_union_setsubtraction; } } [System.Diagnostics.DebuggerNonUserCode] public override void EnterRule(IParseTreeListener listener) { IAngouriMathListener typedListener = listener as IAngouriMathListener; - if (typedListener != null) typedListener.EnterSet_operator_union(this); + if (typedListener != null) typedListener.EnterSet_operator_union_setsubtraction(this); } [System.Diagnostics.DebuggerNonUserCode] public override void ExitRule(IParseTreeListener listener) { IAngouriMathListener typedListener = listener as IAngouriMathListener; - if (typedListener != null) typedListener.ExitSet_operator_union(this); + if (typedListener != null) typedListener.ExitSet_operator_union_setsubtraction(this); } } [RuleVersion(0)] - public Set_operator_unionContext set_operator_union() { - Set_operator_unionContext _localctx = new Set_operator_unionContext(Context, State); - EnterRule(_localctx, 14, RULE_set_operator_union); + public Set_operator_union_setsubtractionContext set_operator_union_setsubtraction() { + Set_operator_union_setsubtractionContext _localctx = new Set_operator_union_setsubtractionContext(Context, State); + EnterRule(_localctx, 14, RULE_set_operator_union_setsubtraction); int _la; try { EnterOuterAlt(_localctx, 1); { - State = 154; + State = 148; _localctx.left = set_operator_intersection(); _localctx.value = _localctx.left.value; - State = 166; + State = 168; ErrorHandler.Sync(this); _la = TokenStream.LA(1); - while (_la==T__8 || _la==T__9) { + while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 7680L) != 0)) { { - State = 164; + State = 166; ErrorHandler.Sync(this); switch (TokenStream.LA(1)) { case T__8: { - State = 156; + State = 150; Match(T__8); - State = 157; + State = 151; _localctx.right = set_operator_intersection(); _localctx.value = _localctx.value.Unite(_localctx.right.value); } break; case T__9: { - State = 160; + State = 154; Match(T__9); - State = 161; + State = 155; _localctx.right = set_operator_intersection(); _localctx.value = _localctx.value.Unite(_localctx.right.value); } break; - default: - throw new NoViableAltException(this); - } - } - State = 168; - ErrorHandler.Sync(this); - _la = TokenStream.LA(1); - } - } - } - catch (RecognitionException re) { - _localctx.exception = re; - ErrorHandler.ReportError(this, re); - ErrorHandler.Recover(this, re); - } - finally { - ExitRule(); - } - return _localctx; - } - - internal partial class Set_operator_setsubtractionContext : ParserRuleContext { - public Entity value; - public Set_operator_unionContext left; - public Set_operator_unionContext right; - [System.Diagnostics.DebuggerNonUserCode] public Set_operator_unionContext[] set_operator_union() { - return GetRuleContexts(); - } - [System.Diagnostics.DebuggerNonUserCode] public Set_operator_unionContext set_operator_union(int i) { - return GetRuleContext(i); - } - public Set_operator_setsubtractionContext(ParserRuleContext parent, int invokingState) - : base(parent, invokingState) - { - } - public override int RuleIndex { get { return RULE_set_operator_setsubtraction; } } - [System.Diagnostics.DebuggerNonUserCode] - public override void EnterRule(IParseTreeListener listener) { - IAngouriMathListener typedListener = listener as IAngouriMathListener; - if (typedListener != null) typedListener.EnterSet_operator_setsubtraction(this); - } - [System.Diagnostics.DebuggerNonUserCode] - public override void ExitRule(IParseTreeListener listener) { - IAngouriMathListener typedListener = listener as IAngouriMathListener; - if (typedListener != null) typedListener.ExitSet_operator_setsubtraction(this); - } - } - - [RuleVersion(0)] - public Set_operator_setsubtractionContext set_operator_setsubtraction() { - Set_operator_setsubtractionContext _localctx = new Set_operator_setsubtractionContext(Context, State); - EnterRule(_localctx, 16, RULE_set_operator_setsubtraction); - int _la; - try { - EnterOuterAlt(_localctx, 1); - { - State = 169; - _localctx.left = set_operator_union(); - _localctx.value = _localctx.left.value; - State = 181; - ErrorHandler.Sync(this); - _la = TokenStream.LA(1); - while (_la==T__10 || _la==T__11) { - { - State = 179; - ErrorHandler.Sync(this); - switch (TokenStream.LA(1)) { case T__10: { - State = 171; + State = 158; Match(T__10); - State = 172; - _localctx.right = set_operator_union(); + State = 159; + _localctx.right = set_operator_intersection(); _localctx.value = _localctx.value.SetSubtract(_localctx.right.value); } break; case T__11: { - State = 175; + State = 162; Match(T__11); - State = 176; - _localctx.right = set_operator_union(); + State = 163; + _localctx.right = set_operator_intersection(); _localctx.value = _localctx.value.SetSubtract(_localctx.right.value); } break; @@ -919,7 +850,7 @@ public Set_operator_setsubtractionContext set_operator_setsubtraction() { throw new NoViableAltException(this); } } - State = 183; + State = 170; ErrorHandler.Sync(this); _la = TokenStream.LA(1); } @@ -938,13 +869,13 @@ public Set_operator_setsubtractionContext set_operator_setsubtraction() { internal partial class In_operatorContext : ParserRuleContext { public Entity value; - public Set_operator_setsubtractionContext m1; - public Set_operator_setsubtractionContext m2; - [System.Diagnostics.DebuggerNonUserCode] public Set_operator_setsubtractionContext[] set_operator_setsubtraction() { - return GetRuleContexts(); + public Set_operator_union_setsubtractionContext m1; + public Set_operator_union_setsubtractionContext m2; + [System.Diagnostics.DebuggerNonUserCode] public Set_operator_union_setsubtractionContext[] set_operator_union_setsubtraction() { + return GetRuleContexts(); } - [System.Diagnostics.DebuggerNonUserCode] public Set_operator_setsubtractionContext set_operator_setsubtraction(int i) { - return GetRuleContext(i); + [System.Diagnostics.DebuggerNonUserCode] public Set_operator_union_setsubtractionContext set_operator_union_setsubtraction(int i) { + return GetRuleContext(i); } public In_operatorContext(ParserRuleContext parent, int invokingState) : base(parent, invokingState) @@ -966,28 +897,28 @@ public override void ExitRule(IParseTreeListener listener) { [RuleVersion(0)] public In_operatorContext in_operator() { In_operatorContext _localctx = new In_operatorContext(Context, State); - EnterRule(_localctx, 18, RULE_in_operator); + EnterRule(_localctx, 16, RULE_in_operator); int _la; try { EnterOuterAlt(_localctx, 1); { - State = 184; - _localctx.m1 = set_operator_setsubtraction(); + State = 171; + _localctx.m1 = set_operator_union_setsubtraction(); _localctx.value = _localctx.m1.value; - State = 192; + State = 179; ErrorHandler.Sync(this); _la = TokenStream.LA(1); while (_la==T__12) { { { - State = 186; + State = 173; Match(T__12); - State = 187; - _localctx.m2 = set_operator_setsubtraction(); + State = 174; + _localctx.m2 = set_operator_union_setsubtraction(); _localctx.value = _localctx.value.In(_localctx.m2.value); } } - State = 194; + State = 181; ErrorHandler.Sync(this); _la = TokenStream.LA(1); } @@ -1004,7 +935,7 @@ public In_operatorContext in_operator() { return _localctx; } - internal partial class Inequality_expressionContext : ParserRuleContext { + internal partial class Comparison_expressionContext : ParserRuleContext { public Entity value; public In_operatorContext m1; public In_operatorContext m2; @@ -1014,228 +945,118 @@ [System.Diagnostics.DebuggerNonUserCode] public In_operatorContext[] in_operator [System.Diagnostics.DebuggerNonUserCode] public In_operatorContext in_operator(int i) { return GetRuleContext(i); } - public Inequality_expressionContext(ParserRuleContext parent, int invokingState) + public Comparison_expressionContext(ParserRuleContext parent, int invokingState) : base(parent, invokingState) { } - public override int RuleIndex { get { return RULE_inequality_expression; } } + public override int RuleIndex { get { return RULE_comparison_expression; } } [System.Diagnostics.DebuggerNonUserCode] public override void EnterRule(IParseTreeListener listener) { IAngouriMathListener typedListener = listener as IAngouriMathListener; - if (typedListener != null) typedListener.EnterInequality_expression(this); + if (typedListener != null) typedListener.EnterComparison_expression(this); } [System.Diagnostics.DebuggerNonUserCode] public override void ExitRule(IParseTreeListener listener) { IAngouriMathListener typedListener = listener as IAngouriMathListener; - if (typedListener != null) typedListener.ExitInequality_expression(this); + if (typedListener != null) typedListener.ExitComparison_expression(this); } } [RuleVersion(0)] - public Inequality_expressionContext inequality_expression() { - Inequality_expressionContext _localctx = new Inequality_expressionContext(Context, State); - EnterRule(_localctx, 20, RULE_inequality_expression); + public Comparison_expressionContext comparison_expression() { + Comparison_expressionContext _localctx = new Comparison_expressionContext(Context, State); + EnterRule(_localctx, 18, RULE_comparison_expression); + List terms = []; List operators = []; int _la; try { EnterOuterAlt(_localctx, 1); { - State = 195; + State = 182; _localctx.m1 = in_operator(); - _localctx.value = _localctx.m1.value; - State = 219; + terms.Add(_localctx.m1.value); + State = 203; ErrorHandler.Sync(this); _la = TokenStream.LA(1); - while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 507904L) != 0)) { + while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 1032192L) != 0)) { + { { - State = 217; + State = 196; ErrorHandler.Sync(this); switch (TokenStream.LA(1)) { case T__13: { - State = 197; + State = 184; Match(T__13); - State = 198; - _localctx.m2 = in_operator(); - _localctx.value = _localctx.value >= _localctx.m2.value; + operators.Add(">="); } break; case T__14: { - State = 201; + State = 186; Match(T__14); - State = 202; - _localctx.m2 = in_operator(); - _localctx.value = _localctx.value <= _localctx.m2.value; + operators.Add("<="); } break; case T__15: { - State = 205; + State = 188; Match(T__15); - State = 206; - _localctx.m2 = in_operator(); - _localctx.value = _localctx.value > _localctx.m2.value; + operators.Add(">"); } break; case T__16: { - State = 209; + State = 190; Match(T__16); - State = 210; - _localctx.m2 = in_operator(); - _localctx.value = _localctx.value < _localctx.m2.value; + operators.Add("<"); } break; case T__17: { - State = 213; + State = 192; Match(T__17); - State = 214; - _localctx.m2 = in_operator(); - _localctx.value = MathS.Equality(_localctx.value, _localctx.m2.value); + operators.Add("="); + } + break; + case T__18: + { + State = 194; + Match(T__18); + operators.Add("<>"); } break; default: throw new NoViableAltException(this); } + State = 198; + _localctx.m2 = in_operator(); + terms.Add(_localctx.m2.value); } - State = 221; - ErrorHandler.Sync(this); - _la = TokenStream.LA(1); - } - } - } - catch (RecognitionException re) { - _localctx.exception = re; - ErrorHandler.ReportError(this, re); - ErrorHandler.Recover(this, re); - } - finally { - ExitRule(); - } - return _localctx; - } - - internal partial class Terms_listContext : ParserRuleContext { - public List terms; - public Inequality_expressionContext term; - [System.Diagnostics.DebuggerNonUserCode] public Inequality_expressionContext[] inequality_expression() { - return GetRuleContexts(); - } - [System.Diagnostics.DebuggerNonUserCode] public Inequality_expressionContext inequality_expression(int i) { - return GetRuleContext(i); - } - public Terms_listContext(ParserRuleContext parent, int invokingState) - : base(parent, invokingState) - { - } - public override int RuleIndex { get { return RULE_terms_list; } } - [System.Diagnostics.DebuggerNonUserCode] - public override void EnterRule(IParseTreeListener listener) { - IAngouriMathListener typedListener = listener as IAngouriMathListener; - if (typedListener != null) typedListener.EnterTerms_list(this); - } - [System.Diagnostics.DebuggerNonUserCode] - public override void ExitRule(IParseTreeListener listener) { - IAngouriMathListener typedListener = listener as IAngouriMathListener; - if (typedListener != null) typedListener.ExitTerms_list(this); - } - } - - [RuleVersion(0)] - public Terms_listContext terms_list() { - Terms_listContext _localctx = new Terms_listContext(Context, State); - EnterRule(_localctx, 22, RULE_terms_list); - _localctx.terms = new(); - int _la; - try { - EnterOuterAlt(_localctx, 1); - { - State = 226; - ErrorHandler.Sync(this); - _la = TokenStream.LA(1); - do { - { - { - State = 222; - Match(T__18); - State = 223; - _localctx.term = inequality_expression(); - _localctx.terms.Add(_localctx.term.value); } - } - State = 228; + State = 205; ErrorHandler.Sync(this); _la = TokenStream.LA(1); - } while ( _la==T__18 ); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - ErrorHandler.ReportError(this, re); - ErrorHandler.Recover(this, re); - } - finally { - ExitRule(); - } - return _localctx; - } - - internal partial class Equality_expressionContext : ParserRuleContext { - public Entity value; - public Inequality_expressionContext expr; - public Terms_listContext _terms_list; - [System.Diagnostics.DebuggerNonUserCode] public Inequality_expressionContext inequality_expression() { - return GetRuleContext(0); - } - [System.Diagnostics.DebuggerNonUserCode] public Terms_listContext terms_list() { - return GetRuleContext(0); - } - public Equality_expressionContext(ParserRuleContext parent, int invokingState) - : base(parent, invokingState) - { - } - public override int RuleIndex { get { return RULE_equality_expression; } } - [System.Diagnostics.DebuggerNonUserCode] - public override void EnterRule(IParseTreeListener listener) { - IAngouriMathListener typedListener = listener as IAngouriMathListener; - if (typedListener != null) typedListener.EnterEquality_expression(this); - } - [System.Diagnostics.DebuggerNonUserCode] - public override void ExitRule(IParseTreeListener listener) { - IAngouriMathListener typedListener = listener as IAngouriMathListener; - if (typedListener != null) typedListener.ExitEquality_expression(this); - } - } - - [RuleVersion(0)] - public Equality_expressionContext equality_expression() { - Equality_expressionContext _localctx = new Equality_expressionContext(Context, State); - EnterRule(_localctx, 24, RULE_equality_expression); - int _la; - try { - EnterOuterAlt(_localctx, 1); - { - State = 230; - _localctx.expr = inequality_expression(); - _localctx.value = _localctx.expr.value; - State = 235; - ErrorHandler.Sync(this); - _la = TokenStream.LA(1); - if (_la==T__18) { - { - State = 232; - _localctx._terms_list = terms_list(); - - var list = _localctx._terms_list.terms.Prepend(_localctx.value).ToArray(); - List eqTerms = new(); - for (int i = 0; i < list.Length - 1; i++) - eqTerms.Add(list[i].Equalizes(list[i + 1])); - _localctx.value = eqTerms.Aggregate((eq1, eq2) => eq1 & eq2); - - } } + if (terms.Count == 1) + _localctx.value = terms[0]; + else + // Create chain: a < b = c < d becomes (a < b) and (b = c) and (c < d) + for (int i = 0; i < operators.Count; i++) + { + var connective = operators[i] switch + { // Directly construct the nodes instead of using convenience methods to avoid built-in chained comparisons + ">=" => new GreaterOrEqualf(terms[i], terms[i + 1]), + "<=" => new LessOrEqualf(terms[i], terms[i + 1]), + ">" => new Greaterf(terms[i], terms[i + 1]), + "<" => new Lessf(terms[i], terms[i + 1]), + "=" => new Equalsf(terms[i], terms[i + 1]), + "<>" => !new Equalsf(terms[i], terms[i + 1]), + _ => throw new AngouriBugException($"Unknown operator in chained comparison: {operators[i]}") + }; + if (i == 0) _localctx.value = connective; else _localctx.value &= connective; + } + } } catch (RecognitionException re) { @@ -1251,10 +1072,10 @@ public Equality_expressionContext equality_expression() { internal partial class Negate_expressionContext : ParserRuleContext { public Entity value; - public Equality_expressionContext op; + public Comparison_expressionContext op; public Negate_expressionContext opn; - [System.Diagnostics.DebuggerNonUserCode] public Equality_expressionContext equality_expression() { - return GetRuleContext(0); + [System.Diagnostics.DebuggerNonUserCode] public Comparison_expressionContext comparison_expression() { + return GetRuleContext(0); } [System.Diagnostics.DebuggerNonUserCode] public Negate_expressionContext negate_expression() { return GetRuleContext(0); @@ -1279,27 +1100,27 @@ public override void ExitRule(IParseTreeListener listener) { [RuleVersion(0)] public Negate_expressionContext negate_expression() { Negate_expressionContext _localctx = new Negate_expressionContext(Context, State); - EnterRule(_localctx, 26, RULE_negate_expression); + EnterRule(_localctx, 20, RULE_negate_expression); try { - State = 248; + State = 219; ErrorHandler.Sync(this); - switch ( Interpreter.AdaptivePredict(TokenStream,23,Context) ) { + switch ( Interpreter.AdaptivePredict(TokenStream,19,Context) ) { case 1: EnterOuterAlt(_localctx, 1); { - State = 237; + State = 208; Match(T__19); - State = 238; - _localctx.op = equality_expression(); + State = 209; + _localctx.op = comparison_expression(); _localctx.value = !_localctx.op.value; } break; case 2: EnterOuterAlt(_localctx, 2); { - State = 241; + State = 212; Match(T__19); - State = 242; + State = 213; _localctx.opn = negate_expression(); _localctx.value = !_localctx.opn.value; } @@ -1307,8 +1128,8 @@ public Negate_expressionContext negate_expression() { case 3: EnterOuterAlt(_localctx, 3); { - State = 245; - _localctx.op = equality_expression(); + State = 216; + _localctx.op = comparison_expression(); _localctx.value = _localctx.op.value; } break; @@ -1355,36 +1176,36 @@ public override void ExitRule(IParseTreeListener listener) { [RuleVersion(0)] public And_expressionContext and_expression() { And_expressionContext _localctx = new And_expressionContext(Context, State); - EnterRule(_localctx, 28, RULE_and_expression); + EnterRule(_localctx, 22, RULE_and_expression); int _la; try { EnterOuterAlt(_localctx, 1); { - State = 250; + State = 221; _localctx.m1 = negate_expression(); _localctx.value = _localctx.m1.value; - State = 262; + State = 233; ErrorHandler.Sync(this); _la = TokenStream.LA(1); while (_la==T__20 || _la==T__21) { { - State = 260; + State = 231; ErrorHandler.Sync(this); switch (TokenStream.LA(1)) { case T__20: { - State = 252; + State = 223; Match(T__20); - State = 253; + State = 224; _localctx.m2 = negate_expression(); _localctx.value = _localctx.value & _localctx.m2.value; } break; case T__21: { - State = 256; + State = 227; Match(T__21); - State = 257; + State = 228; _localctx.m2 = negate_expression(); _localctx.value = _localctx.value & _localctx.m2.value; } @@ -1393,7 +1214,7 @@ public And_expressionContext and_expression() { throw new NoViableAltException(this); } } - State = 264; + State = 235; ErrorHandler.Sync(this); _la = TokenStream.LA(1); } @@ -1440,28 +1261,28 @@ public override void ExitRule(IParseTreeListener listener) { [RuleVersion(0)] public Xor_expressionContext xor_expression() { Xor_expressionContext _localctx = new Xor_expressionContext(Context, State); - EnterRule(_localctx, 30, RULE_xor_expression); + EnterRule(_localctx, 24, RULE_xor_expression); int _la; try { EnterOuterAlt(_localctx, 1); { - State = 265; + State = 236; _localctx.m1 = and_expression(); _localctx.value = _localctx.m1.value; - State = 273; + State = 244; ErrorHandler.Sync(this); _la = TokenStream.LA(1); while (_la==T__22) { { { - State = 267; + State = 238; Match(T__22); - State = 268; + State = 239; _localctx.m2 = and_expression(); _localctx.value = _localctx.value ^ _localctx.m2.value; } } - State = 275; + State = 246; ErrorHandler.Sync(this); _la = TokenStream.LA(1); } @@ -1508,36 +1329,36 @@ public override void ExitRule(IParseTreeListener listener) { [RuleVersion(0)] public Or_expressionContext or_expression() { Or_expressionContext _localctx = new Or_expressionContext(Context, State); - EnterRule(_localctx, 32, RULE_or_expression); + EnterRule(_localctx, 26, RULE_or_expression); int _la; try { EnterOuterAlt(_localctx, 1); { - State = 276; + State = 247; _localctx.m1 = xor_expression(); _localctx.value = _localctx.m1.value; - State = 288; + State = 259; ErrorHandler.Sync(this); _la = TokenStream.LA(1); while (_la==T__23 || _la==T__24) { { - State = 286; + State = 257; ErrorHandler.Sync(this); switch (TokenStream.LA(1)) { case T__23: { - State = 278; + State = 249; Match(T__23); - State = 279; + State = 250; _localctx.m2 = xor_expression(); _localctx.value = _localctx.value | _localctx.m2.value; } break; case T__24: { - State = 282; + State = 253; Match(T__24); - State = 283; + State = 254; _localctx.m2 = xor_expression(); _localctx.value = _localctx.value | _localctx.m2.value; } @@ -1546,7 +1367,7 @@ public Or_expressionContext or_expression() { throw new NoViableAltException(this); } } - State = 290; + State = 261; ErrorHandler.Sync(this); _la = TokenStream.LA(1); } @@ -1593,36 +1414,36 @@ public override void ExitRule(IParseTreeListener listener) { [RuleVersion(0)] public Implies_expressionContext implies_expression() { Implies_expressionContext _localctx = new Implies_expressionContext(Context, State); - EnterRule(_localctx, 34, RULE_implies_expression); + EnterRule(_localctx, 28, RULE_implies_expression); int _la; try { EnterOuterAlt(_localctx, 1); { - State = 291; + State = 262; _localctx.m1 = or_expression(); _localctx.value = _localctx.m1.value; - State = 303; + State = 274; ErrorHandler.Sync(this); _la = TokenStream.LA(1); while (_la==T__25 || _la==T__26) { { - State = 301; + State = 272; ErrorHandler.Sync(this); switch (TokenStream.LA(1)) { case T__25: { - State = 293; + State = 264; Match(T__25); - State = 294; + State = 265; _localctx.m2 = or_expression(); _localctx.value = _localctx.value.Implies(_localctx.m2.value); } break; case T__26: { - State = 297; + State = 268; Match(T__26); - State = 298; + State = 269; _localctx.m2 = or_expression(); _localctx.value = _localctx.value.Implies(_localctx.m2.value); } @@ -1631,7 +1452,7 @@ public Implies_expressionContext implies_expression() { throw new NoViableAltException(this); } } - State = 305; + State = 276; ErrorHandler.Sync(this); _la = TokenStream.LA(1); } @@ -1651,12 +1472,12 @@ public Implies_expressionContext implies_expression() { internal partial class Provided_expressionContext : ParserRuleContext { public Entity value; public Implies_expressionContext expr; - public Implies_expressionContext pred; - [System.Diagnostics.DebuggerNonUserCode] public Implies_expressionContext[] implies_expression() { - return GetRuleContexts(); + public Provided_expressionContext pred; + [System.Diagnostics.DebuggerNonUserCode] public Implies_expressionContext implies_expression() { + return GetRuleContext(0); } - [System.Diagnostics.DebuggerNonUserCode] public Implies_expressionContext implies_expression(int i) { - return GetRuleContext(i); + [System.Diagnostics.DebuggerNonUserCode] public Provided_expressionContext provided_expression() { + return GetRuleContext(0); } public Provided_expressionContext(ParserRuleContext parent, int invokingState) : base(parent, invokingState) @@ -1678,31 +1499,27 @@ public override void ExitRule(IParseTreeListener listener) { [RuleVersion(0)] public Provided_expressionContext provided_expression() { Provided_expressionContext _localctx = new Provided_expressionContext(Context, State); - EnterRule(_localctx, 36, RULE_provided_expression); + EnterRule(_localctx, 30, RULE_provided_expression); int _la; try { EnterOuterAlt(_localctx, 1); { - State = 306; + State = 277; _localctx.expr = implies_expression(); _localctx.value = _localctx.expr.value; - State = 314; + State = 283; ErrorHandler.Sync(this); _la = TokenStream.LA(1); - while (_la==T__27) { - { + if (_la==T__27) { { - State = 308; + State = 279; Match(T__27); - State = 309; - _localctx.pred = implies_expression(); + State = 280; + _localctx.pred = provided_expression(); _localctx.value = _localctx.value.Provided(_localctx.pred.value); } - } - State = 316; - ErrorHandler.Sync(this); - _la = TokenStream.LA(1); } + } } catch (RecognitionException re) { @@ -1742,11 +1559,11 @@ public override void ExitRule(IParseTreeListener listener) { [RuleVersion(0)] public ExpressionContext expression() { ExpressionContext _localctx = new ExpressionContext(Context, State); - EnterRule(_localctx, 38, RULE_expression); + EnterRule(_localctx, 32, RULE_expression); try { EnterOuterAlt(_localctx, 1); { - State = 317; + State = 285; _localctx.s = provided_expression(); _localctx.value = _localctx.s.value; } @@ -1791,34 +1608,34 @@ public override void ExitRule(IParseTreeListener listener) { [RuleVersion(0)] public Function_argumentsContext function_arguments() { Function_argumentsContext _localctx = new Function_argumentsContext(Context, State); - EnterRule(_localctx, 40, RULE_function_arguments); + EnterRule(_localctx, 34, RULE_function_arguments); _localctx.list = new List(); int _la; try { EnterOuterAlt(_localctx, 1); { - State = 331; + State = 299; ErrorHandler.Sync(this); _la = TokenStream.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & -5948528656360L) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & 4467570830351532031L) != 0)) { { - State = 320; + State = 288; _localctx.e = expression(); _localctx.list.Add(_localctx.e.value); - State = 328; + State = 296; ErrorHandler.Sync(this); _la = TokenStream.LA(1); while (_la==T__28) { { { - State = 322; + State = 290; Match(T__28); - State = 323; + State = 291; _localctx.e = expression(); _localctx.list.Add(_localctx.e.value); } } - State = 330; + State = 298; ErrorHandler.Sync(this); _la = TokenStream.LA(1); } @@ -1868,16 +1685,16 @@ public override void ExitRule(IParseTreeListener listener) { [RuleVersion(0)] public Interval_argumentsContext interval_arguments() { Interval_argumentsContext _localctx = new Interval_argumentsContext(Context, State); - EnterRule(_localctx, 42, RULE_interval_arguments); + EnterRule(_localctx, 36, RULE_interval_arguments); try { EnterOuterAlt(_localctx, 1); { - State = 333; + State = 301; _localctx.from = expression(); _localctx.couple.from = _localctx.from.value; - State = 335; + State = 303; Match(T__29); - State = 336; + State = 304; _localctx.to = expression(); _localctx.couple.to = _localctx.to.value; } @@ -1923,16 +1740,16 @@ public override void ExitRule(IParseTreeListener listener) { [RuleVersion(0)] public Cset_argumentsContext cset_arguments() { Cset_argumentsContext _localctx = new Cset_argumentsContext(Context, State); - EnterRule(_localctx, 44, RULE_cset_arguments); + EnterRule(_localctx, 38, RULE_cset_arguments); try { EnterOuterAlt(_localctx, 1); { - State = 339; + State = 307; _localctx.variable = expression(); _localctx.couple.variable = _localctx.variable.value; - State = 341; + State = 309; Match(T__30); - State = 342; + State = 310; _localctx.predicate = expression(); _localctx.couple.predicate = _localctx.predicate.value; } @@ -1995,15 +1812,15 @@ public override void ExitRule(IParseTreeListener listener) { [RuleVersion(0)] public AtomContext atom() { AtomContext _localctx = new AtomContext(Context, State); - EnterRule(_localctx, 46, RULE_atom); + EnterRule(_localctx, 40, RULE_atom); try { - State = 797; + State = 765; ErrorHandler.Sync(this); - switch ( Interpreter.AdaptivePredict(TokenStream,34,Context) ) { + switch ( Interpreter.AdaptivePredict(TokenStream,30,Context) ) { case 1: EnterOuterAlt(_localctx, 1); { - State = 345; + State = 313; Match(T__31); _localctx.value = Entity.Number.Real.PositiveInfinity; } @@ -2011,7 +1828,7 @@ public AtomContext atom() { case 2: EnterOuterAlt(_localctx, 2); { - State = 347; + State = 315; Match(T__32); _localctx.value = Entity.Number.Real.NegativeInfinity; } @@ -2019,7 +1836,7 @@ public AtomContext atom() { case 3: EnterOuterAlt(_localctx, 3); { - State = 349; + State = 317; _localctx._NUMBER = Match(NUMBER); _localctx.value = Entity.Number.Complex.Parse((_localctx._NUMBER!=null?_localctx._NUMBER.Text:null)); } @@ -2027,7 +1844,7 @@ public AtomContext atom() { case 4: EnterOuterAlt(_localctx, 4); { - State = 351; + State = 319; _localctx._BOOLEAN = Match(BOOLEAN); _localctx.value = Entity.Boolean.Parse((_localctx._BOOLEAN!=null?_localctx._BOOLEAN.Text:null)); } @@ -2035,7 +1852,7 @@ public AtomContext atom() { case 5: EnterOuterAlt(_localctx, 5); { - State = 353; + State = 321; _localctx._SPECIALSET = Match(SPECIALSET); _localctx.value = Entity.Set.SpecialSet.Create((_localctx._SPECIALSET!=null?_localctx._SPECIALSET.Text:null)); } @@ -2043,7 +1860,7 @@ public AtomContext atom() { case 6: EnterOuterAlt(_localctx, 6); { - State = 355; + State = 323; _localctx._VARIABLE = Match(VARIABLE); _localctx.value = Entity.Variable.CreateVariableUnchecked((_localctx._VARIABLE!=null?_localctx._VARIABLE.Text:null)); } @@ -2051,11 +1868,11 @@ public AtomContext atom() { case 7: EnterOuterAlt(_localctx, 7); { - State = 357; + State = 325; Match(T__33); - State = 358; + State = 326; _localctx._expression = expression(); - State = 359; + State = 327; Match(T__34); _localctx.value = _localctx._expression.value.Abs(); } @@ -2063,11 +1880,11 @@ public AtomContext atom() { case 8: EnterOuterAlt(_localctx, 8); { - State = 362; + State = 330; Match(T__35); - State = 363; + State = 331; _localctx._function_arguments = function_arguments(); - State = 364; + State = 332; Match(T__36); _localctx.value = ParsingHelpers.TryBuildingMatrix(_localctx._function_arguments.list).T; } @@ -2075,11 +1892,11 @@ public AtomContext atom() { case 9: EnterOuterAlt(_localctx, 9); { - State = 367; + State = 335; Match(T__35); - State = 368; + State = 336; _localctx._function_arguments = function_arguments(); - State = 369; + State = 337; Match(T__37); _localctx.value = ParsingHelpers.TryBuildingMatrix(_localctx._function_arguments.list); } @@ -2087,11 +1904,11 @@ public AtomContext atom() { case 10: EnterOuterAlt(_localctx, 10); { - State = 372; + State = 340; Match(T__38); - State = 373; + State = 341; _localctx._interval_arguments = interval_arguments(); - State = 374; + State = 342; Match(T__39); _localctx.value = new Entity.Set.Interval(_localctx._interval_arguments.couple.from, false, _localctx._interval_arguments.couple.to, false); } @@ -2099,11 +1916,11 @@ public AtomContext atom() { case 11: EnterOuterAlt(_localctx, 11); { - State = 377; + State = 345; Match(T__35); - State = 378; + State = 346; _localctx._interval_arguments = interval_arguments(); - State = 379; + State = 347; Match(T__39); _localctx.value = new Entity.Set.Interval(_localctx._interval_arguments.couple.from, true, _localctx._interval_arguments.couple.to, false); } @@ -2111,11 +1928,11 @@ public AtomContext atom() { case 12: EnterOuterAlt(_localctx, 12); { - State = 382; + State = 350; Match(T__35); - State = 383; + State = 351; _localctx._interval_arguments = interval_arguments(); - State = 384; + State = 352; Match(T__37); _localctx.value = new Entity.Set.Interval(_localctx._interval_arguments.couple.from, true, _localctx._interval_arguments.couple.to, true); } @@ -2123,11 +1940,11 @@ public AtomContext atom() { case 13: EnterOuterAlt(_localctx, 13); { - State = 387; + State = 355; Match(T__38); - State = 388; + State = 356; _localctx._interval_arguments = interval_arguments(); - State = 389; + State = 357; Match(T__37); _localctx.value = new Entity.Set.Interval(_localctx._interval_arguments.couple.from, false, _localctx._interval_arguments.couple.to, true); } @@ -2135,11 +1952,11 @@ public AtomContext atom() { case 14: EnterOuterAlt(_localctx, 14); { - State = 392; + State = 360; Match(T__38); - State = 393; + State = 361; _localctx._expression = expression(); - State = 394; + State = 362; Match(T__39); _localctx.value = _localctx._expression.value; } @@ -2147,11 +1964,11 @@ public AtomContext atom() { case 15: EnterOuterAlt(_localctx, 15); { - State = 397; + State = 365; Match(T__40); - State = 398; + State = 366; _localctx.cset_args = cset_arguments(); - State = 399; + State = 367; Match(T__41); _localctx.value = new ConditionalSet(_localctx.cset_args.couple.variable, _localctx.cset_args.couple.predicate); } @@ -2159,11 +1976,11 @@ public AtomContext atom() { case 16: EnterOuterAlt(_localctx, 16); { - State = 402; + State = 370; Match(T__40); - State = 403; + State = 371; _localctx.args = function_arguments(); - State = 404; + State = 372; Match(T__41); _localctx.value = new FiniteSet((IEnumerable)_localctx.args.list); } @@ -2171,11 +1988,11 @@ public AtomContext atom() { case 17: EnterOuterAlt(_localctx, 17); { - State = 407; + State = 375; Match(T__42); - State = 408; + State = 376; _localctx.args = function_arguments(); - State = 409; + State = 377; Match(T__39); _localctx.value = Assert("log", (1, 2), _localctx.args.list.Count) ? MathS.Log(10, _localctx.args.list[0]) : MathS.Log(_localctx.args.list[0], _localctx.args.list[1]); } @@ -2183,11 +2000,11 @@ public AtomContext atom() { case 18: EnterOuterAlt(_localctx, 18); { - State = 412; + State = 380; Match(T__43); - State = 413; + State = 381; _localctx.args = function_arguments(); - State = 414; + State = 382; Match(T__39); Assert("sqrt", 1, _localctx.args.list.Count); _localctx.value = MathS.Sqrt(_localctx.args.list[0]); } @@ -2195,11 +2012,11 @@ public AtomContext atom() { case 19: EnterOuterAlt(_localctx, 19); { - State = 417; + State = 385; Match(T__44); - State = 418; + State = 386; _localctx.args = function_arguments(); - State = 419; + State = 387; Match(T__39); Assert("cbrt", 1, _localctx.args.list.Count); _localctx.value = MathS.Cbrt(_localctx.args.list[0]); } @@ -2207,11 +2024,11 @@ public AtomContext atom() { case 20: EnterOuterAlt(_localctx, 20); { - State = 422; + State = 390; Match(T__45); - State = 423; + State = 391; _localctx.args = function_arguments(); - State = 424; + State = 392; Match(T__39); Assert("sqr", 1, _localctx.args.list.Count); _localctx.value = MathS.Sqr(_localctx.args.list[0]); } @@ -2219,11 +2036,11 @@ public AtomContext atom() { case 21: EnterOuterAlt(_localctx, 21); { - State = 427; + State = 395; Match(T__46); - State = 428; + State = 396; _localctx.args = function_arguments(); - State = 429; + State = 397; Match(T__39); Assert("ln", 1, _localctx.args.list.Count); _localctx.value = MathS.Ln(_localctx.args.list[0]); } @@ -2231,11 +2048,11 @@ public AtomContext atom() { case 22: EnterOuterAlt(_localctx, 22); { - State = 432; + State = 400; Match(T__47); - State = 433; + State = 401; _localctx.args = function_arguments(); - State = 434; + State = 402; Match(T__39); Assert("sin", 1, _localctx.args.list.Count); _localctx.value = MathS.Sin(_localctx.args.list[0]); } @@ -2243,11 +2060,11 @@ public AtomContext atom() { case 23: EnterOuterAlt(_localctx, 23); { - State = 437; + State = 405; Match(T__48); - State = 438; + State = 406; _localctx.args = function_arguments(); - State = 439; + State = 407; Match(T__39); Assert("cos", 1, _localctx.args.list.Count); _localctx.value = MathS.Cos(_localctx.args.list[0]); } @@ -2255,11 +2072,11 @@ public AtomContext atom() { case 24: EnterOuterAlt(_localctx, 24); { - State = 442; + State = 410; Match(T__49); - State = 443; + State = 411; _localctx.args = function_arguments(); - State = 444; + State = 412; Match(T__39); Assert("tan", 1, _localctx.args.list.Count); _localctx.value = MathS.Tan(_localctx.args.list[0]); } @@ -2267,11 +2084,11 @@ public AtomContext atom() { case 25: EnterOuterAlt(_localctx, 25); { - State = 447; + State = 415; Match(T__50); - State = 448; + State = 416; _localctx.args = function_arguments(); - State = 449; + State = 417; Match(T__39); Assert("cotan", 1, _localctx.args.list.Count); _localctx.value = MathS.Cotan(_localctx.args.list[0]); } @@ -2279,11 +2096,11 @@ public AtomContext atom() { case 26: EnterOuterAlt(_localctx, 26); { - State = 452; + State = 420; Match(T__51); - State = 453; + State = 421; _localctx.args = function_arguments(); - State = 454; + State = 422; Match(T__39); Assert("cotan", 1, _localctx.args.list.Count); _localctx.value = MathS.Cotan(_localctx.args.list[0]); } @@ -2291,11 +2108,11 @@ public AtomContext atom() { case 27: EnterOuterAlt(_localctx, 27); { - State = 457; + State = 425; Match(T__52); - State = 458; + State = 426; _localctx.args = function_arguments(); - State = 459; + State = 427; Match(T__39); Assert("sec", 1, _localctx.args.list.Count); _localctx.value = MathS.Sec(_localctx.args.list[0]); } @@ -2303,11 +2120,11 @@ public AtomContext atom() { case 28: EnterOuterAlt(_localctx, 28); { - State = 462; + State = 430; Match(T__53); - State = 463; + State = 431; _localctx.args = function_arguments(); - State = 464; + State = 432; Match(T__39); Assert("cosec", 1, _localctx.args.list.Count); _localctx.value = MathS.Cosec(_localctx.args.list[0]); } @@ -2315,11 +2132,11 @@ public AtomContext atom() { case 29: EnterOuterAlt(_localctx, 29); { - State = 467; + State = 435; Match(T__54); - State = 468; + State = 436; _localctx.args = function_arguments(); - State = 469; + State = 437; Match(T__39); Assert("cosec", 1, _localctx.args.list.Count); _localctx.value = MathS.Cosec(_localctx.args.list[0]); } @@ -2327,11 +2144,11 @@ public AtomContext atom() { case 30: EnterOuterAlt(_localctx, 30); { - State = 472; + State = 440; Match(T__55); - State = 473; + State = 441; _localctx.args = function_arguments(); - State = 474; + State = 442; Match(T__39); Assert("arcsin", 1, _localctx.args.list.Count); _localctx.value = MathS.Arcsin(_localctx.args.list[0]); } @@ -2339,11 +2156,11 @@ public AtomContext atom() { case 31: EnterOuterAlt(_localctx, 31); { - State = 477; + State = 445; Match(T__56); - State = 478; + State = 446; _localctx.args = function_arguments(); - State = 479; + State = 447; Match(T__39); Assert("arccos", 1, _localctx.args.list.Count); _localctx.value = MathS.Arccos(_localctx.args.list[0]); } @@ -2351,11 +2168,11 @@ public AtomContext atom() { case 32: EnterOuterAlt(_localctx, 32); { - State = 482; + State = 450; Match(T__57); - State = 483; + State = 451; _localctx.args = function_arguments(); - State = 484; + State = 452; Match(T__39); Assert("arctan", 1, _localctx.args.list.Count); _localctx.value = MathS.Arctan(_localctx.args.list[0]); } @@ -2363,11 +2180,11 @@ public AtomContext atom() { case 33: EnterOuterAlt(_localctx, 33); { - State = 487; + State = 455; Match(T__58); - State = 488; + State = 456; _localctx.args = function_arguments(); - State = 489; + State = 457; Match(T__39); Assert("arccotan", 1, _localctx.args.list.Count); _localctx.value = MathS.Arccotan(_localctx.args.list[0]); } @@ -2375,11 +2192,11 @@ public AtomContext atom() { case 34: EnterOuterAlt(_localctx, 34); { - State = 492; + State = 460; Match(T__59); - State = 493; + State = 461; _localctx.args = function_arguments(); - State = 494; + State = 462; Match(T__39); Assert("arcsec", 1, _localctx.args.list.Count); _localctx.value = MathS.Arcsec(_localctx.args.list[0]); } @@ -2387,11 +2204,11 @@ public AtomContext atom() { case 35: EnterOuterAlt(_localctx, 35); { - State = 497; + State = 465; Match(T__60); - State = 498; + State = 466; _localctx.args = function_arguments(); - State = 499; + State = 467; Match(T__39); Assert("arccosec", 1, _localctx.args.list.Count); _localctx.value = MathS.Arccosec(_localctx.args.list[0]); } @@ -2399,11 +2216,11 @@ public AtomContext atom() { case 36: EnterOuterAlt(_localctx, 36); { - State = 502; + State = 470; Match(T__61); - State = 503; + State = 471; _localctx.args = function_arguments(); - State = 504; + State = 472; Match(T__39); Assert("arccosec", 1, _localctx.args.list.Count); _localctx.value = MathS.Arccosec(_localctx.args.list[0]); } @@ -2411,11 +2228,11 @@ public AtomContext atom() { case 37: EnterOuterAlt(_localctx, 37); { - State = 507; + State = 475; Match(T__62); - State = 508; + State = 476; _localctx.args = function_arguments(); - State = 509; + State = 477; Match(T__39); Assert("arccosec", 1, _localctx.args.list.Count); _localctx.value = MathS.Arccosec(_localctx.args.list[0]); } @@ -2423,11 +2240,11 @@ public AtomContext atom() { case 38: EnterOuterAlt(_localctx, 38); { - State = 512; + State = 480; Match(T__63); - State = 513; + State = 481; _localctx.args = function_arguments(); - State = 514; + State = 482; Match(T__39); Assert("arcsin", 1, _localctx.args.list.Count); _localctx.value = MathS.Arcsin(_localctx.args.list[0]); } @@ -2435,11 +2252,11 @@ public AtomContext atom() { case 39: EnterOuterAlt(_localctx, 39); { - State = 517; + State = 485; Match(T__64); - State = 518; + State = 486; _localctx.args = function_arguments(); - State = 519; + State = 487; Match(T__39); Assert("arccos", 1, _localctx.args.list.Count); _localctx.value = MathS.Arccos(_localctx.args.list[0]); } @@ -2447,11 +2264,11 @@ public AtomContext atom() { case 40: EnterOuterAlt(_localctx, 40); { - State = 522; + State = 490; Match(T__65); - State = 523; + State = 491; _localctx.args = function_arguments(); - State = 524; + State = 492; Match(T__39); Assert("arctan", 1, _localctx.args.list.Count); _localctx.value = MathS.Arctan(_localctx.args.list[0]); } @@ -2459,11 +2276,11 @@ public AtomContext atom() { case 41: EnterOuterAlt(_localctx, 41); { - State = 527; + State = 495; Match(T__66); - State = 528; + State = 496; _localctx.args = function_arguments(); - State = 529; + State = 497; Match(T__39); Assert("arccotan", 1, _localctx.args.list.Count); _localctx.value = MathS.Arccotan(_localctx.args.list[0]); } @@ -2471,11 +2288,11 @@ public AtomContext atom() { case 42: EnterOuterAlt(_localctx, 42); { - State = 532; + State = 500; Match(T__67); - State = 533; + State = 501; _localctx.args = function_arguments(); - State = 534; + State = 502; Match(T__39); Assert("arcsec", 1, _localctx.args.list.Count); _localctx.value = MathS.Arcsec(_localctx.args.list[0]); } @@ -2483,11 +2300,11 @@ public AtomContext atom() { case 43: EnterOuterAlt(_localctx, 43); { - State = 537; + State = 505; Match(T__68); - State = 538; + State = 506; _localctx.args = function_arguments(); - State = 539; + State = 507; Match(T__39); Assert("arccosec", 1, _localctx.args.list.Count); _localctx.value = MathS.Arccosec(_localctx.args.list[0]); } @@ -2495,11 +2312,11 @@ public AtomContext atom() { case 44: EnterOuterAlt(_localctx, 44); { - State = 542; + State = 510; Match(T__69); - State = 543; + State = 511; _localctx.args = function_arguments(); - State = 544; + State = 512; Match(T__39); Assert("arccotan", 1, _localctx.args.list.Count); _localctx.value = MathS.Arccotan(_localctx.args.list[0]); } @@ -2507,11 +2324,11 @@ public AtomContext atom() { case 45: EnterOuterAlt(_localctx, 45); { - State = 547; + State = 515; Match(T__70); - State = 548; + State = 516; _localctx.args = function_arguments(); - State = 549; + State = 517; Match(T__39); Assert("arccotan", 1, _localctx.args.list.Count); _localctx.value = MathS.Arccotan(_localctx.args.list[0]); } @@ -2519,11 +2336,11 @@ public AtomContext atom() { case 46: EnterOuterAlt(_localctx, 46); { - State = 552; + State = 520; Match(T__71); - State = 553; + State = 521; _localctx.args = function_arguments(); - State = 554; + State = 522; Match(T__39); Assert("sin", 1, _localctx.args.list.Count); _localctx.value = MathS.Hyperbolic.Sinh(_localctx.args.list[0]); } @@ -2531,11 +2348,11 @@ public AtomContext atom() { case 47: EnterOuterAlt(_localctx, 47); { - State = 557; + State = 525; Match(T__72); - State = 558; + State = 526; _localctx.args = function_arguments(); - State = 559; + State = 527; Match(T__39); Assert("sin", 1, _localctx.args.list.Count); _localctx.value = MathS.Hyperbolic.Sinh(_localctx.args.list[0]); } @@ -2543,11 +2360,11 @@ public AtomContext atom() { case 48: EnterOuterAlt(_localctx, 48); { - State = 562; + State = 530; Match(T__73); - State = 563; + State = 531; _localctx.args = function_arguments(); - State = 564; + State = 532; Match(T__39); Assert("cos", 1, _localctx.args.list.Count); _localctx.value = MathS.Hyperbolic.Cosh(_localctx.args.list[0]); } @@ -2555,11 +2372,11 @@ public AtomContext atom() { case 49: EnterOuterAlt(_localctx, 49); { - State = 567; + State = 535; Match(T__74); - State = 568; + State = 536; _localctx.args = function_arguments(); - State = 569; + State = 537; Match(T__39); Assert("cos", 1, _localctx.args.list.Count); _localctx.value = MathS.Hyperbolic.Cosh(_localctx.args.list[0]); } @@ -2567,11 +2384,11 @@ public AtomContext atom() { case 50: EnterOuterAlt(_localctx, 50); { - State = 572; + State = 540; Match(T__75); - State = 573; + State = 541; _localctx.args = function_arguments(); - State = 574; + State = 542; Match(T__39); Assert("tan", 1, _localctx.args.list.Count); _localctx.value = MathS.Hyperbolic.Tanh(_localctx.args.list[0]); } @@ -2579,11 +2396,11 @@ public AtomContext atom() { case 51: EnterOuterAlt(_localctx, 51); { - State = 577; + State = 545; Match(T__76); - State = 578; + State = 546; _localctx.args = function_arguments(); - State = 579; + State = 547; Match(T__39); Assert("tan", 1, _localctx.args.list.Count); _localctx.value = MathS.Hyperbolic.Tanh(_localctx.args.list[0]); } @@ -2591,11 +2408,11 @@ public AtomContext atom() { case 52: EnterOuterAlt(_localctx, 52); { - State = 582; + State = 550; Match(T__77); - State = 583; + State = 551; _localctx.args = function_arguments(); - State = 584; + State = 552; Match(T__39); Assert("cotan", 1, _localctx.args.list.Count); _localctx.value = MathS.Hyperbolic.Cotanh(_localctx.args.list[0]); } @@ -2603,11 +2420,11 @@ public AtomContext atom() { case 53: EnterOuterAlt(_localctx, 53); { - State = 587; + State = 555; Match(T__78); - State = 588; + State = 556; _localctx.args = function_arguments(); - State = 589; + State = 557; Match(T__39); Assert("cotan", 1, _localctx.args.list.Count); _localctx.value = MathS.Hyperbolic.Cotanh(_localctx.args.list[0]); } @@ -2615,11 +2432,11 @@ public AtomContext atom() { case 54: EnterOuterAlt(_localctx, 54); { - State = 592; + State = 560; Match(T__79); - State = 593; + State = 561; _localctx.args = function_arguments(); - State = 594; + State = 562; Match(T__39); Assert("cotan", 1, _localctx.args.list.Count); _localctx.value = MathS.Hyperbolic.Cotanh(_localctx.args.list[0]); } @@ -2627,11 +2444,11 @@ public AtomContext atom() { case 55: EnterOuterAlt(_localctx, 55); { - State = 597; + State = 565; Match(T__80); - State = 598; + State = 566; _localctx.args = function_arguments(); - State = 599; + State = 567; Match(T__39); Assert("sec", 1, _localctx.args.list.Count); _localctx.value = MathS.Hyperbolic.Sech(_localctx.args.list[0]); } @@ -2639,11 +2456,11 @@ public AtomContext atom() { case 56: EnterOuterAlt(_localctx, 56); { - State = 602; + State = 570; Match(T__81); - State = 603; + State = 571; _localctx.args = function_arguments(); - State = 604; + State = 572; Match(T__39); Assert("sec", 1, _localctx.args.list.Count); _localctx.value = MathS.Hyperbolic.Sech(_localctx.args.list[0]); } @@ -2651,11 +2468,11 @@ public AtomContext atom() { case 57: EnterOuterAlt(_localctx, 57); { - State = 607; + State = 575; Match(T__82); - State = 608; + State = 576; _localctx.args = function_arguments(); - State = 609; + State = 577; Match(T__39); Assert("cosec", 1, _localctx.args.list.Count); _localctx.value = MathS.Hyperbolic.Cosech(_localctx.args.list[0]); } @@ -2663,11 +2480,11 @@ public AtomContext atom() { case 58: EnterOuterAlt(_localctx, 58); { - State = 612; + State = 580; Match(T__83); - State = 613; + State = 581; _localctx.args = function_arguments(); - State = 614; + State = 582; Match(T__39); Assert("cosec", 1, _localctx.args.list.Count); _localctx.value = MathS.Hyperbolic.Cosech(_localctx.args.list[0]); } @@ -2675,11 +2492,11 @@ public AtomContext atom() { case 59: EnterOuterAlt(_localctx, 59); { - State = 617; + State = 585; Match(T__84); - State = 618; + State = 586; _localctx.args = function_arguments(); - State = 619; + State = 587; Match(T__39); Assert("arcsin", 1, _localctx.args.list.Count); _localctx.value = MathS.Hyperbolic.Arsinh(_localctx.args.list[0]); } @@ -2687,11 +2504,11 @@ public AtomContext atom() { case 60: EnterOuterAlt(_localctx, 60); { - State = 622; + State = 590; Match(T__85); - State = 623; + State = 591; _localctx.args = function_arguments(); - State = 624; + State = 592; Match(T__39); Assert("arcsin", 1, _localctx.args.list.Count); _localctx.value = MathS.Hyperbolic.Arsinh(_localctx.args.list[0]); } @@ -2699,11 +2516,11 @@ public AtomContext atom() { case 61: EnterOuterAlt(_localctx, 61); { - State = 627; + State = 595; Match(T__86); - State = 628; + State = 596; _localctx.args = function_arguments(); - State = 629; + State = 597; Match(T__39); Assert("arcsin", 1, _localctx.args.list.Count); _localctx.value = MathS.Hyperbolic.Arsinh(_localctx.args.list[0]); } @@ -2711,11 +2528,11 @@ public AtomContext atom() { case 62: EnterOuterAlt(_localctx, 62); { - State = 632; + State = 600; Match(T__87); - State = 633; + State = 601; _localctx.args = function_arguments(); - State = 634; + State = 602; Match(T__39); Assert("arccos", 1, _localctx.args.list.Count); _localctx.value = MathS.Hyperbolic.Arcosh(_localctx.args.list[0]); } @@ -2723,11 +2540,11 @@ public AtomContext atom() { case 63: EnterOuterAlt(_localctx, 63); { - State = 637; + State = 605; Match(T__88); - State = 638; + State = 606; _localctx.args = function_arguments(); - State = 639; + State = 607; Match(T__39); Assert("arccos", 1, _localctx.args.list.Count); _localctx.value = MathS.Hyperbolic.Arcosh(_localctx.args.list[0]); } @@ -2735,11 +2552,11 @@ public AtomContext atom() { case 64: EnterOuterAlt(_localctx, 64); { - State = 642; + State = 610; Match(T__89); - State = 643; + State = 611; _localctx.args = function_arguments(); - State = 644; + State = 612; Match(T__39); Assert("arccos", 1, _localctx.args.list.Count); _localctx.value = MathS.Hyperbolic.Arcosh(_localctx.args.list[0]); } @@ -2747,11 +2564,11 @@ public AtomContext atom() { case 65: EnterOuterAlt(_localctx, 65); { - State = 647; + State = 615; Match(T__90); - State = 648; + State = 616; _localctx.args = function_arguments(); - State = 649; + State = 617; Match(T__39); Assert("arctan", 1, _localctx.args.list.Count); _localctx.value = MathS.Hyperbolic.Artanh(_localctx.args.list[0]); } @@ -2759,11 +2576,11 @@ public AtomContext atom() { case 66: EnterOuterAlt(_localctx, 66); { - State = 652; + State = 620; Match(T__91); - State = 653; + State = 621; _localctx.args = function_arguments(); - State = 654; + State = 622; Match(T__39); Assert("arctan", 1, _localctx.args.list.Count); _localctx.value = MathS.Hyperbolic.Artanh(_localctx.args.list[0]); } @@ -2771,11 +2588,11 @@ public AtomContext atom() { case 67: EnterOuterAlt(_localctx, 67); { - State = 657; + State = 625; Match(T__92); - State = 658; + State = 626; _localctx.args = function_arguments(); - State = 659; + State = 627; Match(T__39); Assert("arctan", 1, _localctx.args.list.Count); _localctx.value = MathS.Hyperbolic.Artanh(_localctx.args.list[0]); } @@ -2783,11 +2600,11 @@ public AtomContext atom() { case 68: EnterOuterAlt(_localctx, 68); { - State = 662; + State = 630; Match(T__93); - State = 663; + State = 631; _localctx.args = function_arguments(); - State = 664; + State = 632; Match(T__39); Assert("arccotan", 1, _localctx.args.list.Count); _localctx.value = MathS.Hyperbolic.Arcotanh(_localctx.args.list[0]); } @@ -2795,11 +2612,11 @@ public AtomContext atom() { case 69: EnterOuterAlt(_localctx, 69); { - State = 667; + State = 635; Match(T__94); - State = 668; + State = 636; _localctx.args = function_arguments(); - State = 669; + State = 637; Match(T__39); Assert("arccotan", 1, _localctx.args.list.Count); _localctx.value = MathS.Hyperbolic.Arcotanh(_localctx.args.list[0]); } @@ -2807,11 +2624,11 @@ public AtomContext atom() { case 70: EnterOuterAlt(_localctx, 70); { - State = 672; + State = 640; Match(T__95); - State = 673; + State = 641; _localctx.args = function_arguments(); - State = 674; + State = 642; Match(T__39); Assert("arccotan", 1, _localctx.args.list.Count); _localctx.value = MathS.Hyperbolic.Arcotanh(_localctx.args.list[0]); } @@ -2819,11 +2636,11 @@ public AtomContext atom() { case 71: EnterOuterAlt(_localctx, 71); { - State = 677; + State = 645; Match(T__96); - State = 678; + State = 646; _localctx.args = function_arguments(); - State = 679; + State = 647; Match(T__39); Assert("arccotan", 1, _localctx.args.list.Count); _localctx.value = MathS.Hyperbolic.Arcotanh(_localctx.args.list[0]); } @@ -2831,11 +2648,11 @@ public AtomContext atom() { case 72: EnterOuterAlt(_localctx, 72); { - State = 682; + State = 650; Match(T__97); - State = 683; + State = 651; _localctx.args = function_arguments(); - State = 684; + State = 652; Match(T__39); Assert("arccotan", 1, _localctx.args.list.Count); _localctx.value = MathS.Hyperbolic.Arcotanh(_localctx.args.list[0]); } @@ -2843,11 +2660,11 @@ public AtomContext atom() { case 73: EnterOuterAlt(_localctx, 73); { - State = 687; + State = 655; Match(T__98); - State = 688; + State = 656; _localctx.args = function_arguments(); - State = 689; + State = 657; Match(T__39); Assert("arcsec", 1, _localctx.args.list.Count); _localctx.value = MathS.Hyperbolic.Arsech(_localctx.args.list[0]); } @@ -2855,11 +2672,11 @@ public AtomContext atom() { case 74: EnterOuterAlt(_localctx, 74); { - State = 692; + State = 660; Match(T__99); - State = 693; + State = 661; _localctx.args = function_arguments(); - State = 694; + State = 662; Match(T__39); Assert("arcsec", 1, _localctx.args.list.Count); _localctx.value = MathS.Hyperbolic.Arsech(_localctx.args.list[0]); } @@ -2867,11 +2684,11 @@ public AtomContext atom() { case 75: EnterOuterAlt(_localctx, 75); { - State = 697; + State = 665; Match(T__100); - State = 698; + State = 666; _localctx.args = function_arguments(); - State = 699; + State = 667; Match(T__39); Assert("arcsec", 1, _localctx.args.list.Count); _localctx.value = MathS.Hyperbolic.Arsech(_localctx.args.list[0]); } @@ -2879,11 +2696,11 @@ public AtomContext atom() { case 76: EnterOuterAlt(_localctx, 76); { - State = 702; + State = 670; Match(T__101); - State = 703; + State = 671; _localctx.args = function_arguments(); - State = 704; + State = 672; Match(T__39); Assert("arccosec", 1, _localctx.args.list.Count); _localctx.value = MathS.Hyperbolic.Arcosech(_localctx.args.list[0]); } @@ -2891,11 +2708,11 @@ public AtomContext atom() { case 77: EnterOuterAlt(_localctx, 77); { - State = 707; + State = 675; Match(T__102); - State = 708; + State = 676; _localctx.args = function_arguments(); - State = 709; + State = 677; Match(T__39); Assert("arccosec", 1, _localctx.args.list.Count); _localctx.value = MathS.Hyperbolic.Arcosech(_localctx.args.list[0]); } @@ -2903,11 +2720,11 @@ public AtomContext atom() { case 78: EnterOuterAlt(_localctx, 78); { - State = 712; + State = 680; Match(T__103); - State = 713; + State = 681; _localctx.args = function_arguments(); - State = 714; + State = 682; Match(T__39); Assert("arccosec", 1, _localctx.args.list.Count); _localctx.value = MathS.Hyperbolic.Arcosech(_localctx.args.list[0]); } @@ -2915,11 +2732,11 @@ public AtomContext atom() { case 79: EnterOuterAlt(_localctx, 79); { - State = 717; + State = 685; Match(T__104); - State = 718; + State = 686; _localctx.args = function_arguments(); - State = 719; + State = 687; Match(T__39); Assert("arccosec", 1, _localctx.args.list.Count); _localctx.value = MathS.Hyperbolic.Arcosech(_localctx.args.list[0]); } @@ -2927,11 +2744,11 @@ public AtomContext atom() { case 80: EnterOuterAlt(_localctx, 80); { - State = 722; + State = 690; Match(T__105); - State = 723; + State = 691; _localctx.args = function_arguments(); - State = 724; + State = 692; Match(T__39); Assert("gamma", 1, _localctx.args.list.Count); _localctx.value = MathS.Gamma(_localctx.args.list[0]); } @@ -2939,11 +2756,11 @@ public AtomContext atom() { case 81: EnterOuterAlt(_localctx, 81); { - State = 727; + State = 695; Match(T__106); - State = 728; + State = 696; _localctx.args = function_arguments(); - State = 729; + State = 697; Match(T__39); if (Assert("derivative", (3, 2), _localctx.args.list.Count)) @@ -2961,11 +2778,11 @@ public AtomContext atom() { case 82: EnterOuterAlt(_localctx, 82); { - State = 732; + State = 700; Match(T__107); - State = 733; + State = 701; _localctx.args = function_arguments(); - State = 734; + State = 702; Match(T__39); if (Assert("integral", (4, 2), _localctx.args.list.Count)) @@ -2983,11 +2800,11 @@ public AtomContext atom() { case 83: EnterOuterAlt(_localctx, 83); { - State = 737; + State = 705; Match(T__108); - State = 738; + State = 706; _localctx.args = function_arguments(); - State = 739; + State = 707; Match(T__39); Assert("limit", 3, _localctx.args.list.Count); _localctx.value = MathS.Limit(_localctx.args.list[0], _localctx.args.list[1], _localctx.args.list[2]); } @@ -2995,11 +2812,11 @@ public AtomContext atom() { case 84: EnterOuterAlt(_localctx, 84); { - State = 742; + State = 710; Match(T__109); - State = 743; + State = 711; _localctx.args = function_arguments(); - State = 744; + State = 712; Match(T__39); Assert("limitleft", 3, _localctx.args.list.Count); _localctx.value = MathS.Limit(_localctx.args.list[0], _localctx.args.list[1], _localctx.args.list[2], AngouriMath.Core.ApproachFrom.Left); } @@ -3007,11 +2824,11 @@ public AtomContext atom() { case 85: EnterOuterAlt(_localctx, 85); { - State = 747; + State = 715; Match(T__110); - State = 748; + State = 716; _localctx.args = function_arguments(); - State = 749; + State = 717; Match(T__39); Assert("limitright", 3, _localctx.args.list.Count); _localctx.value = MathS.Limit(_localctx.args.list[0], _localctx.args.list[1], _localctx.args.list[2], AngouriMath.Core.ApproachFrom.Right); } @@ -3019,11 +2836,11 @@ public AtomContext atom() { case 86: EnterOuterAlt(_localctx, 86); { - State = 752; + State = 720; Match(T__111); - State = 753; + State = 721; _localctx.args = function_arguments(); - State = 754; + State = 722; Match(T__39); Assert("signum", 1, _localctx.args.list.Count); _localctx.value = MathS.Signum(_localctx.args.list[0]); } @@ -3031,11 +2848,11 @@ public AtomContext atom() { case 87: EnterOuterAlt(_localctx, 87); { - State = 757; + State = 725; Match(T__112); - State = 758; + State = 726; _localctx.args = function_arguments(); - State = 759; + State = 727; Match(T__39); Assert("sgn", 1, _localctx.args.list.Count); _localctx.value = MathS.Signum(_localctx.args.list[0]); } @@ -3043,11 +2860,11 @@ public AtomContext atom() { case 88: EnterOuterAlt(_localctx, 88); { - State = 762; + State = 730; Match(T__113); - State = 763; + State = 731; _localctx.args = function_arguments(); - State = 764; + State = 732; Match(T__39); Assert("sign", 1, _localctx.args.list.Count); _localctx.value = MathS.Signum(_localctx.args.list[0]); } @@ -3055,11 +2872,11 @@ public AtomContext atom() { case 89: EnterOuterAlt(_localctx, 89); { - State = 767; + State = 735; Match(T__114); - State = 768; + State = 736; _localctx.args = function_arguments(); - State = 769; + State = 737; Match(T__39); Assert("abs", 1, _localctx.args.list.Count); _localctx.value = MathS.Abs(_localctx.args.list[0]); } @@ -3067,11 +2884,11 @@ public AtomContext atom() { case 90: EnterOuterAlt(_localctx, 90); { - State = 772; + State = 740; Match(T__115); - State = 773; + State = 741; _localctx.args = function_arguments(); - State = 774; + State = 742; Match(T__39); Assert("phi", 1, _localctx.args.list.Count); _localctx.value = MathS.NumberTheory.Phi(_localctx.args.list[0]); } @@ -3079,11 +2896,11 @@ public AtomContext atom() { case 91: EnterOuterAlt(_localctx, 91); { - State = 777; + State = 745; Match(T__116); - State = 778; + State = 746; _localctx.args = function_arguments(); - State = 779; + State = 747; Match(T__39); Assert("domain", 2, _localctx.args.list.Count); @@ -3096,11 +2913,11 @@ public AtomContext atom() { case 92: EnterOuterAlt(_localctx, 92); { - State = 782; + State = 750; Match(T__117); - State = 783; + State = 751; _localctx.args = function_arguments(); - State = 784; + State = 752; Match(T__39); var cases = new List(); @@ -3116,11 +2933,11 @@ public AtomContext atom() { case 93: EnterOuterAlt(_localctx, 93); { - State = 787; + State = 755; Match(T__118); - State = 788; + State = 756; _localctx.args = function_arguments(); - State = 789; + State = 757; Match(T__39); if (_localctx.args.list.Count < 2) @@ -3132,11 +2949,11 @@ public AtomContext atom() { case 94: EnterOuterAlt(_localctx, 94); { - State = 792; + State = 760; Match(T__119); - State = 793; + State = 761; _localctx.args = function_arguments(); - State = 794; + State = 762; Match(T__39); if (_localctx.args.list.Count < 2) @@ -3190,13 +3007,13 @@ public override void ExitRule(IParseTreeListener listener) { [RuleVersion(0)] public StatementContext statement() { StatementContext _localctx = new StatementContext(Context, State); - EnterRule(_localctx, 48, RULE_statement); + EnterRule(_localctx, 42, RULE_statement); try { EnterOuterAlt(_localctx, 1); { - State = 799; + State = 767; _localctx._expression = expression(); - State = 800; + State = 768; Match(Eof); Result = _localctx._expression.value; } @@ -3213,281 +3030,270 @@ public StatementContext statement() { } private static int[] _serializedATN = { - 4,1,127,804,2,0,7,0,2,1,7,1,2,2,7,2,2,3,7,3,2,4,7,4,2,5,7,5,2,6,7,6,2, + 4,1,127,772,2,0,7,0,2,1,7,1,2,2,7,2,2,3,7,3,2,4,7,4,2,5,7,5,2,6,7,6,2, 7,7,7,2,8,7,8,2,9,7,9,2,10,7,10,2,11,7,11,2,12,7,12,2,13,7,13,2,14,7,14, 2,15,7,15,2,16,7,16,2,17,7,17,2,18,7,18,2,19,7,19,2,20,7,20,2,21,7,21, - 2,22,7,22,2,23,7,23,2,24,7,24,1,0,1,0,1,0,1,0,1,0,1,0,1,0,3,0,58,8,0,1, - 1,1,1,1,1,1,1,4,1,64,8,1,11,1,12,1,65,1,1,1,1,1,1,1,1,4,1,72,8,1,11,1, - 12,1,73,3,1,76,8,1,1,2,1,2,1,2,1,2,1,2,3,2,83,8,2,1,3,1,3,1,3,1,3,1,3, - 1,3,1,3,1,3,3,3,93,8,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,3,3,103,8,3,1,3, - 1,3,1,3,3,3,108,8,3,1,4,1,4,1,4,1,4,1,4,1,4,1,4,1,4,1,4,1,4,5,4,120,8, - 4,10,4,12,4,123,9,4,1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,5,5,5,135,8, - 5,10,5,12,5,138,9,5,1,6,1,6,1,6,1,6,1,6,1,6,1,6,1,6,1,6,1,6,5,6,150,8, - 6,10,6,12,6,153,9,6,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,5,7,165,8, - 7,10,7,12,7,168,9,7,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,5,8,180,8, - 8,10,8,12,8,183,9,8,1,9,1,9,1,9,1,9,1,9,1,9,5,9,191,8,9,10,9,12,9,194, - 9,9,1,10,1,10,1,10,1,10,1,10,1,10,1,10,1,10,1,10,1,10,1,10,1,10,1,10,1, - 10,1,10,1,10,1,10,1,10,1,10,1,10,1,10,1,10,5,10,218,8,10,10,10,12,10,221, - 9,10,1,11,1,11,1,11,1,11,4,11,227,8,11,11,11,12,11,228,1,12,1,12,1,12, - 1,12,1,12,3,12,236,8,12,1,13,1,13,1,13,1,13,1,13,1,13,1,13,1,13,1,13,1, - 13,1,13,3,13,249,8,13,1,14,1,14,1,14,1,14,1,14,1,14,1,14,1,14,1,14,1,14, - 5,14,261,8,14,10,14,12,14,264,9,14,1,15,1,15,1,15,1,15,1,15,1,15,5,15, - 272,8,15,10,15,12,15,275,9,15,1,16,1,16,1,16,1,16,1,16,1,16,1,16,1,16, - 1,16,1,16,5,16,287,8,16,10,16,12,16,290,9,16,1,17,1,17,1,17,1,17,1,17, - 1,17,1,17,1,17,1,17,1,17,5,17,302,8,17,10,17,12,17,305,9,17,1,18,1,18, - 1,18,1,18,1,18,1,18,5,18,313,8,18,10,18,12,18,316,9,18,1,19,1,19,1,19, - 1,20,1,20,1,20,1,20,1,20,1,20,5,20,327,8,20,10,20,12,20,330,9,20,3,20, - 332,8,20,1,21,1,21,1,21,1,21,1,21,1,21,1,22,1,22,1,22,1,22,1,22,1,22,1, - 23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1, - 23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1, - 23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1, - 23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1, - 23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1, - 23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1, - 23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1, - 23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1, - 23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1, - 23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1, - 23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1, - 23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1, - 23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1, - 23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1, - 23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1, - 23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1, - 23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1, - 23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1, - 23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1, - 23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1, - 23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1, - 23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1, - 23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1, - 23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1, - 23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1, - 23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1, - 23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1, - 23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1, - 23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1, - 23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1, - 23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1, - 23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1, - 23,1,23,1,23,1,23,3,23,798,8,23,1,24,1,24,1,24,1,24,1,24,0,0,25,0,2,4, - 6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38,40,42,44,46,48,0,0,910, - 0,57,1,0,0,0,2,75,1,0,0,0,4,77,1,0,0,0,6,107,1,0,0,0,8,109,1,0,0,0,10, - 124,1,0,0,0,12,139,1,0,0,0,14,154,1,0,0,0,16,169,1,0,0,0,18,184,1,0,0, - 0,20,195,1,0,0,0,22,226,1,0,0,0,24,230,1,0,0,0,26,248,1,0,0,0,28,250,1, - 0,0,0,30,265,1,0,0,0,32,276,1,0,0,0,34,291,1,0,0,0,36,306,1,0,0,0,38,317, - 1,0,0,0,40,331,1,0,0,0,42,333,1,0,0,0,44,339,1,0,0,0,46,797,1,0,0,0,48, - 799,1,0,0,0,50,51,3,46,23,0,51,52,5,1,0,0,52,53,6,0,-1,0,53,58,1,0,0,0, - 54,55,3,46,23,0,55,56,6,0,-1,0,56,58,1,0,0,0,57,50,1,0,0,0,57,54,1,0,0, - 0,58,1,1,0,0,0,59,60,5,2,0,0,60,61,3,0,0,0,61,62,6,1,-1,0,62,64,1,0,0, - 0,63,59,1,0,0,0,64,65,1,0,0,0,65,63,1,0,0,0,65,66,1,0,0,0,66,76,1,0,0, - 0,67,68,5,2,0,0,68,69,3,6,3,0,69,70,6,1,-1,0,70,72,1,0,0,0,71,67,1,0,0, - 0,72,73,1,0,0,0,73,71,1,0,0,0,73,74,1,0,0,0,74,76,1,0,0,0,75,63,1,0,0, - 0,75,71,1,0,0,0,76,3,1,0,0,0,77,78,3,0,0,0,78,82,6,2,-1,0,79,80,3,2,1, - 0,80,81,6,2,-1,0,81,83,1,0,0,0,82,79,1,0,0,0,82,83,1,0,0,0,83,5,1,0,0, - 0,84,85,5,3,0,0,85,86,3,4,2,0,86,87,6,3,-1,0,87,93,1,0,0,0,88,89,5,4,0, - 0,89,90,3,4,2,0,90,91,6,3,-1,0,91,93,1,0,0,0,92,84,1,0,0,0,92,88,1,0,0, - 0,93,108,1,0,0,0,94,95,5,3,0,0,95,96,3,6,3,0,96,97,6,3,-1,0,97,103,1,0, - 0,0,98,99,5,4,0,0,99,100,3,6,3,0,100,101,6,3,-1,0,101,103,1,0,0,0,102, - 94,1,0,0,0,102,98,1,0,0,0,103,108,1,0,0,0,104,105,3,4,2,0,105,106,6,3, - -1,0,106,108,1,0,0,0,107,92,1,0,0,0,107,102,1,0,0,0,107,104,1,0,0,0,108, - 7,1,0,0,0,109,110,3,6,3,0,110,121,6,4,-1,0,111,112,5,5,0,0,112,113,3,6, - 3,0,113,114,6,4,-1,0,114,120,1,0,0,0,115,116,5,6,0,0,116,117,3,6,3,0,117, - 118,6,4,-1,0,118,120,1,0,0,0,119,111,1,0,0,0,119,115,1,0,0,0,120,123,1, - 0,0,0,121,119,1,0,0,0,121,122,1,0,0,0,122,9,1,0,0,0,123,121,1,0,0,0,124, - 125,3,8,4,0,125,136,6,5,-1,0,126,127,5,4,0,0,127,128,3,8,4,0,128,129,6, - 5,-1,0,129,135,1,0,0,0,130,131,5,3,0,0,131,132,3,8,4,0,132,133,6,5,-1, - 0,133,135,1,0,0,0,134,126,1,0,0,0,134,130,1,0,0,0,135,138,1,0,0,0,136, - 134,1,0,0,0,136,137,1,0,0,0,137,11,1,0,0,0,138,136,1,0,0,0,139,140,3,10, - 5,0,140,151,6,6,-1,0,141,142,5,7,0,0,142,143,3,10,5,0,143,144,6,6,-1,0, - 144,150,1,0,0,0,145,146,5,8,0,0,146,147,3,10,5,0,147,148,6,6,-1,0,148, - 150,1,0,0,0,149,141,1,0,0,0,149,145,1,0,0,0,150,153,1,0,0,0,151,149,1, - 0,0,0,151,152,1,0,0,0,152,13,1,0,0,0,153,151,1,0,0,0,154,155,3,12,6,0, - 155,166,6,7,-1,0,156,157,5,9,0,0,157,158,3,12,6,0,158,159,6,7,-1,0,159, - 165,1,0,0,0,160,161,5,10,0,0,161,162,3,12,6,0,162,163,6,7,-1,0,163,165, - 1,0,0,0,164,156,1,0,0,0,164,160,1,0,0,0,165,168,1,0,0,0,166,164,1,0,0, - 0,166,167,1,0,0,0,167,15,1,0,0,0,168,166,1,0,0,0,169,170,3,14,7,0,170, - 181,6,8,-1,0,171,172,5,11,0,0,172,173,3,14,7,0,173,174,6,8,-1,0,174,180, - 1,0,0,0,175,176,5,12,0,0,176,177,3,14,7,0,177,178,6,8,-1,0,178,180,1,0, - 0,0,179,171,1,0,0,0,179,175,1,0,0,0,180,183,1,0,0,0,181,179,1,0,0,0,181, - 182,1,0,0,0,182,17,1,0,0,0,183,181,1,0,0,0,184,185,3,16,8,0,185,192,6, - 9,-1,0,186,187,5,13,0,0,187,188,3,16,8,0,188,189,6,9,-1,0,189,191,1,0, - 0,0,190,186,1,0,0,0,191,194,1,0,0,0,192,190,1,0,0,0,192,193,1,0,0,0,193, - 19,1,0,0,0,194,192,1,0,0,0,195,196,3,18,9,0,196,219,6,10,-1,0,197,198, - 5,14,0,0,198,199,3,18,9,0,199,200,6,10,-1,0,200,218,1,0,0,0,201,202,5, - 15,0,0,202,203,3,18,9,0,203,204,6,10,-1,0,204,218,1,0,0,0,205,206,5,16, - 0,0,206,207,3,18,9,0,207,208,6,10,-1,0,208,218,1,0,0,0,209,210,5,17,0, - 0,210,211,3,18,9,0,211,212,6,10,-1,0,212,218,1,0,0,0,213,214,5,18,0,0, - 214,215,3,18,9,0,215,216,6,10,-1,0,216,218,1,0,0,0,217,197,1,0,0,0,217, - 201,1,0,0,0,217,205,1,0,0,0,217,209,1,0,0,0,217,213,1,0,0,0,218,221,1, - 0,0,0,219,217,1,0,0,0,219,220,1,0,0,0,220,21,1,0,0,0,221,219,1,0,0,0,222, - 223,5,19,0,0,223,224,3,20,10,0,224,225,6,11,-1,0,225,227,1,0,0,0,226,222, - 1,0,0,0,227,228,1,0,0,0,228,226,1,0,0,0,228,229,1,0,0,0,229,23,1,0,0,0, - 230,231,3,20,10,0,231,235,6,12,-1,0,232,233,3,22,11,0,233,234,6,12,-1, - 0,234,236,1,0,0,0,235,232,1,0,0,0,235,236,1,0,0,0,236,25,1,0,0,0,237,238, - 5,20,0,0,238,239,3,24,12,0,239,240,6,13,-1,0,240,249,1,0,0,0,241,242,5, - 20,0,0,242,243,3,26,13,0,243,244,6,13,-1,0,244,249,1,0,0,0,245,246,3,24, - 12,0,246,247,6,13,-1,0,247,249,1,0,0,0,248,237,1,0,0,0,248,241,1,0,0,0, - 248,245,1,0,0,0,249,27,1,0,0,0,250,251,3,26,13,0,251,262,6,14,-1,0,252, - 253,5,21,0,0,253,254,3,26,13,0,254,255,6,14,-1,0,255,261,1,0,0,0,256,257, - 5,22,0,0,257,258,3,26,13,0,258,259,6,14,-1,0,259,261,1,0,0,0,260,252,1, - 0,0,0,260,256,1,0,0,0,261,264,1,0,0,0,262,260,1,0,0,0,262,263,1,0,0,0, - 263,29,1,0,0,0,264,262,1,0,0,0,265,266,3,28,14,0,266,273,6,15,-1,0,267, - 268,5,23,0,0,268,269,3,28,14,0,269,270,6,15,-1,0,270,272,1,0,0,0,271,267, - 1,0,0,0,272,275,1,0,0,0,273,271,1,0,0,0,273,274,1,0,0,0,274,31,1,0,0,0, - 275,273,1,0,0,0,276,277,3,30,15,0,277,288,6,16,-1,0,278,279,5,24,0,0,279, - 280,3,30,15,0,280,281,6,16,-1,0,281,287,1,0,0,0,282,283,5,25,0,0,283,284, - 3,30,15,0,284,285,6,16,-1,0,285,287,1,0,0,0,286,278,1,0,0,0,286,282,1, - 0,0,0,287,290,1,0,0,0,288,286,1,0,0,0,288,289,1,0,0,0,289,33,1,0,0,0,290, - 288,1,0,0,0,291,292,3,32,16,0,292,303,6,17,-1,0,293,294,5,26,0,0,294,295, - 3,32,16,0,295,296,6,17,-1,0,296,302,1,0,0,0,297,298,5,27,0,0,298,299,3, - 32,16,0,299,300,6,17,-1,0,300,302,1,0,0,0,301,293,1,0,0,0,301,297,1,0, - 0,0,302,305,1,0,0,0,303,301,1,0,0,0,303,304,1,0,0,0,304,35,1,0,0,0,305, - 303,1,0,0,0,306,307,3,34,17,0,307,314,6,18,-1,0,308,309,5,28,0,0,309,310, - 3,34,17,0,310,311,6,18,-1,0,311,313,1,0,0,0,312,308,1,0,0,0,313,316,1, - 0,0,0,314,312,1,0,0,0,314,315,1,0,0,0,315,37,1,0,0,0,316,314,1,0,0,0,317, - 318,3,36,18,0,318,319,6,19,-1,0,319,39,1,0,0,0,320,321,3,38,19,0,321,328, - 6,20,-1,0,322,323,5,29,0,0,323,324,3,38,19,0,324,325,6,20,-1,0,325,327, - 1,0,0,0,326,322,1,0,0,0,327,330,1,0,0,0,328,326,1,0,0,0,328,329,1,0,0, - 0,329,332,1,0,0,0,330,328,1,0,0,0,331,320,1,0,0,0,331,332,1,0,0,0,332, - 41,1,0,0,0,333,334,3,38,19,0,334,335,6,21,-1,0,335,336,5,30,0,0,336,337, - 3,38,19,0,337,338,6,21,-1,0,338,43,1,0,0,0,339,340,3,38,19,0,340,341,6, - 22,-1,0,341,342,5,31,0,0,342,343,3,38,19,0,343,344,6,22,-1,0,344,45,1, - 0,0,0,345,346,5,32,0,0,346,798,6,23,-1,0,347,348,5,33,0,0,348,798,6,23, - -1,0,349,350,5,122,0,0,350,798,6,23,-1,0,351,352,5,124,0,0,352,798,6,23, - -1,0,353,354,5,123,0,0,354,798,6,23,-1,0,355,356,5,125,0,0,356,798,6,23, - -1,0,357,358,5,34,0,0,358,359,3,38,19,0,359,360,5,35,0,0,360,361,6,23, - -1,0,361,798,1,0,0,0,362,363,5,36,0,0,363,364,3,40,20,0,364,365,5,37,0, - 0,365,366,6,23,-1,0,366,798,1,0,0,0,367,368,5,36,0,0,368,369,3,40,20,0, - 369,370,5,38,0,0,370,371,6,23,-1,0,371,798,1,0,0,0,372,373,5,39,0,0,373, - 374,3,42,21,0,374,375,5,40,0,0,375,376,6,23,-1,0,376,798,1,0,0,0,377,378, - 5,36,0,0,378,379,3,42,21,0,379,380,5,40,0,0,380,381,6,23,-1,0,381,798, - 1,0,0,0,382,383,5,36,0,0,383,384,3,42,21,0,384,385,5,38,0,0,385,386,6, - 23,-1,0,386,798,1,0,0,0,387,388,5,39,0,0,388,389,3,42,21,0,389,390,5,38, - 0,0,390,391,6,23,-1,0,391,798,1,0,0,0,392,393,5,39,0,0,393,394,3,38,19, - 0,394,395,5,40,0,0,395,396,6,23,-1,0,396,798,1,0,0,0,397,398,5,41,0,0, - 398,399,3,44,22,0,399,400,5,42,0,0,400,401,6,23,-1,0,401,798,1,0,0,0,402, - 403,5,41,0,0,403,404,3,40,20,0,404,405,5,42,0,0,405,406,6,23,-1,0,406, - 798,1,0,0,0,407,408,5,43,0,0,408,409,3,40,20,0,409,410,5,40,0,0,410,411, - 6,23,-1,0,411,798,1,0,0,0,412,413,5,44,0,0,413,414,3,40,20,0,414,415,5, - 40,0,0,415,416,6,23,-1,0,416,798,1,0,0,0,417,418,5,45,0,0,418,419,3,40, - 20,0,419,420,5,40,0,0,420,421,6,23,-1,0,421,798,1,0,0,0,422,423,5,46,0, - 0,423,424,3,40,20,0,424,425,5,40,0,0,425,426,6,23,-1,0,426,798,1,0,0,0, - 427,428,5,47,0,0,428,429,3,40,20,0,429,430,5,40,0,0,430,431,6,23,-1,0, - 431,798,1,0,0,0,432,433,5,48,0,0,433,434,3,40,20,0,434,435,5,40,0,0,435, - 436,6,23,-1,0,436,798,1,0,0,0,437,438,5,49,0,0,438,439,3,40,20,0,439,440, - 5,40,0,0,440,441,6,23,-1,0,441,798,1,0,0,0,442,443,5,50,0,0,443,444,3, - 40,20,0,444,445,5,40,0,0,445,446,6,23,-1,0,446,798,1,0,0,0,447,448,5,51, - 0,0,448,449,3,40,20,0,449,450,5,40,0,0,450,451,6,23,-1,0,451,798,1,0,0, - 0,452,453,5,52,0,0,453,454,3,40,20,0,454,455,5,40,0,0,455,456,6,23,-1, - 0,456,798,1,0,0,0,457,458,5,53,0,0,458,459,3,40,20,0,459,460,5,40,0,0, - 460,461,6,23,-1,0,461,798,1,0,0,0,462,463,5,54,0,0,463,464,3,40,20,0,464, - 465,5,40,0,0,465,466,6,23,-1,0,466,798,1,0,0,0,467,468,5,55,0,0,468,469, - 3,40,20,0,469,470,5,40,0,0,470,471,6,23,-1,0,471,798,1,0,0,0,472,473,5, - 56,0,0,473,474,3,40,20,0,474,475,5,40,0,0,475,476,6,23,-1,0,476,798,1, - 0,0,0,477,478,5,57,0,0,478,479,3,40,20,0,479,480,5,40,0,0,480,481,6,23, - -1,0,481,798,1,0,0,0,482,483,5,58,0,0,483,484,3,40,20,0,484,485,5,40,0, - 0,485,486,6,23,-1,0,486,798,1,0,0,0,487,488,5,59,0,0,488,489,3,40,20,0, - 489,490,5,40,0,0,490,491,6,23,-1,0,491,798,1,0,0,0,492,493,5,60,0,0,493, - 494,3,40,20,0,494,495,5,40,0,0,495,496,6,23,-1,0,496,798,1,0,0,0,497,498, - 5,61,0,0,498,499,3,40,20,0,499,500,5,40,0,0,500,501,6,23,-1,0,501,798, - 1,0,0,0,502,503,5,62,0,0,503,504,3,40,20,0,504,505,5,40,0,0,505,506,6, - 23,-1,0,506,798,1,0,0,0,507,508,5,63,0,0,508,509,3,40,20,0,509,510,5,40, - 0,0,510,511,6,23,-1,0,511,798,1,0,0,0,512,513,5,64,0,0,513,514,3,40,20, - 0,514,515,5,40,0,0,515,516,6,23,-1,0,516,798,1,0,0,0,517,518,5,65,0,0, - 518,519,3,40,20,0,519,520,5,40,0,0,520,521,6,23,-1,0,521,798,1,0,0,0,522, - 523,5,66,0,0,523,524,3,40,20,0,524,525,5,40,0,0,525,526,6,23,-1,0,526, - 798,1,0,0,0,527,528,5,67,0,0,528,529,3,40,20,0,529,530,5,40,0,0,530,531, - 6,23,-1,0,531,798,1,0,0,0,532,533,5,68,0,0,533,534,3,40,20,0,534,535,5, - 40,0,0,535,536,6,23,-1,0,536,798,1,0,0,0,537,538,5,69,0,0,538,539,3,40, - 20,0,539,540,5,40,0,0,540,541,6,23,-1,0,541,798,1,0,0,0,542,543,5,70,0, - 0,543,544,3,40,20,0,544,545,5,40,0,0,545,546,6,23,-1,0,546,798,1,0,0,0, - 547,548,5,71,0,0,548,549,3,40,20,0,549,550,5,40,0,0,550,551,6,23,-1,0, - 551,798,1,0,0,0,552,553,5,72,0,0,553,554,3,40,20,0,554,555,5,40,0,0,555, - 556,6,23,-1,0,556,798,1,0,0,0,557,558,5,73,0,0,558,559,3,40,20,0,559,560, - 5,40,0,0,560,561,6,23,-1,0,561,798,1,0,0,0,562,563,5,74,0,0,563,564,3, - 40,20,0,564,565,5,40,0,0,565,566,6,23,-1,0,566,798,1,0,0,0,567,568,5,75, - 0,0,568,569,3,40,20,0,569,570,5,40,0,0,570,571,6,23,-1,0,571,798,1,0,0, - 0,572,573,5,76,0,0,573,574,3,40,20,0,574,575,5,40,0,0,575,576,6,23,-1, - 0,576,798,1,0,0,0,577,578,5,77,0,0,578,579,3,40,20,0,579,580,5,40,0,0, - 580,581,6,23,-1,0,581,798,1,0,0,0,582,583,5,78,0,0,583,584,3,40,20,0,584, - 585,5,40,0,0,585,586,6,23,-1,0,586,798,1,0,0,0,587,588,5,79,0,0,588,589, - 3,40,20,0,589,590,5,40,0,0,590,591,6,23,-1,0,591,798,1,0,0,0,592,593,5, - 80,0,0,593,594,3,40,20,0,594,595,5,40,0,0,595,596,6,23,-1,0,596,798,1, - 0,0,0,597,598,5,81,0,0,598,599,3,40,20,0,599,600,5,40,0,0,600,601,6,23, - -1,0,601,798,1,0,0,0,602,603,5,82,0,0,603,604,3,40,20,0,604,605,5,40,0, - 0,605,606,6,23,-1,0,606,798,1,0,0,0,607,608,5,83,0,0,608,609,3,40,20,0, - 609,610,5,40,0,0,610,611,6,23,-1,0,611,798,1,0,0,0,612,613,5,84,0,0,613, - 614,3,40,20,0,614,615,5,40,0,0,615,616,6,23,-1,0,616,798,1,0,0,0,617,618, - 5,85,0,0,618,619,3,40,20,0,619,620,5,40,0,0,620,621,6,23,-1,0,621,798, - 1,0,0,0,622,623,5,86,0,0,623,624,3,40,20,0,624,625,5,40,0,0,625,626,6, - 23,-1,0,626,798,1,0,0,0,627,628,5,87,0,0,628,629,3,40,20,0,629,630,5,40, - 0,0,630,631,6,23,-1,0,631,798,1,0,0,0,632,633,5,88,0,0,633,634,3,40,20, - 0,634,635,5,40,0,0,635,636,6,23,-1,0,636,798,1,0,0,0,637,638,5,89,0,0, - 638,639,3,40,20,0,639,640,5,40,0,0,640,641,6,23,-1,0,641,798,1,0,0,0,642, - 643,5,90,0,0,643,644,3,40,20,0,644,645,5,40,0,0,645,646,6,23,-1,0,646, - 798,1,0,0,0,647,648,5,91,0,0,648,649,3,40,20,0,649,650,5,40,0,0,650,651, - 6,23,-1,0,651,798,1,0,0,0,652,653,5,92,0,0,653,654,3,40,20,0,654,655,5, - 40,0,0,655,656,6,23,-1,0,656,798,1,0,0,0,657,658,5,93,0,0,658,659,3,40, - 20,0,659,660,5,40,0,0,660,661,6,23,-1,0,661,798,1,0,0,0,662,663,5,94,0, - 0,663,664,3,40,20,0,664,665,5,40,0,0,665,666,6,23,-1,0,666,798,1,0,0,0, - 667,668,5,95,0,0,668,669,3,40,20,0,669,670,5,40,0,0,670,671,6,23,-1,0, - 671,798,1,0,0,0,672,673,5,96,0,0,673,674,3,40,20,0,674,675,5,40,0,0,675, - 676,6,23,-1,0,676,798,1,0,0,0,677,678,5,97,0,0,678,679,3,40,20,0,679,680, - 5,40,0,0,680,681,6,23,-1,0,681,798,1,0,0,0,682,683,5,98,0,0,683,684,3, - 40,20,0,684,685,5,40,0,0,685,686,6,23,-1,0,686,798,1,0,0,0,687,688,5,99, - 0,0,688,689,3,40,20,0,689,690,5,40,0,0,690,691,6,23,-1,0,691,798,1,0,0, - 0,692,693,5,100,0,0,693,694,3,40,20,0,694,695,5,40,0,0,695,696,6,23,-1, - 0,696,798,1,0,0,0,697,698,5,101,0,0,698,699,3,40,20,0,699,700,5,40,0,0, - 700,701,6,23,-1,0,701,798,1,0,0,0,702,703,5,102,0,0,703,704,3,40,20,0, - 704,705,5,40,0,0,705,706,6,23,-1,0,706,798,1,0,0,0,707,708,5,103,0,0,708, - 709,3,40,20,0,709,710,5,40,0,0,710,711,6,23,-1,0,711,798,1,0,0,0,712,713, - 5,104,0,0,713,714,3,40,20,0,714,715,5,40,0,0,715,716,6,23,-1,0,716,798, - 1,0,0,0,717,718,5,105,0,0,718,719,3,40,20,0,719,720,5,40,0,0,720,721,6, - 23,-1,0,721,798,1,0,0,0,722,723,5,106,0,0,723,724,3,40,20,0,724,725,5, - 40,0,0,725,726,6,23,-1,0,726,798,1,0,0,0,727,728,5,107,0,0,728,729,3,40, - 20,0,729,730,5,40,0,0,730,731,6,23,-1,0,731,798,1,0,0,0,732,733,5,108, - 0,0,733,734,3,40,20,0,734,735,5,40,0,0,735,736,6,23,-1,0,736,798,1,0,0, - 0,737,738,5,109,0,0,738,739,3,40,20,0,739,740,5,40,0,0,740,741,6,23,-1, - 0,741,798,1,0,0,0,742,743,5,110,0,0,743,744,3,40,20,0,744,745,5,40,0,0, - 745,746,6,23,-1,0,746,798,1,0,0,0,747,748,5,111,0,0,748,749,3,40,20,0, - 749,750,5,40,0,0,750,751,6,23,-1,0,751,798,1,0,0,0,752,753,5,112,0,0,753, - 754,3,40,20,0,754,755,5,40,0,0,755,756,6,23,-1,0,756,798,1,0,0,0,757,758, - 5,113,0,0,758,759,3,40,20,0,759,760,5,40,0,0,760,761,6,23,-1,0,761,798, - 1,0,0,0,762,763,5,114,0,0,763,764,3,40,20,0,764,765,5,40,0,0,765,766,6, - 23,-1,0,766,798,1,0,0,0,767,768,5,115,0,0,768,769,3,40,20,0,769,770,5, - 40,0,0,770,771,6,23,-1,0,771,798,1,0,0,0,772,773,5,116,0,0,773,774,3,40, - 20,0,774,775,5,40,0,0,775,776,6,23,-1,0,776,798,1,0,0,0,777,778,5,117, - 0,0,778,779,3,40,20,0,779,780,5,40,0,0,780,781,6,23,-1,0,781,798,1,0,0, - 0,782,783,5,118,0,0,783,784,3,40,20,0,784,785,5,40,0,0,785,786,6,23,-1, - 0,786,798,1,0,0,0,787,788,5,119,0,0,788,789,3,40,20,0,789,790,5,40,0,0, - 790,791,6,23,-1,0,791,798,1,0,0,0,792,793,5,120,0,0,793,794,3,40,20,0, - 794,795,5,40,0,0,795,796,6,23,-1,0,796,798,1,0,0,0,797,345,1,0,0,0,797, - 347,1,0,0,0,797,349,1,0,0,0,797,351,1,0,0,0,797,353,1,0,0,0,797,355,1, - 0,0,0,797,357,1,0,0,0,797,362,1,0,0,0,797,367,1,0,0,0,797,372,1,0,0,0, - 797,377,1,0,0,0,797,382,1,0,0,0,797,387,1,0,0,0,797,392,1,0,0,0,797,397, - 1,0,0,0,797,402,1,0,0,0,797,407,1,0,0,0,797,412,1,0,0,0,797,417,1,0,0, - 0,797,422,1,0,0,0,797,427,1,0,0,0,797,432,1,0,0,0,797,437,1,0,0,0,797, - 442,1,0,0,0,797,447,1,0,0,0,797,452,1,0,0,0,797,457,1,0,0,0,797,462,1, - 0,0,0,797,467,1,0,0,0,797,472,1,0,0,0,797,477,1,0,0,0,797,482,1,0,0,0, - 797,487,1,0,0,0,797,492,1,0,0,0,797,497,1,0,0,0,797,502,1,0,0,0,797,507, - 1,0,0,0,797,512,1,0,0,0,797,517,1,0,0,0,797,522,1,0,0,0,797,527,1,0,0, - 0,797,532,1,0,0,0,797,537,1,0,0,0,797,542,1,0,0,0,797,547,1,0,0,0,797, - 552,1,0,0,0,797,557,1,0,0,0,797,562,1,0,0,0,797,567,1,0,0,0,797,572,1, - 0,0,0,797,577,1,0,0,0,797,582,1,0,0,0,797,587,1,0,0,0,797,592,1,0,0,0, - 797,597,1,0,0,0,797,602,1,0,0,0,797,607,1,0,0,0,797,612,1,0,0,0,797,617, - 1,0,0,0,797,622,1,0,0,0,797,627,1,0,0,0,797,632,1,0,0,0,797,637,1,0,0, - 0,797,642,1,0,0,0,797,647,1,0,0,0,797,652,1,0,0,0,797,657,1,0,0,0,797, - 662,1,0,0,0,797,667,1,0,0,0,797,672,1,0,0,0,797,677,1,0,0,0,797,682,1, - 0,0,0,797,687,1,0,0,0,797,692,1,0,0,0,797,697,1,0,0,0,797,702,1,0,0,0, - 797,707,1,0,0,0,797,712,1,0,0,0,797,717,1,0,0,0,797,722,1,0,0,0,797,727, - 1,0,0,0,797,732,1,0,0,0,797,737,1,0,0,0,797,742,1,0,0,0,797,747,1,0,0, - 0,797,752,1,0,0,0,797,757,1,0,0,0,797,762,1,0,0,0,797,767,1,0,0,0,797, - 772,1,0,0,0,797,777,1,0,0,0,797,782,1,0,0,0,797,787,1,0,0,0,797,792,1, - 0,0,0,798,47,1,0,0,0,799,800,3,38,19,0,800,801,5,0,0,1,801,802,6,24,-1, - 0,802,49,1,0,0,0,35,57,65,73,75,82,92,102,107,119,121,134,136,149,151, - 164,166,179,181,192,217,219,228,235,248,260,262,273,286,288,301,303,314, - 328,331,797 + 1,0,1,0,1,0,1,0,1,0,1,0,1,0,3,0,52,8,0,1,1,1,1,1,1,1,1,4,1,58,8,1,11,1, + 12,1,59,1,1,1,1,1,1,1,1,4,1,66,8,1,11,1,12,1,67,3,1,70,8,1,1,2,1,2,1,2, + 1,2,1,2,3,2,77,8,2,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,3,3,87,8,3,1,3,1,3, + 1,3,1,3,1,3,1,3,1,3,1,3,3,3,97,8,3,1,3,1,3,1,3,3,3,102,8,3,1,4,1,4,1,4, + 1,4,1,4,1,4,1,4,1,4,1,4,1,4,5,4,114,8,4,10,4,12,4,117,9,4,1,5,1,5,1,5, + 1,5,1,5,1,5,1,5,1,5,1,5,1,5,5,5,129,8,5,10,5,12,5,132,9,5,1,6,1,6,1,6, + 1,6,1,6,1,6,1,6,1,6,1,6,1,6,5,6,144,8,6,10,6,12,6,147,9,6,1,7,1,7,1,7, + 1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,5,7,167,8, + 7,10,7,12,7,170,9,7,1,8,1,8,1,8,1,8,1,8,1,8,5,8,178,8,8,10,8,12,8,181, + 9,8,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,9,3,9,197,8, + 9,1,9,1,9,1,9,5,9,202,8,9,10,9,12,9,205,9,9,1,9,1,9,1,10,1,10,1,10,1,10, + 1,10,1,10,1,10,1,10,1,10,1,10,1,10,3,10,220,8,10,1,11,1,11,1,11,1,11,1, + 11,1,11,1,11,1,11,1,11,1,11,5,11,232,8,11,10,11,12,11,235,9,11,1,12,1, + 12,1,12,1,12,1,12,1,12,5,12,243,8,12,10,12,12,12,246,9,12,1,13,1,13,1, + 13,1,13,1,13,1,13,1,13,1,13,1,13,1,13,5,13,258,8,13,10,13,12,13,261,9, + 13,1,14,1,14,1,14,1,14,1,14,1,14,1,14,1,14,1,14,1,14,5,14,273,8,14,10, + 14,12,14,276,9,14,1,15,1,15,1,15,1,15,1,15,1,15,3,15,284,8,15,1,16,1,16, + 1,16,1,17,1,17,1,17,1,17,1,17,1,17,5,17,295,8,17,10,17,12,17,298,9,17, + 3,17,300,8,17,1,18,1,18,1,18,1,18,1,18,1,18,1,19,1,19,1,19,1,19,1,19,1, + 19,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1, + 20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1, + 20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1, + 20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1, + 20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1, + 20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1, + 20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1, + 20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1, + 20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1, + 20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1, + 20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1, + 20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1, + 20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1, + 20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1, + 20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1, + 20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1, + 20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1, + 20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1, + 20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1, + 20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1, + 20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1, + 20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1, + 20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1, + 20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1, + 20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1, + 20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1, + 20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1, + 20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1, + 20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1, + 20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1, + 20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1, + 20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1, + 20,1,20,1,20,1,20,1,20,3,20,766,8,20,1,21,1,21,1,21,1,21,1,21,0,0,22,0, + 2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38,40,42,0,0,880,0,51, + 1,0,0,0,2,69,1,0,0,0,4,71,1,0,0,0,6,101,1,0,0,0,8,103,1,0,0,0,10,118,1, + 0,0,0,12,133,1,0,0,0,14,148,1,0,0,0,16,171,1,0,0,0,18,182,1,0,0,0,20,219, + 1,0,0,0,22,221,1,0,0,0,24,236,1,0,0,0,26,247,1,0,0,0,28,262,1,0,0,0,30, + 277,1,0,0,0,32,285,1,0,0,0,34,299,1,0,0,0,36,301,1,0,0,0,38,307,1,0,0, + 0,40,765,1,0,0,0,42,767,1,0,0,0,44,45,3,40,20,0,45,46,5,1,0,0,46,47,6, + 0,-1,0,47,52,1,0,0,0,48,49,3,40,20,0,49,50,6,0,-1,0,50,52,1,0,0,0,51,44, + 1,0,0,0,51,48,1,0,0,0,52,1,1,0,0,0,53,54,5,2,0,0,54,55,3,0,0,0,55,56,6, + 1,-1,0,56,58,1,0,0,0,57,53,1,0,0,0,58,59,1,0,0,0,59,57,1,0,0,0,59,60,1, + 0,0,0,60,70,1,0,0,0,61,62,5,2,0,0,62,63,3,6,3,0,63,64,6,1,-1,0,64,66,1, + 0,0,0,65,61,1,0,0,0,66,67,1,0,0,0,67,65,1,0,0,0,67,68,1,0,0,0,68,70,1, + 0,0,0,69,57,1,0,0,0,69,65,1,0,0,0,70,3,1,0,0,0,71,72,3,0,0,0,72,76,6,2, + -1,0,73,74,3,2,1,0,74,75,6,2,-1,0,75,77,1,0,0,0,76,73,1,0,0,0,76,77,1, + 0,0,0,77,5,1,0,0,0,78,79,5,3,0,0,79,80,3,4,2,0,80,81,6,3,-1,0,81,87,1, + 0,0,0,82,83,5,4,0,0,83,84,3,4,2,0,84,85,6,3,-1,0,85,87,1,0,0,0,86,78,1, + 0,0,0,86,82,1,0,0,0,87,102,1,0,0,0,88,89,5,3,0,0,89,90,3,6,3,0,90,91,6, + 3,-1,0,91,97,1,0,0,0,92,93,5,4,0,0,93,94,3,6,3,0,94,95,6,3,-1,0,95,97, + 1,0,0,0,96,88,1,0,0,0,96,92,1,0,0,0,97,102,1,0,0,0,98,99,3,4,2,0,99,100, + 6,3,-1,0,100,102,1,0,0,0,101,86,1,0,0,0,101,96,1,0,0,0,101,98,1,0,0,0, + 102,7,1,0,0,0,103,104,3,6,3,0,104,115,6,4,-1,0,105,106,5,5,0,0,106,107, + 3,6,3,0,107,108,6,4,-1,0,108,114,1,0,0,0,109,110,5,6,0,0,110,111,3,6,3, + 0,111,112,6,4,-1,0,112,114,1,0,0,0,113,105,1,0,0,0,113,109,1,0,0,0,114, + 117,1,0,0,0,115,113,1,0,0,0,115,116,1,0,0,0,116,9,1,0,0,0,117,115,1,0, + 0,0,118,119,3,8,4,0,119,130,6,5,-1,0,120,121,5,4,0,0,121,122,3,8,4,0,122, + 123,6,5,-1,0,123,129,1,0,0,0,124,125,5,3,0,0,125,126,3,8,4,0,126,127,6, + 5,-1,0,127,129,1,0,0,0,128,120,1,0,0,0,128,124,1,0,0,0,129,132,1,0,0,0, + 130,128,1,0,0,0,130,131,1,0,0,0,131,11,1,0,0,0,132,130,1,0,0,0,133,134, + 3,10,5,0,134,145,6,6,-1,0,135,136,5,7,0,0,136,137,3,10,5,0,137,138,6,6, + -1,0,138,144,1,0,0,0,139,140,5,8,0,0,140,141,3,10,5,0,141,142,6,6,-1,0, + 142,144,1,0,0,0,143,135,1,0,0,0,143,139,1,0,0,0,144,147,1,0,0,0,145,143, + 1,0,0,0,145,146,1,0,0,0,146,13,1,0,0,0,147,145,1,0,0,0,148,149,3,12,6, + 0,149,168,6,7,-1,0,150,151,5,9,0,0,151,152,3,12,6,0,152,153,6,7,-1,0,153, + 167,1,0,0,0,154,155,5,10,0,0,155,156,3,12,6,0,156,157,6,7,-1,0,157,167, + 1,0,0,0,158,159,5,11,0,0,159,160,3,12,6,0,160,161,6,7,-1,0,161,167,1,0, + 0,0,162,163,5,12,0,0,163,164,3,12,6,0,164,165,6,7,-1,0,165,167,1,0,0,0, + 166,150,1,0,0,0,166,154,1,0,0,0,166,158,1,0,0,0,166,162,1,0,0,0,167,170, + 1,0,0,0,168,166,1,0,0,0,168,169,1,0,0,0,169,15,1,0,0,0,170,168,1,0,0,0, + 171,172,3,14,7,0,172,179,6,8,-1,0,173,174,5,13,0,0,174,175,3,14,7,0,175, + 176,6,8,-1,0,176,178,1,0,0,0,177,173,1,0,0,0,178,181,1,0,0,0,179,177,1, + 0,0,0,179,180,1,0,0,0,180,17,1,0,0,0,181,179,1,0,0,0,182,183,3,16,8,0, + 183,203,6,9,-1,0,184,185,5,14,0,0,185,197,6,9,-1,0,186,187,5,15,0,0,187, + 197,6,9,-1,0,188,189,5,16,0,0,189,197,6,9,-1,0,190,191,5,17,0,0,191,197, + 6,9,-1,0,192,193,5,18,0,0,193,197,6,9,-1,0,194,195,5,19,0,0,195,197,6, + 9,-1,0,196,184,1,0,0,0,196,186,1,0,0,0,196,188,1,0,0,0,196,190,1,0,0,0, + 196,192,1,0,0,0,196,194,1,0,0,0,197,198,1,0,0,0,198,199,3,16,8,0,199,200, + 6,9,-1,0,200,202,1,0,0,0,201,196,1,0,0,0,202,205,1,0,0,0,203,201,1,0,0, + 0,203,204,1,0,0,0,204,206,1,0,0,0,205,203,1,0,0,0,206,207,6,9,-1,0,207, + 19,1,0,0,0,208,209,5,20,0,0,209,210,3,18,9,0,210,211,6,10,-1,0,211,220, + 1,0,0,0,212,213,5,20,0,0,213,214,3,20,10,0,214,215,6,10,-1,0,215,220,1, + 0,0,0,216,217,3,18,9,0,217,218,6,10,-1,0,218,220,1,0,0,0,219,208,1,0,0, + 0,219,212,1,0,0,0,219,216,1,0,0,0,220,21,1,0,0,0,221,222,3,20,10,0,222, + 233,6,11,-1,0,223,224,5,21,0,0,224,225,3,20,10,0,225,226,6,11,-1,0,226, + 232,1,0,0,0,227,228,5,22,0,0,228,229,3,20,10,0,229,230,6,11,-1,0,230,232, + 1,0,0,0,231,223,1,0,0,0,231,227,1,0,0,0,232,235,1,0,0,0,233,231,1,0,0, + 0,233,234,1,0,0,0,234,23,1,0,0,0,235,233,1,0,0,0,236,237,3,22,11,0,237, + 244,6,12,-1,0,238,239,5,23,0,0,239,240,3,22,11,0,240,241,6,12,-1,0,241, + 243,1,0,0,0,242,238,1,0,0,0,243,246,1,0,0,0,244,242,1,0,0,0,244,245,1, + 0,0,0,245,25,1,0,0,0,246,244,1,0,0,0,247,248,3,24,12,0,248,259,6,13,-1, + 0,249,250,5,24,0,0,250,251,3,24,12,0,251,252,6,13,-1,0,252,258,1,0,0,0, + 253,254,5,25,0,0,254,255,3,24,12,0,255,256,6,13,-1,0,256,258,1,0,0,0,257, + 249,1,0,0,0,257,253,1,0,0,0,258,261,1,0,0,0,259,257,1,0,0,0,259,260,1, + 0,0,0,260,27,1,0,0,0,261,259,1,0,0,0,262,263,3,26,13,0,263,274,6,14,-1, + 0,264,265,5,26,0,0,265,266,3,26,13,0,266,267,6,14,-1,0,267,273,1,0,0,0, + 268,269,5,27,0,0,269,270,3,26,13,0,270,271,6,14,-1,0,271,273,1,0,0,0,272, + 264,1,0,0,0,272,268,1,0,0,0,273,276,1,0,0,0,274,272,1,0,0,0,274,275,1, + 0,0,0,275,29,1,0,0,0,276,274,1,0,0,0,277,278,3,28,14,0,278,283,6,15,-1, + 0,279,280,5,28,0,0,280,281,3,30,15,0,281,282,6,15,-1,0,282,284,1,0,0,0, + 283,279,1,0,0,0,283,284,1,0,0,0,284,31,1,0,0,0,285,286,3,30,15,0,286,287, + 6,16,-1,0,287,33,1,0,0,0,288,289,3,32,16,0,289,296,6,17,-1,0,290,291,5, + 29,0,0,291,292,3,32,16,0,292,293,6,17,-1,0,293,295,1,0,0,0,294,290,1,0, + 0,0,295,298,1,0,0,0,296,294,1,0,0,0,296,297,1,0,0,0,297,300,1,0,0,0,298, + 296,1,0,0,0,299,288,1,0,0,0,299,300,1,0,0,0,300,35,1,0,0,0,301,302,3,32, + 16,0,302,303,6,18,-1,0,303,304,5,30,0,0,304,305,3,32,16,0,305,306,6,18, + -1,0,306,37,1,0,0,0,307,308,3,32,16,0,308,309,6,19,-1,0,309,310,5,31,0, + 0,310,311,3,32,16,0,311,312,6,19,-1,0,312,39,1,0,0,0,313,314,5,32,0,0, + 314,766,6,20,-1,0,315,316,5,33,0,0,316,766,6,20,-1,0,317,318,5,122,0,0, + 318,766,6,20,-1,0,319,320,5,124,0,0,320,766,6,20,-1,0,321,322,5,123,0, + 0,322,766,6,20,-1,0,323,324,5,125,0,0,324,766,6,20,-1,0,325,326,5,34,0, + 0,326,327,3,32,16,0,327,328,5,35,0,0,328,329,6,20,-1,0,329,766,1,0,0,0, + 330,331,5,36,0,0,331,332,3,34,17,0,332,333,5,37,0,0,333,334,6,20,-1,0, + 334,766,1,0,0,0,335,336,5,36,0,0,336,337,3,34,17,0,337,338,5,38,0,0,338, + 339,6,20,-1,0,339,766,1,0,0,0,340,341,5,39,0,0,341,342,3,36,18,0,342,343, + 5,40,0,0,343,344,6,20,-1,0,344,766,1,0,0,0,345,346,5,36,0,0,346,347,3, + 36,18,0,347,348,5,40,0,0,348,349,6,20,-1,0,349,766,1,0,0,0,350,351,5,36, + 0,0,351,352,3,36,18,0,352,353,5,38,0,0,353,354,6,20,-1,0,354,766,1,0,0, + 0,355,356,5,39,0,0,356,357,3,36,18,0,357,358,5,38,0,0,358,359,6,20,-1, + 0,359,766,1,0,0,0,360,361,5,39,0,0,361,362,3,32,16,0,362,363,5,40,0,0, + 363,364,6,20,-1,0,364,766,1,0,0,0,365,366,5,41,0,0,366,367,3,38,19,0,367, + 368,5,42,0,0,368,369,6,20,-1,0,369,766,1,0,0,0,370,371,5,41,0,0,371,372, + 3,34,17,0,372,373,5,42,0,0,373,374,6,20,-1,0,374,766,1,0,0,0,375,376,5, + 43,0,0,376,377,3,34,17,0,377,378,5,40,0,0,378,379,6,20,-1,0,379,766,1, + 0,0,0,380,381,5,44,0,0,381,382,3,34,17,0,382,383,5,40,0,0,383,384,6,20, + -1,0,384,766,1,0,0,0,385,386,5,45,0,0,386,387,3,34,17,0,387,388,5,40,0, + 0,388,389,6,20,-1,0,389,766,1,0,0,0,390,391,5,46,0,0,391,392,3,34,17,0, + 392,393,5,40,0,0,393,394,6,20,-1,0,394,766,1,0,0,0,395,396,5,47,0,0,396, + 397,3,34,17,0,397,398,5,40,0,0,398,399,6,20,-1,0,399,766,1,0,0,0,400,401, + 5,48,0,0,401,402,3,34,17,0,402,403,5,40,0,0,403,404,6,20,-1,0,404,766, + 1,0,0,0,405,406,5,49,0,0,406,407,3,34,17,0,407,408,5,40,0,0,408,409,6, + 20,-1,0,409,766,1,0,0,0,410,411,5,50,0,0,411,412,3,34,17,0,412,413,5,40, + 0,0,413,414,6,20,-1,0,414,766,1,0,0,0,415,416,5,51,0,0,416,417,3,34,17, + 0,417,418,5,40,0,0,418,419,6,20,-1,0,419,766,1,0,0,0,420,421,5,52,0,0, + 421,422,3,34,17,0,422,423,5,40,0,0,423,424,6,20,-1,0,424,766,1,0,0,0,425, + 426,5,53,0,0,426,427,3,34,17,0,427,428,5,40,0,0,428,429,6,20,-1,0,429, + 766,1,0,0,0,430,431,5,54,0,0,431,432,3,34,17,0,432,433,5,40,0,0,433,434, + 6,20,-1,0,434,766,1,0,0,0,435,436,5,55,0,0,436,437,3,34,17,0,437,438,5, + 40,0,0,438,439,6,20,-1,0,439,766,1,0,0,0,440,441,5,56,0,0,441,442,3,34, + 17,0,442,443,5,40,0,0,443,444,6,20,-1,0,444,766,1,0,0,0,445,446,5,57,0, + 0,446,447,3,34,17,0,447,448,5,40,0,0,448,449,6,20,-1,0,449,766,1,0,0,0, + 450,451,5,58,0,0,451,452,3,34,17,0,452,453,5,40,0,0,453,454,6,20,-1,0, + 454,766,1,0,0,0,455,456,5,59,0,0,456,457,3,34,17,0,457,458,5,40,0,0,458, + 459,6,20,-1,0,459,766,1,0,0,0,460,461,5,60,0,0,461,462,3,34,17,0,462,463, + 5,40,0,0,463,464,6,20,-1,0,464,766,1,0,0,0,465,466,5,61,0,0,466,467,3, + 34,17,0,467,468,5,40,0,0,468,469,6,20,-1,0,469,766,1,0,0,0,470,471,5,62, + 0,0,471,472,3,34,17,0,472,473,5,40,0,0,473,474,6,20,-1,0,474,766,1,0,0, + 0,475,476,5,63,0,0,476,477,3,34,17,0,477,478,5,40,0,0,478,479,6,20,-1, + 0,479,766,1,0,0,0,480,481,5,64,0,0,481,482,3,34,17,0,482,483,5,40,0,0, + 483,484,6,20,-1,0,484,766,1,0,0,0,485,486,5,65,0,0,486,487,3,34,17,0,487, + 488,5,40,0,0,488,489,6,20,-1,0,489,766,1,0,0,0,490,491,5,66,0,0,491,492, + 3,34,17,0,492,493,5,40,0,0,493,494,6,20,-1,0,494,766,1,0,0,0,495,496,5, + 67,0,0,496,497,3,34,17,0,497,498,5,40,0,0,498,499,6,20,-1,0,499,766,1, + 0,0,0,500,501,5,68,0,0,501,502,3,34,17,0,502,503,5,40,0,0,503,504,6,20, + -1,0,504,766,1,0,0,0,505,506,5,69,0,0,506,507,3,34,17,0,507,508,5,40,0, + 0,508,509,6,20,-1,0,509,766,1,0,0,0,510,511,5,70,0,0,511,512,3,34,17,0, + 512,513,5,40,0,0,513,514,6,20,-1,0,514,766,1,0,0,0,515,516,5,71,0,0,516, + 517,3,34,17,0,517,518,5,40,0,0,518,519,6,20,-1,0,519,766,1,0,0,0,520,521, + 5,72,0,0,521,522,3,34,17,0,522,523,5,40,0,0,523,524,6,20,-1,0,524,766, + 1,0,0,0,525,526,5,73,0,0,526,527,3,34,17,0,527,528,5,40,0,0,528,529,6, + 20,-1,0,529,766,1,0,0,0,530,531,5,74,0,0,531,532,3,34,17,0,532,533,5,40, + 0,0,533,534,6,20,-1,0,534,766,1,0,0,0,535,536,5,75,0,0,536,537,3,34,17, + 0,537,538,5,40,0,0,538,539,6,20,-1,0,539,766,1,0,0,0,540,541,5,76,0,0, + 541,542,3,34,17,0,542,543,5,40,0,0,543,544,6,20,-1,0,544,766,1,0,0,0,545, + 546,5,77,0,0,546,547,3,34,17,0,547,548,5,40,0,0,548,549,6,20,-1,0,549, + 766,1,0,0,0,550,551,5,78,0,0,551,552,3,34,17,0,552,553,5,40,0,0,553,554, + 6,20,-1,0,554,766,1,0,0,0,555,556,5,79,0,0,556,557,3,34,17,0,557,558,5, + 40,0,0,558,559,6,20,-1,0,559,766,1,0,0,0,560,561,5,80,0,0,561,562,3,34, + 17,0,562,563,5,40,0,0,563,564,6,20,-1,0,564,766,1,0,0,0,565,566,5,81,0, + 0,566,567,3,34,17,0,567,568,5,40,0,0,568,569,6,20,-1,0,569,766,1,0,0,0, + 570,571,5,82,0,0,571,572,3,34,17,0,572,573,5,40,0,0,573,574,6,20,-1,0, + 574,766,1,0,0,0,575,576,5,83,0,0,576,577,3,34,17,0,577,578,5,40,0,0,578, + 579,6,20,-1,0,579,766,1,0,0,0,580,581,5,84,0,0,581,582,3,34,17,0,582,583, + 5,40,0,0,583,584,6,20,-1,0,584,766,1,0,0,0,585,586,5,85,0,0,586,587,3, + 34,17,0,587,588,5,40,0,0,588,589,6,20,-1,0,589,766,1,0,0,0,590,591,5,86, + 0,0,591,592,3,34,17,0,592,593,5,40,0,0,593,594,6,20,-1,0,594,766,1,0,0, + 0,595,596,5,87,0,0,596,597,3,34,17,0,597,598,5,40,0,0,598,599,6,20,-1, + 0,599,766,1,0,0,0,600,601,5,88,0,0,601,602,3,34,17,0,602,603,5,40,0,0, + 603,604,6,20,-1,0,604,766,1,0,0,0,605,606,5,89,0,0,606,607,3,34,17,0,607, + 608,5,40,0,0,608,609,6,20,-1,0,609,766,1,0,0,0,610,611,5,90,0,0,611,612, + 3,34,17,0,612,613,5,40,0,0,613,614,6,20,-1,0,614,766,1,0,0,0,615,616,5, + 91,0,0,616,617,3,34,17,0,617,618,5,40,0,0,618,619,6,20,-1,0,619,766,1, + 0,0,0,620,621,5,92,0,0,621,622,3,34,17,0,622,623,5,40,0,0,623,624,6,20, + -1,0,624,766,1,0,0,0,625,626,5,93,0,0,626,627,3,34,17,0,627,628,5,40,0, + 0,628,629,6,20,-1,0,629,766,1,0,0,0,630,631,5,94,0,0,631,632,3,34,17,0, + 632,633,5,40,0,0,633,634,6,20,-1,0,634,766,1,0,0,0,635,636,5,95,0,0,636, + 637,3,34,17,0,637,638,5,40,0,0,638,639,6,20,-1,0,639,766,1,0,0,0,640,641, + 5,96,0,0,641,642,3,34,17,0,642,643,5,40,0,0,643,644,6,20,-1,0,644,766, + 1,0,0,0,645,646,5,97,0,0,646,647,3,34,17,0,647,648,5,40,0,0,648,649,6, + 20,-1,0,649,766,1,0,0,0,650,651,5,98,0,0,651,652,3,34,17,0,652,653,5,40, + 0,0,653,654,6,20,-1,0,654,766,1,0,0,0,655,656,5,99,0,0,656,657,3,34,17, + 0,657,658,5,40,0,0,658,659,6,20,-1,0,659,766,1,0,0,0,660,661,5,100,0,0, + 661,662,3,34,17,0,662,663,5,40,0,0,663,664,6,20,-1,0,664,766,1,0,0,0,665, + 666,5,101,0,0,666,667,3,34,17,0,667,668,5,40,0,0,668,669,6,20,-1,0,669, + 766,1,0,0,0,670,671,5,102,0,0,671,672,3,34,17,0,672,673,5,40,0,0,673,674, + 6,20,-1,0,674,766,1,0,0,0,675,676,5,103,0,0,676,677,3,34,17,0,677,678, + 5,40,0,0,678,679,6,20,-1,0,679,766,1,0,0,0,680,681,5,104,0,0,681,682,3, + 34,17,0,682,683,5,40,0,0,683,684,6,20,-1,0,684,766,1,0,0,0,685,686,5,105, + 0,0,686,687,3,34,17,0,687,688,5,40,0,0,688,689,6,20,-1,0,689,766,1,0,0, + 0,690,691,5,106,0,0,691,692,3,34,17,0,692,693,5,40,0,0,693,694,6,20,-1, + 0,694,766,1,0,0,0,695,696,5,107,0,0,696,697,3,34,17,0,697,698,5,40,0,0, + 698,699,6,20,-1,0,699,766,1,0,0,0,700,701,5,108,0,0,701,702,3,34,17,0, + 702,703,5,40,0,0,703,704,6,20,-1,0,704,766,1,0,0,0,705,706,5,109,0,0,706, + 707,3,34,17,0,707,708,5,40,0,0,708,709,6,20,-1,0,709,766,1,0,0,0,710,711, + 5,110,0,0,711,712,3,34,17,0,712,713,5,40,0,0,713,714,6,20,-1,0,714,766, + 1,0,0,0,715,716,5,111,0,0,716,717,3,34,17,0,717,718,5,40,0,0,718,719,6, + 20,-1,0,719,766,1,0,0,0,720,721,5,112,0,0,721,722,3,34,17,0,722,723,5, + 40,0,0,723,724,6,20,-1,0,724,766,1,0,0,0,725,726,5,113,0,0,726,727,3,34, + 17,0,727,728,5,40,0,0,728,729,6,20,-1,0,729,766,1,0,0,0,730,731,5,114, + 0,0,731,732,3,34,17,0,732,733,5,40,0,0,733,734,6,20,-1,0,734,766,1,0,0, + 0,735,736,5,115,0,0,736,737,3,34,17,0,737,738,5,40,0,0,738,739,6,20,-1, + 0,739,766,1,0,0,0,740,741,5,116,0,0,741,742,3,34,17,0,742,743,5,40,0,0, + 743,744,6,20,-1,0,744,766,1,0,0,0,745,746,5,117,0,0,746,747,3,34,17,0, + 747,748,5,40,0,0,748,749,6,20,-1,0,749,766,1,0,0,0,750,751,5,118,0,0,751, + 752,3,34,17,0,752,753,5,40,0,0,753,754,6,20,-1,0,754,766,1,0,0,0,755,756, + 5,119,0,0,756,757,3,34,17,0,757,758,5,40,0,0,758,759,6,20,-1,0,759,766, + 1,0,0,0,760,761,5,120,0,0,761,762,3,34,17,0,762,763,5,40,0,0,763,764,6, + 20,-1,0,764,766,1,0,0,0,765,313,1,0,0,0,765,315,1,0,0,0,765,317,1,0,0, + 0,765,319,1,0,0,0,765,321,1,0,0,0,765,323,1,0,0,0,765,325,1,0,0,0,765, + 330,1,0,0,0,765,335,1,0,0,0,765,340,1,0,0,0,765,345,1,0,0,0,765,350,1, + 0,0,0,765,355,1,0,0,0,765,360,1,0,0,0,765,365,1,0,0,0,765,370,1,0,0,0, + 765,375,1,0,0,0,765,380,1,0,0,0,765,385,1,0,0,0,765,390,1,0,0,0,765,395, + 1,0,0,0,765,400,1,0,0,0,765,405,1,0,0,0,765,410,1,0,0,0,765,415,1,0,0, + 0,765,420,1,0,0,0,765,425,1,0,0,0,765,430,1,0,0,0,765,435,1,0,0,0,765, + 440,1,0,0,0,765,445,1,0,0,0,765,450,1,0,0,0,765,455,1,0,0,0,765,460,1, + 0,0,0,765,465,1,0,0,0,765,470,1,0,0,0,765,475,1,0,0,0,765,480,1,0,0,0, + 765,485,1,0,0,0,765,490,1,0,0,0,765,495,1,0,0,0,765,500,1,0,0,0,765,505, + 1,0,0,0,765,510,1,0,0,0,765,515,1,0,0,0,765,520,1,0,0,0,765,525,1,0,0, + 0,765,530,1,0,0,0,765,535,1,0,0,0,765,540,1,0,0,0,765,545,1,0,0,0,765, + 550,1,0,0,0,765,555,1,0,0,0,765,560,1,0,0,0,765,565,1,0,0,0,765,570,1, + 0,0,0,765,575,1,0,0,0,765,580,1,0,0,0,765,585,1,0,0,0,765,590,1,0,0,0, + 765,595,1,0,0,0,765,600,1,0,0,0,765,605,1,0,0,0,765,610,1,0,0,0,765,615, + 1,0,0,0,765,620,1,0,0,0,765,625,1,0,0,0,765,630,1,0,0,0,765,635,1,0,0, + 0,765,640,1,0,0,0,765,645,1,0,0,0,765,650,1,0,0,0,765,655,1,0,0,0,765, + 660,1,0,0,0,765,665,1,0,0,0,765,670,1,0,0,0,765,675,1,0,0,0,765,680,1, + 0,0,0,765,685,1,0,0,0,765,690,1,0,0,0,765,695,1,0,0,0,765,700,1,0,0,0, + 765,705,1,0,0,0,765,710,1,0,0,0,765,715,1,0,0,0,765,720,1,0,0,0,765,725, + 1,0,0,0,765,730,1,0,0,0,765,735,1,0,0,0,765,740,1,0,0,0,765,745,1,0,0, + 0,765,750,1,0,0,0,765,755,1,0,0,0,765,760,1,0,0,0,766,41,1,0,0,0,767,768, + 3,32,16,0,768,769,5,0,0,1,769,770,6,21,-1,0,770,43,1,0,0,0,31,51,59,67, + 69,76,86,96,101,113,115,128,130,143,145,166,168,179,196,203,219,231,233, + 244,257,259,272,274,283,296,299,765 }; public static readonly ATN _ATN = diff --git a/Sources/AngouriMath/Core/Entity/Discrete/Entity.Discrete.Classes.cs b/Sources/AngouriMath/Core/Entity/Discrete/Entity.Discrete.Classes.cs index 077e3f042..acbe1ce2b 100644 --- a/Sources/AngouriMath/Core/Entity/Discrete/Entity.Discrete.Classes.cs +++ b/Sources/AngouriMath/Core/Entity/Discrete/Entity.Discrete.Classes.cs @@ -171,7 +171,7 @@ public override Entity Replace(Func func) /// public sealed partial record Impliesf(Entity Assumption, Entity Conclusion) : Statement, IBinaryNode { - internal override Priority Priority => Priority.Impliciation; + internal override Priority Priority => Priority.Implication; public Entity NodeFirstChild => Assumption; diff --git a/Sources/AngouriMath/Core/Entity/Discrete/Entity.Discrete.Definition.cs b/Sources/AngouriMath/Core/Entity/Discrete/Entity.Discrete.Definition.cs index 8cd66612e..3dbc6329e 100644 --- a/Sources/AngouriMath/Core/Entity/Discrete/Entity.Discrete.Definition.cs +++ b/Sources/AngouriMath/Core/Entity/Discrete/Entity.Discrete.Definition.cs @@ -70,8 +70,39 @@ public abstract partial record ComparisonSign : Statement /// A node public Entity Implies(Entity conclusion) => new Impliesf(this, conclusion); + /// + /// Creates an equality comparison that may chain with previous comparisons. + /// When used after another comparison (e.g., a < b), this creates a chain: a < b = c. + /// When used on a non-comparison expression, this creates a simple equality: x = y. + /// For explicit non-chained equality comparisons, use . + /// + /// + /// + /// // Chained: creates "a < b and b = c" + /// var chained = (a < b).Equalizes(c); + /// + /// // Non-chained: creates "(a < b) = (c < d)" + /// var direct = (a < b).EqualTo(c < d); + /// + /// /// A node public Entity Equalizes(Entity another) => HangOperator(this, another, (a, b) => new Equalsf(a, b)); + /// + /// Creates an equality comparison without chaining. + /// Use this to directly compare two expressions, e.g., (a < b).EqualTo(c < d) creates (a < b) = (c < d). + /// Unlike , this will never chain with previous comparisons. + /// + /// + /// + /// // Chained: creates "a < b and b = c" + /// var chained = (a < b).Equalizes(c); + /// + /// // Non-chained: creates "(a < b) = (c < d)" + /// var direct = (a < b).EqualTo(c < d); + /// + /// + /// A node + public Entity EqualTo(Entity another) => new Equalsf(this, another); /// A node public static Entity operator >(Entity a, Entity b) => HangOperator(a, b, (a, b) => new Greaterf(a, b)); diff --git a/Sources/AngouriMath/Core/Entity/Entity.Definition.cs b/Sources/AngouriMath/Core/Entity/Entity.Definition.cs index a2fafd958..5a2ba04a4 100644 --- a/Sources/AngouriMath/Core/Entity/Entity.Definition.cs +++ b/Sources/AngouriMath/Core/Entity/Entity.Definition.cs @@ -22,11 +22,11 @@ internal enum Priority BooleanOperation = 0x1000, - Impliciation = 10 | BooleanOperation, + Implication = 10 | BooleanOperation, Disjunction = 30 | BooleanOperation, - XDisjunction = 30 | BooleanOperation, - Conjunction = 50 | BooleanOperation, - Negation = 70 | BooleanOperation, + XDisjunction = 50 | BooleanOperation, + Conjunction = 70 | BooleanOperation, + Negation = 90 | BooleanOperation, EqualitySignsOperation = 0x2000, @@ -39,8 +39,8 @@ internal enum Priority SetOperation = 0x3000, ContainsIn = 10 | SetOperation, + Union = 20 | SetOperation, SetMinus = 20 | SetOperation, - Union = 30 | SetOperation, Intersection = 40 | SetOperation, NumericalOperation = 0x4000, diff --git a/Sources/AngouriMath/Functions/Continuous/Differentiation.cs b/Sources/AngouriMath/Functions/Continuous/Differentiation.cs index 55ceac71d..0ff4c9353 100644 --- a/Sources/AngouriMath/Functions/Continuous/Differentiation.cs +++ b/Sources/AngouriMath/Functions/Continuous/Differentiation.cs @@ -313,7 +313,7 @@ partial record Absf { /// protected override Entity InnerDifferentiate(Variable variable) - => MathS.Signum(Argument).Provided(!Argument.Equalizes(Integer.Zero)) * Argument.InnerDifferentiate(variable); + => MathS.Signum(Argument).Provided(!Argument.EqualTo(Integer.Zero)) * Argument.InnerDifferentiate(variable); } partial record Providedf diff --git a/Sources/AngouriMath/Functions/Continuous/Integration/IntegralPatterns.cs b/Sources/AngouriMath/Functions/Continuous/Integration/IntegralPatterns.cs index dbc38bf13..e83b6f378 100644 --- a/Sources/AngouriMath/Functions/Continuous/Integration/IntegralPatterns.cs +++ b/Sources/AngouriMath/Functions/Continuous/Integration/IntegralPatterns.cs @@ -92,9 +92,9 @@ private static Entity IntegrateRationalQuadratic(Entity numerator, Entity a, Ent // Return as piecewise based on a and discriminant return MathS.Piecewise([ - new Entity.Providedf(linearCase, a.Equalizes(0)), + new Entity.Providedf(linearCase, a.EqualTo(0)), new Entity.Providedf(arctanCase, discriminant > 0), - new Entity.Providedf(perfectSquareCase, discriminant.Equalizes(0)), + new Entity.Providedf(perfectSquareCase, discriminant.EqualTo(0)), new Entity.Providedf(lnCase, discriminant < 0) ]).InnerSimplified; } diff --git a/Sources/AngouriMath/Functions/Continuous/Solvers/EquationSolver/ExponentialSolver.cs b/Sources/AngouriMath/Functions/Continuous/Solvers/EquationSolver/ExponentialSolver.cs index 5e7919e95..9e769d0e3 100644 --- a/Sources/AngouriMath/Functions/Continuous/Solvers/EquationSolver/ExponentialSolver.cs +++ b/Sources/AngouriMath/Functions/Continuous/Solvers/EquationSolver/ExponentialSolver.cs @@ -32,7 +32,7 @@ internal static class ExponentialSolver // If base is definitely 0, keep original form (will likely fail to solve anyway) Complex { IsZero: true } => e, // For symbolic bases that might be zero, add condition - _ => (NonZeroPow(@base, b) * NonZeroPow(NonZeroPow(MathS.e, x), MathS.Ln(@base) * a)).Provided(!@base.Equalizes(0)) + _ => (NonZeroPow(@base, b) * NonZeroPow(NonZeroPow(MathS.e, x), MathS.Ln(@base) * a)).Provided(!@base.EqualTo(0)) }, _ => e, }; diff --git a/Sources/AngouriMath/Functions/Evaluation/Evaluation.Continuous/Evaluation.Continuous.Arithmetics.Classes.cs b/Sources/AngouriMath/Functions/Evaluation/Evaluation.Continuous/Evaluation.Continuous.Arithmetics.Classes.cs index 2c79d42a1..3ea381b84 100644 --- a/Sources/AngouriMath/Functions/Evaluation/Evaluation.Continuous/Evaluation.Continuous.Arithmetics.Classes.cs +++ b/Sources/AngouriMath/Functions/Evaluation/Evaluation.Continuous/Evaluation.Continuous.Arithmetics.Classes.cs @@ -82,7 +82,7 @@ protected override Entity InnerSimplify(bool isExact) => public partial record Divf { // Division is undefined when the divisor equals zero - private protected override Entity IntrinsicCondition => !Divisor.Equalizes(0); + private protected override Entity IntrinsicCondition => !Divisor.EqualTo(0); /// protected override Entity InnerSimplify(bool isExact) => @@ -106,7 +106,7 @@ public partial record Powf // - 0^0 is indeterminate // - 0^(negative) is undefined (division by zero) private protected override Entity IntrinsicCondition => - (!Base.Equalizes(0) | Exponent > 0); + (!Base.EqualTo(0) | Exponent > 0); private static bool TryPower(Matrix m, int exp, out Entity res) { @@ -145,7 +145,7 @@ x.Evaled is Complex c ? c.IsZero ? throw new AngouriBugException("Should have already been handled by the above case") : 1 - : new Providedf(1, !x.Equalizes(0)), + : new Providedf(1, !x.EqualTo(0)), (var n1, Integer(1)) => n1, _ => null }, @@ -159,7 +159,7 @@ public partial record Logf // - antilogarithm <= 0 // For complex logarithms, we use the principal branch private protected override Entity IntrinsicCondition => - Base > 0 & !Base.Equalizes(1) & Antilogarithm > 0; + Base > 0 & !Base.EqualTo(1) & Antilogarithm > 0; /// protected override Entity InnerSimplify(bool isExact) => diff --git a/Sources/AngouriMath/Functions/Evaluation/Evaluation.Continuous/Evaluation.Continuous.Trigonometry.Classes.cs b/Sources/AngouriMath/Functions/Evaluation/Evaluation.Continuous/Evaluation.Continuous.Trigonometry.Classes.cs index 4c150c0f0..a202e5584 100644 --- a/Sources/AngouriMath/Functions/Evaluation/Evaluation.Continuous/Evaluation.Continuous.Trigonometry.Classes.cs +++ b/Sources/AngouriMath/Functions/Evaluation/Evaluation.Continuous/Evaluation.Continuous.Trigonometry.Classes.cs @@ -70,7 +70,7 @@ protected override Entity InnerSimplify(bool isExact) => public partial record Secantf { - private protected override Entity IntrinsicCondition => !MathS.Cos(Argument).Equalizes(0); // Sec(x) = 1/cos(x) is undefined when cos(x) = 0 + private protected override Entity IntrinsicCondition => !MathS.Cos(Argument).EqualTo(0); // Sec(x) = 1/cos(x) is undefined when cos(x) = 0 /// protected override Entity InnerSimplify(bool isExact) => InnerEvalZeroedSinCosConditions.IsCosDefinitelyZero(Argument.InnerSimplified) ? MathS.NaN @@ -90,7 +90,7 @@ protected override Entity InnerSimplify(bool isExact) => public partial record Cosecantf { - private protected override Entity IntrinsicCondition => !MathS.Sin(Argument).Equalizes(0); // Csc(x) = 1/sin(x) is undefined when sin(x) = 0 + private protected override Entity IntrinsicCondition => !MathS.Sin(Argument).EqualTo(0); // Csc(x) = 1/sin(x) is undefined when sin(x) = 0 /// protected override Entity InnerSimplify(bool isExact) => InnerEvalZeroedSinCosConditions.IsSinDefinitelyZero(Argument.InnerSimplified) ? MathS.NaN @@ -113,7 +113,7 @@ public partial record Arcsecantf private protected override Entity IntrinsicCondition => Codomain < Domain.Complex ? MathS.Abs(Argument) >= 1 // Arcsec is defined for |x| >= 1 for reals - : !Argument.Equalizes(0); // Arcsec is undefined at 0 in complex + : !Argument.EqualTo(0); // Arcsec is undefined at 0 in complex /// protected override Entity InnerSimplify(bool isExact) => ExpandOnOneArgument(Argument, @@ -130,7 +130,7 @@ public partial record Arccosecantf private protected override Entity IntrinsicCondition => Codomain < Domain.Complex ? MathS.Abs(Argument) >= 1 // Arccsc is defined for |x| >= 1 for reals - : !Argument.Equalizes(0); // Arccsc is undefined at 0 in complex + : !Argument.EqualTo(0); // Arccsc is undefined at 0 in complex /// protected override Entity InnerSimplify(bool isExact) => ExpandOnOneArgument(Argument, @@ -145,7 +145,7 @@ protected override Entity InnerSimplify(bool isExact) => public partial record Tanf { private protected override Entity IntrinsicCondition => - !MathS.Cos(Argument).Equalizes(0); // Tan(x) = sin(x)/cos(x) is undefined when cos(x) = 0 + !MathS.Cos(Argument).EqualTo(0); // Tan(x) = sin(x)/cos(x) is undefined when cos(x) = 0 /// protected override Entity InnerSimplify(bool isExact) => @@ -164,7 +164,7 @@ protected override Entity InnerSimplify(bool isExact) => public partial record Cotanf { - private protected override Entity IntrinsicCondition => !MathS.Sin(Argument).Equalizes(0); // Cotan(x) = cos(x)/sin(x) is undefined when sin(x) = 0 + private protected override Entity IntrinsicCondition => !MathS.Sin(Argument).EqualTo(0); // Cotan(x) = cos(x)/sin(x) is undefined when sin(x) = 0 /// protected override Entity InnerSimplify(bool isExact) => InnerEvalZeroedSinCosConditions.IsSinDefinitelyZero(Argument.InnerSimplified) ? MathS.NaN diff --git a/Sources/AngouriMath/Functions/Output/ToString/ToString.Omni.Classes.cs b/Sources/AngouriMath/Functions/Output/ToString/ToString.Omni.Classes.cs index 14fb011a0..00b04d43d 100644 --- a/Sources/AngouriMath/Functions/Output/ToString/ToString.Omni.Classes.cs +++ b/Sources/AngouriMath/Functions/Output/ToString/ToString.Omni.Classes.cs @@ -127,7 +127,7 @@ public override string Stringize() partial record Providedf { /// - public override string Stringize() => $@"{Expression.Stringize()} provided {Predicate.Stringize()}"; + public override string Stringize() => $@"{Expression.Stringize(Expression.Priority <= Priority.Provided)} provided {Predicate.Stringize(Predicate.Priority < Priority.Provided)}"; /// public override string ToString() => Stringize(); } diff --git a/Sources/AngouriMath/Functions/Simplification/Patterns/Patterns.Common.cs b/Sources/AngouriMath/Functions/Simplification/Patterns/Patterns.Common.cs index 554f71f43..7db5a8b2a 100644 --- a/Sources/AngouriMath/Functions/Simplification/Patterns/Patterns.Common.cs +++ b/Sources/AngouriMath/Functions/Simplification/Patterns/Patterns.Common.cs @@ -166,21 +166,21 @@ internal static partial class Patterns when (var1, any1) == (var1a, any1a) => new Powf(var1, 2) - new Powf(any1, 2), // a / a - Divf(var any1, var any1a) when any1 == any1a => Integer.One.Provided(!any1.Equalizes(Integer.Zero)), + Divf(var any1, var any1a) when any1 == any1a => Integer.One.Provided(!any1.EqualTo(Integer.Zero)), // (a * c) / c - Divf(Mulf(var any1, var any2), var any2a) when any2 == any2a => any1.Provided(!any2.Equalizes(Integer.Zero)), - Divf(Mulf(var any2, var any1), var any2a) when any2 == any2a => any1.Provided(!any2.Equalizes(Integer.Zero)), - Divf(Mulf(var any1, var any2), Mulf(var any2a, var any3)) when any2 == any2a => (any1 / any3).Provided(!any2.Equalizes(Integer.Zero)), - Divf(Mulf(var any1, var any2), Mulf(var any3, var any2a)) when any2 == any2a => (any1 / any3).Provided(!any2.Equalizes(Integer.Zero)), - Divf(Mulf(var any2, var any1), Mulf(var any2a, var any3)) when any2 == any2a => (any1 / any3).Provided(!any2.Equalizes(Integer.Zero)), - Divf(Mulf(var any2, var any1), Mulf(var any3, var any2a)) when any2 == any2a => (any1 / any3).Provided(!any2.Equalizes(Integer.Zero)), + Divf(Mulf(var any1, var any2), var any2a) when any2 == any2a => any1.Provided(!any2.EqualTo(Integer.Zero)), + Divf(Mulf(var any2, var any1), var any2a) when any2 == any2a => any1.Provided(!any2.EqualTo(Integer.Zero)), + Divf(Mulf(var any1, var any2), Mulf(var any2a, var any3)) when any2 == any2a => (any1 / any3).Provided(!any2.EqualTo(Integer.Zero)), + Divf(Mulf(var any1, var any2), Mulf(var any3, var any2a)) when any2 == any2a => (any1 / any3).Provided(!any2.EqualTo(Integer.Zero)), + Divf(Mulf(var any2, var any1), Mulf(var any2a, var any3)) when any2 == any2a => (any1 / any3).Provided(!any2.EqualTo(Integer.Zero)), + Divf(Mulf(var any2, var any1), Mulf(var any3, var any2a)) when any2 == any2a => (any1 / any3).Provided(!any2.EqualTo(Integer.Zero)), // ({1} - {2}) / ({2} - {1}) - Divf(Minusf(var any1, var any2), Minusf(var any2a, var any1a) denom) when (any1, any2) == (any1a, any2a) => new Providedf(-1, !denom.Equalizes(0)), + Divf(Minusf(var any1, var any2), Minusf(var any2a, var any1a) denom) when (any1, any2) == (any1a, any2a) => new Providedf(-1, !denom.EqualTo(0)), // ({1} + {2}) / ({2} + {1}) - Divf(Sumf(var any1, var any2), Sumf(var any2a, var any1a) denom) when (any1, any2) == (any1a, any2a) => new Providedf(1, !denom.Equalizes(0)), + Divf(Sumf(var any1, var any2), Sumf(var any2a, var any1a) denom) when (any1, any2) == (any1a, any2a) => new Providedf(1, !denom.EqualTo(0)), // a / (b * {1}) Divf(Number const1, Mulf(Number const2, var any1)) => const1 / const2 / any1, @@ -215,7 +215,7 @@ internal static partial class Patterns Mulf(Absf(var any1), Absf(var any2)) => new Absf(any1 * any2), Divf(Absf(var any1), Absf(var any2)) => new Absf(any1 / any2), - Divf(Mulf(Signumf(var any1), Mulf(var any2, var any1a)), Absf(var any1b)) when any1 == any1a && any1a == any1b => any2.Provided(!any1.Equalizes(Integer.Zero)), + Divf(Mulf(Signumf(var any1), Mulf(var any2, var any1a)), Absf(var any1b)) when any1 == any1a && any1a == any1b => any2.Provided(!any1.EqualTo(Integer.Zero)), Mulf(Signumf(var any1), Absf(var any1a)) when any1 == any1a => any1, Mulf(Absf(var any1a), Signumf(var any1)) when any1 == any1a => any1, diff --git a/Sources/AngouriMath/Functions/Simplification/Patterns/Patterns.EqualityInequality.cs b/Sources/AngouriMath/Functions/Simplification/Patterns/Patterns.EqualityInequality.cs index dc747f928..9d4e8d874 100644 --- a/Sources/AngouriMath/Functions/Simplification/Patterns/Patterns.EqualityInequality.cs +++ b/Sources/AngouriMath/Functions/Simplification/Patterns/Patterns.EqualityInequality.cs @@ -72,13 +72,13 @@ private static bool OppositeSigns(ComparisonSign left, ComparisonSign right) Impliesf(Andf(Lessf(var any1, var any2), Lessf(var any2a, var any3)), Lessf(var any1a, var any3a)) when any1 == any1a && any2 == any2a && any3 == any3a => True.Provided(any1.DomainCondition).Provided(any2.DomainCondition).Provided(any3.DomainCondition), - Equalsf(var zero, var anyButZero) when IsZero(zero) && !IsZero(anyButZero) => anyButZero.Equalizes(zero), + Equalsf(var zero, var anyButZero) when IsZero(zero) && !IsZero(anyButZero) => anyButZero.EqualTo(zero), Greaterf(var zero, var anyButZero) when IsZero(zero) && !IsZero(anyButZero) => anyButZero < zero, Lessf(var zero, var anyButZero) when IsZero(zero) && !IsZero(anyButZero) => anyButZero > zero, GreaterOrEqualf(var zero, var anyButZero) when IsZero(zero) && !IsZero(anyButZero) => anyButZero <= zero, LessOrEqualf(var zero, var anyButZero) when IsZero(zero) && !IsZero(anyButZero) => anyButZero >= zero, - Equalsf(var @const, var anyButConst) when @const is Number && anyButConst is not Number => anyButConst.Equalizes(@const), + Equalsf(var @const, var anyButConst) when @const is Number && anyButConst is not Number => anyButConst.EqualTo(@const), Greaterf(var @const, var anyButConst) when @const is Number && anyButConst is not Number => anyButConst < @const, Lessf(var @const, var anyButConst) when @const is Number && anyButConst is not Number => anyButConst > @const, GreaterOrEqualf(var @const, var anyButConst) when @const is Number && anyButConst is not Number => anyButConst <= @const, @@ -89,48 +89,48 @@ private static bool OppositeSigns(ComparisonSign left, ComparisonSign right) left.DirectChildren[1] == right.DirectChildren[1] && OppositeSigns(left, right) => False, - Equalsf(Powf(var any1, var rePo), var zero) when IsRealPositive(rePo) && IsZero(zero) => any1.Equalizes(zero), - Equalsf(Divf(Integer(1), var expr), var zero) when IsZero(zero) => new Providedf(false, !expr.Equalizes(0)), + Equalsf(Powf(var any1, var rePo), var zero) when IsRealPositive(rePo) && IsZero(zero) => any1.EqualTo(zero), + Equalsf(Divf(Integer(1), var expr), var zero) when IsZero(zero) => new Providedf(false, !expr.EqualTo(0)), // The following set of patterns might be simplified // 4 * a ? 0 - Equalsf (Mulf(var rePo, var any1), var zeroEnt) when IsRealPositive(rePo) && IsZero(zeroEnt) => any1.Equalizes(Integer.Zero), + Equalsf (Mulf(var rePo, var any1), var zeroEnt) when IsRealPositive(rePo) && IsZero(zeroEnt) => any1.EqualTo(Integer.Zero), Greaterf (Mulf(var rePo, var any1), var zeroEnt) when IsRealPositive(rePo) && IsZero(zeroEnt) => any1 > Integer.Zero, GreaterOrEqualf(Mulf(var rePo, var any1), var zeroEnt) when IsRealPositive(rePo) && IsZero(zeroEnt) => any1 >= Integer.Zero, Lessf (Mulf(var rePo, var any1), var zeroEnt) when IsRealPositive(rePo) && IsZero(zeroEnt) => any1 < Integer.Zero, LessOrEqualf (Mulf(var rePo, var any1), var zeroEnt) when IsRealPositive(rePo) && IsZero(zeroEnt) => any1 <= Integer.Zero, // a * 4 ? 0 - Equalsf (Mulf(var any1, var rePo), var zeroEnt) when IsRealPositive(rePo) && IsZero(zeroEnt) => any1.Equalizes(Integer.Zero), + Equalsf (Mulf(var any1, var rePo), var zeroEnt) when IsRealPositive(rePo) && IsZero(zeroEnt) => any1.EqualTo(Integer.Zero), Greaterf (Mulf(var any1, var rePo), var zeroEnt) when IsRealPositive(rePo) && IsZero(zeroEnt) => any1 > Integer.Zero, GreaterOrEqualf(Mulf(var any1, var rePo), var zeroEnt) when IsRealPositive(rePo) && IsZero(zeroEnt) => any1 >= Integer.Zero, Lessf (Mulf(var any1, var rePo), var zeroEnt) when IsRealPositive(rePo) && IsZero(zeroEnt) => any1 < Integer.Zero, LessOrEqualf (Mulf(var any1, var rePo), var zeroEnt) when IsRealPositive(rePo) && IsZero(zeroEnt) => any1 <= Integer.Zero, // -4 * a ? 0 - Equalsf (Mulf(var rePo, var any1), var zeroEnt) when IsRealNegative(rePo) && IsZero(zeroEnt) => any1.Equalizes(Integer.Zero), + Equalsf (Mulf(var rePo, var any1), var zeroEnt) when IsRealNegative(rePo) && IsZero(zeroEnt) => any1.EqualTo(Integer.Zero), Greaterf (Mulf(var rePo, var any1), var zeroEnt) when IsRealNegative(rePo) && IsZero(zeroEnt) => any1 < Integer.Zero, GreaterOrEqualf(Mulf(var rePo, var any1), var zeroEnt) when IsRealNegative(rePo) && IsZero(zeroEnt) => any1 <= Integer.Zero, Lessf (Mulf(var rePo, var any1), var zeroEnt) when IsRealNegative(rePo) && IsZero(zeroEnt) => any1 > Integer.Zero, LessOrEqualf (Mulf(var rePo, var any1), var zeroEnt) when IsRealNegative(rePo) && IsZero(zeroEnt) => any1 >= Integer.Zero, // a * -4 ? 0 - Equalsf (Mulf(var any1, var rePo), var zeroEnt) when IsRealNegative(rePo) && IsZero(zeroEnt) => any1.Equalizes(Integer.Zero), + Equalsf (Mulf(var any1, var rePo), var zeroEnt) when IsRealNegative(rePo) && IsZero(zeroEnt) => any1.EqualTo(Integer.Zero), Greaterf (Mulf(var any1, var rePo), var zeroEnt) when IsRealNegative(rePo) && IsZero(zeroEnt) => any1 < Integer.Zero, GreaterOrEqualf(Mulf(var any1, var rePo), var zeroEnt) when IsRealNegative(rePo) && IsZero(zeroEnt) => any1 <= Integer.Zero, Lessf (Mulf(var any1, var rePo), var zeroEnt) when IsRealNegative(rePo) && IsZero(zeroEnt) => any1 > Integer.Zero, LessOrEqualf (Mulf(var any1, var rePo), var zeroEnt) when IsRealNegative(rePo) && IsZero(zeroEnt) => any1 >= Integer.Zero, // a / 4 ? 0 - Equalsf (Divf(var any1, var rePo), var zeroEnt) when IsRealPositive(rePo) && IsZero(zeroEnt) => any1.Equalizes(Integer.Zero), + Equalsf (Divf(var any1, var rePo), var zeroEnt) when IsRealPositive(rePo) && IsZero(zeroEnt) => any1.EqualTo(Integer.Zero), Greaterf (Divf(var any1, var rePo), var zeroEnt) when IsRealPositive(rePo) && IsZero(zeroEnt) => any1 > Integer.Zero, GreaterOrEqualf(Divf(var any1, var rePo), var zeroEnt) when IsRealPositive(rePo) && IsZero(zeroEnt) => any1 >= Integer.Zero, Lessf (Divf(var any1, var rePo), var zeroEnt) when IsRealPositive(rePo) && IsZero(zeroEnt) => any1 < Integer.Zero, LessOrEqualf (Divf(var any1, var rePo), var zeroEnt) when IsRealPositive(rePo) && IsZero(zeroEnt) => any1 <= Integer.Zero, // a / -4 ? 0 - Equalsf (Divf(var any1, var rePo), var zeroEnt) when IsRealNegative(rePo) && IsZero(zeroEnt) => any1.Equalizes(Integer.Zero), + Equalsf (Divf(var any1, var rePo), var zeroEnt) when IsRealNegative(rePo) && IsZero(zeroEnt) => any1.EqualTo(Integer.Zero), Greaterf (Divf(var any1, var rePo), var zeroEnt) when IsRealNegative(rePo) && IsZero(zeroEnt) => any1 < Integer.Zero, GreaterOrEqualf(Divf(var any1, var rePo), var zeroEnt) when IsRealNegative(rePo) && IsZero(zeroEnt) => any1 <= Integer.Zero, Lessf (Divf(var any1, var rePo), var zeroEnt) when IsRealNegative(rePo) && IsZero(zeroEnt) => any1 > Integer.Zero, diff --git a/Sources/AngouriMath/Functions/Simplification/Patterns/Patterns.Power.cs b/Sources/AngouriMath/Functions/Simplification/Patterns/Patterns.Power.cs index b63e4a72d..985e124fc 100644 --- a/Sources/AngouriMath/Functions/Simplification/Patterns/Patterns.Power.cs +++ b/Sources/AngouriMath/Functions/Simplification/Patterns/Patterns.Power.cs @@ -25,7 +25,7 @@ expr is Sumf(var any1, Mulf(Real { IsNegative: true } const1, var any2)) internal static Entity PowerRules(Entity x) => x switch { // {} / {} = 1 provided not {} = 0 - Divf(var any1, var any1a) when any1 == any1a => new Providedf(1, !any1.Equalizes(0)), + Divf(var any1, var any1a) when any1 == any1a => new Providedf(1, !any1.EqualTo(0)), // {1}^({2} / log({3}, {1})) = {3}^{2} Powf(var any1, Divf(var any2, Logf(var any3, var any1a))) when any1 == any1a => new Powf(any3, any2), diff --git a/Sources/AngouriMath/Functions/Simplification/Patterns/Patterns.Sets.cs b/Sources/AngouriMath/Functions/Simplification/Patterns/Patterns.Sets.cs index fcc29bb32..2f3ab81cf 100644 --- a/Sources/AngouriMath/Functions/Simplification/Patterns/Patterns.Sets.cs +++ b/Sources/AngouriMath/Functions/Simplification/Patterns/Patterns.Sets.cs @@ -22,7 +22,7 @@ internal static partial class Patterns SetMinusf(var any1, var any1a) when any1 == any1a => Empty, ConditionalSet(var var1, Inf(var var1a, var set)) when var1 == var1a => set, - Inf(var var1, FiniteSet finite) when finite.Count == 1 => var1.Equalizes(finite.First()), + Inf(var var1, FiniteSet finite) when finite.Count == 1 => var1.EqualTo(finite.First()), Inf(not Set and not Matrix and var var, Interval(var left, var leftClosed, var right, var rightClosed)) => Simplificator.ParaphraseInterval(var, left, leftClosed, right, rightClosed), diff --git a/Sources/AngouriMath/Functions/Simplification/Simplificator.cs b/Sources/AngouriMath/Functions/Simplification/Simplificator.cs index 6ac1100cb..0abcad482 100644 --- a/Sources/AngouriMath/Functions/Simplification/Simplificator.cs +++ b/Sources/AngouriMath/Functions/Simplification/Simplificator.cs @@ -228,10 +228,10 @@ internal static Entity ParaphraseInterval(Entity entity, Entity left, bool leftC { var leftCon = ConditionallyGreater(entity, left); if (leftClosed) - leftCon |= entity.Equalizes(left); + leftCon |= entity.EqualTo(left); var rightCon = ConditionallyGreater(right, entity); if (rightClosed) - rightCon |= entity.Equalizes(right); + rightCon |= entity.EqualTo(right); return leftCon & rightCon; } diff --git a/Sources/Tests/UnitTests/Calculus/IntegrationTest.cs b/Sources/Tests/UnitTests/Calculus/IntegrationTest.cs index 7a7efb29f..b36f9010e 100644 --- a/Sources/Tests/UnitTests/Calculus/IntegrationTest.cs +++ b/Sources/Tests/UnitTests/Calculus/IntegrationTest.cs @@ -34,7 +34,7 @@ public sealed class IntegrationTest [InlineData("e^e^x", "integral(e ^ e ^ x, x)")] // don't recurse infinitely public void TestIndefinite(string initial, string expected) { - Assert.Equal(MathS.Boolean.True, initial.Integrate("x").Equalizes(expected).Simplify()); + Assert.Equal(MathS.Boolean.True, initial.Integrate("x").EqualTo(expected).Simplify()); } [Theory] [InlineData("2x * e ^ (x2)", "e ^ (x2) + C")] @@ -45,7 +45,7 @@ public void TestExponentialSubstitution(string initial, string expected) { var result = initial.Integrate("x").InnerSimplified; var expectedResult = expected.ToEntity().InnerSimplified; - Assert.Equal(MathS.Boolean.True, result.Equalizes(expectedResult).Simplify()); + Assert.Equal(MathS.Boolean.True, result.EqualTo(expectedResult).Simplify()); } [Theory] @@ -56,7 +56,7 @@ public void TestTrigonometricSubstitution(string initial, string expected) { var result = initial.Integrate("x").InnerSimplified; var expectedResult = expected.ToEntity().InnerSimplified; - Assert.Equal(MathS.Boolean.True, result.Equalizes(expectedResult).Simplify()); + Assert.Equal(MathS.Boolean.True, result.EqualTo(expectedResult).Simplify()); } [Theory] @@ -67,7 +67,7 @@ public void TestRationalFunctionSubstitution(string initial, string expected) { var result = initial.Integrate("x").InnerSimplified; var expectedResult = expected.ToEntity().InnerSimplified; - Assert.Equal(MathS.Boolean.True, result.Equalizes(expectedResult).Simplify()); + Assert.Equal(MathS.Boolean.True, result.EqualTo(expectedResult).Simplify()); } [Theory] @@ -77,7 +77,7 @@ public void TestPowerSubstitution(string initial, string expected) { var result = initial.Integrate("x").InnerSimplified; var expectedResult = expected.ToEntity().InnerSimplified; - Assert.Equal(MathS.Boolean.True, result.Equalizes(expectedResult).Simplify()); + Assert.Equal(MathS.Boolean.True, result.EqualTo(expectedResult).Simplify()); } [Theory] @@ -88,7 +88,7 @@ public void TestLinearSubstitution(string initial, string expected) { var result = initial.Integrate("x").InnerSimplified; var expectedResult = expected.ToEntity().InnerSimplified; - Assert.Equal(MathS.Boolean.True, result.Equalizes(expectedResult).Simplify()); + Assert.Equal(MathS.Boolean.True, result.EqualTo(expectedResult).Simplify()); } [Theory] @@ -98,7 +98,7 @@ public void TestSquareRootSubstitution(string initial, string expected) { var result = initial.Integrate("x").InnerSimplified; var expectedResult = expected.ToEntity().InnerSimplified; - Assert.Equal(MathS.Boolean.True, result.Equalizes(expectedResult).Simplify()); + Assert.Equal(MathS.Boolean.True, result.EqualTo(expectedResult).Simplify()); } [Theory] @@ -108,7 +108,7 @@ public void TestCompositeSubstitution(string initial, string expected) { var result = initial.Integrate("x").InnerSimplified; var expectedResult = expected.ToEntity().InnerSimplified; - Assert.Equal(MathS.Boolean.True, result.Equalizes(expectedResult).Simplify()); + Assert.Equal(MathS.Boolean.True, result.EqualTo(expectedResult).Simplify()); } [Theory] @@ -117,7 +117,7 @@ public void TestLogarithmicSubstitution(string initial, string expected) { var result = initial.Integrate("x").InnerSimplified; var expectedResult = expected.ToEntity().InnerSimplified; - Assert.Equal(MathS.Boolean.True, result.Equalizes(expectedResult).Simplify()); + Assert.Equal(MathS.Boolean.True, result.EqualTo(expectedResult).Simplify()); } [Theory] @@ -127,7 +127,7 @@ public void TestAdvancedTrigSubstitution(string initial, string expected) { var result = initial.Integrate("x").InnerSimplified; var expectedResult = expected.ToEntity().InnerSimplified; - Assert.Equal(MathS.Boolean.True, result.Equalizes(expectedResult).Simplify()); + Assert.Equal(MathS.Boolean.True, result.EqualTo(expectedResult).Simplify()); } [Theory] @@ -144,7 +144,7 @@ public void TestAbsAndSignumIntegration(string initial, string expected) { var result = initial.Integrate("x").InnerSimplified; var expectedResult = expected.ToEntity().InnerSimplified; - Assert.Equal(MathS.Boolean.True, result.Equalizes(expectedResult).Simplify()); + Assert.Equal(MathS.Boolean.True, result.EqualTo(expectedResult).Simplify()); } [Theory] @@ -181,7 +181,7 @@ public void TestAbsAndSignumWithSubstitution(string initial, string expected) { var result = initial.Integrate("x").InnerSimplified; var expectedResult = expected.ToEntity().InnerSimplified; - Assert.Equal(MathS.Boolean.True, result.Equalizes(expectedResult).Simplify()); + Assert.Equal(MathS.Boolean.True, result.EqualTo(expectedResult).Simplify()); } [Theory] @@ -191,7 +191,7 @@ public void TestHighPowerSubstitution(string initial, string expected) { var result = initial.Integrate("x").Simplify(); var expectedResult = expected.ToEntity().Simplify(); - Assert.Equal(MathS.Boolean.True, result.Equalizes(expectedResult).Simplify()); + Assert.Equal(MathS.Boolean.True, result.EqualTo(expectedResult).Simplify()); } [Theory] @@ -229,7 +229,7 @@ public void TestQuadraticDenominator(string initial, string expected) { var result = initial.Integrate("x").InnerSimplified; var expectedResult = expected.ToEntity().InnerSimplified; - Assert.Equal(MathS.Boolean.True, result.Equalizes(expectedResult).Simplify()); + Assert.Equal(MathS.Boolean.True, result.EqualTo(expectedResult).Simplify()); } [Fact] @@ -260,7 +260,7 @@ public void TestIntegrationByPartsNonPolynomial(string initial, string expected) { var result = initial.Integrate("x").InnerSimplified; var expectedResult = expected.ToEntity().InnerSimplified; - Assert.Equal(MathS.Boolean.True, result.Equalizes(expectedResult).Simplify()); + Assert.Equal(MathS.Boolean.True, result.EqualTo(expectedResult).Simplify()); } [Theory(Skip = "TODO: integration by parts multiple times")] @@ -272,7 +272,7 @@ public void TestIntegrationByPartsMixed(string initial, string expected) { var result = initial.Integrate("x").InnerSimplified; var expectedResult = expected.ToEntity().InnerSimplified; - Assert.Equal(MathS.Boolean.True, result.Equalizes(expectedResult).Simplify()); + Assert.Equal(MathS.Boolean.True, result.EqualTo(expectedResult).Simplify()); } [Theory] @@ -283,7 +283,7 @@ public void TestPolynomialIntegrationByParts(string initial, string expected) { var result = initial.Integrate("x").InnerSimplified; var expectedResult = expected.ToEntity().InnerSimplified; - Assert.Equal(MathS.Boolean.True, result.Equalizes(expectedResult).Simplify()); + Assert.Equal(MathS.Boolean.True, result.EqualTo(expectedResult).Simplify()); } static readonly Entity.Variable x = nameof(x); diff --git a/Sources/Tests/UnitTests/Common/InnerSimplifyTest.cs b/Sources/Tests/UnitTests/Common/InnerSimplifyTest.cs index 2408a93b9..9b914996e 100644 --- a/Sources/Tests/UnitTests/Common/InnerSimplifyTest.cs +++ b/Sources/Tests/UnitTests/Common/InnerSimplifyTest.cs @@ -45,7 +45,7 @@ public void ShouldNotChangeTestTodo(string expr) [InlineData("(a provided (b provided c)) + 1 + x + (y provided h)", "(a + 1 + x + y) provided (c and b and h)")] [InlineData("a provided 0 = 0", "a")] [InlineData("a provided 0 = 1", "NaN")] - [InlineData("a provided b provided c provided d", "a provided d and (c and b)")] + [InlineData("a provided b provided c provided d", "a provided d and c and b")] [InlineData(@"[ { sqrt(3), sqrt(5) }; sqrt(10) ]", @"{ [ sqrt(3); sqrt(10) ], [ sqrt(5); sqrt(10) ] }")] [InlineData(@"[ sqrt(3); { sqrt(5), sqrt(10) } ]", @"{ [ sqrt(3); sqrt(5) ], [ sqrt(3); sqrt(10) ] }")] [InlineData(@"[ { sqrt(2), sqrt(3) }; { sqrt(5), sqrt(10) } ]", @"{ [ sqrt(2); sqrt(5) ], [ sqrt(3); sqrt(5) ], [ sqrt(2); sqrt(10) ], [ sqrt(3); sqrt(10) ] }")] diff --git a/Sources/Tests/UnitTests/Convenience/FromStringTest.cs b/Sources/Tests/UnitTests/Convenience/FromStringTest.cs index 257715d89..163c9b022 100644 --- a/Sources/Tests/UnitTests/Convenience/FromStringTest.cs +++ b/Sources/Tests/UnitTests/Convenience/FromStringTest.cs @@ -121,8 +121,10 @@ public void TestFormula8() [Fact] public void TestInequality48() => Assert.Equal(x < y, FromString("x < y")); [Fact] public void TestInequality49() => Assert.Equal(x >= y, FromString("x >= y")); [Fact] public void TestInequality50() => Assert.Equal(x <= y, FromString("x <= y")); - [Fact] public void TestInequality51() => Assert.Equal(x.Equalizes(y), FromString("x = y")); - [Fact] public void TestInequality52() => Assert.Equal((x > y).Equalizes(x < y), FromString("x > y = x < y")); + [Fact] public void TestInequality51() => Assert.Equal(x.EqualTo(y), FromString("x = y")); + [Fact] public void TestInequality52() => Assert.Equal((x > y).EqualTo(x < y), FromString("(x > y) = (x < y)")); + [Fact] public void TestInequality53() => Assert.Equal((x > y).Equalizes(x < y), FromString("x > y = (x < y)")); + [Fact] public void TestInequality54() => Assert.Equal((x > y).Equalizes(x) < y, FromString("x > y = x < y")); [Fact] public void TestInterval1() => Assert.Equal(new Interval(x, true, y, true), FromString("[x; y]")); [Fact] public void TestInterval2() => Assert.Equal(new Interval(x, false, y, true), FromString("(x; y]")); [Fact] public void TestInterval3() => Assert.Equal(new Interval(x, true, y, false), FromString("[x; y)")); @@ -141,8 +143,8 @@ public void TestFormula8() [Fact] public void TestPlusInfinity2() => Assert.Equal(Real.PositiveInfinity + (Entity)2, FromString("+oo + 2")); [Fact] public void TestMinusInfinity1() => Assert.Equal(Real.NegativeInfinity, FromString("-oo")); [Fact] public void TestMinusInfinity2() => Assert.Equal(Real.NegativeInfinity + (Entity)2, FromString("-oo + 2")); - [Fact] public void TestEquality1() => Assert.Equal(x.Equalizes(y) & y.Equalizes(x), FromString("x = y = x")); - [Fact] public void TestEquality2() => Assert.Equal(x.Equalizes(y).Equalizes(x), FromString("(x = y) = x")); + [Fact] public void TestEquality1() => Assert.Equal(x.EqualTo(y) & y.EqualTo(x), FromString("x = y = x")); + [Fact] public void TestEquality2() => Assert.Equal(x.EqualTo(y).EqualTo(x), FromString("(x = y) = x")); [Fact] public void TestDerivative2Args1() => Assert.Equal(MathS.Derivative("x + 2", "x"), FromString("derivative(x + 2, x)")); [Fact] public void TestIntegral2Args1() => Assert.Equal(MathS.Integral("x + 2", "x"), FromString("integral(x + 2, x)")); [Fact] public void TestDerivative2Args2() => Assert.Equal(2 * MathS.Derivative("x + 2", "x"), FromString("2 derivative(x + 2, x)")); @@ -152,7 +154,8 @@ public void TestFormula8() [Fact] public void TestArcsec() => Assert.Equal(MathS.Arcsec("x"), FromString("arcsec(x)")); [Fact] public void TestArccosec() => Assert.Equal(MathS.Arccosec("x"), FromString("arccsc(x)")); [Fact] public void TestProvided1() => Assert.Equal(MathS.Provided("a", "b"), FromString("a provided b")); - [Fact] public void TestProvided2() => Assert.Equal(MathS.Provided(MathS.Provided("a", "b"), "c"), FromString("a provided b provided c")); + [Fact] public void TestProvided2() => Assert.Equal(MathS.Provided("a", MathS.Provided("b", "c")), FromString("a provided b provided c")); + [Fact] public void TestProvided3() => Assert.Equal(MathS.Provided(MathS.Provided("a", "b"), "c"), FromString("(a provided b) provided c")); [Theory] [InlineData("sh", "Sinh")] diff --git a/Sources/Tests/UnitTests/Convenience/LatexTest.cs b/Sources/Tests/UnitTests/Convenience/LatexTest.cs index 3e2a6b93e..5ae3ceddd 100644 --- a/Sources/Tests/UnitTests/Convenience/LatexTest.cs +++ b/Sources/Tests/UnitTests/Convenience/LatexTest.cs @@ -264,7 +264,7 @@ [Fact] public void Limit5() => public void LimitOneSided3(string sign) => Test($$"""\lim_{x\to \left({a}^{2}\right)!^{{sign}}} \left(x+y\right)""", (Entity)$"limit{(sign == "-" ? "left" : "right")}(x + y, x, (a^2)!)"); [Fact] public void LimitOfExponential() => - Test(@"\lim_{x\to \infty } {\sin\left(x\right)}^{x} = \infty ", MathS.Limit(MathS.Pow(MathS.Sin(x), x), x, Real.PositiveInfinity).Equalizes(Real.PositiveInfinity)); + Test(@"\lim_{x\to \infty } {\sin\left(x\right)}^{x} = \infty ", MathS.Limit(MathS.Pow(MathS.Sin(x), x), x, Real.PositiveInfinity).EqualTo(Real.PositiveInfinity)); [Fact] public void NestedLimitDerivative() => Test(@"\left(\lim_{x\to 0} \frac{\mathrm{d}^{2}}{\mathrm{d}x^{2}}\lim_{y\to \infty } \frac{x}{y}\right) \cdot x", MathS.Limit(MathS.Derivative(MathS.Limit("x / y", "y", Real.PositiveInfinity), x, 2), x, 0) * x); [Fact] public void NestedDerivativeIntegral1() => @@ -520,7 +520,7 @@ [Fact] public void Less() [Fact] public void LessOrEqual() => Test(@"x \leq y", x <= MathS.Var("y")); [Fact] public void EqualsOperator() - => Test(@"x = y", x.Equalizes(MathS.Var("y"))); + => Test(@"x = y", x.EqualTo(MathS.Var("y"))); // Set operations [Fact] public void SetUnion() @@ -616,9 +616,9 @@ [Fact] public void ComparisonOrBoolean() // Priority tests for mixed boolean and comparison operations [Fact] public void EqualityAndBoolean() - => Test(@"x = y \land z = w", x.Equalizes(MathS.Var("y")) & (MathS.Var("z").Equalizes(MathS.Var("w")))); + => Test(@"x = y \land z = w", x.EqualTo(MathS.Var("y")) & (MathS.Var("z").EqualTo(MathS.Var("w")))); [Fact] public void EqualityOrBoolean() - => Test(@"x = y \lor z = w", x.Equalizes(MathS.Var("y")) | (MathS.Var("z").Equalizes(MathS.Var("w")))); + => Test(@"x = y \lor z = w", x.EqualTo(MathS.Var("y")) | (MathS.Var("z").EqualTo(MathS.Var("w")))); [Fact] public void InequalityChain() => Test(@"x < y < z < w", (x < MathS.Var("y")) & (MathS.Var("y") < MathS.Var("z")) & (MathS.Var("z") < MathS.Var("w"))); @@ -628,18 +628,19 @@ [Fact] public void InequalityChainParenthesized() => Test(@"\left(x < y\right) < \left(z < w\right)", new Entity.Lessf(x < "y", (Entity)"z" < "w")); [Fact] public void EqualityChain() => Test(@"x = y = z = w", - x.Equalizes(MathS.Var("y")) & (MathS.Var("y").Equalizes(MathS.Var("z"))) & MathS.Var("z").Equalizes(MathS.Var("w"))); + x.EqualTo(MathS.Var("y")) & (MathS.Var("y").EqualTo(MathS.Var("z"))) & MathS.Var("z").EqualTo(MathS.Var("w"))); [Fact] public void EqualityChainAlt() => Test(@"x = y = z = w", x.Equalizes("y").Equalizes("z").Equalizes("w")); [Fact] public void EqualityChainString() => Test(@"x = y = z = w", (Entity)"x=y=z=w"); [Fact] public void EqualityChainParenthesized() - => Test(@"\left(x = y\right) = \left(z = w\right)", new Entity.Equalsf(x.Equalizes("y"), ((Entity)"z").Equalizes("w"))); + => Test(@"\left(x = y\right) = \left(z = w\right)", x.EqualTo("y").EqualTo(((Entity)"z").EqualTo("w"))); [Fact] public void EqualityInequalityChain() => Test(@"x \geq y = z < w", - (x >= MathS.Var("y")) & (MathS.Var("y").Equalizes(MathS.Var("z"))) & (MathS.Var("z") < MathS.Var("w"))); + (x >= MathS.Var("y")) & (MathS.Var("y").EqualTo(MathS.Var("z"))) & (MathS.Var("z") < MathS.Var("w"))); [Fact] public void EqualityInequalityChainAlt() => Test(@"x \geq y = z < w", (x >= "y").Equalizes("z") < "w"); - [Fact] public void EqualityInequalityChainString() => Test(@"x \geq y = z < w", (Entity)"(x>=y=z) Test(@"x \geq y = \left(z < w\right)", (Entity)"x>=y=z Test(@"\left(x \geq y = z\right) < w", (Entity)"(x>=y=z) Test(@"x \geq y = \left(z < w\right)", (Entity)"x>=y=(z Test(@"x \geq y = z < w", (Entity)"x>=y=z Test(@"x \geq \left(y = \left(z < w\right)\right)", new Entity.GreaterOrEqualf(x, new Entity.Equalsf("y", (Entity)"z" < "w"))); [Fact] public void ParenthesizedComparisons() => Test(@"\left(x < x\right) \geq \left(x > \left(\left(x = x\right) \leq x\right)\right)", diff --git a/Sources/Tests/UnitTests/Convenience/PriorityTest.cs b/Sources/Tests/UnitTests/Convenience/PriorityTest.cs index 73bcb826d..257952e2e 100644 --- a/Sources/Tests/UnitTests/Convenience/PriorityTest.cs +++ b/Sources/Tests/UnitTests/Convenience/PriorityTest.cs @@ -18,29 +18,38 @@ public class PriorityTest [InlineData("a + b * c", "a + (b * c)")] [InlineData("a ^ b ^ c", "a ^ (b ^ c)")] [InlineData("a + b = c + d", "(a + b) = (c + d)")] - [InlineData("a > b = c > d", "(a > b) = (c > d)")] - [InlineData("a < b = c < d", "(a < b) = (c < d)")] + [InlineData("(a > b) = (c > d)", "(a > b) = (c > d)")] + [InlineData("(a < b) = (c < d)", "(a < b) = (c < d)")] + [InlineData("a > b and b = (c > d)", "a > b = (c > d)")] + [InlineData("a < b and b = (c < d)", "a < b = (c < d)")] + [InlineData("a > b and b = c and c > d", "a > b = c > d")] + [InlineData("a < b and b = c and c < d", "a < b = c < d")] [InlineData(@"A = B \/ C", @"A = (B \/ C)")] [InlineData(@"A = B \ C", @"A = (B \ C)")] [InlineData(@"B \ C = A", @"(B \ C) = A")] [InlineData(@"A /\ B \/ C", @"(A /\ B) \/ C")] [InlineData(@"A \/ B /\ C", @"A \/ (B /\ C)")] [InlineData(@"A \/ B = B /\ C", @"(A \/ B) = (B /\ C)")] + [InlineData(@"A /\ B \/ C \ D \/ E /\ F", @"(((A /\ B) \/ C) \ D) \/ (E /\ F)")] + [InlineData(@"A * B + C - D + E * F", @"(((A * B) + C) - D) + (E * F)")] + [InlineData(@"A and B or C xor D or E xor F and G", @"((A and B) or (C xor D)) or (E xor (F and G))")] + [InlineData(@"(A or B) xor (B or C)", @"(A or B) xor (B or C)")] [InlineData("a and b or c", "(a and b) or c")] [InlineData("a or b and c", "a or (b and c)")] [InlineData("a or b implies c or d", "(a or b) implies (c or d)")] [InlineData("not a or not b implies not c or not d", "((not a) or (not b)) implies ((not c) or (not d))")] - [InlineData("a and b = c > d", "a and (b = (c > d))")] + [InlineData("a = b and b > c and d", "a = b > c and d")] [InlineData("a provided b", "a provided b")] - [InlineData("a provided b provided c", "(a provided b) provided c")] - [InlineData("a provided (b provided c)", "a provided (b provided c)")] + [InlineData("(a provided b) provided c", "(a provided b) provided c")] + [InlineData("a provided b provided c", "a provided (b provided c)")] [InlineData("a provided b and c", "a provided (b and c)")] [InlineData("a provided b + c > 0", "a provided (b + c > 0)")] [InlineData("a + b provided b + c > 0", "(a + b) provided (b + c > 0)")] - [InlineData("a + b provided b + c > 0 provided d", "((a + b) provided (b + c > 0)) provided d")] - public void Test(string implic, string explic) + [InlineData("a + b provided b + c > 0 provided d", "(a + b) provided (((b + c) > 0) provided d)")] + public void Test(string normalizedForm, string alternateForm) { - Assert.Equal(explic.ToEntity(), implic.ToEntity()); + Assert.Equal(alternateForm.ToEntity(), normalizedForm.ToEntity()); + Assert.Equal(normalizedForm, alternateForm.ToEntity().Stringize()); } } } From 2741c6d69adcf009279c6cc0df43c058539cdeee Mon Sep 17 00:00:00 2001 From: Hadrian Tang Date: Thu, 22 Jan 2026 03:26:33 +0800 Subject: [PATCH 2/2] Add <> tests --- Sources/Tests/UnitTests/Convenience/PriorityTest.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Sources/Tests/UnitTests/Convenience/PriorityTest.cs b/Sources/Tests/UnitTests/Convenience/PriorityTest.cs index 257952e2e..3a9c1fbdc 100644 --- a/Sources/Tests/UnitTests/Convenience/PriorityTest.cs +++ b/Sources/Tests/UnitTests/Convenience/PriorityTest.cs @@ -46,6 +46,9 @@ public class PriorityTest [InlineData("a provided b + c > 0", "a provided (b + c > 0)")] [InlineData("a + b provided b + c > 0", "(a + b) provided (b + c > 0)")] [InlineData("a + b provided b + c > 0 provided d", "(a + b) provided (((b + c) > 0) provided d)")] + [InlineData("not a = b", "a <> b")] + [InlineData("a = b and not b = c and c < d", "a = b <> c < d")] + [InlineData("not a = b and not b = c", "a <> b <> c")] public void Test(string normalizedForm, string alternateForm) { Assert.Equal(alternateForm.ToEntity(), normalizedForm.ToEntity());