diff --git a/optimizer/src/main/java/dev/cel/optimizer/optimizers/SubexpressionOptimizer.java b/optimizer/src/main/java/dev/cel/optimizer/optimizers/SubexpressionOptimizer.java index a53fdc7e9..74794cda5 100644 --- a/optimizer/src/main/java/dev/cel/optimizer/optimizers/SubexpressionOptimizer.java +++ b/optimizer/src/main/java/dev/cel/optimizer/optimizers/SubexpressionOptimizer.java @@ -14,7 +14,6 @@ package dev.cel.optimizer.optimizers; -import static com.google.common.base.Preconditions.checkArgument; import static com.google.common.base.Preconditions.checkNotNull; import static com.google.common.base.Preconditions.checkState; import static com.google.common.collect.ImmutableList.toImmutableList; @@ -66,7 +65,6 @@ import dev.cel.optimizer.CelAstOptimizer; import java.util.ArrayList; import java.util.Arrays; -import java.util.Comparator; import java.util.HashMap; import java.util.HashSet; import java.util.List; @@ -393,69 +391,9 @@ private static void replaceWithBlockIdent( } private ImmutableList getCseCandidates(CelNavigableMutableAst navAst) { - if (cseOptions.subexpressionMaxRecursionDepth() > 0) { - return getCseCandidatesWithRecursionDepth( - navAst, cseOptions.subexpressionMaxRecursionDepth()); - } else { - return getCseCandidatesWithCommonSubexpr(navAst); - } - } - - /** - * Retrieves all subexpr candidates based on the recursion limit even if there's no duplicate - * subexpr found. - */ - private ImmutableList getCseCandidatesWithRecursionDepth( - CelNavigableMutableAst navAst, int recursionLimit) { - checkArgument(recursionLimit > 0); - Set ineligibleExprs = getIneligibleExprsFromComprehensionBranches(navAst); - ImmutableList descendants = - navAst - .getRoot() - .descendants(TraversalOrder.PRE_ORDER) - .filter(node -> node.height() <= recursionLimit) - .filter(node -> canEliminate(node, ineligibleExprs)) - .sorted(Comparator.comparingInt(CelNavigableMutableExpr::height).reversed()) - .collect(toImmutableList()); - if (descendants.isEmpty()) { - return ImmutableList.of(); - } - - ImmutableList cseCandidates = - getCseCandidatesWithCommonSubexpr(descendants, ineligibleExprs); - if (!cseCandidates.isEmpty()) { - return cseCandidates; - } - - // If there's no common subexpr, just return the one with the highest height that's still below - // the recursion limit, but only if it actually needs to be extracted due to exceeding the - // recursion limit. - boolean astHasMoreExtractableSubexprs = - navAst - .getRoot() - .allNodes(TraversalOrder.POST_ORDER) - .filter(node -> node.height() > recursionLimit) - .anyMatch(node -> canEliminate(node, ineligibleExprs)); - if (astHasMoreExtractableSubexprs) { - return ImmutableList.of(descendants.get(0).expr()); - } - - // The height of the remaining subexpression is already below the recursion limit. No need to - // extract. - return ImmutableList.of(); - } - - private ImmutableList getCseCandidatesWithCommonSubexpr( - CelNavigableMutableAst navAst) { Set ineligibleExprs = getIneligibleExprsFromComprehensionBranches(navAst); ImmutableList allNodes = navAst.getRoot().allNodes(TraversalOrder.PRE_ORDER).collect(toImmutableList()); - - return getCseCandidatesWithCommonSubexpr(allNodes, ineligibleExprs); - } - - private ImmutableList getCseCandidatesWithCommonSubexpr( - ImmutableList allNodes, Set ineligibleExprs) { ImmutableListMultimap nodesByHeight = Multimaps.index(allNodes, CelNavigableMutableExpr::height); HashSet semanticallyEqualNodes = new HashSet<>(); @@ -572,8 +510,6 @@ public abstract static class SubexpressionOptimizerOptions { public abstract boolean enableCelBlock(); - public abstract int subexpressionMaxRecursionDepth(); - public abstract ImmutableSet eliminableFunctions(); /** Builder for configuring the {@link SubexpressionOptimizerOptions}. */ @@ -598,33 +534,6 @@ public abstract static class Builder { @Deprecated public abstract Builder enableCelBlock(boolean value); - /** - * Ensures all extracted subexpressions do not exceed the maximum depth of designated value. - * The purpose of this is to guarantee evaluation and deserialization safety by preventing - * deeply nested ASTs. The trade-off is increased memory usage due to memoizing additional - * block indices during lazy evaluation. - * - *

As a general note, root of a node has a depth of 0. An expression `x.y.z` has a depth of - * 2. - * - *

Note that expressions containing no common subexpressions may become a candidate for - * extraction to satisfy the max depth requirement. - * - *

This is a no-op if the configured value is less than 1, or no subexpression needs to be - * extracted because the entire expression is already under the designated limit. - * - *

Examples: - * - *

    - *
  1. a.b.c with depth 1 -> cel.@block([x.b, @index0.c], @index1) - *
  2. a.b.c with depth 3 -> a.b.c - *
  3. a.b + a.b.c.d with depth 3 -> cel.@block([a.b, @index0.c.d], @index0 + @index1) - *
- * - *

- */ - public abstract Builder subexpressionMaxRecursionDepth(int value); - abstract ImmutableSet.Builder eliminableFunctionsBuilder(); /** @@ -651,15 +560,12 @@ public Builder addEliminableFunctions(String... functions) { Builder() {} } - abstract Builder toBuilder(); - /** Returns a new options builder with recommended defaults pre-configured. */ public static Builder newBuilder() { return new AutoValue_SubexpressionOptimizer_SubexpressionOptimizerOptions.Builder() .iterationLimit(500) .enableCelBlock(true) - .populateMacroCalls(false) - .subexpressionMaxRecursionDepth(0); + .populateMacroCalls(false); } SubexpressionOptimizerOptions() {} diff --git a/optimizer/src/test/java/dev/cel/optimizer/optimizers/SubexpressionOptimizerBaselineTest.java b/optimizer/src/test/java/dev/cel/optimizer/optimizers/SubexpressionOptimizerBaselineTest.java index 04e4e6a1d..ffe79faf1 100644 --- a/optimizer/src/test/java/dev/cel/optimizer/optimizers/SubexpressionOptimizerBaselineTest.java +++ b/optimizer/src/test/java/dev/cel/optimizer/optimizers/SubexpressionOptimizerBaselineTest.java @@ -17,7 +17,6 @@ import static com.google.common.truth.Truth.assertThat; import static dev.cel.common.CelOverloadDecl.newGlobalOverload; -import com.google.common.base.Ascii; import com.google.common.collect.ImmutableMap; import com.google.testing.junit.testparameterinjector.TestParameter; import com.google.testing.junit.testparameterinjector.TestParameterInjector; @@ -51,6 +50,8 @@ // @MediumTest @RunWith(TestParameterInjector.class) +// Golden tests accumulate all cases into a single baseline file per test method. +@SuppressWarnings("LoopToTestParameter") public class SubexpressionOptimizerBaselineTest extends BaselineTestCase { private static Cel setupCelEnv(CelBuilder celBuilder) { return celBuilder @@ -105,6 +106,8 @@ private static Cel setupCelEnv(CelBuilder celBuilder) { .putMapInt32Int64(2, 2) .putMapStringString("key", "A"))) .build(); + private static final ImmutableMap INPUT_MAP = + ImmutableMap.of("msg", TEST_ALL_TYPES_INPUT, "x", 5L, "y", 6L, "opt_x", Optional.of(5L)); private static final SubexpressionOptimizerOptions OPTIMIZER_COMMON_OPTIONS = SubexpressionOptimizerOptions.newBuilder() @@ -112,20 +115,9 @@ private static Cel setupCelEnv(CelBuilder celBuilder) { .addEliminableFunctions("pure_custom_func") .build(); - private String overriddenBaseFilePath = ""; - @Before public void setUp() { this.cel = setupCelEnv(runtimeFlavor.builder()); - overriddenBaseFilePath = ""; - } - - @Override - protected String baselineFileName() { - if (overriddenBaseFilePath.isEmpty()) { - return super.baselineFileName(); - } - return overriddenBaseFilePath; } @TestParameter CelRuntimeFlavor runtimeFlavor; @@ -133,122 +125,59 @@ protected String baselineFileName() { private Cel cel; @Test - public void allOptimizers_producesSameEvaluationResult( - @TestParameter CseTestOptimizer cseTestOptimizer, @TestParameter CseTestCase cseTestCase) + public void cse_producesSameEvaluationResult(@TestParameter CseTestCase cseTestCase) throws Exception { skipBaselineVerification(); CelAbstractSyntaxTree ast = cel.compile(cseTestCase.source).getAst(); - ImmutableMap inputMap = - ImmutableMap.of("msg", TEST_ALL_TYPES_INPUT, "x", 5L, "y", 6L, "opt_x", Optional.of(5L)); - Object expectedEvalResult = cel.createProgram(ast).eval(inputMap); + Object expectedEvalResult = cel.createProgram(ast).eval(INPUT_MAP); - CelAbstractSyntaxTree optimizedAst = cseTestOptimizer.newCseOptimizer(cel).optimize(ast); + CelAbstractSyntaxTree optimizedAst = newCseOptimizer().optimize(ast); - Object optimizedEvalResult = cel.createProgram(optimizedAst).eval(inputMap); + Object optimizedEvalResult = cel.createProgram(optimizedAst).eval(INPUT_MAP); assertThat(optimizedEvalResult).isEqualTo(expectedEvalResult); } @Test - public void allOptimizers_producesSameEvaluationResult_parsedOnly( - @TestParameter CseTestCase cseTestCase, @TestParameter CseTestOptimizer cseTestOptimizer) + public void cse_producesSameEvaluationResult_parsedOnly(@TestParameter CseTestCase cseTestCase) throws Exception { skipBaselineVerification(); if (runtimeFlavor.equals(CelRuntimeFlavor.LEGACY)) { return; } CelAbstractSyntaxTree ast = cel.compile(cseTestCase.source).getAst(); - ImmutableMap inputMap = - ImmutableMap.of("msg", TEST_ALL_TYPES_INPUT, "x", 5L, "y", 6L, "opt_x", Optional.of(5L)); - Object expectedEvalResult = cel.createProgram(ast).eval(inputMap); + Object expectedEvalResult = cel.createProgram(ast).eval(INPUT_MAP); - CelAbstractSyntaxTree optimizedAst = cseTestOptimizer.newCseOptimizer(cel).optimize(ast); + CelAbstractSyntaxTree optimizedAst = newCseOptimizer().optimize(ast); CelAbstractSyntaxTree parsedOnlyOptimizedAst = CelAbstractSyntaxTree.newParsedAst(optimizedAst.getExpr(), optimizedAst.getSource()); - Object optimizedEvalResult = cel.createProgram(parsedOnlyOptimizedAst).eval(inputMap); + Object optimizedEvalResult = cel.createProgram(parsedOnlyOptimizedAst).eval(INPUT_MAP); assertThat(optimizedEvalResult).isEqualTo(expectedEvalResult); } @Test public void subexpression_unparsed() throws Exception { - for (CseTestCase cseTestCase : EnumSet.allOf(CseTestCase.class)) { - testOutput().println("Test case: " + cseTestCase.name()); - testOutput().println("Source: " + cseTestCase.source); - testOutput().println("=====>"); - CelAbstractSyntaxTree ast = cel.compile(cseTestCase.source).getAst(); - boolean resultPrinted = false; - for (CseTestOptimizer cseTestOptimizer : CseTestOptimizer.values()) { - String optimizerName = cseTestOptimizer.name(); - CelAbstractSyntaxTree optimizedAst; - try { - optimizedAst = cseTestOptimizer.newCseOptimizer(cel).optimize(ast); - } catch (Exception e) { - testOutput().printf("[%s]: Optimization Error: %s", optimizerName, e); - continue; - } - if (!resultPrinted) { - Object optimizedEvalResult = - cel.createProgram(optimizedAst) - .eval( - ImmutableMap.of( - "msg", TEST_ALL_TYPES_INPUT, "x", 5L, "y", 6L, "opt_x", Optional.of(5L))); - testOutput().println("Result: " + optimizedEvalResult); - resultPrinted = true; - } - try { - testOutput().printf("[%s]: %s", optimizerName, CEL_UNPARSER.unparse(optimizedAst)); - } catch (RuntimeException e) { - testOutput().printf("[%s]: Unparse Error: %s", optimizerName, e); - } - testOutput().println(); - } - testOutput().println(); - } + printUnparsedTestCases(newCseOptimizer()); } @Test public void constfold_before_subexpression_unparsed() throws Exception { - for (CseTestCase cseTestCase : EnumSet.allOf(CseTestCase.class)) { - testOutput().println("Test case: " + cseTestCase.name()); - testOutput().println("Source: " + cseTestCase.source); - testOutput().println("=====>"); - CelAbstractSyntaxTree ast = cel.compile(cseTestCase.source).getAst(); - boolean resultPrinted = false; - for (CseTestOptimizer cseTestOptimizer : EnumSet.allOf(CseTestOptimizer.class)) { - String optimizerName = cseTestOptimizer.name(); - CelAbstractSyntaxTree optimizedAst = - cseTestOptimizer.newCseWithConstFoldingOptimizer(cel).optimize(ast); - if (!resultPrinted) { - Object optimizedEvalResult = - cel.createProgram(optimizedAst) - .eval( - ImmutableMap.of( - "msg", TEST_ALL_TYPES_INPUT, "x", 5L, "y", 6L, "opt_x", Optional.of(5L))); - testOutput().println("Result: " + optimizedEvalResult); - resultPrinted = true; - } - try { - testOutput().printf("[%s]: %s", optimizerName, CEL_UNPARSER.unparse(optimizedAst)); - } catch (RuntimeException e) { - testOutput().printf("[%s]: Unparse Error: %s", optimizerName, e); - } - testOutput().println(); - } - testOutput().println(); - } + printUnparsedTestCases( + CelOptimizerFactory.standardCelOptimizerBuilder(cel) + .addAstOptimizers( + ConstantFoldingOptimizer.getInstance(), + SubexpressionOptimizer.newInstance(OPTIMIZER_COMMON_OPTIONS)) + .build()); } @Test - public void subexpression_ast(@TestParameter CseTestOptimizer cseTestOptimizer) throws Exception { - String testBasefileName = "subexpression_ast_" + Ascii.toLowerCase(cseTestOptimizer.name()); - overriddenBaseFilePath = String.format("%s%s.baseline", testdataDir(), testBasefileName); + public void subexpression_ast_block_common_subexpr_only() throws Exception { for (CseTestCase cseTestCase : EnumSet.allOf(CseTestCase.class)) { testOutput().println("Test case: " + cseTestCase.name()); testOutput().println("Source: " + cseTestCase.source); testOutput().println("=====>"); CelAbstractSyntaxTree ast = cel.compile(cseTestCase.source).getAst(); - CelAbstractSyntaxTree optimizedAst = - newCseOptimizer(cel, cseTestOptimizer.option).optimize(ast); + CelAbstractSyntaxTree optimizedAst = newCseOptimizer().optimize(ast); testOutput().println(optimizedAst.getExpr()); } } @@ -256,52 +185,11 @@ public void subexpression_ast(@TestParameter CseTestOptimizer cseTestOptimizer) @Test public void large_expressions_block_common_subexpr() throws Exception { CelOptimizer celOptimizer = - newCseOptimizer( - cel, SubexpressionOptimizerOptions.newBuilder().populateMacroCalls(true).build()); - - runLargeTestCases(celOptimizer); - } - - @Test - public void large_expressions_block_recursion_depth_1() throws Exception { - CelOptimizer celOptimizer = - newCseOptimizer( - cel, - SubexpressionOptimizerOptions.newBuilder() - .populateMacroCalls(true) - .subexpressionMaxRecursionDepth(1) - .build()); - - runLargeTestCases(celOptimizer); - } - - @Test - public void large_expressions_block_recursion_depth_2() throws Exception { - CelOptimizer celOptimizer = - newCseOptimizer( - cel, - SubexpressionOptimizerOptions.newBuilder() - .populateMacroCalls(true) - .subexpressionMaxRecursionDepth(2) - .build()); - - runLargeTestCases(celOptimizer); - } - - @Test - public void large_expressions_block_recursion_depth_3() throws Exception { - CelOptimizer celOptimizer = - newCseOptimizer( - cel, - SubexpressionOptimizerOptions.newBuilder() - .populateMacroCalls(true) - .subexpressionMaxRecursionDepth(3) - .build()); - - runLargeTestCases(celOptimizer); - } - - private void runLargeTestCases(CelOptimizer celOptimizer) throws Exception { + CelOptimizerFactory.standardCelOptimizerBuilder(cel) + .addAstOptimizers( + SubexpressionOptimizer.newInstance( + SubexpressionOptimizerOptions.newBuilder().populateMacroCalls(true).build())) + .build(); for (CseLargeTestCase cseTestCase : EnumSet.allOf(CseLargeTestCase.class)) { testOutput().println("Test case: " + cseTestCase.name()); testOutput().println("Source: " + cseTestCase.source); @@ -323,52 +211,23 @@ private void runLargeTestCases(CelOptimizer celOptimizer) throws Exception { } } - private static CelOptimizer newCseOptimizer(Cel cel, SubexpressionOptimizerOptions options) { - return CelOptimizerFactory.standardCelOptimizerBuilder(cel) - .addAstOptimizers(SubexpressionOptimizer.newInstance(options)) - .build(); - } - - @SuppressWarnings("Immutable") // Test only - private enum CseTestOptimizer { - BLOCK_COMMON_SUBEXPR_ONLY(OPTIMIZER_COMMON_OPTIONS), - BLOCK_RECURSION_DEPTH_1( - OPTIMIZER_COMMON_OPTIONS.toBuilder().subexpressionMaxRecursionDepth(1).build()), - BLOCK_RECURSION_DEPTH_2( - OPTIMIZER_COMMON_OPTIONS.toBuilder().subexpressionMaxRecursionDepth(2).build()), - BLOCK_RECURSION_DEPTH_3( - OPTIMIZER_COMMON_OPTIONS.toBuilder().subexpressionMaxRecursionDepth(3).build()), - BLOCK_RECURSION_DEPTH_4( - OPTIMIZER_COMMON_OPTIONS.toBuilder().subexpressionMaxRecursionDepth(4).build()), - BLOCK_RECURSION_DEPTH_5( - OPTIMIZER_COMMON_OPTIONS.toBuilder().subexpressionMaxRecursionDepth(5).build()), - BLOCK_RECURSION_DEPTH_6( - OPTIMIZER_COMMON_OPTIONS.toBuilder().subexpressionMaxRecursionDepth(6).build()), - BLOCK_RECURSION_DEPTH_7( - OPTIMIZER_COMMON_OPTIONS.toBuilder().subexpressionMaxRecursionDepth(7).build()), - BLOCK_RECURSION_DEPTH_8( - OPTIMIZER_COMMON_OPTIONS.toBuilder().subexpressionMaxRecursionDepth(8).build()), - BLOCK_RECURSION_DEPTH_9( - OPTIMIZER_COMMON_OPTIONS.toBuilder().subexpressionMaxRecursionDepth(9).build()); - - private final SubexpressionOptimizerOptions option; - - CseTestOptimizer(SubexpressionOptimizerOptions option) { - this.option = option; - } - - // Defers building the optimizer until the test runs - private CelOptimizer newCseOptimizer(Cel cel) { - return SubexpressionOptimizerBaselineTest.newCseOptimizer(cel, option); + private void printUnparsedTestCases(CelOptimizer celOptimizer) throws Exception { + for (CseTestCase cseTestCase : EnumSet.allOf(CseTestCase.class)) { + testOutput().println("Test case: " + cseTestCase.name()); + testOutput().println("Source: " + cseTestCase.source); + testOutput().println("=====>"); + CelAbstractSyntaxTree optimizedAst = + celOptimizer.optimize(cel.compile(cseTestCase.source).getAst()); + testOutput().println("Result: " + cel.createProgram(optimizedAst).eval(INPUT_MAP)); + testOutput().println("Unparsed: " + CEL_UNPARSER.unparse(optimizedAst)); + testOutput().println(); } + } - // Defers building the optimizer until the test runs - private CelOptimizer newCseWithConstFoldingOptimizer(Cel cel) { - return CelOptimizerFactory.standardCelOptimizerBuilder(cel) - .addAstOptimizers( - ConstantFoldingOptimizer.getInstance(), SubexpressionOptimizer.newInstance(option)) - .build(); - } + private CelOptimizer newCseOptimizer() { + return CelOptimizerFactory.standardCelOptimizerBuilder(cel) + .addAstOptimizers(SubexpressionOptimizer.newInstance(OPTIMIZER_COMMON_OPTIONS)) + .build(); } private enum CseTestCase { diff --git a/optimizer/src/test/resources/constfold_before_subexpression_unparsed.baseline b/optimizer/src/test/resources/constfold_before_subexpression_unparsed.baseline index 9139c7a35..1cceb0c60 100644 --- a/optimizer/src/test/resources/constfold_before_subexpression_unparsed.baseline +++ b/optimizer/src/test/resources/constfold_before_subexpression_unparsed.baseline @@ -2,793 +2,316 @@ Test case: SIZE_1 Source: size([1,2]) + size([1,2]) + 1 == 5 =====> Result: true -[BLOCK_COMMON_SUBEXPR_ONLY]: true -[BLOCK_RECURSION_DEPTH_1]: true -[BLOCK_RECURSION_DEPTH_2]: true -[BLOCK_RECURSION_DEPTH_3]: true -[BLOCK_RECURSION_DEPTH_4]: true -[BLOCK_RECURSION_DEPTH_5]: true -[BLOCK_RECURSION_DEPTH_6]: true -[BLOCK_RECURSION_DEPTH_7]: true -[BLOCK_RECURSION_DEPTH_8]: true -[BLOCK_RECURSION_DEPTH_9]: true +Unparsed: true Test case: SIZE_2 Source: 2 + size([1,2]) + size([1,2]) + 1 == 7 =====> Result: true -[BLOCK_COMMON_SUBEXPR_ONLY]: true -[BLOCK_RECURSION_DEPTH_1]: true -[BLOCK_RECURSION_DEPTH_2]: true -[BLOCK_RECURSION_DEPTH_3]: true -[BLOCK_RECURSION_DEPTH_4]: true -[BLOCK_RECURSION_DEPTH_5]: true -[BLOCK_RECURSION_DEPTH_6]: true -[BLOCK_RECURSION_DEPTH_7]: true -[BLOCK_RECURSION_DEPTH_8]: true -[BLOCK_RECURSION_DEPTH_9]: true +Unparsed: true Test case: SIZE_3 Source: size([0]) + size([0]) + size([1,2]) + size([1,2]) == 6 =====> Result: true -[BLOCK_COMMON_SUBEXPR_ONLY]: true -[BLOCK_RECURSION_DEPTH_1]: true -[BLOCK_RECURSION_DEPTH_2]: true -[BLOCK_RECURSION_DEPTH_3]: true -[BLOCK_RECURSION_DEPTH_4]: true -[BLOCK_RECURSION_DEPTH_5]: true -[BLOCK_RECURSION_DEPTH_6]: true -[BLOCK_RECURSION_DEPTH_7]: true -[BLOCK_RECURSION_DEPTH_8]: true -[BLOCK_RECURSION_DEPTH_9]: true +Unparsed: true Test case: SIZE_4 Source: 5 + size([0]) + size([0]) + size([1,2]) + size([1,2]) + size([1,2,3]) + size([1,2,3]) == 17 =====> Result: true -[BLOCK_COMMON_SUBEXPR_ONLY]: true -[BLOCK_RECURSION_DEPTH_1]: true -[BLOCK_RECURSION_DEPTH_2]: true -[BLOCK_RECURSION_DEPTH_3]: true -[BLOCK_RECURSION_DEPTH_4]: true -[BLOCK_RECURSION_DEPTH_5]: true -[BLOCK_RECURSION_DEPTH_6]: true -[BLOCK_RECURSION_DEPTH_7]: true -[BLOCK_RECURSION_DEPTH_8]: true -[BLOCK_RECURSION_DEPTH_9]: true +Unparsed: true Test case: TIMESTAMP Source: timestamp(int(timestamp(1000000000))).getFullYear() + timestamp(int(timestamp(75))).getFullYear() + timestamp(int(timestamp(50))).getFullYear() + timestamp(int(timestamp(1000000000))).getFullYear() + timestamp(int(timestamp(50))).getSeconds() + timestamp(int(timestamp(200))).getFullYear() + timestamp(int(timestamp(200))).getFullYear() + timestamp(int(timestamp(75))).getMinutes() + timestamp(int(timestamp(1000000000))).getFullYear() == 13934 =====> Result: true -[BLOCK_COMMON_SUBEXPR_ONLY]: true -[BLOCK_RECURSION_DEPTH_1]: true -[BLOCK_RECURSION_DEPTH_2]: true -[BLOCK_RECURSION_DEPTH_3]: true -[BLOCK_RECURSION_DEPTH_4]: true -[BLOCK_RECURSION_DEPTH_5]: true -[BLOCK_RECURSION_DEPTH_6]: true -[BLOCK_RECURSION_DEPTH_7]: true -[BLOCK_RECURSION_DEPTH_8]: true -[BLOCK_RECURSION_DEPTH_9]: true +Unparsed: true Test case: MAP_INDEX Source: {"a": 2}["a"] + {"a": 2}["a"] * {"a": 2}["a"] == 6 =====> Result: true -[BLOCK_COMMON_SUBEXPR_ONLY]: true -[BLOCK_RECURSION_DEPTH_1]: true -[BLOCK_RECURSION_DEPTH_2]: true -[BLOCK_RECURSION_DEPTH_3]: true -[BLOCK_RECURSION_DEPTH_4]: true -[BLOCK_RECURSION_DEPTH_5]: true -[BLOCK_RECURSION_DEPTH_6]: true -[BLOCK_RECURSION_DEPTH_7]: true -[BLOCK_RECURSION_DEPTH_8]: true -[BLOCK_RECURSION_DEPTH_9]: true +Unparsed: true Test case: NESTED_MAP_CONSTRUCTION Source: {'a': {'b': 1}, 'c': {'b': 1}, 'd': {'e': {'b': 1}}, 'e': {'e': {'b': 1}}} =====> Result: {a={b=1}, c={b=1}, d={e={b=1}}, e={e={b=1}}} -[BLOCK_COMMON_SUBEXPR_ONLY]: cel.@block([{"b": 1}, {"e": @index0}], {"a": @index0, "c": @index0, "d": @index1, "e": @index1}) -[BLOCK_RECURSION_DEPTH_1]: cel.@block([{"b": 1}, {"e": @index0}], {"a": @index0, "c": @index0, "d": @index1, "e": @index1}) -[BLOCK_RECURSION_DEPTH_2]: cel.@block([{"e": {"b": 1}}, {"b": 1}], {"a": @index1, "c": @index1, "d": @index0, "e": @index0}) -[BLOCK_RECURSION_DEPTH_3]: cel.@block([{"e": {"b": 1}}, {"b": 1}], {"a": @index1, "c": @index1, "d": @index0, "e": @index0}) -[BLOCK_RECURSION_DEPTH_4]: cel.@block([{"e": {"b": 1}}, {"b": 1}], {"a": @index1, "c": @index1, "d": @index0, "e": @index0}) -[BLOCK_RECURSION_DEPTH_5]: cel.@block([{"e": {"b": 1}}, {"b": 1}], {"a": @index1, "c": @index1, "d": @index0, "e": @index0}) -[BLOCK_RECURSION_DEPTH_6]: cel.@block([{"e": {"b": 1}}, {"b": 1}], {"a": @index1, "c": @index1, "d": @index0, "e": @index0}) -[BLOCK_RECURSION_DEPTH_7]: cel.@block([{"e": {"b": 1}}, {"b": 1}], {"a": @index1, "c": @index1, "d": @index0, "e": @index0}) -[BLOCK_RECURSION_DEPTH_8]: cel.@block([{"e": {"b": 1}}, {"b": 1}], {"a": @index1, "c": @index1, "d": @index0, "e": @index0}) -[BLOCK_RECURSION_DEPTH_9]: cel.@block([{"e": {"b": 1}}, {"b": 1}], {"a": @index1, "c": @index1, "d": @index0, "e": @index0}) +Unparsed: cel.@block([{"b": 1}, {"e": @index0}], {"a": @index0, "c": @index0, "d": @index1, "e": @index1}) Test case: NESTED_LIST_CONSTRUCTION Source: [1, [1,2,3,4], 2, [1,2,3,4], 5, [1,2,3,4], 7, [[1,2], [1,2,3,4]], [1,2]] =====> Result: [1, [1, 2, 3, 4], 2, [1, 2, 3, 4], 5, [1, 2, 3, 4], 7, [[1, 2], [1, 2, 3, 4]], [1, 2]] -[BLOCK_COMMON_SUBEXPR_ONLY]: cel.@block([[1, 2, 3, 4], [1, 2]], [1, @index0, 2, @index0, 5, @index0, 7, [@index1, @index0], @index1]) -[BLOCK_RECURSION_DEPTH_1]: cel.@block([[1, 2, 3, 4], [1, 2], [@index1, @index0]], [1, @index0, 2, @index0, 5, @index0, 7, @index2, @index1]) -[BLOCK_RECURSION_DEPTH_2]: cel.@block([[1, 2, 3, 4], [1, 2]], [1, @index0, 2, @index0, 5, @index0, 7, [@index1, @index0], @index1]) -[BLOCK_RECURSION_DEPTH_3]: cel.@block([[1, 2, 3, 4], [1, 2]], [1, @index0, 2, @index0, 5, @index0, 7, [@index1, @index0], @index1]) -[BLOCK_RECURSION_DEPTH_4]: cel.@block([[1, 2, 3, 4], [1, 2]], [1, @index0, 2, @index0, 5, @index0, 7, [@index1, @index0], @index1]) -[BLOCK_RECURSION_DEPTH_5]: cel.@block([[1, 2, 3, 4], [1, 2]], [1, @index0, 2, @index0, 5, @index0, 7, [@index1, @index0], @index1]) -[BLOCK_RECURSION_DEPTH_6]: cel.@block([[1, 2, 3, 4], [1, 2]], [1, @index0, 2, @index0, 5, @index0, 7, [@index1, @index0], @index1]) -[BLOCK_RECURSION_DEPTH_7]: cel.@block([[1, 2, 3, 4], [1, 2]], [1, @index0, 2, @index0, 5, @index0, 7, [@index1, @index0], @index1]) -[BLOCK_RECURSION_DEPTH_8]: cel.@block([[1, 2, 3, 4], [1, 2]], [1, @index0, 2, @index0, 5, @index0, 7, [@index1, @index0], @index1]) -[BLOCK_RECURSION_DEPTH_9]: cel.@block([[1, 2, 3, 4], [1, 2]], [1, @index0, 2, @index0, 5, @index0, 7, [@index1, @index0], @index1]) +Unparsed: cel.@block([[1, 2, 3, 4], [1, 2]], [1, @index0, 2, @index0, 5, @index0, 7, [@index1, @index0], @index1]) Test case: SELECT Source: msg.single_int64 + msg.single_int64 == 6 =====> Result: true -[BLOCK_COMMON_SUBEXPR_ONLY]: cel.@block([msg.single_int64], @index0 + @index0 == 6) -[BLOCK_RECURSION_DEPTH_1]: cel.@block([msg.single_int64, @index0 + @index0], @index1 == 6) -[BLOCK_RECURSION_DEPTH_2]: cel.@block([msg.single_int64], @index0 + @index0 == 6) -[BLOCK_RECURSION_DEPTH_3]: cel.@block([msg.single_int64], @index0 + @index0 == 6) -[BLOCK_RECURSION_DEPTH_4]: cel.@block([msg.single_int64], @index0 + @index0 == 6) -[BLOCK_RECURSION_DEPTH_5]: cel.@block([msg.single_int64], @index0 + @index0 == 6) -[BLOCK_RECURSION_DEPTH_6]: cel.@block([msg.single_int64], @index0 + @index0 == 6) -[BLOCK_RECURSION_DEPTH_7]: cel.@block([msg.single_int64], @index0 + @index0 == 6) -[BLOCK_RECURSION_DEPTH_8]: cel.@block([msg.single_int64], @index0 + @index0 == 6) -[BLOCK_RECURSION_DEPTH_9]: cel.@block([msg.single_int64], @index0 + @index0 == 6) +Unparsed: cel.@block([msg.single_int64], @index0 + @index0 == 6) Test case: SELECT_NESTED_1 Source: msg.oneof_type.payload.single_int64 + msg.oneof_type.payload.single_int32 + msg.oneof_type.payload.single_int64 + msg.single_int64 + msg.oneof_type.payload.oneof_type.payload.single_int64 == 31 =====> Result: true -[BLOCK_COMMON_SUBEXPR_ONLY]: cel.@block([msg.oneof_type.payload, @index0.single_int64], @index1 + @index0.single_int32 + @index1 + msg.single_int64 + @index0.oneof_type.payload.single_int64 == 31) -[BLOCK_RECURSION_DEPTH_1]: cel.@block([msg.oneof_type, @index0.payload, @index1.single_int64, @index1.single_int32, @index2 + @index3, @index4 + @index2, msg.single_int64, @index5 + @index6, @index1.oneof_type, @index8.payload, @index9.single_int64, @index7 + @index10], @index11 == 31) -[BLOCK_RECURSION_DEPTH_2]: cel.@block([msg.oneof_type.payload, @index0.single_int64, @index1 + @index0.single_int32, @index2 + @index1 + msg.single_int64, @index0.oneof_type.payload, @index3 + @index4.single_int64], @index5 == 31) -[BLOCK_RECURSION_DEPTH_3]: cel.@block([msg.oneof_type.payload.single_int64, msg.oneof_type.payload, @index0 + @index1.single_int32 + @index0, @index1.oneof_type.payload.single_int64, @index2 + msg.single_int64 + @index3], @index4 == 31) -[BLOCK_RECURSION_DEPTH_4]: cel.@block([msg.oneof_type.payload.single_int64, msg.oneof_type.payload, @index0 + @index1.single_int32 + @index0 + msg.single_int64, @index2 + @index1.oneof_type.payload.single_int64], @index3 == 31) -[BLOCK_RECURSION_DEPTH_5]: cel.@block([msg.oneof_type.payload.single_int64, msg.oneof_type.payload, @index0 + @index1.single_int32 + @index0 + msg.single_int64 + @index1.oneof_type.payload.single_int64], @index2 == 31) -[BLOCK_RECURSION_DEPTH_6]: cel.@block([msg.oneof_type.payload.single_int64, msg.oneof_type.payload], @index0 + @index1.single_int32 + @index0 + msg.single_int64 + @index1.oneof_type.payload.single_int64 == 31) -[BLOCK_RECURSION_DEPTH_7]: cel.@block([msg.oneof_type.payload.single_int64, msg.oneof_type.payload], @index0 + @index1.single_int32 + @index0 + msg.single_int64 + @index1.oneof_type.payload.single_int64 == 31) -[BLOCK_RECURSION_DEPTH_8]: cel.@block([msg.oneof_type.payload.single_int64, msg.oneof_type.payload], @index0 + @index1.single_int32 + @index0 + msg.single_int64 + @index1.oneof_type.payload.single_int64 == 31) -[BLOCK_RECURSION_DEPTH_9]: cel.@block([msg.oneof_type.payload.single_int64, msg.oneof_type.payload], @index0 + @index1.single_int32 + @index0 + msg.single_int64 + @index1.oneof_type.payload.single_int64 == 31) +Unparsed: cel.@block([msg.oneof_type.payload, @index0.single_int64], @index1 + @index0.single_int32 + @index1 + msg.single_int64 + @index0.oneof_type.payload.single_int64 == 31) Test case: SELECT_NESTED_2 Source: true || msg.oneof_type.payload.oneof_type.payload.oneof_type.payload.oneof_type.payload.single_bool || msg.oneof_type.payload.oneof_type.payload.oneof_type.child.child.payload.single_bool =====> Result: true -[BLOCK_COMMON_SUBEXPR_ONLY]: true -[BLOCK_RECURSION_DEPTH_1]: true -[BLOCK_RECURSION_DEPTH_2]: true -[BLOCK_RECURSION_DEPTH_3]: true -[BLOCK_RECURSION_DEPTH_4]: true -[BLOCK_RECURSION_DEPTH_5]: true -[BLOCK_RECURSION_DEPTH_6]: true -[BLOCK_RECURSION_DEPTH_7]: true -[BLOCK_RECURSION_DEPTH_8]: true -[BLOCK_RECURSION_DEPTH_9]: true +Unparsed: true Test case: SELECT_NESTED_MESSAGE_MAP_INDEX_1 Source: msg.oneof_type.payload.map_int32_int64[1] + msg.oneof_type.payload.map_int32_int64[1] + msg.oneof_type.payload.map_int32_int64[1] == 15 =====> Result: true -[BLOCK_COMMON_SUBEXPR_ONLY]: cel.@block([msg.oneof_type.payload.map_int32_int64[1]], @index0 + @index0 + @index0 == 15) -[BLOCK_RECURSION_DEPTH_1]: cel.@block([msg.oneof_type, @index0.payload, @index1.map_int32_int64, @index2[1], @index3 + @index3, @index4 + @index3], @index5 == 15) -[BLOCK_RECURSION_DEPTH_2]: cel.@block([msg.oneof_type.payload, @index0.map_int32_int64[1], @index1 + @index1 + @index1], @index2 == 15) -[BLOCK_RECURSION_DEPTH_3]: cel.@block([msg.oneof_type.payload.map_int32_int64, @index0[1]], @index1 + @index1 + @index1 == 15) -[BLOCK_RECURSION_DEPTH_4]: cel.@block([msg.oneof_type.payload.map_int32_int64[1]], @index0 + @index0 + @index0 == 15) -[BLOCK_RECURSION_DEPTH_5]: cel.@block([msg.oneof_type.payload.map_int32_int64[1]], @index0 + @index0 + @index0 == 15) -[BLOCK_RECURSION_DEPTH_6]: cel.@block([msg.oneof_type.payload.map_int32_int64[1]], @index0 + @index0 + @index0 == 15) -[BLOCK_RECURSION_DEPTH_7]: cel.@block([msg.oneof_type.payload.map_int32_int64[1]], @index0 + @index0 + @index0 == 15) -[BLOCK_RECURSION_DEPTH_8]: cel.@block([msg.oneof_type.payload.map_int32_int64[1]], @index0 + @index0 + @index0 == 15) -[BLOCK_RECURSION_DEPTH_9]: cel.@block([msg.oneof_type.payload.map_int32_int64[1]], @index0 + @index0 + @index0 == 15) +Unparsed: cel.@block([msg.oneof_type.payload.map_int32_int64[1]], @index0 + @index0 + @index0 == 15) Test case: SELECT_NESTED_MESSAGE_MAP_INDEX_2 Source: msg.oneof_type.payload.map_int32_int64[0] + msg.oneof_type.payload.map_int32_int64[1] + msg.oneof_type.payload.map_int32_int64[2] == 8 =====> Result: true -[BLOCK_COMMON_SUBEXPR_ONLY]: cel.@block([msg.oneof_type.payload.map_int32_int64], @index0[0] + @index0[1] + @index0[2] == 8) -[BLOCK_RECURSION_DEPTH_1]: cel.@block([msg.oneof_type, @index0.payload, @index1.map_int32_int64, @index2[0], @index2[1], @index3 + @index4, @index2[2], @index5 + @index6], @index7 == 8) -[BLOCK_RECURSION_DEPTH_2]: cel.@block([msg.oneof_type.payload, @index0.map_int32_int64, @index1[0] + @index1[1], @index2 + @index1[2]], @index3 == 8) -[BLOCK_RECURSION_DEPTH_3]: cel.@block([msg.oneof_type.payload.map_int32_int64, @index0[0] + @index0[1] + @index0[2]], @index1 == 8) -[BLOCK_RECURSION_DEPTH_4]: cel.@block([msg.oneof_type.payload.map_int32_int64], @index0[0] + @index0[1] + @index0[2] == 8) -[BLOCK_RECURSION_DEPTH_5]: cel.@block([msg.oneof_type.payload.map_int32_int64], @index0[0] + @index0[1] + @index0[2] == 8) -[BLOCK_RECURSION_DEPTH_6]: cel.@block([msg.oneof_type.payload.map_int32_int64], @index0[0] + @index0[1] + @index0[2] == 8) -[BLOCK_RECURSION_DEPTH_7]: cel.@block([msg.oneof_type.payload.map_int32_int64], @index0[0] + @index0[1] + @index0[2] == 8) -[BLOCK_RECURSION_DEPTH_8]: cel.@block([msg.oneof_type.payload.map_int32_int64], @index0[0] + @index0[1] + @index0[2] == 8) -[BLOCK_RECURSION_DEPTH_9]: cel.@block([msg.oneof_type.payload.map_int32_int64], @index0[0] + @index0[1] + @index0[2] == 8) +Unparsed: cel.@block([msg.oneof_type.payload.map_int32_int64], @index0[0] + @index0[1] + @index0[2] == 8) Test case: SELECT_NESTED_NO_COMMON_SUBEXPR Source: msg.oneof_type.payload.oneof_type.payload.oneof_type.payload.oneof_type.payload.single_int64 =====> Result: 0 -[BLOCK_COMMON_SUBEXPR_ONLY]: msg.oneof_type.payload.oneof_type.payload.oneof_type.payload.oneof_type.payload.single_int64 -[BLOCK_RECURSION_DEPTH_1]: cel.@block([msg.oneof_type, @index0.payload, @index1.oneof_type, @index2.payload, @index3.oneof_type, @index4.payload, @index5.oneof_type, @index6.payload], @index7.single_int64) -[BLOCK_RECURSION_DEPTH_2]: cel.@block([msg.oneof_type.payload, @index0.oneof_type.payload, @index1.oneof_type.payload, @index2.oneof_type.payload], @index3.single_int64) -[BLOCK_RECURSION_DEPTH_3]: cel.@block([msg.oneof_type.payload.oneof_type, @index0.payload.oneof_type.payload], @index1.oneof_type.payload.single_int64) -[BLOCK_RECURSION_DEPTH_4]: cel.@block([msg.oneof_type.payload.oneof_type.payload, @index0.oneof_type.payload.oneof_type.payload], @index1.single_int64) -[BLOCK_RECURSION_DEPTH_5]: cel.@block([msg.oneof_type.payload.oneof_type.payload.oneof_type], @index0.payload.oneof_type.payload.single_int64) -[BLOCK_RECURSION_DEPTH_6]: cel.@block([msg.oneof_type.payload.oneof_type.payload.oneof_type.payload], @index0.oneof_type.payload.single_int64) -[BLOCK_RECURSION_DEPTH_7]: cel.@block([msg.oneof_type.payload.oneof_type.payload.oneof_type.payload.oneof_type], @index0.payload.single_int64) -[BLOCK_RECURSION_DEPTH_8]: cel.@block([msg.oneof_type.payload.oneof_type.payload.oneof_type.payload.oneof_type.payload], @index0.single_int64) -[BLOCK_RECURSION_DEPTH_9]: msg.oneof_type.payload.oneof_type.payload.oneof_type.payload.oneof_type.payload.single_int64 +Unparsed: msg.oneof_type.payload.oneof_type.payload.oneof_type.payload.oneof_type.payload.single_int64 Test case: TERNARY Source: (msg.single_int64 > 0 ? msg.single_int64 : 0) == 3 =====> Result: true -[BLOCK_COMMON_SUBEXPR_ONLY]: cel.@block([msg.single_int64], ((@index0 > 0) ? @index0 : 0) == 3) -[BLOCK_RECURSION_DEPTH_1]: cel.@block([msg.single_int64, @index0 > 0, @index1 ? @index0 : 0], @index2 == 3) -[BLOCK_RECURSION_DEPTH_2]: cel.@block([msg.single_int64, (@index0 > 0) ? @index0 : 0], @index1 == 3) -[BLOCK_RECURSION_DEPTH_3]: cel.@block([msg.single_int64], ((@index0 > 0) ? @index0 : 0) == 3) -[BLOCK_RECURSION_DEPTH_4]: cel.@block([msg.single_int64], ((@index0 > 0) ? @index0 : 0) == 3) -[BLOCK_RECURSION_DEPTH_5]: cel.@block([msg.single_int64], ((@index0 > 0) ? @index0 : 0) == 3) -[BLOCK_RECURSION_DEPTH_6]: cel.@block([msg.single_int64], ((@index0 > 0) ? @index0 : 0) == 3) -[BLOCK_RECURSION_DEPTH_7]: cel.@block([msg.single_int64], ((@index0 > 0) ? @index0 : 0) == 3) -[BLOCK_RECURSION_DEPTH_8]: cel.@block([msg.single_int64], ((@index0 > 0) ? @index0 : 0) == 3) -[BLOCK_RECURSION_DEPTH_9]: cel.@block([msg.single_int64], ((@index0 > 0) ? @index0 : 0) == 3) +Unparsed: cel.@block([msg.single_int64], ((@index0 > 0) ? @index0 : 0) == 3) Test case: TERNARY_BIND_RHS_ONLY Source: false ? false : (msg.single_int64) + ((msg.single_int64 + 1) * 2) == 11 =====> Result: true -[BLOCK_COMMON_SUBEXPR_ONLY]: cel.@block([msg.single_int64], @index0 + (@index0 + 1) * 2 == 11) -[BLOCK_RECURSION_DEPTH_1]: cel.@block([msg.single_int64, @index0 + 1, @index1 * 2, @index0 + @index2], @index3 == 11) -[BLOCK_RECURSION_DEPTH_2]: cel.@block([msg.single_int64, (@index0 + 1) * 2], @index0 + @index1 == 11) -[BLOCK_RECURSION_DEPTH_3]: cel.@block([msg.single_int64, @index0 + (@index0 + 1) * 2], @index1 == 11) -[BLOCK_RECURSION_DEPTH_4]: cel.@block([msg.single_int64], @index0 + (@index0 + 1) * 2 == 11) -[BLOCK_RECURSION_DEPTH_5]: cel.@block([msg.single_int64], @index0 + (@index0 + 1) * 2 == 11) -[BLOCK_RECURSION_DEPTH_6]: cel.@block([msg.single_int64], @index0 + (@index0 + 1) * 2 == 11) -[BLOCK_RECURSION_DEPTH_7]: cel.@block([msg.single_int64], @index0 + (@index0 + 1) * 2 == 11) -[BLOCK_RECURSION_DEPTH_8]: cel.@block([msg.single_int64], @index0 + (@index0 + 1) * 2 == 11) -[BLOCK_RECURSION_DEPTH_9]: cel.@block([msg.single_int64], @index0 + (@index0 + 1) * 2 == 11) +Unparsed: cel.@block([msg.single_int64], @index0 + (@index0 + 1) * 2 == 11) Test case: NESTED_TERNARY Source: (msg.single_int64 > 0 ? (msg.single_int32 > 0 ? msg.single_int64 + msg.single_int32 : 0) : 0) == 8 =====> Result: true -[BLOCK_COMMON_SUBEXPR_ONLY]: cel.@block([msg.single_int64, msg.single_int32], ((@index0 > 0) ? ((@index1 > 0) ? (@index0 + @index1) : 0) : 0) == 8) -[BLOCK_RECURSION_DEPTH_1]: cel.@block([msg.single_int64, msg.single_int32, @index0 > 0, @index1 > 0, @index0 + @index1, @index3 ? @index4 : 0, @index2 ? @index5 : 0], @index6 == 8) -[BLOCK_RECURSION_DEPTH_2]: cel.@block([msg.single_int64, msg.single_int32, (@index1 > 0) ? (@index0 + @index1) : 0, (@index0 > 0) ? @index2 : 0], @index3 == 8) -[BLOCK_RECURSION_DEPTH_3]: cel.@block([msg.single_int64, msg.single_int32, (@index0 > 0) ? ((@index1 > 0) ? (@index0 + @index1) : 0) : 0], @index2 == 8) -[BLOCK_RECURSION_DEPTH_4]: cel.@block([msg.single_int64, msg.single_int32], ((@index0 > 0) ? ((@index1 > 0) ? (@index0 + @index1) : 0) : 0) == 8) -[BLOCK_RECURSION_DEPTH_5]: cel.@block([msg.single_int64, msg.single_int32], ((@index0 > 0) ? ((@index1 > 0) ? (@index0 + @index1) : 0) : 0) == 8) -[BLOCK_RECURSION_DEPTH_6]: cel.@block([msg.single_int64, msg.single_int32], ((@index0 > 0) ? ((@index1 > 0) ? (@index0 + @index1) : 0) : 0) == 8) -[BLOCK_RECURSION_DEPTH_7]: cel.@block([msg.single_int64, msg.single_int32], ((@index0 > 0) ? ((@index1 > 0) ? (@index0 + @index1) : 0) : 0) == 8) -[BLOCK_RECURSION_DEPTH_8]: cel.@block([msg.single_int64, msg.single_int32], ((@index0 > 0) ? ((@index1 > 0) ? (@index0 + @index1) : 0) : 0) == 8) -[BLOCK_RECURSION_DEPTH_9]: cel.@block([msg.single_int64, msg.single_int32], ((@index0 > 0) ? ((@index1 > 0) ? (@index0 + @index1) : 0) : 0) == 8) +Unparsed: cel.@block([msg.single_int64, msg.single_int32], ((@index0 > 0) ? ((@index1 > 0) ? (@index0 + @index1) : 0) : 0) == 8) Test case: MULTIPLE_MACROS_1 Source: size([[1].exists(i, i > 0)]) + size([[1].exists(j, j > 0)]) + size([[2].exists(k, k > 1)]) + size([[2].exists(l, l > 1)]) == 4 =====> Result: true -[BLOCK_COMMON_SUBEXPR_ONLY]: true -[BLOCK_RECURSION_DEPTH_1]: true -[BLOCK_RECURSION_DEPTH_2]: true -[BLOCK_RECURSION_DEPTH_3]: true -[BLOCK_RECURSION_DEPTH_4]: true -[BLOCK_RECURSION_DEPTH_5]: true -[BLOCK_RECURSION_DEPTH_6]: true -[BLOCK_RECURSION_DEPTH_7]: true -[BLOCK_RECURSION_DEPTH_8]: true -[BLOCK_RECURSION_DEPTH_9]: true +Unparsed: true Test case: MULTIPLE_MACROS_2 Source: [[1].exists(i, i > 0)] + [[1].exists(j, j > 0)] + [['a'].exists(k, k == 'a')] + [['a'].exists(l, l == 'a')] == [true, true, true, true] =====> Result: true -[BLOCK_COMMON_SUBEXPR_ONLY]: true -[BLOCK_RECURSION_DEPTH_1]: true -[BLOCK_RECURSION_DEPTH_2]: true -[BLOCK_RECURSION_DEPTH_3]: true -[BLOCK_RECURSION_DEPTH_4]: true -[BLOCK_RECURSION_DEPTH_5]: true -[BLOCK_RECURSION_DEPTH_6]: true -[BLOCK_RECURSION_DEPTH_7]: true -[BLOCK_RECURSION_DEPTH_8]: true -[BLOCK_RECURSION_DEPTH_9]: true +Unparsed: true Test case: MULTIPLE_MACROS_3 Source: [1].exists(i, i > 0) && [1].exists(j, j > 0) && [1].exists(k, k > 1) && [2].exists(l, l > 1) =====> Result: false -[BLOCK_COMMON_SUBEXPR_ONLY]: false -[BLOCK_RECURSION_DEPTH_1]: false -[BLOCK_RECURSION_DEPTH_2]: false -[BLOCK_RECURSION_DEPTH_3]: false -[BLOCK_RECURSION_DEPTH_4]: false -[BLOCK_RECURSION_DEPTH_5]: false -[BLOCK_RECURSION_DEPTH_6]: false -[BLOCK_RECURSION_DEPTH_7]: false -[BLOCK_RECURSION_DEPTH_8]: false -[BLOCK_RECURSION_DEPTH_9]: false +Unparsed: false Test case: MULTIPLE_MACROS_COMP_V2_1 Source: size([[1].exists(i,x,i > 0 && x >= 0)]) + size([[1].exists(j, y, j > 0 && y >= 0)]) + size([[2].exists(k,z,k > 1 && z >= 0)]) + size([[2].exists(l, w, l > 1 && w >= 0)]) == 4 =====> Result: true -[BLOCK_COMMON_SUBEXPR_ONLY]: true -[BLOCK_RECURSION_DEPTH_1]: true -[BLOCK_RECURSION_DEPTH_2]: true -[BLOCK_RECURSION_DEPTH_3]: true -[BLOCK_RECURSION_DEPTH_4]: true -[BLOCK_RECURSION_DEPTH_5]: true -[BLOCK_RECURSION_DEPTH_6]: true -[BLOCK_RECURSION_DEPTH_7]: true -[BLOCK_RECURSION_DEPTH_8]: true -[BLOCK_RECURSION_DEPTH_9]: true +Unparsed: true Test case: MULTIPLE_MACROS_COMP_V2_2 Source: [1].exists(i, x, i > 0 && x > 0) && [1].exists(j, y, j > 0 && y > 0) && [1].exists(k, z, k > 1 && z > 0) && [2].exists(l, w, l > 1 && w > 0) =====> Result: false -[BLOCK_COMMON_SUBEXPR_ONLY]: false -[BLOCK_RECURSION_DEPTH_1]: false -[BLOCK_RECURSION_DEPTH_2]: false -[BLOCK_RECURSION_DEPTH_3]: false -[BLOCK_RECURSION_DEPTH_4]: false -[BLOCK_RECURSION_DEPTH_5]: false -[BLOCK_RECURSION_DEPTH_6]: false -[BLOCK_RECURSION_DEPTH_7]: false -[BLOCK_RECURSION_DEPTH_8]: false -[BLOCK_RECURSION_DEPTH_9]: false +Unparsed: false Test case: NESTED_MACROS Source: [1,2,3].map(i, [1, 2, 3].map(i, i + 1)) == [[2, 3, 4], [2, 3, 4], [2, 3, 4]] =====> Result: true -[BLOCK_COMMON_SUBEXPR_ONLY]: true -[BLOCK_RECURSION_DEPTH_1]: true -[BLOCK_RECURSION_DEPTH_2]: true -[BLOCK_RECURSION_DEPTH_3]: true -[BLOCK_RECURSION_DEPTH_4]: true -[BLOCK_RECURSION_DEPTH_5]: true -[BLOCK_RECURSION_DEPTH_6]: true -[BLOCK_RECURSION_DEPTH_7]: true -[BLOCK_RECURSION_DEPTH_8]: true -[BLOCK_RECURSION_DEPTH_9]: true +Unparsed: true Test case: NESTED_MACROS_2 Source: [1, 2].map(y, [1, 2, 3].filter(x, x == y)) == [[1], [2]] =====> Result: true -[BLOCK_COMMON_SUBEXPR_ONLY]: true -[BLOCK_RECURSION_DEPTH_1]: true -[BLOCK_RECURSION_DEPTH_2]: true -[BLOCK_RECURSION_DEPTH_3]: true -[BLOCK_RECURSION_DEPTH_4]: true -[BLOCK_RECURSION_DEPTH_5]: true -[BLOCK_RECURSION_DEPTH_6]: true -[BLOCK_RECURSION_DEPTH_7]: true -[BLOCK_RECURSION_DEPTH_8]: true -[BLOCK_RECURSION_DEPTH_9]: true +Unparsed: true Test case: NESTED_MACROS_3 Source: [1,2,3].map(i, i * 2) + [1,2,3].map(i, i * 2).map(i, i * 2) =====> Result: [2, 4, 6, 4, 8, 12] -[BLOCK_COMMON_SUBEXPR_ONLY]: [2, 4, 6, 4, 8, 12] -[BLOCK_RECURSION_DEPTH_1]: [2, 4, 6, 4, 8, 12] -[BLOCK_RECURSION_DEPTH_2]: [2, 4, 6, 4, 8, 12] -[BLOCK_RECURSION_DEPTH_3]: [2, 4, 6, 4, 8, 12] -[BLOCK_RECURSION_DEPTH_4]: [2, 4, 6, 4, 8, 12] -[BLOCK_RECURSION_DEPTH_5]: [2, 4, 6, 4, 8, 12] -[BLOCK_RECURSION_DEPTH_6]: [2, 4, 6, 4, 8, 12] -[BLOCK_RECURSION_DEPTH_7]: [2, 4, 6, 4, 8, 12] -[BLOCK_RECURSION_DEPTH_8]: [2, 4, 6, 4, 8, 12] -[BLOCK_RECURSION_DEPTH_9]: [2, 4, 6, 4, 8, 12] +Unparsed: [2, 4, 6, 4, 8, 12] Test case: NESTED_MACROS_COMP_V2_1 Source: [1,2,3].transformList(i, v, [1, 2, 3].transformList(i, v, i + v + 1)) == [[2, 4, 6], [2, 4, 6], [2, 4, 6]] =====> Result: true -[BLOCK_COMMON_SUBEXPR_ONLY]: true -[BLOCK_RECURSION_DEPTH_1]: true -[BLOCK_RECURSION_DEPTH_2]: true -[BLOCK_RECURSION_DEPTH_3]: true -[BLOCK_RECURSION_DEPTH_4]: true -[BLOCK_RECURSION_DEPTH_5]: true -[BLOCK_RECURSION_DEPTH_6]: true -[BLOCK_RECURSION_DEPTH_7]: true -[BLOCK_RECURSION_DEPTH_8]: true -[BLOCK_RECURSION_DEPTH_9]: true +Unparsed: true Test case: NESTED_MACROS_COMP_V2_2 Source: [1, 2].transformList(i, y, [1, 2, 3].filter(x, x == y && i < y)) == [[1], [2]] =====> Result: true -[BLOCK_COMMON_SUBEXPR_ONLY]: true -[BLOCK_RECURSION_DEPTH_1]: true -[BLOCK_RECURSION_DEPTH_2]: true -[BLOCK_RECURSION_DEPTH_3]: true -[BLOCK_RECURSION_DEPTH_4]: true -[BLOCK_RECURSION_DEPTH_5]: true -[BLOCK_RECURSION_DEPTH_6]: true -[BLOCK_RECURSION_DEPTH_7]: true -[BLOCK_RECURSION_DEPTH_8]: true -[BLOCK_RECURSION_DEPTH_9]: true +Unparsed: true Test case: ADJACENT_NESTED_MACROS Source: [1,2,3].map(i, [1, 2, 3].map(i, i + 1)) == [1,2,3].map(j, [1, 2, 3].map(j, j + 1)) =====> Result: true -[BLOCK_COMMON_SUBEXPR_ONLY]: true -[BLOCK_RECURSION_DEPTH_1]: true -[BLOCK_RECURSION_DEPTH_2]: true -[BLOCK_RECURSION_DEPTH_3]: true -[BLOCK_RECURSION_DEPTH_4]: true -[BLOCK_RECURSION_DEPTH_5]: true -[BLOCK_RECURSION_DEPTH_6]: true -[BLOCK_RECURSION_DEPTH_7]: true -[BLOCK_RECURSION_DEPTH_8]: true -[BLOCK_RECURSION_DEPTH_9]: true +Unparsed: true Test case: ADJACENT_NESTED_MACROS_COMP_V2 Source: [1,2,3].transformMap(i, x, [1, 2, 3].transformMap(i, x, i + x + 1)) == [1,2,3].transformMap(j, y, [1, 2, 3].transformMap(j, y, j + y + 1)) =====> Result: true -[BLOCK_COMMON_SUBEXPR_ONLY]: true -[BLOCK_RECURSION_DEPTH_1]: true -[BLOCK_RECURSION_DEPTH_2]: true -[BLOCK_RECURSION_DEPTH_3]: true -[BLOCK_RECURSION_DEPTH_4]: true -[BLOCK_RECURSION_DEPTH_5]: true -[BLOCK_RECURSION_DEPTH_6]: true -[BLOCK_RECURSION_DEPTH_7]: true -[BLOCK_RECURSION_DEPTH_8]: true -[BLOCK_RECURSION_DEPTH_9]: true +Unparsed: true Test case: INCLUSION_LIST Source: 1 in [1,2,3] && 2 in [1,2,3] && 3 in [3, [1,2,3]] && 1 in [1,2,3] =====> Result: true -[BLOCK_COMMON_SUBEXPR_ONLY]: true -[BLOCK_RECURSION_DEPTH_1]: true -[BLOCK_RECURSION_DEPTH_2]: true -[BLOCK_RECURSION_DEPTH_3]: true -[BLOCK_RECURSION_DEPTH_4]: true -[BLOCK_RECURSION_DEPTH_5]: true -[BLOCK_RECURSION_DEPTH_6]: true -[BLOCK_RECURSION_DEPTH_7]: true -[BLOCK_RECURSION_DEPTH_8]: true -[BLOCK_RECURSION_DEPTH_9]: true +Unparsed: true Test case: INCLUSION_MAP Source: 2 in {'a': 1, 2: {true: false}, 3: {true: false}} =====> Result: true -[BLOCK_COMMON_SUBEXPR_ONLY]: true -[BLOCK_RECURSION_DEPTH_1]: true -[BLOCK_RECURSION_DEPTH_2]: true -[BLOCK_RECURSION_DEPTH_3]: true -[BLOCK_RECURSION_DEPTH_4]: true -[BLOCK_RECURSION_DEPTH_5]: true -[BLOCK_RECURSION_DEPTH_6]: true -[BLOCK_RECURSION_DEPTH_7]: true -[BLOCK_RECURSION_DEPTH_8]: true -[BLOCK_RECURSION_DEPTH_9]: true +Unparsed: true Test case: MACRO_ITER_VAR_NOT_REFERENCED Source: [1,2].map(i, [1, 2].map(i, [3,4])) == [[[3, 4], [3, 4]], [[3, 4], [3, 4]]] =====> Result: true -[BLOCK_COMMON_SUBEXPR_ONLY]: true -[BLOCK_RECURSION_DEPTH_1]: true -[BLOCK_RECURSION_DEPTH_2]: true -[BLOCK_RECURSION_DEPTH_3]: true -[BLOCK_RECURSION_DEPTH_4]: true -[BLOCK_RECURSION_DEPTH_5]: true -[BLOCK_RECURSION_DEPTH_6]: true -[BLOCK_RECURSION_DEPTH_7]: true -[BLOCK_RECURSION_DEPTH_8]: true -[BLOCK_RECURSION_DEPTH_9]: true +Unparsed: true Test case: MACRO_ITER_VAR2_NOT_REFERENCED Source: [1,2].transformList(i, v, [1, 2].transformList(i, v, [3,4])) == [[[3, 4], [3, 4]], [[3, 4], [3, 4]]] =====> Result: true -[BLOCK_COMMON_SUBEXPR_ONLY]: true -[BLOCK_RECURSION_DEPTH_1]: true -[BLOCK_RECURSION_DEPTH_2]: true -[BLOCK_RECURSION_DEPTH_3]: true -[BLOCK_RECURSION_DEPTH_4]: true -[BLOCK_RECURSION_DEPTH_5]: true -[BLOCK_RECURSION_DEPTH_6]: true -[BLOCK_RECURSION_DEPTH_7]: true -[BLOCK_RECURSION_DEPTH_8]: true -[BLOCK_RECURSION_DEPTH_9]: true +Unparsed: true Test case: MACRO_SHADOWED_VARIABLE Source: [x - 1 > 3 ? x - 1 : 5].exists(x, x - 1 > 3) || x - 1 > 3 =====> Result: true -[BLOCK_COMMON_SUBEXPR_ONLY]: cel.@block([x - 1, @index0 > 3], [@index1 ? @index0 : 5].exists(@it:0:0, @it:0:0 - 1 > 3) || @index1) -[BLOCK_RECURSION_DEPTH_1]: cel.@block([x - 1, @index0 > 3, @index1 ? @index0 : 5, [@index2]], @index3.exists(@it:0:0, @it:0:0 - 1 > 3) || @index1) -[BLOCK_RECURSION_DEPTH_2]: cel.@block([x - 1 > 3, @index0 ? (x - 1) : 5, [@index1]], @index2.exists(@it:0:0, @it:0:0 - 1 > 3) || @index0) -[BLOCK_RECURSION_DEPTH_3]: cel.@block([x - 1 > 3, [@index0 ? (x - 1) : 5]], @index1.exists(@it:0:0, @it:0:0 - 1 > 3) || @index0) -[BLOCK_RECURSION_DEPTH_4]: cel.@block([x - 1 > 3], [@index0 ? (x - 1) : 5].exists(@it:0:0, @it:0:0 - 1 > 3) || @index0) -[BLOCK_RECURSION_DEPTH_5]: cel.@block([x - 1 > 3], [@index0 ? (x - 1) : 5].exists(@it:0:0, @it:0:0 - 1 > 3) || @index0) -[BLOCK_RECURSION_DEPTH_6]: cel.@block([x - 1 > 3], [@index0 ? (x - 1) : 5].exists(@it:0:0, @it:0:0 - 1 > 3) || @index0) -[BLOCK_RECURSION_DEPTH_7]: cel.@block([x - 1 > 3], [@index0 ? (x - 1) : 5].exists(@it:0:0, @it:0:0 - 1 > 3) || @index0) -[BLOCK_RECURSION_DEPTH_8]: cel.@block([x - 1 > 3], [@index0 ? (x - 1) : 5].exists(@it:0:0, @it:0:0 - 1 > 3) || @index0) -[BLOCK_RECURSION_DEPTH_9]: cel.@block([x - 1 > 3], [@index0 ? (x - 1) : 5].exists(@it:0:0, @it:0:0 - 1 > 3) || @index0) +Unparsed: cel.@block([x - 1, @index0 > 3], [@index1 ? @index0 : 5].exists(@it:0:0, @it:0:0 - 1 > 3) || @index1) Test case: MACRO_SHADOWED_VARIABLE_2 Source: ["foo", "bar"].map(x, [x + x, x + x]).map(x, [x + x, x + x]) =====> Result: [[[foofoo, foofoo, foofoo, foofoo], [foofoo, foofoo, foofoo, foofoo]], [[barbar, barbar, barbar, barbar], [barbar, barbar, barbar, barbar]]] -[BLOCK_COMMON_SUBEXPR_ONLY]: cel.@block([["foofoo", "foofoo", "foofoo", "foofoo"], ["barbar", "barbar", "barbar", "barbar"]], [[@index0, @index0], [@index1, @index1]]) -[BLOCK_RECURSION_DEPTH_1]: cel.@block([["foofoo", "foofoo", "foofoo", "foofoo"], ["barbar", "barbar", "barbar", "barbar"], [@index0, @index0], [@index1, @index1]], [@index2, @index3]) -[BLOCK_RECURSION_DEPTH_2]: cel.@block([["foofoo", "foofoo", "foofoo", "foofoo"], ["barbar", "barbar", "barbar", "barbar"]], [[@index0, @index0], [@index1, @index1]]) -[BLOCK_RECURSION_DEPTH_3]: cel.@block([["foofoo", "foofoo", "foofoo", "foofoo"], ["barbar", "barbar", "barbar", "barbar"]], [[@index0, @index0], [@index1, @index1]]) -[BLOCK_RECURSION_DEPTH_4]: cel.@block([["foofoo", "foofoo", "foofoo", "foofoo"], ["barbar", "barbar", "barbar", "barbar"]], [[@index0, @index0], [@index1, @index1]]) -[BLOCK_RECURSION_DEPTH_5]: cel.@block([["foofoo", "foofoo", "foofoo", "foofoo"], ["barbar", "barbar", "barbar", "barbar"]], [[@index0, @index0], [@index1, @index1]]) -[BLOCK_RECURSION_DEPTH_6]: cel.@block([["foofoo", "foofoo", "foofoo", "foofoo"], ["barbar", "barbar", "barbar", "barbar"]], [[@index0, @index0], [@index1, @index1]]) -[BLOCK_RECURSION_DEPTH_7]: cel.@block([["foofoo", "foofoo", "foofoo", "foofoo"], ["barbar", "barbar", "barbar", "barbar"]], [[@index0, @index0], [@index1, @index1]]) -[BLOCK_RECURSION_DEPTH_8]: cel.@block([["foofoo", "foofoo", "foofoo", "foofoo"], ["barbar", "barbar", "barbar", "barbar"]], [[@index0, @index0], [@index1, @index1]]) -[BLOCK_RECURSION_DEPTH_9]: cel.@block([["foofoo", "foofoo", "foofoo", "foofoo"], ["barbar", "barbar", "barbar", "barbar"]], [[@index0, @index0], [@index1, @index1]]) +Unparsed: cel.@block([["foofoo", "foofoo", "foofoo", "foofoo"], ["barbar", "barbar", "barbar", "barbar"]], [[@index0, @index0], [@index1, @index1]]) Test case: MACRO_SHADOWED_VARIABLE_COMP_V2_1 Source: [x - y - 1 > 3 ? x - y - 1 : 5].exists(x, y, x - y - 1 > 3) || x - y - 1 > 3 =====> Result: false -[BLOCK_COMMON_SUBEXPR_ONLY]: cel.@block([x - y - 1, @index0 > 3], [@index1 ? @index0 : 5].exists(@it:0:0, @it2:0:0, @it:0:0 - @it2:0:0 - 1 > 3) || @index1) -[BLOCK_RECURSION_DEPTH_1]: cel.@block([x - y, @index0 - 1, @index1 > 3, @index2 ? @index1 : 5, [@index3]], @index4.exists(@it:0:0, @it2:0:0, @it:0:0 - @it2:0:0 - 1 > 3) || @index2) -[BLOCK_RECURSION_DEPTH_2]: cel.@block([x - y - 1, @index0 > 3, [@index1 ? @index0 : 5]], @index2.exists(@it:0:0, @it2:0:0, @it:0:0 - @it2:0:0 - 1 > 3) || @index1) -[BLOCK_RECURSION_DEPTH_3]: cel.@block([x - y - 1 > 3, @index0 ? (x - y - 1) : 5, [@index1]], @index2.exists(@it:0:0, @it2:0:0, @it:0:0 - @it2:0:0 - 1 > 3) || @index0) -[BLOCK_RECURSION_DEPTH_4]: cel.@block([x - y - 1 > 3, [@index0 ? (x - y - 1) : 5]], @index1.exists(@it:0:0, @it2:0:0, @it:0:0 - @it2:0:0 - 1 > 3) || @index0) -[BLOCK_RECURSION_DEPTH_5]: cel.@block([x - y - 1 > 3], [@index0 ? (x - y - 1) : 5].exists(@it:0:0, @it2:0:0, @it:0:0 - @it2:0:0 - 1 > 3) || @index0) -[BLOCK_RECURSION_DEPTH_6]: cel.@block([x - y - 1 > 3], [@index0 ? (x - y - 1) : 5].exists(@it:0:0, @it2:0:0, @it:0:0 - @it2:0:0 - 1 > 3) || @index0) -[BLOCK_RECURSION_DEPTH_7]: cel.@block([x - y - 1 > 3], [@index0 ? (x - y - 1) : 5].exists(@it:0:0, @it2:0:0, @it:0:0 - @it2:0:0 - 1 > 3) || @index0) -[BLOCK_RECURSION_DEPTH_8]: cel.@block([x - y - 1 > 3], [@index0 ? (x - y - 1) : 5].exists(@it:0:0, @it2:0:0, @it:0:0 - @it2:0:0 - 1 > 3) || @index0) -[BLOCK_RECURSION_DEPTH_9]: cel.@block([x - y - 1 > 3], [@index0 ? (x - y - 1) : 5].exists(@it:0:0, @it2:0:0, @it:0:0 - @it2:0:0 - 1 > 3) || @index0) +Unparsed: cel.@block([x - y - 1, @index0 > 3], [@index1 ? @index0 : 5].exists(@it:0:0, @it2:0:0, @it:0:0 - @it2:0:0 - 1 > 3) || @index1) Test case: MACRO_SHADOWED_VARIABLE_COMP_V2_2 Source: ["foo", "bar"].transformMap(x, y, [x + x, y + y]).transformMap(x, y, [x + x, y + y]) =====> Result: {0=[0, [0, foofoo, 0, foofoo]], 1=[2, [2, barbar, 2, barbar]]} -[BLOCK_COMMON_SUBEXPR_ONLY]: {0: [0, [0, "foofoo", 0, "foofoo"]], 1: [2, [2, "barbar", 2, "barbar"]]} -[BLOCK_RECURSION_DEPTH_1]: cel.@block([[0, "foofoo", 0, "foofoo"], [0, @index0], [2, "barbar", 2, "barbar"], [2, @index2]], {0: @index1, 1: @index3}) -[BLOCK_RECURSION_DEPTH_2]: cel.@block([[0, [0, "foofoo", 0, "foofoo"]], [2, [2, "barbar", 2, "barbar"]]], {0: @index0, 1: @index1}) -[BLOCK_RECURSION_DEPTH_3]: {0: [0, [0, "foofoo", 0, "foofoo"]], 1: [2, [2, "barbar", 2, "barbar"]]} -[BLOCK_RECURSION_DEPTH_4]: {0: [0, [0, "foofoo", 0, "foofoo"]], 1: [2, [2, "barbar", 2, "barbar"]]} -[BLOCK_RECURSION_DEPTH_5]: {0: [0, [0, "foofoo", 0, "foofoo"]], 1: [2, [2, "barbar", 2, "barbar"]]} -[BLOCK_RECURSION_DEPTH_6]: {0: [0, [0, "foofoo", 0, "foofoo"]], 1: [2, [2, "barbar", 2, "barbar"]]} -[BLOCK_RECURSION_DEPTH_7]: {0: [0, [0, "foofoo", 0, "foofoo"]], 1: [2, [2, "barbar", 2, "barbar"]]} -[BLOCK_RECURSION_DEPTH_8]: {0: [0, [0, "foofoo", 0, "foofoo"]], 1: [2, [2, "barbar", 2, "barbar"]]} -[BLOCK_RECURSION_DEPTH_9]: {0: [0, [0, "foofoo", 0, "foofoo"]], 1: [2, [2, "barbar", 2, "barbar"]]} +Unparsed: {0: [0, [0, "foofoo", 0, "foofoo"]], 1: [2, [2, "barbar", 2, "barbar"]]} Test case: PRESENCE_TEST Source: has({'a': true}.a) && {'a':true}['a'] =====> Result: true -[BLOCK_COMMON_SUBEXPR_ONLY]: true -[BLOCK_RECURSION_DEPTH_1]: true -[BLOCK_RECURSION_DEPTH_2]: true -[BLOCK_RECURSION_DEPTH_3]: true -[BLOCK_RECURSION_DEPTH_4]: true -[BLOCK_RECURSION_DEPTH_5]: true -[BLOCK_RECURSION_DEPTH_6]: true -[BLOCK_RECURSION_DEPTH_7]: true -[BLOCK_RECURSION_DEPTH_8]: true -[BLOCK_RECURSION_DEPTH_9]: true +Unparsed: true Test case: PRESENCE_TEST_2 Source: has({'a': true}.a) && has({'a': true}.a) =====> Result: true -[BLOCK_COMMON_SUBEXPR_ONLY]: true -[BLOCK_RECURSION_DEPTH_1]: true -[BLOCK_RECURSION_DEPTH_2]: true -[BLOCK_RECURSION_DEPTH_3]: true -[BLOCK_RECURSION_DEPTH_4]: true -[BLOCK_RECURSION_DEPTH_5]: true -[BLOCK_RECURSION_DEPTH_6]: true -[BLOCK_RECURSION_DEPTH_7]: true -[BLOCK_RECURSION_DEPTH_8]: true -[BLOCK_RECURSION_DEPTH_9]: true +Unparsed: true Test case: PRESENCE_TEST_WITH_TERNARY Source: (has(msg.oneof_type.payload) ? msg.oneof_type.payload.single_int64 : 0) == 10 =====> Result: true -[BLOCK_COMMON_SUBEXPR_ONLY]: cel.@block([msg.oneof_type], (has(@index0.payload) ? @index0.payload.single_int64 : 0) == 10) -[BLOCK_RECURSION_DEPTH_1]: cel.@block([msg.oneof_type, has(@index0.payload), @index0.payload, @index2.single_int64, @index1 ? @index3 : 0], @index4 == 10) -[BLOCK_RECURSION_DEPTH_2]: cel.@block([msg.oneof_type, @index0.payload.single_int64, has(@index0.payload) ? @index1 : 0], @index2 == 10) -[BLOCK_RECURSION_DEPTH_3]: cel.@block([msg.oneof_type, has(@index0.payload) ? @index0.payload.single_int64 : 0], @index1 == 10) -[BLOCK_RECURSION_DEPTH_4]: cel.@block([msg.oneof_type], (has(@index0.payload) ? @index0.payload.single_int64 : 0) == 10) -[BLOCK_RECURSION_DEPTH_5]: cel.@block([msg.oneof_type], (has(@index0.payload) ? @index0.payload.single_int64 : 0) == 10) -[BLOCK_RECURSION_DEPTH_6]: cel.@block([msg.oneof_type], (has(@index0.payload) ? @index0.payload.single_int64 : 0) == 10) -[BLOCK_RECURSION_DEPTH_7]: cel.@block([msg.oneof_type], (has(@index0.payload) ? @index0.payload.single_int64 : 0) == 10) -[BLOCK_RECURSION_DEPTH_8]: cel.@block([msg.oneof_type], (has(@index0.payload) ? @index0.payload.single_int64 : 0) == 10) -[BLOCK_RECURSION_DEPTH_9]: cel.@block([msg.oneof_type], (has(@index0.payload) ? @index0.payload.single_int64 : 0) == 10) +Unparsed: cel.@block([msg.oneof_type], (has(@index0.payload) ? @index0.payload.single_int64 : 0) == 10) Test case: PRESENCE_TEST_WITH_TERNARY_2 Source: (has(msg.oneof_type.payload) ? msg.oneof_type.payload.single_int64 : msg.oneof_type.payload.single_int64 * 0) == 10 =====> Result: true -[BLOCK_COMMON_SUBEXPR_ONLY]: cel.@block([msg.oneof_type, @index0.payload.single_int64], (has(@index0.payload) ? @index1 : (@index1 * 0)) == 10) -[BLOCK_RECURSION_DEPTH_1]: cel.@block([msg.oneof_type, @index0.payload, @index1.single_int64, has(@index0.payload), @index2 * 0, @index3 ? @index2 : @index4], @index5 == 10) -[BLOCK_RECURSION_DEPTH_2]: cel.@block([msg.oneof_type.payload, @index0.single_int64, has(msg.oneof_type.payload), @index2 ? @index1 : (@index1 * 0)], @index3 == 10) -[BLOCK_RECURSION_DEPTH_3]: cel.@block([msg.oneof_type.payload.single_int64, has(msg.oneof_type.payload) ? @index0 : (@index0 * 0)], @index1 == 10) -[BLOCK_RECURSION_DEPTH_4]: cel.@block([msg.oneof_type.payload.single_int64], (has(msg.oneof_type.payload) ? @index0 : (@index0 * 0)) == 10) -[BLOCK_RECURSION_DEPTH_5]: cel.@block([msg.oneof_type.payload.single_int64], (has(msg.oneof_type.payload) ? @index0 : (@index0 * 0)) == 10) -[BLOCK_RECURSION_DEPTH_6]: cel.@block([msg.oneof_type.payload.single_int64], (has(msg.oneof_type.payload) ? @index0 : (@index0 * 0)) == 10) -[BLOCK_RECURSION_DEPTH_7]: cel.@block([msg.oneof_type.payload.single_int64], (has(msg.oneof_type.payload) ? @index0 : (@index0 * 0)) == 10) -[BLOCK_RECURSION_DEPTH_8]: cel.@block([msg.oneof_type.payload.single_int64], (has(msg.oneof_type.payload) ? @index0 : (@index0 * 0)) == 10) -[BLOCK_RECURSION_DEPTH_9]: cel.@block([msg.oneof_type.payload.single_int64], (has(msg.oneof_type.payload) ? @index0 : (@index0 * 0)) == 10) +Unparsed: cel.@block([msg.oneof_type, @index0.payload.single_int64], (has(@index0.payload) ? @index1 : (@index1 * 0)) == 10) Test case: PRESENCE_TEST_WITH_TERNARY_3 Source: (has(msg.oneof_type.payload.single_int64) ? msg.oneof_type.payload.single_int64 : msg.oneof_type.payload.single_int64 * 0) == 10 =====> Result: true -[BLOCK_COMMON_SUBEXPR_ONLY]: cel.@block([msg.oneof_type.payload, @index0.single_int64], (has(@index0.single_int64) ? @index1 : (@index1 * 0)) == 10) -[BLOCK_RECURSION_DEPTH_1]: cel.@block([msg.oneof_type, @index0.payload, @index1.single_int64, has(@index1.single_int64), @index2 * 0, @index3 ? @index2 : @index4], @index5 == 10) -[BLOCK_RECURSION_DEPTH_2]: cel.@block([msg.oneof_type.payload, @index0.single_int64, has(@index0.single_int64) ? @index1 : (@index1 * 0)], @index2 == 10) -[BLOCK_RECURSION_DEPTH_3]: cel.@block([msg.oneof_type.payload.single_int64, has(msg.oneof_type.payload.single_int64)], (@index1 ? @index0 : (@index0 * 0)) == 10) -[BLOCK_RECURSION_DEPTH_4]: cel.@block([msg.oneof_type.payload.single_int64, has(msg.oneof_type.payload.single_int64) ? @index0 : (@index0 * 0)], @index1 == 10) -[BLOCK_RECURSION_DEPTH_5]: cel.@block([msg.oneof_type.payload.single_int64], (has(msg.oneof_type.payload.single_int64) ? @index0 : (@index0 * 0)) == 10) -[BLOCK_RECURSION_DEPTH_6]: cel.@block([msg.oneof_type.payload.single_int64], (has(msg.oneof_type.payload.single_int64) ? @index0 : (@index0 * 0)) == 10) -[BLOCK_RECURSION_DEPTH_7]: cel.@block([msg.oneof_type.payload.single_int64], (has(msg.oneof_type.payload.single_int64) ? @index0 : (@index0 * 0)) == 10) -[BLOCK_RECURSION_DEPTH_8]: cel.@block([msg.oneof_type.payload.single_int64], (has(msg.oneof_type.payload.single_int64) ? @index0 : (@index0 * 0)) == 10) -[BLOCK_RECURSION_DEPTH_9]: cel.@block([msg.oneof_type.payload.single_int64], (has(msg.oneof_type.payload.single_int64) ? @index0 : (@index0 * 0)) == 10) +Unparsed: cel.@block([msg.oneof_type.payload, @index0.single_int64], (has(@index0.single_int64) ? @index1 : (@index1 * 0)) == 10) Test case: PRESENCE_TEST_WITH_TERNARY_NESTED Source: (has(msg.oneof_type) && has(msg.oneof_type.payload) && has(msg.oneof_type.payload.single_int64)) ? ((has(msg.oneof_type.payload.map_string_string) && has(msg.oneof_type.payload.map_string_string.key)) ? msg.oneof_type.payload.map_string_string.key == 'A' : false) : false =====> Result: true -[BLOCK_COMMON_SUBEXPR_ONLY]: cel.@block([msg.oneof_type, @index0.payload, @index1.map_string_string], (has(msg.oneof_type) && has(@index0.payload) && has(@index1.single_int64)) ? ((has(@index1.map_string_string) && has(@index2.key)) ? (@index2.key == "A") : false) : false) -[BLOCK_RECURSION_DEPTH_1]: cel.@block([msg.oneof_type, @index0.payload, @index1.map_string_string, has(msg.oneof_type), has(@index0.payload), @index3 && @index4, has(@index1.single_int64), @index5 && @index6, has(@index1.map_string_string), has(@index2.key), @index8 && @index9, @index2.key, @index11 == "A", @index10 ? @index12 : false], @index7 ? @index13 : false) -[BLOCK_RECURSION_DEPTH_2]: cel.@block([msg.oneof_type.payload, @index0.map_string_string, has(msg.oneof_type.payload), has(msg.oneof_type) && @index2, @index3 && has(@index0.single_int64), has(@index0.map_string_string) && has(@index1.key), @index1.key == "A"], @index4 ? (@index5 ? @index6 : false) : false) -[BLOCK_RECURSION_DEPTH_3]: cel.@block([msg.oneof_type.payload.map_string_string, msg.oneof_type.payload, has(msg.oneof_type) && has(msg.oneof_type.payload), (has(@index1.map_string_string) && has(@index0.key)) ? (@index0.key == "A") : false], (@index2 && has(@index1.single_int64)) ? @index3 : false) -[BLOCK_RECURSION_DEPTH_4]: cel.@block([msg.oneof_type.payload.map_string_string, msg.oneof_type.payload, has(msg.oneof_type) && has(msg.oneof_type.payload) && has(@index1.single_int64)], @index2 ? ((has(@index1.map_string_string) && has(@index0.key)) ? (@index0.key == "A") : false) : false) -[BLOCK_RECURSION_DEPTH_5]: cel.@block([msg.oneof_type.payload.map_string_string, msg.oneof_type.payload], (has(msg.oneof_type) && has(msg.oneof_type.payload) && has(@index1.single_int64)) ? ((has(@index1.map_string_string) && has(@index0.key)) ? (@index0.key == "A") : false) : false) -[BLOCK_RECURSION_DEPTH_6]: cel.@block([msg.oneof_type.payload.map_string_string, msg.oneof_type.payload], (has(msg.oneof_type) && has(msg.oneof_type.payload) && has(@index1.single_int64)) ? ((has(@index1.map_string_string) && has(@index0.key)) ? (@index0.key == "A") : false) : false) -[BLOCK_RECURSION_DEPTH_7]: cel.@block([msg.oneof_type.payload.map_string_string, msg.oneof_type.payload], (has(msg.oneof_type) && has(msg.oneof_type.payload) && has(@index1.single_int64)) ? ((has(@index1.map_string_string) && has(@index0.key)) ? (@index0.key == "A") : false) : false) -[BLOCK_RECURSION_DEPTH_8]: cel.@block([msg.oneof_type.payload.map_string_string, msg.oneof_type.payload], (has(msg.oneof_type) && has(msg.oneof_type.payload) && has(@index1.single_int64)) ? ((has(@index1.map_string_string) && has(@index0.key)) ? (@index0.key == "A") : false) : false) -[BLOCK_RECURSION_DEPTH_9]: cel.@block([msg.oneof_type.payload.map_string_string, msg.oneof_type.payload], (has(msg.oneof_type) && has(msg.oneof_type.payload) && has(@index1.single_int64)) ? ((has(@index1.map_string_string) && has(@index0.key)) ? (@index0.key == "A") : false) : false) +Unparsed: cel.@block([msg.oneof_type, @index0.payload, @index1.map_string_string], (has(msg.oneof_type) && has(@index0.payload) && has(@index1.single_int64)) ? ((has(@index1.map_string_string) && has(@index2.key)) ? (@index2.key == "A") : false) : false) Test case: OPTIONAL_LIST Source: [10, ?optional.none(), [?optional.none(), ?opt_x], [?optional.none(), ?opt_x]] == [10, [5], [5]] =====> Result: true -[BLOCK_COMMON_SUBEXPR_ONLY]: cel.@block([[?opt_x], [5]], [10, @index0, @index0] == [10, @index1, @index1]) -[BLOCK_RECURSION_DEPTH_1]: cel.@block([[?opt_x], [5], [10, @index0, @index0], [10, @index1, @index1]], @index2 == @index3) -[BLOCK_RECURSION_DEPTH_2]: cel.@block([[?opt_x], [5]], [10, @index0, @index0] == [10, @index1, @index1]) -[BLOCK_RECURSION_DEPTH_3]: cel.@block([[?opt_x], [5]], [10, @index0, @index0] == [10, @index1, @index1]) -[BLOCK_RECURSION_DEPTH_4]: cel.@block([[?opt_x], [5]], [10, @index0, @index0] == [10, @index1, @index1]) -[BLOCK_RECURSION_DEPTH_5]: cel.@block([[?opt_x], [5]], [10, @index0, @index0] == [10, @index1, @index1]) -[BLOCK_RECURSION_DEPTH_6]: cel.@block([[?opt_x], [5]], [10, @index0, @index0] == [10, @index1, @index1]) -[BLOCK_RECURSION_DEPTH_7]: cel.@block([[?opt_x], [5]], [10, @index0, @index0] == [10, @index1, @index1]) -[BLOCK_RECURSION_DEPTH_8]: cel.@block([[?opt_x], [5]], [10, @index0, @index0] == [10, @index1, @index1]) -[BLOCK_RECURSION_DEPTH_9]: cel.@block([[?opt_x], [5]], [10, @index0, @index0] == [10, @index1, @index1]) +Unparsed: cel.@block([[?opt_x], [5]], [10, @index0, @index0] == [10, @index1, @index1]) Test case: OPTIONAL_MAP Source: {?'hello': optional.of('hello')}['hello'] + {?'hello': optional.of('hello')}['hello'] == 'hellohello' =====> Result: true -[BLOCK_COMMON_SUBEXPR_ONLY]: true -[BLOCK_RECURSION_DEPTH_1]: true -[BLOCK_RECURSION_DEPTH_2]: true -[BLOCK_RECURSION_DEPTH_3]: true -[BLOCK_RECURSION_DEPTH_4]: true -[BLOCK_RECURSION_DEPTH_5]: true -[BLOCK_RECURSION_DEPTH_6]: true -[BLOCK_RECURSION_DEPTH_7]: true -[BLOCK_RECURSION_DEPTH_8]: true -[BLOCK_RECURSION_DEPTH_9]: true +Unparsed: true Test case: OPTIONAL_MAP_CHAINED Source: {?'key': optional.of('test')}[?'bogus'].or({'key': 'test'}[?'bogus']).orValue({'key': 'test'}['key']) == 'test' =====> Result: true -[BLOCK_COMMON_SUBEXPR_ONLY]: true -[BLOCK_RECURSION_DEPTH_1]: true -[BLOCK_RECURSION_DEPTH_2]: true -[BLOCK_RECURSION_DEPTH_3]: true -[BLOCK_RECURSION_DEPTH_4]: true -[BLOCK_RECURSION_DEPTH_5]: true -[BLOCK_RECURSION_DEPTH_6]: true -[BLOCK_RECURSION_DEPTH_7]: true -[BLOCK_RECURSION_DEPTH_8]: true -[BLOCK_RECURSION_DEPTH_9]: true +Unparsed: true Test case: OPTIONAL_MESSAGE Source: TestAllTypes{?single_int64: optional.ofNonZeroValue(1), ?single_int32: optional.of(4)}.single_int32 + TestAllTypes{?single_int64: optional.ofNonZeroValue(1), ?single_int32: optional.of(4)}.single_int64 == 5 =====> Result: true -[BLOCK_COMMON_SUBEXPR_ONLY]: true -[BLOCK_RECURSION_DEPTH_1]: true -[BLOCK_RECURSION_DEPTH_2]: true -[BLOCK_RECURSION_DEPTH_3]: true -[BLOCK_RECURSION_DEPTH_4]: true -[BLOCK_RECURSION_DEPTH_5]: true -[BLOCK_RECURSION_DEPTH_6]: true -[BLOCK_RECURSION_DEPTH_7]: true -[BLOCK_RECURSION_DEPTH_8]: true -[BLOCK_RECURSION_DEPTH_9]: true +Unparsed: true Test case: CALL Source: ('h' + 'e' + 'l' + 'l' + 'o' + ' world').matches('h' + 'e' + 'l' + 'l' + 'o') =====> Result: true -[BLOCK_COMMON_SUBEXPR_ONLY]: true -[BLOCK_RECURSION_DEPTH_1]: true -[BLOCK_RECURSION_DEPTH_2]: true -[BLOCK_RECURSION_DEPTH_3]: true -[BLOCK_RECURSION_DEPTH_4]: true -[BLOCK_RECURSION_DEPTH_5]: true -[BLOCK_RECURSION_DEPTH_6]: true -[BLOCK_RECURSION_DEPTH_7]: true -[BLOCK_RECURSION_DEPTH_8]: true -[BLOCK_RECURSION_DEPTH_9]: true +Unparsed: true Test case: CALL_ARGUMENT_NESTED_NO_COMMON_SUBEXPR Source: 'hello world'.matches('h' + 'e' + 'l' + 'l' + 'o') =====> Result: true -[BLOCK_COMMON_SUBEXPR_ONLY]: true -[BLOCK_RECURSION_DEPTH_1]: true -[BLOCK_RECURSION_DEPTH_2]: true -[BLOCK_RECURSION_DEPTH_3]: true -[BLOCK_RECURSION_DEPTH_4]: true -[BLOCK_RECURSION_DEPTH_5]: true -[BLOCK_RECURSION_DEPTH_6]: true -[BLOCK_RECURSION_DEPTH_7]: true -[BLOCK_RECURSION_DEPTH_8]: true -[BLOCK_RECURSION_DEPTH_9]: true +Unparsed: true Test case: CALL_TARGET_NESTED_NO_COMMON_SUBEXPR Source: ('h' + 'e' + 'l' + 'l' + 'o' + ' world').matches('hello') =====> Result: true -[BLOCK_COMMON_SUBEXPR_ONLY]: true -[BLOCK_RECURSION_DEPTH_1]: true -[BLOCK_RECURSION_DEPTH_2]: true -[BLOCK_RECURSION_DEPTH_3]: true -[BLOCK_RECURSION_DEPTH_4]: true -[BLOCK_RECURSION_DEPTH_5]: true -[BLOCK_RECURSION_DEPTH_6]: true -[BLOCK_RECURSION_DEPTH_7]: true -[BLOCK_RECURSION_DEPTH_8]: true -[BLOCK_RECURSION_DEPTH_9]: true +Unparsed: true Test case: CALL_BOTH_ARGUMENT_TARGET_NESTED_NO_COMMON_SUBEXPR Source: ('h' + 'e' + 'l' + 'l' + 'o' + ' world').matches('w' + 'o' + 'r' + 'l' + 'd') =====> Result: true -[BLOCK_COMMON_SUBEXPR_ONLY]: true -[BLOCK_RECURSION_DEPTH_1]: true -[BLOCK_RECURSION_DEPTH_2]: true -[BLOCK_RECURSION_DEPTH_3]: true -[BLOCK_RECURSION_DEPTH_4]: true -[BLOCK_RECURSION_DEPTH_5]: true -[BLOCK_RECURSION_DEPTH_6]: true -[BLOCK_RECURSION_DEPTH_7]: true -[BLOCK_RECURSION_DEPTH_8]: true -[BLOCK_RECURSION_DEPTH_9]: true +Unparsed: true Test case: CUSTOM_FUNCTION_INELIMINABLE Source: non_pure_custom_func(msg.oneof_type.payload.single_int64) + non_pure_custom_func(msg.oneof_type.payload.single_int32) + non_pure_custom_func(msg.oneof_type.payload.single_int64) + non_pure_custom_func(msg.single_int64) =====> Result: 31 -[BLOCK_COMMON_SUBEXPR_ONLY]: cel.@block([msg.oneof_type.payload, @index0.single_int64], non_pure_custom_func(@index1) + non_pure_custom_func(@index0.single_int32) + non_pure_custom_func(@index1) + non_pure_custom_func(msg.single_int64)) -[BLOCK_RECURSION_DEPTH_1]: cel.@block([msg.oneof_type, @index0.payload, @index1.single_int64], non_pure_custom_func(@index2) + non_pure_custom_func(@index1.single_int32) + non_pure_custom_func(@index2) + non_pure_custom_func(msg.single_int64)) -[BLOCK_RECURSION_DEPTH_2]: cel.@block([msg.oneof_type.payload, @index0.single_int64], non_pure_custom_func(@index1) + non_pure_custom_func(@index0.single_int32) + non_pure_custom_func(@index1) + non_pure_custom_func(msg.single_int64)) -[BLOCK_RECURSION_DEPTH_3]: cel.@block([msg.oneof_type.payload.single_int64], non_pure_custom_func(@index0) + non_pure_custom_func(msg.oneof_type.payload.single_int32) + non_pure_custom_func(@index0) + non_pure_custom_func(msg.single_int64)) -[BLOCK_RECURSION_DEPTH_4]: cel.@block([msg.oneof_type.payload.single_int64], non_pure_custom_func(@index0) + non_pure_custom_func(msg.oneof_type.payload.single_int32) + non_pure_custom_func(@index0) + non_pure_custom_func(msg.single_int64)) -[BLOCK_RECURSION_DEPTH_5]: cel.@block([msg.oneof_type.payload.single_int64], non_pure_custom_func(@index0) + non_pure_custom_func(msg.oneof_type.payload.single_int32) + non_pure_custom_func(@index0) + non_pure_custom_func(msg.single_int64)) -[BLOCK_RECURSION_DEPTH_6]: cel.@block([msg.oneof_type.payload.single_int64], non_pure_custom_func(@index0) + non_pure_custom_func(msg.oneof_type.payload.single_int32) + non_pure_custom_func(@index0) + non_pure_custom_func(msg.single_int64)) -[BLOCK_RECURSION_DEPTH_7]: cel.@block([msg.oneof_type.payload.single_int64], non_pure_custom_func(@index0) + non_pure_custom_func(msg.oneof_type.payload.single_int32) + non_pure_custom_func(@index0) + non_pure_custom_func(msg.single_int64)) -[BLOCK_RECURSION_DEPTH_8]: cel.@block([msg.oneof_type.payload.single_int64], non_pure_custom_func(@index0) + non_pure_custom_func(msg.oneof_type.payload.single_int32) + non_pure_custom_func(@index0) + non_pure_custom_func(msg.single_int64)) -[BLOCK_RECURSION_DEPTH_9]: cel.@block([msg.oneof_type.payload.single_int64], non_pure_custom_func(@index0) + non_pure_custom_func(msg.oneof_type.payload.single_int32) + non_pure_custom_func(@index0) + non_pure_custom_func(msg.single_int64)) +Unparsed: cel.@block([msg.oneof_type.payload, @index0.single_int64], non_pure_custom_func(@index1) + non_pure_custom_func(@index0.single_int32) + non_pure_custom_func(@index1) + non_pure_custom_func(msg.single_int64)) Test case: CUSTOM_FUNCTION_ELIMINABLE Source: pure_custom_func(msg.oneof_type.payload.single_int64) + pure_custom_func(msg.oneof_type.payload.single_int32) + pure_custom_func(msg.oneof_type.payload.single_int64) + pure_custom_func(msg.single_int64) =====> Result: 31 -[BLOCK_COMMON_SUBEXPR_ONLY]: cel.@block([msg.oneof_type.payload, pure_custom_func(@index0.single_int64)], @index1 + pure_custom_func(@index0.single_int32) + @index1 + pure_custom_func(msg.single_int64)) -[BLOCK_RECURSION_DEPTH_1]: cel.@block([msg.oneof_type, @index0.payload, @index1.single_int64, pure_custom_func(@index2), @index1.single_int32, pure_custom_func(@index4), @index3 + @index5, @index6 + @index3, msg.single_int64, pure_custom_func(@index8)], @index7 + @index9) -[BLOCK_RECURSION_DEPTH_2]: cel.@block([msg.oneof_type.payload, pure_custom_func(@index0.single_int64), pure_custom_func(@index0.single_int32), @index1 + @index2 + @index1, pure_custom_func(msg.single_int64)], @index3 + @index4) -[BLOCK_RECURSION_DEPTH_3]: cel.@block([msg.oneof_type.payload.single_int64, pure_custom_func(@index0), msg.oneof_type.payload.single_int32, @index1 + pure_custom_func(@index2) + @index1], @index3 + pure_custom_func(msg.single_int64)) -[BLOCK_RECURSION_DEPTH_4]: cel.@block([pure_custom_func(msg.oneof_type.payload.single_int64), pure_custom_func(msg.oneof_type.payload.single_int32)], @index0 + @index1 + @index0 + pure_custom_func(msg.single_int64)) -[BLOCK_RECURSION_DEPTH_5]: cel.@block([pure_custom_func(msg.oneof_type.payload.single_int64), @index0 + pure_custom_func(msg.oneof_type.payload.single_int32)], @index1 + @index0 + pure_custom_func(msg.single_int64)) -[BLOCK_RECURSION_DEPTH_6]: cel.@block([pure_custom_func(msg.oneof_type.payload.single_int64), @index0 + pure_custom_func(msg.oneof_type.payload.single_int32) + @index0], @index1 + pure_custom_func(msg.single_int64)) -[BLOCK_RECURSION_DEPTH_7]: cel.@block([pure_custom_func(msg.oneof_type.payload.single_int64)], @index0 + pure_custom_func(msg.oneof_type.payload.single_int32) + @index0 + pure_custom_func(msg.single_int64)) -[BLOCK_RECURSION_DEPTH_8]: cel.@block([pure_custom_func(msg.oneof_type.payload.single_int64)], @index0 + pure_custom_func(msg.oneof_type.payload.single_int32) + @index0 + pure_custom_func(msg.single_int64)) -[BLOCK_RECURSION_DEPTH_9]: cel.@block([pure_custom_func(msg.oneof_type.payload.single_int64)], @index0 + pure_custom_func(msg.oneof_type.payload.single_int32) + @index0 + pure_custom_func(msg.single_int64)) \ No newline at end of file +Unparsed: cel.@block([msg.oneof_type.payload, pure_custom_func(@index0.single_int64)], @index1 + pure_custom_func(@index0.single_int32) + @index1 + pure_custom_func(msg.single_int64)) \ No newline at end of file diff --git a/optimizer/src/test/resources/large_expressions_block_recursion_depth_1.baseline b/optimizer/src/test/resources/large_expressions_block_recursion_depth_1.baseline deleted file mode 100644 index 5d7b20381..000000000 --- a/optimizer/src/test/resources/large_expressions_block_recursion_depth_1.baseline +++ /dev/null @@ -1,17 +0,0 @@ -Test case: CALC_FOUR_COMMON_SUBEXPR -Source: [1] + [1,2] + [1,2,3] + [1,2,3,4] + [1] + [1,2] + [1,2,3] + [1,2,3,4] + [1] + [1,2] + [1,2,3] + [1,2,3,4] + [1] + [1,2] + [1,2,3] + [1,2,3,4] + [1] + [1,2] + [1,2,3] + [1,2,3,4] + [1] + [1,2] + [1,2,3] + [1,2,3,4] + [1] + [1,2] + [1,2,3] + [1,2,3,4] + [1] + [1,2] + [1,2,3] + [1,2,3,4] + [1] + [1,2] + [1,2,3] + [1,2,3,4] + [1] + [1,2] + [1,2,3] + [1,2,3,4] + [1] + [1,2] + [1,2,3] + [1,2,3,4] + [1] + [1,2] + [1,2,3] + [1,2,3,4] + [1] + [1,2] + [1,2,3] + [1,2,3,4] + [1] + [1,2] + [1,2,3] + [1,2,3,4] + [1] + [1,2] + [1,2,3] + [1,2,3,4] + [1] + [1,2] + [1,2,3] + [1,2,3,4] + [1] + [1,2] + [1,2,3] + [1,2,3,4] + [1] + [1,2] + [1,2,3] + [1,2,3,4] + [1] + [1,2] + [1,2,3] + [1,2,3,4] + [1] + [1,2] + [1,2,3] + [1,2,3,4] + [1] + [1,2] + [1,2,3] + [1,2,3,4] + [1] + [1,2] + [1,2,3] + [1,2,3,4] + [1] + [1,2] + [1,2,3] + [1,2,3,4] + [1] + [1,2] + [1,2,3] + [1,2,3,4] + [1] + [1,2] + [1,2,3] + [1,2,3,4] + [1] + [1,2] + [1,2,3] + [1,2,3,4] + [1] + [1,2] + [1,2,3] + [1,2,3,4] + [1] + [1,2] + [1,2,3] + [1,2,3,4] + [1] + [1,2] + [1,2,3] + [1,2,3,4] + [1] + [1,2] + [1,2,3] + [1,2,3,4] + [1] + [1,2] + [1,2,3] + [1,2,3,4] + [1] + [1,2] + [1,2,3] + [1,2,3,4] + [1] + [1,2] + [1,2,3] + [1,2,3,4] + [1] + [1,2] + [1,2,3] + [1,2,3,4] + [1] + [1,2] + [1,2,3] + [1,2,3,4] + [1] + [1,2] + [1,2,3] + [1,2,3,4] + [1] + [1,2] + [1,2,3] + [1,2,3,4] + [1] + [1,2] + [1,2,3] + [1,2,3,4] + [1] + [1,2] + [1,2,3] + [1,2,3,4] + [1] + [1,2] + [1,2,3] + [1,2,3,4] -=====> -Result: [1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4] -Unparsed: cel.@block([[1], [1, 2], [1, 2, 3], [1, 2, 3, 4], @index0 + @index1, @index4 + @index2, @index5 + @index3, @index6 + @index0, @index7 + @index1, @index8 + @index2, @index9 + @index3, @index10 + @index0, @index11 + @index1, @index12 + @index2, @index13 + @index3, @index14 + @index0, @index15 + @index1, @index16 + @index2, @index17 + @index3, @index18 + @index0, @index19 + @index1, @index20 + @index2, @index21 + @index3, @index22 + @index0, @index23 + @index1, @index24 + @index2, @index25 + @index3, @index26 + @index0, @index27 + @index1, @index28 + @index2, @index29 + @index3, @index30 + @index0, @index31 + @index1, @index32 + @index2, @index33 + @index3, @index34 + @index0, @index35 + @index1, @index36 + @index2, @index37 + @index3, @index38 + @index0, @index39 + @index1, @index40 + @index2, @index41 + @index3, @index42 + @index0, @index43 + @index1, @index44 + @index2, @index45 + @index3, @index46 + @index0, @index47 + @index1, @index48 + @index2, @index49 + @index3, @index50 + @index0, @index51 + @index1, @index52 + @index2, @index53 + @index3, @index54 + @index0, @index55 + @index1, @index56 + @index2, @index57 + @index3, @index58 + @index0, @index59 + @index1, @index60 + @index2, @index61 + @index3, @index62 + @index0, @index63 + @index1, @index64 + @index2, @index65 + @index3, @index66 + @index0, @index67 + @index1, @index68 + @index2, @index69 + @index3, @index70 + @index0, @index71 + @index1, @index72 + @index2, @index73 + @index3, @index74 + @index0, @index75 + @index1, @index76 + @index2, @index77 + @index3, @index78 + @index0, @index79 + @index1, @index80 + @index2, @index81 + @index3, @index82 + @index0, @index83 + @index1, @index84 + @index2, @index85 + @index3, @index86 + @index0, @index87 + @index1, @index88 + @index2, @index89 + @index3, @index90 + @index0, @index91 + @index1, @index92 + @index2, @index93 + @index3, @index94 + @index0, @index95 + @index1, @index96 + @index2, @index97 + @index3, @index98 + @index0, @index99 + @index1, @index100 + @index2, @index101 + @index3, @index102 + @index0, @index103 + @index1, @index104 + @index2, @index105 + @index3, @index106 + @index0, @index107 + @index1, @index108 + @index2, @index109 + @index3, @index110 + @index0, @index111 + @index1, @index112 + @index2, @index113 + @index3, @index114 + @index0, @index115 + @index1, @index116 + @index2, @index117 + @index3, @index118 + @index0, @index119 + @index1, @index120 + @index2, @index121 + @index3, @index122 + @index0, @index123 + @index1, @index124 + @index2, @index125 + @index3, @index126 + @index0, @index127 + @index1, @index128 + @index2, @index129 + @index3, @index130 + @index0, @index131 + @index1, @index132 + @index2, @index133 + @index3, @index134 + @index0, @index135 + @index1, @index136 + @index2, @index137 + @index3, @index138 + @index0, @index139 + @index1, @index140 + @index2, @index141 + @index3, @index142 + @index0, @index143 + @index1, @index144 + @index2, @index145 + @index3, @index146 + @index0, @index147 + @index1, @index148 + @index2, @index149 + @index3, @index150 + @index0, @index151 + @index1, @index152 + @index2, @index153 + @index3, @index154 + @index0, @index155 + @index1, @index156 + @index2, @index157 + @index3, @index158 + @index0, @index159 + @index1, @index160 + @index2], @index161 + @index3) - -Test case: CALC_ALL_COMMON_SUBEXPR -Source: [0, 1] + [0, 1] + [1, 2] + [1, 2] + [2, 3] + [2, 3] + [3, 4] + [3, 4] + [4, 5] + [4, 5] + [5, 6] + [5, 6] + [6, 7] + [6, 7] + [7, 8] + [7, 8] + [8, 9] + [8, 9] + [9, 10] + [9, 10] + [10, 11] + [10, 11] + [11, 12] + [11, 12] + [12, 13] + [12, 13] + [13, 14] + [13, 14] + [14, 15] + [14, 15] + [15, 16] + [15, 16] + [16, 17] + [16, 17] + [17, 18] + [17, 18] + [18, 19] + [18, 19] + [19, 20] + [19, 20] + [20, 21] + [20, 21] + [21, 22] + [21, 22] + [22, 23] + [22, 23] + [23, 24] + [23, 24] + [24, 25] + [24, 25] + [25, 26] + [25, 26] + [26, 27] + [26, 27] + [27, 28] + [27, 28] + [28, 29] + [28, 29] + [29, 30] + [29, 30] + [30, 31] + [30, 31] + [31, 32] + [31, 32] + [32, 33] + [32, 33] + [33, 34] + [33, 34] + [34, 35] + [34, 35] + [35, 36] + [35, 36] + [36, 37] + [36, 37] + [37, 38] + [37, 38] + [38, 39] + [38, 39] + [39, 40] + [39, 40] + [40, 41] + [40, 41] + [41, 42] + [41, 42] + [42, 43] + [42, 43] + [43, 44] + [43, 44] + [44, 45] + [44, 45] + [45, 46] + [45, 46] + [46, 47] + [46, 47] + [47, 48] + [47, 48] + [48, 49] + [48, 49] + [49, 50] + [49, 50] -=====> -Result: [0, 1, 0, 1, 1, 2, 1, 2, 2, 3, 2, 3, 3, 4, 3, 4, 4, 5, 4, 5, 5, 6, 5, 6, 6, 7, 6, 7, 7, 8, 7, 8, 8, 9, 8, 9, 9, 10, 9, 10, 10, 11, 10, 11, 11, 12, 11, 12, 12, 13, 12, 13, 13, 14, 13, 14, 14, 15, 14, 15, 15, 16, 15, 16, 16, 17, 16, 17, 17, 18, 17, 18, 18, 19, 18, 19, 19, 20, 19, 20, 20, 21, 20, 21, 21, 22, 21, 22, 22, 23, 22, 23, 23, 24, 23, 24, 24, 25, 24, 25, 25, 26, 25, 26, 26, 27, 26, 27, 27, 28, 27, 28, 28, 29, 28, 29, 29, 30, 29, 30, 30, 31, 30, 31, 31, 32, 31, 32, 32, 33, 32, 33, 33, 34, 33, 34, 34, 35, 34, 35, 35, 36, 35, 36, 36, 37, 36, 37, 37, 38, 37, 38, 38, 39, 38, 39, 39, 40, 39, 40, 40, 41, 40, 41, 41, 42, 41, 42, 42, 43, 42, 43, 43, 44, 43, 44, 44, 45, 44, 45, 45, 46, 45, 46, 46, 47, 46, 47, 47, 48, 47, 48, 48, 49, 48, 49, 49, 50, 49, 50] -Unparsed: cel.@block([[0, 1], [1, 2], [2, 3], [3, 4], [4, 5], [5, 6], [6, 7], [7, 8], [8, 9], [9, 10], [10, 11], [11, 12], [12, 13], [13, 14], [14, 15], [15, 16], [16, 17], [17, 18], [18, 19], [19, 20], [20, 21], [21, 22], [22, 23], [23, 24], [24, 25], [25, 26], [26, 27], [27, 28], [28, 29], [29, 30], [30, 31], [31, 32], [32, 33], [33, 34], [34, 35], [35, 36], [36, 37], [37, 38], [38, 39], [39, 40], [40, 41], [41, 42], [42, 43], [43, 44], [44, 45], [45, 46], [46, 47], [47, 48], [48, 49], [49, 50], @index0 + @index0, @index50 + @index1, @index51 + @index1, @index52 + @index2, @index53 + @index2, @index54 + @index3, @index55 + @index3, @index56 + @index4, @index57 + @index4, @index58 + @index5, @index59 + @index5, @index60 + @index6, @index61 + @index6, @index62 + @index7, @index63 + @index7, @index64 + @index8, @index65 + @index8, @index66 + @index9, @index67 + @index9, @index68 + @index10, @index69 + @index10, @index70 + @index11, @index71 + @index11, @index72 + @index12, @index73 + @index12, @index74 + @index13, @index75 + @index13, @index76 + @index14, @index77 + @index14, @index78 + @index15, @index79 + @index15, @index80 + @index16, @index81 + @index16, @index82 + @index17, @index83 + @index17, @index84 + @index18, @index85 + @index18, @index86 + @index19, @index87 + @index19, @index88 + @index20, @index89 + @index20, @index90 + @index21, @index91 + @index21, @index92 + @index22, @index93 + @index22, @index94 + @index23, @index95 + @index23, @index96 + @index24, @index97 + @index24, @index98 + @index25, @index99 + @index25, @index100 + @index26, @index101 + @index26, @index102 + @index27, @index103 + @index27, @index104 + @index28, @index105 + @index28, @index106 + @index29, @index107 + @index29, @index108 + @index30, @index109 + @index30, @index110 + @index31, @index111 + @index31, @index112 + @index32, @index113 + @index32, @index114 + @index33, @index115 + @index33, @index116 + @index34, @index117 + @index34, @index118 + @index35, @index119 + @index35, @index120 + @index36, @index121 + @index36, @index122 + @index37, @index123 + @index37, @index124 + @index38, @index125 + @index38, @index126 + @index39, @index127 + @index39, @index128 + @index40, @index129 + @index40, @index130 + @index41, @index131 + @index41, @index132 + @index42, @index133 + @index42, @index134 + @index43, @index135 + @index43, @index136 + @index44, @index137 + @index44, @index138 + @index45, @index139 + @index45, @index140 + @index46, @index141 + @index46, @index142 + @index47, @index143 + @index47, @index144 + @index48, @index145 + @index48, @index146 + @index49], @index147 + @index49) - -Test case: NESTED_MACROS -Source: [1,2,3].map(i, [1, 2, 3].map(i, [1, 2, 3].map(i, [1, 2, 3].map(i, [1, 2, 3].map(i, [1, 2, 3].map(i, [1, 2, 3].map(i, [1, 2, 3].map(i, [1, 2, 3])))))))) -=====> -Result: [[[[[[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]]], [[[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]]], [[[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]]]], [[[[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]]], [[[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]]], [[[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]]]], [[[[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]]], [[[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]]], [[[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]]]]], [[[[[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]]], [[[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]]], [[[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]]]], [[[[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]]], [[[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]]], [[[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]]]], [[[[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]]], [[[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]]], [[[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]]]]], [[[[[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]]], [[[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]]], [[[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]]]], [[[[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]]], [[[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]]], [[[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]]]], [[[[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]]], [[[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]]], [[[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]]]]]] -Unparsed: cel.@block([[1, 2, 3], [@index0]], @index0.map(@it:7:0, @index0.map(@it:6:0, @index0.map(@it:5:0, @index0.map(@it:4:0, @index0.map(@it:3:0, @index0.map(@it:2:0, @index0.map(@it:1:0, @index0.map(@it:0:0, @index0))))))))) \ No newline at end of file diff --git a/optimizer/src/test/resources/large_expressions_block_recursion_depth_2.baseline b/optimizer/src/test/resources/large_expressions_block_recursion_depth_2.baseline deleted file mode 100644 index aba464e22..000000000 --- a/optimizer/src/test/resources/large_expressions_block_recursion_depth_2.baseline +++ /dev/null @@ -1,17 +0,0 @@ -Test case: CALC_FOUR_COMMON_SUBEXPR -Source: [1] + [1,2] + [1,2,3] + [1,2,3,4] + [1] + [1,2] + [1,2,3] + [1,2,3,4] + [1] + [1,2] + [1,2,3] + [1,2,3,4] + [1] + [1,2] + [1,2,3] + [1,2,3,4] + [1] + [1,2] + [1,2,3] + [1,2,3,4] + [1] + [1,2] + [1,2,3] + [1,2,3,4] + [1] + [1,2] + [1,2,3] + [1,2,3,4] + [1] + [1,2] + [1,2,3] + [1,2,3,4] + [1] + [1,2] + [1,2,3] + [1,2,3,4] + [1] + [1,2] + [1,2,3] + [1,2,3,4] + [1] + [1,2] + [1,2,3] + [1,2,3,4] + [1] + [1,2] + [1,2,3] + [1,2,3,4] + [1] + [1,2] + [1,2,3] + [1,2,3,4] + [1] + [1,2] + [1,2,3] + [1,2,3,4] + [1] + [1,2] + [1,2,3] + [1,2,3,4] + [1] + [1,2] + [1,2,3] + [1,2,3,4] + [1] + [1,2] + [1,2,3] + [1,2,3,4] + [1] + [1,2] + [1,2,3] + [1,2,3,4] + [1] + [1,2] + [1,2,3] + [1,2,3,4] + [1] + [1,2] + [1,2,3] + [1,2,3,4] + [1] + [1,2] + [1,2,3] + [1,2,3,4] + [1] + [1,2] + [1,2,3] + [1,2,3,4] + [1] + [1,2] + [1,2,3] + [1,2,3,4] + [1] + [1,2] + [1,2,3] + [1,2,3,4] + [1] + [1,2] + [1,2,3] + [1,2,3,4] + [1] + [1,2] + [1,2,3] + [1,2,3,4] + [1] + [1,2] + [1,2,3] + [1,2,3,4] + [1] + [1,2] + [1,2,3] + [1,2,3,4] + [1] + [1,2] + [1,2,3] + [1,2,3,4] + [1] + [1,2] + [1,2,3] + [1,2,3,4] + [1] + [1,2] + [1,2,3] + [1,2,3,4] + [1] + [1,2] + [1,2,3] + [1,2,3,4] + [1] + [1,2] + [1,2,3] + [1,2,3,4] + [1] + [1,2] + [1,2,3] + [1,2,3,4] + [1] + [1,2] + [1,2,3] + [1,2,3,4] + [1] + [1,2] + [1,2,3] + [1,2,3,4] + [1] + [1,2] + [1,2,3] + [1,2,3,4] + [1] + [1,2] + [1,2,3] + [1,2,3,4] + [1] + [1,2] + [1,2,3] + [1,2,3,4] + [1] + [1,2] + [1,2,3] + [1,2,3,4] -=====> -Result: [1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4] -Unparsed: cel.@block([[1], [1, 2], [1, 2, 3], [1, 2, 3, 4], @index0 + @index1 + @index2, @index4 + @index3 + @index0, @index5 + @index1 + @index2, @index6 + @index3 + @index0, @index7 + @index1 + @index2, @index8 + @index3 + @index0, @index9 + @index1 + @index2, @index10 + @index3 + @index0, @index11 + @index1 + @index2, @index12 + @index3 + @index0, @index13 + @index1 + @index2, @index14 + @index3 + @index0, @index15 + @index1 + @index2, @index16 + @index3 + @index0, @index17 + @index1 + @index2, @index18 + @index3 + @index0, @index19 + @index1 + @index2, @index20 + @index3 + @index0, @index21 + @index1 + @index2, @index22 + @index3 + @index0, @index23 + @index1 + @index2, @index24 + @index3 + @index0, @index25 + @index1 + @index2, @index26 + @index3 + @index0, @index27 + @index1 + @index2, @index28 + @index3 + @index0, @index29 + @index1 + @index2, @index30 + @index3 + @index0, @index31 + @index1 + @index2, @index32 + @index3 + @index0, @index33 + @index1 + @index2, @index34 + @index3 + @index0, @index35 + @index1 + @index2, @index36 + @index3 + @index0, @index37 + @index1 + @index2, @index38 + @index3 + @index0, @index39 + @index1 + @index2, @index40 + @index3 + @index0, @index41 + @index1 + @index2, @index42 + @index3 + @index0, @index43 + @index1 + @index2, @index44 + @index3 + @index0, @index45 + @index1 + @index2, @index46 + @index3 + @index0, @index47 + @index1 + @index2, @index48 + @index3 + @index0, @index49 + @index1 + @index2, @index50 + @index3 + @index0, @index51 + @index1 + @index2, @index52 + @index3 + @index0, @index53 + @index1 + @index2, @index54 + @index3 + @index0, @index55 + @index1 + @index2, @index56 + @index3 + @index0, @index57 + @index1 + @index2, @index58 + @index3 + @index0, @index59 + @index1 + @index2, @index60 + @index3 + @index0, @index61 + @index1 + @index2, @index62 + @index3 + @index0, @index63 + @index1 + @index2, @index64 + @index3 + @index0, @index65 + @index1 + @index2, @index66 + @index3 + @index0, @index67 + @index1 + @index2, @index68 + @index3 + @index0, @index69 + @index1 + @index2, @index70 + @index3 + @index0, @index71 + @index1 + @index2, @index72 + @index3 + @index0, @index73 + @index1 + @index2, @index74 + @index3 + @index0, @index75 + @index1 + @index2, @index76 + @index3 + @index0, @index77 + @index1 + @index2, @index78 + @index3 + @index0, @index79 + @index1 + @index2, @index80 + @index3 + @index0, @index81 + @index1 + @index2], @index82 + @index3) - -Test case: CALC_ALL_COMMON_SUBEXPR -Source: [0, 1] + [0, 1] + [1, 2] + [1, 2] + [2, 3] + [2, 3] + [3, 4] + [3, 4] + [4, 5] + [4, 5] + [5, 6] + [5, 6] + [6, 7] + [6, 7] + [7, 8] + [7, 8] + [8, 9] + [8, 9] + [9, 10] + [9, 10] + [10, 11] + [10, 11] + [11, 12] + [11, 12] + [12, 13] + [12, 13] + [13, 14] + [13, 14] + [14, 15] + [14, 15] + [15, 16] + [15, 16] + [16, 17] + [16, 17] + [17, 18] + [17, 18] + [18, 19] + [18, 19] + [19, 20] + [19, 20] + [20, 21] + [20, 21] + [21, 22] + [21, 22] + [22, 23] + [22, 23] + [23, 24] + [23, 24] + [24, 25] + [24, 25] + [25, 26] + [25, 26] + [26, 27] + [26, 27] + [27, 28] + [27, 28] + [28, 29] + [28, 29] + [29, 30] + [29, 30] + [30, 31] + [30, 31] + [31, 32] + [31, 32] + [32, 33] + [32, 33] + [33, 34] + [33, 34] + [34, 35] + [34, 35] + [35, 36] + [35, 36] + [36, 37] + [36, 37] + [37, 38] + [37, 38] + [38, 39] + [38, 39] + [39, 40] + [39, 40] + [40, 41] + [40, 41] + [41, 42] + [41, 42] + [42, 43] + [42, 43] + [43, 44] + [43, 44] + [44, 45] + [44, 45] + [45, 46] + [45, 46] + [46, 47] + [46, 47] + [47, 48] + [47, 48] + [48, 49] + [48, 49] + [49, 50] + [49, 50] -=====> -Result: [0, 1, 0, 1, 1, 2, 1, 2, 2, 3, 2, 3, 3, 4, 3, 4, 4, 5, 4, 5, 5, 6, 5, 6, 6, 7, 6, 7, 7, 8, 7, 8, 8, 9, 8, 9, 9, 10, 9, 10, 10, 11, 10, 11, 11, 12, 11, 12, 12, 13, 12, 13, 13, 14, 13, 14, 14, 15, 14, 15, 15, 16, 15, 16, 16, 17, 16, 17, 17, 18, 17, 18, 18, 19, 18, 19, 19, 20, 19, 20, 20, 21, 20, 21, 21, 22, 21, 22, 22, 23, 22, 23, 23, 24, 23, 24, 24, 25, 24, 25, 25, 26, 25, 26, 26, 27, 26, 27, 27, 28, 27, 28, 28, 29, 28, 29, 29, 30, 29, 30, 30, 31, 30, 31, 31, 32, 31, 32, 32, 33, 32, 33, 33, 34, 33, 34, 34, 35, 34, 35, 35, 36, 35, 36, 36, 37, 36, 37, 37, 38, 37, 38, 38, 39, 38, 39, 39, 40, 39, 40, 40, 41, 40, 41, 41, 42, 41, 42, 42, 43, 42, 43, 43, 44, 43, 44, 44, 45, 44, 45, 45, 46, 45, 46, 46, 47, 46, 47, 47, 48, 47, 48, 48, 49, 48, 49, 49, 50, 49, 50] -Unparsed: cel.@block([[0, 1], [1, 2], [2, 3], [3, 4], [4, 5], [5, 6], [6, 7], [7, 8], [8, 9], [9, 10], [10, 11], [11, 12], [12, 13], [13, 14], [14, 15], [15, 16], [16, 17], [17, 18], [18, 19], [19, 20], [20, 21], [21, 22], [22, 23], [23, 24], [24, 25], [25, 26], [26, 27], [27, 28], [28, 29], [29, 30], [30, 31], [31, 32], [32, 33], [33, 34], [34, 35], [35, 36], [36, 37], [37, 38], [38, 39], [39, 40], [40, 41], [41, 42], [42, 43], [43, 44], [44, 45], [45, 46], [46, 47], [47, 48], [48, 49], [49, 50], @index0 + @index0 + @index1, @index50 + @index1 + @index2, @index51 + @index2 + @index3, @index52 + @index3 + @index4, @index53 + @index4 + @index5, @index54 + @index5 + @index6, @index55 + @index6 + @index7, @index56 + @index7 + @index8, @index57 + @index8 + @index9, @index58 + @index9 + @index10, @index59 + @index10 + @index11, @index60 + @index11 + @index12, @index61 + @index12 + @index13, @index62 + @index13 + @index14, @index63 + @index14 + @index15, @index64 + @index15 + @index16, @index65 + @index16 + @index17, @index66 + @index17 + @index18, @index67 + @index18 + @index19, @index68 + @index19 + @index20, @index69 + @index20 + @index21, @index70 + @index21 + @index22, @index71 + @index22 + @index23, @index72 + @index23 + @index24, @index73 + @index24 + @index25, @index74 + @index25 + @index26, @index75 + @index26 + @index27, @index76 + @index27 + @index28, @index77 + @index28 + @index29, @index78 + @index29 + @index30, @index79 + @index30 + @index31, @index80 + @index31 + @index32, @index81 + @index32 + @index33, @index82 + @index33 + @index34, @index83 + @index34 + @index35, @index84 + @index35 + @index36, @index85 + @index36 + @index37, @index86 + @index37 + @index38, @index87 + @index38 + @index39, @index88 + @index39 + @index40, @index89 + @index40 + @index41, @index90 + @index41 + @index42, @index91 + @index42 + @index43, @index92 + @index43 + @index44, @index93 + @index44 + @index45, @index94 + @index45 + @index46, @index95 + @index46 + @index47, @index96 + @index47 + @index48, @index97 + @index48 + @index49], @index98 + @index49) - -Test case: NESTED_MACROS -Source: [1,2,3].map(i, [1, 2, 3].map(i, [1, 2, 3].map(i, [1, 2, 3].map(i, [1, 2, 3].map(i, [1, 2, 3].map(i, [1, 2, 3].map(i, [1, 2, 3].map(i, [1, 2, 3])))))))) -=====> -Result: [[[[[[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]]], [[[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]]], [[[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]]]], [[[[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]]], [[[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]]], [[[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]]]], [[[[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]]], [[[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]]], [[[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]]]]], [[[[[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]]], [[[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]]], [[[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]]]], [[[[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]]], [[[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]]], [[[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]]]], [[[[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]]], [[[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]]], [[[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]]]]], [[[[[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]]], [[[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]]], [[[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]]]], [[[[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]]], [[[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]]], [[[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]]]], [[[[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]]], [[[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]]], [[[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]]]]]] -Unparsed: cel.@block([[1, 2, 3], [@index0], @index0.map(@it:0:0, @index0), [@index2], @index0.map(@it:1:0, @index2), [@index4], @index0.map(@it:2:0, @index4), [@index6], @index0.map(@it:3:0, @index6), [@index8], @index0.map(@it:4:0, @index8), [@index10], @index0.map(@it:5:0, @index10), [@index12], @index0.map(@it:6:0, @index12), [@index14]], @index0.map(@it:7:0, @index14)) \ No newline at end of file diff --git a/optimizer/src/test/resources/large_expressions_block_recursion_depth_3.baseline b/optimizer/src/test/resources/large_expressions_block_recursion_depth_3.baseline deleted file mode 100644 index e5a542ac4..000000000 --- a/optimizer/src/test/resources/large_expressions_block_recursion_depth_3.baseline +++ /dev/null @@ -1,17 +0,0 @@ -Test case: CALC_FOUR_COMMON_SUBEXPR -Source: [1] + [1,2] + [1,2,3] + [1,2,3,4] + [1] + [1,2] + [1,2,3] + [1,2,3,4] + [1] + [1,2] + [1,2,3] + [1,2,3,4] + [1] + [1,2] + [1,2,3] + [1,2,3,4] + [1] + [1,2] + [1,2,3] + [1,2,3,4] + [1] + [1,2] + [1,2,3] + [1,2,3,4] + [1] + [1,2] + [1,2,3] + [1,2,3,4] + [1] + [1,2] + [1,2,3] + [1,2,3,4] + [1] + [1,2] + [1,2,3] + [1,2,3,4] + [1] + [1,2] + [1,2,3] + [1,2,3,4] + [1] + [1,2] + [1,2,3] + [1,2,3,4] + [1] + [1,2] + [1,2,3] + [1,2,3,4] + [1] + [1,2] + [1,2,3] + [1,2,3,4] + [1] + [1,2] + [1,2,3] + [1,2,3,4] + [1] + [1,2] + [1,2,3] + [1,2,3,4] + [1] + [1,2] + [1,2,3] + [1,2,3,4] + [1] + [1,2] + [1,2,3] + [1,2,3,4] + [1] + [1,2] + [1,2,3] + [1,2,3,4] + [1] + [1,2] + [1,2,3] + [1,2,3,4] + [1] + [1,2] + [1,2,3] + [1,2,3,4] + [1] + [1,2] + [1,2,3] + [1,2,3,4] + [1] + [1,2] + [1,2,3] + [1,2,3,4] + [1] + [1,2] + [1,2,3] + [1,2,3,4] + [1] + [1,2] + [1,2,3] + [1,2,3,4] + [1] + [1,2] + [1,2,3] + [1,2,3,4] + [1] + [1,2] + [1,2,3] + [1,2,3,4] + [1] + [1,2] + [1,2,3] + [1,2,3,4] + [1] + [1,2] + [1,2,3] + [1,2,3,4] + [1] + [1,2] + [1,2,3] + [1,2,3,4] + [1] + [1,2] + [1,2,3] + [1,2,3,4] + [1] + [1,2] + [1,2,3] + [1,2,3,4] + [1] + [1,2] + [1,2,3] + [1,2,3,4] + [1] + [1,2] + [1,2,3] + [1,2,3,4] + [1] + [1,2] + [1,2,3] + [1,2,3,4] + [1] + [1,2] + [1,2,3] + [1,2,3,4] + [1] + [1,2] + [1,2,3] + [1,2,3,4] + [1] + [1,2] + [1,2,3] + [1,2,3,4] + [1] + [1,2] + [1,2,3] + [1,2,3,4] + [1] + [1,2] + [1,2,3] + [1,2,3,4] + [1] + [1,2] + [1,2,3] + [1,2,3,4] -=====> -Result: [1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4] -Unparsed: cel.@block([[1], [1, 2], [1, 2, 3], [1, 2, 3, 4], @index0 + @index1 + @index2 + @index3, @index4 + @index0 + @index1 + @index2, @index5 + @index3 + @index0 + @index1, @index6 + @index2 + @index3 + @index0, @index7 + @index1 + @index2 + @index3, @index8 + @index0 + @index1 + @index2, @index9 + @index3 + @index0 + @index1, @index10 + @index2 + @index3 + @index0, @index11 + @index1 + @index2 + @index3, @index12 + @index0 + @index1 + @index2, @index13 + @index3 + @index0 + @index1, @index14 + @index2 + @index3 + @index0, @index15 + @index1 + @index2 + @index3, @index16 + @index0 + @index1 + @index2, @index17 + @index3 + @index0 + @index1, @index18 + @index2 + @index3 + @index0, @index19 + @index1 + @index2 + @index3, @index20 + @index0 + @index1 + @index2, @index21 + @index3 + @index0 + @index1, @index22 + @index2 + @index3 + @index0, @index23 + @index1 + @index2 + @index3, @index24 + @index0 + @index1 + @index2, @index25 + @index3 + @index0 + @index1, @index26 + @index2 + @index3 + @index0, @index27 + @index1 + @index2 + @index3, @index28 + @index0 + @index1 + @index2, @index29 + @index3 + @index0 + @index1, @index30 + @index2 + @index3 + @index0, @index31 + @index1 + @index2 + @index3, @index32 + @index0 + @index1 + @index2, @index33 + @index3 + @index0 + @index1, @index34 + @index2 + @index3 + @index0, @index35 + @index1 + @index2 + @index3, @index36 + @index0 + @index1 + @index2, @index37 + @index3 + @index0 + @index1, @index38 + @index2 + @index3 + @index0, @index39 + @index1 + @index2 + @index3, @index40 + @index0 + @index1 + @index2, @index41 + @index3 + @index0 + @index1, @index42 + @index2 + @index3 + @index0, @index43 + @index1 + @index2 + @index3, @index44 + @index0 + @index1 + @index2, @index45 + @index3 + @index0 + @index1, @index46 + @index2 + @index3 + @index0, @index47 + @index1 + @index2 + @index3, @index48 + @index0 + @index1 + @index2, @index49 + @index3 + @index0 + @index1, @index50 + @index2 + @index3 + @index0, @index51 + @index1 + @index2 + @index3, @index52 + @index0 + @index1 + @index2, @index53 + @index3 + @index0 + @index1, @index54 + @index2 + @index3 + @index0], @index55 + @index1 + @index2 + @index3) - -Test case: CALC_ALL_COMMON_SUBEXPR -Source: [0, 1] + [0, 1] + [1, 2] + [1, 2] + [2, 3] + [2, 3] + [3, 4] + [3, 4] + [4, 5] + [4, 5] + [5, 6] + [5, 6] + [6, 7] + [6, 7] + [7, 8] + [7, 8] + [8, 9] + [8, 9] + [9, 10] + [9, 10] + [10, 11] + [10, 11] + [11, 12] + [11, 12] + [12, 13] + [12, 13] + [13, 14] + [13, 14] + [14, 15] + [14, 15] + [15, 16] + [15, 16] + [16, 17] + [16, 17] + [17, 18] + [17, 18] + [18, 19] + [18, 19] + [19, 20] + [19, 20] + [20, 21] + [20, 21] + [21, 22] + [21, 22] + [22, 23] + [22, 23] + [23, 24] + [23, 24] + [24, 25] + [24, 25] + [25, 26] + [25, 26] + [26, 27] + [26, 27] + [27, 28] + [27, 28] + [28, 29] + [28, 29] + [29, 30] + [29, 30] + [30, 31] + [30, 31] + [31, 32] + [31, 32] + [32, 33] + [32, 33] + [33, 34] + [33, 34] + [34, 35] + [34, 35] + [35, 36] + [35, 36] + [36, 37] + [36, 37] + [37, 38] + [37, 38] + [38, 39] + [38, 39] + [39, 40] + [39, 40] + [40, 41] + [40, 41] + [41, 42] + [41, 42] + [42, 43] + [42, 43] + [43, 44] + [43, 44] + [44, 45] + [44, 45] + [45, 46] + [45, 46] + [46, 47] + [46, 47] + [47, 48] + [47, 48] + [48, 49] + [48, 49] + [49, 50] + [49, 50] -=====> -Result: [0, 1, 0, 1, 1, 2, 1, 2, 2, 3, 2, 3, 3, 4, 3, 4, 4, 5, 4, 5, 5, 6, 5, 6, 6, 7, 6, 7, 7, 8, 7, 8, 8, 9, 8, 9, 9, 10, 9, 10, 10, 11, 10, 11, 11, 12, 11, 12, 12, 13, 12, 13, 13, 14, 13, 14, 14, 15, 14, 15, 15, 16, 15, 16, 16, 17, 16, 17, 17, 18, 17, 18, 18, 19, 18, 19, 19, 20, 19, 20, 20, 21, 20, 21, 21, 22, 21, 22, 22, 23, 22, 23, 23, 24, 23, 24, 24, 25, 24, 25, 25, 26, 25, 26, 26, 27, 26, 27, 27, 28, 27, 28, 28, 29, 28, 29, 29, 30, 29, 30, 30, 31, 30, 31, 31, 32, 31, 32, 32, 33, 32, 33, 33, 34, 33, 34, 34, 35, 34, 35, 35, 36, 35, 36, 36, 37, 36, 37, 37, 38, 37, 38, 38, 39, 38, 39, 39, 40, 39, 40, 40, 41, 40, 41, 41, 42, 41, 42, 42, 43, 42, 43, 43, 44, 43, 44, 44, 45, 44, 45, 45, 46, 45, 46, 46, 47, 46, 47, 47, 48, 47, 48, 48, 49, 48, 49, 49, 50, 49, 50] -Unparsed: cel.@block([[0, 1], [1, 2], [2, 3], [3, 4], [4, 5], [5, 6], [6, 7], [7, 8], [8, 9], [9, 10], [10, 11], [11, 12], [12, 13], [13, 14], [14, 15], [15, 16], [16, 17], [17, 18], [18, 19], [19, 20], [20, 21], [21, 22], [22, 23], [23, 24], [24, 25], [25, 26], [26, 27], [27, 28], [28, 29], [29, 30], [30, 31], [31, 32], [32, 33], [33, 34], [34, 35], [35, 36], [36, 37], [37, 38], [38, 39], [39, 40], [40, 41], [41, 42], [42, 43], [43, 44], [44, 45], [45, 46], [46, 47], [47, 48], [48, 49], [49, 50], @index0 + @index0 + @index1 + @index1, @index50 + @index2 + @index2 + @index3, @index51 + @index3 + @index4 + @index4, @index52 + @index5 + @index5 + @index6, @index53 + @index6 + @index7 + @index7, @index54 + @index8 + @index8 + @index9, @index55 + @index9 + @index10 + @index10, @index56 + @index11 + @index11 + @index12, @index57 + @index12 + @index13 + @index13, @index58 + @index14 + @index14 + @index15, @index59 + @index15 + @index16 + @index16, @index60 + @index17 + @index17 + @index18, @index61 + @index18 + @index19 + @index19, @index62 + @index20 + @index20 + @index21, @index63 + @index21 + @index22 + @index22, @index64 + @index23 + @index23 + @index24, @index65 + @index24 + @index25 + @index25, @index66 + @index26 + @index26 + @index27, @index67 + @index27 + @index28 + @index28, @index68 + @index29 + @index29 + @index30, @index69 + @index30 + @index31 + @index31, @index70 + @index32 + @index32 + @index33, @index71 + @index33 + @index34 + @index34, @index72 + @index35 + @index35 + @index36, @index73 + @index36 + @index37 + @index37, @index74 + @index38 + @index38 + @index39, @index75 + @index39 + @index40 + @index40, @index76 + @index41 + @index41 + @index42, @index77 + @index42 + @index43 + @index43, @index78 + @index44 + @index44 + @index45, @index79 + @index45 + @index46 + @index46, @index80 + @index47 + @index47 + @index48], @index81 + @index48 + @index49 + @index49) - -Test case: NESTED_MACROS -Source: [1,2,3].map(i, [1, 2, 3].map(i, [1, 2, 3].map(i, [1, 2, 3].map(i, [1, 2, 3].map(i, [1, 2, 3].map(i, [1, 2, 3].map(i, [1, 2, 3].map(i, [1, 2, 3])))))))) -=====> -Result: [[[[[[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]]], [[[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]]], [[[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]]]], [[[[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]]], [[[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]]], [[[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]]]], [[[[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]]], [[[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]]], [[[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]]]]], [[[[[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]]], [[[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]]], [[[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]]]], [[[[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]]], [[[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]]], [[[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]]]], [[[[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]]], [[[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]]], [[[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]]]]], [[[[[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]]], [[[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]]], [[[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]]]], [[[[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]]], [[[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]]], [[[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]]]], [[[[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]]], [[[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]]], [[[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]], [[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]], [[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]]]]]] -Unparsed: cel.@block([[1, 2, 3], @index0.map(@it:0:0, @index0), @index0.map(@it:1:0, @index1), @index0.map(@it:2:0, @index2), @index0.map(@it:3:0, @index3), @index0.map(@it:4:0, @index4), @index0.map(@it:5:0, @index5), @index0.map(@it:6:0, @index6)], @index0.map(@it:7:0, @index7)) \ No newline at end of file diff --git a/optimizer/src/test/resources/subexpression_ast_block_common_subexpr_comprehension_structure_retained.baseline b/optimizer/src/test/resources/subexpression_ast_block_common_subexpr_comprehension_structure_retained.baseline deleted file mode 100644 index 61dc23350..000000000 --- a/optimizer/src/test/resources/subexpression_ast_block_common_subexpr_comprehension_structure_retained.baseline +++ /dev/null @@ -1,3422 +0,0 @@ -Test case: SIZE_1 -Source: size([1,2]) + size([1,2]) + 1 == 5 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - CALL [3] { - function: size - args: { - LIST [4] { - elements: { - CONSTANT [5] { value: 1 } - CONSTANT [6] { value: 2 } - } - } - } - } - } - } - CALL [7] { - function: _==_ - args: { - CALL [8] { - function: _+_ - args: { - CALL [9] { - function: _+_ - args: { - IDENT [10] { - name: @index0 - } - IDENT [11] { - name: @index0 - } - } - } - CONSTANT [12] { value: 1 } - } - } - CONSTANT [13] { value: 5 } - } - } - } -} -Test case: SIZE_2 -Source: 2 + size([1,2]) + size([1,2]) + 1 == 7 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - CALL [3] { - function: size - args: { - LIST [4] { - elements: { - CONSTANT [5] { value: 1 } - CONSTANT [6] { value: 2 } - } - } - } - } - } - } - CALL [7] { - function: _==_ - args: { - CALL [8] { - function: _+_ - args: { - CALL [9] { - function: _+_ - args: { - CALL [10] { - function: _+_ - args: { - CONSTANT [11] { value: 2 } - IDENT [12] { - name: @index0 - } - } - } - IDENT [13] { - name: @index0 - } - } - } - CONSTANT [14] { value: 1 } - } - } - CONSTANT [15] { value: 7 } - } - } - } -} -Test case: SIZE_3 -Source: size([0]) + size([0]) + size([1,2]) + size([1,2]) == 6 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - CALL [3] { - function: size - args: { - LIST [4] { - elements: { - CONSTANT [5] { value: 0 } - } - } - } - } - CALL [6] { - function: size - args: { - LIST [7] { - elements: { - CONSTANT [8] { value: 1 } - CONSTANT [9] { value: 2 } - } - } - } - } - } - } - CALL [10] { - function: _==_ - args: { - CALL [11] { - function: _+_ - args: { - CALL [12] { - function: _+_ - args: { - CALL [13] { - function: _+_ - args: { - IDENT [14] { - name: @index0 - } - IDENT [15] { - name: @index0 - } - } - } - IDENT [16] { - name: @index1 - } - } - } - IDENT [17] { - name: @index1 - } - } - } - CONSTANT [18] { value: 6 } - } - } - } -} -Test case: SIZE_4 -Source: 5 + size([0]) + size([0]) + size([1,2]) + size([1,2]) + size([1,2,3]) + size([1,2,3]) == 17 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - CALL [3] { - function: size - args: { - LIST [4] { - elements: { - CONSTANT [5] { value: 0 } - } - } - } - } - CALL [6] { - function: size - args: { - LIST [7] { - elements: { - CONSTANT [8] { value: 1 } - CONSTANT [9] { value: 2 } - } - } - } - } - CALL [10] { - function: size - args: { - LIST [11] { - elements: { - CONSTANT [12] { value: 1 } - CONSTANT [13] { value: 2 } - CONSTANT [14] { value: 3 } - } - } - } - } - } - } - CALL [15] { - function: _==_ - args: { - CALL [16] { - function: _+_ - args: { - CALL [17] { - function: _+_ - args: { - CALL [18] { - function: _+_ - args: { - CALL [19] { - function: _+_ - args: { - CALL [20] { - function: _+_ - args: { - CALL [21] { - function: _+_ - args: { - CONSTANT [22] { value: 5 } - IDENT [23] { - name: @index0 - } - } - } - IDENT [24] { - name: @index0 - } - } - } - IDENT [25] { - name: @index1 - } - } - } - IDENT [26] { - name: @index1 - } - } - } - IDENT [27] { - name: @index2 - } - } - } - IDENT [28] { - name: @index2 - } - } - } - CONSTANT [29] { value: 17 } - } - } - } -} -Test case: TIMESTAMP -Source: timestamp(int(timestamp(1000000000))).getFullYear() + timestamp(int(timestamp(75))).getFullYear() + timestamp(int(timestamp(50))).getFullYear() + timestamp(int(timestamp(1000000000))).getFullYear() + timestamp(int(timestamp(50))).getSeconds() + timestamp(int(timestamp(200))).getFullYear() + timestamp(int(timestamp(200))).getFullYear() + timestamp(int(timestamp(75))).getMinutes() + timestamp(int(timestamp(1000000000))).getFullYear() == 13934 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - CALL [3] { - function: getFullYear - target: { - CALL [4] { - function: timestamp - args: { - CALL [5] { - function: int - args: { - CALL [6] { - function: timestamp - args: { - CONSTANT [7] { value: 1000000000 } - } - } - } - } - } - } - } - args: { - } - } - CALL [8] { - function: timestamp - args: { - CALL [9] { - function: int - args: { - CALL [10] { - function: timestamp - args: { - CONSTANT [11] { value: 50 } - } - } - } - } - } - } - CALL [12] { - function: getFullYear - target: { - CALL [13] { - function: timestamp - args: { - CALL [14] { - function: int - args: { - CALL [15] { - function: timestamp - args: { - CONSTANT [16] { value: 200 } - } - } - } - } - } - } - } - args: { - } - } - CALL [17] { - function: timestamp - args: { - CALL [18] { - function: int - args: { - CALL [19] { - function: timestamp - args: { - CONSTANT [20] { value: 75 } - } - } - } - } - } - } - } - } - CALL [21] { - function: _==_ - args: { - CALL [22] { - function: _+_ - args: { - CALL [23] { - function: _+_ - args: { - CALL [24] { - function: _+_ - args: { - CALL [25] { - function: _+_ - args: { - CALL [26] { - function: _+_ - args: { - CALL [27] { - function: _+_ - args: { - CALL [28] { - function: _+_ - args: { - CALL [29] { - function: _+_ - args: { - IDENT [30] { - name: @index0 - } - CALL [31] { - function: getFullYear - target: { - IDENT [32] { - name: @index3 - } - } - args: { - } - } - } - } - CALL [33] { - function: getFullYear - target: { - IDENT [34] { - name: @index1 - } - } - args: { - } - } - } - } - IDENT [35] { - name: @index0 - } - } - } - CALL [36] { - function: getSeconds - target: { - IDENT [37] { - name: @index1 - } - } - args: { - } - } - } - } - IDENT [38] { - name: @index2 - } - } - } - IDENT [39] { - name: @index2 - } - } - } - CALL [40] { - function: getMinutes - target: { - IDENT [41] { - name: @index3 - } - } - args: { - } - } - } - } - IDENT [42] { - name: @index0 - } - } - } - CONSTANT [43] { value: 13934 } - } - } - } -} -Test case: MAP_INDEX -Source: {"a": 2}["a"] + {"a": 2}["a"] * {"a": 2}["a"] == 6 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - CALL [3] { - function: _[_] - args: { - MAP [4] { - MAP_ENTRY [5] { - key: { - CONSTANT [6] { value: "a" } - } - value: { - CONSTANT [7] { value: 2 } - } - } - } - CONSTANT [8] { value: "a" } - } - } - } - } - CALL [9] { - function: _==_ - args: { - CALL [10] { - function: _+_ - args: { - IDENT [11] { - name: @index0 - } - CALL [12] { - function: _*_ - args: { - IDENT [13] { - name: @index0 - } - IDENT [14] { - name: @index0 - } - } - } - } - } - CONSTANT [15] { value: 6 } - } - } - } -} -Test case: NESTED_MAP_CONSTRUCTION -Source: {'a': {'b': 1}, 'c': {'b': 1}, 'd': {'e': {'b': 1}}, 'e': {'e': {'b': 1}}} -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - MAP [3] { - MAP_ENTRY [4] { - key: { - CONSTANT [5] { value: "b" } - } - value: { - CONSTANT [6] { value: 1 } - } - } - } - MAP [7] { - MAP_ENTRY [8] { - key: { - CONSTANT [9] { value: "e" } - } - value: { - IDENT [10] { - name: @index0 - } - } - } - } - } - } - MAP [11] { - MAP_ENTRY [12] { - key: { - CONSTANT [13] { value: "a" } - } - value: { - IDENT [14] { - name: @index0 - } - } - } - MAP_ENTRY [15] { - key: { - CONSTANT [16] { value: "c" } - } - value: { - IDENT [17] { - name: @index0 - } - } - } - MAP_ENTRY [18] { - key: { - CONSTANT [19] { value: "d" } - } - value: { - IDENT [20] { - name: @index1 - } - } - } - MAP_ENTRY [21] { - key: { - CONSTANT [22] { value: "e" } - } - value: { - IDENT [23] { - name: @index1 - } - } - } - } - } -} -Test case: NESTED_LIST_CONSTRUCTION -Source: [1, [1,2,3,4], 2, [1,2,3,4], 5, [1,2,3,4], 7, [[1,2], [1,2,3,4]], [1,2]] -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - LIST [3] { - elements: { - CONSTANT [4] { value: 1 } - CONSTANT [5] { value: 2 } - CONSTANT [6] { value: 3 } - CONSTANT [7] { value: 4 } - } - } - LIST [8] { - elements: { - CONSTANT [9] { value: 1 } - CONSTANT [10] { value: 2 } - } - } - } - } - LIST [11] { - elements: { - CONSTANT [12] { value: 1 } - IDENT [13] { - name: @index0 - } - CONSTANT [14] { value: 2 } - IDENT [15] { - name: @index0 - } - CONSTANT [16] { value: 5 } - IDENT [17] { - name: @index0 - } - CONSTANT [18] { value: 7 } - LIST [19] { - elements: { - IDENT [20] { - name: @index1 - } - IDENT [21] { - name: @index0 - } - } - } - IDENT [22] { - name: @index1 - } - } - } - } -} -Test case: SELECT -Source: msg.single_int64 + msg.single_int64 == 6 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - SELECT [3] { - IDENT [4] { - name: msg - }.single_int64 - } - } - } - CALL [5] { - function: _==_ - args: { - CALL [6] { - function: _+_ - args: { - IDENT [7] { - name: @index0 - } - IDENT [8] { - name: @index0 - } - } - } - CONSTANT [9] { value: 6 } - } - } - } -} -Test case: SELECT_NESTED_1 -Source: msg.oneof_type.payload.single_int64 + msg.oneof_type.payload.single_int32 + msg.oneof_type.payload.single_int64 + msg.single_int64 + msg.oneof_type.payload.oneof_type.payload.single_int64 == 31 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - SELECT [3] { - SELECT [4] { - IDENT [5] { - name: msg - }.oneof_type - }.payload - } - SELECT [6] { - IDENT [7] { - name: @index0 - }.single_int64 - } - } - } - CALL [8] { - function: _==_ - args: { - CALL [9] { - function: _+_ - args: { - CALL [10] { - function: _+_ - args: { - CALL [11] { - function: _+_ - args: { - CALL [12] { - function: _+_ - args: { - IDENT [13] { - name: @index1 - } - SELECT [14] { - IDENT [15] { - name: @index0 - }.single_int32 - } - } - } - IDENT [16] { - name: @index1 - } - } - } - SELECT [17] { - IDENT [18] { - name: msg - }.single_int64 - } - } - } - SELECT [19] { - SELECT [20] { - SELECT [21] { - IDENT [22] { - name: @index0 - }.oneof_type - }.payload - }.single_int64 - } - } - } - CONSTANT [23] { value: 31 } - } - } - } -} -Test case: SELECT_NESTED_2 -Source: true || msg.oneof_type.payload.oneof_type.payload.oneof_type.payload.oneof_type.payload.single_bool || msg.oneof_type.payload.oneof_type.payload.oneof_type.child.child.payload.single_bool -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - SELECT [3] { - SELECT [4] { - SELECT [5] { - SELECT [6] { - SELECT [7] { - IDENT [8] { - name: msg - }.oneof_type - }.payload - }.oneof_type - }.payload - }.oneof_type - } - } - } - CALL [9] { - function: _||_ - args: { - CALL [10] { - function: _||_ - args: { - CONSTANT [11] { value: true } - SELECT [12] { - SELECT [13] { - SELECT [14] { - SELECT [15] { - IDENT [16] { - name: @index0 - }.payload - }.oneof_type - }.payload - }.single_bool - } - } - } - SELECT [17] { - SELECT [18] { - SELECT [19] { - SELECT [20] { - IDENT [21] { - name: @index0 - }.child - }.child - }.payload - }.single_bool - } - } - } - } -} -Test case: SELECT_NESTED_MESSAGE_MAP_INDEX_1 -Source: msg.oneof_type.payload.map_int32_int64[1] + msg.oneof_type.payload.map_int32_int64[1] + msg.oneof_type.payload.map_int32_int64[1] == 15 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - CALL [3] { - function: _[_] - args: { - SELECT [4] { - SELECT [5] { - SELECT [6] { - IDENT [7] { - name: msg - }.oneof_type - }.payload - }.map_int32_int64 - } - CONSTANT [8] { value: 1 } - } - } - } - } - CALL [9] { - function: _==_ - args: { - CALL [10] { - function: _+_ - args: { - CALL [11] { - function: _+_ - args: { - IDENT [12] { - name: @index0 - } - IDENT [13] { - name: @index0 - } - } - } - IDENT [14] { - name: @index0 - } - } - } - CONSTANT [15] { value: 15 } - } - } - } -} -Test case: SELECT_NESTED_MESSAGE_MAP_INDEX_2 -Source: msg.oneof_type.payload.map_int32_int64[0] + msg.oneof_type.payload.map_int32_int64[1] + msg.oneof_type.payload.map_int32_int64[2] == 8 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - SELECT [3] { - SELECT [4] { - SELECT [5] { - IDENT [6] { - name: msg - }.oneof_type - }.payload - }.map_int32_int64 - } - } - } - CALL [7] { - function: _==_ - args: { - CALL [8] { - function: _+_ - args: { - CALL [9] { - function: _+_ - args: { - CALL [10] { - function: _[_] - args: { - IDENT [11] { - name: @index0 - } - CONSTANT [12] { value: 0 } - } - } - CALL [13] { - function: _[_] - args: { - IDENT [14] { - name: @index0 - } - CONSTANT [15] { value: 1 } - } - } - } - } - CALL [16] { - function: _[_] - args: { - IDENT [17] { - name: @index0 - } - CONSTANT [18] { value: 2 } - } - } - } - } - CONSTANT [19] { value: 8 } - } - } - } -} -Test case: SELECT_NESTED_NO_COMMON_SUBEXPR -Source: msg.oneof_type.payload.oneof_type.payload.oneof_type.payload.oneof_type.payload.single_int64 -=====> -SELECT [10] { - SELECT [9] { - SELECT [8] { - SELECT [7] { - SELECT [6] { - SELECT [5] { - SELECT [4] { - SELECT [3] { - SELECT [2] { - IDENT [1] { - name: msg - }.oneof_type - }.payload - }.oneof_type - }.payload - }.oneof_type - }.payload - }.oneof_type - }.payload - }.single_int64 -} -Test case: TERNARY -Source: (msg.single_int64 > 0 ? msg.single_int64 : 0) == 3 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - SELECT [3] { - IDENT [4] { - name: msg - }.single_int64 - } - } - } - CALL [5] { - function: _==_ - args: { - CALL [6] { - function: _?_:_ - args: { - CALL [7] { - function: _>_ - args: { - IDENT [8] { - name: @index0 - } - CONSTANT [9] { value: 0 } - } - } - IDENT [10] { - name: @index0 - } - CONSTANT [11] { value: 0 } - } - } - CONSTANT [12] { value: 3 } - } - } - } -} -Test case: TERNARY_BIND_RHS_ONLY -Source: false ? false : (msg.single_int64) + ((msg.single_int64 + 1) * 2) == 11 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - SELECT [3] { - IDENT [4] { - name: msg - }.single_int64 - } - } - } - CALL [5] { - function: _?_:_ - args: { - CONSTANT [6] { value: false } - CONSTANT [7] { value: false } - CALL [8] { - function: _==_ - args: { - CALL [9] { - function: _+_ - args: { - IDENT [10] { - name: @index0 - } - CALL [11] { - function: _*_ - args: { - CALL [12] { - function: _+_ - args: { - IDENT [13] { - name: @index0 - } - CONSTANT [14] { value: 1 } - } - } - CONSTANT [15] { value: 2 } - } - } - } - } - CONSTANT [16] { value: 11 } - } - } - } - } - } -} -Test case: NESTED_TERNARY -Source: (msg.single_int64 > 0 ? (msg.single_int32 > 0 ? msg.single_int64 + msg.single_int32 : 0) : 0) == 8 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - SELECT [3] { - IDENT [4] { - name: msg - }.single_int64 - } - SELECT [5] { - IDENT [6] { - name: msg - }.single_int32 - } - } - } - CALL [7] { - function: _==_ - args: { - CALL [8] { - function: _?_:_ - args: { - CALL [9] { - function: _>_ - args: { - IDENT [10] { - name: @index0 - } - CONSTANT [11] { value: 0 } - } - } - CALL [12] { - function: _?_:_ - args: { - CALL [13] { - function: _>_ - args: { - IDENT [14] { - name: @index1 - } - CONSTANT [15] { value: 0 } - } - } - CALL [16] { - function: _+_ - args: { - IDENT [17] { - name: @index0 - } - IDENT [18] { - name: @index1 - } - } - } - CONSTANT [19] { value: 0 } - } - } - CONSTANT [20] { value: 0 } - } - } - CONSTANT [21] { value: 8 } - } - } - } -} -Test case: MULTIPLE_MACROS_1 -Source: size([[1].exists(i, i > 0)]) + size([[1].exists(j, j > 0)]) + size([[2].exists(k, k > 1)]) + size([[2].exists(l, l > 1)]) == 4 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - COMPREHENSION [3] { - iter_var: @it:0:0 - iter_range: { - LIST [4] { - elements: { - CONSTANT [5] { value: 1 } - } - } - } - accu_var: @ac:0:0 - accu_init: { - CONSTANT [6] { value: false } - } - loop_condition: { - CALL [7] { - function: @not_strictly_false - args: { - CALL [8] { - function: !_ - args: { - IDENT [9] { - name: @ac:0:0 - } - } - } - } - } - } - loop_step: { - CALL [10] { - function: _||_ - args: { - IDENT [11] { - name: @ac:0:0 - } - CALL [12] { - function: _>_ - args: { - IDENT [13] { - name: @it:0:0 - } - CONSTANT [14] { value: 0 } - } - } - } - } - } - result: { - IDENT [15] { - name: @ac:0:0 - } - } - } - CALL [16] { - function: size - args: { - LIST [17] { - elements: { - IDENT [18] { - name: @index0 - } - } - } - } - } - COMPREHENSION [19] { - iter_var: @it:0:0 - iter_range: { - LIST [20] { - elements: { - CONSTANT [21] { value: 2 } - } - } - } - accu_var: @ac:0:0 - accu_init: { - CONSTANT [22] { value: false } - } - loop_condition: { - CALL [23] { - function: @not_strictly_false - args: { - CALL [24] { - function: !_ - args: { - IDENT [25] { - name: @ac:0:0 - } - } - } - } - } - } - loop_step: { - CALL [26] { - function: _||_ - args: { - IDENT [27] { - name: @ac:0:0 - } - CALL [28] { - function: _>_ - args: { - IDENT [29] { - name: @it:0:0 - } - CONSTANT [30] { value: 1 } - } - } - } - } - } - result: { - IDENT [31] { - name: @ac:0:0 - } - } - } - CALL [32] { - function: size - args: { - LIST [33] { - elements: { - IDENT [34] { - name: @index2 - } - } - } - } - } - } - } - CALL [35] { - function: _==_ - args: { - CALL [36] { - function: _+_ - args: { - CALL [37] { - function: _+_ - args: { - CALL [38] { - function: _+_ - args: { - IDENT [39] { - name: @index1 - } - IDENT [40] { - name: @index1 - } - } - } - IDENT [41] { - name: @index3 - } - } - } - IDENT [42] { - name: @index3 - } - } - } - CONSTANT [43] { value: 4 } - } - } - } -} -Test case: MULTIPLE_MACROS_2 -Source: [[1].exists(i, i > 0)] + [[1].exists(j, j > 0)] + [['a'].exists(k, k == 'a')] + [['a'].exists(l, l == 'a')] == [true, true, true, true] -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - COMPREHENSION [3] { - iter_var: @it:0:0 - iter_range: { - LIST [4] { - elements: { - CONSTANT [5] { value: 1 } - } - } - } - accu_var: @ac:0:0 - accu_init: { - CONSTANT [6] { value: false } - } - loop_condition: { - CALL [7] { - function: @not_strictly_false - args: { - CALL [8] { - function: !_ - args: { - IDENT [9] { - name: @ac:0:0 - } - } - } - } - } - } - loop_step: { - CALL [10] { - function: _||_ - args: { - IDENT [11] { - name: @ac:0:0 - } - CALL [12] { - function: _>_ - args: { - IDENT [13] { - name: @it:0:0 - } - CONSTANT [14] { value: 0 } - } - } - } - } - } - result: { - IDENT [15] { - name: @ac:0:0 - } - } - } - LIST [16] { - elements: { - IDENT [17] { - name: @index0 - } - } - } - COMPREHENSION [18] { - iter_var: @it:0:1 - iter_range: { - LIST [19] { - elements: { - CONSTANT [20] { value: "a" } - } - } - } - accu_var: @ac:0:1 - accu_init: { - CONSTANT [21] { value: false } - } - loop_condition: { - CALL [22] { - function: @not_strictly_false - args: { - CALL [23] { - function: !_ - args: { - IDENT [24] { - name: @ac:0:1 - } - } - } - } - } - } - loop_step: { - CALL [25] { - function: _||_ - args: { - IDENT [26] { - name: @ac:0:1 - } - CALL [27] { - function: _==_ - args: { - IDENT [28] { - name: @it:0:1 - } - CONSTANT [29] { value: "a" } - } - } - } - } - } - result: { - IDENT [30] { - name: @ac:0:1 - } - } - } - LIST [31] { - elements: { - IDENT [32] { - name: @index2 - } - } - } - } - } - CALL [33] { - function: _==_ - args: { - CALL [34] { - function: _+_ - args: { - CALL [35] { - function: _+_ - args: { - CALL [36] { - function: _+_ - args: { - IDENT [37] { - name: @index1 - } - IDENT [38] { - name: @index1 - } - } - } - IDENT [39] { - name: @index3 - } - } - } - IDENT [40] { - name: @index3 - } - } - } - LIST [41] { - elements: { - CONSTANT [42] { value: true } - CONSTANT [43] { value: true } - CONSTANT [44] { value: true } - CONSTANT [45] { value: true } - } - } - } - } - } -} -Test case: MULTIPLE_MACROS_3 -Source: [1].exists(i, i > 0) && [1].exists(j, j > 0) && [1].exists(k, k > 1) && [2].exists(l, l > 1) -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - COMPREHENSION [3] { - iter_var: @it:0:0 - iter_range: { - LIST [4] { - elements: { - CONSTANT [5] { value: 1 } - } - } - } - accu_var: @ac:0:0 - accu_init: { - CONSTANT [6] { value: false } - } - loop_condition: { - CALL [7] { - function: @not_strictly_false - args: { - CALL [8] { - function: !_ - args: { - IDENT [9] { - name: @ac:0:0 - } - } - } - } - } - } - loop_step: { - CALL [10] { - function: _||_ - args: { - IDENT [11] { - name: @ac:0:0 - } - CALL [12] { - function: _>_ - args: { - IDENT [13] { - name: @it:0:0 - } - CONSTANT [14] { value: 0 } - } - } - } - } - } - result: { - IDENT [15] { - name: @ac:0:0 - } - } - } - } - } - CALL [16] { - function: _&&_ - args: { - CALL [17] { - function: _&&_ - args: { - IDENT [18] { - name: @index0 - } - IDENT [19] { - name: @index0 - } - } - } - CALL [20] { - function: _&&_ - args: { - COMPREHENSION [21] { - iter_var: @it:0:0 - iter_range: { - LIST [22] { - elements: { - CONSTANT [23] { value: 1 } - } - } - } - accu_var: @ac:0:0 - accu_init: { - CONSTANT [24] { value: false } - } - loop_condition: { - CALL [25] { - function: @not_strictly_false - args: { - CALL [26] { - function: !_ - args: { - IDENT [27] { - name: @ac:0:0 - } - } - } - } - } - } - loop_step: { - CALL [28] { - function: _||_ - args: { - IDENT [29] { - name: @ac:0:0 - } - CALL [30] { - function: _>_ - args: { - IDENT [31] { - name: @it:0:0 - } - CONSTANT [32] { value: 1 } - } - } - } - } - } - result: { - IDENT [33] { - name: @ac:0:0 - } - } - } - COMPREHENSION [34] { - iter_var: @it:0:0 - iter_range: { - LIST [35] { - elements: { - CONSTANT [36] { value: 2 } - } - } - } - accu_var: @ac:0:0 - accu_init: { - CONSTANT [37] { value: false } - } - loop_condition: { - CALL [38] { - function: @not_strictly_false - args: { - CALL [39] { - function: !_ - args: { - IDENT [40] { - name: @ac:0:0 - } - } - } - } - } - } - loop_step: { - CALL [41] { - function: _||_ - args: { - IDENT [42] { - name: @ac:0:0 - } - CALL [43] { - function: _>_ - args: { - IDENT [44] { - name: @it:0:0 - } - CONSTANT [45] { value: 1 } - } - } - } - } - } - result: { - IDENT [46] { - name: @ac:0:0 - } - } - } - } - } - } - } - } -} -Test case: NESTED_MACROS -Source: [1,2,3].map(i, [1, 2, 3].map(i, i + 1)) == [[2, 3, 4], [2, 3, 4], [2, 3, 4]] -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - LIST [3] { - elements: { - CONSTANT [4] { value: 1 } - CONSTANT [5] { value: 2 } - CONSTANT [6] { value: 3 } - } - } - LIST [7] { - elements: { - CONSTANT [8] { value: 2 } - CONSTANT [9] { value: 3 } - CONSTANT [10] { value: 4 } - } - } - } - } - CALL [11] { - function: _==_ - args: { - COMPREHENSION [12] { - iter_var: @it:0:0 - iter_range: { - IDENT [13] { - name: @index0 - } - } - accu_var: @ac:0:0 - accu_init: { - LIST [14] { - elements: { - } - } - } - loop_condition: { - CONSTANT [15] { value: true } - } - loop_step: { - CALL [16] { - function: _+_ - args: { - IDENT [17] { - name: @ac:0:0 - } - LIST [18] { - elements: { - COMPREHENSION [19] { - iter_var: @it:1:0 - iter_range: { - IDENT [20] { - name: @index0 - } - } - accu_var: @ac:1:0 - accu_init: { - LIST [21] { - elements: { - } - } - } - loop_condition: { - CONSTANT [22] { value: true } - } - loop_step: { - CALL [23] { - function: _+_ - args: { - IDENT [24] { - name: @ac:1:0 - } - LIST [25] { - elements: { - CALL [26] { - function: _+_ - args: { - IDENT [27] { - name: @it:1:0 - } - CONSTANT [28] { value: 1 } - } - } - } - } - } - } - } - result: { - IDENT [29] { - name: @ac:1:0 - } - } - } - } - } - } - } - } - result: { - IDENT [30] { - name: @ac:0:0 - } - } - } - LIST [31] { - elements: { - IDENT [32] { - name: @index1 - } - IDENT [33] { - name: @index1 - } - IDENT [34] { - name: @index1 - } - } - } - } - } - } -} -Test case: NESTED_MACROS_2 -Source: [1, 2].map(y, [1, 2, 3].filter(x, x == y)) == [[1], [2]] -=====> -CALL [31] { - function: _==_ - args: { - COMPREHENSION [30] { - iter_var: @it:0:0 - iter_range: { - LIST [1] { - elements: { - CONSTANT [2] { value: 1 } - CONSTANT [3] { value: 2 } - } - } - } - accu_var: @ac:0:0 - accu_init: { - LIST [24] { - elements: { - } - } - } - loop_condition: { - CONSTANT [25] { value: true } - } - loop_step: { - CALL [28] { - function: _+_ - args: { - IDENT [26] { - name: @ac:0:0 - } - LIST [27] { - elements: { - COMPREHENSION [23] { - iter_var: @it:1:0 - iter_range: { - LIST [6] { - elements: { - CONSTANT [7] { value: 1 } - CONSTANT [8] { value: 2 } - CONSTANT [9] { value: 3 } - } - } - } - accu_var: @ac:1:0 - accu_init: { - LIST [15] { - elements: { - } - } - } - loop_condition: { - CONSTANT [16] { value: true } - } - loop_step: { - CALL [21] { - function: _?_:_ - args: { - CALL [13] { - function: _==_ - args: { - IDENT [12] { - name: @it:1:0 - } - IDENT [14] { - name: @it:0:0 - } - } - } - CALL [19] { - function: _+_ - args: { - IDENT [17] { - name: @ac:1:0 - } - LIST [18] { - elements: { - IDENT [11] { - name: @it:1:0 - } - } - } - } - } - IDENT [20] { - name: @ac:1:0 - } - } - } - } - result: { - IDENT [22] { - name: @ac:1:0 - } - } - } - } - } - } - } - } - result: { - IDENT [29] { - name: @ac:0:0 - } - } - } - LIST [32] { - elements: { - LIST [33] { - elements: { - CONSTANT [34] { value: 1 } - } - } - LIST [35] { - elements: { - CONSTANT [36] { value: 2 } - } - } - } - } - } -} -Test case: ADJACENT_NESTED_MACROS -Source: [1,2,3].map(i, [1, 2, 3].map(i, i + 1)) == [1,2,3].map(j, [1, 2, 3].map(j, j + 1)) -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - LIST [3] { - elements: { - CONSTANT [4] { value: 1 } - CONSTANT [5] { value: 2 } - CONSTANT [6] { value: 3 } - } - } - COMPREHENSION [7] { - iter_var: @it:0:0 - iter_range: { - IDENT [8] { - name: @index0 - } - } - accu_var: @ac:0:0 - accu_init: { - LIST [9] { - elements: { - } - } - } - loop_condition: { - CONSTANT [10] { value: true } - } - loop_step: { - CALL [11] { - function: _+_ - args: { - IDENT [12] { - name: @ac:0:0 - } - LIST [13] { - elements: { - COMPREHENSION [14] { - iter_var: @it:1:0 - iter_range: { - IDENT [15] { - name: @index0 - } - } - accu_var: @ac:1:0 - accu_init: { - LIST [16] { - elements: { - } - } - } - loop_condition: { - CONSTANT [17] { value: true } - } - loop_step: { - CALL [18] { - function: _+_ - args: { - IDENT [19] { - name: @ac:1:0 - } - LIST [20] { - elements: { - CALL [21] { - function: _+_ - args: { - IDENT [22] { - name: @it:1:0 - } - CONSTANT [23] { value: 1 } - } - } - } - } - } - } - } - result: { - IDENT [24] { - name: @ac:1:0 - } - } - } - } - } - } - } - } - result: { - IDENT [25] { - name: @ac:0:0 - } - } - } - } - } - CALL [26] { - function: _==_ - args: { - IDENT [27] { - name: @index1 - } - IDENT [28] { - name: @index1 - } - } - } - } -} -Test case: INCLUSION_LIST -Source: 1 in [1,2,3] && 2 in [1,2,3] && 3 in [3, [1,2,3]] && 1 in [1,2,3] -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - LIST [3] { - elements: { - CONSTANT [4] { value: 1 } - CONSTANT [5] { value: 2 } - CONSTANT [6] { value: 3 } - } - } - CALL [7] { - function: @in - args: { - CONSTANT [8] { value: 1 } - IDENT [9] { - name: @index0 - } - } - } - } - } - CALL [10] { - function: _&&_ - args: { - CALL [11] { - function: _&&_ - args: { - IDENT [12] { - name: @index1 - } - CALL [13] { - function: @in - args: { - CONSTANT [14] { value: 2 } - IDENT [15] { - name: @index0 - } - } - } - } - } - CALL [16] { - function: _&&_ - args: { - CALL [17] { - function: @in - args: { - CONSTANT [18] { value: 3 } - LIST [19] { - elements: { - CONSTANT [20] { value: 3 } - IDENT [21] { - name: @index0 - } - } - } - } - } - IDENT [22] { - name: @index1 - } - } - } - } - } - } -} -Test case: INCLUSION_MAP -Source: 2 in {'a': 1, 2: {true: false}, 3: {true: false}} -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - MAP [3] { - MAP_ENTRY [4] { - key: { - CONSTANT [5] { value: true } - } - value: { - CONSTANT [6] { value: false } - } - } - } - } - } - CALL [7] { - function: @in - args: { - CONSTANT [8] { value: 2 } - MAP [9] { - MAP_ENTRY [10] { - key: { - CONSTANT [11] { value: "a" } - } - value: { - CONSTANT [12] { value: 1 } - } - } - MAP_ENTRY [13] { - key: { - CONSTANT [14] { value: 2 } - } - value: { - IDENT [15] { - name: @index0 - } - } - } - MAP_ENTRY [16] { - key: { - CONSTANT [17] { value: 3 } - } - value: { - IDENT [18] { - name: @index0 - } - } - } - } - } - } - } -} -Test case: MACRO_ITER_VAR_NOT_REFERENCED -Source: [1,2].map(i, [1, 2].map(i, [3,4])) == [[[3, 4], [3, 4]], [[3, 4], [3, 4]]] -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - LIST [3] { - elements: { - CONSTANT [4] { value: 1 } - CONSTANT [5] { value: 2 } - } - } - LIST [6] { - elements: { - CONSTANT [7] { value: 3 } - CONSTANT [8] { value: 4 } - } - } - LIST [9] { - elements: { - IDENT [10] { - name: @index1 - } - IDENT [11] { - name: @index1 - } - } - } - } - } - CALL [12] { - function: _==_ - args: { - COMPREHENSION [13] { - iter_var: @it:0:0 - iter_range: { - IDENT [14] { - name: @index0 - } - } - accu_var: @ac:0:0 - accu_init: { - LIST [15] { - elements: { - } - } - } - loop_condition: { - CONSTANT [16] { value: true } - } - loop_step: { - CALL [17] { - function: _+_ - args: { - IDENT [18] { - name: @ac:0:0 - } - LIST [19] { - elements: { - COMPREHENSION [20] { - iter_var: @it:1:0 - iter_range: { - IDENT [21] { - name: @index0 - } - } - accu_var: @ac:1:0 - accu_init: { - LIST [22] { - elements: { - } - } - } - loop_condition: { - CONSTANT [23] { value: true } - } - loop_step: { - CALL [24] { - function: _+_ - args: { - IDENT [25] { - name: @ac:1:0 - } - LIST [26] { - elements: { - IDENT [27] { - name: @index1 - } - } - } - } - } - } - result: { - IDENT [28] { - name: @ac:1:0 - } - } - } - } - } - } - } - } - result: { - IDENT [29] { - name: @ac:0:0 - } - } - } - LIST [30] { - elements: { - IDENT [31] { - name: @index2 - } - IDENT [32] { - name: @index2 - } - } - } - } - } - } -} -Test case: MACRO_SHADOWED_VARIABLE -Source: [x - 1 > 3 ? x - 1 : 5].exists(x, x - 1 > 3) || x - 1 > 3 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - CALL [3] { - function: _-_ - args: { - IDENT [4] { - name: x - } - CONSTANT [5] { value: 1 } - } - } - CALL [6] { - function: _>_ - args: { - IDENT [7] { - name: @index0 - } - CONSTANT [8] { value: 3 } - } - } - } - } - CALL [9] { - function: _||_ - args: { - COMPREHENSION [10] { - iter_var: @it:0:0 - iter_range: { - LIST [11] { - elements: { - CALL [12] { - function: _?_:_ - args: { - IDENT [13] { - name: @index1 - } - IDENT [14] { - name: @index0 - } - CONSTANT [15] { value: 5 } - } - } - } - } - } - accu_var: @ac:0:0 - accu_init: { - CONSTANT [16] { value: false } - } - loop_condition: { - CALL [17] { - function: @not_strictly_false - args: { - CALL [18] { - function: !_ - args: { - IDENT [19] { - name: @ac:0:0 - } - } - } - } - } - } - loop_step: { - CALL [20] { - function: _||_ - args: { - IDENT [21] { - name: @ac:0:0 - } - CALL [22] { - function: _>_ - args: { - CALL [23] { - function: _-_ - args: { - IDENT [24] { - name: @it:0:0 - } - CONSTANT [25] { value: 1 } - } - } - CONSTANT [26] { value: 3 } - } - } - } - } - } - result: { - IDENT [27] { - name: @ac:0:0 - } - } - } - IDENT [28] { - name: @index1 - } - } - } - } -} -Test case: MACRO_SHADOWED_VARIABLE_2 -Source: ["foo", "bar"].map(x, [x + x, x + x]).map(x, [x + x, x + x]) -=====> -COMPREHENSION [35] { - iter_var: @it:0:0 - iter_range: { - COMPREHENSION [19] { - iter_var: @it:1:0 - iter_range: { - LIST [1] { - elements: { - CONSTANT [2] { value: "foo" } - CONSTANT [3] { value: "bar" } - } - } - } - accu_var: @ac:1:0 - accu_init: { - LIST [13] { - elements: { - } - } - } - loop_condition: { - CONSTANT [14] { value: true } - } - loop_step: { - CALL [17] { - function: _+_ - args: { - IDENT [15] { - name: @ac:1:0 - } - LIST [16] { - elements: { - LIST [6] { - elements: { - CALL [8] { - function: _+_ - args: { - IDENT [7] { - name: @it:1:0 - } - IDENT [9] { - name: @it:1:0 - } - } - } - CALL [11] { - function: _+_ - args: { - IDENT [10] { - name: @it:1:0 - } - IDENT [12] { - name: @it:1:0 - } - } - } - } - } - } - } - } - } - } - result: { - IDENT [18] { - name: @ac:1:0 - } - } - } - } - accu_var: @ac:0:0 - accu_init: { - LIST [29] { - elements: { - } - } - } - loop_condition: { - CONSTANT [30] { value: true } - } - loop_step: { - CALL [33] { - function: _+_ - args: { - IDENT [31] { - name: @ac:0:0 - } - LIST [32] { - elements: { - LIST [22] { - elements: { - CALL [24] { - function: _+_ - args: { - IDENT [23] { - name: @it:0:0 - } - IDENT [25] { - name: @it:0:0 - } - } - } - CALL [27] { - function: _+_ - args: { - IDENT [26] { - name: @it:0:0 - } - IDENT [28] { - name: @it:0:0 - } - } - } - } - } - } - } - } - } - } - result: { - IDENT [34] { - name: @ac:0:0 - } - } -} -Test case: PRESENCE_TEST -Source: has({'a': true}.a) && {'a':true}['a'] -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - MAP [3] { - MAP_ENTRY [4] { - key: { - CONSTANT [5] { value: "a" } - } - value: { - CONSTANT [6] { value: true } - } - } - } - } - } - CALL [7] { - function: _&&_ - args: { - SELECT [8] { - IDENT [9] { - name: @index0 - }.a~presence_test - } - CALL [10] { - function: _[_] - args: { - IDENT [11] { - name: @index0 - } - CONSTANT [12] { value: "a" } - } - } - } - } - } -} -Test case: PRESENCE_TEST_2 -Source: has({'a': true}.a) && has({'a': true}.a) -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - SELECT [3] { - MAP [4] { - MAP_ENTRY [5] { - key: { - CONSTANT [6] { value: "a" } - } - value: { - CONSTANT [7] { value: true } - } - } - }.a~presence_test - } - } - } - CALL [8] { - function: _&&_ - args: { - IDENT [9] { - name: @index0 - } - IDENT [10] { - name: @index0 - } - } - } - } -} -Test case: PRESENCE_TEST_WITH_TERNARY -Source: (has(msg.oneof_type.payload) ? msg.oneof_type.payload.single_int64 : 0) == 10 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - SELECT [3] { - IDENT [4] { - name: msg - }.oneof_type - } - } - } - CALL [5] { - function: _==_ - args: { - CALL [6] { - function: _?_:_ - args: { - SELECT [7] { - IDENT [8] { - name: @index0 - }.payload~presence_test - } - SELECT [9] { - SELECT [10] { - IDENT [11] { - name: @index0 - }.payload - }.single_int64 - } - CONSTANT [12] { value: 0 } - } - } - CONSTANT [13] { value: 10 } - } - } - } -} -Test case: PRESENCE_TEST_WITH_TERNARY_2 -Source: (has(msg.oneof_type.payload) ? msg.oneof_type.payload.single_int64 : msg.oneof_type.payload.single_int64 * 0) == 10 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - SELECT [3] { - IDENT [4] { - name: msg - }.oneof_type - } - SELECT [5] { - SELECT [6] { - IDENT [7] { - name: @index0 - }.payload - }.single_int64 - } - } - } - CALL [8] { - function: _==_ - args: { - CALL [9] { - function: _?_:_ - args: { - SELECT [10] { - IDENT [11] { - name: @index0 - }.payload~presence_test - } - IDENT [12] { - name: @index1 - } - CALL [13] { - function: _*_ - args: { - IDENT [14] { - name: @index1 - } - CONSTANT [15] { value: 0 } - } - } - } - } - CONSTANT [16] { value: 10 } - } - } - } -} -Test case: PRESENCE_TEST_WITH_TERNARY_3 -Source: (has(msg.oneof_type.payload.single_int64) ? msg.oneof_type.payload.single_int64 : msg.oneof_type.payload.single_int64 * 0) == 10 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - SELECT [3] { - SELECT [4] { - IDENT [5] { - name: msg - }.oneof_type - }.payload - } - SELECT [6] { - IDENT [7] { - name: @index0 - }.single_int64 - } - } - } - CALL [8] { - function: _==_ - args: { - CALL [9] { - function: _?_:_ - args: { - SELECT [10] { - IDENT [11] { - name: @index0 - }.single_int64~presence_test - } - IDENT [12] { - name: @index1 - } - CALL [13] { - function: _*_ - args: { - IDENT [14] { - name: @index1 - } - CONSTANT [15] { value: 0 } - } - } - } - } - CONSTANT [16] { value: 10 } - } - } - } -} -Test case: PRESENCE_TEST_WITH_TERNARY_NESTED -Source: (has(msg.oneof_type) && has(msg.oneof_type.payload) && has(msg.oneof_type.payload.single_int64)) ? ((has(msg.oneof_type.payload.map_string_string) && has(msg.oneof_type.payload.map_string_string.key)) ? msg.oneof_type.payload.map_string_string.key == 'A' : false) : false -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - SELECT [3] { - IDENT [4] { - name: msg - }.oneof_type - } - SELECT [5] { - IDENT [6] { - name: @index0 - }.payload - } - SELECT [7] { - IDENT [8] { - name: @index1 - }.map_string_string - } - } - } - CALL [9] { - function: _?_:_ - args: { - CALL [10] { - function: _&&_ - args: { - CALL [11] { - function: _&&_ - args: { - SELECT [12] { - IDENT [13] { - name: msg - }.oneof_type~presence_test - } - SELECT [14] { - IDENT [15] { - name: @index0 - }.payload~presence_test - } - } - } - SELECT [16] { - IDENT [17] { - name: @index1 - }.single_int64~presence_test - } - } - } - CALL [18] { - function: _?_:_ - args: { - CALL [19] { - function: _&&_ - args: { - SELECT [20] { - IDENT [21] { - name: @index1 - }.map_string_string~presence_test - } - SELECT [22] { - IDENT [23] { - name: @index2 - }.key~presence_test - } - } - } - CALL [24] { - function: _==_ - args: { - SELECT [25] { - IDENT [26] { - name: @index2 - }.key - } - CONSTANT [27] { value: "A" } - } - } - CONSTANT [28] { value: false } - } - } - CONSTANT [29] { value: false } - } - } - } -} -Test case: OPTIONAL_LIST -Source: [10, ?optional.none(), [?optional.none(), ?opt_x], [?optional.none(), ?opt_x]] == [10, [5], [5]] -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - CALL [3] { - function: optional.none - args: { - } - } - LIST [4] { - elements: { - IDENT [5] { - name: @index0 - } - IDENT [6] { - name: opt_x - } - } - optional_indices: [0, 1] - } - LIST [7] { - elements: { - CONSTANT [8] { value: 5 } - } - } - } - } - CALL [9] { - function: _==_ - args: { - LIST [10] { - elements: { - CONSTANT [11] { value: 10 } - IDENT [12] { - name: @index0 - } - IDENT [13] { - name: @index1 - } - IDENT [14] { - name: @index1 - } - } - optional_indices: [0] - } - LIST [15] { - elements: { - CONSTANT [16] { value: 10 } - IDENT [17] { - name: @index2 - } - IDENT [18] { - name: @index2 - } - } - } - } - } - } -} -Test case: OPTIONAL_MAP -Source: {?'hello': optional.of('hello')}['hello'] + {?'hello': optional.of('hello')}['hello'] == 'hellohello' -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - CALL [3] { - function: _[_] - args: { - MAP [4] { - MAP_ENTRY [5] { - key: { - CONSTANT [6] { value: "hello" } - } - optional_entry: true - value: { - CALL [7] { - function: optional.of - args: { - CONSTANT [8] { value: "hello" } - } - } - } - } - } - CONSTANT [9] { value: "hello" } - } - } - } - } - CALL [10] { - function: _==_ - args: { - CALL [11] { - function: _+_ - args: { - IDENT [12] { - name: @index0 - } - IDENT [13] { - name: @index0 - } - } - } - CONSTANT [14] { value: "hellohello" } - } - } - } -} -Test case: OPTIONAL_MAP_CHAINED -Source: {?'key': optional.of('test')}[?'bogus'].or({'key': 'test'}[?'bogus']).orValue({'key': 'test'}['key']) == 'test' -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - MAP [3] { - MAP_ENTRY [4] { - key: { - CONSTANT [5] { value: "key" } - } - value: { - CONSTANT [6] { value: "test" } - } - } - } - } - } - CALL [7] { - function: _==_ - args: { - CALL [8] { - function: orValue - target: { - CALL [9] { - function: or - target: { - CALL [10] { - function: _[?_] - args: { - MAP [11] { - MAP_ENTRY [12] { - key: { - CONSTANT [13] { value: "key" } - } - optional_entry: true - value: { - CALL [14] { - function: optional.of - args: { - CONSTANT [15] { value: "test" } - } - } - } - } - } - CONSTANT [16] { value: "bogus" } - } - } - } - args: { - CALL [17] { - function: _[?_] - args: { - IDENT [18] { - name: @index0 - } - CONSTANT [19] { value: "bogus" } - } - } - } - } - } - args: { - CALL [20] { - function: _[_] - args: { - IDENT [21] { - name: @index0 - } - CONSTANT [22] { value: "key" } - } - } - } - } - CONSTANT [23] { value: "test" } - } - } - } -} -Test case: OPTIONAL_MESSAGE -Source: TestAllTypes{?single_int64: optional.ofNonZeroValue(1), ?single_int32: optional.of(4)}.single_int32 + TestAllTypes{?single_int64: optional.ofNonZeroValue(1), ?single_int32: optional.of(4)}.single_int64 == 5 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - STRUCT [3] { - name: TestAllTypes - entries: { - ENTRY [4] { - field_key: single_int64 - optional_entry: true - value: { - CALL [5] { - function: optional.ofNonZeroValue - args: { - CONSTANT [6] { value: 1 } - } - } - } - } - ENTRY [7] { - field_key: single_int32 - optional_entry: true - value: { - CALL [8] { - function: optional.of - args: { - CONSTANT [9] { value: 4 } - } - } - } - } - } - } - } - } - CALL [10] { - function: _==_ - args: { - CALL [11] { - function: _+_ - args: { - SELECT [12] { - IDENT [13] { - name: @index0 - }.single_int32 - } - SELECT [14] { - IDENT [15] { - name: @index0 - }.single_int64 - } - } - } - CONSTANT [16] { value: 5 } - } - } - } -} -Test case: CALL -Source: ('h' + 'e' + 'l' + 'l' + 'o' + ' world').matches('h' + 'e' + 'l' + 'l' + 'o') -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - CALL [3] { - function: _+_ - args: { - CALL [4] { - function: _+_ - args: { - CALL [5] { - function: _+_ - args: { - CALL [6] { - function: _+_ - args: { - CONSTANT [7] { value: "h" } - CONSTANT [8] { value: "e" } - } - } - CONSTANT [9] { value: "l" } - } - } - CONSTANT [10] { value: "l" } - } - } - CONSTANT [11] { value: "o" } - } - } - } - } - CALL [12] { - function: matches - target: { - CALL [13] { - function: _+_ - args: { - IDENT [14] { - name: @index0 - } - CONSTANT [15] { value: " world" } - } - } - } - args: { - IDENT [16] { - name: @index0 - } - } - } - } -} -Test case: CALL_ARGUMENT_NESTED_NO_COMMON_SUBEXPR -Source: 'hello world'.matches('h' + 'e' + 'l' + 'l' + 'o') -=====> -CALL [2] { - function: matches - target: { - CONSTANT [1] { value: "hello world" } - } - args: { - CALL [10] { - function: _+_ - args: { - CALL [8] { - function: _+_ - args: { - CALL [6] { - function: _+_ - args: { - CALL [4] { - function: _+_ - args: { - CONSTANT [3] { value: "h" } - CONSTANT [5] { value: "e" } - } - } - CONSTANT [7] { value: "l" } - } - } - CONSTANT [9] { value: "l" } - } - } - CONSTANT [11] { value: "o" } - } - } - } -} -Test case: CALL_TARGET_NESTED_NO_COMMON_SUBEXPR -Source: ('h' + 'e' + 'l' + 'l' + 'o' + ' world').matches('hello') -=====> -CALL [12] { - function: matches - target: { - CALL [10] { - function: _+_ - args: { - CALL [8] { - function: _+_ - args: { - CALL [6] { - function: _+_ - args: { - CALL [4] { - function: _+_ - args: { - CALL [2] { - function: _+_ - args: { - CONSTANT [1] { value: "h" } - CONSTANT [3] { value: "e" } - } - } - CONSTANT [5] { value: "l" } - } - } - CONSTANT [7] { value: "l" } - } - } - CONSTANT [9] { value: "o" } - } - } - CONSTANT [11] { value: " world" } - } - } - } - args: { - CONSTANT [13] { value: "hello" } - } -} -Test case: CALL_BOTH_ARGUMENT_TARGET_NESTED_NO_COMMON_SUBEXPR -Source: ('h' + 'e' + 'l' + 'l' + 'o' + ' world').matches('w' + 'o' + 'r' + 'l' + 'd') -=====> -CALL [12] { - function: matches - target: { - CALL [10] { - function: _+_ - args: { - CALL [8] { - function: _+_ - args: { - CALL [6] { - function: _+_ - args: { - CALL [4] { - function: _+_ - args: { - CALL [2] { - function: _+_ - args: { - CONSTANT [1] { value: "h" } - CONSTANT [3] { value: "e" } - } - } - CONSTANT [5] { value: "l" } - } - } - CONSTANT [7] { value: "l" } - } - } - CONSTANT [9] { value: "o" } - } - } - CONSTANT [11] { value: " world" } - } - } - } - args: { - CALL [20] { - function: _+_ - args: { - CALL [18] { - function: _+_ - args: { - CALL [16] { - function: _+_ - args: { - CALL [14] { - function: _+_ - args: { - CONSTANT [13] { value: "w" } - CONSTANT [15] { value: "o" } - } - } - CONSTANT [17] { value: "r" } - } - } - CONSTANT [19] { value: "l" } - } - } - CONSTANT [21] { value: "d" } - } - } - } -} -Test case: CUSTOM_FUNCTION_INELIMINABLE -Source: non_pure_custom_func(msg.oneof_type.payload.single_int64) + non_pure_custom_func(msg.oneof_type.payload.single_int32) + non_pure_custom_func(msg.oneof_type.payload.single_int64) + non_pure_custom_func(msg.single_int64) -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - SELECT [3] { - SELECT [4] { - IDENT [5] { - name: msg - }.oneof_type - }.payload - } - SELECT [6] { - IDENT [7] { - name: @index0 - }.single_int64 - } - } - } - CALL [8] { - function: _+_ - args: { - CALL [9] { - function: _+_ - args: { - CALL [10] { - function: _+_ - args: { - CALL [11] { - function: non_pure_custom_func - args: { - IDENT [12] { - name: @index1 - } - } - } - CALL [13] { - function: non_pure_custom_func - args: { - SELECT [14] { - IDENT [15] { - name: @index0 - }.single_int32 - } - } - } - } - } - CALL [16] { - function: non_pure_custom_func - args: { - IDENT [17] { - name: @index1 - } - } - } - } - } - CALL [18] { - function: non_pure_custom_func - args: { - SELECT [19] { - IDENT [20] { - name: msg - }.single_int64 - } - } - } - } - } - } -} -Test case: CUSTOM_FUNCTION_ELIMINABLE -Source: pure_custom_func(msg.oneof_type.payload.single_int64) + pure_custom_func(msg.oneof_type.payload.single_int32) + pure_custom_func(msg.oneof_type.payload.single_int64) + pure_custom_func(msg.single_int64) -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - SELECT [3] { - SELECT [4] { - IDENT [5] { - name: msg - }.oneof_type - }.payload - } - CALL [6] { - function: pure_custom_func - args: { - SELECT [7] { - IDENT [8] { - name: @index0 - }.single_int64 - } - } - } - } - } - CALL [9] { - function: _+_ - args: { - CALL [10] { - function: _+_ - args: { - CALL [11] { - function: _+_ - args: { - IDENT [12] { - name: @index1 - } - CALL [13] { - function: pure_custom_func - args: { - SELECT [14] { - IDENT [15] { - name: @index0 - }.single_int32 - } - } - } - } - } - IDENT [16] { - name: @index1 - } - } - } - CALL [17] { - function: pure_custom_func - args: { - SELECT [18] { - IDENT [19] { - name: msg - }.single_int64 - } - } - } - } - } - } -} \ No newline at end of file diff --git a/optimizer/src/test/resources/subexpression_ast_block_recursion_depth_1.baseline b/optimizer/src/test/resources/subexpression_ast_block_recursion_depth_1.baseline deleted file mode 100644 index 1b3146069..000000000 --- a/optimizer/src/test/resources/subexpression_ast_block_recursion_depth_1.baseline +++ /dev/null @@ -1,6108 +0,0 @@ -Test case: SIZE_1 -Source: size([1,2]) + size([1,2]) + 1 == 5 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - LIST [3] { - elements: { - CONSTANT [4] { value: 1 } - CONSTANT [5] { value: 2 } - } - } - CALL [6] { - function: size - args: { - IDENT [7] { - name: @index0 - } - } - } - CALL [8] { - function: _+_ - args: { - IDENT [9] { - name: @index1 - } - IDENT [10] { - name: @index1 - } - } - } - CALL [11] { - function: _+_ - args: { - IDENT [12] { - name: @index2 - } - CONSTANT [13] { value: 1 } - } - } - } - } - CALL [14] { - function: _==_ - args: { - IDENT [15] { - name: @index3 - } - CONSTANT [16] { value: 5 } - } - } - } -} -Test case: SIZE_2 -Source: 2 + size([1,2]) + size([1,2]) + 1 == 7 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - LIST [3] { - elements: { - CONSTANT [4] { value: 1 } - CONSTANT [5] { value: 2 } - } - } - CALL [6] { - function: size - args: { - IDENT [7] { - name: @index0 - } - } - } - CALL [8] { - function: _+_ - args: { - CONSTANT [9] { value: 2 } - IDENT [10] { - name: @index1 - } - } - } - CALL [11] { - function: _+_ - args: { - IDENT [12] { - name: @index2 - } - IDENT [13] { - name: @index1 - } - } - } - CALL [14] { - function: _+_ - args: { - IDENT [15] { - name: @index3 - } - CONSTANT [16] { value: 1 } - } - } - } - } - CALL [17] { - function: _==_ - args: { - IDENT [18] { - name: @index4 - } - CONSTANT [19] { value: 7 } - } - } - } -} -Test case: SIZE_3 -Source: size([0]) + size([0]) + size([1,2]) + size([1,2]) == 6 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - LIST [3] { - elements: { - CONSTANT [4] { value: 0 } - } - } - CALL [5] { - function: size - args: { - IDENT [6] { - name: @index0 - } - } - } - LIST [7] { - elements: { - CONSTANT [8] { value: 1 } - CONSTANT [9] { value: 2 } - } - } - CALL [10] { - function: size - args: { - IDENT [11] { - name: @index2 - } - } - } - CALL [12] { - function: _+_ - args: { - IDENT [13] { - name: @index1 - } - IDENT [14] { - name: @index1 - } - } - } - CALL [15] { - function: _+_ - args: { - IDENT [16] { - name: @index4 - } - IDENT [17] { - name: @index3 - } - } - } - CALL [18] { - function: _+_ - args: { - IDENT [19] { - name: @index5 - } - IDENT [20] { - name: @index3 - } - } - } - } - } - CALL [21] { - function: _==_ - args: { - IDENT [22] { - name: @index6 - } - CONSTANT [23] { value: 6 } - } - } - } -} -Test case: SIZE_4 -Source: 5 + size([0]) + size([0]) + size([1,2]) + size([1,2]) + size([1,2,3]) + size([1,2,3]) == 17 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - LIST [3] { - elements: { - CONSTANT [4] { value: 0 } - } - } - CALL [5] { - function: size - args: { - IDENT [6] { - name: @index0 - } - } - } - LIST [7] { - elements: { - CONSTANT [8] { value: 1 } - CONSTANT [9] { value: 2 } - } - } - CALL [10] { - function: size - args: { - IDENT [11] { - name: @index2 - } - } - } - LIST [12] { - elements: { - CONSTANT [13] { value: 1 } - CONSTANT [14] { value: 2 } - CONSTANT [15] { value: 3 } - } - } - CALL [16] { - function: size - args: { - IDENT [17] { - name: @index4 - } - } - } - CALL [18] { - function: _+_ - args: { - CONSTANT [19] { value: 5 } - IDENT [20] { - name: @index1 - } - } - } - CALL [21] { - function: _+_ - args: { - IDENT [22] { - name: @index6 - } - IDENT [23] { - name: @index1 - } - } - } - CALL [24] { - function: _+_ - args: { - IDENT [25] { - name: @index7 - } - IDENT [26] { - name: @index3 - } - } - } - CALL [27] { - function: _+_ - args: { - IDENT [28] { - name: @index8 - } - IDENT [29] { - name: @index3 - } - } - } - CALL [30] { - function: _+_ - args: { - IDENT [31] { - name: @index9 - } - IDENT [32] { - name: @index5 - } - } - } - CALL [33] { - function: _+_ - args: { - IDENT [34] { - name: @index10 - } - IDENT [35] { - name: @index5 - } - } - } - } - } - CALL [36] { - function: _==_ - args: { - IDENT [37] { - name: @index11 - } - CONSTANT [38] { value: 17 } - } - } - } -} -Test case: TIMESTAMP -Source: timestamp(int(timestamp(1000000000))).getFullYear() + timestamp(int(timestamp(75))).getFullYear() + timestamp(int(timestamp(50))).getFullYear() + timestamp(int(timestamp(1000000000))).getFullYear() + timestamp(int(timestamp(50))).getSeconds() + timestamp(int(timestamp(200))).getFullYear() + timestamp(int(timestamp(200))).getFullYear() + timestamp(int(timestamp(75))).getMinutes() + timestamp(int(timestamp(1000000000))).getFullYear() == 13934 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - CALL [3] { - function: timestamp - args: { - CONSTANT [4] { value: 1000000000 } - } - } - CALL [5] { - function: int - args: { - IDENT [6] { - name: @index0 - } - } - } - CALL [7] { - function: timestamp - args: { - IDENT [8] { - name: @index1 - } - } - } - CALL [9] { - function: getFullYear - target: { - IDENT [10] { - name: @index2 - } - } - args: { - } - } - CALL [11] { - function: timestamp - args: { - CONSTANT [12] { value: 50 } - } - } - CALL [13] { - function: int - args: { - IDENT [14] { - name: @index4 - } - } - } - CALL [15] { - function: timestamp - args: { - IDENT [16] { - name: @index5 - } - } - } - CALL [17] { - function: timestamp - args: { - CONSTANT [18] { value: 200 } - } - } - CALL [19] { - function: int - args: { - IDENT [20] { - name: @index7 - } - } - } - CALL [21] { - function: timestamp - args: { - IDENT [22] { - name: @index8 - } - } - } - CALL [23] { - function: getFullYear - target: { - IDENT [24] { - name: @index9 - } - } - args: { - } - } - CALL [25] { - function: timestamp - args: { - CONSTANT [26] { value: 75 } - } - } - CALL [27] { - function: int - args: { - IDENT [28] { - name: @index11 - } - } - } - CALL [29] { - function: timestamp - args: { - IDENT [30] { - name: @index12 - } - } - } - CALL [31] { - function: getFullYear - target: { - IDENT [32] { - name: @index13 - } - } - args: { - } - } - CALL [33] { - function: _+_ - args: { - IDENT [34] { - name: @index3 - } - IDENT [35] { - name: @index14 - } - } - } - CALL [36] { - function: getFullYear - target: { - IDENT [37] { - name: @index6 - } - } - args: { - } - } - CALL [38] { - function: _+_ - args: { - IDENT [39] { - name: @index15 - } - IDENT [40] { - name: @index16 - } - } - } - CALL [41] { - function: _+_ - args: { - IDENT [42] { - name: @index17 - } - IDENT [43] { - name: @index3 - } - } - } - CALL [44] { - function: getSeconds - target: { - IDENT [45] { - name: @index6 - } - } - args: { - } - } - CALL [46] { - function: _+_ - args: { - IDENT [47] { - name: @index18 - } - IDENT [48] { - name: @index19 - } - } - } - CALL [49] { - function: _+_ - args: { - IDENT [50] { - name: @index20 - } - IDENT [51] { - name: @index10 - } - } - } - CALL [52] { - function: _+_ - args: { - IDENT [53] { - name: @index21 - } - IDENT [54] { - name: @index10 - } - } - } - CALL [55] { - function: getMinutes - target: { - IDENT [56] { - name: @index13 - } - } - args: { - } - } - CALL [57] { - function: _+_ - args: { - IDENT [58] { - name: @index22 - } - IDENT [59] { - name: @index23 - } - } - } - CALL [60] { - function: _+_ - args: { - IDENT [61] { - name: @index24 - } - IDENT [62] { - name: @index3 - } - } - } - } - } - CALL [63] { - function: _==_ - args: { - IDENT [64] { - name: @index25 - } - CONSTANT [65] { value: 13934 } - } - } - } -} -Test case: MAP_INDEX -Source: {"a": 2}["a"] + {"a": 2}["a"] * {"a": 2}["a"] == 6 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - MAP [3] { - MAP_ENTRY [4] { - key: { - CONSTANT [5] { value: "a" } - } - value: { - CONSTANT [6] { value: 2 } - } - } - } - CALL [7] { - function: _[_] - args: { - IDENT [8] { - name: @index0 - } - CONSTANT [9] { value: "a" } - } - } - CALL [10] { - function: _*_ - args: { - IDENT [11] { - name: @index1 - } - IDENT [12] { - name: @index1 - } - } - } - CALL [13] { - function: _+_ - args: { - IDENT [14] { - name: @index1 - } - IDENT [15] { - name: @index2 - } - } - } - } - } - CALL [16] { - function: _==_ - args: { - IDENT [17] { - name: @index3 - } - CONSTANT [18] { value: 6 } - } - } - } -} -Test case: NESTED_MAP_CONSTRUCTION -Source: {'a': {'b': 1}, 'c': {'b': 1}, 'd': {'e': {'b': 1}}, 'e': {'e': {'b': 1}}} -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - MAP [3] { - MAP_ENTRY [4] { - key: { - CONSTANT [5] { value: "b" } - } - value: { - CONSTANT [6] { value: 1 } - } - } - } - MAP [7] { - MAP_ENTRY [8] { - key: { - CONSTANT [9] { value: "e" } - } - value: { - IDENT [10] { - name: @index0 - } - } - } - } - } - } - MAP [11] { - MAP_ENTRY [12] { - key: { - CONSTANT [13] { value: "a" } - } - value: { - IDENT [14] { - name: @index0 - } - } - } - MAP_ENTRY [15] { - key: { - CONSTANT [16] { value: "c" } - } - value: { - IDENT [17] { - name: @index0 - } - } - } - MAP_ENTRY [18] { - key: { - CONSTANT [19] { value: "d" } - } - value: { - IDENT [20] { - name: @index1 - } - } - } - MAP_ENTRY [21] { - key: { - CONSTANT [22] { value: "e" } - } - value: { - IDENT [23] { - name: @index1 - } - } - } - } - } -} -Test case: NESTED_LIST_CONSTRUCTION -Source: [1, [1,2,3,4], 2, [1,2,3,4], 5, [1,2,3,4], 7, [[1,2], [1,2,3,4]], [1,2]] -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - LIST [3] { - elements: { - CONSTANT [4] { value: 1 } - CONSTANT [5] { value: 2 } - CONSTANT [6] { value: 3 } - CONSTANT [7] { value: 4 } - } - } - LIST [8] { - elements: { - CONSTANT [9] { value: 1 } - CONSTANT [10] { value: 2 } - } - } - LIST [11] { - elements: { - IDENT [12] { - name: @index1 - } - IDENT [13] { - name: @index0 - } - } - } - } - } - LIST [14] { - elements: { - CONSTANT [15] { value: 1 } - IDENT [16] { - name: @index0 - } - CONSTANT [17] { value: 2 } - IDENT [18] { - name: @index0 - } - CONSTANT [19] { value: 5 } - IDENT [20] { - name: @index0 - } - CONSTANT [21] { value: 7 } - IDENT [22] { - name: @index2 - } - IDENT [23] { - name: @index1 - } - } - } - } -} -Test case: SELECT -Source: msg.single_int64 + msg.single_int64 == 6 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - SELECT [3] { - IDENT [4] { - name: msg - }.single_int64 - } - CALL [5] { - function: _+_ - args: { - IDENT [6] { - name: @index0 - } - IDENT [7] { - name: @index0 - } - } - } - } - } - CALL [8] { - function: _==_ - args: { - IDENT [9] { - name: @index1 - } - CONSTANT [10] { value: 6 } - } - } - } -} -Test case: SELECT_NESTED_1 -Source: msg.oneof_type.payload.single_int64 + msg.oneof_type.payload.single_int32 + msg.oneof_type.payload.single_int64 + msg.single_int64 + msg.oneof_type.payload.oneof_type.payload.single_int64 == 31 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - SELECT [3] { - IDENT [4] { - name: msg - }.oneof_type - } - SELECT [5] { - IDENT [6] { - name: @index0 - }.payload - } - SELECT [7] { - IDENT [8] { - name: @index1 - }.single_int64 - } - SELECT [9] { - IDENT [10] { - name: @index1 - }.single_int32 - } - CALL [11] { - function: _+_ - args: { - IDENT [12] { - name: @index2 - } - IDENT [13] { - name: @index3 - } - } - } - CALL [14] { - function: _+_ - args: { - IDENT [15] { - name: @index4 - } - IDENT [16] { - name: @index2 - } - } - } - SELECT [17] { - IDENT [18] { - name: msg - }.single_int64 - } - CALL [19] { - function: _+_ - args: { - IDENT [20] { - name: @index5 - } - IDENT [21] { - name: @index6 - } - } - } - SELECT [22] { - IDENT [23] { - name: @index1 - }.oneof_type - } - SELECT [24] { - IDENT [25] { - name: @index8 - }.payload - } - SELECT [26] { - IDENT [27] { - name: @index9 - }.single_int64 - } - CALL [28] { - function: _+_ - args: { - IDENT [29] { - name: @index7 - } - IDENT [30] { - name: @index10 - } - } - } - } - } - CALL [31] { - function: _==_ - args: { - IDENT [32] { - name: @index11 - } - CONSTANT [33] { value: 31 } - } - } - } -} -Test case: SELECT_NESTED_2 -Source: true || msg.oneof_type.payload.oneof_type.payload.oneof_type.payload.oneof_type.payload.single_bool || msg.oneof_type.payload.oneof_type.payload.oneof_type.child.child.payload.single_bool -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - SELECT [3] { - IDENT [4] { - name: msg - }.oneof_type - } - SELECT [5] { - IDENT [6] { - name: @index0 - }.payload - } - SELECT [7] { - IDENT [8] { - name: @index1 - }.oneof_type - } - SELECT [9] { - IDENT [10] { - name: @index2 - }.payload - } - SELECT [11] { - IDENT [12] { - name: @index3 - }.oneof_type - } - SELECT [13] { - IDENT [14] { - name: @index4 - }.payload - } - SELECT [15] { - IDENT [16] { - name: @index5 - }.oneof_type - } - SELECT [17] { - IDENT [18] { - name: @index6 - }.payload - } - SELECT [19] { - IDENT [20] { - name: @index7 - }.single_bool - } - CALL [21] { - function: _||_ - args: { - CONSTANT [22] { value: true } - IDENT [23] { - name: @index8 - } - } - } - SELECT [24] { - IDENT [25] { - name: @index4 - }.child - } - SELECT [26] { - IDENT [27] { - name: @index10 - }.child - } - SELECT [28] { - IDENT [29] { - name: @index11 - }.payload - } - SELECT [30] { - IDENT [31] { - name: @index12 - }.single_bool - } - } - } - CALL [32] { - function: _||_ - args: { - IDENT [33] { - name: @index9 - } - IDENT [34] { - name: @index13 - } - } - } - } -} -Test case: SELECT_NESTED_MESSAGE_MAP_INDEX_1 -Source: msg.oneof_type.payload.map_int32_int64[1] + msg.oneof_type.payload.map_int32_int64[1] + msg.oneof_type.payload.map_int32_int64[1] == 15 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - SELECT [3] { - IDENT [4] { - name: msg - }.oneof_type - } - SELECT [5] { - IDENT [6] { - name: @index0 - }.payload - } - SELECT [7] { - IDENT [8] { - name: @index1 - }.map_int32_int64 - } - CALL [9] { - function: _[_] - args: { - IDENT [10] { - name: @index2 - } - CONSTANT [11] { value: 1 } - } - } - CALL [12] { - function: _+_ - args: { - IDENT [13] { - name: @index3 - } - IDENT [14] { - name: @index3 - } - } - } - CALL [15] { - function: _+_ - args: { - IDENT [16] { - name: @index4 - } - IDENT [17] { - name: @index3 - } - } - } - } - } - CALL [18] { - function: _==_ - args: { - IDENT [19] { - name: @index5 - } - CONSTANT [20] { value: 15 } - } - } - } -} -Test case: SELECT_NESTED_MESSAGE_MAP_INDEX_2 -Source: msg.oneof_type.payload.map_int32_int64[0] + msg.oneof_type.payload.map_int32_int64[1] + msg.oneof_type.payload.map_int32_int64[2] == 8 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - SELECT [3] { - IDENT [4] { - name: msg - }.oneof_type - } - SELECT [5] { - IDENT [6] { - name: @index0 - }.payload - } - SELECT [7] { - IDENT [8] { - name: @index1 - }.map_int32_int64 - } - CALL [9] { - function: _[_] - args: { - IDENT [10] { - name: @index2 - } - CONSTANT [11] { value: 0 } - } - } - CALL [12] { - function: _[_] - args: { - IDENT [13] { - name: @index2 - } - CONSTANT [14] { value: 1 } - } - } - CALL [15] { - function: _+_ - args: { - IDENT [16] { - name: @index3 - } - IDENT [17] { - name: @index4 - } - } - } - CALL [18] { - function: _[_] - args: { - IDENT [19] { - name: @index2 - } - CONSTANT [20] { value: 2 } - } - } - CALL [21] { - function: _+_ - args: { - IDENT [22] { - name: @index5 - } - IDENT [23] { - name: @index6 - } - } - } - } - } - CALL [24] { - function: _==_ - args: { - IDENT [25] { - name: @index7 - } - CONSTANT [26] { value: 8 } - } - } - } -} -Test case: SELECT_NESTED_NO_COMMON_SUBEXPR -Source: msg.oneof_type.payload.oneof_type.payload.oneof_type.payload.oneof_type.payload.single_int64 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - SELECT [3] { - IDENT [4] { - name: msg - }.oneof_type - } - SELECT [5] { - IDENT [6] { - name: @index0 - }.payload - } - SELECT [7] { - IDENT [8] { - name: @index1 - }.oneof_type - } - SELECT [9] { - IDENT [10] { - name: @index2 - }.payload - } - SELECT [11] { - IDENT [12] { - name: @index3 - }.oneof_type - } - SELECT [13] { - IDENT [14] { - name: @index4 - }.payload - } - SELECT [15] { - IDENT [16] { - name: @index5 - }.oneof_type - } - SELECT [17] { - IDENT [18] { - name: @index6 - }.payload - } - } - } - SELECT [19] { - IDENT [20] { - name: @index7 - }.single_int64 - } - } -} -Test case: TERNARY -Source: (msg.single_int64 > 0 ? msg.single_int64 : 0) == 3 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - SELECT [3] { - IDENT [4] { - name: msg - }.single_int64 - } - CALL [5] { - function: _>_ - args: { - IDENT [6] { - name: @index0 - } - CONSTANT [7] { value: 0 } - } - } - CALL [8] { - function: _?_:_ - args: { - IDENT [9] { - name: @index1 - } - IDENT [10] { - name: @index0 - } - CONSTANT [11] { value: 0 } - } - } - } - } - CALL [12] { - function: _==_ - args: { - IDENT [13] { - name: @index2 - } - CONSTANT [14] { value: 3 } - } - } - } -} -Test case: TERNARY_BIND_RHS_ONLY -Source: false ? false : (msg.single_int64) + ((msg.single_int64 + 1) * 2) == 11 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - SELECT [3] { - IDENT [4] { - name: msg - }.single_int64 - } - CALL [5] { - function: _+_ - args: { - IDENT [6] { - name: @index0 - } - CONSTANT [7] { value: 1 } - } - } - CALL [8] { - function: _*_ - args: { - IDENT [9] { - name: @index1 - } - CONSTANT [10] { value: 2 } - } - } - CALL [11] { - function: _+_ - args: { - IDENT [12] { - name: @index0 - } - IDENT [13] { - name: @index2 - } - } - } - CALL [14] { - function: _==_ - args: { - IDENT [15] { - name: @index3 - } - CONSTANT [16] { value: 11 } - } - } - } - } - CALL [17] { - function: _?_:_ - args: { - CONSTANT [18] { value: false } - CONSTANT [19] { value: false } - IDENT [20] { - name: @index4 - } - } - } - } -} -Test case: NESTED_TERNARY -Source: (msg.single_int64 > 0 ? (msg.single_int32 > 0 ? msg.single_int64 + msg.single_int32 : 0) : 0) == 8 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - SELECT [3] { - IDENT [4] { - name: msg - }.single_int64 - } - SELECT [5] { - IDENT [6] { - name: msg - }.single_int32 - } - CALL [7] { - function: _>_ - args: { - IDENT [8] { - name: @index0 - } - CONSTANT [9] { value: 0 } - } - } - CALL [10] { - function: _>_ - args: { - IDENT [11] { - name: @index1 - } - CONSTANT [12] { value: 0 } - } - } - CALL [13] { - function: _+_ - args: { - IDENT [14] { - name: @index0 - } - IDENT [15] { - name: @index1 - } - } - } - CALL [16] { - function: _?_:_ - args: { - IDENT [17] { - name: @index3 - } - IDENT [18] { - name: @index4 - } - CONSTANT [19] { value: 0 } - } - } - CALL [20] { - function: _?_:_ - args: { - IDENT [21] { - name: @index2 - } - IDENT [22] { - name: @index5 - } - CONSTANT [23] { value: 0 } - } - } - } - } - CALL [24] { - function: _==_ - args: { - IDENT [25] { - name: @index6 - } - CONSTANT [26] { value: 8 } - } - } - } -} -Test case: MULTIPLE_MACROS_1 -Source: size([[1].exists(i, i > 0)]) + size([[1].exists(j, j > 0)]) + size([[2].exists(k, k > 1)]) + size([[2].exists(l, l > 1)]) == 4 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - LIST [3] { - elements: { - CONSTANT [4] { value: 1 } - } - } - LIST [5] { - elements: { - CONSTANT [6] { value: 2 } - } - } - } - } - CALL [7] { - function: _==_ - args: { - CALL [8] { - function: _+_ - args: { - CALL [9] { - function: _+_ - args: { - CALL [10] { - function: _+_ - args: { - CALL [11] { - function: size - args: { - LIST [12] { - elements: { - COMPREHENSION [13] { - iter_var: @it:0:0 - iter_range: { - IDENT [14] { - name: @index0 - } - } - accu_var: @ac:0:0 - accu_init: { - CONSTANT [15] { value: false } - } - loop_condition: { - CALL [16] { - function: @not_strictly_false - args: { - CALL [17] { - function: !_ - args: { - IDENT [18] { - name: @ac:0:0 - } - } - } - } - } - } - loop_step: { - CALL [19] { - function: _||_ - args: { - IDENT [20] { - name: @ac:0:0 - } - CALL [21] { - function: _>_ - args: { - IDENT [22] { - name: @it:0:0 - } - CONSTANT [23] { value: 0 } - } - } - } - } - } - result: { - IDENT [24] { - name: @ac:0:0 - } - } - } - } - } - } - } - CALL [25] { - function: size - args: { - LIST [26] { - elements: { - COMPREHENSION [27] { - iter_var: @it:0:0 - iter_range: { - IDENT [28] { - name: @index0 - } - } - accu_var: @ac:0:0 - accu_init: { - CONSTANT [29] { value: false } - } - loop_condition: { - CALL [30] { - function: @not_strictly_false - args: { - CALL [31] { - function: !_ - args: { - IDENT [32] { - name: @ac:0:0 - } - } - } - } - } - } - loop_step: { - CALL [33] { - function: _||_ - args: { - IDENT [34] { - name: @ac:0:0 - } - CALL [35] { - function: _>_ - args: { - IDENT [36] { - name: @it:0:0 - } - CONSTANT [37] { value: 0 } - } - } - } - } - } - result: { - IDENT [38] { - name: @ac:0:0 - } - } - } - } - } - } - } - } - } - CALL [39] { - function: size - args: { - LIST [40] { - elements: { - COMPREHENSION [41] { - iter_var: @it:0:0 - iter_range: { - IDENT [42] { - name: @index1 - } - } - accu_var: @ac:0:0 - accu_init: { - CONSTANT [43] { value: false } - } - loop_condition: { - CALL [44] { - function: @not_strictly_false - args: { - CALL [45] { - function: !_ - args: { - IDENT [46] { - name: @ac:0:0 - } - } - } - } - } - } - loop_step: { - CALL [47] { - function: _||_ - args: { - IDENT [48] { - name: @ac:0:0 - } - CALL [49] { - function: _>_ - args: { - IDENT [50] { - name: @it:0:0 - } - CONSTANT [51] { value: 1 } - } - } - } - } - } - result: { - IDENT [52] { - name: @ac:0:0 - } - } - } - } - } - } - } - } - } - CALL [53] { - function: size - args: { - LIST [54] { - elements: { - COMPREHENSION [55] { - iter_var: @it:0:0 - iter_range: { - IDENT [56] { - name: @index1 - } - } - accu_var: @ac:0:0 - accu_init: { - CONSTANT [57] { value: false } - } - loop_condition: { - CALL [58] { - function: @not_strictly_false - args: { - CALL [59] { - function: !_ - args: { - IDENT [60] { - name: @ac:0:0 - } - } - } - } - } - } - loop_step: { - CALL [61] { - function: _||_ - args: { - IDENT [62] { - name: @ac:0:0 - } - CALL [63] { - function: _>_ - args: { - IDENT [64] { - name: @it:0:0 - } - CONSTANT [65] { value: 1 } - } - } - } - } - } - result: { - IDENT [66] { - name: @ac:0:0 - } - } - } - } - } - } - } - } - } - CONSTANT [67] { value: 4 } - } - } - } -} -Test case: MULTIPLE_MACROS_2 -Source: [[1].exists(i, i > 0)] + [[1].exists(j, j > 0)] + [['a'].exists(k, k == 'a')] + [['a'].exists(l, l == 'a')] == [true, true, true, true] -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - LIST [3] { - elements: { - CONSTANT [4] { value: 1 } - } - } - LIST [5] { - elements: { - CONSTANT [6] { value: "a" } - } - } - LIST [7] { - elements: { - CONSTANT [8] { value: true } - CONSTANT [9] { value: true } - CONSTANT [10] { value: true } - CONSTANT [11] { value: true } - } - } - } - } - CALL [12] { - function: _==_ - args: { - CALL [13] { - function: _+_ - args: { - CALL [14] { - function: _+_ - args: { - CALL [15] { - function: _+_ - args: { - LIST [16] { - elements: { - COMPREHENSION [17] { - iter_var: @it:0:0 - iter_range: { - IDENT [18] { - name: @index0 - } - } - accu_var: @ac:0:0 - accu_init: { - CONSTANT [19] { value: false } - } - loop_condition: { - CALL [20] { - function: @not_strictly_false - args: { - CALL [21] { - function: !_ - args: { - IDENT [22] { - name: @ac:0:0 - } - } - } - } - } - } - loop_step: { - CALL [23] { - function: _||_ - args: { - IDENT [24] { - name: @ac:0:0 - } - CALL [25] { - function: _>_ - args: { - IDENT [26] { - name: @it:0:0 - } - CONSTANT [27] { value: 0 } - } - } - } - } - } - result: { - IDENT [28] { - name: @ac:0:0 - } - } - } - } - } - LIST [29] { - elements: { - COMPREHENSION [30] { - iter_var: @it:0:0 - iter_range: { - IDENT [31] { - name: @index0 - } - } - accu_var: @ac:0:0 - accu_init: { - CONSTANT [32] { value: false } - } - loop_condition: { - CALL [33] { - function: @not_strictly_false - args: { - CALL [34] { - function: !_ - args: { - IDENT [35] { - name: @ac:0:0 - } - } - } - } - } - } - loop_step: { - CALL [36] { - function: _||_ - args: { - IDENT [37] { - name: @ac:0:0 - } - CALL [38] { - function: _>_ - args: { - IDENT [39] { - name: @it:0:0 - } - CONSTANT [40] { value: 0 } - } - } - } - } - } - result: { - IDENT [41] { - name: @ac:0:0 - } - } - } - } - } - } - } - LIST [42] { - elements: { - COMPREHENSION [43] { - iter_var: @it:0:1 - iter_range: { - IDENT [44] { - name: @index1 - } - } - accu_var: @ac:0:1 - accu_init: { - CONSTANT [45] { value: false } - } - loop_condition: { - CALL [46] { - function: @not_strictly_false - args: { - CALL [47] { - function: !_ - args: { - IDENT [48] { - name: @ac:0:1 - } - } - } - } - } - } - loop_step: { - CALL [49] { - function: _||_ - args: { - IDENT [50] { - name: @ac:0:1 - } - CALL [51] { - function: _==_ - args: { - IDENT [52] { - name: @it:0:1 - } - CONSTANT [53] { value: "a" } - } - } - } - } - } - result: { - IDENT [54] { - name: @ac:0:1 - } - } - } - } - } - } - } - LIST [55] { - elements: { - COMPREHENSION [56] { - iter_var: @it:0:1 - iter_range: { - IDENT [57] { - name: @index1 - } - } - accu_var: @ac:0:1 - accu_init: { - CONSTANT [58] { value: false } - } - loop_condition: { - CALL [59] { - function: @not_strictly_false - args: { - CALL [60] { - function: !_ - args: { - IDENT [61] { - name: @ac:0:1 - } - } - } - } - } - } - loop_step: { - CALL [62] { - function: _||_ - args: { - IDENT [63] { - name: @ac:0:1 - } - CALL [64] { - function: _==_ - args: { - IDENT [65] { - name: @it:0:1 - } - CONSTANT [66] { value: "a" } - } - } - } - } - } - result: { - IDENT [67] { - name: @ac:0:1 - } - } - } - } - } - } - } - IDENT [68] { - name: @index2 - } - } - } - } -} -Test case: MULTIPLE_MACROS_3 -Source: [1].exists(i, i > 0) && [1].exists(j, j > 0) && [1].exists(k, k > 1) && [2].exists(l, l > 1) -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - LIST [3] { - elements: { - CONSTANT [4] { value: 1 } - } - } - LIST [5] { - elements: { - CONSTANT [6] { value: 2 } - } - } - } - } - CALL [7] { - function: _&&_ - args: { - CALL [8] { - function: _&&_ - args: { - COMPREHENSION [9] { - iter_var: @it:0:0 - iter_range: { - IDENT [10] { - name: @index0 - } - } - accu_var: @ac:0:0 - accu_init: { - CONSTANT [11] { value: false } - } - loop_condition: { - CALL [12] { - function: @not_strictly_false - args: { - CALL [13] { - function: !_ - args: { - IDENT [14] { - name: @ac:0:0 - } - } - } - } - } - } - loop_step: { - CALL [15] { - function: _||_ - args: { - IDENT [16] { - name: @ac:0:0 - } - CALL [17] { - function: _>_ - args: { - IDENT [18] { - name: @it:0:0 - } - CONSTANT [19] { value: 0 } - } - } - } - } - } - result: { - IDENT [20] { - name: @ac:0:0 - } - } - } - COMPREHENSION [21] { - iter_var: @it:0:0 - iter_range: { - IDENT [22] { - name: @index0 - } - } - accu_var: @ac:0:0 - accu_init: { - CONSTANT [23] { value: false } - } - loop_condition: { - CALL [24] { - function: @not_strictly_false - args: { - CALL [25] { - function: !_ - args: { - IDENT [26] { - name: @ac:0:0 - } - } - } - } - } - } - loop_step: { - CALL [27] { - function: _||_ - args: { - IDENT [28] { - name: @ac:0:0 - } - CALL [29] { - function: _>_ - args: { - IDENT [30] { - name: @it:0:0 - } - CONSTANT [31] { value: 0 } - } - } - } - } - } - result: { - IDENT [32] { - name: @ac:0:0 - } - } - } - } - } - CALL [33] { - function: _&&_ - args: { - COMPREHENSION [34] { - iter_var: @it:0:0 - iter_range: { - IDENT [35] { - name: @index0 - } - } - accu_var: @ac:0:0 - accu_init: { - CONSTANT [36] { value: false } - } - loop_condition: { - CALL [37] { - function: @not_strictly_false - args: { - CALL [38] { - function: !_ - args: { - IDENT [39] { - name: @ac:0:0 - } - } - } - } - } - } - loop_step: { - CALL [40] { - function: _||_ - args: { - IDENT [41] { - name: @ac:0:0 - } - CALL [42] { - function: _>_ - args: { - IDENT [43] { - name: @it:0:0 - } - CONSTANT [44] { value: 1 } - } - } - } - } - } - result: { - IDENT [45] { - name: @ac:0:0 - } - } - } - COMPREHENSION [46] { - iter_var: @it:0:0 - iter_range: { - IDENT [47] { - name: @index1 - } - } - accu_var: @ac:0:0 - accu_init: { - CONSTANT [48] { value: false } - } - loop_condition: { - CALL [49] { - function: @not_strictly_false - args: { - CALL [50] { - function: !_ - args: { - IDENT [51] { - name: @ac:0:0 - } - } - } - } - } - } - loop_step: { - CALL [52] { - function: _||_ - args: { - IDENT [53] { - name: @ac:0:0 - } - CALL [54] { - function: _>_ - args: { - IDENT [55] { - name: @it:0:0 - } - CONSTANT [56] { value: 1 } - } - } - } - } - } - result: { - IDENT [57] { - name: @ac:0:0 - } - } - } - } - } - } - } - } -} -Test case: MULTIPLE_MACROS_COMP_V2_1 -Source: size([[1].exists(i,x,i > 0 && x >= 0)]) + size([[1].exists(j, y, j > 0 && y >= 0)]) + size([[2].exists(k,z,k > 1 && z >= 0)]) + size([[2].exists(l, w, l > 1 && w >= 0)]) == 4 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - LIST [3] { - elements: { - CONSTANT [4] { value: 1 } - } - } - LIST [5] { - elements: { - CONSTANT [6] { value: 2 } - } - } - } - } - CALL [7] { - function: _==_ - args: { - CALL [8] { - function: _+_ - args: { - CALL [9] { - function: _+_ - args: { - CALL [10] { - function: _+_ - args: { - CALL [11] { - function: size - args: { - LIST [12] { - elements: { - COMPREHENSION [13] { - iter_var: @it:0:0 - iter_var2: @it2:0:0 - iter_range: { - IDENT [14] { - name: @index0 - } - } - accu_var: @ac:0:0 - accu_init: { - CONSTANT [15] { value: false } - } - loop_condition: { - CALL [16] { - function: @not_strictly_false - args: { - CALL [17] { - function: !_ - args: { - IDENT [18] { - name: @ac:0:0 - } - } - } - } - } - } - loop_step: { - CALL [19] { - function: _||_ - args: { - IDENT [20] { - name: @ac:0:0 - } - CALL [21] { - function: _&&_ - args: { - CALL [22] { - function: _>_ - args: { - IDENT [23] { - name: @it:0:0 - } - CONSTANT [24] { value: 0 } - } - } - CALL [25] { - function: _>=_ - args: { - IDENT [26] { - name: @it2:0:0 - } - CONSTANT [27] { value: 0 } - } - } - } - } - } - } - } - result: { - IDENT [28] { - name: @ac:0:0 - } - } - } - } - } - } - } - CALL [29] { - function: size - args: { - LIST [30] { - elements: { - COMPREHENSION [31] { - iter_var: @it:0:0 - iter_var2: @it2:0:0 - iter_range: { - IDENT [32] { - name: @index0 - } - } - accu_var: @ac:0:0 - accu_init: { - CONSTANT [33] { value: false } - } - loop_condition: { - CALL [34] { - function: @not_strictly_false - args: { - CALL [35] { - function: !_ - args: { - IDENT [36] { - name: @ac:0:0 - } - } - } - } - } - } - loop_step: { - CALL [37] { - function: _||_ - args: { - IDENT [38] { - name: @ac:0:0 - } - CALL [39] { - function: _&&_ - args: { - CALL [40] { - function: _>_ - args: { - IDENT [41] { - name: @it:0:0 - } - CONSTANT [42] { value: 0 } - } - } - CALL [43] { - function: _>=_ - args: { - IDENT [44] { - name: @it2:0:0 - } - CONSTANT [45] { value: 0 } - } - } - } - } - } - } - } - result: { - IDENT [46] { - name: @ac:0:0 - } - } - } - } - } - } - } - } - } - CALL [47] { - function: size - args: { - LIST [48] { - elements: { - COMPREHENSION [49] { - iter_var: @it:0:0 - iter_var2: @it2:0:0 - iter_range: { - IDENT [50] { - name: @index1 - } - } - accu_var: @ac:0:0 - accu_init: { - CONSTANT [51] { value: false } - } - loop_condition: { - CALL [52] { - function: @not_strictly_false - args: { - CALL [53] { - function: !_ - args: { - IDENT [54] { - name: @ac:0:0 - } - } - } - } - } - } - loop_step: { - CALL [55] { - function: _||_ - args: { - IDENT [56] { - name: @ac:0:0 - } - CALL [57] { - function: _&&_ - args: { - CALL [58] { - function: _>_ - args: { - IDENT [59] { - name: @it:0:0 - } - CONSTANT [60] { value: 1 } - } - } - CALL [61] { - function: _>=_ - args: { - IDENT [62] { - name: @it2:0:0 - } - CONSTANT [63] { value: 0 } - } - } - } - } - } - } - } - result: { - IDENT [64] { - name: @ac:0:0 - } - } - } - } - } - } - } - } - } - CALL [65] { - function: size - args: { - LIST [66] { - elements: { - COMPREHENSION [67] { - iter_var: @it:0:0 - iter_var2: @it2:0:0 - iter_range: { - IDENT [68] { - name: @index1 - } - } - accu_var: @ac:0:0 - accu_init: { - CONSTANT [69] { value: false } - } - loop_condition: { - CALL [70] { - function: @not_strictly_false - args: { - CALL [71] { - function: !_ - args: { - IDENT [72] { - name: @ac:0:0 - } - } - } - } - } - } - loop_step: { - CALL [73] { - function: _||_ - args: { - IDENT [74] { - name: @ac:0:0 - } - CALL [75] { - function: _&&_ - args: { - CALL [76] { - function: _>_ - args: { - IDENT [77] { - name: @it:0:0 - } - CONSTANT [78] { value: 1 } - } - } - CALL [79] { - function: _>=_ - args: { - IDENT [80] { - name: @it2:0:0 - } - CONSTANT [81] { value: 0 } - } - } - } - } - } - } - } - result: { - IDENT [82] { - name: @ac:0:0 - } - } - } - } - } - } - } - } - } - CONSTANT [83] { value: 4 } - } - } - } -} -Test case: MULTIPLE_MACROS_COMP_V2_2 -Source: [1].exists(i, x, i > 0 && x > 0) && [1].exists(j, y, j > 0 && y > 0) && [1].exists(k, z, k > 1 && z > 0) && [2].exists(l, w, l > 1 && w > 0) -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - LIST [3] { - elements: { - CONSTANT [4] { value: 1 } - } - } - LIST [5] { - elements: { - CONSTANT [6] { value: 2 } - } - } - } - } - CALL [7] { - function: _&&_ - args: { - CALL [8] { - function: _&&_ - args: { - COMPREHENSION [9] { - iter_var: @it:0:0 - iter_var2: @it2:0:0 - iter_range: { - IDENT [10] { - name: @index0 - } - } - accu_var: @ac:0:0 - accu_init: { - CONSTANT [11] { value: false } - } - loop_condition: { - CALL [12] { - function: @not_strictly_false - args: { - CALL [13] { - function: !_ - args: { - IDENT [14] { - name: @ac:0:0 - } - } - } - } - } - } - loop_step: { - CALL [15] { - function: _||_ - args: { - IDENT [16] { - name: @ac:0:0 - } - CALL [17] { - function: _&&_ - args: { - CALL [18] { - function: _>_ - args: { - IDENT [19] { - name: @it:0:0 - } - CONSTANT [20] { value: 0 } - } - } - CALL [21] { - function: _>_ - args: { - IDENT [22] { - name: @it2:0:0 - } - CONSTANT [23] { value: 0 } - } - } - } - } - } - } - } - result: { - IDENT [24] { - name: @ac:0:0 - } - } - } - COMPREHENSION [25] { - iter_var: @it:0:0 - iter_var2: @it2:0:0 - iter_range: { - IDENT [26] { - name: @index0 - } - } - accu_var: @ac:0:0 - accu_init: { - CONSTANT [27] { value: false } - } - loop_condition: { - CALL [28] { - function: @not_strictly_false - args: { - CALL [29] { - function: !_ - args: { - IDENT [30] { - name: @ac:0:0 - } - } - } - } - } - } - loop_step: { - CALL [31] { - function: _||_ - args: { - IDENT [32] { - name: @ac:0:0 - } - CALL [33] { - function: _&&_ - args: { - CALL [34] { - function: _>_ - args: { - IDENT [35] { - name: @it:0:0 - } - CONSTANT [36] { value: 0 } - } - } - CALL [37] { - function: _>_ - args: { - IDENT [38] { - name: @it2:0:0 - } - CONSTANT [39] { value: 0 } - } - } - } - } - } - } - } - result: { - IDENT [40] { - name: @ac:0:0 - } - } - } - } - } - CALL [41] { - function: _&&_ - args: { - COMPREHENSION [42] { - iter_var: @it:0:0 - iter_var2: @it2:0:0 - iter_range: { - IDENT [43] { - name: @index0 - } - } - accu_var: @ac:0:0 - accu_init: { - CONSTANT [44] { value: false } - } - loop_condition: { - CALL [45] { - function: @not_strictly_false - args: { - CALL [46] { - function: !_ - args: { - IDENT [47] { - name: @ac:0:0 - } - } - } - } - } - } - loop_step: { - CALL [48] { - function: _||_ - args: { - IDENT [49] { - name: @ac:0:0 - } - CALL [50] { - function: _&&_ - args: { - CALL [51] { - function: _>_ - args: { - IDENT [52] { - name: @it:0:0 - } - CONSTANT [53] { value: 1 } - } - } - CALL [54] { - function: _>_ - args: { - IDENT [55] { - name: @it2:0:0 - } - CONSTANT [56] { value: 0 } - } - } - } - } - } - } - } - result: { - IDENT [57] { - name: @ac:0:0 - } - } - } - COMPREHENSION [58] { - iter_var: @it:0:0 - iter_var2: @it2:0:0 - iter_range: { - IDENT [59] { - name: @index1 - } - } - accu_var: @ac:0:0 - accu_init: { - CONSTANT [60] { value: false } - } - loop_condition: { - CALL [61] { - function: @not_strictly_false - args: { - CALL [62] { - function: !_ - args: { - IDENT [63] { - name: @ac:0:0 - } - } - } - } - } - } - loop_step: { - CALL [64] { - function: _||_ - args: { - IDENT [65] { - name: @ac:0:0 - } - CALL [66] { - function: _&&_ - args: { - CALL [67] { - function: _>_ - args: { - IDENT [68] { - name: @it:0:0 - } - CONSTANT [69] { value: 1 } - } - } - CALL [70] { - function: _>_ - args: { - IDENT [71] { - name: @it2:0:0 - } - CONSTANT [72] { value: 0 } - } - } - } - } - } - } - } - result: { - IDENT [73] { - name: @ac:0:0 - } - } - } - } - } - } - } - } -} -Test case: NESTED_MACROS -Source: [1,2,3].map(i, [1, 2, 3].map(i, i + 1)) == [[2, 3, 4], [2, 3, 4], [2, 3, 4]] -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - LIST [3] { - elements: { - CONSTANT [4] { value: 1 } - CONSTANT [5] { value: 2 } - CONSTANT [6] { value: 3 } - } - } - LIST [7] { - elements: { - CONSTANT [8] { value: 2 } - CONSTANT [9] { value: 3 } - CONSTANT [10] { value: 4 } - } - } - LIST [11] { - elements: { - IDENT [12] { - name: @index1 - } - IDENT [13] { - name: @index1 - } - IDENT [14] { - name: @index1 - } - } - } - } - } - CALL [15] { - function: _==_ - args: { - COMPREHENSION [16] { - iter_var: @it:1:0 - iter_range: { - IDENT [17] { - name: @index0 - } - } - accu_var: @ac:1:0 - accu_init: { - LIST [18] { - elements: { - } - } - } - loop_condition: { - CONSTANT [19] { value: true } - } - loop_step: { - CALL [20] { - function: _+_ - args: { - IDENT [21] { - name: @ac:1:0 - } - LIST [22] { - elements: { - COMPREHENSION [23] { - iter_var: @it:0:0 - iter_range: { - IDENT [24] { - name: @index0 - } - } - accu_var: @ac:0:0 - accu_init: { - LIST [25] { - elements: { - } - } - } - loop_condition: { - CONSTANT [26] { value: true } - } - loop_step: { - CALL [27] { - function: _+_ - args: { - IDENT [28] { - name: @ac:0:0 - } - LIST [29] { - elements: { - CALL [30] { - function: _+_ - args: { - IDENT [31] { - name: @it:0:0 - } - CONSTANT [32] { value: 1 } - } - } - } - } - } - } - } - result: { - IDENT [33] { - name: @ac:0:0 - } - } - } - } - } - } - } - } - result: { - IDENT [34] { - name: @ac:1:0 - } - } - } - IDENT [35] { - name: @index2 - } - } - } - } -} -Test case: NESTED_MACROS_2 -Source: [1, 2].map(y, [1, 2, 3].filter(x, x == y)) == [[1], [2]] -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - LIST [3] { - elements: { - CONSTANT [4] { value: 1 } - CONSTANT [5] { value: 2 } - } - } - LIST [6] { - elements: { - CONSTANT [7] { value: 1 } - CONSTANT [8] { value: 2 } - CONSTANT [9] { value: 3 } - } - } - LIST [10] { - elements: { - CONSTANT [11] { value: 1 } - } - } - LIST [12] { - elements: { - CONSTANT [13] { value: 2 } - } - } - LIST [14] { - elements: { - IDENT [15] { - name: @index2 - } - IDENT [16] { - name: @index3 - } - } - } - } - } - CALL [17] { - function: _==_ - args: { - COMPREHENSION [18] { - iter_var: @it:1:0 - iter_range: { - IDENT [19] { - name: @index0 - } - } - accu_var: @ac:1:0 - accu_init: { - LIST [20] { - elements: { - } - } - } - loop_condition: { - CONSTANT [21] { value: true } - } - loop_step: { - CALL [22] { - function: _+_ - args: { - IDENT [23] { - name: @ac:1:0 - } - LIST [24] { - elements: { - COMPREHENSION [25] { - iter_var: @it:0:0 - iter_range: { - IDENT [26] { - name: @index1 - } - } - accu_var: @ac:0:0 - accu_init: { - LIST [27] { - elements: { - } - } - } - loop_condition: { - CONSTANT [28] { value: true } - } - loop_step: { - CALL [29] { - function: _?_:_ - args: { - CALL [30] { - function: _==_ - args: { - IDENT [31] { - name: @it:0:0 - } - IDENT [32] { - name: @it:1:0 - } - } - } - CALL [33] { - function: _+_ - args: { - IDENT [34] { - name: @ac:0:0 - } - LIST [35] { - elements: { - IDENT [36] { - name: @it:0:0 - } - } - } - } - } - IDENT [37] { - name: @ac:0:0 - } - } - } - } - result: { - IDENT [38] { - name: @ac:0:0 - } - } - } - } - } - } - } - } - result: { - IDENT [39] { - name: @ac:1:0 - } - } - } - IDENT [40] { - name: @index4 - } - } - } - } -} -Test case: NESTED_MACROS_3 -Source: [1,2,3].map(i, i * 2) + [1,2,3].map(i, i * 2).map(i, i * 2) -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - LIST [3] { - elements: { - CONSTANT [4] { value: 1 } - CONSTANT [5] { value: 2 } - CONSTANT [6] { value: 3 } - } - } - } - } - CALL [7] { - function: _+_ - args: { - COMPREHENSION [8] { - iter_var: @it:0:0 - iter_range: { - IDENT [9] { - name: @index0 - } - } - accu_var: @ac:0:0 - accu_init: { - LIST [10] { - elements: { - } - } - } - loop_condition: { - CONSTANT [11] { value: true } - } - loop_step: { - CALL [12] { - function: _+_ - args: { - IDENT [13] { - name: @ac:0:0 - } - LIST [14] { - elements: { - CALL [15] { - function: _*_ - args: { - IDENT [16] { - name: @it:0:0 - } - CONSTANT [17] { value: 2 } - } - } - } - } - } - } - } - result: { - IDENT [18] { - name: @ac:0:0 - } - } - } - COMPREHENSION [19] { - iter_var: @it:1:0 - iter_range: { - COMPREHENSION [20] { - iter_var: @it:0:0 - iter_range: { - IDENT [21] { - name: @index0 - } - } - accu_var: @ac:0:0 - accu_init: { - LIST [22] { - elements: { - } - } - } - loop_condition: { - CONSTANT [23] { value: true } - } - loop_step: { - CALL [24] { - function: _+_ - args: { - IDENT [25] { - name: @ac:0:0 - } - LIST [26] { - elements: { - CALL [27] { - function: _*_ - args: { - IDENT [28] { - name: @it:0:0 - } - CONSTANT [29] { value: 2 } - } - } - } - } - } - } - } - result: { - IDENT [30] { - name: @ac:0:0 - } - } - } - } - accu_var: @ac:1:0 - accu_init: { - LIST [31] { - elements: { - } - } - } - loop_condition: { - CONSTANT [32] { value: true } - } - loop_step: { - CALL [33] { - function: _+_ - args: { - IDENT [34] { - name: @ac:1:0 - } - LIST [35] { - elements: { - CALL [36] { - function: _*_ - args: { - IDENT [37] { - name: @it:1:0 - } - CONSTANT [38] { value: 2 } - } - } - } - } - } - } - } - result: { - IDENT [39] { - name: @ac:1:0 - } - } - } - } - } - } -} -Test case: NESTED_MACROS_COMP_V2_1 -Source: [1,2,3].transformList(i, v, [1, 2, 3].transformList(i, v, i + v + 1)) == [[2, 4, 6], [2, 4, 6], [2, 4, 6]] -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - LIST [3] { - elements: { - CONSTANT [4] { value: 1 } - CONSTANT [5] { value: 2 } - CONSTANT [6] { value: 3 } - } - } - LIST [7] { - elements: { - CONSTANT [8] { value: 2 } - CONSTANT [9] { value: 4 } - CONSTANT [10] { value: 6 } - } - } - LIST [11] { - elements: { - IDENT [12] { - name: @index1 - } - IDENT [13] { - name: @index1 - } - IDENT [14] { - name: @index1 - } - } - } - } - } - CALL [15] { - function: _==_ - args: { - COMPREHENSION [16] { - iter_var: @it:1:0 - iter_var2: @it2:1:0 - iter_range: { - IDENT [17] { - name: @index0 - } - } - accu_var: @ac:1:0 - accu_init: { - LIST [18] { - elements: { - } - } - } - loop_condition: { - CONSTANT [19] { value: true } - } - loop_step: { - CALL [20] { - function: _+_ - args: { - IDENT [21] { - name: @ac:1:0 - } - LIST [22] { - elements: { - COMPREHENSION [23] { - iter_var: @it:0:0 - iter_var2: @it2:0:0 - iter_range: { - IDENT [24] { - name: @index0 - } - } - accu_var: @ac:0:0 - accu_init: { - LIST [25] { - elements: { - } - } - } - loop_condition: { - CONSTANT [26] { value: true } - } - loop_step: { - CALL [27] { - function: _+_ - args: { - IDENT [28] { - name: @ac:0:0 - } - LIST [29] { - elements: { - CALL [30] { - function: _+_ - args: { - CALL [31] { - function: _+_ - args: { - IDENT [32] { - name: @it:0:0 - } - IDENT [33] { - name: @it2:0:0 - } - } - } - CONSTANT [34] { value: 1 } - } - } - } - } - } - } - } - result: { - IDENT [35] { - name: @ac:0:0 - } - } - } - } - } - } - } - } - result: { - IDENT [36] { - name: @ac:1:0 - } - } - } - IDENT [37] { - name: @index2 - } - } - } - } -} -Test case: NESTED_MACROS_COMP_V2_2 -Source: [1, 2].transformList(i, y, [1, 2, 3].filter(x, x == y && i < y)) == [[1], [2]] -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - LIST [3] { - elements: { - CONSTANT [4] { value: 1 } - CONSTANT [5] { value: 2 } - } - } - LIST [6] { - elements: { - CONSTANT [7] { value: 1 } - CONSTANT [8] { value: 2 } - CONSTANT [9] { value: 3 } - } - } - LIST [10] { - elements: { - CONSTANT [11] { value: 1 } - } - } - LIST [12] { - elements: { - CONSTANT [13] { value: 2 } - } - } - LIST [14] { - elements: { - IDENT [15] { - name: @index2 - } - IDENT [16] { - name: @index3 - } - } - } - } - } - CALL [17] { - function: _==_ - args: { - COMPREHENSION [18] { - iter_var: @it:1:0 - iter_var2: @it2:1:0 - iter_range: { - IDENT [19] { - name: @index0 - } - } - accu_var: @ac:1:0 - accu_init: { - LIST [20] { - elements: { - } - } - } - loop_condition: { - CONSTANT [21] { value: true } - } - loop_step: { - CALL [22] { - function: _+_ - args: { - IDENT [23] { - name: @ac:1:0 - } - LIST [24] { - elements: { - COMPREHENSION [25] { - iter_var: @it:0:0 - iter_range: { - IDENT [26] { - name: @index1 - } - } - accu_var: @ac:0:0 - accu_init: { - LIST [27] { - elements: { - } - } - } - loop_condition: { - CONSTANT [28] { value: true } - } - loop_step: { - CALL [29] { - function: _?_:_ - args: { - CALL [30] { - function: _&&_ - args: { - CALL [31] { - function: _==_ - args: { - IDENT [32] { - name: @it:0:0 - } - IDENT [33] { - name: @it2:1:0 - } - } - } - CALL [34] { - function: _<_ - args: { - IDENT [35] { - name: @it:1:0 - } - IDENT [36] { - name: @it2:1:0 - } - } - } - } - } - CALL [37] { - function: _+_ - args: { - IDENT [38] { - name: @ac:0:0 - } - LIST [39] { - elements: { - IDENT [40] { - name: @it:0:0 - } - } - } - } - } - IDENT [41] { - name: @ac:0:0 - } - } - } - } - result: { - IDENT [42] { - name: @ac:0:0 - } - } - } - } - } - } - } - } - result: { - IDENT [43] { - name: @ac:1:0 - } - } - } - IDENT [44] { - name: @index4 - } - } - } - } -} -Test case: ADJACENT_NESTED_MACROS -Source: [1,2,3].map(i, [1, 2, 3].map(i, i + 1)) == [1,2,3].map(j, [1, 2, 3].map(j, j + 1)) -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - LIST [3] { - elements: { - CONSTANT [4] { value: 1 } - CONSTANT [5] { value: 2 } - CONSTANT [6] { value: 3 } - } - } - } - } - CALL [7] { - function: _==_ - args: { - COMPREHENSION [8] { - iter_var: @it:1:0 - iter_range: { - IDENT [9] { - name: @index0 - } - } - accu_var: @ac:1:0 - accu_init: { - LIST [10] { - elements: { - } - } - } - loop_condition: { - CONSTANT [11] { value: true } - } - loop_step: { - CALL [12] { - function: _+_ - args: { - IDENT [13] { - name: @ac:1:0 - } - LIST [14] { - elements: { - COMPREHENSION [15] { - iter_var: @it:0:0 - iter_range: { - IDENT [16] { - name: @index0 - } - } - accu_var: @ac:0:0 - accu_init: { - LIST [17] { - elements: { - } - } - } - loop_condition: { - CONSTANT [18] { value: true } - } - loop_step: { - CALL [19] { - function: _+_ - args: { - IDENT [20] { - name: @ac:0:0 - } - LIST [21] { - elements: { - CALL [22] { - function: _+_ - args: { - IDENT [23] { - name: @it:0:0 - } - CONSTANT [24] { value: 1 } - } - } - } - } - } - } - } - result: { - IDENT [25] { - name: @ac:0:0 - } - } - } - } - } - } - } - } - result: { - IDENT [26] { - name: @ac:1:0 - } - } - } - COMPREHENSION [27] { - iter_var: @it:1:0 - iter_range: { - IDENT [28] { - name: @index0 - } - } - accu_var: @ac:1:0 - accu_init: { - LIST [29] { - elements: { - } - } - } - loop_condition: { - CONSTANT [30] { value: true } - } - loop_step: { - CALL [31] { - function: _+_ - args: { - IDENT [32] { - name: @ac:1:0 - } - LIST [33] { - elements: { - COMPREHENSION [34] { - iter_var: @it:0:0 - iter_range: { - IDENT [35] { - name: @index0 - } - } - accu_var: @ac:0:0 - accu_init: { - LIST [36] { - elements: { - } - } - } - loop_condition: { - CONSTANT [37] { value: true } - } - loop_step: { - CALL [38] { - function: _+_ - args: { - IDENT [39] { - name: @ac:0:0 - } - LIST [40] { - elements: { - CALL [41] { - function: _+_ - args: { - IDENT [42] { - name: @it:0:0 - } - CONSTANT [43] { value: 1 } - } - } - } - } - } - } - } - result: { - IDENT [44] { - name: @ac:0:0 - } - } - } - } - } - } - } - } - result: { - IDENT [45] { - name: @ac:1:0 - } - } - } - } - } - } -} -Test case: ADJACENT_NESTED_MACROS_COMP_V2 -Source: [1,2,3].transformMap(i, x, [1, 2, 3].transformMap(i, x, i + x + 1)) == [1,2,3].transformMap(j, y, [1, 2, 3].transformMap(j, y, j + y + 1)) -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - LIST [3] { - elements: { - CONSTANT [4] { value: 1 } - CONSTANT [5] { value: 2 } - CONSTANT [6] { value: 3 } - } - } - } - } - CALL [7] { - function: _==_ - args: { - COMPREHENSION [8] { - iter_var: @it:1:0 - iter_var2: @it2:1:0 - iter_range: { - IDENT [9] { - name: @index0 - } - } - accu_var: @ac:1:0 - accu_init: { - MAP [10] { - - } - } - loop_condition: { - CONSTANT [11] { value: true } - } - loop_step: { - CALL [12] { - function: cel.@mapInsert - args: { - IDENT [13] { - name: @ac:1:0 - } - IDENT [14] { - name: @it:1:0 - } - COMPREHENSION [15] { - iter_var: @it:0:0 - iter_var2: @it2:0:0 - iter_range: { - IDENT [16] { - name: @index0 - } - } - accu_var: @ac:0:0 - accu_init: { - MAP [17] { - - } - } - loop_condition: { - CONSTANT [18] { value: true } - } - loop_step: { - CALL [19] { - function: cel.@mapInsert - args: { - IDENT [20] { - name: @ac:0:0 - } - IDENT [21] { - name: @it:0:0 - } - CALL [22] { - function: _+_ - args: { - CALL [23] { - function: _+_ - args: { - IDENT [24] { - name: @it:0:0 - } - IDENT [25] { - name: @it2:0:0 - } - } - } - CONSTANT [26] { value: 1 } - } - } - } - } - } - result: { - IDENT [27] { - name: @ac:0:0 - } - } - } - } - } - } - result: { - IDENT [28] { - name: @ac:1:0 - } - } - } - COMPREHENSION [29] { - iter_var: @it:1:0 - iter_var2: @it2:1:0 - iter_range: { - IDENT [30] { - name: @index0 - } - } - accu_var: @ac:1:0 - accu_init: { - MAP [31] { - - } - } - loop_condition: { - CONSTANT [32] { value: true } - } - loop_step: { - CALL [33] { - function: cel.@mapInsert - args: { - IDENT [34] { - name: @ac:1:0 - } - IDENT [35] { - name: @it:1:0 - } - COMPREHENSION [36] { - iter_var: @it:0:0 - iter_var2: @it2:0:0 - iter_range: { - IDENT [37] { - name: @index0 - } - } - accu_var: @ac:0:0 - accu_init: { - MAP [38] { - - } - } - loop_condition: { - CONSTANT [39] { value: true } - } - loop_step: { - CALL [40] { - function: cel.@mapInsert - args: { - IDENT [41] { - name: @ac:0:0 - } - IDENT [42] { - name: @it:0:0 - } - CALL [43] { - function: _+_ - args: { - CALL [44] { - function: _+_ - args: { - IDENT [45] { - name: @it:0:0 - } - IDENT [46] { - name: @it2:0:0 - } - } - } - CONSTANT [47] { value: 1 } - } - } - } - } - } - result: { - IDENT [48] { - name: @ac:0:0 - } - } - } - } - } - } - result: { - IDENT [49] { - name: @ac:1:0 - } - } - } - } - } - } -} -Test case: INCLUSION_LIST -Source: 1 in [1,2,3] && 2 in [1,2,3] && 3 in [3, [1,2,3]] && 1 in [1,2,3] -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - LIST [3] { - elements: { - CONSTANT [4] { value: 1 } - CONSTANT [5] { value: 2 } - CONSTANT [6] { value: 3 } - } - } - CALL [7] { - function: @in - args: { - CONSTANT [8] { value: 1 } - IDENT [9] { - name: @index0 - } - } - } - CALL [10] { - function: @in - args: { - CONSTANT [11] { value: 2 } - IDENT [12] { - name: @index0 - } - } - } - CALL [13] { - function: _&&_ - args: { - IDENT [14] { - name: @index1 - } - IDENT [15] { - name: @index2 - } - } - } - LIST [16] { - elements: { - CONSTANT [17] { value: 3 } - IDENT [18] { - name: @index0 - } - } - } - CALL [19] { - function: @in - args: { - CONSTANT [20] { value: 3 } - IDENT [21] { - name: @index4 - } - } - } - CALL [22] { - function: _&&_ - args: { - IDENT [23] { - name: @index5 - } - IDENT [24] { - name: @index1 - } - } - } - } - } - CALL [25] { - function: _&&_ - args: { - IDENT [26] { - name: @index3 - } - IDENT [27] { - name: @index6 - } - } - } - } -} -Test case: INCLUSION_MAP -Source: 2 in {'a': 1, 2: {true: false}, 3: {true: false}} -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - MAP [3] { - MAP_ENTRY [4] { - key: { - CONSTANT [5] { value: true } - } - value: { - CONSTANT [6] { value: false } - } - } - } - MAP [7] { - MAP_ENTRY [8] { - key: { - CONSTANT [9] { value: "a" } - } - value: { - CONSTANT [10] { value: 1 } - } - } - MAP_ENTRY [11] { - key: { - CONSTANT [12] { value: 2 } - } - value: { - IDENT [13] { - name: @index0 - } - } - } - MAP_ENTRY [14] { - key: { - CONSTANT [15] { value: 3 } - } - value: { - IDENT [16] { - name: @index0 - } - } - } - } - } - } - CALL [17] { - function: @in - args: { - CONSTANT [18] { value: 2 } - IDENT [19] { - name: @index1 - } - } - } - } -} -Test case: MACRO_ITER_VAR_NOT_REFERENCED -Source: [1,2].map(i, [1, 2].map(i, [3,4])) == [[[3, 4], [3, 4]], [[3, 4], [3, 4]]] -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - LIST [3] { - elements: { - CONSTANT [4] { value: 1 } - CONSTANT [5] { value: 2 } - } - } - LIST [6] { - elements: { - CONSTANT [7] { value: 3 } - CONSTANT [8] { value: 4 } - } - } - LIST [9] { - elements: { - IDENT [10] { - name: @index1 - } - IDENT [11] { - name: @index1 - } - } - } - LIST [12] { - elements: { - IDENT [13] { - name: @index1 - } - } - } - LIST [14] { - elements: { - IDENT [15] { - name: @index2 - } - IDENT [16] { - name: @index2 - } - } - } - } - } - CALL [17] { - function: _==_ - args: { - COMPREHENSION [18] { - iter_var: @it:1:0 - iter_range: { - IDENT [19] { - name: @index0 - } - } - accu_var: @ac:1:0 - accu_init: { - LIST [20] { - elements: { - } - } - } - loop_condition: { - CONSTANT [21] { value: true } - } - loop_step: { - CALL [22] { - function: _+_ - args: { - IDENT [23] { - name: @ac:1:0 - } - LIST [24] { - elements: { - COMPREHENSION [25] { - iter_var: @it:0:0 - iter_range: { - IDENT [26] { - name: @index0 - } - } - accu_var: @ac:0:0 - accu_init: { - LIST [27] { - elements: { - } - } - } - loop_condition: { - CONSTANT [28] { value: true } - } - loop_step: { - CALL [29] { - function: _+_ - args: { - IDENT [30] { - name: @ac:0:0 - } - IDENT [31] { - name: @index3 - } - } - } - } - result: { - IDENT [32] { - name: @ac:0:0 - } - } - } - } - } - } - } - } - result: { - IDENT [33] { - name: @ac:1:0 - } - } - } - IDENT [34] { - name: @index4 - } - } - } - } -} -Test case: MACRO_ITER_VAR2_NOT_REFERENCED -Source: [1,2].transformList(i, v, [1, 2].transformList(i, v, [3,4])) == [[[3, 4], [3, 4]], [[3, 4], [3, 4]]] -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - LIST [3] { - elements: { - CONSTANT [4] { value: 1 } - CONSTANT [5] { value: 2 } - } - } - LIST [6] { - elements: { - CONSTANT [7] { value: 3 } - CONSTANT [8] { value: 4 } - } - } - LIST [9] { - elements: { - IDENT [10] { - name: @index1 - } - IDENT [11] { - name: @index1 - } - } - } - LIST [12] { - elements: { - IDENT [13] { - name: @index1 - } - } - } - LIST [14] { - elements: { - IDENT [15] { - name: @index2 - } - IDENT [16] { - name: @index2 - } - } - } - } - } - CALL [17] { - function: _==_ - args: { - COMPREHENSION [18] { - iter_var: @it:1:0 - iter_var2: @it2:1:0 - iter_range: { - IDENT [19] { - name: @index0 - } - } - accu_var: @ac:1:0 - accu_init: { - LIST [20] { - elements: { - } - } - } - loop_condition: { - CONSTANT [21] { value: true } - } - loop_step: { - CALL [22] { - function: _+_ - args: { - IDENT [23] { - name: @ac:1:0 - } - LIST [24] { - elements: { - COMPREHENSION [25] { - iter_var: @it:0:0 - iter_var2: @it2:0:0 - iter_range: { - IDENT [26] { - name: @index0 - } - } - accu_var: @ac:0:0 - accu_init: { - LIST [27] { - elements: { - } - } - } - loop_condition: { - CONSTANT [28] { value: true } - } - loop_step: { - CALL [29] { - function: _+_ - args: { - IDENT [30] { - name: @ac:0:0 - } - IDENT [31] { - name: @index3 - } - } - } - } - result: { - IDENT [32] { - name: @ac:0:0 - } - } - } - } - } - } - } - } - result: { - IDENT [33] { - name: @ac:1:0 - } - } - } - IDENT [34] { - name: @index4 - } - } - } - } -} -Test case: MACRO_SHADOWED_VARIABLE -Source: [x - 1 > 3 ? x - 1 : 5].exists(x, x - 1 > 3) || x - 1 > 3 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - CALL [3] { - function: _-_ - args: { - IDENT [4] { - name: x - } - CONSTANT [5] { value: 1 } - } - } - CALL [6] { - function: _>_ - args: { - IDENT [7] { - name: @index0 - } - CONSTANT [8] { value: 3 } - } - } - CALL [9] { - function: _?_:_ - args: { - IDENT [10] { - name: @index1 - } - IDENT [11] { - name: @index0 - } - CONSTANT [12] { value: 5 } - } - } - LIST [13] { - elements: { - IDENT [14] { - name: @index2 - } - } - } - } - } - CALL [15] { - function: _||_ - args: { - COMPREHENSION [16] { - iter_var: @it:0:0 - iter_range: { - IDENT [17] { - name: @index3 - } - } - accu_var: @ac:0:0 - accu_init: { - CONSTANT [18] { value: false } - } - loop_condition: { - CALL [19] { - function: @not_strictly_false - args: { - CALL [20] { - function: !_ - args: { - IDENT [21] { - name: @ac:0:0 - } - } - } - } - } - } - loop_step: { - CALL [22] { - function: _||_ - args: { - IDENT [23] { - name: @ac:0:0 - } - CALL [24] { - function: _>_ - args: { - CALL [25] { - function: _-_ - args: { - IDENT [26] { - name: @it:0:0 - } - CONSTANT [27] { value: 1 } - } - } - CONSTANT [28] { value: 3 } - } - } - } - } - } - result: { - IDENT [29] { - name: @ac:0:0 - } - } - } - IDENT [30] { - name: @index1 - } - } - } - } -} -Test case: MACRO_SHADOWED_VARIABLE_2 -Source: ["foo", "bar"].map(x, [x + x, x + x]).map(x, [x + x, x + x]) -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - LIST [3] { - elements: { - CONSTANT [4] { value: "foo" } - CONSTANT [5] { value: "bar" } - } - } - } - } - COMPREHENSION [6] { - iter_var: @it:1:0 - iter_range: { - COMPREHENSION [7] { - iter_var: @it:0:0 - iter_range: { - IDENT [8] { - name: @index0 - } - } - accu_var: @ac:0:0 - accu_init: { - LIST [9] { - elements: { - } - } - } - loop_condition: { - CONSTANT [10] { value: true } - } - loop_step: { - CALL [11] { - function: _+_ - args: { - IDENT [12] { - name: @ac:0:0 - } - LIST [13] { - elements: { - LIST [14] { - elements: { - CALL [15] { - function: _+_ - args: { - IDENT [16] { - name: @it:0:0 - } - IDENT [17] { - name: @it:0:0 - } - } - } - CALL [18] { - function: _+_ - args: { - IDENT [19] { - name: @it:0:0 - } - IDENT [20] { - name: @it:0:0 - } - } - } - } - } - } - } - } - } - } - result: { - IDENT [21] { - name: @ac:0:0 - } - } - } - } - accu_var: @ac:1:0 - accu_init: { - LIST [22] { - elements: { - } - } - } - loop_condition: { - CONSTANT [23] { value: true } - } - loop_step: { - CALL [24] { - function: _+_ - args: { - IDENT [25] { - name: @ac:1:0 - } - LIST [26] { - elements: { - LIST [27] { - elements: { - CALL [28] { - function: _+_ - args: { - IDENT [29] { - name: @it:1:0 - } - IDENT [30] { - name: @it:1:0 - } - } - } - CALL [31] { - function: _+_ - args: { - IDENT [32] { - name: @it:1:0 - } - IDENT [33] { - name: @it:1:0 - } - } - } - } - } - } - } - } - } - } - result: { - IDENT [34] { - name: @ac:1:0 - } - } - } - } -} -Test case: MACRO_SHADOWED_VARIABLE_COMP_V2_1 -Source: [x - y - 1 > 3 ? x - y - 1 : 5].exists(x, y, x - y - 1 > 3) || x - y - 1 > 3 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - CALL [3] { - function: _-_ - args: { - IDENT [4] { - name: x - } - IDENT [5] { - name: y - } - } - } - CALL [6] { - function: _-_ - args: { - IDENT [7] { - name: @index0 - } - CONSTANT [8] { value: 1 } - } - } - CALL [9] { - function: _>_ - args: { - IDENT [10] { - name: @index1 - } - CONSTANT [11] { value: 3 } - } - } - CALL [12] { - function: _?_:_ - args: { - IDENT [13] { - name: @index2 - } - IDENT [14] { - name: @index1 - } - CONSTANT [15] { value: 5 } - } - } - LIST [16] { - elements: { - IDENT [17] { - name: @index3 - } - } - } - } - } - CALL [18] { - function: _||_ - args: { - COMPREHENSION [19] { - iter_var: @it:0:0 - iter_var2: @it2:0:0 - iter_range: { - IDENT [20] { - name: @index4 - } - } - accu_var: @ac:0:0 - accu_init: { - CONSTANT [21] { value: false } - } - loop_condition: { - CALL [22] { - function: @not_strictly_false - args: { - CALL [23] { - function: !_ - args: { - IDENT [24] { - name: @ac:0:0 - } - } - } - } - } - } - loop_step: { - CALL [25] { - function: _||_ - args: { - IDENT [26] { - name: @ac:0:0 - } - CALL [27] { - function: _>_ - args: { - CALL [28] { - function: _-_ - args: { - CALL [29] { - function: _-_ - args: { - IDENT [30] { - name: @it:0:0 - } - IDENT [31] { - name: @it2:0:0 - } - } - } - CONSTANT [32] { value: 1 } - } - } - CONSTANT [33] { value: 3 } - } - } - } - } - } - result: { - IDENT [34] { - name: @ac:0:0 - } - } - } - IDENT [35] { - name: @index2 - } - } - } - } -} -Test case: MACRO_SHADOWED_VARIABLE_COMP_V2_2 -Source: ["foo", "bar"].transformMap(x, y, [x + x, y + y]).transformMap(x, y, [x + x, y + y]) -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - LIST [3] { - elements: { - CONSTANT [4] { value: "foo" } - CONSTANT [5] { value: "bar" } - } - } - } - } - COMPREHENSION [6] { - iter_var: @it:1:0 - iter_var2: @it2:1:0 - iter_range: { - COMPREHENSION [7] { - iter_var: @it:0:0 - iter_var2: @it2:0:0 - iter_range: { - IDENT [8] { - name: @index0 - } - } - accu_var: @ac:0:0 - accu_init: { - MAP [9] { - - } - } - loop_condition: { - CONSTANT [10] { value: true } - } - loop_step: { - CALL [11] { - function: cel.@mapInsert - args: { - IDENT [12] { - name: @ac:0:0 - } - IDENT [13] { - name: @it:0:0 - } - LIST [14] { - elements: { - CALL [15] { - function: _+_ - args: { - IDENT [16] { - name: @it:0:0 - } - IDENT [17] { - name: @it:0:0 - } - } - } - CALL [18] { - function: _+_ - args: { - IDENT [19] { - name: @it2:0:0 - } - IDENT [20] { - name: @it2:0:0 - } - } - } - } - } - } - } - } - result: { - IDENT [21] { - name: @ac:0:0 - } - } - } - } - accu_var: @ac:1:0 - accu_init: { - MAP [22] { - - } - } - loop_condition: { - CONSTANT [23] { value: true } - } - loop_step: { - CALL [24] { - function: cel.@mapInsert - args: { - IDENT [25] { - name: @ac:1:0 - } - IDENT [26] { - name: @it:1:0 - } - LIST [27] { - elements: { - CALL [28] { - function: _+_ - args: { - IDENT [29] { - name: @it:1:0 - } - IDENT [30] { - name: @it:1:0 - } - } - } - CALL [31] { - function: _+_ - args: { - IDENT [32] { - name: @it2:1:0 - } - IDENT [33] { - name: @it2:1:0 - } - } - } - } - } - } - } - } - result: { - IDENT [34] { - name: @ac:1:0 - } - } - } - } -} -Test case: PRESENCE_TEST -Source: has({'a': true}.a) && {'a':true}['a'] -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - MAP [3] { - MAP_ENTRY [4] { - key: { - CONSTANT [5] { value: "a" } - } - value: { - CONSTANT [6] { value: true } - } - } - } - SELECT [7] { - IDENT [8] { - name: @index0 - }.a~presence_test - } - CALL [9] { - function: _[_] - args: { - IDENT [10] { - name: @index0 - } - CONSTANT [11] { value: "a" } - } - } - } - } - CALL [12] { - function: _&&_ - args: { - IDENT [13] { - name: @index1 - } - IDENT [14] { - name: @index2 - } - } - } - } -} -Test case: PRESENCE_TEST_2 -Source: has({'a': true}.a) && has({'a': true}.a) -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - MAP [3] { - MAP_ENTRY [4] { - key: { - CONSTANT [5] { value: "a" } - } - value: { - CONSTANT [6] { value: true } - } - } - } - SELECT [7] { - IDENT [8] { - name: @index0 - }.a~presence_test - } - } - } - CALL [9] { - function: _&&_ - args: { - IDENT [10] { - name: @index1 - } - IDENT [11] { - name: @index1 - } - } - } - } -} -Test case: PRESENCE_TEST_WITH_TERNARY -Source: (has(msg.oneof_type.payload) ? msg.oneof_type.payload.single_int64 : 0) == 10 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - SELECT [3] { - IDENT [4] { - name: msg - }.oneof_type - } - SELECT [5] { - IDENT [6] { - name: @index0 - }.payload~presence_test - } - SELECT [7] { - IDENT [8] { - name: @index0 - }.payload - } - SELECT [9] { - IDENT [10] { - name: @index2 - }.single_int64 - } - CALL [11] { - function: _?_:_ - args: { - IDENT [12] { - name: @index1 - } - IDENT [13] { - name: @index3 - } - CONSTANT [14] { value: 0 } - } - } - } - } - CALL [15] { - function: _==_ - args: { - IDENT [16] { - name: @index4 - } - CONSTANT [17] { value: 10 } - } - } - } -} -Test case: PRESENCE_TEST_WITH_TERNARY_2 -Source: (has(msg.oneof_type.payload) ? msg.oneof_type.payload.single_int64 : msg.oneof_type.payload.single_int64 * 0) == 10 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - SELECT [3] { - IDENT [4] { - name: msg - }.oneof_type - } - SELECT [5] { - IDENT [6] { - name: @index0 - }.payload - } - SELECT [7] { - IDENT [8] { - name: @index1 - }.single_int64 - } - SELECT [9] { - IDENT [10] { - name: @index0 - }.payload~presence_test - } - CALL [11] { - function: _*_ - args: { - IDENT [12] { - name: @index2 - } - CONSTANT [13] { value: 0 } - } - } - CALL [14] { - function: _?_:_ - args: { - IDENT [15] { - name: @index3 - } - IDENT [16] { - name: @index2 - } - IDENT [17] { - name: @index4 - } - } - } - } - } - CALL [18] { - function: _==_ - args: { - IDENT [19] { - name: @index5 - } - CONSTANT [20] { value: 10 } - } - } - } -} -Test case: PRESENCE_TEST_WITH_TERNARY_3 -Source: (has(msg.oneof_type.payload.single_int64) ? msg.oneof_type.payload.single_int64 : msg.oneof_type.payload.single_int64 * 0) == 10 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - SELECT [3] { - IDENT [4] { - name: msg - }.oneof_type - } - SELECT [5] { - IDENT [6] { - name: @index0 - }.payload - } - SELECT [7] { - IDENT [8] { - name: @index1 - }.single_int64 - } - SELECT [9] { - IDENT [10] { - name: @index1 - }.single_int64~presence_test - } - CALL [11] { - function: _*_ - args: { - IDENT [12] { - name: @index2 - } - CONSTANT [13] { value: 0 } - } - } - CALL [14] { - function: _?_:_ - args: { - IDENT [15] { - name: @index3 - } - IDENT [16] { - name: @index2 - } - IDENT [17] { - name: @index4 - } - } - } - } - } - CALL [18] { - function: _==_ - args: { - IDENT [19] { - name: @index5 - } - CONSTANT [20] { value: 10 } - } - } - } -} -Test case: PRESENCE_TEST_WITH_TERNARY_NESTED -Source: (has(msg.oneof_type) && has(msg.oneof_type.payload) && has(msg.oneof_type.payload.single_int64)) ? ((has(msg.oneof_type.payload.map_string_string) && has(msg.oneof_type.payload.map_string_string.key)) ? msg.oneof_type.payload.map_string_string.key == 'A' : false) : false -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - SELECT [3] { - IDENT [4] { - name: msg - }.oneof_type - } - SELECT [5] { - IDENT [6] { - name: @index0 - }.payload - } - SELECT [7] { - IDENT [8] { - name: @index1 - }.map_string_string - } - SELECT [9] { - IDENT [10] { - name: msg - }.oneof_type~presence_test - } - SELECT [11] { - IDENT [12] { - name: @index0 - }.payload~presence_test - } - CALL [13] { - function: _&&_ - args: { - IDENT [14] { - name: @index3 - } - IDENT [15] { - name: @index4 - } - } - } - SELECT [16] { - IDENT [17] { - name: @index1 - }.single_int64~presence_test - } - CALL [18] { - function: _&&_ - args: { - IDENT [19] { - name: @index5 - } - IDENT [20] { - name: @index6 - } - } - } - SELECT [21] { - IDENT [22] { - name: @index1 - }.map_string_string~presence_test - } - SELECT [23] { - IDENT [24] { - name: @index2 - }.key~presence_test - } - CALL [25] { - function: _&&_ - args: { - IDENT [26] { - name: @index8 - } - IDENT [27] { - name: @index9 - } - } - } - SELECT [28] { - IDENT [29] { - name: @index2 - }.key - } - CALL [30] { - function: _==_ - args: { - IDENT [31] { - name: @index11 - } - CONSTANT [32] { value: "A" } - } - } - CALL [33] { - function: _?_:_ - args: { - IDENT [34] { - name: @index10 - } - IDENT [35] { - name: @index12 - } - CONSTANT [36] { value: false } - } - } - } - } - CALL [37] { - function: _?_:_ - args: { - IDENT [38] { - name: @index7 - } - IDENT [39] { - name: @index13 - } - CONSTANT [40] { value: false } - } - } - } -} -Test case: OPTIONAL_LIST -Source: [10, ?optional.none(), [?optional.none(), ?opt_x], [?optional.none(), ?opt_x]] == [10, [5], [5]] -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - CALL [3] { - function: optional.none - args: { - } - } - LIST [4] { - elements: { - IDENT [5] { - name: @index0 - } - IDENT [6] { - name: opt_x - } - } - optional_indices: [0, 1] - } - LIST [7] { - elements: { - CONSTANT [8] { value: 5 } - } - } - LIST [9] { - elements: { - CONSTANT [10] { value: 10 } - IDENT [11] { - name: @index0 - } - IDENT [12] { - name: @index1 - } - IDENT [13] { - name: @index1 - } - } - optional_indices: [0] - } - LIST [14] { - elements: { - CONSTANT [15] { value: 10 } - IDENT [16] { - name: @index2 - } - IDENT [17] { - name: @index2 - } - } - } - } - } - CALL [18] { - function: _==_ - args: { - IDENT [19] { - name: @index3 - } - IDENT [20] { - name: @index4 - } - } - } - } -} -Test case: OPTIONAL_MAP -Source: {?'hello': optional.of('hello')}['hello'] + {?'hello': optional.of('hello')}['hello'] == 'hellohello' -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - CALL [3] { - function: optional.of - args: { - CONSTANT [4] { value: "hello" } - } - } - MAP [5] { - MAP_ENTRY [6] { - key: { - CONSTANT [7] { value: "hello" } - } - optional_entry: true - value: { - IDENT [8] { - name: @index0 - } - } - } - } - CALL [9] { - function: _[_] - args: { - IDENT [10] { - name: @index1 - } - CONSTANT [11] { value: "hello" } - } - } - CALL [12] { - function: _+_ - args: { - IDENT [13] { - name: @index2 - } - IDENT [14] { - name: @index2 - } - } - } - } - } - CALL [15] { - function: _==_ - args: { - IDENT [16] { - name: @index3 - } - CONSTANT [17] { value: "hellohello" } - } - } - } -} -Test case: OPTIONAL_MAP_CHAINED -Source: {?'key': optional.of('test')}[?'bogus'].or({'key': 'test'}[?'bogus']).orValue({'key': 'test'}['key']) == 'test' -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - MAP [3] { - MAP_ENTRY [4] { - key: { - CONSTANT [5] { value: "key" } - } - value: { - CONSTANT [6] { value: "test" } - } - } - } - CALL [7] { - function: optional.of - args: { - CONSTANT [8] { value: "test" } - } - } - MAP [9] { - MAP_ENTRY [10] { - key: { - CONSTANT [11] { value: "key" } - } - optional_entry: true - value: { - IDENT [12] { - name: @index1 - } - } - } - } - CALL [13] { - function: _[?_] - args: { - IDENT [14] { - name: @index2 - } - CONSTANT [15] { value: "bogus" } - } - } - CALL [16] { - function: _[?_] - args: { - IDENT [17] { - name: @index0 - } - CONSTANT [18] { value: "bogus" } - } - } - CALL [19] { - function: or - target: { - IDENT [20] { - name: @index3 - } - } - args: { - IDENT [21] { - name: @index4 - } - } - } - CALL [22] { - function: _[_] - args: { - IDENT [23] { - name: @index0 - } - CONSTANT [24] { value: "key" } - } - } - CALL [25] { - function: orValue - target: { - IDENT [26] { - name: @index5 - } - } - args: { - IDENT [27] { - name: @index6 - } - } - } - } - } - CALL [28] { - function: _==_ - args: { - IDENT [29] { - name: @index7 - } - CONSTANT [30] { value: "test" } - } - } - } -} -Test case: OPTIONAL_MESSAGE -Source: TestAllTypes{?single_int64: optional.ofNonZeroValue(1), ?single_int32: optional.of(4)}.single_int32 + TestAllTypes{?single_int64: optional.ofNonZeroValue(1), ?single_int32: optional.of(4)}.single_int64 == 5 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - CALL [3] { - function: optional.ofNonZeroValue - args: { - CONSTANT [4] { value: 1 } - } - } - CALL [5] { - function: optional.of - args: { - CONSTANT [6] { value: 4 } - } - } - STRUCT [7] { - name: cel.expr.conformance.proto3.TestAllTypes - entries: { - ENTRY [8] { - field_key: single_int64 - optional_entry: true - value: { - IDENT [9] { - name: @index0 - } - } - } - ENTRY [10] { - field_key: single_int32 - optional_entry: true - value: { - IDENT [11] { - name: @index1 - } - } - } - } - } - SELECT [12] { - IDENT [13] { - name: @index2 - }.single_int32 - } - SELECT [14] { - IDENT [15] { - name: @index2 - }.single_int64 - } - CALL [16] { - function: _+_ - args: { - IDENT [17] { - name: @index3 - } - IDENT [18] { - name: @index4 - } - } - } - } - } - CALL [19] { - function: _==_ - args: { - IDENT [20] { - name: @index5 - } - CONSTANT [21] { value: 5 } - } - } - } -} -Test case: CALL -Source: ('h' + 'e' + 'l' + 'l' + 'o' + ' world').matches('h' + 'e' + 'l' + 'l' + 'o') -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - CALL [3] { - function: _+_ - args: { - CONSTANT [4] { value: "h" } - CONSTANT [5] { value: "e" } - } - } - CALL [6] { - function: _+_ - args: { - IDENT [7] { - name: @index0 - } - CONSTANT [8] { value: "l" } - } - } - CALL [9] { - function: _+_ - args: { - IDENT [10] { - name: @index1 - } - CONSTANT [11] { value: "l" } - } - } - CALL [12] { - function: _+_ - args: { - IDENT [13] { - name: @index2 - } - CONSTANT [14] { value: "o" } - } - } - CALL [15] { - function: _+_ - args: { - IDENT [16] { - name: @index3 - } - CONSTANT [17] { value: " world" } - } - } - } - } - CALL [18] { - function: matches - target: { - IDENT [19] { - name: @index4 - } - } - args: { - IDENT [20] { - name: @index3 - } - } - } - } -} -Test case: CALL_ARGUMENT_NESTED_NO_COMMON_SUBEXPR -Source: 'hello world'.matches('h' + 'e' + 'l' + 'l' + 'o') -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - CALL [3] { - function: _+_ - args: { - CONSTANT [4] { value: "h" } - CONSTANT [5] { value: "e" } - } - } - CALL [6] { - function: _+_ - args: { - IDENT [7] { - name: @index0 - } - CONSTANT [8] { value: "l" } - } - } - CALL [9] { - function: _+_ - args: { - IDENT [10] { - name: @index1 - } - CONSTANT [11] { value: "l" } - } - } - CALL [12] { - function: _+_ - args: { - IDENT [13] { - name: @index2 - } - CONSTANT [14] { value: "o" } - } - } - } - } - CALL [15] { - function: matches - target: { - CONSTANT [16] { value: "hello world" } - } - args: { - IDENT [17] { - name: @index3 - } - } - } - } -} -Test case: CALL_TARGET_NESTED_NO_COMMON_SUBEXPR -Source: ('h' + 'e' + 'l' + 'l' + 'o' + ' world').matches('hello') -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - CALL [3] { - function: _+_ - args: { - CONSTANT [4] { value: "h" } - CONSTANT [5] { value: "e" } - } - } - CALL [6] { - function: _+_ - args: { - IDENT [7] { - name: @index0 - } - CONSTANT [8] { value: "l" } - } - } - CALL [9] { - function: _+_ - args: { - IDENT [10] { - name: @index1 - } - CONSTANT [11] { value: "l" } - } - } - CALL [12] { - function: _+_ - args: { - IDENT [13] { - name: @index2 - } - CONSTANT [14] { value: "o" } - } - } - CALL [15] { - function: _+_ - args: { - IDENT [16] { - name: @index3 - } - CONSTANT [17] { value: " world" } - } - } - } - } - CALL [18] { - function: matches - target: { - IDENT [19] { - name: @index4 - } - } - args: { - CONSTANT [20] { value: "hello" } - } - } - } -} -Test case: CALL_BOTH_ARGUMENT_TARGET_NESTED_NO_COMMON_SUBEXPR -Source: ('h' + 'e' + 'l' + 'l' + 'o' + ' world').matches('w' + 'o' + 'r' + 'l' + 'd') -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - CALL [3] { - function: _+_ - args: { - CONSTANT [4] { value: "h" } - CONSTANT [5] { value: "e" } - } - } - CALL [6] { - function: _+_ - args: { - IDENT [7] { - name: @index0 - } - CONSTANT [8] { value: "l" } - } - } - CALL [9] { - function: _+_ - args: { - IDENT [10] { - name: @index1 - } - CONSTANT [11] { value: "l" } - } - } - CALL [12] { - function: _+_ - args: { - IDENT [13] { - name: @index2 - } - CONSTANT [14] { value: "o" } - } - } - CALL [15] { - function: _+_ - args: { - IDENT [16] { - name: @index3 - } - CONSTANT [17] { value: " world" } - } - } - CALL [18] { - function: _+_ - args: { - CONSTANT [19] { value: "w" } - CONSTANT [20] { value: "o" } - } - } - CALL [21] { - function: _+_ - args: { - IDENT [22] { - name: @index5 - } - CONSTANT [23] { value: "r" } - } - } - CALL [24] { - function: _+_ - args: { - IDENT [25] { - name: @index6 - } - CONSTANT [26] { value: "l" } - } - } - CALL [27] { - function: _+_ - args: { - IDENT [28] { - name: @index7 - } - CONSTANT [29] { value: "d" } - } - } - } - } - CALL [30] { - function: matches - target: { - IDENT [31] { - name: @index4 - } - } - args: { - IDENT [32] { - name: @index8 - } - } - } - } -} -Test case: CUSTOM_FUNCTION_INELIMINABLE -Source: non_pure_custom_func(msg.oneof_type.payload.single_int64) + non_pure_custom_func(msg.oneof_type.payload.single_int32) + non_pure_custom_func(msg.oneof_type.payload.single_int64) + non_pure_custom_func(msg.single_int64) -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - SELECT [3] { - IDENT [4] { - name: msg - }.oneof_type - } - SELECT [5] { - IDENT [6] { - name: @index0 - }.payload - } - SELECT [7] { - IDENT [8] { - name: @index1 - }.single_int64 - } - } - } - CALL [9] { - function: _+_ - args: { - CALL [10] { - function: _+_ - args: { - CALL [11] { - function: _+_ - args: { - CALL [12] { - function: non_pure_custom_func - args: { - IDENT [13] { - name: @index2 - } - } - } - CALL [14] { - function: non_pure_custom_func - args: { - SELECT [15] { - IDENT [16] { - name: @index1 - }.single_int32 - } - } - } - } - } - CALL [17] { - function: non_pure_custom_func - args: { - IDENT [18] { - name: @index2 - } - } - } - } - } - CALL [19] { - function: non_pure_custom_func - args: { - SELECT [20] { - IDENT [21] { - name: msg - }.single_int64 - } - } - } - } - } - } -} -Test case: CUSTOM_FUNCTION_ELIMINABLE -Source: pure_custom_func(msg.oneof_type.payload.single_int64) + pure_custom_func(msg.oneof_type.payload.single_int32) + pure_custom_func(msg.oneof_type.payload.single_int64) + pure_custom_func(msg.single_int64) -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - SELECT [3] { - IDENT [4] { - name: msg - }.oneof_type - } - SELECT [5] { - IDENT [6] { - name: @index0 - }.payload - } - SELECT [7] { - IDENT [8] { - name: @index1 - }.single_int64 - } - CALL [9] { - function: pure_custom_func - args: { - IDENT [10] { - name: @index2 - } - } - } - SELECT [11] { - IDENT [12] { - name: @index1 - }.single_int32 - } - CALL [13] { - function: pure_custom_func - args: { - IDENT [14] { - name: @index4 - } - } - } - CALL [15] { - function: _+_ - args: { - IDENT [16] { - name: @index3 - } - IDENT [17] { - name: @index5 - } - } - } - CALL [18] { - function: _+_ - args: { - IDENT [19] { - name: @index6 - } - IDENT [20] { - name: @index3 - } - } - } - SELECT [21] { - IDENT [22] { - name: msg - }.single_int64 - } - CALL [23] { - function: pure_custom_func - args: { - IDENT [24] { - name: @index8 - } - } - } - } - } - CALL [25] { - function: _+_ - args: { - IDENT [26] { - name: @index7 - } - IDENT [27] { - name: @index9 - } - } - } - } -} \ No newline at end of file diff --git a/optimizer/src/test/resources/subexpression_ast_block_recursion_depth_2.baseline b/optimizer/src/test/resources/subexpression_ast_block_recursion_depth_2.baseline deleted file mode 100644 index 317bc87aa..000000000 --- a/optimizer/src/test/resources/subexpression_ast_block_recursion_depth_2.baseline +++ /dev/null @@ -1,5780 +0,0 @@ -Test case: SIZE_1 -Source: size([1,2]) + size([1,2]) + 1 == 5 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - CALL [3] { - function: size - args: { - LIST [4] { - elements: { - CONSTANT [5] { value: 1 } - CONSTANT [6] { value: 2 } - } - } - } - } - CALL [7] { - function: _+_ - args: { - CALL [8] { - function: _+_ - args: { - IDENT [9] { - name: @index0 - } - IDENT [10] { - name: @index0 - } - } - } - CONSTANT [11] { value: 1 } - } - } - } - } - CALL [12] { - function: _==_ - args: { - IDENT [13] { - name: @index1 - } - CONSTANT [14] { value: 5 } - } - } - } -} -Test case: SIZE_2 -Source: 2 + size([1,2]) + size([1,2]) + 1 == 7 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - CALL [3] { - function: size - args: { - LIST [4] { - elements: { - CONSTANT [5] { value: 1 } - CONSTANT [6] { value: 2 } - } - } - } - } - CALL [7] { - function: _+_ - args: { - CALL [8] { - function: _+_ - args: { - CONSTANT [9] { value: 2 } - IDENT [10] { - name: @index0 - } - } - } - IDENT [11] { - name: @index0 - } - } - } - } - } - CALL [12] { - function: _==_ - args: { - CALL [13] { - function: _+_ - args: { - IDENT [14] { - name: @index1 - } - CONSTANT [15] { value: 1 } - } - } - CONSTANT [16] { value: 7 } - } - } - } -} -Test case: SIZE_3 -Source: size([0]) + size([0]) + size([1,2]) + size([1,2]) == 6 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - CALL [3] { - function: size - args: { - LIST [4] { - elements: { - CONSTANT [5] { value: 0 } - } - } - } - } - CALL [6] { - function: size - args: { - LIST [7] { - elements: { - CONSTANT [8] { value: 1 } - CONSTANT [9] { value: 2 } - } - } - } - } - CALL [10] { - function: _+_ - args: { - CALL [11] { - function: _+_ - args: { - IDENT [12] { - name: @index0 - } - IDENT [13] { - name: @index0 - } - } - } - IDENT [14] { - name: @index1 - } - } - } - } - } - CALL [15] { - function: _==_ - args: { - CALL [16] { - function: _+_ - args: { - IDENT [17] { - name: @index2 - } - IDENT [18] { - name: @index1 - } - } - } - CONSTANT [19] { value: 6 } - } - } - } -} -Test case: SIZE_4 -Source: 5 + size([0]) + size([0]) + size([1,2]) + size([1,2]) + size([1,2,3]) + size([1,2,3]) == 17 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - CALL [3] { - function: size - args: { - LIST [4] { - elements: { - CONSTANT [5] { value: 0 } - } - } - } - } - CALL [6] { - function: size - args: { - LIST [7] { - elements: { - CONSTANT [8] { value: 1 } - CONSTANT [9] { value: 2 } - } - } - } - } - CALL [10] { - function: size - args: { - LIST [11] { - elements: { - CONSTANT [12] { value: 1 } - CONSTANT [13] { value: 2 } - CONSTANT [14] { value: 3 } - } - } - } - } - CALL [15] { - function: _+_ - args: { - CALL [16] { - function: _+_ - args: { - CONSTANT [17] { value: 5 } - IDENT [18] { - name: @index0 - } - } - } - IDENT [19] { - name: @index0 - } - } - } - CALL [20] { - function: _+_ - args: { - CALL [21] { - function: _+_ - args: { - IDENT [22] { - name: @index3 - } - IDENT [23] { - name: @index1 - } - } - } - IDENT [24] { - name: @index1 - } - } - } - CALL [25] { - function: _+_ - args: { - CALL [26] { - function: _+_ - args: { - IDENT [27] { - name: @index4 - } - IDENT [28] { - name: @index2 - } - } - } - IDENT [29] { - name: @index2 - } - } - } - } - } - CALL [30] { - function: _==_ - args: { - IDENT [31] { - name: @index5 - } - CONSTANT [32] { value: 17 } - } - } - } -} -Test case: TIMESTAMP -Source: timestamp(int(timestamp(1000000000))).getFullYear() + timestamp(int(timestamp(75))).getFullYear() + timestamp(int(timestamp(50))).getFullYear() + timestamp(int(timestamp(1000000000))).getFullYear() + timestamp(int(timestamp(50))).getSeconds() + timestamp(int(timestamp(200))).getFullYear() + timestamp(int(timestamp(200))).getFullYear() + timestamp(int(timestamp(75))).getMinutes() + timestamp(int(timestamp(1000000000))).getFullYear() == 13934 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - CALL [3] { - function: int - args: { - CALL [4] { - function: timestamp - args: { - CONSTANT [5] { value: 1000000000 } - } - } - } - } - CALL [6] { - function: getFullYear - target: { - CALL [7] { - function: timestamp - args: { - IDENT [8] { - name: @index0 - } - } - } - } - args: { - } - } - CALL [9] { - function: int - args: { - CALL [10] { - function: timestamp - args: { - CONSTANT [11] { value: 50 } - } - } - } - } - CALL [12] { - function: int - args: { - CALL [13] { - function: timestamp - args: { - CONSTANT [14] { value: 200 } - } - } - } - } - CALL [15] { - function: getFullYear - target: { - CALL [16] { - function: timestamp - args: { - IDENT [17] { - name: @index3 - } - } - } - } - args: { - } - } - CALL [18] { - function: int - args: { - CALL [19] { - function: timestamp - args: { - CONSTANT [20] { value: 75 } - } - } - } - } - CALL [21] { - function: timestamp - args: { - IDENT [22] { - name: @index2 - } - } - } - CALL [23] { - function: timestamp - args: { - IDENT [24] { - name: @index5 - } - } - } - CALL [25] { - function: _+_ - args: { - IDENT [26] { - name: @index1 - } - CALL [27] { - function: getFullYear - target: { - IDENT [28] { - name: @index7 - } - } - args: { - } - } - } - } - CALL [29] { - function: _+_ - args: { - IDENT [30] { - name: @index8 - } - CALL [31] { - function: getFullYear - target: { - IDENT [32] { - name: @index6 - } - } - args: { - } - } - } - } - CALL [33] { - function: _+_ - args: { - CALL [34] { - function: _+_ - args: { - IDENT [35] { - name: @index9 - } - IDENT [36] { - name: @index1 - } - } - } - CALL [37] { - function: getSeconds - target: { - IDENT [38] { - name: @index6 - } - } - args: { - } - } - } - } - CALL [39] { - function: _+_ - args: { - CALL [40] { - function: _+_ - args: { - IDENT [41] { - name: @index10 - } - IDENT [42] { - name: @index4 - } - } - } - IDENT [43] { - name: @index4 - } - } - } - CALL [44] { - function: _+_ - args: { - IDENT [45] { - name: @index11 - } - CALL [46] { - function: getMinutes - target: { - IDENT [47] { - name: @index7 - } - } - args: { - } - } - } - } - } - } - CALL [48] { - function: _==_ - args: { - CALL [49] { - function: _+_ - args: { - IDENT [50] { - name: @index12 - } - IDENT [51] { - name: @index1 - } - } - } - CONSTANT [52] { value: 13934 } - } - } - } -} -Test case: MAP_INDEX -Source: {"a": 2}["a"] + {"a": 2}["a"] * {"a": 2}["a"] == 6 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - CALL [3] { - function: _[_] - args: { - MAP [4] { - MAP_ENTRY [5] { - key: { - CONSTANT [6] { value: "a" } - } - value: { - CONSTANT [7] { value: 2 } - } - } - } - CONSTANT [8] { value: "a" } - } - } - CALL [9] { - function: _+_ - args: { - IDENT [10] { - name: @index0 - } - CALL [11] { - function: _*_ - args: { - IDENT [12] { - name: @index0 - } - IDENT [13] { - name: @index0 - } - } - } - } - } - } - } - CALL [14] { - function: _==_ - args: { - IDENT [15] { - name: @index1 - } - CONSTANT [16] { value: 6 } - } - } - } -} -Test case: NESTED_MAP_CONSTRUCTION -Source: {'a': {'b': 1}, 'c': {'b': 1}, 'd': {'e': {'b': 1}}, 'e': {'e': {'b': 1}}} -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - MAP [3] { - MAP_ENTRY [4] { - key: { - CONSTANT [5] { value: "e" } - } - value: { - MAP [6] { - MAP_ENTRY [7] { - key: { - CONSTANT [8] { value: "b" } - } - value: { - CONSTANT [9] { value: 1 } - } - } - } - } - } - } - MAP [10] { - MAP_ENTRY [11] { - key: { - CONSTANT [12] { value: "b" } - } - value: { - CONSTANT [13] { value: 1 } - } - } - } - } - } - MAP [14] { - MAP_ENTRY [15] { - key: { - CONSTANT [16] { value: "a" } - } - value: { - IDENT [17] { - name: @index1 - } - } - } - MAP_ENTRY [18] { - key: { - CONSTANT [19] { value: "c" } - } - value: { - IDENT [20] { - name: @index1 - } - } - } - MAP_ENTRY [21] { - key: { - CONSTANT [22] { value: "d" } - } - value: { - IDENT [23] { - name: @index0 - } - } - } - MAP_ENTRY [24] { - key: { - CONSTANT [25] { value: "e" } - } - value: { - IDENT [26] { - name: @index0 - } - } - } - } - } -} -Test case: NESTED_LIST_CONSTRUCTION -Source: [1, [1,2,3,4], 2, [1,2,3,4], 5, [1,2,3,4], 7, [[1,2], [1,2,3,4]], [1,2]] -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - LIST [3] { - elements: { - CONSTANT [4] { value: 1 } - CONSTANT [5] { value: 2 } - CONSTANT [6] { value: 3 } - CONSTANT [7] { value: 4 } - } - } - LIST [8] { - elements: { - CONSTANT [9] { value: 1 } - CONSTANT [10] { value: 2 } - } - } - } - } - LIST [11] { - elements: { - CONSTANT [12] { value: 1 } - IDENT [13] { - name: @index0 - } - CONSTANT [14] { value: 2 } - IDENT [15] { - name: @index0 - } - CONSTANT [16] { value: 5 } - IDENT [17] { - name: @index0 - } - CONSTANT [18] { value: 7 } - LIST [19] { - elements: { - IDENT [20] { - name: @index1 - } - IDENT [21] { - name: @index0 - } - } - } - IDENT [22] { - name: @index1 - } - } - } - } -} -Test case: SELECT -Source: msg.single_int64 + msg.single_int64 == 6 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - SELECT [3] { - IDENT [4] { - name: msg - }.single_int64 - } - } - } - CALL [5] { - function: _==_ - args: { - CALL [6] { - function: _+_ - args: { - IDENT [7] { - name: @index0 - } - IDENT [8] { - name: @index0 - } - } - } - CONSTANT [9] { value: 6 } - } - } - } -} -Test case: SELECT_NESTED_1 -Source: msg.oneof_type.payload.single_int64 + msg.oneof_type.payload.single_int32 + msg.oneof_type.payload.single_int64 + msg.single_int64 + msg.oneof_type.payload.oneof_type.payload.single_int64 == 31 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - SELECT [3] { - SELECT [4] { - IDENT [5] { - name: msg - }.oneof_type - }.payload - } - SELECT [6] { - IDENT [7] { - name: @index0 - }.single_int64 - } - CALL [8] { - function: _+_ - args: { - IDENT [9] { - name: @index1 - } - SELECT [10] { - IDENT [11] { - name: @index0 - }.single_int32 - } - } - } - CALL [12] { - function: _+_ - args: { - CALL [13] { - function: _+_ - args: { - IDENT [14] { - name: @index2 - } - IDENT [15] { - name: @index1 - } - } - } - SELECT [16] { - IDENT [17] { - name: msg - }.single_int64 - } - } - } - SELECT [18] { - SELECT [19] { - IDENT [20] { - name: @index0 - }.oneof_type - }.payload - } - CALL [21] { - function: _+_ - args: { - IDENT [22] { - name: @index3 - } - SELECT [23] { - IDENT [24] { - name: @index4 - }.single_int64 - } - } - } - } - } - CALL [25] { - function: _==_ - args: { - IDENT [26] { - name: @index5 - } - CONSTANT [27] { value: 31 } - } - } - } -} -Test case: SELECT_NESTED_2 -Source: true || msg.oneof_type.payload.oneof_type.payload.oneof_type.payload.oneof_type.payload.single_bool || msg.oneof_type.payload.oneof_type.payload.oneof_type.child.child.payload.single_bool -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - SELECT [3] { - SELECT [4] { - IDENT [5] { - name: msg - }.oneof_type - }.payload - } - SELECT [6] { - SELECT [7] { - IDENT [8] { - name: @index0 - }.oneof_type - }.payload - } - SELECT [9] { - IDENT [10] { - name: @index1 - }.oneof_type - } - SELECT [11] { - SELECT [12] { - IDENT [13] { - name: @index2 - }.payload - }.oneof_type - } - SELECT [14] { - SELECT [15] { - IDENT [16] { - name: @index3 - }.payload - }.single_bool - } - SELECT [17] { - SELECT [18] { - IDENT [19] { - name: @index2 - }.child - }.child - } - SELECT [20] { - SELECT [21] { - IDENT [22] { - name: @index5 - }.payload - }.single_bool - } - } - } - CALL [23] { - function: _||_ - args: { - CALL [24] { - function: _||_ - args: { - CONSTANT [25] { value: true } - IDENT [26] { - name: @index4 - } - } - } - IDENT [27] { - name: @index6 - } - } - } - } -} -Test case: SELECT_NESTED_MESSAGE_MAP_INDEX_1 -Source: msg.oneof_type.payload.map_int32_int64[1] + msg.oneof_type.payload.map_int32_int64[1] + msg.oneof_type.payload.map_int32_int64[1] == 15 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - SELECT [3] { - SELECT [4] { - IDENT [5] { - name: msg - }.oneof_type - }.payload - } - CALL [6] { - function: _[_] - args: { - SELECT [7] { - IDENT [8] { - name: @index0 - }.map_int32_int64 - } - CONSTANT [9] { value: 1 } - } - } - CALL [10] { - function: _+_ - args: { - CALL [11] { - function: _+_ - args: { - IDENT [12] { - name: @index1 - } - IDENT [13] { - name: @index1 - } - } - } - IDENT [14] { - name: @index1 - } - } - } - } - } - CALL [15] { - function: _==_ - args: { - IDENT [16] { - name: @index2 - } - CONSTANT [17] { value: 15 } - } - } - } -} -Test case: SELECT_NESTED_MESSAGE_MAP_INDEX_2 -Source: msg.oneof_type.payload.map_int32_int64[0] + msg.oneof_type.payload.map_int32_int64[1] + msg.oneof_type.payload.map_int32_int64[2] == 8 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - SELECT [3] { - SELECT [4] { - IDENT [5] { - name: msg - }.oneof_type - }.payload - } - SELECT [6] { - IDENT [7] { - name: @index0 - }.map_int32_int64 - } - CALL [8] { - function: _+_ - args: { - CALL [9] { - function: _[_] - args: { - IDENT [10] { - name: @index1 - } - CONSTANT [11] { value: 0 } - } - } - CALL [12] { - function: _[_] - args: { - IDENT [13] { - name: @index1 - } - CONSTANT [14] { value: 1 } - } - } - } - } - CALL [15] { - function: _+_ - args: { - IDENT [16] { - name: @index2 - } - CALL [17] { - function: _[_] - args: { - IDENT [18] { - name: @index1 - } - CONSTANT [19] { value: 2 } - } - } - } - } - } - } - CALL [20] { - function: _==_ - args: { - IDENT [21] { - name: @index3 - } - CONSTANT [22] { value: 8 } - } - } - } -} -Test case: SELECT_NESTED_NO_COMMON_SUBEXPR -Source: msg.oneof_type.payload.oneof_type.payload.oneof_type.payload.oneof_type.payload.single_int64 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - SELECT [3] { - SELECT [4] { - IDENT [5] { - name: msg - }.oneof_type - }.payload - } - SELECT [6] { - SELECT [7] { - IDENT [8] { - name: @index0 - }.oneof_type - }.payload - } - SELECT [9] { - SELECT [10] { - IDENT [11] { - name: @index1 - }.oneof_type - }.payload - } - SELECT [12] { - SELECT [13] { - IDENT [14] { - name: @index2 - }.oneof_type - }.payload - } - } - } - SELECT [15] { - IDENT [16] { - name: @index3 - }.single_int64 - } - } -} -Test case: TERNARY -Source: (msg.single_int64 > 0 ? msg.single_int64 : 0) == 3 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - SELECT [3] { - IDENT [4] { - name: msg - }.single_int64 - } - CALL [5] { - function: _?_:_ - args: { - CALL [6] { - function: _>_ - args: { - IDENT [7] { - name: @index0 - } - CONSTANT [8] { value: 0 } - } - } - IDENT [9] { - name: @index0 - } - CONSTANT [10] { value: 0 } - } - } - } - } - CALL [11] { - function: _==_ - args: { - IDENT [12] { - name: @index1 - } - CONSTANT [13] { value: 3 } - } - } - } -} -Test case: TERNARY_BIND_RHS_ONLY -Source: false ? false : (msg.single_int64) + ((msg.single_int64 + 1) * 2) == 11 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - SELECT [3] { - IDENT [4] { - name: msg - }.single_int64 - } - CALL [5] { - function: _*_ - args: { - CALL [6] { - function: _+_ - args: { - IDENT [7] { - name: @index0 - } - CONSTANT [8] { value: 1 } - } - } - CONSTANT [9] { value: 2 } - } - } - CALL [10] { - function: _==_ - args: { - CALL [11] { - function: _+_ - args: { - IDENT [12] { - name: @index0 - } - IDENT [13] { - name: @index1 - } - } - } - CONSTANT [14] { value: 11 } - } - } - } - } - CALL [15] { - function: _?_:_ - args: { - CONSTANT [16] { value: false } - CONSTANT [17] { value: false } - IDENT [18] { - name: @index2 - } - } - } - } -} -Test case: NESTED_TERNARY -Source: (msg.single_int64 > 0 ? (msg.single_int32 > 0 ? msg.single_int64 + msg.single_int32 : 0) : 0) == 8 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - SELECT [3] { - IDENT [4] { - name: msg - }.single_int64 - } - SELECT [5] { - IDENT [6] { - name: msg - }.single_int32 - } - CALL [7] { - function: _?_:_ - args: { - CALL [8] { - function: _>_ - args: { - IDENT [9] { - name: @index1 - } - CONSTANT [10] { value: 0 } - } - } - CALL [11] { - function: _+_ - args: { - IDENT [12] { - name: @index0 - } - IDENT [13] { - name: @index1 - } - } - } - CONSTANT [14] { value: 0 } - } - } - CALL [15] { - function: _?_:_ - args: { - CALL [16] { - function: _>_ - args: { - IDENT [17] { - name: @index0 - } - CONSTANT [18] { value: 0 } - } - } - IDENT [19] { - name: @index2 - } - CONSTANT [20] { value: 0 } - } - } - } - } - CALL [21] { - function: _==_ - args: { - IDENT [22] { - name: @index3 - } - CONSTANT [23] { value: 8 } - } - } - } -} -Test case: MULTIPLE_MACROS_1 -Source: size([[1].exists(i, i > 0)]) + size([[1].exists(j, j > 0)]) + size([[2].exists(k, k > 1)]) + size([[2].exists(l, l > 1)]) == 4 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - LIST [3] { - elements: { - CONSTANT [4] { value: 1 } - } - } - LIST [5] { - elements: { - CONSTANT [6] { value: 2 } - } - } - } - } - CALL [7] { - function: _==_ - args: { - CALL [8] { - function: _+_ - args: { - CALL [9] { - function: _+_ - args: { - CALL [10] { - function: _+_ - args: { - CALL [11] { - function: size - args: { - LIST [12] { - elements: { - COMPREHENSION [13] { - iter_var: @it:0:0 - iter_range: { - IDENT [14] { - name: @index0 - } - } - accu_var: @ac:0:0 - accu_init: { - CONSTANT [15] { value: false } - } - loop_condition: { - CALL [16] { - function: @not_strictly_false - args: { - CALL [17] { - function: !_ - args: { - IDENT [18] { - name: @ac:0:0 - } - } - } - } - } - } - loop_step: { - CALL [19] { - function: _||_ - args: { - IDENT [20] { - name: @ac:0:0 - } - CALL [21] { - function: _>_ - args: { - IDENT [22] { - name: @it:0:0 - } - CONSTANT [23] { value: 0 } - } - } - } - } - } - result: { - IDENT [24] { - name: @ac:0:0 - } - } - } - } - } - } - } - CALL [25] { - function: size - args: { - LIST [26] { - elements: { - COMPREHENSION [27] { - iter_var: @it:0:0 - iter_range: { - IDENT [28] { - name: @index0 - } - } - accu_var: @ac:0:0 - accu_init: { - CONSTANT [29] { value: false } - } - loop_condition: { - CALL [30] { - function: @not_strictly_false - args: { - CALL [31] { - function: !_ - args: { - IDENT [32] { - name: @ac:0:0 - } - } - } - } - } - } - loop_step: { - CALL [33] { - function: _||_ - args: { - IDENT [34] { - name: @ac:0:0 - } - CALL [35] { - function: _>_ - args: { - IDENT [36] { - name: @it:0:0 - } - CONSTANT [37] { value: 0 } - } - } - } - } - } - result: { - IDENT [38] { - name: @ac:0:0 - } - } - } - } - } - } - } - } - } - CALL [39] { - function: size - args: { - LIST [40] { - elements: { - COMPREHENSION [41] { - iter_var: @it:0:0 - iter_range: { - IDENT [42] { - name: @index1 - } - } - accu_var: @ac:0:0 - accu_init: { - CONSTANT [43] { value: false } - } - loop_condition: { - CALL [44] { - function: @not_strictly_false - args: { - CALL [45] { - function: !_ - args: { - IDENT [46] { - name: @ac:0:0 - } - } - } - } - } - } - loop_step: { - CALL [47] { - function: _||_ - args: { - IDENT [48] { - name: @ac:0:0 - } - CALL [49] { - function: _>_ - args: { - IDENT [50] { - name: @it:0:0 - } - CONSTANT [51] { value: 1 } - } - } - } - } - } - result: { - IDENT [52] { - name: @ac:0:0 - } - } - } - } - } - } - } - } - } - CALL [53] { - function: size - args: { - LIST [54] { - elements: { - COMPREHENSION [55] { - iter_var: @it:0:0 - iter_range: { - IDENT [56] { - name: @index1 - } - } - accu_var: @ac:0:0 - accu_init: { - CONSTANT [57] { value: false } - } - loop_condition: { - CALL [58] { - function: @not_strictly_false - args: { - CALL [59] { - function: !_ - args: { - IDENT [60] { - name: @ac:0:0 - } - } - } - } - } - } - loop_step: { - CALL [61] { - function: _||_ - args: { - IDENT [62] { - name: @ac:0:0 - } - CALL [63] { - function: _>_ - args: { - IDENT [64] { - name: @it:0:0 - } - CONSTANT [65] { value: 1 } - } - } - } - } - } - result: { - IDENT [66] { - name: @ac:0:0 - } - } - } - } - } - } - } - } - } - CONSTANT [67] { value: 4 } - } - } - } -} -Test case: MULTIPLE_MACROS_2 -Source: [[1].exists(i, i > 0)] + [[1].exists(j, j > 0)] + [['a'].exists(k, k == 'a')] + [['a'].exists(l, l == 'a')] == [true, true, true, true] -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - LIST [3] { - elements: { - CONSTANT [4] { value: 1 } - } - } - LIST [5] { - elements: { - CONSTANT [6] { value: "a" } - } - } - LIST [7] { - elements: { - CONSTANT [8] { value: true } - CONSTANT [9] { value: true } - CONSTANT [10] { value: true } - CONSTANT [11] { value: true } - } - } - } - } - CALL [12] { - function: _==_ - args: { - CALL [13] { - function: _+_ - args: { - CALL [14] { - function: _+_ - args: { - CALL [15] { - function: _+_ - args: { - LIST [16] { - elements: { - COMPREHENSION [17] { - iter_var: @it:0:0 - iter_range: { - IDENT [18] { - name: @index0 - } - } - accu_var: @ac:0:0 - accu_init: { - CONSTANT [19] { value: false } - } - loop_condition: { - CALL [20] { - function: @not_strictly_false - args: { - CALL [21] { - function: !_ - args: { - IDENT [22] { - name: @ac:0:0 - } - } - } - } - } - } - loop_step: { - CALL [23] { - function: _||_ - args: { - IDENT [24] { - name: @ac:0:0 - } - CALL [25] { - function: _>_ - args: { - IDENT [26] { - name: @it:0:0 - } - CONSTANT [27] { value: 0 } - } - } - } - } - } - result: { - IDENT [28] { - name: @ac:0:0 - } - } - } - } - } - LIST [29] { - elements: { - COMPREHENSION [30] { - iter_var: @it:0:0 - iter_range: { - IDENT [31] { - name: @index0 - } - } - accu_var: @ac:0:0 - accu_init: { - CONSTANT [32] { value: false } - } - loop_condition: { - CALL [33] { - function: @not_strictly_false - args: { - CALL [34] { - function: !_ - args: { - IDENT [35] { - name: @ac:0:0 - } - } - } - } - } - } - loop_step: { - CALL [36] { - function: _||_ - args: { - IDENT [37] { - name: @ac:0:0 - } - CALL [38] { - function: _>_ - args: { - IDENT [39] { - name: @it:0:0 - } - CONSTANT [40] { value: 0 } - } - } - } - } - } - result: { - IDENT [41] { - name: @ac:0:0 - } - } - } - } - } - } - } - LIST [42] { - elements: { - COMPREHENSION [43] { - iter_var: @it:0:1 - iter_range: { - IDENT [44] { - name: @index1 - } - } - accu_var: @ac:0:1 - accu_init: { - CONSTANT [45] { value: false } - } - loop_condition: { - CALL [46] { - function: @not_strictly_false - args: { - CALL [47] { - function: !_ - args: { - IDENT [48] { - name: @ac:0:1 - } - } - } - } - } - } - loop_step: { - CALL [49] { - function: _||_ - args: { - IDENT [50] { - name: @ac:0:1 - } - CALL [51] { - function: _==_ - args: { - IDENT [52] { - name: @it:0:1 - } - CONSTANT [53] { value: "a" } - } - } - } - } - } - result: { - IDENT [54] { - name: @ac:0:1 - } - } - } - } - } - } - } - LIST [55] { - elements: { - COMPREHENSION [56] { - iter_var: @it:0:1 - iter_range: { - IDENT [57] { - name: @index1 - } - } - accu_var: @ac:0:1 - accu_init: { - CONSTANT [58] { value: false } - } - loop_condition: { - CALL [59] { - function: @not_strictly_false - args: { - CALL [60] { - function: !_ - args: { - IDENT [61] { - name: @ac:0:1 - } - } - } - } - } - } - loop_step: { - CALL [62] { - function: _||_ - args: { - IDENT [63] { - name: @ac:0:1 - } - CALL [64] { - function: _==_ - args: { - IDENT [65] { - name: @it:0:1 - } - CONSTANT [66] { value: "a" } - } - } - } - } - } - result: { - IDENT [67] { - name: @ac:0:1 - } - } - } - } - } - } - } - IDENT [68] { - name: @index2 - } - } - } - } -} -Test case: MULTIPLE_MACROS_3 -Source: [1].exists(i, i > 0) && [1].exists(j, j > 0) && [1].exists(k, k > 1) && [2].exists(l, l > 1) -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - LIST [3] { - elements: { - CONSTANT [4] { value: 1 } - } - } - LIST [5] { - elements: { - CONSTANT [6] { value: 2 } - } - } - } - } - CALL [7] { - function: _&&_ - args: { - CALL [8] { - function: _&&_ - args: { - COMPREHENSION [9] { - iter_var: @it:0:0 - iter_range: { - IDENT [10] { - name: @index0 - } - } - accu_var: @ac:0:0 - accu_init: { - CONSTANT [11] { value: false } - } - loop_condition: { - CALL [12] { - function: @not_strictly_false - args: { - CALL [13] { - function: !_ - args: { - IDENT [14] { - name: @ac:0:0 - } - } - } - } - } - } - loop_step: { - CALL [15] { - function: _||_ - args: { - IDENT [16] { - name: @ac:0:0 - } - CALL [17] { - function: _>_ - args: { - IDENT [18] { - name: @it:0:0 - } - CONSTANT [19] { value: 0 } - } - } - } - } - } - result: { - IDENT [20] { - name: @ac:0:0 - } - } - } - COMPREHENSION [21] { - iter_var: @it:0:0 - iter_range: { - IDENT [22] { - name: @index0 - } - } - accu_var: @ac:0:0 - accu_init: { - CONSTANT [23] { value: false } - } - loop_condition: { - CALL [24] { - function: @not_strictly_false - args: { - CALL [25] { - function: !_ - args: { - IDENT [26] { - name: @ac:0:0 - } - } - } - } - } - } - loop_step: { - CALL [27] { - function: _||_ - args: { - IDENT [28] { - name: @ac:0:0 - } - CALL [29] { - function: _>_ - args: { - IDENT [30] { - name: @it:0:0 - } - CONSTANT [31] { value: 0 } - } - } - } - } - } - result: { - IDENT [32] { - name: @ac:0:0 - } - } - } - } - } - CALL [33] { - function: _&&_ - args: { - COMPREHENSION [34] { - iter_var: @it:0:0 - iter_range: { - IDENT [35] { - name: @index0 - } - } - accu_var: @ac:0:0 - accu_init: { - CONSTANT [36] { value: false } - } - loop_condition: { - CALL [37] { - function: @not_strictly_false - args: { - CALL [38] { - function: !_ - args: { - IDENT [39] { - name: @ac:0:0 - } - } - } - } - } - } - loop_step: { - CALL [40] { - function: _||_ - args: { - IDENT [41] { - name: @ac:0:0 - } - CALL [42] { - function: _>_ - args: { - IDENT [43] { - name: @it:0:0 - } - CONSTANT [44] { value: 1 } - } - } - } - } - } - result: { - IDENT [45] { - name: @ac:0:0 - } - } - } - COMPREHENSION [46] { - iter_var: @it:0:0 - iter_range: { - IDENT [47] { - name: @index1 - } - } - accu_var: @ac:0:0 - accu_init: { - CONSTANT [48] { value: false } - } - loop_condition: { - CALL [49] { - function: @not_strictly_false - args: { - CALL [50] { - function: !_ - args: { - IDENT [51] { - name: @ac:0:0 - } - } - } - } - } - } - loop_step: { - CALL [52] { - function: _||_ - args: { - IDENT [53] { - name: @ac:0:0 - } - CALL [54] { - function: _>_ - args: { - IDENT [55] { - name: @it:0:0 - } - CONSTANT [56] { value: 1 } - } - } - } - } - } - result: { - IDENT [57] { - name: @ac:0:0 - } - } - } - } - } - } - } - } -} -Test case: MULTIPLE_MACROS_COMP_V2_1 -Source: size([[1].exists(i,x,i > 0 && x >= 0)]) + size([[1].exists(j, y, j > 0 && y >= 0)]) + size([[2].exists(k,z,k > 1 && z >= 0)]) + size([[2].exists(l, w, l > 1 && w >= 0)]) == 4 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - LIST [3] { - elements: { - CONSTANT [4] { value: 1 } - } - } - LIST [5] { - elements: { - CONSTANT [6] { value: 2 } - } - } - } - } - CALL [7] { - function: _==_ - args: { - CALL [8] { - function: _+_ - args: { - CALL [9] { - function: _+_ - args: { - CALL [10] { - function: _+_ - args: { - CALL [11] { - function: size - args: { - LIST [12] { - elements: { - COMPREHENSION [13] { - iter_var: @it:0:0 - iter_var2: @it2:0:0 - iter_range: { - IDENT [14] { - name: @index0 - } - } - accu_var: @ac:0:0 - accu_init: { - CONSTANT [15] { value: false } - } - loop_condition: { - CALL [16] { - function: @not_strictly_false - args: { - CALL [17] { - function: !_ - args: { - IDENT [18] { - name: @ac:0:0 - } - } - } - } - } - } - loop_step: { - CALL [19] { - function: _||_ - args: { - IDENT [20] { - name: @ac:0:0 - } - CALL [21] { - function: _&&_ - args: { - CALL [22] { - function: _>_ - args: { - IDENT [23] { - name: @it:0:0 - } - CONSTANT [24] { value: 0 } - } - } - CALL [25] { - function: _>=_ - args: { - IDENT [26] { - name: @it2:0:0 - } - CONSTANT [27] { value: 0 } - } - } - } - } - } - } - } - result: { - IDENT [28] { - name: @ac:0:0 - } - } - } - } - } - } - } - CALL [29] { - function: size - args: { - LIST [30] { - elements: { - COMPREHENSION [31] { - iter_var: @it:0:0 - iter_var2: @it2:0:0 - iter_range: { - IDENT [32] { - name: @index0 - } - } - accu_var: @ac:0:0 - accu_init: { - CONSTANT [33] { value: false } - } - loop_condition: { - CALL [34] { - function: @not_strictly_false - args: { - CALL [35] { - function: !_ - args: { - IDENT [36] { - name: @ac:0:0 - } - } - } - } - } - } - loop_step: { - CALL [37] { - function: _||_ - args: { - IDENT [38] { - name: @ac:0:0 - } - CALL [39] { - function: _&&_ - args: { - CALL [40] { - function: _>_ - args: { - IDENT [41] { - name: @it:0:0 - } - CONSTANT [42] { value: 0 } - } - } - CALL [43] { - function: _>=_ - args: { - IDENT [44] { - name: @it2:0:0 - } - CONSTANT [45] { value: 0 } - } - } - } - } - } - } - } - result: { - IDENT [46] { - name: @ac:0:0 - } - } - } - } - } - } - } - } - } - CALL [47] { - function: size - args: { - LIST [48] { - elements: { - COMPREHENSION [49] { - iter_var: @it:0:0 - iter_var2: @it2:0:0 - iter_range: { - IDENT [50] { - name: @index1 - } - } - accu_var: @ac:0:0 - accu_init: { - CONSTANT [51] { value: false } - } - loop_condition: { - CALL [52] { - function: @not_strictly_false - args: { - CALL [53] { - function: !_ - args: { - IDENT [54] { - name: @ac:0:0 - } - } - } - } - } - } - loop_step: { - CALL [55] { - function: _||_ - args: { - IDENT [56] { - name: @ac:0:0 - } - CALL [57] { - function: _&&_ - args: { - CALL [58] { - function: _>_ - args: { - IDENT [59] { - name: @it:0:0 - } - CONSTANT [60] { value: 1 } - } - } - CALL [61] { - function: _>=_ - args: { - IDENT [62] { - name: @it2:0:0 - } - CONSTANT [63] { value: 0 } - } - } - } - } - } - } - } - result: { - IDENT [64] { - name: @ac:0:0 - } - } - } - } - } - } - } - } - } - CALL [65] { - function: size - args: { - LIST [66] { - elements: { - COMPREHENSION [67] { - iter_var: @it:0:0 - iter_var2: @it2:0:0 - iter_range: { - IDENT [68] { - name: @index1 - } - } - accu_var: @ac:0:0 - accu_init: { - CONSTANT [69] { value: false } - } - loop_condition: { - CALL [70] { - function: @not_strictly_false - args: { - CALL [71] { - function: !_ - args: { - IDENT [72] { - name: @ac:0:0 - } - } - } - } - } - } - loop_step: { - CALL [73] { - function: _||_ - args: { - IDENT [74] { - name: @ac:0:0 - } - CALL [75] { - function: _&&_ - args: { - CALL [76] { - function: _>_ - args: { - IDENT [77] { - name: @it:0:0 - } - CONSTANT [78] { value: 1 } - } - } - CALL [79] { - function: _>=_ - args: { - IDENT [80] { - name: @it2:0:0 - } - CONSTANT [81] { value: 0 } - } - } - } - } - } - } - } - result: { - IDENT [82] { - name: @ac:0:0 - } - } - } - } - } - } - } - } - } - CONSTANT [83] { value: 4 } - } - } - } -} -Test case: MULTIPLE_MACROS_COMP_V2_2 -Source: [1].exists(i, x, i > 0 && x > 0) && [1].exists(j, y, j > 0 && y > 0) && [1].exists(k, z, k > 1 && z > 0) && [2].exists(l, w, l > 1 && w > 0) -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - LIST [3] { - elements: { - CONSTANT [4] { value: 1 } - } - } - LIST [5] { - elements: { - CONSTANT [6] { value: 2 } - } - } - } - } - CALL [7] { - function: _&&_ - args: { - CALL [8] { - function: _&&_ - args: { - COMPREHENSION [9] { - iter_var: @it:0:0 - iter_var2: @it2:0:0 - iter_range: { - IDENT [10] { - name: @index0 - } - } - accu_var: @ac:0:0 - accu_init: { - CONSTANT [11] { value: false } - } - loop_condition: { - CALL [12] { - function: @not_strictly_false - args: { - CALL [13] { - function: !_ - args: { - IDENT [14] { - name: @ac:0:0 - } - } - } - } - } - } - loop_step: { - CALL [15] { - function: _||_ - args: { - IDENT [16] { - name: @ac:0:0 - } - CALL [17] { - function: _&&_ - args: { - CALL [18] { - function: _>_ - args: { - IDENT [19] { - name: @it:0:0 - } - CONSTANT [20] { value: 0 } - } - } - CALL [21] { - function: _>_ - args: { - IDENT [22] { - name: @it2:0:0 - } - CONSTANT [23] { value: 0 } - } - } - } - } - } - } - } - result: { - IDENT [24] { - name: @ac:0:0 - } - } - } - COMPREHENSION [25] { - iter_var: @it:0:0 - iter_var2: @it2:0:0 - iter_range: { - IDENT [26] { - name: @index0 - } - } - accu_var: @ac:0:0 - accu_init: { - CONSTANT [27] { value: false } - } - loop_condition: { - CALL [28] { - function: @not_strictly_false - args: { - CALL [29] { - function: !_ - args: { - IDENT [30] { - name: @ac:0:0 - } - } - } - } - } - } - loop_step: { - CALL [31] { - function: _||_ - args: { - IDENT [32] { - name: @ac:0:0 - } - CALL [33] { - function: _&&_ - args: { - CALL [34] { - function: _>_ - args: { - IDENT [35] { - name: @it:0:0 - } - CONSTANT [36] { value: 0 } - } - } - CALL [37] { - function: _>_ - args: { - IDENT [38] { - name: @it2:0:0 - } - CONSTANT [39] { value: 0 } - } - } - } - } - } - } - } - result: { - IDENT [40] { - name: @ac:0:0 - } - } - } - } - } - CALL [41] { - function: _&&_ - args: { - COMPREHENSION [42] { - iter_var: @it:0:0 - iter_var2: @it2:0:0 - iter_range: { - IDENT [43] { - name: @index0 - } - } - accu_var: @ac:0:0 - accu_init: { - CONSTANT [44] { value: false } - } - loop_condition: { - CALL [45] { - function: @not_strictly_false - args: { - CALL [46] { - function: !_ - args: { - IDENT [47] { - name: @ac:0:0 - } - } - } - } - } - } - loop_step: { - CALL [48] { - function: _||_ - args: { - IDENT [49] { - name: @ac:0:0 - } - CALL [50] { - function: _&&_ - args: { - CALL [51] { - function: _>_ - args: { - IDENT [52] { - name: @it:0:0 - } - CONSTANT [53] { value: 1 } - } - } - CALL [54] { - function: _>_ - args: { - IDENT [55] { - name: @it2:0:0 - } - CONSTANT [56] { value: 0 } - } - } - } - } - } - } - } - result: { - IDENT [57] { - name: @ac:0:0 - } - } - } - COMPREHENSION [58] { - iter_var: @it:0:0 - iter_var2: @it2:0:0 - iter_range: { - IDENT [59] { - name: @index1 - } - } - accu_var: @ac:0:0 - accu_init: { - CONSTANT [60] { value: false } - } - loop_condition: { - CALL [61] { - function: @not_strictly_false - args: { - CALL [62] { - function: !_ - args: { - IDENT [63] { - name: @ac:0:0 - } - } - } - } - } - } - loop_step: { - CALL [64] { - function: _||_ - args: { - IDENT [65] { - name: @ac:0:0 - } - CALL [66] { - function: _&&_ - args: { - CALL [67] { - function: _>_ - args: { - IDENT [68] { - name: @it:0:0 - } - CONSTANT [69] { value: 1 } - } - } - CALL [70] { - function: _>_ - args: { - IDENT [71] { - name: @it2:0:0 - } - CONSTANT [72] { value: 0 } - } - } - } - } - } - } - } - result: { - IDENT [73] { - name: @ac:0:0 - } - } - } - } - } - } - } - } -} -Test case: NESTED_MACROS -Source: [1,2,3].map(i, [1, 2, 3].map(i, i + 1)) == [[2, 3, 4], [2, 3, 4], [2, 3, 4]] -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - LIST [3] { - elements: { - CONSTANT [4] { value: 1 } - CONSTANT [5] { value: 2 } - CONSTANT [6] { value: 3 } - } - } - LIST [7] { - elements: { - CONSTANT [8] { value: 2 } - CONSTANT [9] { value: 3 } - CONSTANT [10] { value: 4 } - } - } - LIST [11] { - elements: { - IDENT [12] { - name: @index1 - } - IDENT [13] { - name: @index1 - } - IDENT [14] { - name: @index1 - } - } - } - } - } - CALL [15] { - function: _==_ - args: { - COMPREHENSION [16] { - iter_var: @it:1:0 - iter_range: { - IDENT [17] { - name: @index0 - } - } - accu_var: @ac:1:0 - accu_init: { - LIST [18] { - elements: { - } - } - } - loop_condition: { - CONSTANT [19] { value: true } - } - loop_step: { - CALL [20] { - function: _+_ - args: { - IDENT [21] { - name: @ac:1:0 - } - LIST [22] { - elements: { - COMPREHENSION [23] { - iter_var: @it:0:0 - iter_range: { - IDENT [24] { - name: @index0 - } - } - accu_var: @ac:0:0 - accu_init: { - LIST [25] { - elements: { - } - } - } - loop_condition: { - CONSTANT [26] { value: true } - } - loop_step: { - CALL [27] { - function: _+_ - args: { - IDENT [28] { - name: @ac:0:0 - } - LIST [29] { - elements: { - CALL [30] { - function: _+_ - args: { - IDENT [31] { - name: @it:0:0 - } - CONSTANT [32] { value: 1 } - } - } - } - } - } - } - } - result: { - IDENT [33] { - name: @ac:0:0 - } - } - } - } - } - } - } - } - result: { - IDENT [34] { - name: @ac:1:0 - } - } - } - IDENT [35] { - name: @index2 - } - } - } - } -} -Test case: NESTED_MACROS_2 -Source: [1, 2].map(y, [1, 2, 3].filter(x, x == y)) == [[1], [2]] -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - LIST [3] { - elements: { - LIST [4] { - elements: { - CONSTANT [5] { value: 1 } - } - } - LIST [6] { - elements: { - CONSTANT [7] { value: 2 } - } - } - } - } - LIST [8] { - elements: { - CONSTANT [9] { value: 1 } - CONSTANT [10] { value: 2 } - } - } - LIST [11] { - elements: { - CONSTANT [12] { value: 1 } - CONSTANT [13] { value: 2 } - CONSTANT [14] { value: 3 } - } - } - } - } - CALL [15] { - function: _==_ - args: { - COMPREHENSION [16] { - iter_var: @it:1:0 - iter_range: { - IDENT [17] { - name: @index1 - } - } - accu_var: @ac:1:0 - accu_init: { - LIST [18] { - elements: { - } - } - } - loop_condition: { - CONSTANT [19] { value: true } - } - loop_step: { - CALL [20] { - function: _+_ - args: { - IDENT [21] { - name: @ac:1:0 - } - LIST [22] { - elements: { - COMPREHENSION [23] { - iter_var: @it:0:0 - iter_range: { - IDENT [24] { - name: @index2 - } - } - accu_var: @ac:0:0 - accu_init: { - LIST [25] { - elements: { - } - } - } - loop_condition: { - CONSTANT [26] { value: true } - } - loop_step: { - CALL [27] { - function: _?_:_ - args: { - CALL [28] { - function: _==_ - args: { - IDENT [29] { - name: @it:0:0 - } - IDENT [30] { - name: @it:1:0 - } - } - } - CALL [31] { - function: _+_ - args: { - IDENT [32] { - name: @ac:0:0 - } - LIST [33] { - elements: { - IDENT [34] { - name: @it:0:0 - } - } - } - } - } - IDENT [35] { - name: @ac:0:0 - } - } - } - } - result: { - IDENT [36] { - name: @ac:0:0 - } - } - } - } - } - } - } - } - result: { - IDENT [37] { - name: @ac:1:0 - } - } - } - IDENT [38] { - name: @index0 - } - } - } - } -} -Test case: NESTED_MACROS_3 -Source: [1,2,3].map(i, i * 2) + [1,2,3].map(i, i * 2).map(i, i * 2) -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - LIST [3] { - elements: { - CONSTANT [4] { value: 1 } - CONSTANT [5] { value: 2 } - CONSTANT [6] { value: 3 } - } - } - } - } - CALL [7] { - function: _+_ - args: { - COMPREHENSION [8] { - iter_var: @it:0:0 - iter_range: { - IDENT [9] { - name: @index0 - } - } - accu_var: @ac:0:0 - accu_init: { - LIST [10] { - elements: { - } - } - } - loop_condition: { - CONSTANT [11] { value: true } - } - loop_step: { - CALL [12] { - function: _+_ - args: { - IDENT [13] { - name: @ac:0:0 - } - LIST [14] { - elements: { - CALL [15] { - function: _*_ - args: { - IDENT [16] { - name: @it:0:0 - } - CONSTANT [17] { value: 2 } - } - } - } - } - } - } - } - result: { - IDENT [18] { - name: @ac:0:0 - } - } - } - COMPREHENSION [19] { - iter_var: @it:1:0 - iter_range: { - COMPREHENSION [20] { - iter_var: @it:0:0 - iter_range: { - IDENT [21] { - name: @index0 - } - } - accu_var: @ac:0:0 - accu_init: { - LIST [22] { - elements: { - } - } - } - loop_condition: { - CONSTANT [23] { value: true } - } - loop_step: { - CALL [24] { - function: _+_ - args: { - IDENT [25] { - name: @ac:0:0 - } - LIST [26] { - elements: { - CALL [27] { - function: _*_ - args: { - IDENT [28] { - name: @it:0:0 - } - CONSTANT [29] { value: 2 } - } - } - } - } - } - } - } - result: { - IDENT [30] { - name: @ac:0:0 - } - } - } - } - accu_var: @ac:1:0 - accu_init: { - LIST [31] { - elements: { - } - } - } - loop_condition: { - CONSTANT [32] { value: true } - } - loop_step: { - CALL [33] { - function: _+_ - args: { - IDENT [34] { - name: @ac:1:0 - } - LIST [35] { - elements: { - CALL [36] { - function: _*_ - args: { - IDENT [37] { - name: @it:1:0 - } - CONSTANT [38] { value: 2 } - } - } - } - } - } - } - } - result: { - IDENT [39] { - name: @ac:1:0 - } - } - } - } - } - } -} -Test case: NESTED_MACROS_COMP_V2_1 -Source: [1,2,3].transformList(i, v, [1, 2, 3].transformList(i, v, i + v + 1)) == [[2, 4, 6], [2, 4, 6], [2, 4, 6]] -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - LIST [3] { - elements: { - CONSTANT [4] { value: 1 } - CONSTANT [5] { value: 2 } - CONSTANT [6] { value: 3 } - } - } - LIST [7] { - elements: { - CONSTANT [8] { value: 2 } - CONSTANT [9] { value: 4 } - CONSTANT [10] { value: 6 } - } - } - LIST [11] { - elements: { - IDENT [12] { - name: @index1 - } - IDENT [13] { - name: @index1 - } - IDENT [14] { - name: @index1 - } - } - } - } - } - CALL [15] { - function: _==_ - args: { - COMPREHENSION [16] { - iter_var: @it:1:0 - iter_var2: @it2:1:0 - iter_range: { - IDENT [17] { - name: @index0 - } - } - accu_var: @ac:1:0 - accu_init: { - LIST [18] { - elements: { - } - } - } - loop_condition: { - CONSTANT [19] { value: true } - } - loop_step: { - CALL [20] { - function: _+_ - args: { - IDENT [21] { - name: @ac:1:0 - } - LIST [22] { - elements: { - COMPREHENSION [23] { - iter_var: @it:0:0 - iter_var2: @it2:0:0 - iter_range: { - IDENT [24] { - name: @index0 - } - } - accu_var: @ac:0:0 - accu_init: { - LIST [25] { - elements: { - } - } - } - loop_condition: { - CONSTANT [26] { value: true } - } - loop_step: { - CALL [27] { - function: _+_ - args: { - IDENT [28] { - name: @ac:0:0 - } - LIST [29] { - elements: { - CALL [30] { - function: _+_ - args: { - CALL [31] { - function: _+_ - args: { - IDENT [32] { - name: @it:0:0 - } - IDENT [33] { - name: @it2:0:0 - } - } - } - CONSTANT [34] { value: 1 } - } - } - } - } - } - } - } - result: { - IDENT [35] { - name: @ac:0:0 - } - } - } - } - } - } - } - } - result: { - IDENT [36] { - name: @ac:1:0 - } - } - } - IDENT [37] { - name: @index2 - } - } - } - } -} -Test case: NESTED_MACROS_COMP_V2_2 -Source: [1, 2].transformList(i, y, [1, 2, 3].filter(x, x == y && i < y)) == [[1], [2]] -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - LIST [3] { - elements: { - LIST [4] { - elements: { - CONSTANT [5] { value: 1 } - } - } - LIST [6] { - elements: { - CONSTANT [7] { value: 2 } - } - } - } - } - LIST [8] { - elements: { - CONSTANT [9] { value: 1 } - CONSTANT [10] { value: 2 } - } - } - LIST [11] { - elements: { - CONSTANT [12] { value: 1 } - CONSTANT [13] { value: 2 } - CONSTANT [14] { value: 3 } - } - } - } - } - CALL [15] { - function: _==_ - args: { - COMPREHENSION [16] { - iter_var: @it:1:0 - iter_var2: @it2:1:0 - iter_range: { - IDENT [17] { - name: @index1 - } - } - accu_var: @ac:1:0 - accu_init: { - LIST [18] { - elements: { - } - } - } - loop_condition: { - CONSTANT [19] { value: true } - } - loop_step: { - CALL [20] { - function: _+_ - args: { - IDENT [21] { - name: @ac:1:0 - } - LIST [22] { - elements: { - COMPREHENSION [23] { - iter_var: @it:0:0 - iter_range: { - IDENT [24] { - name: @index2 - } - } - accu_var: @ac:0:0 - accu_init: { - LIST [25] { - elements: { - } - } - } - loop_condition: { - CONSTANT [26] { value: true } - } - loop_step: { - CALL [27] { - function: _?_:_ - args: { - CALL [28] { - function: _&&_ - args: { - CALL [29] { - function: _==_ - args: { - IDENT [30] { - name: @it:0:0 - } - IDENT [31] { - name: @it2:1:0 - } - } - } - CALL [32] { - function: _<_ - args: { - IDENT [33] { - name: @it:1:0 - } - IDENT [34] { - name: @it2:1:0 - } - } - } - } - } - CALL [35] { - function: _+_ - args: { - IDENT [36] { - name: @ac:0:0 - } - LIST [37] { - elements: { - IDENT [38] { - name: @it:0:0 - } - } - } - } - } - IDENT [39] { - name: @ac:0:0 - } - } - } - } - result: { - IDENT [40] { - name: @ac:0:0 - } - } - } - } - } - } - } - } - result: { - IDENT [41] { - name: @ac:1:0 - } - } - } - IDENT [42] { - name: @index0 - } - } - } - } -} -Test case: ADJACENT_NESTED_MACROS -Source: [1,2,3].map(i, [1, 2, 3].map(i, i + 1)) == [1,2,3].map(j, [1, 2, 3].map(j, j + 1)) -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - LIST [3] { - elements: { - CONSTANT [4] { value: 1 } - CONSTANT [5] { value: 2 } - CONSTANT [6] { value: 3 } - } - } - } - } - CALL [7] { - function: _==_ - args: { - COMPREHENSION [8] { - iter_var: @it:1:0 - iter_range: { - IDENT [9] { - name: @index0 - } - } - accu_var: @ac:1:0 - accu_init: { - LIST [10] { - elements: { - } - } - } - loop_condition: { - CONSTANT [11] { value: true } - } - loop_step: { - CALL [12] { - function: _+_ - args: { - IDENT [13] { - name: @ac:1:0 - } - LIST [14] { - elements: { - COMPREHENSION [15] { - iter_var: @it:0:0 - iter_range: { - IDENT [16] { - name: @index0 - } - } - accu_var: @ac:0:0 - accu_init: { - LIST [17] { - elements: { - } - } - } - loop_condition: { - CONSTANT [18] { value: true } - } - loop_step: { - CALL [19] { - function: _+_ - args: { - IDENT [20] { - name: @ac:0:0 - } - LIST [21] { - elements: { - CALL [22] { - function: _+_ - args: { - IDENT [23] { - name: @it:0:0 - } - CONSTANT [24] { value: 1 } - } - } - } - } - } - } - } - result: { - IDENT [25] { - name: @ac:0:0 - } - } - } - } - } - } - } - } - result: { - IDENT [26] { - name: @ac:1:0 - } - } - } - COMPREHENSION [27] { - iter_var: @it:1:0 - iter_range: { - IDENT [28] { - name: @index0 - } - } - accu_var: @ac:1:0 - accu_init: { - LIST [29] { - elements: { - } - } - } - loop_condition: { - CONSTANT [30] { value: true } - } - loop_step: { - CALL [31] { - function: _+_ - args: { - IDENT [32] { - name: @ac:1:0 - } - LIST [33] { - elements: { - COMPREHENSION [34] { - iter_var: @it:0:0 - iter_range: { - IDENT [35] { - name: @index0 - } - } - accu_var: @ac:0:0 - accu_init: { - LIST [36] { - elements: { - } - } - } - loop_condition: { - CONSTANT [37] { value: true } - } - loop_step: { - CALL [38] { - function: _+_ - args: { - IDENT [39] { - name: @ac:0:0 - } - LIST [40] { - elements: { - CALL [41] { - function: _+_ - args: { - IDENT [42] { - name: @it:0:0 - } - CONSTANT [43] { value: 1 } - } - } - } - } - } - } - } - result: { - IDENT [44] { - name: @ac:0:0 - } - } - } - } - } - } - } - } - result: { - IDENT [45] { - name: @ac:1:0 - } - } - } - } - } - } -} -Test case: ADJACENT_NESTED_MACROS_COMP_V2 -Source: [1,2,3].transformMap(i, x, [1, 2, 3].transformMap(i, x, i + x + 1)) == [1,2,3].transformMap(j, y, [1, 2, 3].transformMap(j, y, j + y + 1)) -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - LIST [3] { - elements: { - CONSTANT [4] { value: 1 } - CONSTANT [5] { value: 2 } - CONSTANT [6] { value: 3 } - } - } - } - } - CALL [7] { - function: _==_ - args: { - COMPREHENSION [8] { - iter_var: @it:1:0 - iter_var2: @it2:1:0 - iter_range: { - IDENT [9] { - name: @index0 - } - } - accu_var: @ac:1:0 - accu_init: { - MAP [10] { - - } - } - loop_condition: { - CONSTANT [11] { value: true } - } - loop_step: { - CALL [12] { - function: cel.@mapInsert - args: { - IDENT [13] { - name: @ac:1:0 - } - IDENT [14] { - name: @it:1:0 - } - COMPREHENSION [15] { - iter_var: @it:0:0 - iter_var2: @it2:0:0 - iter_range: { - IDENT [16] { - name: @index0 - } - } - accu_var: @ac:0:0 - accu_init: { - MAP [17] { - - } - } - loop_condition: { - CONSTANT [18] { value: true } - } - loop_step: { - CALL [19] { - function: cel.@mapInsert - args: { - IDENT [20] { - name: @ac:0:0 - } - IDENT [21] { - name: @it:0:0 - } - CALL [22] { - function: _+_ - args: { - CALL [23] { - function: _+_ - args: { - IDENT [24] { - name: @it:0:0 - } - IDENT [25] { - name: @it2:0:0 - } - } - } - CONSTANT [26] { value: 1 } - } - } - } - } - } - result: { - IDENT [27] { - name: @ac:0:0 - } - } - } - } - } - } - result: { - IDENT [28] { - name: @ac:1:0 - } - } - } - COMPREHENSION [29] { - iter_var: @it:1:0 - iter_var2: @it2:1:0 - iter_range: { - IDENT [30] { - name: @index0 - } - } - accu_var: @ac:1:0 - accu_init: { - MAP [31] { - - } - } - loop_condition: { - CONSTANT [32] { value: true } - } - loop_step: { - CALL [33] { - function: cel.@mapInsert - args: { - IDENT [34] { - name: @ac:1:0 - } - IDENT [35] { - name: @it:1:0 - } - COMPREHENSION [36] { - iter_var: @it:0:0 - iter_var2: @it2:0:0 - iter_range: { - IDENT [37] { - name: @index0 - } - } - accu_var: @ac:0:0 - accu_init: { - MAP [38] { - - } - } - loop_condition: { - CONSTANT [39] { value: true } - } - loop_step: { - CALL [40] { - function: cel.@mapInsert - args: { - IDENT [41] { - name: @ac:0:0 - } - IDENT [42] { - name: @it:0:0 - } - CALL [43] { - function: _+_ - args: { - CALL [44] { - function: _+_ - args: { - IDENT [45] { - name: @it:0:0 - } - IDENT [46] { - name: @it2:0:0 - } - } - } - CONSTANT [47] { value: 1 } - } - } - } - } - } - result: { - IDENT [48] { - name: @ac:0:0 - } - } - } - } - } - } - result: { - IDENT [49] { - name: @ac:1:0 - } - } - } - } - } - } -} -Test case: INCLUSION_LIST -Source: 1 in [1,2,3] && 2 in [1,2,3] && 3 in [3, [1,2,3]] && 1 in [1,2,3] -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - CALL [3] { - function: @in - args: { - CONSTANT [4] { value: 1 } - LIST [5] { - elements: { - CONSTANT [6] { value: 1 } - CONSTANT [7] { value: 2 } - CONSTANT [8] { value: 3 } - } - } - } - } - LIST [9] { - elements: { - CONSTANT [10] { value: 1 } - CONSTANT [11] { value: 2 } - CONSTANT [12] { value: 3 } - } - } - CALL [13] { - function: _&&_ - args: { - IDENT [14] { - name: @index0 - } - CALL [15] { - function: @in - args: { - CONSTANT [16] { value: 2 } - IDENT [17] { - name: @index1 - } - } - } - } - } - CALL [18] { - function: @in - args: { - CONSTANT [19] { value: 3 } - LIST [20] { - elements: { - CONSTANT [21] { value: 3 } - IDENT [22] { - name: @index1 - } - } - } - } - } - } - } - CALL [23] { - function: _&&_ - args: { - IDENT [24] { - name: @index2 - } - CALL [25] { - function: _&&_ - args: { - IDENT [26] { - name: @index3 - } - IDENT [27] { - name: @index0 - } - } - } - } - } - } -} -Test case: INCLUSION_MAP -Source: 2 in {'a': 1, 2: {true: false}, 3: {true: false}} -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - MAP [3] { - MAP_ENTRY [4] { - key: { - CONSTANT [5] { value: true } - } - value: { - CONSTANT [6] { value: false } - } - } - } - } - } - CALL [7] { - function: @in - args: { - CONSTANT [8] { value: 2 } - MAP [9] { - MAP_ENTRY [10] { - key: { - CONSTANT [11] { value: "a" } - } - value: { - CONSTANT [12] { value: 1 } - } - } - MAP_ENTRY [13] { - key: { - CONSTANT [14] { value: 2 } - } - value: { - IDENT [15] { - name: @index0 - } - } - } - MAP_ENTRY [16] { - key: { - CONSTANT [17] { value: 3 } - } - value: { - IDENT [18] { - name: @index0 - } - } - } - } - } - } - } -} -Test case: MACRO_ITER_VAR_NOT_REFERENCED -Source: [1,2].map(i, [1, 2].map(i, [3,4])) == [[[3, 4], [3, 4]], [[3, 4], [3, 4]]] -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - LIST [3] { - elements: { - LIST [4] { - elements: { - CONSTANT [5] { value: 3 } - CONSTANT [6] { value: 4 } - } - } - LIST [7] { - elements: { - CONSTANT [8] { value: 3 } - CONSTANT [9] { value: 4 } - } - } - } - } - LIST [10] { - elements: { - CONSTANT [11] { value: 1 } - CONSTANT [12] { value: 2 } - } - } - LIST [13] { - elements: { - LIST [14] { - elements: { - CONSTANT [15] { value: 3 } - CONSTANT [16] { value: 4 } - } - } - } - } - COMPREHENSION [17] { - iter_var: @it:0:0 - iter_range: { - IDENT [18] { - name: @index1 - } - } - accu_var: @ac:0:0 - accu_init: { - LIST [19] { - elements: { - } - } - } - loop_condition: { - CONSTANT [20] { value: true } - } - loop_step: { - CALL [21] { - function: _+_ - args: { - IDENT [22] { - name: @ac:0:0 - } - IDENT [23] { - name: @index2 - } - } - } - } - result: { - IDENT [24] { - name: @ac:0:0 - } - } - } - LIST [25] { - elements: { - IDENT [26] { - name: @index3 - } - } - } - } - } - CALL [27] { - function: _==_ - args: { - COMPREHENSION [28] { - iter_var: @it:1:0 - iter_range: { - IDENT [29] { - name: @index1 - } - } - accu_var: @ac:1:0 - accu_init: { - LIST [30] { - elements: { - } - } - } - loop_condition: { - CONSTANT [31] { value: true } - } - loop_step: { - CALL [32] { - function: _+_ - args: { - IDENT [33] { - name: @ac:1:0 - } - IDENT [34] { - name: @index4 - } - } - } - } - result: { - IDENT [35] { - name: @ac:1:0 - } - } - } - LIST [36] { - elements: { - IDENT [37] { - name: @index0 - } - IDENT [38] { - name: @index0 - } - } - } - } - } - } -} -Test case: MACRO_ITER_VAR2_NOT_REFERENCED -Source: [1,2].transformList(i, v, [1, 2].transformList(i, v, [3,4])) == [[[3, 4], [3, 4]], [[3, 4], [3, 4]]] -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - LIST [3] { - elements: { - LIST [4] { - elements: { - CONSTANT [5] { value: 3 } - CONSTANT [6] { value: 4 } - } - } - LIST [7] { - elements: { - CONSTANT [8] { value: 3 } - CONSTANT [9] { value: 4 } - } - } - } - } - LIST [10] { - elements: { - CONSTANT [11] { value: 1 } - CONSTANT [12] { value: 2 } - } - } - LIST [13] { - elements: { - LIST [14] { - elements: { - CONSTANT [15] { value: 3 } - CONSTANT [16] { value: 4 } - } - } - } - } - COMPREHENSION [17] { - iter_var: @it:0:0 - iter_var2: @it2:0:0 - iter_range: { - IDENT [18] { - name: @index1 - } - } - accu_var: @ac:0:0 - accu_init: { - LIST [19] { - elements: { - } - } - } - loop_condition: { - CONSTANT [20] { value: true } - } - loop_step: { - CALL [21] { - function: _+_ - args: { - IDENT [22] { - name: @ac:0:0 - } - IDENT [23] { - name: @index2 - } - } - } - } - result: { - IDENT [24] { - name: @ac:0:0 - } - } - } - LIST [25] { - elements: { - IDENT [26] { - name: @index3 - } - } - } - } - } - CALL [27] { - function: _==_ - args: { - COMPREHENSION [28] { - iter_var: @it:1:0 - iter_var2: @it2:1:0 - iter_range: { - IDENT [29] { - name: @index1 - } - } - accu_var: @ac:1:0 - accu_init: { - LIST [30] { - elements: { - } - } - } - loop_condition: { - CONSTANT [31] { value: true } - } - loop_step: { - CALL [32] { - function: _+_ - args: { - IDENT [33] { - name: @ac:1:0 - } - IDENT [34] { - name: @index4 - } - } - } - } - result: { - IDENT [35] { - name: @ac:1:0 - } - } - } - LIST [36] { - elements: { - IDENT [37] { - name: @index0 - } - IDENT [38] { - name: @index0 - } - } - } - } - } - } -} -Test case: MACRO_SHADOWED_VARIABLE -Source: [x - 1 > 3 ? x - 1 : 5].exists(x, x - 1 > 3) || x - 1 > 3 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - CALL [3] { - function: _>_ - args: { - CALL [4] { - function: _-_ - args: { - IDENT [5] { - name: x - } - CONSTANT [6] { value: 1 } - } - } - CONSTANT [7] { value: 3 } - } - } - CALL [8] { - function: _?_:_ - args: { - IDENT [9] { - name: @index0 - } - CALL [10] { - function: _-_ - args: { - IDENT [11] { - name: x - } - CONSTANT [12] { value: 1 } - } - } - CONSTANT [13] { value: 5 } - } - } - LIST [14] { - elements: { - IDENT [15] { - name: @index1 - } - } - } - } - } - CALL [16] { - function: _||_ - args: { - COMPREHENSION [17] { - iter_var: @it:0:0 - iter_range: { - IDENT [18] { - name: @index2 - } - } - accu_var: @ac:0:0 - accu_init: { - CONSTANT [19] { value: false } - } - loop_condition: { - CALL [20] { - function: @not_strictly_false - args: { - CALL [21] { - function: !_ - args: { - IDENT [22] { - name: @ac:0:0 - } - } - } - } - } - } - loop_step: { - CALL [23] { - function: _||_ - args: { - IDENT [24] { - name: @ac:0:0 - } - CALL [25] { - function: _>_ - args: { - CALL [26] { - function: _-_ - args: { - IDENT [27] { - name: @it:0:0 - } - CONSTANT [28] { value: 1 } - } - } - CONSTANT [29] { value: 3 } - } - } - } - } - } - result: { - IDENT [30] { - name: @ac:0:0 - } - } - } - IDENT [31] { - name: @index0 - } - } - } - } -} -Test case: MACRO_SHADOWED_VARIABLE_2 -Source: ["foo", "bar"].map(x, [x + x, x + x]).map(x, [x + x, x + x]) -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - LIST [3] { - elements: { - CONSTANT [4] { value: "foo" } - CONSTANT [5] { value: "bar" } - } - } - } - } - COMPREHENSION [6] { - iter_var: @it:1:0 - iter_range: { - COMPREHENSION [7] { - iter_var: @it:0:0 - iter_range: { - IDENT [8] { - name: @index0 - } - } - accu_var: @ac:0:0 - accu_init: { - LIST [9] { - elements: { - } - } - } - loop_condition: { - CONSTANT [10] { value: true } - } - loop_step: { - CALL [11] { - function: _+_ - args: { - IDENT [12] { - name: @ac:0:0 - } - LIST [13] { - elements: { - LIST [14] { - elements: { - CALL [15] { - function: _+_ - args: { - IDENT [16] { - name: @it:0:0 - } - IDENT [17] { - name: @it:0:0 - } - } - } - CALL [18] { - function: _+_ - args: { - IDENT [19] { - name: @it:0:0 - } - IDENT [20] { - name: @it:0:0 - } - } - } - } - } - } - } - } - } - } - result: { - IDENT [21] { - name: @ac:0:0 - } - } - } - } - accu_var: @ac:1:0 - accu_init: { - LIST [22] { - elements: { - } - } - } - loop_condition: { - CONSTANT [23] { value: true } - } - loop_step: { - CALL [24] { - function: _+_ - args: { - IDENT [25] { - name: @ac:1:0 - } - LIST [26] { - elements: { - LIST [27] { - elements: { - CALL [28] { - function: _+_ - args: { - IDENT [29] { - name: @it:1:0 - } - IDENT [30] { - name: @it:1:0 - } - } - } - CALL [31] { - function: _+_ - args: { - IDENT [32] { - name: @it:1:0 - } - IDENT [33] { - name: @it:1:0 - } - } - } - } - } - } - } - } - } - } - result: { - IDENT [34] { - name: @ac:1:0 - } - } - } - } -} -Test case: MACRO_SHADOWED_VARIABLE_COMP_V2_1 -Source: [x - y - 1 > 3 ? x - y - 1 : 5].exists(x, y, x - y - 1 > 3) || x - y - 1 > 3 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - CALL [3] { - function: _-_ - args: { - CALL [4] { - function: _-_ - args: { - IDENT [5] { - name: x - } - IDENT [6] { - name: y - } - } - } - CONSTANT [7] { value: 1 } - } - } - CALL [8] { - function: _>_ - args: { - IDENT [9] { - name: @index0 - } - CONSTANT [10] { value: 3 } - } - } - LIST [11] { - elements: { - CALL [12] { - function: _?_:_ - args: { - IDENT [13] { - name: @index1 - } - IDENT [14] { - name: @index0 - } - CONSTANT [15] { value: 5 } - } - } - } - } - } - } - CALL [16] { - function: _||_ - args: { - COMPREHENSION [17] { - iter_var: @it:0:0 - iter_var2: @it2:0:0 - iter_range: { - IDENT [18] { - name: @index2 - } - } - accu_var: @ac:0:0 - accu_init: { - CONSTANT [19] { value: false } - } - loop_condition: { - CALL [20] { - function: @not_strictly_false - args: { - CALL [21] { - function: !_ - args: { - IDENT [22] { - name: @ac:0:0 - } - } - } - } - } - } - loop_step: { - CALL [23] { - function: _||_ - args: { - IDENT [24] { - name: @ac:0:0 - } - CALL [25] { - function: _>_ - args: { - CALL [26] { - function: _-_ - args: { - CALL [27] { - function: _-_ - args: { - IDENT [28] { - name: @it:0:0 - } - IDENT [29] { - name: @it2:0:0 - } - } - } - CONSTANT [30] { value: 1 } - } - } - CONSTANT [31] { value: 3 } - } - } - } - } - } - result: { - IDENT [32] { - name: @ac:0:0 - } - } - } - IDENT [33] { - name: @index1 - } - } - } - } -} -Test case: MACRO_SHADOWED_VARIABLE_COMP_V2_2 -Source: ["foo", "bar"].transformMap(x, y, [x + x, y + y]).transformMap(x, y, [x + x, y + y]) -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - LIST [3] { - elements: { - CONSTANT [4] { value: "foo" } - CONSTANT [5] { value: "bar" } - } - } - } - } - COMPREHENSION [6] { - iter_var: @it:1:0 - iter_var2: @it2:1:0 - iter_range: { - COMPREHENSION [7] { - iter_var: @it:0:0 - iter_var2: @it2:0:0 - iter_range: { - IDENT [8] { - name: @index0 - } - } - accu_var: @ac:0:0 - accu_init: { - MAP [9] { - - } - } - loop_condition: { - CONSTANT [10] { value: true } - } - loop_step: { - CALL [11] { - function: cel.@mapInsert - args: { - IDENT [12] { - name: @ac:0:0 - } - IDENT [13] { - name: @it:0:0 - } - LIST [14] { - elements: { - CALL [15] { - function: _+_ - args: { - IDENT [16] { - name: @it:0:0 - } - IDENT [17] { - name: @it:0:0 - } - } - } - CALL [18] { - function: _+_ - args: { - IDENT [19] { - name: @it2:0:0 - } - IDENT [20] { - name: @it2:0:0 - } - } - } - } - } - } - } - } - result: { - IDENT [21] { - name: @ac:0:0 - } - } - } - } - accu_var: @ac:1:0 - accu_init: { - MAP [22] { - - } - } - loop_condition: { - CONSTANT [23] { value: true } - } - loop_step: { - CALL [24] { - function: cel.@mapInsert - args: { - IDENT [25] { - name: @ac:1:0 - } - IDENT [26] { - name: @it:1:0 - } - LIST [27] { - elements: { - CALL [28] { - function: _+_ - args: { - IDENT [29] { - name: @it:1:0 - } - IDENT [30] { - name: @it:1:0 - } - } - } - CALL [31] { - function: _+_ - args: { - IDENT [32] { - name: @it2:1:0 - } - IDENT [33] { - name: @it2:1:0 - } - } - } - } - } - } - } - } - result: { - IDENT [34] { - name: @ac:1:0 - } - } - } - } -} -Test case: PRESENCE_TEST -Source: has({'a': true}.a) && {'a':true}['a'] -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - MAP [3] { - MAP_ENTRY [4] { - key: { - CONSTANT [5] { value: "a" } - } - value: { - CONSTANT [6] { value: true } - } - } - } - } - } - CALL [7] { - function: _&&_ - args: { - SELECT [8] { - IDENT [9] { - name: @index0 - }.a~presence_test - } - CALL [10] { - function: _[_] - args: { - IDENT [11] { - name: @index0 - } - CONSTANT [12] { value: "a" } - } - } - } - } - } -} -Test case: PRESENCE_TEST_2 -Source: has({'a': true}.a) && has({'a': true}.a) -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - SELECT [3] { - MAP [4] { - MAP_ENTRY [5] { - key: { - CONSTANT [6] { value: "a" } - } - value: { - CONSTANT [7] { value: true } - } - } - }.a~presence_test - } - } - } - CALL [8] { - function: _&&_ - args: { - IDENT [9] { - name: @index0 - } - IDENT [10] { - name: @index0 - } - } - } - } -} -Test case: PRESENCE_TEST_WITH_TERNARY -Source: (has(msg.oneof_type.payload) ? msg.oneof_type.payload.single_int64 : 0) == 10 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - SELECT [3] { - IDENT [4] { - name: msg - }.oneof_type - } - SELECT [5] { - SELECT [6] { - IDENT [7] { - name: @index0 - }.payload - }.single_int64 - } - CALL [8] { - function: _?_:_ - args: { - SELECT [9] { - IDENT [10] { - name: @index0 - }.payload~presence_test - } - IDENT [11] { - name: @index1 - } - CONSTANT [12] { value: 0 } - } - } - } - } - CALL [13] { - function: _==_ - args: { - IDENT [14] { - name: @index2 - } - CONSTANT [15] { value: 10 } - } - } - } -} -Test case: PRESENCE_TEST_WITH_TERNARY_2 -Source: (has(msg.oneof_type.payload) ? msg.oneof_type.payload.single_int64 : msg.oneof_type.payload.single_int64 * 0) == 10 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - SELECT [3] { - SELECT [4] { - IDENT [5] { - name: msg - }.oneof_type - }.payload - } - SELECT [6] { - IDENT [7] { - name: @index0 - }.single_int64 - } - SELECT [8] { - SELECT [9] { - IDENT [10] { - name: msg - }.oneof_type - }.payload~presence_test - } - CALL [11] { - function: _?_:_ - args: { - IDENT [12] { - name: @index2 - } - IDENT [13] { - name: @index1 - } - CALL [14] { - function: _*_ - args: { - IDENT [15] { - name: @index1 - } - CONSTANT [16] { value: 0 } - } - } - } - } - } - } - CALL [17] { - function: _==_ - args: { - IDENT [18] { - name: @index3 - } - CONSTANT [19] { value: 10 } - } - } - } -} -Test case: PRESENCE_TEST_WITH_TERNARY_3 -Source: (has(msg.oneof_type.payload.single_int64) ? msg.oneof_type.payload.single_int64 : msg.oneof_type.payload.single_int64 * 0) == 10 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - SELECT [3] { - SELECT [4] { - IDENT [5] { - name: msg - }.oneof_type - }.payload - } - SELECT [6] { - IDENT [7] { - name: @index0 - }.single_int64 - } - CALL [8] { - function: _?_:_ - args: { - SELECT [9] { - IDENT [10] { - name: @index0 - }.single_int64~presence_test - } - IDENT [11] { - name: @index1 - } - CALL [12] { - function: _*_ - args: { - IDENT [13] { - name: @index1 - } - CONSTANT [14] { value: 0 } - } - } - } - } - } - } - CALL [15] { - function: _==_ - args: { - IDENT [16] { - name: @index2 - } - CONSTANT [17] { value: 10 } - } - } - } -} -Test case: PRESENCE_TEST_WITH_TERNARY_NESTED -Source: (has(msg.oneof_type) && has(msg.oneof_type.payload) && has(msg.oneof_type.payload.single_int64)) ? ((has(msg.oneof_type.payload.map_string_string) && has(msg.oneof_type.payload.map_string_string.key)) ? msg.oneof_type.payload.map_string_string.key == 'A' : false) : false -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - SELECT [3] { - SELECT [4] { - IDENT [5] { - name: msg - }.oneof_type - }.payload - } - SELECT [6] { - IDENT [7] { - name: @index0 - }.map_string_string - } - SELECT [8] { - SELECT [9] { - IDENT [10] { - name: msg - }.oneof_type - }.payload~presence_test - } - CALL [11] { - function: _&&_ - args: { - SELECT [12] { - IDENT [13] { - name: msg - }.oneof_type~presence_test - } - IDENT [14] { - name: @index2 - } - } - } - CALL [15] { - function: _&&_ - args: { - IDENT [16] { - name: @index3 - } - SELECT [17] { - IDENT [18] { - name: @index0 - }.single_int64~presence_test - } - } - } - CALL [19] { - function: _&&_ - args: { - SELECT [20] { - IDENT [21] { - name: @index0 - }.map_string_string~presence_test - } - SELECT [22] { - IDENT [23] { - name: @index1 - }.key~presence_test - } - } - } - CALL [24] { - function: _==_ - args: { - SELECT [25] { - IDENT [26] { - name: @index1 - }.key - } - CONSTANT [27] { value: "A" } - } - } - } - } - CALL [28] { - function: _?_:_ - args: { - IDENT [29] { - name: @index4 - } - CALL [30] { - function: _?_:_ - args: { - IDENT [31] { - name: @index5 - } - IDENT [32] { - name: @index6 - } - CONSTANT [33] { value: false } - } - } - CONSTANT [34] { value: false } - } - } - } -} -Test case: OPTIONAL_LIST -Source: [10, ?optional.none(), [?optional.none(), ?opt_x], [?optional.none(), ?opt_x]] == [10, [5], [5]] -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - LIST [3] { - elements: { - CALL [4] { - function: optional.none - args: { - } - } - IDENT [5] { - name: opt_x - } - } - optional_indices: [0, 1] - } - LIST [6] { - elements: { - CONSTANT [7] { value: 5 } - } - } - LIST [8] { - elements: { - CONSTANT [9] { value: 10 } - CALL [10] { - function: optional.none - args: { - } - } - IDENT [11] { - name: @index0 - } - IDENT [12] { - name: @index0 - } - } - optional_indices: [0] - } - } - } - CALL [13] { - function: _==_ - args: { - IDENT [14] { - name: @index2 - } - LIST [15] { - elements: { - CONSTANT [16] { value: 10 } - IDENT [17] { - name: @index1 - } - IDENT [18] { - name: @index1 - } - } - } - } - } - } -} -Test case: OPTIONAL_MAP -Source: {?'hello': optional.of('hello')}['hello'] + {?'hello': optional.of('hello')}['hello'] == 'hellohello' -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - MAP [3] { - MAP_ENTRY [4] { - key: { - CONSTANT [5] { value: "hello" } - } - optional_entry: true - value: { - CALL [6] { - function: optional.of - args: { - CONSTANT [7] { value: "hello" } - } - } - } - } - } - CALL [8] { - function: _[_] - args: { - IDENT [9] { - name: @index0 - } - CONSTANT [10] { value: "hello" } - } - } - } - } - CALL [11] { - function: _==_ - args: { - CALL [12] { - function: _+_ - args: { - IDENT [13] { - name: @index1 - } - IDENT [14] { - name: @index1 - } - } - } - CONSTANT [15] { value: "hellohello" } - } - } - } -} -Test case: OPTIONAL_MAP_CHAINED -Source: {?'key': optional.of('test')}[?'bogus'].or({'key': 'test'}[?'bogus']).orValue({'key': 'test'}['key']) == 'test' -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - MAP [3] { - MAP_ENTRY [4] { - key: { - CONSTANT [5] { value: "key" } - } - value: { - CONSTANT [6] { value: "test" } - } - } - } - MAP [7] { - MAP_ENTRY [8] { - key: { - CONSTANT [9] { value: "key" } - } - optional_entry: true - value: { - CALL [10] { - function: optional.of - args: { - CONSTANT [11] { value: "test" } - } - } - } - } - } - CALL [12] { - function: or - target: { - CALL [13] { - function: _[?_] - args: { - IDENT [14] { - name: @index1 - } - CONSTANT [15] { value: "bogus" } - } - } - } - args: { - CALL [16] { - function: _[?_] - args: { - IDENT [17] { - name: @index0 - } - CONSTANT [18] { value: "bogus" } - } - } - } - } - CALL [19] { - function: orValue - target: { - IDENT [20] { - name: @index2 - } - } - args: { - CALL [21] { - function: _[_] - args: { - IDENT [22] { - name: @index0 - } - CONSTANT [23] { value: "key" } - } - } - } - } - } - } - CALL [24] { - function: _==_ - args: { - IDENT [25] { - name: @index3 - } - CONSTANT [26] { value: "test" } - } - } - } -} -Test case: OPTIONAL_MESSAGE -Source: TestAllTypes{?single_int64: optional.ofNonZeroValue(1), ?single_int32: optional.of(4)}.single_int32 + TestAllTypes{?single_int64: optional.ofNonZeroValue(1), ?single_int32: optional.of(4)}.single_int64 == 5 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - STRUCT [3] { - name: cel.expr.conformance.proto3.TestAllTypes - entries: { - ENTRY [4] { - field_key: single_int64 - optional_entry: true - value: { - CALL [5] { - function: optional.ofNonZeroValue - args: { - CONSTANT [6] { value: 1 } - } - } - } - } - ENTRY [7] { - field_key: single_int32 - optional_entry: true - value: { - CALL [8] { - function: optional.of - args: { - CONSTANT [9] { value: 4 } - } - } - } - } - } - } - CALL [10] { - function: _+_ - args: { - SELECT [11] { - IDENT [12] { - name: @index0 - }.single_int32 - } - SELECT [13] { - IDENT [14] { - name: @index0 - }.single_int64 - } - } - } - } - } - CALL [15] { - function: _==_ - args: { - IDENT [16] { - name: @index1 - } - CONSTANT [17] { value: 5 } - } - } - } -} -Test case: CALL -Source: ('h' + 'e' + 'l' + 'l' + 'o' + ' world').matches('h' + 'e' + 'l' + 'l' + 'o') -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - CALL [3] { - function: _+_ - args: { - CALL [4] { - function: _+_ - args: { - CONSTANT [5] { value: "h" } - CONSTANT [6] { value: "e" } - } - } - CONSTANT [7] { value: "l" } - } - } - CALL [8] { - function: _+_ - args: { - CALL [9] { - function: _+_ - args: { - IDENT [10] { - name: @index0 - } - CONSTANT [11] { value: "l" } - } - } - CONSTANT [12] { value: "o" } - } - } - } - } - CALL [13] { - function: matches - target: { - CALL [14] { - function: _+_ - args: { - IDENT [15] { - name: @index1 - } - CONSTANT [16] { value: " world" } - } - } - } - args: { - IDENT [17] { - name: @index1 - } - } - } - } -} -Test case: CALL_ARGUMENT_NESTED_NO_COMMON_SUBEXPR -Source: 'hello world'.matches('h' + 'e' + 'l' + 'l' + 'o') -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - CALL [3] { - function: _+_ - args: { - CALL [4] { - function: _+_ - args: { - CONSTANT [5] { value: "h" } - CONSTANT [6] { value: "e" } - } - } - CONSTANT [7] { value: "l" } - } - } - CALL [8] { - function: _+_ - args: { - CALL [9] { - function: _+_ - args: { - IDENT [10] { - name: @index0 - } - CONSTANT [11] { value: "l" } - } - } - CONSTANT [12] { value: "o" } - } - } - } - } - CALL [13] { - function: matches - target: { - CONSTANT [14] { value: "hello world" } - } - args: { - IDENT [15] { - name: @index1 - } - } - } - } -} -Test case: CALL_TARGET_NESTED_NO_COMMON_SUBEXPR -Source: ('h' + 'e' + 'l' + 'l' + 'o' + ' world').matches('hello') -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - CALL [3] { - function: _+_ - args: { - CALL [4] { - function: _+_ - args: { - CONSTANT [5] { value: "h" } - CONSTANT [6] { value: "e" } - } - } - CONSTANT [7] { value: "l" } - } - } - CALL [8] { - function: _+_ - args: { - CALL [9] { - function: _+_ - args: { - IDENT [10] { - name: @index0 - } - CONSTANT [11] { value: "l" } - } - } - CONSTANT [12] { value: "o" } - } - } - } - } - CALL [13] { - function: matches - target: { - CALL [14] { - function: _+_ - args: { - IDENT [15] { - name: @index1 - } - CONSTANT [16] { value: " world" } - } - } - } - args: { - CONSTANT [17] { value: "hello" } - } - } - } -} -Test case: CALL_BOTH_ARGUMENT_TARGET_NESTED_NO_COMMON_SUBEXPR -Source: ('h' + 'e' + 'l' + 'l' + 'o' + ' world').matches('w' + 'o' + 'r' + 'l' + 'd') -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - CALL [3] { - function: _+_ - args: { - CALL [4] { - function: _+_ - args: { - CONSTANT [5] { value: "h" } - CONSTANT [6] { value: "e" } - } - } - CONSTANT [7] { value: "l" } - } - } - CALL [8] { - function: _+_ - args: { - CALL [9] { - function: _+_ - args: { - IDENT [10] { - name: @index0 - } - CONSTANT [11] { value: "l" } - } - } - CONSTANT [12] { value: "o" } - } - } - CALL [13] { - function: _+_ - args: { - CALL [14] { - function: _+_ - args: { - CONSTANT [15] { value: "w" } - CONSTANT [16] { value: "o" } - } - } - CONSTANT [17] { value: "r" } - } - } - CALL [18] { - function: _+_ - args: { - CALL [19] { - function: _+_ - args: { - IDENT [20] { - name: @index2 - } - CONSTANT [21] { value: "l" } - } - } - CONSTANT [22] { value: "d" } - } - } - } - } - CALL [23] { - function: matches - target: { - CALL [24] { - function: _+_ - args: { - IDENT [25] { - name: @index1 - } - CONSTANT [26] { value: " world" } - } - } - } - args: { - IDENT [27] { - name: @index3 - } - } - } - } -} -Test case: CUSTOM_FUNCTION_INELIMINABLE -Source: non_pure_custom_func(msg.oneof_type.payload.single_int64) + non_pure_custom_func(msg.oneof_type.payload.single_int32) + non_pure_custom_func(msg.oneof_type.payload.single_int64) + non_pure_custom_func(msg.single_int64) -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - SELECT [3] { - SELECT [4] { - IDENT [5] { - name: msg - }.oneof_type - }.payload - } - SELECT [6] { - IDENT [7] { - name: @index0 - }.single_int64 - } - } - } - CALL [8] { - function: _+_ - args: { - CALL [9] { - function: _+_ - args: { - CALL [10] { - function: _+_ - args: { - CALL [11] { - function: non_pure_custom_func - args: { - IDENT [12] { - name: @index1 - } - } - } - CALL [13] { - function: non_pure_custom_func - args: { - SELECT [14] { - IDENT [15] { - name: @index0 - }.single_int32 - } - } - } - } - } - CALL [16] { - function: non_pure_custom_func - args: { - IDENT [17] { - name: @index1 - } - } - } - } - } - CALL [18] { - function: non_pure_custom_func - args: { - SELECT [19] { - IDENT [20] { - name: msg - }.single_int64 - } - } - } - } - } - } -} -Test case: CUSTOM_FUNCTION_ELIMINABLE -Source: pure_custom_func(msg.oneof_type.payload.single_int64) + pure_custom_func(msg.oneof_type.payload.single_int32) + pure_custom_func(msg.oneof_type.payload.single_int64) + pure_custom_func(msg.single_int64) -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - SELECT [3] { - SELECT [4] { - IDENT [5] { - name: msg - }.oneof_type - }.payload - } - CALL [6] { - function: pure_custom_func - args: { - SELECT [7] { - IDENT [8] { - name: @index0 - }.single_int64 - } - } - } - CALL [9] { - function: pure_custom_func - args: { - SELECT [10] { - IDENT [11] { - name: @index0 - }.single_int32 - } - } - } - CALL [12] { - function: _+_ - args: { - CALL [13] { - function: _+_ - args: { - IDENT [14] { - name: @index1 - } - IDENT [15] { - name: @index2 - } - } - } - IDENT [16] { - name: @index1 - } - } - } - CALL [17] { - function: pure_custom_func - args: { - SELECT [18] { - IDENT [19] { - name: msg - }.single_int64 - } - } - } - } - } - CALL [20] { - function: _+_ - args: { - IDENT [21] { - name: @index3 - } - IDENT [22] { - name: @index4 - } - } - } - } -} \ No newline at end of file diff --git a/optimizer/src/test/resources/subexpression_ast_block_recursion_depth_3.baseline b/optimizer/src/test/resources/subexpression_ast_block_recursion_depth_3.baseline deleted file mode 100644 index 89b1069ad..000000000 --- a/optimizer/src/test/resources/subexpression_ast_block_recursion_depth_3.baseline +++ /dev/null @@ -1,5442 +0,0 @@ -Test case: SIZE_1 -Source: size([1,2]) + size([1,2]) + 1 == 5 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - CALL [3] { - function: size - args: { - LIST [4] { - elements: { - CONSTANT [5] { value: 1 } - CONSTANT [6] { value: 2 } - } - } - } - } - } - } - CALL [7] { - function: _==_ - args: { - CALL [8] { - function: _+_ - args: { - CALL [9] { - function: _+_ - args: { - IDENT [10] { - name: @index0 - } - IDENT [11] { - name: @index0 - } - } - } - CONSTANT [12] { value: 1 } - } - } - CONSTANT [13] { value: 5 } - } - } - } -} -Test case: SIZE_2 -Source: 2 + size([1,2]) + size([1,2]) + 1 == 7 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - CALL [3] { - function: size - args: { - LIST [4] { - elements: { - CONSTANT [5] { value: 1 } - CONSTANT [6] { value: 2 } - } - } - } - } - CALL [7] { - function: _+_ - args: { - CALL [8] { - function: _+_ - args: { - CALL [9] { - function: _+_ - args: { - CONSTANT [10] { value: 2 } - IDENT [11] { - name: @index0 - } - } - } - IDENT [12] { - name: @index0 - } - } - } - CONSTANT [13] { value: 1 } - } - } - } - } - CALL [14] { - function: _==_ - args: { - IDENT [15] { - name: @index1 - } - CONSTANT [16] { value: 7 } - } - } - } -} -Test case: SIZE_3 -Source: size([0]) + size([0]) + size([1,2]) + size([1,2]) == 6 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - CALL [3] { - function: size - args: { - LIST [4] { - elements: { - CONSTANT [5] { value: 0 } - } - } - } - } - CALL [6] { - function: size - args: { - LIST [7] { - elements: { - CONSTANT [8] { value: 1 } - CONSTANT [9] { value: 2 } - } - } - } - } - CALL [10] { - function: _+_ - args: { - CALL [11] { - function: _+_ - args: { - CALL [12] { - function: _+_ - args: { - IDENT [13] { - name: @index0 - } - IDENT [14] { - name: @index0 - } - } - } - IDENT [15] { - name: @index1 - } - } - } - IDENT [16] { - name: @index1 - } - } - } - } - } - CALL [17] { - function: _==_ - args: { - IDENT [18] { - name: @index2 - } - CONSTANT [19] { value: 6 } - } - } - } -} -Test case: SIZE_4 -Source: 5 + size([0]) + size([0]) + size([1,2]) + size([1,2]) + size([1,2,3]) + size([1,2,3]) == 17 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - CALL [3] { - function: size - args: { - LIST [4] { - elements: { - CONSTANT [5] { value: 0 } - } - } - } - } - CALL [6] { - function: size - args: { - LIST [7] { - elements: { - CONSTANT [8] { value: 1 } - CONSTANT [9] { value: 2 } - } - } - } - } - CALL [10] { - function: size - args: { - LIST [11] { - elements: { - CONSTANT [12] { value: 1 } - CONSTANT [13] { value: 2 } - CONSTANT [14] { value: 3 } - } - } - } - } - CALL [15] { - function: _+_ - args: { - CALL [16] { - function: _+_ - args: { - CALL [17] { - function: _+_ - args: { - CONSTANT [18] { value: 5 } - IDENT [19] { - name: @index0 - } - } - } - IDENT [20] { - name: @index0 - } - } - } - IDENT [21] { - name: @index1 - } - } - } - CALL [22] { - function: _+_ - args: { - CALL [23] { - function: _+_ - args: { - CALL [24] { - function: _+_ - args: { - IDENT [25] { - name: @index3 - } - IDENT [26] { - name: @index1 - } - } - } - IDENT [27] { - name: @index2 - } - } - } - IDENT [28] { - name: @index2 - } - } - } - } - } - CALL [29] { - function: _==_ - args: { - IDENT [30] { - name: @index4 - } - CONSTANT [31] { value: 17 } - } - } - } -} -Test case: TIMESTAMP -Source: timestamp(int(timestamp(1000000000))).getFullYear() + timestamp(int(timestamp(75))).getFullYear() + timestamp(int(timestamp(50))).getFullYear() + timestamp(int(timestamp(1000000000))).getFullYear() + timestamp(int(timestamp(50))).getSeconds() + timestamp(int(timestamp(200))).getFullYear() + timestamp(int(timestamp(200))).getFullYear() + timestamp(int(timestamp(75))).getMinutes() + timestamp(int(timestamp(1000000000))).getFullYear() == 13934 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - CALL [3] { - function: timestamp - args: { - CALL [4] { - function: int - args: { - CALL [5] { - function: timestamp - args: { - CONSTANT [6] { value: 1000000000 } - } - } - } - } - } - } - CALL [7] { - function: timestamp - args: { - CALL [8] { - function: int - args: { - CALL [9] { - function: timestamp - args: { - CONSTANT [10] { value: 50 } - } - } - } - } - } - } - CALL [11] { - function: timestamp - args: { - CALL [12] { - function: int - args: { - CALL [13] { - function: timestamp - args: { - CONSTANT [14] { value: 200 } - } - } - } - } - } - } - CALL [15] { - function: timestamp - args: { - CALL [16] { - function: int - args: { - CALL [17] { - function: timestamp - args: { - CONSTANT [18] { value: 75 } - } - } - } - } - } - } - CALL [19] { - function: getFullYear - target: { - IDENT [20] { - name: @index0 - } - } - args: { - } - } - CALL [21] { - function: getFullYear - target: { - IDENT [22] { - name: @index2 - } - } - args: { - } - } - CALL [23] { - function: _+_ - args: { - CALL [24] { - function: _+_ - args: { - IDENT [25] { - name: @index4 - } - CALL [26] { - function: getFullYear - target: { - IDENT [27] { - name: @index3 - } - } - args: { - } - } - } - } - CALL [28] { - function: getFullYear - target: { - IDENT [29] { - name: @index1 - } - } - args: { - } - } - } - } - CALL [30] { - function: _+_ - args: { - CALL [31] { - function: _+_ - args: { - CALL [32] { - function: _+_ - args: { - IDENT [33] { - name: @index6 - } - IDENT [34] { - name: @index4 - } - } - } - CALL [35] { - function: getSeconds - target: { - IDENT [36] { - name: @index1 - } - } - args: { - } - } - } - } - IDENT [37] { - name: @index5 - } - } - } - CALL [38] { - function: _+_ - args: { - CALL [39] { - function: _+_ - args: { - CALL [40] { - function: _+_ - args: { - IDENT [41] { - name: @index7 - } - IDENT [42] { - name: @index5 - } - } - } - CALL [43] { - function: getMinutes - target: { - IDENT [44] { - name: @index3 - } - } - args: { - } - } - } - } - IDENT [45] { - name: @index4 - } - } - } - } - } - CALL [46] { - function: _==_ - args: { - IDENT [47] { - name: @index8 - } - CONSTANT [48] { value: 13934 } - } - } - } -} -Test case: MAP_INDEX -Source: {"a": 2}["a"] + {"a": 2}["a"] * {"a": 2}["a"] == 6 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - CALL [3] { - function: _[_] - args: { - MAP [4] { - MAP_ENTRY [5] { - key: { - CONSTANT [6] { value: "a" } - } - value: { - CONSTANT [7] { value: 2 } - } - } - } - CONSTANT [8] { value: "a" } - } - } - } - } - CALL [9] { - function: _==_ - args: { - CALL [10] { - function: _+_ - args: { - IDENT [11] { - name: @index0 - } - CALL [12] { - function: _*_ - args: { - IDENT [13] { - name: @index0 - } - IDENT [14] { - name: @index0 - } - } - } - } - } - CONSTANT [15] { value: 6 } - } - } - } -} -Test case: NESTED_MAP_CONSTRUCTION -Source: {'a': {'b': 1}, 'c': {'b': 1}, 'd': {'e': {'b': 1}}, 'e': {'e': {'b': 1}}} -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - MAP [3] { - MAP_ENTRY [4] { - key: { - CONSTANT [5] { value: "e" } - } - value: { - MAP [6] { - MAP_ENTRY [7] { - key: { - CONSTANT [8] { value: "b" } - } - value: { - CONSTANT [9] { value: 1 } - } - } - } - } - } - } - MAP [10] { - MAP_ENTRY [11] { - key: { - CONSTANT [12] { value: "b" } - } - value: { - CONSTANT [13] { value: 1 } - } - } - } - } - } - MAP [14] { - MAP_ENTRY [15] { - key: { - CONSTANT [16] { value: "a" } - } - value: { - IDENT [17] { - name: @index1 - } - } - } - MAP_ENTRY [18] { - key: { - CONSTANT [19] { value: "c" } - } - value: { - IDENT [20] { - name: @index1 - } - } - } - MAP_ENTRY [21] { - key: { - CONSTANT [22] { value: "d" } - } - value: { - IDENT [23] { - name: @index0 - } - } - } - MAP_ENTRY [24] { - key: { - CONSTANT [25] { value: "e" } - } - value: { - IDENT [26] { - name: @index0 - } - } - } - } - } -} -Test case: NESTED_LIST_CONSTRUCTION -Source: [1, [1,2,3,4], 2, [1,2,3,4], 5, [1,2,3,4], 7, [[1,2], [1,2,3,4]], [1,2]] -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - LIST [3] { - elements: { - CONSTANT [4] { value: 1 } - CONSTANT [5] { value: 2 } - CONSTANT [6] { value: 3 } - CONSTANT [7] { value: 4 } - } - } - LIST [8] { - elements: { - CONSTANT [9] { value: 1 } - CONSTANT [10] { value: 2 } - } - } - } - } - LIST [11] { - elements: { - CONSTANT [12] { value: 1 } - IDENT [13] { - name: @index0 - } - CONSTANT [14] { value: 2 } - IDENT [15] { - name: @index0 - } - CONSTANT [16] { value: 5 } - IDENT [17] { - name: @index0 - } - CONSTANT [18] { value: 7 } - LIST [19] { - elements: { - IDENT [20] { - name: @index1 - } - IDENT [21] { - name: @index0 - } - } - } - IDENT [22] { - name: @index1 - } - } - } - } -} -Test case: SELECT -Source: msg.single_int64 + msg.single_int64 == 6 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - SELECT [3] { - IDENT [4] { - name: msg - }.single_int64 - } - } - } - CALL [5] { - function: _==_ - args: { - CALL [6] { - function: _+_ - args: { - IDENT [7] { - name: @index0 - } - IDENT [8] { - name: @index0 - } - } - } - CONSTANT [9] { value: 6 } - } - } - } -} -Test case: SELECT_NESTED_1 -Source: msg.oneof_type.payload.single_int64 + msg.oneof_type.payload.single_int32 + msg.oneof_type.payload.single_int64 + msg.single_int64 + msg.oneof_type.payload.oneof_type.payload.single_int64 == 31 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - SELECT [3] { - SELECT [4] { - SELECT [5] { - IDENT [6] { - name: msg - }.oneof_type - }.payload - }.single_int64 - } - SELECT [7] { - SELECT [8] { - IDENT [9] { - name: msg - }.oneof_type - }.payload - } - CALL [10] { - function: _+_ - args: { - CALL [11] { - function: _+_ - args: { - IDENT [12] { - name: @index0 - } - SELECT [13] { - IDENT [14] { - name: @index1 - }.single_int32 - } - } - } - IDENT [15] { - name: @index0 - } - } - } - SELECT [16] { - SELECT [17] { - SELECT [18] { - IDENT [19] { - name: @index1 - }.oneof_type - }.payload - }.single_int64 - } - CALL [20] { - function: _+_ - args: { - CALL [21] { - function: _+_ - args: { - IDENT [22] { - name: @index2 - } - SELECT [23] { - IDENT [24] { - name: msg - }.single_int64 - } - } - } - IDENT [25] { - name: @index3 - } - } - } - } - } - CALL [26] { - function: _==_ - args: { - IDENT [27] { - name: @index4 - } - CONSTANT [28] { value: 31 } - } - } - } -} -Test case: SELECT_NESTED_2 -Source: true || msg.oneof_type.payload.oneof_type.payload.oneof_type.payload.oneof_type.payload.single_bool || msg.oneof_type.payload.oneof_type.payload.oneof_type.child.child.payload.single_bool -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - SELECT [3] { - SELECT [4] { - SELECT [5] { - IDENT [6] { - name: msg - }.oneof_type - }.payload - }.oneof_type - } - SELECT [7] { - SELECT [8] { - IDENT [9] { - name: @index0 - }.payload - }.oneof_type - } - SELECT [10] { - SELECT [11] { - SELECT [12] { - IDENT [13] { - name: @index1 - }.payload - }.oneof_type - }.payload - } - SELECT [14] { - SELECT [15] { - SELECT [16] { - IDENT [17] { - name: @index1 - }.child - }.child - }.payload - } - } - } - CALL [18] { - function: _||_ - args: { - CALL [19] { - function: _||_ - args: { - CONSTANT [20] { value: true } - SELECT [21] { - IDENT [22] { - name: @index2 - }.single_bool - } - } - } - SELECT [23] { - IDENT [24] { - name: @index3 - }.single_bool - } - } - } - } -} -Test case: SELECT_NESTED_MESSAGE_MAP_INDEX_1 -Source: msg.oneof_type.payload.map_int32_int64[1] + msg.oneof_type.payload.map_int32_int64[1] + msg.oneof_type.payload.map_int32_int64[1] == 15 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - SELECT [3] { - SELECT [4] { - SELECT [5] { - IDENT [6] { - name: msg - }.oneof_type - }.payload - }.map_int32_int64 - } - CALL [7] { - function: _[_] - args: { - IDENT [8] { - name: @index0 - } - CONSTANT [9] { value: 1 } - } - } - } - } - CALL [10] { - function: _==_ - args: { - CALL [11] { - function: _+_ - args: { - CALL [12] { - function: _+_ - args: { - IDENT [13] { - name: @index1 - } - IDENT [14] { - name: @index1 - } - } - } - IDENT [15] { - name: @index1 - } - } - } - CONSTANT [16] { value: 15 } - } - } - } -} -Test case: SELECT_NESTED_MESSAGE_MAP_INDEX_2 -Source: msg.oneof_type.payload.map_int32_int64[0] + msg.oneof_type.payload.map_int32_int64[1] + msg.oneof_type.payload.map_int32_int64[2] == 8 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - SELECT [3] { - SELECT [4] { - SELECT [5] { - IDENT [6] { - name: msg - }.oneof_type - }.payload - }.map_int32_int64 - } - CALL [7] { - function: _+_ - args: { - CALL [8] { - function: _+_ - args: { - CALL [9] { - function: _[_] - args: { - IDENT [10] { - name: @index0 - } - CONSTANT [11] { value: 0 } - } - } - CALL [12] { - function: _[_] - args: { - IDENT [13] { - name: @index0 - } - CONSTANT [14] { value: 1 } - } - } - } - } - CALL [15] { - function: _[_] - args: { - IDENT [16] { - name: @index0 - } - CONSTANT [17] { value: 2 } - } - } - } - } - } - } - CALL [18] { - function: _==_ - args: { - IDENT [19] { - name: @index1 - } - CONSTANT [20] { value: 8 } - } - } - } -} -Test case: SELECT_NESTED_NO_COMMON_SUBEXPR -Source: msg.oneof_type.payload.oneof_type.payload.oneof_type.payload.oneof_type.payload.single_int64 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - SELECT [3] { - SELECT [4] { - SELECT [5] { - IDENT [6] { - name: msg - }.oneof_type - }.payload - }.oneof_type - } - SELECT [7] { - SELECT [8] { - SELECT [9] { - IDENT [10] { - name: @index0 - }.payload - }.oneof_type - }.payload - } - } - } - SELECT [11] { - SELECT [12] { - SELECT [13] { - IDENT [14] { - name: @index1 - }.oneof_type - }.payload - }.single_int64 - } - } -} -Test case: TERNARY -Source: (msg.single_int64 > 0 ? msg.single_int64 : 0) == 3 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - SELECT [3] { - IDENT [4] { - name: msg - }.single_int64 - } - } - } - CALL [5] { - function: _==_ - args: { - CALL [6] { - function: _?_:_ - args: { - CALL [7] { - function: _>_ - args: { - IDENT [8] { - name: @index0 - } - CONSTANT [9] { value: 0 } - } - } - IDENT [10] { - name: @index0 - } - CONSTANT [11] { value: 0 } - } - } - CONSTANT [12] { value: 3 } - } - } - } -} -Test case: TERNARY_BIND_RHS_ONLY -Source: false ? false : (msg.single_int64) + ((msg.single_int64 + 1) * 2) == 11 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - SELECT [3] { - IDENT [4] { - name: msg - }.single_int64 - } - CALL [5] { - function: _+_ - args: { - IDENT [6] { - name: @index0 - } - CALL [7] { - function: _*_ - args: { - CALL [8] { - function: _+_ - args: { - IDENT [9] { - name: @index0 - } - CONSTANT [10] { value: 1 } - } - } - CONSTANT [11] { value: 2 } - } - } - } - } - } - } - CALL [12] { - function: _?_:_ - args: { - CONSTANT [13] { value: false } - CONSTANT [14] { value: false } - CALL [15] { - function: _==_ - args: { - IDENT [16] { - name: @index1 - } - CONSTANT [17] { value: 11 } - } - } - } - } - } -} -Test case: NESTED_TERNARY -Source: (msg.single_int64 > 0 ? (msg.single_int32 > 0 ? msg.single_int64 + msg.single_int32 : 0) : 0) == 8 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - SELECT [3] { - IDENT [4] { - name: msg - }.single_int64 - } - SELECT [5] { - IDENT [6] { - name: msg - }.single_int32 - } - CALL [7] { - function: _?_:_ - args: { - CALL [8] { - function: _>_ - args: { - IDENT [9] { - name: @index0 - } - CONSTANT [10] { value: 0 } - } - } - CALL [11] { - function: _?_:_ - args: { - CALL [12] { - function: _>_ - args: { - IDENT [13] { - name: @index1 - } - CONSTANT [14] { value: 0 } - } - } - CALL [15] { - function: _+_ - args: { - IDENT [16] { - name: @index0 - } - IDENT [17] { - name: @index1 - } - } - } - CONSTANT [18] { value: 0 } - } - } - CONSTANT [19] { value: 0 } - } - } - } - } - CALL [20] { - function: _==_ - args: { - IDENT [21] { - name: @index2 - } - CONSTANT [22] { value: 8 } - } - } - } -} -Test case: MULTIPLE_MACROS_1 -Source: size([[1].exists(i, i > 0)]) + size([[1].exists(j, j > 0)]) + size([[2].exists(k, k > 1)]) + size([[2].exists(l, l > 1)]) == 4 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - COMPREHENSION [3] { - iter_var: @it:0:0 - iter_range: { - LIST [4] { - elements: { - CONSTANT [5] { value: 1 } - } - } - } - accu_var: @ac:0:0 - accu_init: { - CONSTANT [6] { value: false } - } - loop_condition: { - CALL [7] { - function: @not_strictly_false - args: { - CALL [8] { - function: !_ - args: { - IDENT [9] { - name: @ac:0:0 - } - } - } - } - } - } - loop_step: { - CALL [10] { - function: _||_ - args: { - IDENT [11] { - name: @ac:0:0 - } - CALL [12] { - function: _>_ - args: { - IDENT [13] { - name: @it:0:0 - } - CONSTANT [14] { value: 0 } - } - } - } - } - } - result: { - IDENT [15] { - name: @ac:0:0 - } - } - } - COMPREHENSION [16] { - iter_var: @it:0:0 - iter_range: { - LIST [17] { - elements: { - CONSTANT [18] { value: 2 } - } - } - } - accu_var: @ac:0:0 - accu_init: { - CONSTANT [19] { value: false } - } - loop_condition: { - CALL [20] { - function: @not_strictly_false - args: { - CALL [21] { - function: !_ - args: { - IDENT [22] { - name: @ac:0:0 - } - } - } - } - } - } - loop_step: { - CALL [23] { - function: _||_ - args: { - IDENT [24] { - name: @ac:0:0 - } - CALL [25] { - function: _>_ - args: { - IDENT [26] { - name: @it:0:0 - } - CONSTANT [27] { value: 1 } - } - } - } - } - } - result: { - IDENT [28] { - name: @ac:0:0 - } - } - } - CALL [29] { - function: size - args: { - LIST [30] { - elements: { - IDENT [31] { - name: @index0 - } - } - } - } - } - CALL [32] { - function: size - args: { - LIST [33] { - elements: { - IDENT [34] { - name: @index1 - } - } - } - } - } - CALL [35] { - function: _+_ - args: { - CALL [36] { - function: _+_ - args: { - CALL [37] { - function: _+_ - args: { - IDENT [38] { - name: @index2 - } - IDENT [39] { - name: @index2 - } - } - } - IDENT [40] { - name: @index3 - } - } - } - IDENT [41] { - name: @index3 - } - } - } - } - } - CALL [42] { - function: _==_ - args: { - IDENT [43] { - name: @index4 - } - CONSTANT [44] { value: 4 } - } - } - } -} -Test case: MULTIPLE_MACROS_2 -Source: [[1].exists(i, i > 0)] + [[1].exists(j, j > 0)] + [['a'].exists(k, k == 'a')] + [['a'].exists(l, l == 'a')] == [true, true, true, true] -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - COMPREHENSION [3] { - iter_var: @it:0:0 - iter_range: { - LIST [4] { - elements: { - CONSTANT [5] { value: 1 } - } - } - } - accu_var: @ac:0:0 - accu_init: { - CONSTANT [6] { value: false } - } - loop_condition: { - CALL [7] { - function: @not_strictly_false - args: { - CALL [8] { - function: !_ - args: { - IDENT [9] { - name: @ac:0:0 - } - } - } - } - } - } - loop_step: { - CALL [10] { - function: _||_ - args: { - IDENT [11] { - name: @ac:0:0 - } - CALL [12] { - function: _>_ - args: { - IDENT [13] { - name: @it:0:0 - } - CONSTANT [14] { value: 0 } - } - } - } - } - } - result: { - IDENT [15] { - name: @ac:0:0 - } - } - } - COMPREHENSION [16] { - iter_var: @it:0:1 - iter_range: { - LIST [17] { - elements: { - CONSTANT [18] { value: "a" } - } - } - } - accu_var: @ac:0:1 - accu_init: { - CONSTANT [19] { value: false } - } - loop_condition: { - CALL [20] { - function: @not_strictly_false - args: { - CALL [21] { - function: !_ - args: { - IDENT [22] { - name: @ac:0:1 - } - } - } - } - } - } - loop_step: { - CALL [23] { - function: _||_ - args: { - IDENT [24] { - name: @ac:0:1 - } - CALL [25] { - function: _==_ - args: { - IDENT [26] { - name: @it:0:1 - } - CONSTANT [27] { value: "a" } - } - } - } - } - } - result: { - IDENT [28] { - name: @ac:0:1 - } - } - } - LIST [29] { - elements: { - IDENT [30] { - name: @index0 - } - } - } - LIST [31] { - elements: { - IDENT [32] { - name: @index1 - } - } - } - CALL [33] { - function: _+_ - args: { - CALL [34] { - function: _+_ - args: { - CALL [35] { - function: _+_ - args: { - IDENT [36] { - name: @index2 - } - IDENT [37] { - name: @index2 - } - } - } - IDENT [38] { - name: @index3 - } - } - } - IDENT [39] { - name: @index3 - } - } - } - } - } - CALL [40] { - function: _==_ - args: { - IDENT [41] { - name: @index4 - } - LIST [42] { - elements: { - CONSTANT [43] { value: true } - CONSTANT [44] { value: true } - CONSTANT [45] { value: true } - CONSTANT [46] { value: true } - } - } - } - } - } -} -Test case: MULTIPLE_MACROS_3 -Source: [1].exists(i, i > 0) && [1].exists(j, j > 0) && [1].exists(k, k > 1) && [2].exists(l, l > 1) -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - COMPREHENSION [3] { - iter_var: @it:0:0 - iter_range: { - LIST [4] { - elements: { - CONSTANT [5] { value: 1 } - } - } - } - accu_var: @ac:0:0 - accu_init: { - CONSTANT [6] { value: false } - } - loop_condition: { - CALL [7] { - function: @not_strictly_false - args: { - CALL [8] { - function: !_ - args: { - IDENT [9] { - name: @ac:0:0 - } - } - } - } - } - } - loop_step: { - CALL [10] { - function: _||_ - args: { - IDENT [11] { - name: @ac:0:0 - } - CALL [12] { - function: _>_ - args: { - IDENT [13] { - name: @it:0:0 - } - CONSTANT [14] { value: 0 } - } - } - } - } - } - result: { - IDENT [15] { - name: @ac:0:0 - } - } - } - } - } - CALL [16] { - function: _&&_ - args: { - CALL [17] { - function: _&&_ - args: { - IDENT [18] { - name: @index0 - } - IDENT [19] { - name: @index0 - } - } - } - CALL [20] { - function: _&&_ - args: { - COMPREHENSION [21] { - iter_var: @it:0:0 - iter_range: { - LIST [22] { - elements: { - CONSTANT [23] { value: 1 } - } - } - } - accu_var: @ac:0:0 - accu_init: { - CONSTANT [24] { value: false } - } - loop_condition: { - CALL [25] { - function: @not_strictly_false - args: { - CALL [26] { - function: !_ - args: { - IDENT [27] { - name: @ac:0:0 - } - } - } - } - } - } - loop_step: { - CALL [28] { - function: _||_ - args: { - IDENT [29] { - name: @ac:0:0 - } - CALL [30] { - function: _>_ - args: { - IDENT [31] { - name: @it:0:0 - } - CONSTANT [32] { value: 1 } - } - } - } - } - } - result: { - IDENT [33] { - name: @ac:0:0 - } - } - } - COMPREHENSION [34] { - iter_var: @it:0:0 - iter_range: { - LIST [35] { - elements: { - CONSTANT [36] { value: 2 } - } - } - } - accu_var: @ac:0:0 - accu_init: { - CONSTANT [37] { value: false } - } - loop_condition: { - CALL [38] { - function: @not_strictly_false - args: { - CALL [39] { - function: !_ - args: { - IDENT [40] { - name: @ac:0:0 - } - } - } - } - } - } - loop_step: { - CALL [41] { - function: _||_ - args: { - IDENT [42] { - name: @ac:0:0 - } - CALL [43] { - function: _>_ - args: { - IDENT [44] { - name: @it:0:0 - } - CONSTANT [45] { value: 1 } - } - } - } - } - } - result: { - IDENT [46] { - name: @ac:0:0 - } - } - } - } - } - } - } - } -} -Test case: MULTIPLE_MACROS_COMP_V2_1 -Source: size([[1].exists(i,x,i > 0 && x >= 0)]) + size([[1].exists(j, y, j > 0 && y >= 0)]) + size([[2].exists(k,z,k > 1 && z >= 0)]) + size([[2].exists(l, w, l > 1 && w >= 0)]) == 4 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - LIST [3] { - elements: { - CONSTANT [4] { value: 1 } - } - } - LIST [5] { - elements: { - CONSTANT [6] { value: 2 } - } - } - } - } - CALL [7] { - function: _==_ - args: { - CALL [8] { - function: _+_ - args: { - CALL [9] { - function: _+_ - args: { - CALL [10] { - function: _+_ - args: { - CALL [11] { - function: size - args: { - LIST [12] { - elements: { - COMPREHENSION [13] { - iter_var: @it:0:0 - iter_var2: @it2:0:0 - iter_range: { - IDENT [14] { - name: @index0 - } - } - accu_var: @ac:0:0 - accu_init: { - CONSTANT [15] { value: false } - } - loop_condition: { - CALL [16] { - function: @not_strictly_false - args: { - CALL [17] { - function: !_ - args: { - IDENT [18] { - name: @ac:0:0 - } - } - } - } - } - } - loop_step: { - CALL [19] { - function: _||_ - args: { - IDENT [20] { - name: @ac:0:0 - } - CALL [21] { - function: _&&_ - args: { - CALL [22] { - function: _>_ - args: { - IDENT [23] { - name: @it:0:0 - } - CONSTANT [24] { value: 0 } - } - } - CALL [25] { - function: _>=_ - args: { - IDENT [26] { - name: @it2:0:0 - } - CONSTANT [27] { value: 0 } - } - } - } - } - } - } - } - result: { - IDENT [28] { - name: @ac:0:0 - } - } - } - } - } - } - } - CALL [29] { - function: size - args: { - LIST [30] { - elements: { - COMPREHENSION [31] { - iter_var: @it:0:0 - iter_var2: @it2:0:0 - iter_range: { - IDENT [32] { - name: @index0 - } - } - accu_var: @ac:0:0 - accu_init: { - CONSTANT [33] { value: false } - } - loop_condition: { - CALL [34] { - function: @not_strictly_false - args: { - CALL [35] { - function: !_ - args: { - IDENT [36] { - name: @ac:0:0 - } - } - } - } - } - } - loop_step: { - CALL [37] { - function: _||_ - args: { - IDENT [38] { - name: @ac:0:0 - } - CALL [39] { - function: _&&_ - args: { - CALL [40] { - function: _>_ - args: { - IDENT [41] { - name: @it:0:0 - } - CONSTANT [42] { value: 0 } - } - } - CALL [43] { - function: _>=_ - args: { - IDENT [44] { - name: @it2:0:0 - } - CONSTANT [45] { value: 0 } - } - } - } - } - } - } - } - result: { - IDENT [46] { - name: @ac:0:0 - } - } - } - } - } - } - } - } - } - CALL [47] { - function: size - args: { - LIST [48] { - elements: { - COMPREHENSION [49] { - iter_var: @it:0:0 - iter_var2: @it2:0:0 - iter_range: { - IDENT [50] { - name: @index1 - } - } - accu_var: @ac:0:0 - accu_init: { - CONSTANT [51] { value: false } - } - loop_condition: { - CALL [52] { - function: @not_strictly_false - args: { - CALL [53] { - function: !_ - args: { - IDENT [54] { - name: @ac:0:0 - } - } - } - } - } - } - loop_step: { - CALL [55] { - function: _||_ - args: { - IDENT [56] { - name: @ac:0:0 - } - CALL [57] { - function: _&&_ - args: { - CALL [58] { - function: _>_ - args: { - IDENT [59] { - name: @it:0:0 - } - CONSTANT [60] { value: 1 } - } - } - CALL [61] { - function: _>=_ - args: { - IDENT [62] { - name: @it2:0:0 - } - CONSTANT [63] { value: 0 } - } - } - } - } - } - } - } - result: { - IDENT [64] { - name: @ac:0:0 - } - } - } - } - } - } - } - } - } - CALL [65] { - function: size - args: { - LIST [66] { - elements: { - COMPREHENSION [67] { - iter_var: @it:0:0 - iter_var2: @it2:0:0 - iter_range: { - IDENT [68] { - name: @index1 - } - } - accu_var: @ac:0:0 - accu_init: { - CONSTANT [69] { value: false } - } - loop_condition: { - CALL [70] { - function: @not_strictly_false - args: { - CALL [71] { - function: !_ - args: { - IDENT [72] { - name: @ac:0:0 - } - } - } - } - } - } - loop_step: { - CALL [73] { - function: _||_ - args: { - IDENT [74] { - name: @ac:0:0 - } - CALL [75] { - function: _&&_ - args: { - CALL [76] { - function: _>_ - args: { - IDENT [77] { - name: @it:0:0 - } - CONSTANT [78] { value: 1 } - } - } - CALL [79] { - function: _>=_ - args: { - IDENT [80] { - name: @it2:0:0 - } - CONSTANT [81] { value: 0 } - } - } - } - } - } - } - } - result: { - IDENT [82] { - name: @ac:0:0 - } - } - } - } - } - } - } - } - } - CONSTANT [83] { value: 4 } - } - } - } -} -Test case: MULTIPLE_MACROS_COMP_V2_2 -Source: [1].exists(i, x, i > 0 && x > 0) && [1].exists(j, y, j > 0 && y > 0) && [1].exists(k, z, k > 1 && z > 0) && [2].exists(l, w, l > 1 && w > 0) -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - LIST [3] { - elements: { - CONSTANT [4] { value: 1 } - } - } - LIST [5] { - elements: { - CONSTANT [6] { value: 2 } - } - } - } - } - CALL [7] { - function: _&&_ - args: { - CALL [8] { - function: _&&_ - args: { - COMPREHENSION [9] { - iter_var: @it:0:0 - iter_var2: @it2:0:0 - iter_range: { - IDENT [10] { - name: @index0 - } - } - accu_var: @ac:0:0 - accu_init: { - CONSTANT [11] { value: false } - } - loop_condition: { - CALL [12] { - function: @not_strictly_false - args: { - CALL [13] { - function: !_ - args: { - IDENT [14] { - name: @ac:0:0 - } - } - } - } - } - } - loop_step: { - CALL [15] { - function: _||_ - args: { - IDENT [16] { - name: @ac:0:0 - } - CALL [17] { - function: _&&_ - args: { - CALL [18] { - function: _>_ - args: { - IDENT [19] { - name: @it:0:0 - } - CONSTANT [20] { value: 0 } - } - } - CALL [21] { - function: _>_ - args: { - IDENT [22] { - name: @it2:0:0 - } - CONSTANT [23] { value: 0 } - } - } - } - } - } - } - } - result: { - IDENT [24] { - name: @ac:0:0 - } - } - } - COMPREHENSION [25] { - iter_var: @it:0:0 - iter_var2: @it2:0:0 - iter_range: { - IDENT [26] { - name: @index0 - } - } - accu_var: @ac:0:0 - accu_init: { - CONSTANT [27] { value: false } - } - loop_condition: { - CALL [28] { - function: @not_strictly_false - args: { - CALL [29] { - function: !_ - args: { - IDENT [30] { - name: @ac:0:0 - } - } - } - } - } - } - loop_step: { - CALL [31] { - function: _||_ - args: { - IDENT [32] { - name: @ac:0:0 - } - CALL [33] { - function: _&&_ - args: { - CALL [34] { - function: _>_ - args: { - IDENT [35] { - name: @it:0:0 - } - CONSTANT [36] { value: 0 } - } - } - CALL [37] { - function: _>_ - args: { - IDENT [38] { - name: @it2:0:0 - } - CONSTANT [39] { value: 0 } - } - } - } - } - } - } - } - result: { - IDENT [40] { - name: @ac:0:0 - } - } - } - } - } - CALL [41] { - function: _&&_ - args: { - COMPREHENSION [42] { - iter_var: @it:0:0 - iter_var2: @it2:0:0 - iter_range: { - IDENT [43] { - name: @index0 - } - } - accu_var: @ac:0:0 - accu_init: { - CONSTANT [44] { value: false } - } - loop_condition: { - CALL [45] { - function: @not_strictly_false - args: { - CALL [46] { - function: !_ - args: { - IDENT [47] { - name: @ac:0:0 - } - } - } - } - } - } - loop_step: { - CALL [48] { - function: _||_ - args: { - IDENT [49] { - name: @ac:0:0 - } - CALL [50] { - function: _&&_ - args: { - CALL [51] { - function: _>_ - args: { - IDENT [52] { - name: @it:0:0 - } - CONSTANT [53] { value: 1 } - } - } - CALL [54] { - function: _>_ - args: { - IDENT [55] { - name: @it2:0:0 - } - CONSTANT [56] { value: 0 } - } - } - } - } - } - } - } - result: { - IDENT [57] { - name: @ac:0:0 - } - } - } - COMPREHENSION [58] { - iter_var: @it:0:0 - iter_var2: @it2:0:0 - iter_range: { - IDENT [59] { - name: @index1 - } - } - accu_var: @ac:0:0 - accu_init: { - CONSTANT [60] { value: false } - } - loop_condition: { - CALL [61] { - function: @not_strictly_false - args: { - CALL [62] { - function: !_ - args: { - IDENT [63] { - name: @ac:0:0 - } - } - } - } - } - } - loop_step: { - CALL [64] { - function: _||_ - args: { - IDENT [65] { - name: @ac:0:0 - } - CALL [66] { - function: _&&_ - args: { - CALL [67] { - function: _>_ - args: { - IDENT [68] { - name: @it:0:0 - } - CONSTANT [69] { value: 1 } - } - } - CALL [70] { - function: _>_ - args: { - IDENT [71] { - name: @it2:0:0 - } - CONSTANT [72] { value: 0 } - } - } - } - } - } - } - } - result: { - IDENT [73] { - name: @ac:0:0 - } - } - } - } - } - } - } - } -} -Test case: NESTED_MACROS -Source: [1,2,3].map(i, [1, 2, 3].map(i, i + 1)) == [[2, 3, 4], [2, 3, 4], [2, 3, 4]] -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - LIST [3] { - elements: { - CONSTANT [4] { value: 1 } - CONSTANT [5] { value: 2 } - CONSTANT [6] { value: 3 } - } - } - LIST [7] { - elements: { - CONSTANT [8] { value: 2 } - CONSTANT [9] { value: 3 } - CONSTANT [10] { value: 4 } - } - } - LIST [11] { - elements: { - IDENT [12] { - name: @index1 - } - IDENT [13] { - name: @index1 - } - IDENT [14] { - name: @index1 - } - } - } - } - } - CALL [15] { - function: _==_ - args: { - COMPREHENSION [16] { - iter_var: @it:1:0 - iter_range: { - IDENT [17] { - name: @index0 - } - } - accu_var: @ac:1:0 - accu_init: { - LIST [18] { - elements: { - } - } - } - loop_condition: { - CONSTANT [19] { value: true } - } - loop_step: { - CALL [20] { - function: _+_ - args: { - IDENT [21] { - name: @ac:1:0 - } - LIST [22] { - elements: { - COMPREHENSION [23] { - iter_var: @it:0:0 - iter_range: { - IDENT [24] { - name: @index0 - } - } - accu_var: @ac:0:0 - accu_init: { - LIST [25] { - elements: { - } - } - } - loop_condition: { - CONSTANT [26] { value: true } - } - loop_step: { - CALL [27] { - function: _+_ - args: { - IDENT [28] { - name: @ac:0:0 - } - LIST [29] { - elements: { - CALL [30] { - function: _+_ - args: { - IDENT [31] { - name: @it:0:0 - } - CONSTANT [32] { value: 1 } - } - } - } - } - } - } - } - result: { - IDENT [33] { - name: @ac:0:0 - } - } - } - } - } - } - } - } - result: { - IDENT [34] { - name: @ac:1:0 - } - } - } - IDENT [35] { - name: @index2 - } - } - } - } -} -Test case: NESTED_MACROS_2 -Source: [1, 2].map(y, [1, 2, 3].filter(x, x == y)) == [[1], [2]] -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - LIST [3] { - elements: { - LIST [4] { - elements: { - CONSTANT [5] { value: 1 } - } - } - LIST [6] { - elements: { - CONSTANT [7] { value: 2 } - } - } - } - } - LIST [8] { - elements: { - CONSTANT [9] { value: 1 } - CONSTANT [10] { value: 2 } - } - } - LIST [11] { - elements: { - CONSTANT [12] { value: 1 } - CONSTANT [13] { value: 2 } - CONSTANT [14] { value: 3 } - } - } - } - } - CALL [15] { - function: _==_ - args: { - COMPREHENSION [16] { - iter_var: @it:1:0 - iter_range: { - IDENT [17] { - name: @index1 - } - } - accu_var: @ac:1:0 - accu_init: { - LIST [18] { - elements: { - } - } - } - loop_condition: { - CONSTANT [19] { value: true } - } - loop_step: { - CALL [20] { - function: _+_ - args: { - IDENT [21] { - name: @ac:1:0 - } - LIST [22] { - elements: { - COMPREHENSION [23] { - iter_var: @it:0:0 - iter_range: { - IDENT [24] { - name: @index2 - } - } - accu_var: @ac:0:0 - accu_init: { - LIST [25] { - elements: { - } - } - } - loop_condition: { - CONSTANT [26] { value: true } - } - loop_step: { - CALL [27] { - function: _?_:_ - args: { - CALL [28] { - function: _==_ - args: { - IDENT [29] { - name: @it:0:0 - } - IDENT [30] { - name: @it:1:0 - } - } - } - CALL [31] { - function: _+_ - args: { - IDENT [32] { - name: @ac:0:0 - } - LIST [33] { - elements: { - IDENT [34] { - name: @it:0:0 - } - } - } - } - } - IDENT [35] { - name: @ac:0:0 - } - } - } - } - result: { - IDENT [36] { - name: @ac:0:0 - } - } - } - } - } - } - } - } - result: { - IDENT [37] { - name: @ac:1:0 - } - } - } - IDENT [38] { - name: @index0 - } - } - } - } -} -Test case: NESTED_MACROS_3 -Source: [1,2,3].map(i, i * 2) + [1,2,3].map(i, i * 2).map(i, i * 2) -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - LIST [3] { - elements: { - CONSTANT [4] { value: 1 } - CONSTANT [5] { value: 2 } - CONSTANT [6] { value: 3 } - } - } - } - } - CALL [7] { - function: _+_ - args: { - COMPREHENSION [8] { - iter_var: @it:0:0 - iter_range: { - IDENT [9] { - name: @index0 - } - } - accu_var: @ac:0:0 - accu_init: { - LIST [10] { - elements: { - } - } - } - loop_condition: { - CONSTANT [11] { value: true } - } - loop_step: { - CALL [12] { - function: _+_ - args: { - IDENT [13] { - name: @ac:0:0 - } - LIST [14] { - elements: { - CALL [15] { - function: _*_ - args: { - IDENT [16] { - name: @it:0:0 - } - CONSTANT [17] { value: 2 } - } - } - } - } - } - } - } - result: { - IDENT [18] { - name: @ac:0:0 - } - } - } - COMPREHENSION [19] { - iter_var: @it:1:0 - iter_range: { - COMPREHENSION [20] { - iter_var: @it:0:0 - iter_range: { - IDENT [21] { - name: @index0 - } - } - accu_var: @ac:0:0 - accu_init: { - LIST [22] { - elements: { - } - } - } - loop_condition: { - CONSTANT [23] { value: true } - } - loop_step: { - CALL [24] { - function: _+_ - args: { - IDENT [25] { - name: @ac:0:0 - } - LIST [26] { - elements: { - CALL [27] { - function: _*_ - args: { - IDENT [28] { - name: @it:0:0 - } - CONSTANT [29] { value: 2 } - } - } - } - } - } - } - } - result: { - IDENT [30] { - name: @ac:0:0 - } - } - } - } - accu_var: @ac:1:0 - accu_init: { - LIST [31] { - elements: { - } - } - } - loop_condition: { - CONSTANT [32] { value: true } - } - loop_step: { - CALL [33] { - function: _+_ - args: { - IDENT [34] { - name: @ac:1:0 - } - LIST [35] { - elements: { - CALL [36] { - function: _*_ - args: { - IDENT [37] { - name: @it:1:0 - } - CONSTANT [38] { value: 2 } - } - } - } - } - } - } - } - result: { - IDENT [39] { - name: @ac:1:0 - } - } - } - } - } - } -} -Test case: NESTED_MACROS_COMP_V2_1 -Source: [1,2,3].transformList(i, v, [1, 2, 3].transformList(i, v, i + v + 1)) == [[2, 4, 6], [2, 4, 6], [2, 4, 6]] -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - LIST [3] { - elements: { - CONSTANT [4] { value: 1 } - CONSTANT [5] { value: 2 } - CONSTANT [6] { value: 3 } - } - } - LIST [7] { - elements: { - CONSTANT [8] { value: 2 } - CONSTANT [9] { value: 4 } - CONSTANT [10] { value: 6 } - } - } - LIST [11] { - elements: { - IDENT [12] { - name: @index1 - } - IDENT [13] { - name: @index1 - } - IDENT [14] { - name: @index1 - } - } - } - } - } - CALL [15] { - function: _==_ - args: { - COMPREHENSION [16] { - iter_var: @it:1:0 - iter_var2: @it2:1:0 - iter_range: { - IDENT [17] { - name: @index0 - } - } - accu_var: @ac:1:0 - accu_init: { - LIST [18] { - elements: { - } - } - } - loop_condition: { - CONSTANT [19] { value: true } - } - loop_step: { - CALL [20] { - function: _+_ - args: { - IDENT [21] { - name: @ac:1:0 - } - LIST [22] { - elements: { - COMPREHENSION [23] { - iter_var: @it:0:0 - iter_var2: @it2:0:0 - iter_range: { - IDENT [24] { - name: @index0 - } - } - accu_var: @ac:0:0 - accu_init: { - LIST [25] { - elements: { - } - } - } - loop_condition: { - CONSTANT [26] { value: true } - } - loop_step: { - CALL [27] { - function: _+_ - args: { - IDENT [28] { - name: @ac:0:0 - } - LIST [29] { - elements: { - CALL [30] { - function: _+_ - args: { - CALL [31] { - function: _+_ - args: { - IDENT [32] { - name: @it:0:0 - } - IDENT [33] { - name: @it2:0:0 - } - } - } - CONSTANT [34] { value: 1 } - } - } - } - } - } - } - } - result: { - IDENT [35] { - name: @ac:0:0 - } - } - } - } - } - } - } - } - result: { - IDENT [36] { - name: @ac:1:0 - } - } - } - IDENT [37] { - name: @index2 - } - } - } - } -} -Test case: NESTED_MACROS_COMP_V2_2 -Source: [1, 2].transformList(i, y, [1, 2, 3].filter(x, x == y && i < y)) == [[1], [2]] -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - LIST [3] { - elements: { - LIST [4] { - elements: { - CONSTANT [5] { value: 1 } - } - } - LIST [6] { - elements: { - CONSTANT [7] { value: 2 } - } - } - } - } - LIST [8] { - elements: { - CONSTANT [9] { value: 1 } - CONSTANT [10] { value: 2 } - } - } - LIST [11] { - elements: { - CONSTANT [12] { value: 1 } - CONSTANT [13] { value: 2 } - CONSTANT [14] { value: 3 } - } - } - } - } - CALL [15] { - function: _==_ - args: { - COMPREHENSION [16] { - iter_var: @it:1:0 - iter_var2: @it2:1:0 - iter_range: { - IDENT [17] { - name: @index1 - } - } - accu_var: @ac:1:0 - accu_init: { - LIST [18] { - elements: { - } - } - } - loop_condition: { - CONSTANT [19] { value: true } - } - loop_step: { - CALL [20] { - function: _+_ - args: { - IDENT [21] { - name: @ac:1:0 - } - LIST [22] { - elements: { - COMPREHENSION [23] { - iter_var: @it:0:0 - iter_range: { - IDENT [24] { - name: @index2 - } - } - accu_var: @ac:0:0 - accu_init: { - LIST [25] { - elements: { - } - } - } - loop_condition: { - CONSTANT [26] { value: true } - } - loop_step: { - CALL [27] { - function: _?_:_ - args: { - CALL [28] { - function: _&&_ - args: { - CALL [29] { - function: _==_ - args: { - IDENT [30] { - name: @it:0:0 - } - IDENT [31] { - name: @it2:1:0 - } - } - } - CALL [32] { - function: _<_ - args: { - IDENT [33] { - name: @it:1:0 - } - IDENT [34] { - name: @it2:1:0 - } - } - } - } - } - CALL [35] { - function: _+_ - args: { - IDENT [36] { - name: @ac:0:0 - } - LIST [37] { - elements: { - IDENT [38] { - name: @it:0:0 - } - } - } - } - } - IDENT [39] { - name: @ac:0:0 - } - } - } - } - result: { - IDENT [40] { - name: @ac:0:0 - } - } - } - } - } - } - } - } - result: { - IDENT [41] { - name: @ac:1:0 - } - } - } - IDENT [42] { - name: @index0 - } - } - } - } -} -Test case: ADJACENT_NESTED_MACROS -Source: [1,2,3].map(i, [1, 2, 3].map(i, i + 1)) == [1,2,3].map(j, [1, 2, 3].map(j, j + 1)) -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - LIST [3] { - elements: { - CONSTANT [4] { value: 1 } - CONSTANT [5] { value: 2 } - CONSTANT [6] { value: 3 } - } - } - } - } - CALL [7] { - function: _==_ - args: { - COMPREHENSION [8] { - iter_var: @it:1:0 - iter_range: { - IDENT [9] { - name: @index0 - } - } - accu_var: @ac:1:0 - accu_init: { - LIST [10] { - elements: { - } - } - } - loop_condition: { - CONSTANT [11] { value: true } - } - loop_step: { - CALL [12] { - function: _+_ - args: { - IDENT [13] { - name: @ac:1:0 - } - LIST [14] { - elements: { - COMPREHENSION [15] { - iter_var: @it:0:0 - iter_range: { - IDENT [16] { - name: @index0 - } - } - accu_var: @ac:0:0 - accu_init: { - LIST [17] { - elements: { - } - } - } - loop_condition: { - CONSTANT [18] { value: true } - } - loop_step: { - CALL [19] { - function: _+_ - args: { - IDENT [20] { - name: @ac:0:0 - } - LIST [21] { - elements: { - CALL [22] { - function: _+_ - args: { - IDENT [23] { - name: @it:0:0 - } - CONSTANT [24] { value: 1 } - } - } - } - } - } - } - } - result: { - IDENT [25] { - name: @ac:0:0 - } - } - } - } - } - } - } - } - result: { - IDENT [26] { - name: @ac:1:0 - } - } - } - COMPREHENSION [27] { - iter_var: @it:1:0 - iter_range: { - IDENT [28] { - name: @index0 - } - } - accu_var: @ac:1:0 - accu_init: { - LIST [29] { - elements: { - } - } - } - loop_condition: { - CONSTANT [30] { value: true } - } - loop_step: { - CALL [31] { - function: _+_ - args: { - IDENT [32] { - name: @ac:1:0 - } - LIST [33] { - elements: { - COMPREHENSION [34] { - iter_var: @it:0:0 - iter_range: { - IDENT [35] { - name: @index0 - } - } - accu_var: @ac:0:0 - accu_init: { - LIST [36] { - elements: { - } - } - } - loop_condition: { - CONSTANT [37] { value: true } - } - loop_step: { - CALL [38] { - function: _+_ - args: { - IDENT [39] { - name: @ac:0:0 - } - LIST [40] { - elements: { - CALL [41] { - function: _+_ - args: { - IDENT [42] { - name: @it:0:0 - } - CONSTANT [43] { value: 1 } - } - } - } - } - } - } - } - result: { - IDENT [44] { - name: @ac:0:0 - } - } - } - } - } - } - } - } - result: { - IDENT [45] { - name: @ac:1:0 - } - } - } - } - } - } -} -Test case: ADJACENT_NESTED_MACROS_COMP_V2 -Source: [1,2,3].transformMap(i, x, [1, 2, 3].transformMap(i, x, i + x + 1)) == [1,2,3].transformMap(j, y, [1, 2, 3].transformMap(j, y, j + y + 1)) -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - LIST [3] { - elements: { - CONSTANT [4] { value: 1 } - CONSTANT [5] { value: 2 } - CONSTANT [6] { value: 3 } - } - } - } - } - CALL [7] { - function: _==_ - args: { - COMPREHENSION [8] { - iter_var: @it:1:0 - iter_var2: @it2:1:0 - iter_range: { - IDENT [9] { - name: @index0 - } - } - accu_var: @ac:1:0 - accu_init: { - MAP [10] { - - } - } - loop_condition: { - CONSTANT [11] { value: true } - } - loop_step: { - CALL [12] { - function: cel.@mapInsert - args: { - IDENT [13] { - name: @ac:1:0 - } - IDENT [14] { - name: @it:1:0 - } - COMPREHENSION [15] { - iter_var: @it:0:0 - iter_var2: @it2:0:0 - iter_range: { - IDENT [16] { - name: @index0 - } - } - accu_var: @ac:0:0 - accu_init: { - MAP [17] { - - } - } - loop_condition: { - CONSTANT [18] { value: true } - } - loop_step: { - CALL [19] { - function: cel.@mapInsert - args: { - IDENT [20] { - name: @ac:0:0 - } - IDENT [21] { - name: @it:0:0 - } - CALL [22] { - function: _+_ - args: { - CALL [23] { - function: _+_ - args: { - IDENT [24] { - name: @it:0:0 - } - IDENT [25] { - name: @it2:0:0 - } - } - } - CONSTANT [26] { value: 1 } - } - } - } - } - } - result: { - IDENT [27] { - name: @ac:0:0 - } - } - } - } - } - } - result: { - IDENT [28] { - name: @ac:1:0 - } - } - } - COMPREHENSION [29] { - iter_var: @it:1:0 - iter_var2: @it2:1:0 - iter_range: { - IDENT [30] { - name: @index0 - } - } - accu_var: @ac:1:0 - accu_init: { - MAP [31] { - - } - } - loop_condition: { - CONSTANT [32] { value: true } - } - loop_step: { - CALL [33] { - function: cel.@mapInsert - args: { - IDENT [34] { - name: @ac:1:0 - } - IDENT [35] { - name: @it:1:0 - } - COMPREHENSION [36] { - iter_var: @it:0:0 - iter_var2: @it2:0:0 - iter_range: { - IDENT [37] { - name: @index0 - } - } - accu_var: @ac:0:0 - accu_init: { - MAP [38] { - - } - } - loop_condition: { - CONSTANT [39] { value: true } - } - loop_step: { - CALL [40] { - function: cel.@mapInsert - args: { - IDENT [41] { - name: @ac:0:0 - } - IDENT [42] { - name: @it:0:0 - } - CALL [43] { - function: _+_ - args: { - CALL [44] { - function: _+_ - args: { - IDENT [45] { - name: @it:0:0 - } - IDENT [46] { - name: @it2:0:0 - } - } - } - CONSTANT [47] { value: 1 } - } - } - } - } - } - result: { - IDENT [48] { - name: @ac:0:0 - } - } - } - } - } - } - result: { - IDENT [49] { - name: @ac:1:0 - } - } - } - } - } - } -} -Test case: INCLUSION_LIST -Source: 1 in [1,2,3] && 2 in [1,2,3] && 3 in [3, [1,2,3]] && 1 in [1,2,3] -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - CALL [3] { - function: @in - args: { - CONSTANT [4] { value: 1 } - LIST [5] { - elements: { - CONSTANT [6] { value: 1 } - CONSTANT [7] { value: 2 } - CONSTANT [8] { value: 3 } - } - } - } - } - LIST [9] { - elements: { - CONSTANT [10] { value: 1 } - CONSTANT [11] { value: 2 } - CONSTANT [12] { value: 3 } - } - } - CALL [13] { - function: _&&_ - args: { - CALL [14] { - function: @in - args: { - CONSTANT [15] { value: 3 } - LIST [16] { - elements: { - CONSTANT [17] { value: 3 } - IDENT [18] { - name: @index1 - } - } - } - } - } - IDENT [19] { - name: @index0 - } - } - } - } - } - CALL [20] { - function: _&&_ - args: { - CALL [21] { - function: _&&_ - args: { - IDENT [22] { - name: @index0 - } - CALL [23] { - function: @in - args: { - CONSTANT [24] { value: 2 } - IDENT [25] { - name: @index1 - } - } - } - } - } - IDENT [26] { - name: @index2 - } - } - } - } -} -Test case: INCLUSION_MAP -Source: 2 in {'a': 1, 2: {true: false}, 3: {true: false}} -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - MAP [3] { - MAP_ENTRY [4] { - key: { - CONSTANT [5] { value: true } - } - value: { - CONSTANT [6] { value: false } - } - } - } - } - } - CALL [7] { - function: @in - args: { - CONSTANT [8] { value: 2 } - MAP [9] { - MAP_ENTRY [10] { - key: { - CONSTANT [11] { value: "a" } - } - value: { - CONSTANT [12] { value: 1 } - } - } - MAP_ENTRY [13] { - key: { - CONSTANT [14] { value: 2 } - } - value: { - IDENT [15] { - name: @index0 - } - } - } - MAP_ENTRY [16] { - key: { - CONSTANT [17] { value: 3 } - } - value: { - IDENT [18] { - name: @index0 - } - } - } - } - } - } - } -} -Test case: MACRO_ITER_VAR_NOT_REFERENCED -Source: [1,2].map(i, [1, 2].map(i, [3,4])) == [[[3, 4], [3, 4]], [[3, 4], [3, 4]]] -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - LIST [3] { - elements: { - LIST [4] { - elements: { - CONSTANT [5] { value: 3 } - CONSTANT [6] { value: 4 } - } - } - LIST [7] { - elements: { - CONSTANT [8] { value: 3 } - CONSTANT [9] { value: 4 } - } - } - } - } - LIST [10] { - elements: { - CONSTANT [11] { value: 1 } - CONSTANT [12] { value: 2 } - } - } - LIST [13] { - elements: { - LIST [14] { - elements: { - CONSTANT [15] { value: 3 } - CONSTANT [16] { value: 4 } - } - } - } - } - COMPREHENSION [17] { - iter_var: @it:0:0 - iter_range: { - IDENT [18] { - name: @index1 - } - } - accu_var: @ac:0:0 - accu_init: { - LIST [19] { - elements: { - } - } - } - loop_condition: { - CONSTANT [20] { value: true } - } - loop_step: { - CALL [21] { - function: _+_ - args: { - IDENT [22] { - name: @ac:0:0 - } - IDENT [23] { - name: @index2 - } - } - } - } - result: { - IDENT [24] { - name: @ac:0:0 - } - } - } - } - } - CALL [25] { - function: _==_ - args: { - COMPREHENSION [26] { - iter_var: @it:1:0 - iter_range: { - IDENT [27] { - name: @index1 - } - } - accu_var: @ac:1:0 - accu_init: { - LIST [28] { - elements: { - } - } - } - loop_condition: { - CONSTANT [29] { value: true } - } - loop_step: { - CALL [30] { - function: _+_ - args: { - IDENT [31] { - name: @ac:1:0 - } - LIST [32] { - elements: { - IDENT [33] { - name: @index3 - } - } - } - } - } - } - result: { - IDENT [34] { - name: @ac:1:0 - } - } - } - LIST [35] { - elements: { - IDENT [36] { - name: @index0 - } - IDENT [37] { - name: @index0 - } - } - } - } - } - } -} -Test case: MACRO_ITER_VAR2_NOT_REFERENCED -Source: [1,2].transformList(i, v, [1, 2].transformList(i, v, [3,4])) == [[[3, 4], [3, 4]], [[3, 4], [3, 4]]] -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - LIST [3] { - elements: { - LIST [4] { - elements: { - CONSTANT [5] { value: 3 } - CONSTANT [6] { value: 4 } - } - } - LIST [7] { - elements: { - CONSTANT [8] { value: 3 } - CONSTANT [9] { value: 4 } - } - } - } - } - LIST [10] { - elements: { - CONSTANT [11] { value: 1 } - CONSTANT [12] { value: 2 } - } - } - LIST [13] { - elements: { - LIST [14] { - elements: { - CONSTANT [15] { value: 3 } - CONSTANT [16] { value: 4 } - } - } - } - } - COMPREHENSION [17] { - iter_var: @it:0:0 - iter_var2: @it2:0:0 - iter_range: { - IDENT [18] { - name: @index1 - } - } - accu_var: @ac:0:0 - accu_init: { - LIST [19] { - elements: { - } - } - } - loop_condition: { - CONSTANT [20] { value: true } - } - loop_step: { - CALL [21] { - function: _+_ - args: { - IDENT [22] { - name: @ac:0:0 - } - IDENT [23] { - name: @index2 - } - } - } - } - result: { - IDENT [24] { - name: @ac:0:0 - } - } - } - } - } - CALL [25] { - function: _==_ - args: { - COMPREHENSION [26] { - iter_var: @it:1:0 - iter_var2: @it2:1:0 - iter_range: { - IDENT [27] { - name: @index1 - } - } - accu_var: @ac:1:0 - accu_init: { - LIST [28] { - elements: { - } - } - } - loop_condition: { - CONSTANT [29] { value: true } - } - loop_step: { - CALL [30] { - function: _+_ - args: { - IDENT [31] { - name: @ac:1:0 - } - LIST [32] { - elements: { - IDENT [33] { - name: @index3 - } - } - } - } - } - } - result: { - IDENT [34] { - name: @ac:1:0 - } - } - } - LIST [35] { - elements: { - IDENT [36] { - name: @index0 - } - IDENT [37] { - name: @index0 - } - } - } - } - } - } -} -Test case: MACRO_SHADOWED_VARIABLE -Source: [x - 1 > 3 ? x - 1 : 5].exists(x, x - 1 > 3) || x - 1 > 3 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - CALL [3] { - function: _>_ - args: { - CALL [4] { - function: _-_ - args: { - IDENT [5] { - name: x - } - CONSTANT [6] { value: 1 } - } - } - CONSTANT [7] { value: 3 } - } - } - LIST [8] { - elements: { - CALL [9] { - function: _?_:_ - args: { - IDENT [10] { - name: @index0 - } - CALL [11] { - function: _-_ - args: { - IDENT [12] { - name: x - } - CONSTANT [13] { value: 1 } - } - } - CONSTANT [14] { value: 5 } - } - } - } - } - } - } - CALL [15] { - function: _||_ - args: { - COMPREHENSION [16] { - iter_var: @it:0:0 - iter_range: { - IDENT [17] { - name: @index1 - } - } - accu_var: @ac:0:0 - accu_init: { - CONSTANT [18] { value: false } - } - loop_condition: { - CALL [19] { - function: @not_strictly_false - args: { - CALL [20] { - function: !_ - args: { - IDENT [21] { - name: @ac:0:0 - } - } - } - } - } - } - loop_step: { - CALL [22] { - function: _||_ - args: { - IDENT [23] { - name: @ac:0:0 - } - CALL [24] { - function: _>_ - args: { - CALL [25] { - function: _-_ - args: { - IDENT [26] { - name: @it:0:0 - } - CONSTANT [27] { value: 1 } - } - } - CONSTANT [28] { value: 3 } - } - } - } - } - } - result: { - IDENT [29] { - name: @ac:0:0 - } - } - } - IDENT [30] { - name: @index0 - } - } - } - } -} -Test case: MACRO_SHADOWED_VARIABLE_2 -Source: ["foo", "bar"].map(x, [x + x, x + x]).map(x, [x + x, x + x]) -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - LIST [3] { - elements: { - CONSTANT [4] { value: "foo" } - CONSTANT [5] { value: "bar" } - } - } - } - } - COMPREHENSION [6] { - iter_var: @it:1:0 - iter_range: { - COMPREHENSION [7] { - iter_var: @it:0:0 - iter_range: { - IDENT [8] { - name: @index0 - } - } - accu_var: @ac:0:0 - accu_init: { - LIST [9] { - elements: { - } - } - } - loop_condition: { - CONSTANT [10] { value: true } - } - loop_step: { - CALL [11] { - function: _+_ - args: { - IDENT [12] { - name: @ac:0:0 - } - LIST [13] { - elements: { - LIST [14] { - elements: { - CALL [15] { - function: _+_ - args: { - IDENT [16] { - name: @it:0:0 - } - IDENT [17] { - name: @it:0:0 - } - } - } - CALL [18] { - function: _+_ - args: { - IDENT [19] { - name: @it:0:0 - } - IDENT [20] { - name: @it:0:0 - } - } - } - } - } - } - } - } - } - } - result: { - IDENT [21] { - name: @ac:0:0 - } - } - } - } - accu_var: @ac:1:0 - accu_init: { - LIST [22] { - elements: { - } - } - } - loop_condition: { - CONSTANT [23] { value: true } - } - loop_step: { - CALL [24] { - function: _+_ - args: { - IDENT [25] { - name: @ac:1:0 - } - LIST [26] { - elements: { - LIST [27] { - elements: { - CALL [28] { - function: _+_ - args: { - IDENT [29] { - name: @it:1:0 - } - IDENT [30] { - name: @it:1:0 - } - } - } - CALL [31] { - function: _+_ - args: { - IDENT [32] { - name: @it:1:0 - } - IDENT [33] { - name: @it:1:0 - } - } - } - } - } - } - } - } - } - } - result: { - IDENT [34] { - name: @ac:1:0 - } - } - } - } -} -Test case: MACRO_SHADOWED_VARIABLE_COMP_V2_1 -Source: [x - y - 1 > 3 ? x - y - 1 : 5].exists(x, y, x - y - 1 > 3) || x - y - 1 > 3 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - CALL [3] { - function: _>_ - args: { - CALL [4] { - function: _-_ - args: { - CALL [5] { - function: _-_ - args: { - IDENT [6] { - name: x - } - IDENT [7] { - name: y - } - } - } - CONSTANT [8] { value: 1 } - } - } - CONSTANT [9] { value: 3 } - } - } - CALL [10] { - function: _?_:_ - args: { - IDENT [11] { - name: @index0 - } - CALL [12] { - function: _-_ - args: { - CALL [13] { - function: _-_ - args: { - IDENT [14] { - name: x - } - IDENT [15] { - name: y - } - } - } - CONSTANT [16] { value: 1 } - } - } - CONSTANT [17] { value: 5 } - } - } - LIST [18] { - elements: { - IDENT [19] { - name: @index1 - } - } - } - } - } - CALL [20] { - function: _||_ - args: { - COMPREHENSION [21] { - iter_var: @it:0:0 - iter_var2: @it2:0:0 - iter_range: { - IDENT [22] { - name: @index2 - } - } - accu_var: @ac:0:0 - accu_init: { - CONSTANT [23] { value: false } - } - loop_condition: { - CALL [24] { - function: @not_strictly_false - args: { - CALL [25] { - function: !_ - args: { - IDENT [26] { - name: @ac:0:0 - } - } - } - } - } - } - loop_step: { - CALL [27] { - function: _||_ - args: { - IDENT [28] { - name: @ac:0:0 - } - CALL [29] { - function: _>_ - args: { - CALL [30] { - function: _-_ - args: { - CALL [31] { - function: _-_ - args: { - IDENT [32] { - name: @it:0:0 - } - IDENT [33] { - name: @it2:0:0 - } - } - } - CONSTANT [34] { value: 1 } - } - } - CONSTANT [35] { value: 3 } - } - } - } - } - } - result: { - IDENT [36] { - name: @ac:0:0 - } - } - } - IDENT [37] { - name: @index0 - } - } - } - } -} -Test case: MACRO_SHADOWED_VARIABLE_COMP_V2_2 -Source: ["foo", "bar"].transformMap(x, y, [x + x, y + y]).transformMap(x, y, [x + x, y + y]) -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - LIST [3] { - elements: { - CONSTANT [4] { value: "foo" } - CONSTANT [5] { value: "bar" } - } - } - } - } - COMPREHENSION [6] { - iter_var: @it:1:0 - iter_var2: @it2:1:0 - iter_range: { - COMPREHENSION [7] { - iter_var: @it:0:0 - iter_var2: @it2:0:0 - iter_range: { - IDENT [8] { - name: @index0 - } - } - accu_var: @ac:0:0 - accu_init: { - MAP [9] { - - } - } - loop_condition: { - CONSTANT [10] { value: true } - } - loop_step: { - CALL [11] { - function: cel.@mapInsert - args: { - IDENT [12] { - name: @ac:0:0 - } - IDENT [13] { - name: @it:0:0 - } - LIST [14] { - elements: { - CALL [15] { - function: _+_ - args: { - IDENT [16] { - name: @it:0:0 - } - IDENT [17] { - name: @it:0:0 - } - } - } - CALL [18] { - function: _+_ - args: { - IDENT [19] { - name: @it2:0:0 - } - IDENT [20] { - name: @it2:0:0 - } - } - } - } - } - } - } - } - result: { - IDENT [21] { - name: @ac:0:0 - } - } - } - } - accu_var: @ac:1:0 - accu_init: { - MAP [22] { - - } - } - loop_condition: { - CONSTANT [23] { value: true } - } - loop_step: { - CALL [24] { - function: cel.@mapInsert - args: { - IDENT [25] { - name: @ac:1:0 - } - IDENT [26] { - name: @it:1:0 - } - LIST [27] { - elements: { - CALL [28] { - function: _+_ - args: { - IDENT [29] { - name: @it:1:0 - } - IDENT [30] { - name: @it:1:0 - } - } - } - CALL [31] { - function: _+_ - args: { - IDENT [32] { - name: @it2:1:0 - } - IDENT [33] { - name: @it2:1:0 - } - } - } - } - } - } - } - } - result: { - IDENT [34] { - name: @ac:1:0 - } - } - } - } -} -Test case: PRESENCE_TEST -Source: has({'a': true}.a) && {'a':true}['a'] -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - MAP [3] { - MAP_ENTRY [4] { - key: { - CONSTANT [5] { value: "a" } - } - value: { - CONSTANT [6] { value: true } - } - } - } - } - } - CALL [7] { - function: _&&_ - args: { - SELECT [8] { - IDENT [9] { - name: @index0 - }.a~presence_test - } - CALL [10] { - function: _[_] - args: { - IDENT [11] { - name: @index0 - } - CONSTANT [12] { value: "a" } - } - } - } - } - } -} -Test case: PRESENCE_TEST_2 -Source: has({'a': true}.a) && has({'a': true}.a) -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - SELECT [3] { - MAP [4] { - MAP_ENTRY [5] { - key: { - CONSTANT [6] { value: "a" } - } - value: { - CONSTANT [7] { value: true } - } - } - }.a~presence_test - } - } - } - CALL [8] { - function: _&&_ - args: { - IDENT [9] { - name: @index0 - } - IDENT [10] { - name: @index0 - } - } - } - } -} -Test case: PRESENCE_TEST_WITH_TERNARY -Source: (has(msg.oneof_type.payload) ? msg.oneof_type.payload.single_int64 : 0) == 10 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - SELECT [3] { - IDENT [4] { - name: msg - }.oneof_type - } - CALL [5] { - function: _?_:_ - args: { - SELECT [6] { - IDENT [7] { - name: @index0 - }.payload~presence_test - } - SELECT [8] { - SELECT [9] { - IDENT [10] { - name: @index0 - }.payload - }.single_int64 - } - CONSTANT [11] { value: 0 } - } - } - } - } - CALL [12] { - function: _==_ - args: { - IDENT [13] { - name: @index1 - } - CONSTANT [14] { value: 10 } - } - } - } -} -Test case: PRESENCE_TEST_WITH_TERNARY_2 -Source: (has(msg.oneof_type.payload) ? msg.oneof_type.payload.single_int64 : msg.oneof_type.payload.single_int64 * 0) == 10 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - SELECT [3] { - SELECT [4] { - SELECT [5] { - IDENT [6] { - name: msg - }.oneof_type - }.payload - }.single_int64 - } - CALL [7] { - function: _?_:_ - args: { - SELECT [8] { - SELECT [9] { - IDENT [10] { - name: msg - }.oneof_type - }.payload~presence_test - } - IDENT [11] { - name: @index0 - } - CALL [12] { - function: _*_ - args: { - IDENT [13] { - name: @index0 - } - CONSTANT [14] { value: 0 } - } - } - } - } - } - } - CALL [15] { - function: _==_ - args: { - IDENT [16] { - name: @index1 - } - CONSTANT [17] { value: 10 } - } - } - } -} -Test case: PRESENCE_TEST_WITH_TERNARY_3 -Source: (has(msg.oneof_type.payload.single_int64) ? msg.oneof_type.payload.single_int64 : msg.oneof_type.payload.single_int64 * 0) == 10 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - SELECT [3] { - SELECT [4] { - SELECT [5] { - IDENT [6] { - name: msg - }.oneof_type - }.payload - }.single_int64 - } - SELECT [7] { - SELECT [8] { - SELECT [9] { - IDENT [10] { - name: msg - }.oneof_type - }.payload - }.single_int64~presence_test - } - } - } - CALL [11] { - function: _==_ - args: { - CALL [12] { - function: _?_:_ - args: { - IDENT [13] { - name: @index1 - } - IDENT [14] { - name: @index0 - } - CALL [15] { - function: _*_ - args: { - IDENT [16] { - name: @index0 - } - CONSTANT [17] { value: 0 } - } - } - } - } - CONSTANT [18] { value: 10 } - } - } - } -} -Test case: PRESENCE_TEST_WITH_TERNARY_NESTED -Source: (has(msg.oneof_type) && has(msg.oneof_type.payload) && has(msg.oneof_type.payload.single_int64)) ? ((has(msg.oneof_type.payload.map_string_string) && has(msg.oneof_type.payload.map_string_string.key)) ? msg.oneof_type.payload.map_string_string.key == 'A' : false) : false -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - SELECT [3] { - SELECT [4] { - SELECT [5] { - IDENT [6] { - name: msg - }.oneof_type - }.payload - }.map_string_string - } - SELECT [7] { - SELECT [8] { - IDENT [9] { - name: msg - }.oneof_type - }.payload - } - CALL [10] { - function: _&&_ - args: { - SELECT [11] { - IDENT [12] { - name: msg - }.oneof_type~presence_test - } - SELECT [13] { - SELECT [14] { - IDENT [15] { - name: msg - }.oneof_type - }.payload~presence_test - } - } - } - CALL [16] { - function: _?_:_ - args: { - CALL [17] { - function: _&&_ - args: { - SELECT [18] { - IDENT [19] { - name: @index1 - }.map_string_string~presence_test - } - SELECT [20] { - IDENT [21] { - name: @index0 - }.key~presence_test - } - } - } - CALL [22] { - function: _==_ - args: { - SELECT [23] { - IDENT [24] { - name: @index0 - }.key - } - CONSTANT [25] { value: "A" } - } - } - CONSTANT [26] { value: false } - } - } - } - } - CALL [27] { - function: _?_:_ - args: { - CALL [28] { - function: _&&_ - args: { - IDENT [29] { - name: @index2 - } - SELECT [30] { - IDENT [31] { - name: @index1 - }.single_int64~presence_test - } - } - } - IDENT [32] { - name: @index3 - } - CONSTANT [33] { value: false } - } - } - } -} -Test case: OPTIONAL_LIST -Source: [10, ?optional.none(), [?optional.none(), ?opt_x], [?optional.none(), ?opt_x]] == [10, [5], [5]] -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - LIST [3] { - elements: { - CALL [4] { - function: optional.none - args: { - } - } - IDENT [5] { - name: opt_x - } - } - optional_indices: [0, 1] - } - LIST [6] { - elements: { - CONSTANT [7] { value: 5 } - } - } - } - } - CALL [8] { - function: _==_ - args: { - LIST [9] { - elements: { - CONSTANT [10] { value: 10 } - CALL [11] { - function: optional.none - args: { - } - } - IDENT [12] { - name: @index0 - } - IDENT [13] { - name: @index0 - } - } - optional_indices: [0] - } - LIST [14] { - elements: { - CONSTANT [15] { value: 10 } - IDENT [16] { - name: @index1 - } - IDENT [17] { - name: @index1 - } - } - } - } - } - } -} -Test case: OPTIONAL_MAP -Source: {?'hello': optional.of('hello')}['hello'] + {?'hello': optional.of('hello')}['hello'] == 'hellohello' -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - CALL [3] { - function: _[_] - args: { - MAP [4] { - MAP_ENTRY [5] { - key: { - CONSTANT [6] { value: "hello" } - } - optional_entry: true - value: { - CALL [7] { - function: optional.of - args: { - CONSTANT [8] { value: "hello" } - } - } - } - } - } - CONSTANT [9] { value: "hello" } - } - } - } - } - CALL [10] { - function: _==_ - args: { - CALL [11] { - function: _+_ - args: { - IDENT [12] { - name: @index0 - } - IDENT [13] { - name: @index0 - } - } - } - CONSTANT [14] { value: "hellohello" } - } - } - } -} -Test case: OPTIONAL_MAP_CHAINED -Source: {?'key': optional.of('test')}[?'bogus'].or({'key': 'test'}[?'bogus']).orValue({'key': 'test'}['key']) == 'test' -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - MAP [3] { - MAP_ENTRY [4] { - key: { - CONSTANT [5] { value: "key" } - } - value: { - CONSTANT [6] { value: "test" } - } - } - } - CALL [7] { - function: _[?_] - args: { - MAP [8] { - MAP_ENTRY [9] { - key: { - CONSTANT [10] { value: "key" } - } - optional_entry: true - value: { - CALL [11] { - function: optional.of - args: { - CONSTANT [12] { value: "test" } - } - } - } - } - } - CONSTANT [13] { value: "bogus" } - } - } - CALL [14] { - function: orValue - target: { - CALL [15] { - function: or - target: { - IDENT [16] { - name: @index1 - } - } - args: { - CALL [17] { - function: _[?_] - args: { - IDENT [18] { - name: @index0 - } - CONSTANT [19] { value: "bogus" } - } - } - } - } - } - args: { - CALL [20] { - function: _[_] - args: { - IDENT [21] { - name: @index0 - } - CONSTANT [22] { value: "key" } - } - } - } - } - } - } - CALL [23] { - function: _==_ - args: { - IDENT [24] { - name: @index2 - } - CONSTANT [25] { value: "test" } - } - } - } -} -Test case: OPTIONAL_MESSAGE -Source: TestAllTypes{?single_int64: optional.ofNonZeroValue(1), ?single_int32: optional.of(4)}.single_int32 + TestAllTypes{?single_int64: optional.ofNonZeroValue(1), ?single_int32: optional.of(4)}.single_int64 == 5 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - STRUCT [3] { - name: cel.expr.conformance.proto3.TestAllTypes - entries: { - ENTRY [4] { - field_key: single_int64 - optional_entry: true - value: { - CALL [5] { - function: optional.ofNonZeroValue - args: { - CONSTANT [6] { value: 1 } - } - } - } - } - ENTRY [7] { - field_key: single_int32 - optional_entry: true - value: { - CALL [8] { - function: optional.of - args: { - CONSTANT [9] { value: 4 } - } - } - } - } - } - } - } - } - CALL [10] { - function: _==_ - args: { - CALL [11] { - function: _+_ - args: { - SELECT [12] { - IDENT [13] { - name: @index0 - }.single_int32 - } - SELECT [14] { - IDENT [15] { - name: @index0 - }.single_int64 - } - } - } - CONSTANT [16] { value: 5 } - } - } - } -} -Test case: CALL -Source: ('h' + 'e' + 'l' + 'l' + 'o' + ' world').matches('h' + 'e' + 'l' + 'l' + 'o') -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - CALL [3] { - function: _+_ - args: { - CALL [4] { - function: _+_ - args: { - CALL [5] { - function: _+_ - args: { - CONSTANT [6] { value: "h" } - CONSTANT [7] { value: "e" } - } - } - CONSTANT [8] { value: "l" } - } - } - CONSTANT [9] { value: "l" } - } - } - CALL [10] { - function: _+_ - args: { - IDENT [11] { - name: @index0 - } - CONSTANT [12] { value: "o" } - } - } - } - } - CALL [13] { - function: matches - target: { - CALL [14] { - function: _+_ - args: { - IDENT [15] { - name: @index1 - } - CONSTANT [16] { value: " world" } - } - } - } - args: { - IDENT [17] { - name: @index1 - } - } - } - } -} -Test case: CALL_ARGUMENT_NESTED_NO_COMMON_SUBEXPR -Source: 'hello world'.matches('h' + 'e' + 'l' + 'l' + 'o') -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - CALL [3] { - function: _+_ - args: { - CALL [4] { - function: _+_ - args: { - CALL [5] { - function: _+_ - args: { - CONSTANT [6] { value: "h" } - CONSTANT [7] { value: "e" } - } - } - CONSTANT [8] { value: "l" } - } - } - CONSTANT [9] { value: "l" } - } - } - } - } - CALL [10] { - function: matches - target: { - CONSTANT [11] { value: "hello world" } - } - args: { - CALL [12] { - function: _+_ - args: { - IDENT [13] { - name: @index0 - } - CONSTANT [14] { value: "o" } - } - } - } - } - } -} -Test case: CALL_TARGET_NESTED_NO_COMMON_SUBEXPR -Source: ('h' + 'e' + 'l' + 'l' + 'o' + ' world').matches('hello') -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - CALL [3] { - function: _+_ - args: { - CALL [4] { - function: _+_ - args: { - CALL [5] { - function: _+_ - args: { - CONSTANT [6] { value: "h" } - CONSTANT [7] { value: "e" } - } - } - CONSTANT [8] { value: "l" } - } - } - CONSTANT [9] { value: "l" } - } - } - } - } - CALL [10] { - function: matches - target: { - CALL [11] { - function: _+_ - args: { - CALL [12] { - function: _+_ - args: { - IDENT [13] { - name: @index0 - } - CONSTANT [14] { value: "o" } - } - } - CONSTANT [15] { value: " world" } - } - } - } - args: { - CONSTANT [16] { value: "hello" } - } - } - } -} -Test case: CALL_BOTH_ARGUMENT_TARGET_NESTED_NO_COMMON_SUBEXPR -Source: ('h' + 'e' + 'l' + 'l' + 'o' + ' world').matches('w' + 'o' + 'r' + 'l' + 'd') -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - CALL [3] { - function: _+_ - args: { - CALL [4] { - function: _+_ - args: { - CALL [5] { - function: _+_ - args: { - CONSTANT [6] { value: "h" } - CONSTANT [7] { value: "e" } - } - } - CONSTANT [8] { value: "l" } - } - } - CONSTANT [9] { value: "l" } - } - } - CALL [10] { - function: _+_ - args: { - CALL [11] { - function: _+_ - args: { - CALL [12] { - function: _+_ - args: { - CONSTANT [13] { value: "w" } - CONSTANT [14] { value: "o" } - } - } - CONSTANT [15] { value: "r" } - } - } - CONSTANT [16] { value: "l" } - } - } - } - } - CALL [17] { - function: matches - target: { - CALL [18] { - function: _+_ - args: { - CALL [19] { - function: _+_ - args: { - IDENT [20] { - name: @index0 - } - CONSTANT [21] { value: "o" } - } - } - CONSTANT [22] { value: " world" } - } - } - } - args: { - CALL [23] { - function: _+_ - args: { - IDENT [24] { - name: @index1 - } - CONSTANT [25] { value: "d" } - } - } - } - } - } -} -Test case: CUSTOM_FUNCTION_INELIMINABLE -Source: non_pure_custom_func(msg.oneof_type.payload.single_int64) + non_pure_custom_func(msg.oneof_type.payload.single_int32) + non_pure_custom_func(msg.oneof_type.payload.single_int64) + non_pure_custom_func(msg.single_int64) -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - SELECT [3] { - SELECT [4] { - SELECT [5] { - IDENT [6] { - name: msg - }.oneof_type - }.payload - }.single_int64 - } - } - } - CALL [7] { - function: _+_ - args: { - CALL [8] { - function: _+_ - args: { - CALL [9] { - function: _+_ - args: { - CALL [10] { - function: non_pure_custom_func - args: { - IDENT [11] { - name: @index0 - } - } - } - CALL [12] { - function: non_pure_custom_func - args: { - SELECT [13] { - SELECT [14] { - SELECT [15] { - IDENT [16] { - name: msg - }.oneof_type - }.payload - }.single_int32 - } - } - } - } - } - CALL [17] { - function: non_pure_custom_func - args: { - IDENT [18] { - name: @index0 - } - } - } - } - } - CALL [19] { - function: non_pure_custom_func - args: { - SELECT [20] { - IDENT [21] { - name: msg - }.single_int64 - } - } - } - } - } - } -} -Test case: CUSTOM_FUNCTION_ELIMINABLE -Source: pure_custom_func(msg.oneof_type.payload.single_int64) + pure_custom_func(msg.oneof_type.payload.single_int32) + pure_custom_func(msg.oneof_type.payload.single_int64) + pure_custom_func(msg.single_int64) -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - SELECT [3] { - SELECT [4] { - SELECT [5] { - IDENT [6] { - name: msg - }.oneof_type - }.payload - }.single_int64 - } - CALL [7] { - function: pure_custom_func - args: { - IDENT [8] { - name: @index0 - } - } - } - SELECT [9] { - SELECT [10] { - SELECT [11] { - IDENT [12] { - name: msg - }.oneof_type - }.payload - }.single_int32 - } - CALL [13] { - function: _+_ - args: { - CALL [14] { - function: _+_ - args: { - IDENT [15] { - name: @index1 - } - CALL [16] { - function: pure_custom_func - args: { - IDENT [17] { - name: @index2 - } - } - } - } - } - IDENT [18] { - name: @index1 - } - } - } - } - } - CALL [19] { - function: _+_ - args: { - IDENT [20] { - name: @index3 - } - CALL [21] { - function: pure_custom_func - args: { - SELECT [22] { - IDENT [23] { - name: msg - }.single_int64 - } - } - } - } - } - } -} \ No newline at end of file diff --git a/optimizer/src/test/resources/subexpression_ast_block_recursion_depth_4.baseline b/optimizer/src/test/resources/subexpression_ast_block_recursion_depth_4.baseline deleted file mode 100644 index fe139eea1..000000000 --- a/optimizer/src/test/resources/subexpression_ast_block_recursion_depth_4.baseline +++ /dev/null @@ -1,4973 +0,0 @@ -Test case: SIZE_1 -Source: size([1,2]) + size([1,2]) + 1 == 5 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - CALL [3] { - function: size - args: { - LIST [4] { - elements: { - CONSTANT [5] { value: 1 } - CONSTANT [6] { value: 2 } - } - } - } - } - } - } - CALL [7] { - function: _==_ - args: { - CALL [8] { - function: _+_ - args: { - CALL [9] { - function: _+_ - args: { - IDENT [10] { - name: @index0 - } - IDENT [11] { - name: @index0 - } - } - } - CONSTANT [12] { value: 1 } - } - } - CONSTANT [13] { value: 5 } - } - } - } -} -Test case: SIZE_2 -Source: 2 + size([1,2]) + size([1,2]) + 1 == 7 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - CALL [3] { - function: size - args: { - LIST [4] { - elements: { - CONSTANT [5] { value: 1 } - CONSTANT [6] { value: 2 } - } - } - } - } - } - } - CALL [7] { - function: _==_ - args: { - CALL [8] { - function: _+_ - args: { - CALL [9] { - function: _+_ - args: { - CALL [10] { - function: _+_ - args: { - CONSTANT [11] { value: 2 } - IDENT [12] { - name: @index0 - } - } - } - IDENT [13] { - name: @index0 - } - } - } - CONSTANT [14] { value: 1 } - } - } - CONSTANT [15] { value: 7 } - } - } - } -} -Test case: SIZE_3 -Source: size([0]) + size([0]) + size([1,2]) + size([1,2]) == 6 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - CALL [3] { - function: size - args: { - LIST [4] { - elements: { - CONSTANT [5] { value: 0 } - } - } - } - } - CALL [6] { - function: size - args: { - LIST [7] { - elements: { - CONSTANT [8] { value: 1 } - CONSTANT [9] { value: 2 } - } - } - } - } - } - } - CALL [10] { - function: _==_ - args: { - CALL [11] { - function: _+_ - args: { - CALL [12] { - function: _+_ - args: { - CALL [13] { - function: _+_ - args: { - IDENT [14] { - name: @index0 - } - IDENT [15] { - name: @index0 - } - } - } - IDENT [16] { - name: @index1 - } - } - } - IDENT [17] { - name: @index1 - } - } - } - CONSTANT [18] { value: 6 } - } - } - } -} -Test case: SIZE_4 -Source: 5 + size([0]) + size([0]) + size([1,2]) + size([1,2]) + size([1,2,3]) + size([1,2,3]) == 17 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - CALL [3] { - function: size - args: { - LIST [4] { - elements: { - CONSTANT [5] { value: 0 } - } - } - } - } - CALL [6] { - function: size - args: { - LIST [7] { - elements: { - CONSTANT [8] { value: 1 } - CONSTANT [9] { value: 2 } - } - } - } - } - CALL [10] { - function: size - args: { - LIST [11] { - elements: { - CONSTANT [12] { value: 1 } - CONSTANT [13] { value: 2 } - CONSTANT [14] { value: 3 } - } - } - } - } - CALL [15] { - function: _+_ - args: { - CALL [16] { - function: _+_ - args: { - CALL [17] { - function: _+_ - args: { - CALL [18] { - function: _+_ - args: { - CONSTANT [19] { value: 5 } - IDENT [20] { - name: @index0 - } - } - } - IDENT [21] { - name: @index0 - } - } - } - IDENT [22] { - name: @index1 - } - } - } - IDENT [23] { - name: @index1 - } - } - } - } - } - CALL [24] { - function: _==_ - args: { - CALL [25] { - function: _+_ - args: { - CALL [26] { - function: _+_ - args: { - IDENT [27] { - name: @index3 - } - IDENT [28] { - name: @index2 - } - } - } - IDENT [29] { - name: @index2 - } - } - } - CONSTANT [30] { value: 17 } - } - } - } -} -Test case: TIMESTAMP -Source: timestamp(int(timestamp(1000000000))).getFullYear() + timestamp(int(timestamp(75))).getFullYear() + timestamp(int(timestamp(50))).getFullYear() + timestamp(int(timestamp(1000000000))).getFullYear() + timestamp(int(timestamp(50))).getSeconds() + timestamp(int(timestamp(200))).getFullYear() + timestamp(int(timestamp(200))).getFullYear() + timestamp(int(timestamp(75))).getMinutes() + timestamp(int(timestamp(1000000000))).getFullYear() == 13934 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - CALL [3] { - function: getFullYear - target: { - CALL [4] { - function: timestamp - args: { - CALL [5] { - function: int - args: { - CALL [6] { - function: timestamp - args: { - CONSTANT [7] { value: 1000000000 } - } - } - } - } - } - } - } - args: { - } - } - CALL [8] { - function: getFullYear - target: { - CALL [9] { - function: timestamp - args: { - CALL [10] { - function: int - args: { - CALL [11] { - function: timestamp - args: { - CONSTANT [12] { value: 200 } - } - } - } - } - } - } - } - args: { - } - } - CALL [13] { - function: timestamp - args: { - CALL [14] { - function: int - args: { - CALL [15] { - function: timestamp - args: { - CONSTANT [16] { value: 50 } - } - } - } - } - } - } - CALL [17] { - function: timestamp - args: { - CALL [18] { - function: int - args: { - CALL [19] { - function: timestamp - args: { - CONSTANT [20] { value: 75 } - } - } - } - } - } - } - CALL [21] { - function: _+_ - args: { - CALL [22] { - function: _+_ - args: { - CALL [23] { - function: _+_ - args: { - IDENT [24] { - name: @index0 - } - CALL [25] { - function: getFullYear - target: { - IDENT [26] { - name: @index3 - } - } - args: { - } - } - } - } - CALL [27] { - function: getFullYear - target: { - IDENT [28] { - name: @index2 - } - } - args: { - } - } - } - } - IDENT [29] { - name: @index0 - } - } - } - CALL [30] { - function: _+_ - args: { - CALL [31] { - function: _+_ - args: { - CALL [32] { - function: _+_ - args: { - IDENT [33] { - name: @index4 - } - CALL [34] { - function: getSeconds - target: { - IDENT [35] { - name: @index2 - } - } - args: { - } - } - } - } - IDENT [36] { - name: @index1 - } - } - } - IDENT [37] { - name: @index1 - } - } - } - } - } - CALL [38] { - function: _==_ - args: { - CALL [39] { - function: _+_ - args: { - CALL [40] { - function: _+_ - args: { - IDENT [41] { - name: @index5 - } - CALL [42] { - function: getMinutes - target: { - IDENT [43] { - name: @index3 - } - } - args: { - } - } - } - } - IDENT [44] { - name: @index0 - } - } - } - CONSTANT [45] { value: 13934 } - } - } - } -} -Test case: MAP_INDEX -Source: {"a": 2}["a"] + {"a": 2}["a"] * {"a": 2}["a"] == 6 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - CALL [3] { - function: _[_] - args: { - MAP [4] { - MAP_ENTRY [5] { - key: { - CONSTANT [6] { value: "a" } - } - value: { - CONSTANT [7] { value: 2 } - } - } - } - CONSTANT [8] { value: "a" } - } - } - } - } - CALL [9] { - function: _==_ - args: { - CALL [10] { - function: _+_ - args: { - IDENT [11] { - name: @index0 - } - CALL [12] { - function: _*_ - args: { - IDENT [13] { - name: @index0 - } - IDENT [14] { - name: @index0 - } - } - } - } - } - CONSTANT [15] { value: 6 } - } - } - } -} -Test case: NESTED_MAP_CONSTRUCTION -Source: {'a': {'b': 1}, 'c': {'b': 1}, 'd': {'e': {'b': 1}}, 'e': {'e': {'b': 1}}} -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - MAP [3] { - MAP_ENTRY [4] { - key: { - CONSTANT [5] { value: "e" } - } - value: { - MAP [6] { - MAP_ENTRY [7] { - key: { - CONSTANT [8] { value: "b" } - } - value: { - CONSTANT [9] { value: 1 } - } - } - } - } - } - } - MAP [10] { - MAP_ENTRY [11] { - key: { - CONSTANT [12] { value: "b" } - } - value: { - CONSTANT [13] { value: 1 } - } - } - } - } - } - MAP [14] { - MAP_ENTRY [15] { - key: { - CONSTANT [16] { value: "a" } - } - value: { - IDENT [17] { - name: @index1 - } - } - } - MAP_ENTRY [18] { - key: { - CONSTANT [19] { value: "c" } - } - value: { - IDENT [20] { - name: @index1 - } - } - } - MAP_ENTRY [21] { - key: { - CONSTANT [22] { value: "d" } - } - value: { - IDENT [23] { - name: @index0 - } - } - } - MAP_ENTRY [24] { - key: { - CONSTANT [25] { value: "e" } - } - value: { - IDENT [26] { - name: @index0 - } - } - } - } - } -} -Test case: NESTED_LIST_CONSTRUCTION -Source: [1, [1,2,3,4], 2, [1,2,3,4], 5, [1,2,3,4], 7, [[1,2], [1,2,3,4]], [1,2]] -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - LIST [3] { - elements: { - CONSTANT [4] { value: 1 } - CONSTANT [5] { value: 2 } - CONSTANT [6] { value: 3 } - CONSTANT [7] { value: 4 } - } - } - LIST [8] { - elements: { - CONSTANT [9] { value: 1 } - CONSTANT [10] { value: 2 } - } - } - } - } - LIST [11] { - elements: { - CONSTANT [12] { value: 1 } - IDENT [13] { - name: @index0 - } - CONSTANT [14] { value: 2 } - IDENT [15] { - name: @index0 - } - CONSTANT [16] { value: 5 } - IDENT [17] { - name: @index0 - } - CONSTANT [18] { value: 7 } - LIST [19] { - elements: { - IDENT [20] { - name: @index1 - } - IDENT [21] { - name: @index0 - } - } - } - IDENT [22] { - name: @index1 - } - } - } - } -} -Test case: SELECT -Source: msg.single_int64 + msg.single_int64 == 6 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - SELECT [3] { - IDENT [4] { - name: msg - }.single_int64 - } - } - } - CALL [5] { - function: _==_ - args: { - CALL [6] { - function: _+_ - args: { - IDENT [7] { - name: @index0 - } - IDENT [8] { - name: @index0 - } - } - } - CONSTANT [9] { value: 6 } - } - } - } -} -Test case: SELECT_NESTED_1 -Source: msg.oneof_type.payload.single_int64 + msg.oneof_type.payload.single_int32 + msg.oneof_type.payload.single_int64 + msg.single_int64 + msg.oneof_type.payload.oneof_type.payload.single_int64 == 31 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - SELECT [3] { - SELECT [4] { - SELECT [5] { - IDENT [6] { - name: msg - }.oneof_type - }.payload - }.single_int64 - } - SELECT [7] { - SELECT [8] { - IDENT [9] { - name: msg - }.oneof_type - }.payload - } - CALL [10] { - function: _+_ - args: { - CALL [11] { - function: _+_ - args: { - CALL [12] { - function: _+_ - args: { - IDENT [13] { - name: @index0 - } - SELECT [14] { - IDENT [15] { - name: @index1 - }.single_int32 - } - } - } - IDENT [16] { - name: @index0 - } - } - } - SELECT [17] { - IDENT [18] { - name: msg - }.single_int64 - } - } - } - CALL [19] { - function: _+_ - args: { - IDENT [20] { - name: @index2 - } - SELECT [21] { - SELECT [22] { - SELECT [23] { - IDENT [24] { - name: @index1 - }.oneof_type - }.payload - }.single_int64 - } - } - } - } - } - CALL [25] { - function: _==_ - args: { - IDENT [26] { - name: @index3 - } - CONSTANT [27] { value: 31 } - } - } - } -} -Test case: SELECT_NESTED_2 -Source: true || msg.oneof_type.payload.oneof_type.payload.oneof_type.payload.oneof_type.payload.single_bool || msg.oneof_type.payload.oneof_type.payload.oneof_type.child.child.payload.single_bool -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - SELECT [3] { - SELECT [4] { - SELECT [5] { - SELECT [6] { - IDENT [7] { - name: msg - }.oneof_type - }.payload - }.oneof_type - }.payload - } - SELECT [8] { - IDENT [9] { - name: @index0 - }.oneof_type - } - SELECT [10] { - SELECT [11] { - SELECT [12] { - SELECT [13] { - IDENT [14] { - name: @index1 - }.payload - }.oneof_type - }.payload - }.single_bool - } - SELECT [15] { - SELECT [16] { - SELECT [17] { - SELECT [18] { - IDENT [19] { - name: @index1 - }.child - }.child - }.payload - }.single_bool - } - } - } - CALL [20] { - function: _||_ - args: { - CALL [21] { - function: _||_ - args: { - CONSTANT [22] { value: true } - IDENT [23] { - name: @index2 - } - } - } - IDENT [24] { - name: @index3 - } - } - } - } -} -Test case: SELECT_NESTED_MESSAGE_MAP_INDEX_1 -Source: msg.oneof_type.payload.map_int32_int64[1] + msg.oneof_type.payload.map_int32_int64[1] + msg.oneof_type.payload.map_int32_int64[1] == 15 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - CALL [3] { - function: _[_] - args: { - SELECT [4] { - SELECT [5] { - SELECT [6] { - IDENT [7] { - name: msg - }.oneof_type - }.payload - }.map_int32_int64 - } - CONSTANT [8] { value: 1 } - } - } - } - } - CALL [9] { - function: _==_ - args: { - CALL [10] { - function: _+_ - args: { - CALL [11] { - function: _+_ - args: { - IDENT [12] { - name: @index0 - } - IDENT [13] { - name: @index0 - } - } - } - IDENT [14] { - name: @index0 - } - } - } - CONSTANT [15] { value: 15 } - } - } - } -} -Test case: SELECT_NESTED_MESSAGE_MAP_INDEX_2 -Source: msg.oneof_type.payload.map_int32_int64[0] + msg.oneof_type.payload.map_int32_int64[1] + msg.oneof_type.payload.map_int32_int64[2] == 8 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - SELECT [3] { - SELECT [4] { - SELECT [5] { - IDENT [6] { - name: msg - }.oneof_type - }.payload - }.map_int32_int64 - } - } - } - CALL [7] { - function: _==_ - args: { - CALL [8] { - function: _+_ - args: { - CALL [9] { - function: _+_ - args: { - CALL [10] { - function: _[_] - args: { - IDENT [11] { - name: @index0 - } - CONSTANT [12] { value: 0 } - } - } - CALL [13] { - function: _[_] - args: { - IDENT [14] { - name: @index0 - } - CONSTANT [15] { value: 1 } - } - } - } - } - CALL [16] { - function: _[_] - args: { - IDENT [17] { - name: @index0 - } - CONSTANT [18] { value: 2 } - } - } - } - } - CONSTANT [19] { value: 8 } - } - } - } -} -Test case: SELECT_NESTED_NO_COMMON_SUBEXPR -Source: msg.oneof_type.payload.oneof_type.payload.oneof_type.payload.oneof_type.payload.single_int64 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - SELECT [3] { - SELECT [4] { - SELECT [5] { - SELECT [6] { - IDENT [7] { - name: msg - }.oneof_type - }.payload - }.oneof_type - }.payload - } - SELECT [8] { - SELECT [9] { - SELECT [10] { - SELECT [11] { - IDENT [12] { - name: @index0 - }.oneof_type - }.payload - }.oneof_type - }.payload - } - } - } - SELECT [13] { - IDENT [14] { - name: @index1 - }.single_int64 - } - } -} -Test case: TERNARY -Source: (msg.single_int64 > 0 ? msg.single_int64 : 0) == 3 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - SELECT [3] { - IDENT [4] { - name: msg - }.single_int64 - } - } - } - CALL [5] { - function: _==_ - args: { - CALL [6] { - function: _?_:_ - args: { - CALL [7] { - function: _>_ - args: { - IDENT [8] { - name: @index0 - } - CONSTANT [9] { value: 0 } - } - } - IDENT [10] { - name: @index0 - } - CONSTANT [11] { value: 0 } - } - } - CONSTANT [12] { value: 3 } - } - } - } -} -Test case: TERNARY_BIND_RHS_ONLY -Source: false ? false : (msg.single_int64) + ((msg.single_int64 + 1) * 2) == 11 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - SELECT [3] { - IDENT [4] { - name: msg - }.single_int64 - } - CALL [5] { - function: _==_ - args: { - CALL [6] { - function: _+_ - args: { - IDENT [7] { - name: @index0 - } - CALL [8] { - function: _*_ - args: { - CALL [9] { - function: _+_ - args: { - IDENT [10] { - name: @index0 - } - CONSTANT [11] { value: 1 } - } - } - CONSTANT [12] { value: 2 } - } - } - } - } - CONSTANT [13] { value: 11 } - } - } - } - } - CALL [14] { - function: _?_:_ - args: { - CONSTANT [15] { value: false } - CONSTANT [16] { value: false } - IDENT [17] { - name: @index1 - } - } - } - } -} -Test case: NESTED_TERNARY -Source: (msg.single_int64 > 0 ? (msg.single_int32 > 0 ? msg.single_int64 + msg.single_int32 : 0) : 0) == 8 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - SELECT [3] { - IDENT [4] { - name: msg - }.single_int64 - } - SELECT [5] { - IDENT [6] { - name: msg - }.single_int32 - } - } - } - CALL [7] { - function: _==_ - args: { - CALL [8] { - function: _?_:_ - args: { - CALL [9] { - function: _>_ - args: { - IDENT [10] { - name: @index0 - } - CONSTANT [11] { value: 0 } - } - } - CALL [12] { - function: _?_:_ - args: { - CALL [13] { - function: _>_ - args: { - IDENT [14] { - name: @index1 - } - CONSTANT [15] { value: 0 } - } - } - CALL [16] { - function: _+_ - args: { - IDENT [17] { - name: @index0 - } - IDENT [18] { - name: @index1 - } - } - } - CONSTANT [19] { value: 0 } - } - } - CONSTANT [20] { value: 0 } - } - } - CONSTANT [21] { value: 8 } - } - } - } -} -Test case: MULTIPLE_MACROS_1 -Source: size([[1].exists(i, i > 0)]) + size([[1].exists(j, j > 0)]) + size([[2].exists(k, k > 1)]) + size([[2].exists(l, l > 1)]) == 4 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - COMPREHENSION [3] { - iter_var: @it:0:0 - iter_range: { - LIST [4] { - elements: { - CONSTANT [5] { value: 1 } - } - } - } - accu_var: @ac:0:0 - accu_init: { - CONSTANT [6] { value: false } - } - loop_condition: { - CALL [7] { - function: @not_strictly_false - args: { - CALL [8] { - function: !_ - args: { - IDENT [9] { - name: @ac:0:0 - } - } - } - } - } - } - loop_step: { - CALL [10] { - function: _||_ - args: { - IDENT [11] { - name: @ac:0:0 - } - CALL [12] { - function: _>_ - args: { - IDENT [13] { - name: @it:0:0 - } - CONSTANT [14] { value: 0 } - } - } - } - } - } - result: { - IDENT [15] { - name: @ac:0:0 - } - } - } - COMPREHENSION [16] { - iter_var: @it:0:0 - iter_range: { - LIST [17] { - elements: { - CONSTANT [18] { value: 2 } - } - } - } - accu_var: @ac:0:0 - accu_init: { - CONSTANT [19] { value: false } - } - loop_condition: { - CALL [20] { - function: @not_strictly_false - args: { - CALL [21] { - function: !_ - args: { - IDENT [22] { - name: @ac:0:0 - } - } - } - } - } - } - loop_step: { - CALL [23] { - function: _||_ - args: { - IDENT [24] { - name: @ac:0:0 - } - CALL [25] { - function: _>_ - args: { - IDENT [26] { - name: @it:0:0 - } - CONSTANT [27] { value: 1 } - } - } - } - } - } - result: { - IDENT [28] { - name: @ac:0:0 - } - } - } - CALL [29] { - function: size - args: { - LIST [30] { - elements: { - IDENT [31] { - name: @index0 - } - } - } - } - } - CALL [32] { - function: size - args: { - LIST [33] { - elements: { - IDENT [34] { - name: @index1 - } - } - } - } - } - } - } - CALL [35] { - function: _==_ - args: { - CALL [36] { - function: _+_ - args: { - CALL [37] { - function: _+_ - args: { - CALL [38] { - function: _+_ - args: { - IDENT [39] { - name: @index2 - } - IDENT [40] { - name: @index2 - } - } - } - IDENT [41] { - name: @index3 - } - } - } - IDENT [42] { - name: @index3 - } - } - } - CONSTANT [43] { value: 4 } - } - } - } -} -Test case: MULTIPLE_MACROS_2 -Source: [[1].exists(i, i > 0)] + [[1].exists(j, j > 0)] + [['a'].exists(k, k == 'a')] + [['a'].exists(l, l == 'a')] == [true, true, true, true] -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - COMPREHENSION [3] { - iter_var: @it:0:0 - iter_range: { - LIST [4] { - elements: { - CONSTANT [5] { value: 1 } - } - } - } - accu_var: @ac:0:0 - accu_init: { - CONSTANT [6] { value: false } - } - loop_condition: { - CALL [7] { - function: @not_strictly_false - args: { - CALL [8] { - function: !_ - args: { - IDENT [9] { - name: @ac:0:0 - } - } - } - } - } - } - loop_step: { - CALL [10] { - function: _||_ - args: { - IDENT [11] { - name: @ac:0:0 - } - CALL [12] { - function: _>_ - args: { - IDENT [13] { - name: @it:0:0 - } - CONSTANT [14] { value: 0 } - } - } - } - } - } - result: { - IDENT [15] { - name: @ac:0:0 - } - } - } - COMPREHENSION [16] { - iter_var: @it:0:1 - iter_range: { - LIST [17] { - elements: { - CONSTANT [18] { value: "a" } - } - } - } - accu_var: @ac:0:1 - accu_init: { - CONSTANT [19] { value: false } - } - loop_condition: { - CALL [20] { - function: @not_strictly_false - args: { - CALL [21] { - function: !_ - args: { - IDENT [22] { - name: @ac:0:1 - } - } - } - } - } - } - loop_step: { - CALL [23] { - function: _||_ - args: { - IDENT [24] { - name: @ac:0:1 - } - CALL [25] { - function: _==_ - args: { - IDENT [26] { - name: @it:0:1 - } - CONSTANT [27] { value: "a" } - } - } - } - } - } - result: { - IDENT [28] { - name: @ac:0:1 - } - } - } - LIST [29] { - elements: { - IDENT [30] { - name: @index0 - } - } - } - LIST [31] { - elements: { - IDENT [32] { - name: @index1 - } - } - } - } - } - CALL [33] { - function: _==_ - args: { - CALL [34] { - function: _+_ - args: { - CALL [35] { - function: _+_ - args: { - CALL [36] { - function: _+_ - args: { - IDENT [37] { - name: @index2 - } - IDENT [38] { - name: @index2 - } - } - } - IDENT [39] { - name: @index3 - } - } - } - IDENT [40] { - name: @index3 - } - } - } - LIST [41] { - elements: { - CONSTANT [42] { value: true } - CONSTANT [43] { value: true } - CONSTANT [44] { value: true } - CONSTANT [45] { value: true } - } - } - } - } - } -} -Test case: MULTIPLE_MACROS_3 -Source: [1].exists(i, i > 0) && [1].exists(j, j > 0) && [1].exists(k, k > 1) && [2].exists(l, l > 1) -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - COMPREHENSION [3] { - iter_var: @it:0:0 - iter_range: { - LIST [4] { - elements: { - CONSTANT [5] { value: 1 } - } - } - } - accu_var: @ac:0:0 - accu_init: { - CONSTANT [6] { value: false } - } - loop_condition: { - CALL [7] { - function: @not_strictly_false - args: { - CALL [8] { - function: !_ - args: { - IDENT [9] { - name: @ac:0:0 - } - } - } - } - } - } - loop_step: { - CALL [10] { - function: _||_ - args: { - IDENT [11] { - name: @ac:0:0 - } - CALL [12] { - function: _>_ - args: { - IDENT [13] { - name: @it:0:0 - } - CONSTANT [14] { value: 0 } - } - } - } - } - } - result: { - IDENT [15] { - name: @ac:0:0 - } - } - } - } - } - CALL [16] { - function: _&&_ - args: { - CALL [17] { - function: _&&_ - args: { - IDENT [18] { - name: @index0 - } - IDENT [19] { - name: @index0 - } - } - } - CALL [20] { - function: _&&_ - args: { - COMPREHENSION [21] { - iter_var: @it:0:0 - iter_range: { - LIST [22] { - elements: { - CONSTANT [23] { value: 1 } - } - } - } - accu_var: @ac:0:0 - accu_init: { - CONSTANT [24] { value: false } - } - loop_condition: { - CALL [25] { - function: @not_strictly_false - args: { - CALL [26] { - function: !_ - args: { - IDENT [27] { - name: @ac:0:0 - } - } - } - } - } - } - loop_step: { - CALL [28] { - function: _||_ - args: { - IDENT [29] { - name: @ac:0:0 - } - CALL [30] { - function: _>_ - args: { - IDENT [31] { - name: @it:0:0 - } - CONSTANT [32] { value: 1 } - } - } - } - } - } - result: { - IDENT [33] { - name: @ac:0:0 - } - } - } - COMPREHENSION [34] { - iter_var: @it:0:0 - iter_range: { - LIST [35] { - elements: { - CONSTANT [36] { value: 2 } - } - } - } - accu_var: @ac:0:0 - accu_init: { - CONSTANT [37] { value: false } - } - loop_condition: { - CALL [38] { - function: @not_strictly_false - args: { - CALL [39] { - function: !_ - args: { - IDENT [40] { - name: @ac:0:0 - } - } - } - } - } - } - loop_step: { - CALL [41] { - function: _||_ - args: { - IDENT [42] { - name: @ac:0:0 - } - CALL [43] { - function: _>_ - args: { - IDENT [44] { - name: @it:0:0 - } - CONSTANT [45] { value: 1 } - } - } - } - } - } - result: { - IDENT [46] { - name: @ac:0:0 - } - } - } - } - } - } - } - } -} -Test case: MULTIPLE_MACROS_COMP_V2_1 -Source: size([[1].exists(i,x,i > 0 && x >= 0)]) + size([[1].exists(j, y, j > 0 && y >= 0)]) + size([[2].exists(k,z,k > 1 && z >= 0)]) + size([[2].exists(l, w, l > 1 && w >= 0)]) == 4 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - COMPREHENSION [3] { - iter_var: @it:0:0 - iter_var2: @it2:0:0 - iter_range: { - LIST [4] { - elements: { - CONSTANT [5] { value: 1 } - } - } - } - accu_var: @ac:0:0 - accu_init: { - CONSTANT [6] { value: false } - } - loop_condition: { - CALL [7] { - function: @not_strictly_false - args: { - CALL [8] { - function: !_ - args: { - IDENT [9] { - name: @ac:0:0 - } - } - } - } - } - } - loop_step: { - CALL [10] { - function: _||_ - args: { - IDENT [11] { - name: @ac:0:0 - } - CALL [12] { - function: _&&_ - args: { - CALL [13] { - function: _>_ - args: { - IDENT [14] { - name: @it:0:0 - } - CONSTANT [15] { value: 0 } - } - } - CALL [16] { - function: _>=_ - args: { - IDENT [17] { - name: @it2:0:0 - } - CONSTANT [18] { value: 0 } - } - } - } - } - } - } - } - result: { - IDENT [19] { - name: @ac:0:0 - } - } - } - COMPREHENSION [20] { - iter_var: @it:0:0 - iter_var2: @it2:0:0 - iter_range: { - LIST [21] { - elements: { - CONSTANT [22] { value: 2 } - } - } - } - accu_var: @ac:0:0 - accu_init: { - CONSTANT [23] { value: false } - } - loop_condition: { - CALL [24] { - function: @not_strictly_false - args: { - CALL [25] { - function: !_ - args: { - IDENT [26] { - name: @ac:0:0 - } - } - } - } - } - } - loop_step: { - CALL [27] { - function: _||_ - args: { - IDENT [28] { - name: @ac:0:0 - } - CALL [29] { - function: _&&_ - args: { - CALL [30] { - function: _>_ - args: { - IDENT [31] { - name: @it:0:0 - } - CONSTANT [32] { value: 1 } - } - } - CALL [33] { - function: _>=_ - args: { - IDENT [34] { - name: @it2:0:0 - } - CONSTANT [35] { value: 0 } - } - } - } - } - } - } - } - result: { - IDENT [36] { - name: @ac:0:0 - } - } - } - CALL [37] { - function: size - args: { - LIST [38] { - elements: { - IDENT [39] { - name: @index0 - } - } - } - } - } - CALL [40] { - function: size - args: { - LIST [41] { - elements: { - IDENT [42] { - name: @index1 - } - } - } - } - } - } - } - CALL [43] { - function: _==_ - args: { - CALL [44] { - function: _+_ - args: { - CALL [45] { - function: _+_ - args: { - CALL [46] { - function: _+_ - args: { - IDENT [47] { - name: @index2 - } - IDENT [48] { - name: @index2 - } - } - } - IDENT [49] { - name: @index3 - } - } - } - IDENT [50] { - name: @index3 - } - } - } - CONSTANT [51] { value: 4 } - } - } - } -} -Test case: MULTIPLE_MACROS_COMP_V2_2 -Source: [1].exists(i, x, i > 0 && x > 0) && [1].exists(j, y, j > 0 && y > 0) && [1].exists(k, z, k > 1 && z > 0) && [2].exists(l, w, l > 1 && w > 0) -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - COMPREHENSION [3] { - iter_var: @it:0:0 - iter_var2: @it2:0:0 - iter_range: { - LIST [4] { - elements: { - CONSTANT [5] { value: 1 } - } - } - } - accu_var: @ac:0:0 - accu_init: { - CONSTANT [6] { value: false } - } - loop_condition: { - CALL [7] { - function: @not_strictly_false - args: { - CALL [8] { - function: !_ - args: { - IDENT [9] { - name: @ac:0:0 - } - } - } - } - } - } - loop_step: { - CALL [10] { - function: _||_ - args: { - IDENT [11] { - name: @ac:0:0 - } - CALL [12] { - function: _&&_ - args: { - CALL [13] { - function: _>_ - args: { - IDENT [14] { - name: @it:0:0 - } - CONSTANT [15] { value: 0 } - } - } - CALL [16] { - function: _>_ - args: { - IDENT [17] { - name: @it2:0:0 - } - CONSTANT [18] { value: 0 } - } - } - } - } - } - } - } - result: { - IDENT [19] { - name: @ac:0:0 - } - } - } - } - } - CALL [20] { - function: _&&_ - args: { - CALL [21] { - function: _&&_ - args: { - IDENT [22] { - name: @index0 - } - IDENT [23] { - name: @index0 - } - } - } - CALL [24] { - function: _&&_ - args: { - COMPREHENSION [25] { - iter_var: @it:0:0 - iter_var2: @it2:0:0 - iter_range: { - LIST [26] { - elements: { - CONSTANT [27] { value: 1 } - } - } - } - accu_var: @ac:0:0 - accu_init: { - CONSTANT [28] { value: false } - } - loop_condition: { - CALL [29] { - function: @not_strictly_false - args: { - CALL [30] { - function: !_ - args: { - IDENT [31] { - name: @ac:0:0 - } - } - } - } - } - } - loop_step: { - CALL [32] { - function: _||_ - args: { - IDENT [33] { - name: @ac:0:0 - } - CALL [34] { - function: _&&_ - args: { - CALL [35] { - function: _>_ - args: { - IDENT [36] { - name: @it:0:0 - } - CONSTANT [37] { value: 1 } - } - } - CALL [38] { - function: _>_ - args: { - IDENT [39] { - name: @it2:0:0 - } - CONSTANT [40] { value: 0 } - } - } - } - } - } - } - } - result: { - IDENT [41] { - name: @ac:0:0 - } - } - } - COMPREHENSION [42] { - iter_var: @it:0:0 - iter_var2: @it2:0:0 - iter_range: { - LIST [43] { - elements: { - CONSTANT [44] { value: 2 } - } - } - } - accu_var: @ac:0:0 - accu_init: { - CONSTANT [45] { value: false } - } - loop_condition: { - CALL [46] { - function: @not_strictly_false - args: { - CALL [47] { - function: !_ - args: { - IDENT [48] { - name: @ac:0:0 - } - } - } - } - } - } - loop_step: { - CALL [49] { - function: _||_ - args: { - IDENT [50] { - name: @ac:0:0 - } - CALL [51] { - function: _&&_ - args: { - CALL [52] { - function: _>_ - args: { - IDENT [53] { - name: @it:0:0 - } - CONSTANT [54] { value: 1 } - } - } - CALL [55] { - function: _>_ - args: { - IDENT [56] { - name: @it2:0:0 - } - CONSTANT [57] { value: 0 } - } - } - } - } - } - } - } - result: { - IDENT [58] { - name: @ac:0:0 - } - } - } - } - } - } - } - } -} -Test case: NESTED_MACROS -Source: [1,2,3].map(i, [1, 2, 3].map(i, i + 1)) == [[2, 3, 4], [2, 3, 4], [2, 3, 4]] -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - LIST [3] { - elements: { - CONSTANT [4] { value: 1 } - CONSTANT [5] { value: 2 } - CONSTANT [6] { value: 3 } - } - } - LIST [7] { - elements: { - CONSTANT [8] { value: 2 } - CONSTANT [9] { value: 3 } - CONSTANT [10] { value: 4 } - } - } - COMPREHENSION [11] { - iter_var: @it:0:0 - iter_range: { - IDENT [12] { - name: @index0 - } - } - accu_var: @ac:0:0 - accu_init: { - LIST [13] { - elements: { - } - } - } - loop_condition: { - CONSTANT [14] { value: true } - } - loop_step: { - CALL [15] { - function: _+_ - args: { - IDENT [16] { - name: @ac:0:0 - } - LIST [17] { - elements: { - CALL [18] { - function: _+_ - args: { - IDENT [19] { - name: @it:0:0 - } - CONSTANT [20] { value: 1 } - } - } - } - } - } - } - } - result: { - IDENT [21] { - name: @ac:0:0 - } - } - } - } - } - CALL [22] { - function: _==_ - args: { - COMPREHENSION [23] { - iter_var: @it:1:0 - iter_range: { - IDENT [24] { - name: @index0 - } - } - accu_var: @ac:1:0 - accu_init: { - LIST [25] { - elements: { - } - } - } - loop_condition: { - CONSTANT [26] { value: true } - } - loop_step: { - CALL [27] { - function: _+_ - args: { - IDENT [28] { - name: @ac:1:0 - } - LIST [29] { - elements: { - IDENT [30] { - name: @index2 - } - } - } - } - } - } - result: { - IDENT [31] { - name: @ac:1:0 - } - } - } - LIST [32] { - elements: { - IDENT [33] { - name: @index1 - } - IDENT [34] { - name: @index1 - } - IDENT [35] { - name: @index1 - } - } - } - } - } - } -} -Test case: NESTED_MACROS_2 -Source: [1, 2].map(y, [1, 2, 3].filter(x, x == y)) == [[1], [2]] -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - LIST [3] { - elements: { - LIST [4] { - elements: { - CONSTANT [5] { value: 1 } - } - } - LIST [6] { - elements: { - CONSTANT [7] { value: 2 } - } - } - } - } - LIST [8] { - elements: { - CONSTANT [9] { value: 1 } - CONSTANT [10] { value: 2 } - } - } - LIST [11] { - elements: { - CONSTANT [12] { value: 1 } - CONSTANT [13] { value: 2 } - CONSTANT [14] { value: 3 } - } - } - } - } - CALL [15] { - function: _==_ - args: { - COMPREHENSION [16] { - iter_var: @it:1:0 - iter_range: { - IDENT [17] { - name: @index1 - } - } - accu_var: @ac:1:0 - accu_init: { - LIST [18] { - elements: { - } - } - } - loop_condition: { - CONSTANT [19] { value: true } - } - loop_step: { - CALL [20] { - function: _+_ - args: { - IDENT [21] { - name: @ac:1:0 - } - LIST [22] { - elements: { - COMPREHENSION [23] { - iter_var: @it:0:0 - iter_range: { - IDENT [24] { - name: @index2 - } - } - accu_var: @ac:0:0 - accu_init: { - LIST [25] { - elements: { - } - } - } - loop_condition: { - CONSTANT [26] { value: true } - } - loop_step: { - CALL [27] { - function: _?_:_ - args: { - CALL [28] { - function: _==_ - args: { - IDENT [29] { - name: @it:0:0 - } - IDENT [30] { - name: @it:1:0 - } - } - } - CALL [31] { - function: _+_ - args: { - IDENT [32] { - name: @ac:0:0 - } - LIST [33] { - elements: { - IDENT [34] { - name: @it:0:0 - } - } - } - } - } - IDENT [35] { - name: @ac:0:0 - } - } - } - } - result: { - IDENT [36] { - name: @ac:0:0 - } - } - } - } - } - } - } - } - result: { - IDENT [37] { - name: @ac:1:0 - } - } - } - IDENT [38] { - name: @index0 - } - } - } - } -} -Test case: NESTED_MACROS_3 -Source: [1,2,3].map(i, i * 2) + [1,2,3].map(i, i * 2).map(i, i * 2) -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - COMPREHENSION [3] { - iter_var: @it:0:0 - iter_range: { - LIST [4] { - elements: { - CONSTANT [5] { value: 1 } - CONSTANT [6] { value: 2 } - CONSTANT [7] { value: 3 } - } - } - } - accu_var: @ac:0:0 - accu_init: { - LIST [8] { - elements: { - } - } - } - loop_condition: { - CONSTANT [9] { value: true } - } - loop_step: { - CALL [10] { - function: _+_ - args: { - IDENT [11] { - name: @ac:0:0 - } - LIST [12] { - elements: { - CALL [13] { - function: _*_ - args: { - IDENT [14] { - name: @it:0:0 - } - CONSTANT [15] { value: 2 } - } - } - } - } - } - } - } - result: { - IDENT [16] { - name: @ac:0:0 - } - } - } - } - } - CALL [17] { - function: _+_ - args: { - IDENT [18] { - name: @index0 - } - COMPREHENSION [19] { - iter_var: @it:1:0 - iter_range: { - IDENT [20] { - name: @index0 - } - } - accu_var: @ac:1:0 - accu_init: { - LIST [21] { - elements: { - } - } - } - loop_condition: { - CONSTANT [22] { value: true } - } - loop_step: { - CALL [23] { - function: _+_ - args: { - IDENT [24] { - name: @ac:1:0 - } - LIST [25] { - elements: { - CALL [26] { - function: _*_ - args: { - IDENT [27] { - name: @it:1:0 - } - CONSTANT [28] { value: 2 } - } - } - } - } - } - } - } - result: { - IDENT [29] { - name: @ac:1:0 - } - } - } - } - } - } -} -Test case: NESTED_MACROS_COMP_V2_1 -Source: [1,2,3].transformList(i, v, [1, 2, 3].transformList(i, v, i + v + 1)) == [[2, 4, 6], [2, 4, 6], [2, 4, 6]] -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - LIST [3] { - elements: { - CONSTANT [4] { value: 1 } - CONSTANT [5] { value: 2 } - CONSTANT [6] { value: 3 } - } - } - LIST [7] { - elements: { - CONSTANT [8] { value: 2 } - CONSTANT [9] { value: 4 } - CONSTANT [10] { value: 6 } - } - } - LIST [11] { - elements: { - IDENT [12] { - name: @index1 - } - IDENT [13] { - name: @index1 - } - IDENT [14] { - name: @index1 - } - } - } - } - } - CALL [15] { - function: _==_ - args: { - COMPREHENSION [16] { - iter_var: @it:1:0 - iter_var2: @it2:1:0 - iter_range: { - IDENT [17] { - name: @index0 - } - } - accu_var: @ac:1:0 - accu_init: { - LIST [18] { - elements: { - } - } - } - loop_condition: { - CONSTANT [19] { value: true } - } - loop_step: { - CALL [20] { - function: _+_ - args: { - IDENT [21] { - name: @ac:1:0 - } - LIST [22] { - elements: { - COMPREHENSION [23] { - iter_var: @it:0:0 - iter_var2: @it2:0:0 - iter_range: { - IDENT [24] { - name: @index0 - } - } - accu_var: @ac:0:0 - accu_init: { - LIST [25] { - elements: { - } - } - } - loop_condition: { - CONSTANT [26] { value: true } - } - loop_step: { - CALL [27] { - function: _+_ - args: { - IDENT [28] { - name: @ac:0:0 - } - LIST [29] { - elements: { - CALL [30] { - function: _+_ - args: { - CALL [31] { - function: _+_ - args: { - IDENT [32] { - name: @it:0:0 - } - IDENT [33] { - name: @it2:0:0 - } - } - } - CONSTANT [34] { value: 1 } - } - } - } - } - } - } - } - result: { - IDENT [35] { - name: @ac:0:0 - } - } - } - } - } - } - } - } - result: { - IDENT [36] { - name: @ac:1:0 - } - } - } - IDENT [37] { - name: @index2 - } - } - } - } -} -Test case: NESTED_MACROS_COMP_V2_2 -Source: [1, 2].transformList(i, y, [1, 2, 3].filter(x, x == y && i < y)) == [[1], [2]] -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - LIST [3] { - elements: { - LIST [4] { - elements: { - CONSTANT [5] { value: 1 } - } - } - LIST [6] { - elements: { - CONSTANT [7] { value: 2 } - } - } - } - } - LIST [8] { - elements: { - CONSTANT [9] { value: 1 } - CONSTANT [10] { value: 2 } - } - } - LIST [11] { - elements: { - CONSTANT [12] { value: 1 } - CONSTANT [13] { value: 2 } - CONSTANT [14] { value: 3 } - } - } - } - } - CALL [15] { - function: _==_ - args: { - COMPREHENSION [16] { - iter_var: @it:1:0 - iter_var2: @it2:1:0 - iter_range: { - IDENT [17] { - name: @index1 - } - } - accu_var: @ac:1:0 - accu_init: { - LIST [18] { - elements: { - } - } - } - loop_condition: { - CONSTANT [19] { value: true } - } - loop_step: { - CALL [20] { - function: _+_ - args: { - IDENT [21] { - name: @ac:1:0 - } - LIST [22] { - elements: { - COMPREHENSION [23] { - iter_var: @it:0:0 - iter_range: { - IDENT [24] { - name: @index2 - } - } - accu_var: @ac:0:0 - accu_init: { - LIST [25] { - elements: { - } - } - } - loop_condition: { - CONSTANT [26] { value: true } - } - loop_step: { - CALL [27] { - function: _?_:_ - args: { - CALL [28] { - function: _&&_ - args: { - CALL [29] { - function: _==_ - args: { - IDENT [30] { - name: @it:0:0 - } - IDENT [31] { - name: @it2:1:0 - } - } - } - CALL [32] { - function: _<_ - args: { - IDENT [33] { - name: @it:1:0 - } - IDENT [34] { - name: @it2:1:0 - } - } - } - } - } - CALL [35] { - function: _+_ - args: { - IDENT [36] { - name: @ac:0:0 - } - LIST [37] { - elements: { - IDENT [38] { - name: @it:0:0 - } - } - } - } - } - IDENT [39] { - name: @ac:0:0 - } - } - } - } - result: { - IDENT [40] { - name: @ac:0:0 - } - } - } - } - } - } - } - } - result: { - IDENT [41] { - name: @ac:1:0 - } - } - } - IDENT [42] { - name: @index0 - } - } - } - } -} -Test case: ADJACENT_NESTED_MACROS -Source: [1,2,3].map(i, [1, 2, 3].map(i, i + 1)) == [1,2,3].map(j, [1, 2, 3].map(j, j + 1)) -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - COMPREHENSION [3] { - iter_var: @it:0:0 - iter_range: { - LIST [4] { - elements: { - CONSTANT [5] { value: 1 } - CONSTANT [6] { value: 2 } - CONSTANT [7] { value: 3 } - } - } - } - accu_var: @ac:0:0 - accu_init: { - LIST [8] { - elements: { - } - } - } - loop_condition: { - CONSTANT [9] { value: true } - } - loop_step: { - CALL [10] { - function: _+_ - args: { - IDENT [11] { - name: @ac:0:0 - } - LIST [12] { - elements: { - CALL [13] { - function: _+_ - args: { - IDENT [14] { - name: @it:0:0 - } - CONSTANT [15] { value: 1 } - } - } - } - } - } - } - } - result: { - IDENT [16] { - name: @ac:0:0 - } - } - } - COMPREHENSION [17] { - iter_var: @it:1:0 - iter_range: { - LIST [18] { - elements: { - CONSTANT [19] { value: 1 } - CONSTANT [20] { value: 2 } - CONSTANT [21] { value: 3 } - } - } - } - accu_var: @ac:1:0 - accu_init: { - LIST [22] { - elements: { - } - } - } - loop_condition: { - CONSTANT [23] { value: true } - } - loop_step: { - CALL [24] { - function: _+_ - args: { - IDENT [25] { - name: @ac:1:0 - } - LIST [26] { - elements: { - IDENT [27] { - name: @index0 - } - } - } - } - } - } - result: { - IDENT [28] { - name: @ac:1:0 - } - } - } - } - } - CALL [29] { - function: _==_ - args: { - IDENT [30] { - name: @index1 - } - IDENT [31] { - name: @index1 - } - } - } - } -} -Test case: ADJACENT_NESTED_MACROS_COMP_V2 -Source: [1,2,3].transformMap(i, x, [1, 2, 3].transformMap(i, x, i + x + 1)) == [1,2,3].transformMap(j, y, [1, 2, 3].transformMap(j, y, j + y + 1)) -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - COMPREHENSION [3] { - iter_var: @it:0:0 - iter_var2: @it2:0:0 - iter_range: { - LIST [4] { - elements: { - CONSTANT [5] { value: 1 } - CONSTANT [6] { value: 2 } - CONSTANT [7] { value: 3 } - } - } - } - accu_var: @ac:0:0 - accu_init: { - MAP [8] { - - } - } - loop_condition: { - CONSTANT [9] { value: true } - } - loop_step: { - CALL [10] { - function: cel.@mapInsert - args: { - IDENT [11] { - name: @ac:0:0 - } - IDENT [12] { - name: @it:0:0 - } - CALL [13] { - function: _+_ - args: { - CALL [14] { - function: _+_ - args: { - IDENT [15] { - name: @it:0:0 - } - IDENT [16] { - name: @it2:0:0 - } - } - } - CONSTANT [17] { value: 1 } - } - } - } - } - } - result: { - IDENT [18] { - name: @ac:0:0 - } - } - } - COMPREHENSION [19] { - iter_var: @it:1:0 - iter_var2: @it2:1:0 - iter_range: { - LIST [20] { - elements: { - CONSTANT [21] { value: 1 } - CONSTANT [22] { value: 2 } - CONSTANT [23] { value: 3 } - } - } - } - accu_var: @ac:1:0 - accu_init: { - MAP [24] { - - } - } - loop_condition: { - CONSTANT [25] { value: true } - } - loop_step: { - CALL [26] { - function: cel.@mapInsert - args: { - IDENT [27] { - name: @ac:1:0 - } - IDENT [28] { - name: @it:1:0 - } - IDENT [29] { - name: @index0 - } - } - } - } - result: { - IDENT [30] { - name: @ac:1:0 - } - } - } - } - } - CALL [31] { - function: _==_ - args: { - IDENT [32] { - name: @index1 - } - IDENT [33] { - name: @index1 - } - } - } - } -} -Test case: INCLUSION_LIST -Source: 1 in [1,2,3] && 2 in [1,2,3] && 3 in [3, [1,2,3]] && 1 in [1,2,3] -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - CALL [3] { - function: @in - args: { - CONSTANT [4] { value: 1 } - LIST [5] { - elements: { - CONSTANT [6] { value: 1 } - CONSTANT [7] { value: 2 } - CONSTANT [8] { value: 3 } - } - } - } - } - LIST [9] { - elements: { - CONSTANT [10] { value: 1 } - CONSTANT [11] { value: 2 } - CONSTANT [12] { value: 3 } - } - } - } - } - CALL [13] { - function: _&&_ - args: { - CALL [14] { - function: _&&_ - args: { - IDENT [15] { - name: @index0 - } - CALL [16] { - function: @in - args: { - CONSTANT [17] { value: 2 } - IDENT [18] { - name: @index1 - } - } - } - } - } - CALL [19] { - function: _&&_ - args: { - CALL [20] { - function: @in - args: { - CONSTANT [21] { value: 3 } - LIST [22] { - elements: { - CONSTANT [23] { value: 3 } - IDENT [24] { - name: @index1 - } - } - } - } - } - IDENT [25] { - name: @index0 - } - } - } - } - } - } -} -Test case: INCLUSION_MAP -Source: 2 in {'a': 1, 2: {true: false}, 3: {true: false}} -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - MAP [3] { - MAP_ENTRY [4] { - key: { - CONSTANT [5] { value: true } - } - value: { - CONSTANT [6] { value: false } - } - } - } - } - } - CALL [7] { - function: @in - args: { - CONSTANT [8] { value: 2 } - MAP [9] { - MAP_ENTRY [10] { - key: { - CONSTANT [11] { value: "a" } - } - value: { - CONSTANT [12] { value: 1 } - } - } - MAP_ENTRY [13] { - key: { - CONSTANT [14] { value: 2 } - } - value: { - IDENT [15] { - name: @index0 - } - } - } - MAP_ENTRY [16] { - key: { - CONSTANT [17] { value: 3 } - } - value: { - IDENT [18] { - name: @index0 - } - } - } - } - } - } - } -} -Test case: MACRO_ITER_VAR_NOT_REFERENCED -Source: [1,2].map(i, [1, 2].map(i, [3,4])) == [[[3, 4], [3, 4]], [[3, 4], [3, 4]]] -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - LIST [3] { - elements: { - LIST [4] { - elements: { - CONSTANT [5] { value: 3 } - CONSTANT [6] { value: 4 } - } - } - LIST [7] { - elements: { - CONSTANT [8] { value: 3 } - CONSTANT [9] { value: 4 } - } - } - } - } - LIST [10] { - elements: { - CONSTANT [11] { value: 1 } - CONSTANT [12] { value: 2 } - } - } - COMPREHENSION [13] { - iter_var: @it:0:0 - iter_range: { - IDENT [14] { - name: @index1 - } - } - accu_var: @ac:0:0 - accu_init: { - LIST [15] { - elements: { - } - } - } - loop_condition: { - CONSTANT [16] { value: true } - } - loop_step: { - CALL [17] { - function: _+_ - args: { - IDENT [18] { - name: @ac:0:0 - } - LIST [19] { - elements: { - LIST [20] { - elements: { - CONSTANT [21] { value: 3 } - CONSTANT [22] { value: 4 } - } - } - } - } - } - } - } - result: { - IDENT [23] { - name: @ac:0:0 - } - } - } - } - } - CALL [24] { - function: _==_ - args: { - COMPREHENSION [25] { - iter_var: @it:1:0 - iter_range: { - IDENT [26] { - name: @index1 - } - } - accu_var: @ac:1:0 - accu_init: { - LIST [27] { - elements: { - } - } - } - loop_condition: { - CONSTANT [28] { value: true } - } - loop_step: { - CALL [29] { - function: _+_ - args: { - IDENT [30] { - name: @ac:1:0 - } - LIST [31] { - elements: { - IDENT [32] { - name: @index2 - } - } - } - } - } - } - result: { - IDENT [33] { - name: @ac:1:0 - } - } - } - LIST [34] { - elements: { - IDENT [35] { - name: @index0 - } - IDENT [36] { - name: @index0 - } - } - } - } - } - } -} -Test case: MACRO_ITER_VAR2_NOT_REFERENCED -Source: [1,2].transformList(i, v, [1, 2].transformList(i, v, [3,4])) == [[[3, 4], [3, 4]], [[3, 4], [3, 4]]] -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - LIST [3] { - elements: { - LIST [4] { - elements: { - CONSTANT [5] { value: 3 } - CONSTANT [6] { value: 4 } - } - } - LIST [7] { - elements: { - CONSTANT [8] { value: 3 } - CONSTANT [9] { value: 4 } - } - } - } - } - LIST [10] { - elements: { - CONSTANT [11] { value: 1 } - CONSTANT [12] { value: 2 } - } - } - COMPREHENSION [13] { - iter_var: @it:0:0 - iter_var2: @it2:0:0 - iter_range: { - IDENT [14] { - name: @index1 - } - } - accu_var: @ac:0:0 - accu_init: { - LIST [15] { - elements: { - } - } - } - loop_condition: { - CONSTANT [16] { value: true } - } - loop_step: { - CALL [17] { - function: _+_ - args: { - IDENT [18] { - name: @ac:0:0 - } - LIST [19] { - elements: { - LIST [20] { - elements: { - CONSTANT [21] { value: 3 } - CONSTANT [22] { value: 4 } - } - } - } - } - } - } - } - result: { - IDENT [23] { - name: @ac:0:0 - } - } - } - } - } - CALL [24] { - function: _==_ - args: { - COMPREHENSION [25] { - iter_var: @it:1:0 - iter_var2: @it2:1:0 - iter_range: { - IDENT [26] { - name: @index1 - } - } - accu_var: @ac:1:0 - accu_init: { - LIST [27] { - elements: { - } - } - } - loop_condition: { - CONSTANT [28] { value: true } - } - loop_step: { - CALL [29] { - function: _+_ - args: { - IDENT [30] { - name: @ac:1:0 - } - LIST [31] { - elements: { - IDENT [32] { - name: @index2 - } - } - } - } - } - } - result: { - IDENT [33] { - name: @ac:1:0 - } - } - } - LIST [34] { - elements: { - IDENT [35] { - name: @index0 - } - IDENT [36] { - name: @index0 - } - } - } - } - } - } -} -Test case: MACRO_SHADOWED_VARIABLE -Source: [x - 1 > 3 ? x - 1 : 5].exists(x, x - 1 > 3) || x - 1 > 3 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - CALL [3] { - function: _>_ - args: { - CALL [4] { - function: _-_ - args: { - IDENT [5] { - name: x - } - CONSTANT [6] { value: 1 } - } - } - CONSTANT [7] { value: 3 } - } - } - } - } - CALL [8] { - function: _||_ - args: { - COMPREHENSION [9] { - iter_var: @it:0:0 - iter_range: { - LIST [10] { - elements: { - CALL [11] { - function: _?_:_ - args: { - IDENT [12] { - name: @index0 - } - CALL [13] { - function: _-_ - args: { - IDENT [14] { - name: x - } - CONSTANT [15] { value: 1 } - } - } - CONSTANT [16] { value: 5 } - } - } - } - } - } - accu_var: @ac:0:0 - accu_init: { - CONSTANT [17] { value: false } - } - loop_condition: { - CALL [18] { - function: @not_strictly_false - args: { - CALL [19] { - function: !_ - args: { - IDENT [20] { - name: @ac:0:0 - } - } - } - } - } - } - loop_step: { - CALL [21] { - function: _||_ - args: { - IDENT [22] { - name: @ac:0:0 - } - CALL [23] { - function: _>_ - args: { - CALL [24] { - function: _-_ - args: { - IDENT [25] { - name: @it:0:0 - } - CONSTANT [26] { value: 1 } - } - } - CONSTANT [27] { value: 3 } - } - } - } - } - } - result: { - IDENT [28] { - name: @ac:0:0 - } - } - } - IDENT [29] { - name: @index0 - } - } - } - } -} -Test case: MACRO_SHADOWED_VARIABLE_2 -Source: ["foo", "bar"].map(x, [x + x, x + x]).map(x, [x + x, x + x]) -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - LIST [3] { - elements: { - CONSTANT [4] { value: "foo" } - CONSTANT [5] { value: "bar" } - } - } - } - } - COMPREHENSION [6] { - iter_var: @it:1:0 - iter_range: { - COMPREHENSION [7] { - iter_var: @it:0:0 - iter_range: { - IDENT [8] { - name: @index0 - } - } - accu_var: @ac:0:0 - accu_init: { - LIST [9] { - elements: { - } - } - } - loop_condition: { - CONSTANT [10] { value: true } - } - loop_step: { - CALL [11] { - function: _+_ - args: { - IDENT [12] { - name: @ac:0:0 - } - LIST [13] { - elements: { - LIST [14] { - elements: { - CALL [15] { - function: _+_ - args: { - IDENT [16] { - name: @it:0:0 - } - IDENT [17] { - name: @it:0:0 - } - } - } - CALL [18] { - function: _+_ - args: { - IDENT [19] { - name: @it:0:0 - } - IDENT [20] { - name: @it:0:0 - } - } - } - } - } - } - } - } - } - } - result: { - IDENT [21] { - name: @ac:0:0 - } - } - } - } - accu_var: @ac:1:0 - accu_init: { - LIST [22] { - elements: { - } - } - } - loop_condition: { - CONSTANT [23] { value: true } - } - loop_step: { - CALL [24] { - function: _+_ - args: { - IDENT [25] { - name: @ac:1:0 - } - LIST [26] { - elements: { - LIST [27] { - elements: { - CALL [28] { - function: _+_ - args: { - IDENT [29] { - name: @it:1:0 - } - IDENT [30] { - name: @it:1:0 - } - } - } - CALL [31] { - function: _+_ - args: { - IDENT [32] { - name: @it:1:0 - } - IDENT [33] { - name: @it:1:0 - } - } - } - } - } - } - } - } - } - } - result: { - IDENT [34] { - name: @ac:1:0 - } - } - } - } -} -Test case: MACRO_SHADOWED_VARIABLE_COMP_V2_1 -Source: [x - y - 1 > 3 ? x - y - 1 : 5].exists(x, y, x - y - 1 > 3) || x - y - 1 > 3 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - CALL [3] { - function: _>_ - args: { - CALL [4] { - function: _-_ - args: { - CALL [5] { - function: _-_ - args: { - IDENT [6] { - name: x - } - IDENT [7] { - name: y - } - } - } - CONSTANT [8] { value: 1 } - } - } - CONSTANT [9] { value: 3 } - } - } - LIST [10] { - elements: { - CALL [11] { - function: _?_:_ - args: { - IDENT [12] { - name: @index0 - } - CALL [13] { - function: _-_ - args: { - CALL [14] { - function: _-_ - args: { - IDENT [15] { - name: x - } - IDENT [16] { - name: y - } - } - } - CONSTANT [17] { value: 1 } - } - } - CONSTANT [18] { value: 5 } - } - } - } - } - } - } - CALL [19] { - function: _||_ - args: { - COMPREHENSION [20] { - iter_var: @it:0:0 - iter_var2: @it2:0:0 - iter_range: { - IDENT [21] { - name: @index1 - } - } - accu_var: @ac:0:0 - accu_init: { - CONSTANT [22] { value: false } - } - loop_condition: { - CALL [23] { - function: @not_strictly_false - args: { - CALL [24] { - function: !_ - args: { - IDENT [25] { - name: @ac:0:0 - } - } - } - } - } - } - loop_step: { - CALL [26] { - function: _||_ - args: { - IDENT [27] { - name: @ac:0:0 - } - CALL [28] { - function: _>_ - args: { - CALL [29] { - function: _-_ - args: { - CALL [30] { - function: _-_ - args: { - IDENT [31] { - name: @it:0:0 - } - IDENT [32] { - name: @it2:0:0 - } - } - } - CONSTANT [33] { value: 1 } - } - } - CONSTANT [34] { value: 3 } - } - } - } - } - } - result: { - IDENT [35] { - name: @ac:0:0 - } - } - } - IDENT [36] { - name: @index0 - } - } - } - } -} -Test case: MACRO_SHADOWED_VARIABLE_COMP_V2_2 -Source: ["foo", "bar"].transformMap(x, y, [x + x, y + y]).transformMap(x, y, [x + x, y + y]) -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - COMPREHENSION [3] { - iter_var: @it:0:0 - iter_var2: @it2:0:0 - iter_range: { - LIST [4] { - elements: { - CONSTANT [5] { value: "foo" } - CONSTANT [6] { value: "bar" } - } - } - } - accu_var: @ac:0:0 - accu_init: { - MAP [7] { - - } - } - loop_condition: { - CONSTANT [8] { value: true } - } - loop_step: { - CALL [9] { - function: cel.@mapInsert - args: { - IDENT [10] { - name: @ac:0:0 - } - IDENT [11] { - name: @it:0:0 - } - LIST [12] { - elements: { - CALL [13] { - function: _+_ - args: { - IDENT [14] { - name: @it:0:0 - } - IDENT [15] { - name: @it:0:0 - } - } - } - CALL [16] { - function: _+_ - args: { - IDENT [17] { - name: @it2:0:0 - } - IDENT [18] { - name: @it2:0:0 - } - } - } - } - } - } - } - } - result: { - IDENT [19] { - name: @ac:0:0 - } - } - } - } - } - COMPREHENSION [20] { - iter_var: @it:1:0 - iter_var2: @it2:1:0 - iter_range: { - IDENT [21] { - name: @index0 - } - } - accu_var: @ac:1:0 - accu_init: { - MAP [22] { - - } - } - loop_condition: { - CONSTANT [23] { value: true } - } - loop_step: { - CALL [24] { - function: cel.@mapInsert - args: { - IDENT [25] { - name: @ac:1:0 - } - IDENT [26] { - name: @it:1:0 - } - LIST [27] { - elements: { - CALL [28] { - function: _+_ - args: { - IDENT [29] { - name: @it:1:0 - } - IDENT [30] { - name: @it:1:0 - } - } - } - CALL [31] { - function: _+_ - args: { - IDENT [32] { - name: @it2:1:0 - } - IDENT [33] { - name: @it2:1:0 - } - } - } - } - } - } - } - } - result: { - IDENT [34] { - name: @ac:1:0 - } - } - } - } -} -Test case: PRESENCE_TEST -Source: has({'a': true}.a) && {'a':true}['a'] -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - MAP [3] { - MAP_ENTRY [4] { - key: { - CONSTANT [5] { value: "a" } - } - value: { - CONSTANT [6] { value: true } - } - } - } - } - } - CALL [7] { - function: _&&_ - args: { - SELECT [8] { - IDENT [9] { - name: @index0 - }.a~presence_test - } - CALL [10] { - function: _[_] - args: { - IDENT [11] { - name: @index0 - } - CONSTANT [12] { value: "a" } - } - } - } - } - } -} -Test case: PRESENCE_TEST_2 -Source: has({'a': true}.a) && has({'a': true}.a) -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - SELECT [3] { - MAP [4] { - MAP_ENTRY [5] { - key: { - CONSTANT [6] { value: "a" } - } - value: { - CONSTANT [7] { value: true } - } - } - }.a~presence_test - } - } - } - CALL [8] { - function: _&&_ - args: { - IDENT [9] { - name: @index0 - } - IDENT [10] { - name: @index0 - } - } - } - } -} -Test case: PRESENCE_TEST_WITH_TERNARY -Source: (has(msg.oneof_type.payload) ? msg.oneof_type.payload.single_int64 : 0) == 10 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - SELECT [3] { - IDENT [4] { - name: msg - }.oneof_type - } - } - } - CALL [5] { - function: _==_ - args: { - CALL [6] { - function: _?_:_ - args: { - SELECT [7] { - IDENT [8] { - name: @index0 - }.payload~presence_test - } - SELECT [9] { - SELECT [10] { - IDENT [11] { - name: @index0 - }.payload - }.single_int64 - } - CONSTANT [12] { value: 0 } - } - } - CONSTANT [13] { value: 10 } - } - } - } -} -Test case: PRESENCE_TEST_WITH_TERNARY_2 -Source: (has(msg.oneof_type.payload) ? msg.oneof_type.payload.single_int64 : msg.oneof_type.payload.single_int64 * 0) == 10 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - SELECT [3] { - SELECT [4] { - SELECT [5] { - IDENT [6] { - name: msg - }.oneof_type - }.payload - }.single_int64 - } - } - } - CALL [7] { - function: _==_ - args: { - CALL [8] { - function: _?_:_ - args: { - SELECT [9] { - SELECT [10] { - IDENT [11] { - name: msg - }.oneof_type - }.payload~presence_test - } - IDENT [12] { - name: @index0 - } - CALL [13] { - function: _*_ - args: { - IDENT [14] { - name: @index0 - } - CONSTANT [15] { value: 0 } - } - } - } - } - CONSTANT [16] { value: 10 } - } - } - } -} -Test case: PRESENCE_TEST_WITH_TERNARY_3 -Source: (has(msg.oneof_type.payload.single_int64) ? msg.oneof_type.payload.single_int64 : msg.oneof_type.payload.single_int64 * 0) == 10 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - SELECT [3] { - SELECT [4] { - SELECT [5] { - IDENT [6] { - name: msg - }.oneof_type - }.payload - }.single_int64 - } - CALL [7] { - function: _?_:_ - args: { - SELECT [8] { - SELECT [9] { - SELECT [10] { - IDENT [11] { - name: msg - }.oneof_type - }.payload - }.single_int64~presence_test - } - IDENT [12] { - name: @index0 - } - CALL [13] { - function: _*_ - args: { - IDENT [14] { - name: @index0 - } - CONSTANT [15] { value: 0 } - } - } - } - } - } - } - CALL [16] { - function: _==_ - args: { - IDENT [17] { - name: @index1 - } - CONSTANT [18] { value: 10 } - } - } - } -} -Test case: PRESENCE_TEST_WITH_TERNARY_NESTED -Source: (has(msg.oneof_type) && has(msg.oneof_type.payload) && has(msg.oneof_type.payload.single_int64)) ? ((has(msg.oneof_type.payload.map_string_string) && has(msg.oneof_type.payload.map_string_string.key)) ? msg.oneof_type.payload.map_string_string.key == 'A' : false) : false -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - SELECT [3] { - SELECT [4] { - SELECT [5] { - IDENT [6] { - name: msg - }.oneof_type - }.payload - }.map_string_string - } - SELECT [7] { - SELECT [8] { - IDENT [9] { - name: msg - }.oneof_type - }.payload - } - CALL [10] { - function: _&&_ - args: { - CALL [11] { - function: _&&_ - args: { - SELECT [12] { - IDENT [13] { - name: msg - }.oneof_type~presence_test - } - SELECT [14] { - SELECT [15] { - IDENT [16] { - name: msg - }.oneof_type - }.payload~presence_test - } - } - } - SELECT [17] { - IDENT [18] { - name: @index1 - }.single_int64~presence_test - } - } - } - } - } - CALL [19] { - function: _?_:_ - args: { - IDENT [20] { - name: @index2 - } - CALL [21] { - function: _?_:_ - args: { - CALL [22] { - function: _&&_ - args: { - SELECT [23] { - IDENT [24] { - name: @index1 - }.map_string_string~presence_test - } - SELECT [25] { - IDENT [26] { - name: @index0 - }.key~presence_test - } - } - } - CALL [27] { - function: _==_ - args: { - SELECT [28] { - IDENT [29] { - name: @index0 - }.key - } - CONSTANT [30] { value: "A" } - } - } - CONSTANT [31] { value: false } - } - } - CONSTANT [32] { value: false } - } - } - } -} -Test case: OPTIONAL_LIST -Source: [10, ?optional.none(), [?optional.none(), ?opt_x], [?optional.none(), ?opt_x]] == [10, [5], [5]] -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - LIST [3] { - elements: { - CALL [4] { - function: optional.none - args: { - } - } - IDENT [5] { - name: opt_x - } - } - optional_indices: [0, 1] - } - LIST [6] { - elements: { - CONSTANT [7] { value: 5 } - } - } - } - } - CALL [8] { - function: _==_ - args: { - LIST [9] { - elements: { - CONSTANT [10] { value: 10 } - CALL [11] { - function: optional.none - args: { - } - } - IDENT [12] { - name: @index0 - } - IDENT [13] { - name: @index0 - } - } - optional_indices: [0] - } - LIST [14] { - elements: { - CONSTANT [15] { value: 10 } - IDENT [16] { - name: @index1 - } - IDENT [17] { - name: @index1 - } - } - } - } - } - } -} -Test case: OPTIONAL_MAP -Source: {?'hello': optional.of('hello')}['hello'] + {?'hello': optional.of('hello')}['hello'] == 'hellohello' -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - CALL [3] { - function: _[_] - args: { - MAP [4] { - MAP_ENTRY [5] { - key: { - CONSTANT [6] { value: "hello" } - } - optional_entry: true - value: { - CALL [7] { - function: optional.of - args: { - CONSTANT [8] { value: "hello" } - } - } - } - } - } - CONSTANT [9] { value: "hello" } - } - } - } - } - CALL [10] { - function: _==_ - args: { - CALL [11] { - function: _+_ - args: { - IDENT [12] { - name: @index0 - } - IDENT [13] { - name: @index0 - } - } - } - CONSTANT [14] { value: "hellohello" } - } - } - } -} -Test case: OPTIONAL_MAP_CHAINED -Source: {?'key': optional.of('test')}[?'bogus'].or({'key': 'test'}[?'bogus']).orValue({'key': 'test'}['key']) == 'test' -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - MAP [3] { - MAP_ENTRY [4] { - key: { - CONSTANT [5] { value: "key" } - } - value: { - CONSTANT [6] { value: "test" } - } - } - } - CALL [7] { - function: or - target: { - CALL [8] { - function: _[?_] - args: { - MAP [9] { - MAP_ENTRY [10] { - key: { - CONSTANT [11] { value: "key" } - } - optional_entry: true - value: { - CALL [12] { - function: optional.of - args: { - CONSTANT [13] { value: "test" } - } - } - } - } - } - CONSTANT [14] { value: "bogus" } - } - } - } - args: { - CALL [15] { - function: _[?_] - args: { - IDENT [16] { - name: @index0 - } - CONSTANT [17] { value: "bogus" } - } - } - } - } - } - } - CALL [18] { - function: _==_ - args: { - CALL [19] { - function: orValue - target: { - IDENT [20] { - name: @index1 - } - } - args: { - CALL [21] { - function: _[_] - args: { - IDENT [22] { - name: @index0 - } - CONSTANT [23] { value: "key" } - } - } - } - } - CONSTANT [24] { value: "test" } - } - } - } -} -Test case: OPTIONAL_MESSAGE -Source: TestAllTypes{?single_int64: optional.ofNonZeroValue(1), ?single_int32: optional.of(4)}.single_int32 + TestAllTypes{?single_int64: optional.ofNonZeroValue(1), ?single_int32: optional.of(4)}.single_int64 == 5 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - STRUCT [3] { - name: cel.expr.conformance.proto3.TestAllTypes - entries: { - ENTRY [4] { - field_key: single_int64 - optional_entry: true - value: { - CALL [5] { - function: optional.ofNonZeroValue - args: { - CONSTANT [6] { value: 1 } - } - } - } - } - ENTRY [7] { - field_key: single_int32 - optional_entry: true - value: { - CALL [8] { - function: optional.of - args: { - CONSTANT [9] { value: 4 } - } - } - } - } - } - } - } - } - CALL [10] { - function: _==_ - args: { - CALL [11] { - function: _+_ - args: { - SELECT [12] { - IDENT [13] { - name: @index0 - }.single_int32 - } - SELECT [14] { - IDENT [15] { - name: @index0 - }.single_int64 - } - } - } - CONSTANT [16] { value: 5 } - } - } - } -} -Test case: CALL -Source: ('h' + 'e' + 'l' + 'l' + 'o' + ' world').matches('h' + 'e' + 'l' + 'l' + 'o') -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - CALL [3] { - function: _+_ - args: { - CALL [4] { - function: _+_ - args: { - CALL [5] { - function: _+_ - args: { - CALL [6] { - function: _+_ - args: { - CONSTANT [7] { value: "h" } - CONSTANT [8] { value: "e" } - } - } - CONSTANT [9] { value: "l" } - } - } - CONSTANT [10] { value: "l" } - } - } - CONSTANT [11] { value: "o" } - } - } - } - } - CALL [12] { - function: matches - target: { - CALL [13] { - function: _+_ - args: { - IDENT [14] { - name: @index0 - } - CONSTANT [15] { value: " world" } - } - } - } - args: { - IDENT [16] { - name: @index0 - } - } - } - } -} -Test case: CALL_ARGUMENT_NESTED_NO_COMMON_SUBEXPR -Source: 'hello world'.matches('h' + 'e' + 'l' + 'l' + 'o') -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - CALL [3] { - function: _+_ - args: { - CALL [4] { - function: _+_ - args: { - CALL [5] { - function: _+_ - args: { - CALL [6] { - function: _+_ - args: { - CONSTANT [7] { value: "h" } - CONSTANT [8] { value: "e" } - } - } - CONSTANT [9] { value: "l" } - } - } - CONSTANT [10] { value: "l" } - } - } - CONSTANT [11] { value: "o" } - } - } - } - } - CALL [12] { - function: matches - target: { - CONSTANT [13] { value: "hello world" } - } - args: { - IDENT [14] { - name: @index0 - } - } - } - } -} -Test case: CALL_TARGET_NESTED_NO_COMMON_SUBEXPR -Source: ('h' + 'e' + 'l' + 'l' + 'o' + ' world').matches('hello') -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - CALL [3] { - function: _+_ - args: { - CALL [4] { - function: _+_ - args: { - CALL [5] { - function: _+_ - args: { - CALL [6] { - function: _+_ - args: { - CONSTANT [7] { value: "h" } - CONSTANT [8] { value: "e" } - } - } - CONSTANT [9] { value: "l" } - } - } - CONSTANT [10] { value: "l" } - } - } - CONSTANT [11] { value: "o" } - } - } - } - } - CALL [12] { - function: matches - target: { - CALL [13] { - function: _+_ - args: { - IDENT [14] { - name: @index0 - } - CONSTANT [15] { value: " world" } - } - } - } - args: { - CONSTANT [16] { value: "hello" } - } - } - } -} -Test case: CALL_BOTH_ARGUMENT_TARGET_NESTED_NO_COMMON_SUBEXPR -Source: ('h' + 'e' + 'l' + 'l' + 'o' + ' world').matches('w' + 'o' + 'r' + 'l' + 'd') -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - CALL [3] { - function: _+_ - args: { - CALL [4] { - function: _+_ - args: { - CALL [5] { - function: _+_ - args: { - CALL [6] { - function: _+_ - args: { - CONSTANT [7] { value: "h" } - CONSTANT [8] { value: "e" } - } - } - CONSTANT [9] { value: "l" } - } - } - CONSTANT [10] { value: "l" } - } - } - CONSTANT [11] { value: "o" } - } - } - CALL [12] { - function: _+_ - args: { - CALL [13] { - function: _+_ - args: { - CALL [14] { - function: _+_ - args: { - CALL [15] { - function: _+_ - args: { - CONSTANT [16] { value: "w" } - CONSTANT [17] { value: "o" } - } - } - CONSTANT [18] { value: "r" } - } - } - CONSTANT [19] { value: "l" } - } - } - CONSTANT [20] { value: "d" } - } - } - } - } - CALL [21] { - function: matches - target: { - CALL [22] { - function: _+_ - args: { - IDENT [23] { - name: @index0 - } - CONSTANT [24] { value: " world" } - } - } - } - args: { - IDENT [25] { - name: @index1 - } - } - } - } -} -Test case: CUSTOM_FUNCTION_INELIMINABLE -Source: non_pure_custom_func(msg.oneof_type.payload.single_int64) + non_pure_custom_func(msg.oneof_type.payload.single_int32) + non_pure_custom_func(msg.oneof_type.payload.single_int64) + non_pure_custom_func(msg.single_int64) -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - SELECT [3] { - SELECT [4] { - SELECT [5] { - IDENT [6] { - name: msg - }.oneof_type - }.payload - }.single_int64 - } - } - } - CALL [7] { - function: _+_ - args: { - CALL [8] { - function: _+_ - args: { - CALL [9] { - function: _+_ - args: { - CALL [10] { - function: non_pure_custom_func - args: { - IDENT [11] { - name: @index0 - } - } - } - CALL [12] { - function: non_pure_custom_func - args: { - SELECT [13] { - SELECT [14] { - SELECT [15] { - IDENT [16] { - name: msg - }.oneof_type - }.payload - }.single_int32 - } - } - } - } - } - CALL [17] { - function: non_pure_custom_func - args: { - IDENT [18] { - name: @index0 - } - } - } - } - } - CALL [19] { - function: non_pure_custom_func - args: { - SELECT [20] { - IDENT [21] { - name: msg - }.single_int64 - } - } - } - } - } - } -} -Test case: CUSTOM_FUNCTION_ELIMINABLE -Source: pure_custom_func(msg.oneof_type.payload.single_int64) + pure_custom_func(msg.oneof_type.payload.single_int32) + pure_custom_func(msg.oneof_type.payload.single_int64) + pure_custom_func(msg.single_int64) -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - CALL [3] { - function: pure_custom_func - args: { - SELECT [4] { - SELECT [5] { - SELECT [6] { - IDENT [7] { - name: msg - }.oneof_type - }.payload - }.single_int64 - } - } - } - CALL [8] { - function: pure_custom_func - args: { - SELECT [9] { - SELECT [10] { - SELECT [11] { - IDENT [12] { - name: msg - }.oneof_type - }.payload - }.single_int32 - } - } - } - } - } - CALL [13] { - function: _+_ - args: { - CALL [14] { - function: _+_ - args: { - CALL [15] { - function: _+_ - args: { - IDENT [16] { - name: @index0 - } - IDENT [17] { - name: @index1 - } - } - } - IDENT [18] { - name: @index0 - } - } - } - CALL [19] { - function: pure_custom_func - args: { - SELECT [20] { - IDENT [21] { - name: msg - }.single_int64 - } - } - } - } - } - } -} \ No newline at end of file diff --git a/optimizer/src/test/resources/subexpression_ast_block_recursion_depth_5.baseline b/optimizer/src/test/resources/subexpression_ast_block_recursion_depth_5.baseline deleted file mode 100644 index c7ab9e404..000000000 --- a/optimizer/src/test/resources/subexpression_ast_block_recursion_depth_5.baseline +++ /dev/null @@ -1,4919 +0,0 @@ -Test case: SIZE_1 -Source: size([1,2]) + size([1,2]) + 1 == 5 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - CALL [3] { - function: size - args: { - LIST [4] { - elements: { - CONSTANT [5] { value: 1 } - CONSTANT [6] { value: 2 } - } - } - } - } - } - } - CALL [7] { - function: _==_ - args: { - CALL [8] { - function: _+_ - args: { - CALL [9] { - function: _+_ - args: { - IDENT [10] { - name: @index0 - } - IDENT [11] { - name: @index0 - } - } - } - CONSTANT [12] { value: 1 } - } - } - CONSTANT [13] { value: 5 } - } - } - } -} -Test case: SIZE_2 -Source: 2 + size([1,2]) + size([1,2]) + 1 == 7 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - CALL [3] { - function: size - args: { - LIST [4] { - elements: { - CONSTANT [5] { value: 1 } - CONSTANT [6] { value: 2 } - } - } - } - } - } - } - CALL [7] { - function: _==_ - args: { - CALL [8] { - function: _+_ - args: { - CALL [9] { - function: _+_ - args: { - CALL [10] { - function: _+_ - args: { - CONSTANT [11] { value: 2 } - IDENT [12] { - name: @index0 - } - } - } - IDENT [13] { - name: @index0 - } - } - } - CONSTANT [14] { value: 1 } - } - } - CONSTANT [15] { value: 7 } - } - } - } -} -Test case: SIZE_3 -Source: size([0]) + size([0]) + size([1,2]) + size([1,2]) == 6 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - CALL [3] { - function: size - args: { - LIST [4] { - elements: { - CONSTANT [5] { value: 0 } - } - } - } - } - CALL [6] { - function: size - args: { - LIST [7] { - elements: { - CONSTANT [8] { value: 1 } - CONSTANT [9] { value: 2 } - } - } - } - } - } - } - CALL [10] { - function: _==_ - args: { - CALL [11] { - function: _+_ - args: { - CALL [12] { - function: _+_ - args: { - CALL [13] { - function: _+_ - args: { - IDENT [14] { - name: @index0 - } - IDENT [15] { - name: @index0 - } - } - } - IDENT [16] { - name: @index1 - } - } - } - IDENT [17] { - name: @index1 - } - } - } - CONSTANT [18] { value: 6 } - } - } - } -} -Test case: SIZE_4 -Source: 5 + size([0]) + size([0]) + size([1,2]) + size([1,2]) + size([1,2,3]) + size([1,2,3]) == 17 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - CALL [3] { - function: size - args: { - LIST [4] { - elements: { - CONSTANT [5] { value: 0 } - } - } - } - } - CALL [6] { - function: size - args: { - LIST [7] { - elements: { - CONSTANT [8] { value: 1 } - CONSTANT [9] { value: 2 } - } - } - } - } - CALL [10] { - function: size - args: { - LIST [11] { - elements: { - CONSTANT [12] { value: 1 } - CONSTANT [13] { value: 2 } - CONSTANT [14] { value: 3 } - } - } - } - } - CALL [15] { - function: _+_ - args: { - CALL [16] { - function: _+_ - args: { - CALL [17] { - function: _+_ - args: { - CALL [18] { - function: _+_ - args: { - CALL [19] { - function: _+_ - args: { - CONSTANT [20] { value: 5 } - IDENT [21] { - name: @index0 - } - } - } - IDENT [22] { - name: @index0 - } - } - } - IDENT [23] { - name: @index1 - } - } - } - IDENT [24] { - name: @index1 - } - } - } - IDENT [25] { - name: @index2 - } - } - } - } - } - CALL [26] { - function: _==_ - args: { - CALL [27] { - function: _+_ - args: { - IDENT [28] { - name: @index3 - } - IDENT [29] { - name: @index2 - } - } - } - CONSTANT [30] { value: 17 } - } - } - } -} -Test case: TIMESTAMP -Source: timestamp(int(timestamp(1000000000))).getFullYear() + timestamp(int(timestamp(75))).getFullYear() + timestamp(int(timestamp(50))).getFullYear() + timestamp(int(timestamp(1000000000))).getFullYear() + timestamp(int(timestamp(50))).getSeconds() + timestamp(int(timestamp(200))).getFullYear() + timestamp(int(timestamp(200))).getFullYear() + timestamp(int(timestamp(75))).getMinutes() + timestamp(int(timestamp(1000000000))).getFullYear() == 13934 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - CALL [3] { - function: getFullYear - target: { - CALL [4] { - function: timestamp - args: { - CALL [5] { - function: int - args: { - CALL [6] { - function: timestamp - args: { - CONSTANT [7] { value: 1000000000 } - } - } - } - } - } - } - } - args: { - } - } - CALL [8] { - function: getFullYear - target: { - CALL [9] { - function: timestamp - args: { - CALL [10] { - function: int - args: { - CALL [11] { - function: timestamp - args: { - CONSTANT [12] { value: 200 } - } - } - } - } - } - } - } - args: { - } - } - CALL [13] { - function: timestamp - args: { - CALL [14] { - function: int - args: { - CALL [15] { - function: timestamp - args: { - CONSTANT [16] { value: 50 } - } - } - } - } - } - } - CALL [17] { - function: timestamp - args: { - CALL [18] { - function: int - args: { - CALL [19] { - function: timestamp - args: { - CONSTANT [20] { value: 75 } - } - } - } - } - } - } - CALL [21] { - function: _+_ - args: { - CALL [22] { - function: _+_ - args: { - CALL [23] { - function: _+_ - args: { - CALL [24] { - function: _+_ - args: { - IDENT [25] { - name: @index0 - } - CALL [26] { - function: getFullYear - target: { - IDENT [27] { - name: @index3 - } - } - args: { - } - } - } - } - CALL [28] { - function: getFullYear - target: { - IDENT [29] { - name: @index2 - } - } - args: { - } - } - } - } - IDENT [30] { - name: @index0 - } - } - } - CALL [31] { - function: getSeconds - target: { - IDENT [32] { - name: @index2 - } - } - args: { - } - } - } - } - } - } - CALL [33] { - function: _==_ - args: { - CALL [34] { - function: _+_ - args: { - CALL [35] { - function: _+_ - args: { - CALL [36] { - function: _+_ - args: { - CALL [37] { - function: _+_ - args: { - IDENT [38] { - name: @index4 - } - IDENT [39] { - name: @index1 - } - } - } - IDENT [40] { - name: @index1 - } - } - } - CALL [41] { - function: getMinutes - target: { - IDENT [42] { - name: @index3 - } - } - args: { - } - } - } - } - IDENT [43] { - name: @index0 - } - } - } - CONSTANT [44] { value: 13934 } - } - } - } -} -Test case: MAP_INDEX -Source: {"a": 2}["a"] + {"a": 2}["a"] * {"a": 2}["a"] == 6 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - CALL [3] { - function: _[_] - args: { - MAP [4] { - MAP_ENTRY [5] { - key: { - CONSTANT [6] { value: "a" } - } - value: { - CONSTANT [7] { value: 2 } - } - } - } - CONSTANT [8] { value: "a" } - } - } - } - } - CALL [9] { - function: _==_ - args: { - CALL [10] { - function: _+_ - args: { - IDENT [11] { - name: @index0 - } - CALL [12] { - function: _*_ - args: { - IDENT [13] { - name: @index0 - } - IDENT [14] { - name: @index0 - } - } - } - } - } - CONSTANT [15] { value: 6 } - } - } - } -} -Test case: NESTED_MAP_CONSTRUCTION -Source: {'a': {'b': 1}, 'c': {'b': 1}, 'd': {'e': {'b': 1}}, 'e': {'e': {'b': 1}}} -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - MAP [3] { - MAP_ENTRY [4] { - key: { - CONSTANT [5] { value: "e" } - } - value: { - MAP [6] { - MAP_ENTRY [7] { - key: { - CONSTANT [8] { value: "b" } - } - value: { - CONSTANT [9] { value: 1 } - } - } - } - } - } - } - MAP [10] { - MAP_ENTRY [11] { - key: { - CONSTANT [12] { value: "b" } - } - value: { - CONSTANT [13] { value: 1 } - } - } - } - } - } - MAP [14] { - MAP_ENTRY [15] { - key: { - CONSTANT [16] { value: "a" } - } - value: { - IDENT [17] { - name: @index1 - } - } - } - MAP_ENTRY [18] { - key: { - CONSTANT [19] { value: "c" } - } - value: { - IDENT [20] { - name: @index1 - } - } - } - MAP_ENTRY [21] { - key: { - CONSTANT [22] { value: "d" } - } - value: { - IDENT [23] { - name: @index0 - } - } - } - MAP_ENTRY [24] { - key: { - CONSTANT [25] { value: "e" } - } - value: { - IDENT [26] { - name: @index0 - } - } - } - } - } -} -Test case: NESTED_LIST_CONSTRUCTION -Source: [1, [1,2,3,4], 2, [1,2,3,4], 5, [1,2,3,4], 7, [[1,2], [1,2,3,4]], [1,2]] -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - LIST [3] { - elements: { - CONSTANT [4] { value: 1 } - CONSTANT [5] { value: 2 } - CONSTANT [6] { value: 3 } - CONSTANT [7] { value: 4 } - } - } - LIST [8] { - elements: { - CONSTANT [9] { value: 1 } - CONSTANT [10] { value: 2 } - } - } - } - } - LIST [11] { - elements: { - CONSTANT [12] { value: 1 } - IDENT [13] { - name: @index0 - } - CONSTANT [14] { value: 2 } - IDENT [15] { - name: @index0 - } - CONSTANT [16] { value: 5 } - IDENT [17] { - name: @index0 - } - CONSTANT [18] { value: 7 } - LIST [19] { - elements: { - IDENT [20] { - name: @index1 - } - IDENT [21] { - name: @index0 - } - } - } - IDENT [22] { - name: @index1 - } - } - } - } -} -Test case: SELECT -Source: msg.single_int64 + msg.single_int64 == 6 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - SELECT [3] { - IDENT [4] { - name: msg - }.single_int64 - } - } - } - CALL [5] { - function: _==_ - args: { - CALL [6] { - function: _+_ - args: { - IDENT [7] { - name: @index0 - } - IDENT [8] { - name: @index0 - } - } - } - CONSTANT [9] { value: 6 } - } - } - } -} -Test case: SELECT_NESTED_1 -Source: msg.oneof_type.payload.single_int64 + msg.oneof_type.payload.single_int32 + msg.oneof_type.payload.single_int64 + msg.single_int64 + msg.oneof_type.payload.oneof_type.payload.single_int64 == 31 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - SELECT [3] { - SELECT [4] { - SELECT [5] { - IDENT [6] { - name: msg - }.oneof_type - }.payload - }.single_int64 - } - SELECT [7] { - SELECT [8] { - IDENT [9] { - name: msg - }.oneof_type - }.payload - } - CALL [10] { - function: _+_ - args: { - CALL [11] { - function: _+_ - args: { - CALL [12] { - function: _+_ - args: { - CALL [13] { - function: _+_ - args: { - IDENT [14] { - name: @index0 - } - SELECT [15] { - IDENT [16] { - name: @index1 - }.single_int32 - } - } - } - IDENT [17] { - name: @index0 - } - } - } - SELECT [18] { - IDENT [19] { - name: msg - }.single_int64 - } - } - } - SELECT [20] { - SELECT [21] { - SELECT [22] { - IDENT [23] { - name: @index1 - }.oneof_type - }.payload - }.single_int64 - } - } - } - } - } - CALL [24] { - function: _==_ - args: { - IDENT [25] { - name: @index2 - } - CONSTANT [26] { value: 31 } - } - } - } -} -Test case: SELECT_NESTED_2 -Source: true || msg.oneof_type.payload.oneof_type.payload.oneof_type.payload.oneof_type.payload.single_bool || msg.oneof_type.payload.oneof_type.payload.oneof_type.child.child.payload.single_bool -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - SELECT [3] { - SELECT [4] { - SELECT [5] { - SELECT [6] { - SELECT [7] { - IDENT [8] { - name: msg - }.oneof_type - }.payload - }.oneof_type - }.payload - }.oneof_type - } - CALL [9] { - function: _||_ - args: { - CONSTANT [10] { value: true } - SELECT [11] { - SELECT [12] { - SELECT [13] { - SELECT [14] { - IDENT [15] { - name: @index0 - }.payload - }.oneof_type - }.payload - }.single_bool - } - } - } - } - } - CALL [16] { - function: _||_ - args: { - IDENT [17] { - name: @index1 - } - SELECT [18] { - SELECT [19] { - SELECT [20] { - SELECT [21] { - IDENT [22] { - name: @index0 - }.child - }.child - }.payload - }.single_bool - } - } - } - } -} -Test case: SELECT_NESTED_MESSAGE_MAP_INDEX_1 -Source: msg.oneof_type.payload.map_int32_int64[1] + msg.oneof_type.payload.map_int32_int64[1] + msg.oneof_type.payload.map_int32_int64[1] == 15 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - CALL [3] { - function: _[_] - args: { - SELECT [4] { - SELECT [5] { - SELECT [6] { - IDENT [7] { - name: msg - }.oneof_type - }.payload - }.map_int32_int64 - } - CONSTANT [8] { value: 1 } - } - } - } - } - CALL [9] { - function: _==_ - args: { - CALL [10] { - function: _+_ - args: { - CALL [11] { - function: _+_ - args: { - IDENT [12] { - name: @index0 - } - IDENT [13] { - name: @index0 - } - } - } - IDENT [14] { - name: @index0 - } - } - } - CONSTANT [15] { value: 15 } - } - } - } -} -Test case: SELECT_NESTED_MESSAGE_MAP_INDEX_2 -Source: msg.oneof_type.payload.map_int32_int64[0] + msg.oneof_type.payload.map_int32_int64[1] + msg.oneof_type.payload.map_int32_int64[2] == 8 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - SELECT [3] { - SELECT [4] { - SELECT [5] { - IDENT [6] { - name: msg - }.oneof_type - }.payload - }.map_int32_int64 - } - } - } - CALL [7] { - function: _==_ - args: { - CALL [8] { - function: _+_ - args: { - CALL [9] { - function: _+_ - args: { - CALL [10] { - function: _[_] - args: { - IDENT [11] { - name: @index0 - } - CONSTANT [12] { value: 0 } - } - } - CALL [13] { - function: _[_] - args: { - IDENT [14] { - name: @index0 - } - CONSTANT [15] { value: 1 } - } - } - } - } - CALL [16] { - function: _[_] - args: { - IDENT [17] { - name: @index0 - } - CONSTANT [18] { value: 2 } - } - } - } - } - CONSTANT [19] { value: 8 } - } - } - } -} -Test case: SELECT_NESTED_NO_COMMON_SUBEXPR -Source: msg.oneof_type.payload.oneof_type.payload.oneof_type.payload.oneof_type.payload.single_int64 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - SELECT [3] { - SELECT [4] { - SELECT [5] { - SELECT [6] { - SELECT [7] { - IDENT [8] { - name: msg - }.oneof_type - }.payload - }.oneof_type - }.payload - }.oneof_type - } - } - } - SELECT [9] { - SELECT [10] { - SELECT [11] { - SELECT [12] { - IDENT [13] { - name: @index0 - }.payload - }.oneof_type - }.payload - }.single_int64 - } - } -} -Test case: TERNARY -Source: (msg.single_int64 > 0 ? msg.single_int64 : 0) == 3 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - SELECT [3] { - IDENT [4] { - name: msg - }.single_int64 - } - } - } - CALL [5] { - function: _==_ - args: { - CALL [6] { - function: _?_:_ - args: { - CALL [7] { - function: _>_ - args: { - IDENT [8] { - name: @index0 - } - CONSTANT [9] { value: 0 } - } - } - IDENT [10] { - name: @index0 - } - CONSTANT [11] { value: 0 } - } - } - CONSTANT [12] { value: 3 } - } - } - } -} -Test case: TERNARY_BIND_RHS_ONLY -Source: false ? false : (msg.single_int64) + ((msg.single_int64 + 1) * 2) == 11 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - SELECT [3] { - IDENT [4] { - name: msg - }.single_int64 - } - } - } - CALL [5] { - function: _?_:_ - args: { - CONSTANT [6] { value: false } - CONSTANT [7] { value: false } - CALL [8] { - function: _==_ - args: { - CALL [9] { - function: _+_ - args: { - IDENT [10] { - name: @index0 - } - CALL [11] { - function: _*_ - args: { - CALL [12] { - function: _+_ - args: { - IDENT [13] { - name: @index0 - } - CONSTANT [14] { value: 1 } - } - } - CONSTANT [15] { value: 2 } - } - } - } - } - CONSTANT [16] { value: 11 } - } - } - } - } - } -} -Test case: NESTED_TERNARY -Source: (msg.single_int64 > 0 ? (msg.single_int32 > 0 ? msg.single_int64 + msg.single_int32 : 0) : 0) == 8 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - SELECT [3] { - IDENT [4] { - name: msg - }.single_int64 - } - SELECT [5] { - IDENT [6] { - name: msg - }.single_int32 - } - } - } - CALL [7] { - function: _==_ - args: { - CALL [8] { - function: _?_:_ - args: { - CALL [9] { - function: _>_ - args: { - IDENT [10] { - name: @index0 - } - CONSTANT [11] { value: 0 } - } - } - CALL [12] { - function: _?_:_ - args: { - CALL [13] { - function: _>_ - args: { - IDENT [14] { - name: @index1 - } - CONSTANT [15] { value: 0 } - } - } - CALL [16] { - function: _+_ - args: { - IDENT [17] { - name: @index0 - } - IDENT [18] { - name: @index1 - } - } - } - CONSTANT [19] { value: 0 } - } - } - CONSTANT [20] { value: 0 } - } - } - CONSTANT [21] { value: 8 } - } - } - } -} -Test case: MULTIPLE_MACROS_1 -Source: size([[1].exists(i, i > 0)]) + size([[1].exists(j, j > 0)]) + size([[2].exists(k, k > 1)]) + size([[2].exists(l, l > 1)]) == 4 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - COMPREHENSION [3] { - iter_var: @it:0:0 - iter_range: { - LIST [4] { - elements: { - CONSTANT [5] { value: 1 } - } - } - } - accu_var: @ac:0:0 - accu_init: { - CONSTANT [6] { value: false } - } - loop_condition: { - CALL [7] { - function: @not_strictly_false - args: { - CALL [8] { - function: !_ - args: { - IDENT [9] { - name: @ac:0:0 - } - } - } - } - } - } - loop_step: { - CALL [10] { - function: _||_ - args: { - IDENT [11] { - name: @ac:0:0 - } - CALL [12] { - function: _>_ - args: { - IDENT [13] { - name: @it:0:0 - } - CONSTANT [14] { value: 0 } - } - } - } - } - } - result: { - IDENT [15] { - name: @ac:0:0 - } - } - } - COMPREHENSION [16] { - iter_var: @it:0:0 - iter_range: { - LIST [17] { - elements: { - CONSTANT [18] { value: 2 } - } - } - } - accu_var: @ac:0:0 - accu_init: { - CONSTANT [19] { value: false } - } - loop_condition: { - CALL [20] { - function: @not_strictly_false - args: { - CALL [21] { - function: !_ - args: { - IDENT [22] { - name: @ac:0:0 - } - } - } - } - } - } - loop_step: { - CALL [23] { - function: _||_ - args: { - IDENT [24] { - name: @ac:0:0 - } - CALL [25] { - function: _>_ - args: { - IDENT [26] { - name: @it:0:0 - } - CONSTANT [27] { value: 1 } - } - } - } - } - } - result: { - IDENT [28] { - name: @ac:0:0 - } - } - } - CALL [29] { - function: size - args: { - LIST [30] { - elements: { - IDENT [31] { - name: @index0 - } - } - } - } - } - CALL [32] { - function: size - args: { - LIST [33] { - elements: { - IDENT [34] { - name: @index1 - } - } - } - } - } - } - } - CALL [35] { - function: _==_ - args: { - CALL [36] { - function: _+_ - args: { - CALL [37] { - function: _+_ - args: { - CALL [38] { - function: _+_ - args: { - IDENT [39] { - name: @index2 - } - IDENT [40] { - name: @index2 - } - } - } - IDENT [41] { - name: @index3 - } - } - } - IDENT [42] { - name: @index3 - } - } - } - CONSTANT [43] { value: 4 } - } - } - } -} -Test case: MULTIPLE_MACROS_2 -Source: [[1].exists(i, i > 0)] + [[1].exists(j, j > 0)] + [['a'].exists(k, k == 'a')] + [['a'].exists(l, l == 'a')] == [true, true, true, true] -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - COMPREHENSION [3] { - iter_var: @it:0:0 - iter_range: { - LIST [4] { - elements: { - CONSTANT [5] { value: 1 } - } - } - } - accu_var: @ac:0:0 - accu_init: { - CONSTANT [6] { value: false } - } - loop_condition: { - CALL [7] { - function: @not_strictly_false - args: { - CALL [8] { - function: !_ - args: { - IDENT [9] { - name: @ac:0:0 - } - } - } - } - } - } - loop_step: { - CALL [10] { - function: _||_ - args: { - IDENT [11] { - name: @ac:0:0 - } - CALL [12] { - function: _>_ - args: { - IDENT [13] { - name: @it:0:0 - } - CONSTANT [14] { value: 0 } - } - } - } - } - } - result: { - IDENT [15] { - name: @ac:0:0 - } - } - } - COMPREHENSION [16] { - iter_var: @it:0:1 - iter_range: { - LIST [17] { - elements: { - CONSTANT [18] { value: "a" } - } - } - } - accu_var: @ac:0:1 - accu_init: { - CONSTANT [19] { value: false } - } - loop_condition: { - CALL [20] { - function: @not_strictly_false - args: { - CALL [21] { - function: !_ - args: { - IDENT [22] { - name: @ac:0:1 - } - } - } - } - } - } - loop_step: { - CALL [23] { - function: _||_ - args: { - IDENT [24] { - name: @ac:0:1 - } - CALL [25] { - function: _==_ - args: { - IDENT [26] { - name: @it:0:1 - } - CONSTANT [27] { value: "a" } - } - } - } - } - } - result: { - IDENT [28] { - name: @ac:0:1 - } - } - } - LIST [29] { - elements: { - IDENT [30] { - name: @index0 - } - } - } - LIST [31] { - elements: { - IDENT [32] { - name: @index1 - } - } - } - } - } - CALL [33] { - function: _==_ - args: { - CALL [34] { - function: _+_ - args: { - CALL [35] { - function: _+_ - args: { - CALL [36] { - function: _+_ - args: { - IDENT [37] { - name: @index2 - } - IDENT [38] { - name: @index2 - } - } - } - IDENT [39] { - name: @index3 - } - } - } - IDENT [40] { - name: @index3 - } - } - } - LIST [41] { - elements: { - CONSTANT [42] { value: true } - CONSTANT [43] { value: true } - CONSTANT [44] { value: true } - CONSTANT [45] { value: true } - } - } - } - } - } -} -Test case: MULTIPLE_MACROS_3 -Source: [1].exists(i, i > 0) && [1].exists(j, j > 0) && [1].exists(k, k > 1) && [2].exists(l, l > 1) -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - COMPREHENSION [3] { - iter_var: @it:0:0 - iter_range: { - LIST [4] { - elements: { - CONSTANT [5] { value: 1 } - } - } - } - accu_var: @ac:0:0 - accu_init: { - CONSTANT [6] { value: false } - } - loop_condition: { - CALL [7] { - function: @not_strictly_false - args: { - CALL [8] { - function: !_ - args: { - IDENT [9] { - name: @ac:0:0 - } - } - } - } - } - } - loop_step: { - CALL [10] { - function: _||_ - args: { - IDENT [11] { - name: @ac:0:0 - } - CALL [12] { - function: _>_ - args: { - IDENT [13] { - name: @it:0:0 - } - CONSTANT [14] { value: 0 } - } - } - } - } - } - result: { - IDENT [15] { - name: @ac:0:0 - } - } - } - } - } - CALL [16] { - function: _&&_ - args: { - CALL [17] { - function: _&&_ - args: { - IDENT [18] { - name: @index0 - } - IDENT [19] { - name: @index0 - } - } - } - CALL [20] { - function: _&&_ - args: { - COMPREHENSION [21] { - iter_var: @it:0:0 - iter_range: { - LIST [22] { - elements: { - CONSTANT [23] { value: 1 } - } - } - } - accu_var: @ac:0:0 - accu_init: { - CONSTANT [24] { value: false } - } - loop_condition: { - CALL [25] { - function: @not_strictly_false - args: { - CALL [26] { - function: !_ - args: { - IDENT [27] { - name: @ac:0:0 - } - } - } - } - } - } - loop_step: { - CALL [28] { - function: _||_ - args: { - IDENT [29] { - name: @ac:0:0 - } - CALL [30] { - function: _>_ - args: { - IDENT [31] { - name: @it:0:0 - } - CONSTANT [32] { value: 1 } - } - } - } - } - } - result: { - IDENT [33] { - name: @ac:0:0 - } - } - } - COMPREHENSION [34] { - iter_var: @it:0:0 - iter_range: { - LIST [35] { - elements: { - CONSTANT [36] { value: 2 } - } - } - } - accu_var: @ac:0:0 - accu_init: { - CONSTANT [37] { value: false } - } - loop_condition: { - CALL [38] { - function: @not_strictly_false - args: { - CALL [39] { - function: !_ - args: { - IDENT [40] { - name: @ac:0:0 - } - } - } - } - } - } - loop_step: { - CALL [41] { - function: _||_ - args: { - IDENT [42] { - name: @ac:0:0 - } - CALL [43] { - function: _>_ - args: { - IDENT [44] { - name: @it:0:0 - } - CONSTANT [45] { value: 1 } - } - } - } - } - } - result: { - IDENT [46] { - name: @ac:0:0 - } - } - } - } - } - } - } - } -} -Test case: MULTIPLE_MACROS_COMP_V2_1 -Source: size([[1].exists(i,x,i > 0 && x >= 0)]) + size([[1].exists(j, y, j > 0 && y >= 0)]) + size([[2].exists(k,z,k > 1 && z >= 0)]) + size([[2].exists(l, w, l > 1 && w >= 0)]) == 4 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - COMPREHENSION [3] { - iter_var: @it:0:0 - iter_var2: @it2:0:0 - iter_range: { - LIST [4] { - elements: { - CONSTANT [5] { value: 1 } - } - } - } - accu_var: @ac:0:0 - accu_init: { - CONSTANT [6] { value: false } - } - loop_condition: { - CALL [7] { - function: @not_strictly_false - args: { - CALL [8] { - function: !_ - args: { - IDENT [9] { - name: @ac:0:0 - } - } - } - } - } - } - loop_step: { - CALL [10] { - function: _||_ - args: { - IDENT [11] { - name: @ac:0:0 - } - CALL [12] { - function: _&&_ - args: { - CALL [13] { - function: _>_ - args: { - IDENT [14] { - name: @it:0:0 - } - CONSTANT [15] { value: 0 } - } - } - CALL [16] { - function: _>=_ - args: { - IDENT [17] { - name: @it2:0:0 - } - CONSTANT [18] { value: 0 } - } - } - } - } - } - } - } - result: { - IDENT [19] { - name: @ac:0:0 - } - } - } - COMPREHENSION [20] { - iter_var: @it:0:0 - iter_var2: @it2:0:0 - iter_range: { - LIST [21] { - elements: { - CONSTANT [22] { value: 2 } - } - } - } - accu_var: @ac:0:0 - accu_init: { - CONSTANT [23] { value: false } - } - loop_condition: { - CALL [24] { - function: @not_strictly_false - args: { - CALL [25] { - function: !_ - args: { - IDENT [26] { - name: @ac:0:0 - } - } - } - } - } - } - loop_step: { - CALL [27] { - function: _||_ - args: { - IDENT [28] { - name: @ac:0:0 - } - CALL [29] { - function: _&&_ - args: { - CALL [30] { - function: _>_ - args: { - IDENT [31] { - name: @it:0:0 - } - CONSTANT [32] { value: 1 } - } - } - CALL [33] { - function: _>=_ - args: { - IDENT [34] { - name: @it2:0:0 - } - CONSTANT [35] { value: 0 } - } - } - } - } - } - } - } - result: { - IDENT [36] { - name: @ac:0:0 - } - } - } - CALL [37] { - function: size - args: { - LIST [38] { - elements: { - IDENT [39] { - name: @index0 - } - } - } - } - } - CALL [40] { - function: size - args: { - LIST [41] { - elements: { - IDENT [42] { - name: @index1 - } - } - } - } - } - } - } - CALL [43] { - function: _==_ - args: { - CALL [44] { - function: _+_ - args: { - CALL [45] { - function: _+_ - args: { - CALL [46] { - function: _+_ - args: { - IDENT [47] { - name: @index2 - } - IDENT [48] { - name: @index2 - } - } - } - IDENT [49] { - name: @index3 - } - } - } - IDENT [50] { - name: @index3 - } - } - } - CONSTANT [51] { value: 4 } - } - } - } -} -Test case: MULTIPLE_MACROS_COMP_V2_2 -Source: [1].exists(i, x, i > 0 && x > 0) && [1].exists(j, y, j > 0 && y > 0) && [1].exists(k, z, k > 1 && z > 0) && [2].exists(l, w, l > 1 && w > 0) -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - COMPREHENSION [3] { - iter_var: @it:0:0 - iter_var2: @it2:0:0 - iter_range: { - LIST [4] { - elements: { - CONSTANT [5] { value: 1 } - } - } - } - accu_var: @ac:0:0 - accu_init: { - CONSTANT [6] { value: false } - } - loop_condition: { - CALL [7] { - function: @not_strictly_false - args: { - CALL [8] { - function: !_ - args: { - IDENT [9] { - name: @ac:0:0 - } - } - } - } - } - } - loop_step: { - CALL [10] { - function: _||_ - args: { - IDENT [11] { - name: @ac:0:0 - } - CALL [12] { - function: _&&_ - args: { - CALL [13] { - function: _>_ - args: { - IDENT [14] { - name: @it:0:0 - } - CONSTANT [15] { value: 0 } - } - } - CALL [16] { - function: _>_ - args: { - IDENT [17] { - name: @it2:0:0 - } - CONSTANT [18] { value: 0 } - } - } - } - } - } - } - } - result: { - IDENT [19] { - name: @ac:0:0 - } - } - } - } - } - CALL [20] { - function: _&&_ - args: { - CALL [21] { - function: _&&_ - args: { - IDENT [22] { - name: @index0 - } - IDENT [23] { - name: @index0 - } - } - } - CALL [24] { - function: _&&_ - args: { - COMPREHENSION [25] { - iter_var: @it:0:0 - iter_var2: @it2:0:0 - iter_range: { - LIST [26] { - elements: { - CONSTANT [27] { value: 1 } - } - } - } - accu_var: @ac:0:0 - accu_init: { - CONSTANT [28] { value: false } - } - loop_condition: { - CALL [29] { - function: @not_strictly_false - args: { - CALL [30] { - function: !_ - args: { - IDENT [31] { - name: @ac:0:0 - } - } - } - } - } - } - loop_step: { - CALL [32] { - function: _||_ - args: { - IDENT [33] { - name: @ac:0:0 - } - CALL [34] { - function: _&&_ - args: { - CALL [35] { - function: _>_ - args: { - IDENT [36] { - name: @it:0:0 - } - CONSTANT [37] { value: 1 } - } - } - CALL [38] { - function: _>_ - args: { - IDENT [39] { - name: @it2:0:0 - } - CONSTANT [40] { value: 0 } - } - } - } - } - } - } - } - result: { - IDENT [41] { - name: @ac:0:0 - } - } - } - COMPREHENSION [42] { - iter_var: @it:0:0 - iter_var2: @it2:0:0 - iter_range: { - LIST [43] { - elements: { - CONSTANT [44] { value: 2 } - } - } - } - accu_var: @ac:0:0 - accu_init: { - CONSTANT [45] { value: false } - } - loop_condition: { - CALL [46] { - function: @not_strictly_false - args: { - CALL [47] { - function: !_ - args: { - IDENT [48] { - name: @ac:0:0 - } - } - } - } - } - } - loop_step: { - CALL [49] { - function: _||_ - args: { - IDENT [50] { - name: @ac:0:0 - } - CALL [51] { - function: _&&_ - args: { - CALL [52] { - function: _>_ - args: { - IDENT [53] { - name: @it:0:0 - } - CONSTANT [54] { value: 1 } - } - } - CALL [55] { - function: _>_ - args: { - IDENT [56] { - name: @it2:0:0 - } - CONSTANT [57] { value: 0 } - } - } - } - } - } - } - } - result: { - IDENT [58] { - name: @ac:0:0 - } - } - } - } - } - } - } - } -} -Test case: NESTED_MACROS -Source: [1,2,3].map(i, [1, 2, 3].map(i, i + 1)) == [[2, 3, 4], [2, 3, 4], [2, 3, 4]] -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - LIST [3] { - elements: { - CONSTANT [4] { value: 1 } - CONSTANT [5] { value: 2 } - CONSTANT [6] { value: 3 } - } - } - LIST [7] { - elements: { - CONSTANT [8] { value: 2 } - CONSTANT [9] { value: 3 } - CONSTANT [10] { value: 4 } - } - } - COMPREHENSION [11] { - iter_var: @it:0:0 - iter_range: { - IDENT [12] { - name: @index0 - } - } - accu_var: @ac:0:0 - accu_init: { - LIST [13] { - elements: { - } - } - } - loop_condition: { - CONSTANT [14] { value: true } - } - loop_step: { - CALL [15] { - function: _+_ - args: { - IDENT [16] { - name: @ac:0:0 - } - LIST [17] { - elements: { - CALL [18] { - function: _+_ - args: { - IDENT [19] { - name: @it:0:0 - } - CONSTANT [20] { value: 1 } - } - } - } - } - } - } - } - result: { - IDENT [21] { - name: @ac:0:0 - } - } - } - } - } - CALL [22] { - function: _==_ - args: { - COMPREHENSION [23] { - iter_var: @it:1:0 - iter_range: { - IDENT [24] { - name: @index0 - } - } - accu_var: @ac:1:0 - accu_init: { - LIST [25] { - elements: { - } - } - } - loop_condition: { - CONSTANT [26] { value: true } - } - loop_step: { - CALL [27] { - function: _+_ - args: { - IDENT [28] { - name: @ac:1:0 - } - LIST [29] { - elements: { - IDENT [30] { - name: @index2 - } - } - } - } - } - } - result: { - IDENT [31] { - name: @ac:1:0 - } - } - } - LIST [32] { - elements: { - IDENT [33] { - name: @index1 - } - IDENT [34] { - name: @index1 - } - IDENT [35] { - name: @index1 - } - } - } - } - } - } -} -Test case: NESTED_MACROS_2 -Source: [1, 2].map(y, [1, 2, 3].filter(x, x == y)) == [[1], [2]] -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - LIST [3] { - elements: { - LIST [4] { - elements: { - CONSTANT [5] { value: 1 } - } - } - LIST [6] { - elements: { - CONSTANT [7] { value: 2 } - } - } - } - } - LIST [8] { - elements: { - CONSTANT [9] { value: 1 } - CONSTANT [10] { value: 2 } - } - } - LIST [11] { - elements: { - CONSTANT [12] { value: 1 } - CONSTANT [13] { value: 2 } - CONSTANT [14] { value: 3 } - } - } - } - } - CALL [15] { - function: _==_ - args: { - COMPREHENSION [16] { - iter_var: @it:1:0 - iter_range: { - IDENT [17] { - name: @index1 - } - } - accu_var: @ac:1:0 - accu_init: { - LIST [18] { - elements: { - } - } - } - loop_condition: { - CONSTANT [19] { value: true } - } - loop_step: { - CALL [20] { - function: _+_ - args: { - IDENT [21] { - name: @ac:1:0 - } - LIST [22] { - elements: { - COMPREHENSION [23] { - iter_var: @it:0:0 - iter_range: { - IDENT [24] { - name: @index2 - } - } - accu_var: @ac:0:0 - accu_init: { - LIST [25] { - elements: { - } - } - } - loop_condition: { - CONSTANT [26] { value: true } - } - loop_step: { - CALL [27] { - function: _?_:_ - args: { - CALL [28] { - function: _==_ - args: { - IDENT [29] { - name: @it:0:0 - } - IDENT [30] { - name: @it:1:0 - } - } - } - CALL [31] { - function: _+_ - args: { - IDENT [32] { - name: @ac:0:0 - } - LIST [33] { - elements: { - IDENT [34] { - name: @it:0:0 - } - } - } - } - } - IDENT [35] { - name: @ac:0:0 - } - } - } - } - result: { - IDENT [36] { - name: @ac:0:0 - } - } - } - } - } - } - } - } - result: { - IDENT [37] { - name: @ac:1:0 - } - } - } - IDENT [38] { - name: @index0 - } - } - } - } -} -Test case: NESTED_MACROS_3 -Source: [1,2,3].map(i, i * 2) + [1,2,3].map(i, i * 2).map(i, i * 2) -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - COMPREHENSION [3] { - iter_var: @it:0:0 - iter_range: { - LIST [4] { - elements: { - CONSTANT [5] { value: 1 } - CONSTANT [6] { value: 2 } - CONSTANT [7] { value: 3 } - } - } - } - accu_var: @ac:0:0 - accu_init: { - LIST [8] { - elements: { - } - } - } - loop_condition: { - CONSTANT [9] { value: true } - } - loop_step: { - CALL [10] { - function: _+_ - args: { - IDENT [11] { - name: @ac:0:0 - } - LIST [12] { - elements: { - CALL [13] { - function: _*_ - args: { - IDENT [14] { - name: @it:0:0 - } - CONSTANT [15] { value: 2 } - } - } - } - } - } - } - } - result: { - IDENT [16] { - name: @ac:0:0 - } - } - } - } - } - CALL [17] { - function: _+_ - args: { - IDENT [18] { - name: @index0 - } - COMPREHENSION [19] { - iter_var: @it:1:0 - iter_range: { - IDENT [20] { - name: @index0 - } - } - accu_var: @ac:1:0 - accu_init: { - LIST [21] { - elements: { - } - } - } - loop_condition: { - CONSTANT [22] { value: true } - } - loop_step: { - CALL [23] { - function: _+_ - args: { - IDENT [24] { - name: @ac:1:0 - } - LIST [25] { - elements: { - CALL [26] { - function: _*_ - args: { - IDENT [27] { - name: @it:1:0 - } - CONSTANT [28] { value: 2 } - } - } - } - } - } - } - } - result: { - IDENT [29] { - name: @ac:1:0 - } - } - } - } - } - } -} -Test case: NESTED_MACROS_COMP_V2_1 -Source: [1,2,3].transformList(i, v, [1, 2, 3].transformList(i, v, i + v + 1)) == [[2, 4, 6], [2, 4, 6], [2, 4, 6]] -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - LIST [3] { - elements: { - CONSTANT [4] { value: 1 } - CONSTANT [5] { value: 2 } - CONSTANT [6] { value: 3 } - } - } - LIST [7] { - elements: { - CONSTANT [8] { value: 2 } - CONSTANT [9] { value: 4 } - CONSTANT [10] { value: 6 } - } - } - COMPREHENSION [11] { - iter_var: @it:0:0 - iter_var2: @it2:0:0 - iter_range: { - IDENT [12] { - name: @index0 - } - } - accu_var: @ac:0:0 - accu_init: { - LIST [13] { - elements: { - } - } - } - loop_condition: { - CONSTANT [14] { value: true } - } - loop_step: { - CALL [15] { - function: _+_ - args: { - IDENT [16] { - name: @ac:0:0 - } - LIST [17] { - elements: { - CALL [18] { - function: _+_ - args: { - CALL [19] { - function: _+_ - args: { - IDENT [20] { - name: @it:0:0 - } - IDENT [21] { - name: @it2:0:0 - } - } - } - CONSTANT [22] { value: 1 } - } - } - } - } - } - } - } - result: { - IDENT [23] { - name: @ac:0:0 - } - } - } - } - } - CALL [24] { - function: _==_ - args: { - COMPREHENSION [25] { - iter_var: @it:1:0 - iter_var2: @it2:1:0 - iter_range: { - IDENT [26] { - name: @index0 - } - } - accu_var: @ac:1:0 - accu_init: { - LIST [27] { - elements: { - } - } - } - loop_condition: { - CONSTANT [28] { value: true } - } - loop_step: { - CALL [29] { - function: _+_ - args: { - IDENT [30] { - name: @ac:1:0 - } - LIST [31] { - elements: { - IDENT [32] { - name: @index2 - } - } - } - } - } - } - result: { - IDENT [33] { - name: @ac:1:0 - } - } - } - LIST [34] { - elements: { - IDENT [35] { - name: @index1 - } - IDENT [36] { - name: @index1 - } - IDENT [37] { - name: @index1 - } - } - } - } - } - } -} -Test case: NESTED_MACROS_COMP_V2_2 -Source: [1, 2].transformList(i, y, [1, 2, 3].filter(x, x == y && i < y)) == [[1], [2]] -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - LIST [3] { - elements: { - LIST [4] { - elements: { - CONSTANT [5] { value: 1 } - } - } - LIST [6] { - elements: { - CONSTANT [7] { value: 2 } - } - } - } - } - LIST [8] { - elements: { - CONSTANT [9] { value: 1 } - CONSTANT [10] { value: 2 } - } - } - LIST [11] { - elements: { - CONSTANT [12] { value: 1 } - CONSTANT [13] { value: 2 } - CONSTANT [14] { value: 3 } - } - } - } - } - CALL [15] { - function: _==_ - args: { - COMPREHENSION [16] { - iter_var: @it:1:0 - iter_var2: @it2:1:0 - iter_range: { - IDENT [17] { - name: @index1 - } - } - accu_var: @ac:1:0 - accu_init: { - LIST [18] { - elements: { - } - } - } - loop_condition: { - CONSTANT [19] { value: true } - } - loop_step: { - CALL [20] { - function: _+_ - args: { - IDENT [21] { - name: @ac:1:0 - } - LIST [22] { - elements: { - COMPREHENSION [23] { - iter_var: @it:0:0 - iter_range: { - IDENT [24] { - name: @index2 - } - } - accu_var: @ac:0:0 - accu_init: { - LIST [25] { - elements: { - } - } - } - loop_condition: { - CONSTANT [26] { value: true } - } - loop_step: { - CALL [27] { - function: _?_:_ - args: { - CALL [28] { - function: _&&_ - args: { - CALL [29] { - function: _==_ - args: { - IDENT [30] { - name: @it:0:0 - } - IDENT [31] { - name: @it2:1:0 - } - } - } - CALL [32] { - function: _<_ - args: { - IDENT [33] { - name: @it:1:0 - } - IDENT [34] { - name: @it2:1:0 - } - } - } - } - } - CALL [35] { - function: _+_ - args: { - IDENT [36] { - name: @ac:0:0 - } - LIST [37] { - elements: { - IDENT [38] { - name: @it:0:0 - } - } - } - } - } - IDENT [39] { - name: @ac:0:0 - } - } - } - } - result: { - IDENT [40] { - name: @ac:0:0 - } - } - } - } - } - } - } - } - result: { - IDENT [41] { - name: @ac:1:0 - } - } - } - IDENT [42] { - name: @index0 - } - } - } - } -} -Test case: ADJACENT_NESTED_MACROS -Source: [1,2,3].map(i, [1, 2, 3].map(i, i + 1)) == [1,2,3].map(j, [1, 2, 3].map(j, j + 1)) -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - COMPREHENSION [3] { - iter_var: @it:0:0 - iter_range: { - LIST [4] { - elements: { - CONSTANT [5] { value: 1 } - CONSTANT [6] { value: 2 } - CONSTANT [7] { value: 3 } - } - } - } - accu_var: @ac:0:0 - accu_init: { - LIST [8] { - elements: { - } - } - } - loop_condition: { - CONSTANT [9] { value: true } - } - loop_step: { - CALL [10] { - function: _+_ - args: { - IDENT [11] { - name: @ac:0:0 - } - LIST [12] { - elements: { - CALL [13] { - function: _+_ - args: { - IDENT [14] { - name: @it:0:0 - } - CONSTANT [15] { value: 1 } - } - } - } - } - } - } - } - result: { - IDENT [16] { - name: @ac:0:0 - } - } - } - COMPREHENSION [17] { - iter_var: @it:1:0 - iter_range: { - LIST [18] { - elements: { - CONSTANT [19] { value: 1 } - CONSTANT [20] { value: 2 } - CONSTANT [21] { value: 3 } - } - } - } - accu_var: @ac:1:0 - accu_init: { - LIST [22] { - elements: { - } - } - } - loop_condition: { - CONSTANT [23] { value: true } - } - loop_step: { - CALL [24] { - function: _+_ - args: { - IDENT [25] { - name: @ac:1:0 - } - LIST [26] { - elements: { - IDENT [27] { - name: @index0 - } - } - } - } - } - } - result: { - IDENT [28] { - name: @ac:1:0 - } - } - } - } - } - CALL [29] { - function: _==_ - args: { - IDENT [30] { - name: @index1 - } - IDENT [31] { - name: @index1 - } - } - } - } -} -Test case: ADJACENT_NESTED_MACROS_COMP_V2 -Source: [1,2,3].transformMap(i, x, [1, 2, 3].transformMap(i, x, i + x + 1)) == [1,2,3].transformMap(j, y, [1, 2, 3].transformMap(j, y, j + y + 1)) -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - COMPREHENSION [3] { - iter_var: @it:0:0 - iter_var2: @it2:0:0 - iter_range: { - LIST [4] { - elements: { - CONSTANT [5] { value: 1 } - CONSTANT [6] { value: 2 } - CONSTANT [7] { value: 3 } - } - } - } - accu_var: @ac:0:0 - accu_init: { - MAP [8] { - - } - } - loop_condition: { - CONSTANT [9] { value: true } - } - loop_step: { - CALL [10] { - function: cel.@mapInsert - args: { - IDENT [11] { - name: @ac:0:0 - } - IDENT [12] { - name: @it:0:0 - } - CALL [13] { - function: _+_ - args: { - CALL [14] { - function: _+_ - args: { - IDENT [15] { - name: @it:0:0 - } - IDENT [16] { - name: @it2:0:0 - } - } - } - CONSTANT [17] { value: 1 } - } - } - } - } - } - result: { - IDENT [18] { - name: @ac:0:0 - } - } - } - COMPREHENSION [19] { - iter_var: @it:1:0 - iter_var2: @it2:1:0 - iter_range: { - LIST [20] { - elements: { - CONSTANT [21] { value: 1 } - CONSTANT [22] { value: 2 } - CONSTANT [23] { value: 3 } - } - } - } - accu_var: @ac:1:0 - accu_init: { - MAP [24] { - - } - } - loop_condition: { - CONSTANT [25] { value: true } - } - loop_step: { - CALL [26] { - function: cel.@mapInsert - args: { - IDENT [27] { - name: @ac:1:0 - } - IDENT [28] { - name: @it:1:0 - } - IDENT [29] { - name: @index0 - } - } - } - } - result: { - IDENT [30] { - name: @ac:1:0 - } - } - } - } - } - CALL [31] { - function: _==_ - args: { - IDENT [32] { - name: @index1 - } - IDENT [33] { - name: @index1 - } - } - } - } -} -Test case: INCLUSION_LIST -Source: 1 in [1,2,3] && 2 in [1,2,3] && 3 in [3, [1,2,3]] && 1 in [1,2,3] -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - CALL [3] { - function: @in - args: { - CONSTANT [4] { value: 1 } - LIST [5] { - elements: { - CONSTANT [6] { value: 1 } - CONSTANT [7] { value: 2 } - CONSTANT [8] { value: 3 } - } - } - } - } - LIST [9] { - elements: { - CONSTANT [10] { value: 1 } - CONSTANT [11] { value: 2 } - CONSTANT [12] { value: 3 } - } - } - } - } - CALL [13] { - function: _&&_ - args: { - CALL [14] { - function: _&&_ - args: { - IDENT [15] { - name: @index0 - } - CALL [16] { - function: @in - args: { - CONSTANT [17] { value: 2 } - IDENT [18] { - name: @index1 - } - } - } - } - } - CALL [19] { - function: _&&_ - args: { - CALL [20] { - function: @in - args: { - CONSTANT [21] { value: 3 } - LIST [22] { - elements: { - CONSTANT [23] { value: 3 } - IDENT [24] { - name: @index1 - } - } - } - } - } - IDENT [25] { - name: @index0 - } - } - } - } - } - } -} -Test case: INCLUSION_MAP -Source: 2 in {'a': 1, 2: {true: false}, 3: {true: false}} -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - MAP [3] { - MAP_ENTRY [4] { - key: { - CONSTANT [5] { value: true } - } - value: { - CONSTANT [6] { value: false } - } - } - } - } - } - CALL [7] { - function: @in - args: { - CONSTANT [8] { value: 2 } - MAP [9] { - MAP_ENTRY [10] { - key: { - CONSTANT [11] { value: "a" } - } - value: { - CONSTANT [12] { value: 1 } - } - } - MAP_ENTRY [13] { - key: { - CONSTANT [14] { value: 2 } - } - value: { - IDENT [15] { - name: @index0 - } - } - } - MAP_ENTRY [16] { - key: { - CONSTANT [17] { value: 3 } - } - value: { - IDENT [18] { - name: @index0 - } - } - } - } - } - } - } -} -Test case: MACRO_ITER_VAR_NOT_REFERENCED -Source: [1,2].map(i, [1, 2].map(i, [3,4])) == [[[3, 4], [3, 4]], [[3, 4], [3, 4]]] -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - LIST [3] { - elements: { - LIST [4] { - elements: { - CONSTANT [5] { value: 3 } - CONSTANT [6] { value: 4 } - } - } - LIST [7] { - elements: { - CONSTANT [8] { value: 3 } - CONSTANT [9] { value: 4 } - } - } - } - } - LIST [10] { - elements: { - CONSTANT [11] { value: 1 } - CONSTANT [12] { value: 2 } - } - } - COMPREHENSION [13] { - iter_var: @it:0:0 - iter_range: { - IDENT [14] { - name: @index1 - } - } - accu_var: @ac:0:0 - accu_init: { - LIST [15] { - elements: { - } - } - } - loop_condition: { - CONSTANT [16] { value: true } - } - loop_step: { - CALL [17] { - function: _+_ - args: { - IDENT [18] { - name: @ac:0:0 - } - LIST [19] { - elements: { - LIST [20] { - elements: { - CONSTANT [21] { value: 3 } - CONSTANT [22] { value: 4 } - } - } - } - } - } - } - } - result: { - IDENT [23] { - name: @ac:0:0 - } - } - } - } - } - CALL [24] { - function: _==_ - args: { - COMPREHENSION [25] { - iter_var: @it:1:0 - iter_range: { - IDENT [26] { - name: @index1 - } - } - accu_var: @ac:1:0 - accu_init: { - LIST [27] { - elements: { - } - } - } - loop_condition: { - CONSTANT [28] { value: true } - } - loop_step: { - CALL [29] { - function: _+_ - args: { - IDENT [30] { - name: @ac:1:0 - } - LIST [31] { - elements: { - IDENT [32] { - name: @index2 - } - } - } - } - } - } - result: { - IDENT [33] { - name: @ac:1:0 - } - } - } - LIST [34] { - elements: { - IDENT [35] { - name: @index0 - } - IDENT [36] { - name: @index0 - } - } - } - } - } - } -} -Test case: MACRO_ITER_VAR2_NOT_REFERENCED -Source: [1,2].transformList(i, v, [1, 2].transformList(i, v, [3,4])) == [[[3, 4], [3, 4]], [[3, 4], [3, 4]]] -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - LIST [3] { - elements: { - LIST [4] { - elements: { - CONSTANT [5] { value: 3 } - CONSTANT [6] { value: 4 } - } - } - LIST [7] { - elements: { - CONSTANT [8] { value: 3 } - CONSTANT [9] { value: 4 } - } - } - } - } - LIST [10] { - elements: { - CONSTANT [11] { value: 1 } - CONSTANT [12] { value: 2 } - } - } - COMPREHENSION [13] { - iter_var: @it:0:0 - iter_var2: @it2:0:0 - iter_range: { - IDENT [14] { - name: @index1 - } - } - accu_var: @ac:0:0 - accu_init: { - LIST [15] { - elements: { - } - } - } - loop_condition: { - CONSTANT [16] { value: true } - } - loop_step: { - CALL [17] { - function: _+_ - args: { - IDENT [18] { - name: @ac:0:0 - } - LIST [19] { - elements: { - LIST [20] { - elements: { - CONSTANT [21] { value: 3 } - CONSTANT [22] { value: 4 } - } - } - } - } - } - } - } - result: { - IDENT [23] { - name: @ac:0:0 - } - } - } - } - } - CALL [24] { - function: _==_ - args: { - COMPREHENSION [25] { - iter_var: @it:1:0 - iter_var2: @it2:1:0 - iter_range: { - IDENT [26] { - name: @index1 - } - } - accu_var: @ac:1:0 - accu_init: { - LIST [27] { - elements: { - } - } - } - loop_condition: { - CONSTANT [28] { value: true } - } - loop_step: { - CALL [29] { - function: _+_ - args: { - IDENT [30] { - name: @ac:1:0 - } - LIST [31] { - elements: { - IDENT [32] { - name: @index2 - } - } - } - } - } - } - result: { - IDENT [33] { - name: @ac:1:0 - } - } - } - LIST [34] { - elements: { - IDENT [35] { - name: @index0 - } - IDENT [36] { - name: @index0 - } - } - } - } - } - } -} -Test case: MACRO_SHADOWED_VARIABLE -Source: [x - 1 > 3 ? x - 1 : 5].exists(x, x - 1 > 3) || x - 1 > 3 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - CALL [3] { - function: _>_ - args: { - CALL [4] { - function: _-_ - args: { - IDENT [5] { - name: x - } - CONSTANT [6] { value: 1 } - } - } - CONSTANT [7] { value: 3 } - } - } - } - } - CALL [8] { - function: _||_ - args: { - COMPREHENSION [9] { - iter_var: @it:0:0 - iter_range: { - LIST [10] { - elements: { - CALL [11] { - function: _?_:_ - args: { - IDENT [12] { - name: @index0 - } - CALL [13] { - function: _-_ - args: { - IDENT [14] { - name: x - } - CONSTANT [15] { value: 1 } - } - } - CONSTANT [16] { value: 5 } - } - } - } - } - } - accu_var: @ac:0:0 - accu_init: { - CONSTANT [17] { value: false } - } - loop_condition: { - CALL [18] { - function: @not_strictly_false - args: { - CALL [19] { - function: !_ - args: { - IDENT [20] { - name: @ac:0:0 - } - } - } - } - } - } - loop_step: { - CALL [21] { - function: _||_ - args: { - IDENT [22] { - name: @ac:0:0 - } - CALL [23] { - function: _>_ - args: { - CALL [24] { - function: _-_ - args: { - IDENT [25] { - name: @it:0:0 - } - CONSTANT [26] { value: 1 } - } - } - CONSTANT [27] { value: 3 } - } - } - } - } - } - result: { - IDENT [28] { - name: @ac:0:0 - } - } - } - IDENT [29] { - name: @index0 - } - } - } - } -} -Test case: MACRO_SHADOWED_VARIABLE_2 -Source: ["foo", "bar"].map(x, [x + x, x + x]).map(x, [x + x, x + x]) -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - COMPREHENSION [3] { - iter_var: @it:0:0 - iter_range: { - LIST [4] { - elements: { - CONSTANT [5] { value: "foo" } - CONSTANT [6] { value: "bar" } - } - } - } - accu_var: @ac:0:0 - accu_init: { - LIST [7] { - elements: { - } - } - } - loop_condition: { - CONSTANT [8] { value: true } - } - loop_step: { - CALL [9] { - function: _+_ - args: { - IDENT [10] { - name: @ac:0:0 - } - LIST [11] { - elements: { - LIST [12] { - elements: { - CALL [13] { - function: _+_ - args: { - IDENT [14] { - name: @it:0:0 - } - IDENT [15] { - name: @it:0:0 - } - } - } - CALL [16] { - function: _+_ - args: { - IDENT [17] { - name: @it:0:0 - } - IDENT [18] { - name: @it:0:0 - } - } - } - } - } - } - } - } - } - } - result: { - IDENT [19] { - name: @ac:0:0 - } - } - } - } - } - COMPREHENSION [20] { - iter_var: @it:1:0 - iter_range: { - IDENT [21] { - name: @index0 - } - } - accu_var: @ac:1:0 - accu_init: { - LIST [22] { - elements: { - } - } - } - loop_condition: { - CONSTANT [23] { value: true } - } - loop_step: { - CALL [24] { - function: _+_ - args: { - IDENT [25] { - name: @ac:1:0 - } - LIST [26] { - elements: { - LIST [27] { - elements: { - CALL [28] { - function: _+_ - args: { - IDENT [29] { - name: @it:1:0 - } - IDENT [30] { - name: @it:1:0 - } - } - } - CALL [31] { - function: _+_ - args: { - IDENT [32] { - name: @it:1:0 - } - IDENT [33] { - name: @it:1:0 - } - } - } - } - } - } - } - } - } - } - result: { - IDENT [34] { - name: @ac:1:0 - } - } - } - } -} -Test case: MACRO_SHADOWED_VARIABLE_COMP_V2_1 -Source: [x - y - 1 > 3 ? x - y - 1 : 5].exists(x, y, x - y - 1 > 3) || x - y - 1 > 3 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - CALL [3] { - function: _>_ - args: { - CALL [4] { - function: _-_ - args: { - CALL [5] { - function: _-_ - args: { - IDENT [6] { - name: x - } - IDENT [7] { - name: y - } - } - } - CONSTANT [8] { value: 1 } - } - } - CONSTANT [9] { value: 3 } - } - } - } - } - CALL [10] { - function: _||_ - args: { - COMPREHENSION [11] { - iter_var: @it:0:0 - iter_var2: @it2:0:0 - iter_range: { - LIST [12] { - elements: { - CALL [13] { - function: _?_:_ - args: { - IDENT [14] { - name: @index0 - } - CALL [15] { - function: _-_ - args: { - CALL [16] { - function: _-_ - args: { - IDENT [17] { - name: x - } - IDENT [18] { - name: y - } - } - } - CONSTANT [19] { value: 1 } - } - } - CONSTANT [20] { value: 5 } - } - } - } - } - } - accu_var: @ac:0:0 - accu_init: { - CONSTANT [21] { value: false } - } - loop_condition: { - CALL [22] { - function: @not_strictly_false - args: { - CALL [23] { - function: !_ - args: { - IDENT [24] { - name: @ac:0:0 - } - } - } - } - } - } - loop_step: { - CALL [25] { - function: _||_ - args: { - IDENT [26] { - name: @ac:0:0 - } - CALL [27] { - function: _>_ - args: { - CALL [28] { - function: _-_ - args: { - CALL [29] { - function: _-_ - args: { - IDENT [30] { - name: @it:0:0 - } - IDENT [31] { - name: @it2:0:0 - } - } - } - CONSTANT [32] { value: 1 } - } - } - CONSTANT [33] { value: 3 } - } - } - } - } - } - result: { - IDENT [34] { - name: @ac:0:0 - } - } - } - IDENT [35] { - name: @index0 - } - } - } - } -} -Test case: MACRO_SHADOWED_VARIABLE_COMP_V2_2 -Source: ["foo", "bar"].transformMap(x, y, [x + x, y + y]).transformMap(x, y, [x + x, y + y]) -=====> -COMPREHENSION [35] { - iter_var: x - iter_var2: y - iter_range: { - COMPREHENSION [19] { - iter_var: x - iter_var2: y - iter_range: { - LIST [1] { - elements: { - CONSTANT [2] { value: "foo" } - CONSTANT [3] { value: "bar" } - } - } - } - accu_var: @result - accu_init: { - MAP [14] { - - } - } - loop_condition: { - CONSTANT [15] { value: true } - } - loop_step: { - CALL [17] { - function: cel.@mapInsert - args: { - IDENT [16] { - name: @result - } - IDENT [5] { - name: x - } - LIST [7] { - elements: { - CALL [9] { - function: _+_ - args: { - IDENT [8] { - name: x - } - IDENT [10] { - name: x - } - } - } - CALL [12] { - function: _+_ - args: { - IDENT [11] { - name: y - } - IDENT [13] { - name: y - } - } - } - } - } - } - } - } - result: { - IDENT [18] { - name: @result - } - } - } - } - accu_var: @result - accu_init: { - MAP [30] { - - } - } - loop_condition: { - CONSTANT [31] { value: true } - } - loop_step: { - CALL [33] { - function: cel.@mapInsert - args: { - IDENT [32] { - name: @result - } - IDENT [21] { - name: x - } - LIST [23] { - elements: { - CALL [25] { - function: _+_ - args: { - IDENT [24] { - name: x - } - IDENT [26] { - name: x - } - } - } - CALL [28] { - function: _+_ - args: { - IDENT [27] { - name: y - } - IDENT [29] { - name: y - } - } - } - } - } - } - } - } - result: { - IDENT [34] { - name: @result - } - } -} -Test case: PRESENCE_TEST -Source: has({'a': true}.a) && {'a':true}['a'] -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - MAP [3] { - MAP_ENTRY [4] { - key: { - CONSTANT [5] { value: "a" } - } - value: { - CONSTANT [6] { value: true } - } - } - } - } - } - CALL [7] { - function: _&&_ - args: { - SELECT [8] { - IDENT [9] { - name: @index0 - }.a~presence_test - } - CALL [10] { - function: _[_] - args: { - IDENT [11] { - name: @index0 - } - CONSTANT [12] { value: "a" } - } - } - } - } - } -} -Test case: PRESENCE_TEST_2 -Source: has({'a': true}.a) && has({'a': true}.a) -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - SELECT [3] { - MAP [4] { - MAP_ENTRY [5] { - key: { - CONSTANT [6] { value: "a" } - } - value: { - CONSTANT [7] { value: true } - } - } - }.a~presence_test - } - } - } - CALL [8] { - function: _&&_ - args: { - IDENT [9] { - name: @index0 - } - IDENT [10] { - name: @index0 - } - } - } - } -} -Test case: PRESENCE_TEST_WITH_TERNARY -Source: (has(msg.oneof_type.payload) ? msg.oneof_type.payload.single_int64 : 0) == 10 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - SELECT [3] { - IDENT [4] { - name: msg - }.oneof_type - } - } - } - CALL [5] { - function: _==_ - args: { - CALL [6] { - function: _?_:_ - args: { - SELECT [7] { - IDENT [8] { - name: @index0 - }.payload~presence_test - } - SELECT [9] { - SELECT [10] { - IDENT [11] { - name: @index0 - }.payload - }.single_int64 - } - CONSTANT [12] { value: 0 } - } - } - CONSTANT [13] { value: 10 } - } - } - } -} -Test case: PRESENCE_TEST_WITH_TERNARY_2 -Source: (has(msg.oneof_type.payload) ? msg.oneof_type.payload.single_int64 : msg.oneof_type.payload.single_int64 * 0) == 10 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - SELECT [3] { - SELECT [4] { - SELECT [5] { - IDENT [6] { - name: msg - }.oneof_type - }.payload - }.single_int64 - } - } - } - CALL [7] { - function: _==_ - args: { - CALL [8] { - function: _?_:_ - args: { - SELECT [9] { - SELECT [10] { - IDENT [11] { - name: msg - }.oneof_type - }.payload~presence_test - } - IDENT [12] { - name: @index0 - } - CALL [13] { - function: _*_ - args: { - IDENT [14] { - name: @index0 - } - CONSTANT [15] { value: 0 } - } - } - } - } - CONSTANT [16] { value: 10 } - } - } - } -} -Test case: PRESENCE_TEST_WITH_TERNARY_3 -Source: (has(msg.oneof_type.payload.single_int64) ? msg.oneof_type.payload.single_int64 : msg.oneof_type.payload.single_int64 * 0) == 10 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - SELECT [3] { - SELECT [4] { - SELECT [5] { - IDENT [6] { - name: msg - }.oneof_type - }.payload - }.single_int64 - } - } - } - CALL [7] { - function: _==_ - args: { - CALL [8] { - function: _?_:_ - args: { - SELECT [9] { - SELECT [10] { - SELECT [11] { - IDENT [12] { - name: msg - }.oneof_type - }.payload - }.single_int64~presence_test - } - IDENT [13] { - name: @index0 - } - CALL [14] { - function: _*_ - args: { - IDENT [15] { - name: @index0 - } - CONSTANT [16] { value: 0 } - } - } - } - } - CONSTANT [17] { value: 10 } - } - } - } -} -Test case: PRESENCE_TEST_WITH_TERNARY_NESTED -Source: (has(msg.oneof_type) && has(msg.oneof_type.payload) && has(msg.oneof_type.payload.single_int64)) ? ((has(msg.oneof_type.payload.map_string_string) && has(msg.oneof_type.payload.map_string_string.key)) ? msg.oneof_type.payload.map_string_string.key == 'A' : false) : false -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - SELECT [3] { - SELECT [4] { - SELECT [5] { - IDENT [6] { - name: msg - }.oneof_type - }.payload - }.map_string_string - } - SELECT [7] { - SELECT [8] { - IDENT [9] { - name: msg - }.oneof_type - }.payload - } - } - } - CALL [10] { - function: _?_:_ - args: { - CALL [11] { - function: _&&_ - args: { - CALL [12] { - function: _&&_ - args: { - SELECT [13] { - IDENT [14] { - name: msg - }.oneof_type~presence_test - } - SELECT [15] { - SELECT [16] { - IDENT [17] { - name: msg - }.oneof_type - }.payload~presence_test - } - } - } - SELECT [18] { - IDENT [19] { - name: @index1 - }.single_int64~presence_test - } - } - } - CALL [20] { - function: _?_:_ - args: { - CALL [21] { - function: _&&_ - args: { - SELECT [22] { - IDENT [23] { - name: @index1 - }.map_string_string~presence_test - } - SELECT [24] { - IDENT [25] { - name: @index0 - }.key~presence_test - } - } - } - CALL [26] { - function: _==_ - args: { - SELECT [27] { - IDENT [28] { - name: @index0 - }.key - } - CONSTANT [29] { value: "A" } - } - } - CONSTANT [30] { value: false } - } - } - CONSTANT [31] { value: false } - } - } - } -} -Test case: OPTIONAL_LIST -Source: [10, ?optional.none(), [?optional.none(), ?opt_x], [?optional.none(), ?opt_x]] == [10, [5], [5]] -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - LIST [3] { - elements: { - CALL [4] { - function: optional.none - args: { - } - } - IDENT [5] { - name: opt_x - } - } - optional_indices: [0, 1] - } - LIST [6] { - elements: { - CONSTANT [7] { value: 5 } - } - } - } - } - CALL [8] { - function: _==_ - args: { - LIST [9] { - elements: { - CONSTANT [10] { value: 10 } - CALL [11] { - function: optional.none - args: { - } - } - IDENT [12] { - name: @index0 - } - IDENT [13] { - name: @index0 - } - } - optional_indices: [0] - } - LIST [14] { - elements: { - CONSTANT [15] { value: 10 } - IDENT [16] { - name: @index1 - } - IDENT [17] { - name: @index1 - } - } - } - } - } - } -} -Test case: OPTIONAL_MAP -Source: {?'hello': optional.of('hello')}['hello'] + {?'hello': optional.of('hello')}['hello'] == 'hellohello' -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - CALL [3] { - function: _[_] - args: { - MAP [4] { - MAP_ENTRY [5] { - key: { - CONSTANT [6] { value: "hello" } - } - optional_entry: true - value: { - CALL [7] { - function: optional.of - args: { - CONSTANT [8] { value: "hello" } - } - } - } - } - } - CONSTANT [9] { value: "hello" } - } - } - } - } - CALL [10] { - function: _==_ - args: { - CALL [11] { - function: _+_ - args: { - IDENT [12] { - name: @index0 - } - IDENT [13] { - name: @index0 - } - } - } - CONSTANT [14] { value: "hellohello" } - } - } - } -} -Test case: OPTIONAL_MAP_CHAINED -Source: {?'key': optional.of('test')}[?'bogus'].or({'key': 'test'}[?'bogus']).orValue({'key': 'test'}['key']) == 'test' -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - MAP [3] { - MAP_ENTRY [4] { - key: { - CONSTANT [5] { value: "key" } - } - value: { - CONSTANT [6] { value: "test" } - } - } - } - CALL [7] { - function: orValue - target: { - CALL [8] { - function: or - target: { - CALL [9] { - function: _[?_] - args: { - MAP [10] { - MAP_ENTRY [11] { - key: { - CONSTANT [12] { value: "key" } - } - optional_entry: true - value: { - CALL [13] { - function: optional.of - args: { - CONSTANT [14] { value: "test" } - } - } - } - } - } - CONSTANT [15] { value: "bogus" } - } - } - } - args: { - CALL [16] { - function: _[?_] - args: { - IDENT [17] { - name: @index0 - } - CONSTANT [18] { value: "bogus" } - } - } - } - } - } - args: { - CALL [19] { - function: _[_] - args: { - IDENT [20] { - name: @index0 - } - CONSTANT [21] { value: "key" } - } - } - } - } - } - } - CALL [22] { - function: _==_ - args: { - IDENT [23] { - name: @index1 - } - CONSTANT [24] { value: "test" } - } - } - } -} -Test case: OPTIONAL_MESSAGE -Source: TestAllTypes{?single_int64: optional.ofNonZeroValue(1), ?single_int32: optional.of(4)}.single_int32 + TestAllTypes{?single_int64: optional.ofNonZeroValue(1), ?single_int32: optional.of(4)}.single_int64 == 5 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - STRUCT [3] { - name: cel.expr.conformance.proto3.TestAllTypes - entries: { - ENTRY [4] { - field_key: single_int64 - optional_entry: true - value: { - CALL [5] { - function: optional.ofNonZeroValue - args: { - CONSTANT [6] { value: 1 } - } - } - } - } - ENTRY [7] { - field_key: single_int32 - optional_entry: true - value: { - CALL [8] { - function: optional.of - args: { - CONSTANT [9] { value: 4 } - } - } - } - } - } - } - } - } - CALL [10] { - function: _==_ - args: { - CALL [11] { - function: _+_ - args: { - SELECT [12] { - IDENT [13] { - name: @index0 - }.single_int32 - } - SELECT [14] { - IDENT [15] { - name: @index0 - }.single_int64 - } - } - } - CONSTANT [16] { value: 5 } - } - } - } -} -Test case: CALL -Source: ('h' + 'e' + 'l' + 'l' + 'o' + ' world').matches('h' + 'e' + 'l' + 'l' + 'o') -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - CALL [3] { - function: _+_ - args: { - CALL [4] { - function: _+_ - args: { - CALL [5] { - function: _+_ - args: { - CALL [6] { - function: _+_ - args: { - CONSTANT [7] { value: "h" } - CONSTANT [8] { value: "e" } - } - } - CONSTANT [9] { value: "l" } - } - } - CONSTANT [10] { value: "l" } - } - } - CONSTANT [11] { value: "o" } - } - } - } - } - CALL [12] { - function: matches - target: { - CALL [13] { - function: _+_ - args: { - IDENT [14] { - name: @index0 - } - CONSTANT [15] { value: " world" } - } - } - } - args: { - IDENT [16] { - name: @index0 - } - } - } - } -} -Test case: CALL_ARGUMENT_NESTED_NO_COMMON_SUBEXPR -Source: 'hello world'.matches('h' + 'e' + 'l' + 'l' + 'o') -=====> -CALL [2] { - function: matches - target: { - CONSTANT [1] { value: "hello world" } - } - args: { - CALL [10] { - function: _+_ - args: { - CALL [8] { - function: _+_ - args: { - CALL [6] { - function: _+_ - args: { - CALL [4] { - function: _+_ - args: { - CONSTANT [3] { value: "h" } - CONSTANT [5] { value: "e" } - } - } - CONSTANT [7] { value: "l" } - } - } - CONSTANT [9] { value: "l" } - } - } - CONSTANT [11] { value: "o" } - } - } - } -} -Test case: CALL_TARGET_NESTED_NO_COMMON_SUBEXPR -Source: ('h' + 'e' + 'l' + 'l' + 'o' + ' world').matches('hello') -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - CALL [3] { - function: _+_ - args: { - CALL [4] { - function: _+_ - args: { - CALL [5] { - function: _+_ - args: { - CALL [6] { - function: _+_ - args: { - CALL [7] { - function: _+_ - args: { - CONSTANT [8] { value: "h" } - CONSTANT [9] { value: "e" } - } - } - CONSTANT [10] { value: "l" } - } - } - CONSTANT [11] { value: "l" } - } - } - CONSTANT [12] { value: "o" } - } - } - CONSTANT [13] { value: " world" } - } - } - } - } - CALL [14] { - function: matches - target: { - IDENT [15] { - name: @index0 - } - } - args: { - CONSTANT [16] { value: "hello" } - } - } - } -} -Test case: CALL_BOTH_ARGUMENT_TARGET_NESTED_NO_COMMON_SUBEXPR -Source: ('h' + 'e' + 'l' + 'l' + 'o' + ' world').matches('w' + 'o' + 'r' + 'l' + 'd') -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - CALL [3] { - function: _+_ - args: { - CALL [4] { - function: _+_ - args: { - CALL [5] { - function: _+_ - args: { - CALL [6] { - function: _+_ - args: { - CALL [7] { - function: _+_ - args: { - CONSTANT [8] { value: "h" } - CONSTANT [9] { value: "e" } - } - } - CONSTANT [10] { value: "l" } - } - } - CONSTANT [11] { value: "l" } - } - } - CONSTANT [12] { value: "o" } - } - } - CONSTANT [13] { value: " world" } - } - } - } - } - CALL [14] { - function: matches - target: { - IDENT [15] { - name: @index0 - } - } - args: { - CALL [16] { - function: _+_ - args: { - CALL [17] { - function: _+_ - args: { - CALL [18] { - function: _+_ - args: { - CALL [19] { - function: _+_ - args: { - CONSTANT [20] { value: "w" } - CONSTANT [21] { value: "o" } - } - } - CONSTANT [22] { value: "r" } - } - } - CONSTANT [23] { value: "l" } - } - } - CONSTANT [24] { value: "d" } - } - } - } - } - } -} -Test case: CUSTOM_FUNCTION_INELIMINABLE -Source: non_pure_custom_func(msg.oneof_type.payload.single_int64) + non_pure_custom_func(msg.oneof_type.payload.single_int32) + non_pure_custom_func(msg.oneof_type.payload.single_int64) + non_pure_custom_func(msg.single_int64) -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - SELECT [3] { - SELECT [4] { - SELECT [5] { - IDENT [6] { - name: msg - }.oneof_type - }.payload - }.single_int64 - } - } - } - CALL [7] { - function: _+_ - args: { - CALL [8] { - function: _+_ - args: { - CALL [9] { - function: _+_ - args: { - CALL [10] { - function: non_pure_custom_func - args: { - IDENT [11] { - name: @index0 - } - } - } - CALL [12] { - function: non_pure_custom_func - args: { - SELECT [13] { - SELECT [14] { - SELECT [15] { - IDENT [16] { - name: msg - }.oneof_type - }.payload - }.single_int32 - } - } - } - } - } - CALL [17] { - function: non_pure_custom_func - args: { - IDENT [18] { - name: @index0 - } - } - } - } - } - CALL [19] { - function: non_pure_custom_func - args: { - SELECT [20] { - IDENT [21] { - name: msg - }.single_int64 - } - } - } - } - } - } -} -Test case: CUSTOM_FUNCTION_ELIMINABLE -Source: pure_custom_func(msg.oneof_type.payload.single_int64) + pure_custom_func(msg.oneof_type.payload.single_int32) + pure_custom_func(msg.oneof_type.payload.single_int64) + pure_custom_func(msg.single_int64) -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - CALL [3] { - function: pure_custom_func - args: { - SELECT [4] { - SELECT [5] { - SELECT [6] { - IDENT [7] { - name: msg - }.oneof_type - }.payload - }.single_int64 - } - } - } - CALL [8] { - function: _+_ - args: { - IDENT [9] { - name: @index0 - } - CALL [10] { - function: pure_custom_func - args: { - SELECT [11] { - SELECT [12] { - SELECT [13] { - IDENT [14] { - name: msg - }.oneof_type - }.payload - }.single_int32 - } - } - } - } - } - } - } - CALL [15] { - function: _+_ - args: { - CALL [16] { - function: _+_ - args: { - IDENT [17] { - name: @index1 - } - IDENT [18] { - name: @index0 - } - } - } - CALL [19] { - function: pure_custom_func - args: { - SELECT [20] { - IDENT [21] { - name: msg - }.single_int64 - } - } - } - } - } - } -} \ No newline at end of file diff --git a/optimizer/src/test/resources/subexpression_ast_block_recursion_depth_6.baseline b/optimizer/src/test/resources/subexpression_ast_block_recursion_depth_6.baseline deleted file mode 100644 index f13d51e99..000000000 --- a/optimizer/src/test/resources/subexpression_ast_block_recursion_depth_6.baseline +++ /dev/null @@ -1,4871 +0,0 @@ -Test case: SIZE_1 -Source: size([1,2]) + size([1,2]) + 1 == 5 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - CALL [3] { - function: size - args: { - LIST [4] { - elements: { - CONSTANT [5] { value: 1 } - CONSTANT [6] { value: 2 } - } - } - } - } - } - } - CALL [7] { - function: _==_ - args: { - CALL [8] { - function: _+_ - args: { - CALL [9] { - function: _+_ - args: { - IDENT [10] { - name: @index0 - } - IDENT [11] { - name: @index0 - } - } - } - CONSTANT [12] { value: 1 } - } - } - CONSTANT [13] { value: 5 } - } - } - } -} -Test case: SIZE_2 -Source: 2 + size([1,2]) + size([1,2]) + 1 == 7 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - CALL [3] { - function: size - args: { - LIST [4] { - elements: { - CONSTANT [5] { value: 1 } - CONSTANT [6] { value: 2 } - } - } - } - } - } - } - CALL [7] { - function: _==_ - args: { - CALL [8] { - function: _+_ - args: { - CALL [9] { - function: _+_ - args: { - CALL [10] { - function: _+_ - args: { - CONSTANT [11] { value: 2 } - IDENT [12] { - name: @index0 - } - } - } - IDENT [13] { - name: @index0 - } - } - } - CONSTANT [14] { value: 1 } - } - } - CONSTANT [15] { value: 7 } - } - } - } -} -Test case: SIZE_3 -Source: size([0]) + size([0]) + size([1,2]) + size([1,2]) == 6 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - CALL [3] { - function: size - args: { - LIST [4] { - elements: { - CONSTANT [5] { value: 0 } - } - } - } - } - CALL [6] { - function: size - args: { - LIST [7] { - elements: { - CONSTANT [8] { value: 1 } - CONSTANT [9] { value: 2 } - } - } - } - } - } - } - CALL [10] { - function: _==_ - args: { - CALL [11] { - function: _+_ - args: { - CALL [12] { - function: _+_ - args: { - CALL [13] { - function: _+_ - args: { - IDENT [14] { - name: @index0 - } - IDENT [15] { - name: @index0 - } - } - } - IDENT [16] { - name: @index1 - } - } - } - IDENT [17] { - name: @index1 - } - } - } - CONSTANT [18] { value: 6 } - } - } - } -} -Test case: SIZE_4 -Source: 5 + size([0]) + size([0]) + size([1,2]) + size([1,2]) + size([1,2,3]) + size([1,2,3]) == 17 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - CALL [3] { - function: size - args: { - LIST [4] { - elements: { - CONSTANT [5] { value: 0 } - } - } - } - } - CALL [6] { - function: size - args: { - LIST [7] { - elements: { - CONSTANT [8] { value: 1 } - CONSTANT [9] { value: 2 } - } - } - } - } - CALL [10] { - function: size - args: { - LIST [11] { - elements: { - CONSTANT [12] { value: 1 } - CONSTANT [13] { value: 2 } - CONSTANT [14] { value: 3 } - } - } - } - } - CALL [15] { - function: _+_ - args: { - CALL [16] { - function: _+_ - args: { - CALL [17] { - function: _+_ - args: { - CALL [18] { - function: _+_ - args: { - CALL [19] { - function: _+_ - args: { - CALL [20] { - function: _+_ - args: { - CONSTANT [21] { value: 5 } - IDENT [22] { - name: @index0 - } - } - } - IDENT [23] { - name: @index0 - } - } - } - IDENT [24] { - name: @index1 - } - } - } - IDENT [25] { - name: @index1 - } - } - } - IDENT [26] { - name: @index2 - } - } - } - IDENT [27] { - name: @index2 - } - } - } - } - } - CALL [28] { - function: _==_ - args: { - IDENT [29] { - name: @index3 - } - CONSTANT [30] { value: 17 } - } - } - } -} -Test case: TIMESTAMP -Source: timestamp(int(timestamp(1000000000))).getFullYear() + timestamp(int(timestamp(75))).getFullYear() + timestamp(int(timestamp(50))).getFullYear() + timestamp(int(timestamp(1000000000))).getFullYear() + timestamp(int(timestamp(50))).getSeconds() + timestamp(int(timestamp(200))).getFullYear() + timestamp(int(timestamp(200))).getFullYear() + timestamp(int(timestamp(75))).getMinutes() + timestamp(int(timestamp(1000000000))).getFullYear() == 13934 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - CALL [3] { - function: getFullYear - target: { - CALL [4] { - function: timestamp - args: { - CALL [5] { - function: int - args: { - CALL [6] { - function: timestamp - args: { - CONSTANT [7] { value: 1000000000 } - } - } - } - } - } - } - } - args: { - } - } - CALL [8] { - function: getFullYear - target: { - CALL [9] { - function: timestamp - args: { - CALL [10] { - function: int - args: { - CALL [11] { - function: timestamp - args: { - CONSTANT [12] { value: 200 } - } - } - } - } - } - } - } - args: { - } - } - CALL [13] { - function: timestamp - args: { - CALL [14] { - function: int - args: { - CALL [15] { - function: timestamp - args: { - CONSTANT [16] { value: 50 } - } - } - } - } - } - } - CALL [17] { - function: timestamp - args: { - CALL [18] { - function: int - args: { - CALL [19] { - function: timestamp - args: { - CONSTANT [20] { value: 75 } - } - } - } - } - } - } - CALL [21] { - function: _+_ - args: { - CALL [22] { - function: _+_ - args: { - CALL [23] { - function: _+_ - args: { - CALL [24] { - function: _+_ - args: { - CALL [25] { - function: _+_ - args: { - IDENT [26] { - name: @index0 - } - CALL [27] { - function: getFullYear - target: { - IDENT [28] { - name: @index3 - } - } - args: { - } - } - } - } - CALL [29] { - function: getFullYear - target: { - IDENT [30] { - name: @index2 - } - } - args: { - } - } - } - } - IDENT [31] { - name: @index0 - } - } - } - CALL [32] { - function: getSeconds - target: { - IDENT [33] { - name: @index2 - } - } - args: { - } - } - } - } - IDENT [34] { - name: @index1 - } - } - } - } - } - CALL [35] { - function: _==_ - args: { - CALL [36] { - function: _+_ - args: { - CALL [37] { - function: _+_ - args: { - CALL [38] { - function: _+_ - args: { - IDENT [39] { - name: @index4 - } - IDENT [40] { - name: @index1 - } - } - } - CALL [41] { - function: getMinutes - target: { - IDENT [42] { - name: @index3 - } - } - args: { - } - } - } - } - IDENT [43] { - name: @index0 - } - } - } - CONSTANT [44] { value: 13934 } - } - } - } -} -Test case: MAP_INDEX -Source: {"a": 2}["a"] + {"a": 2}["a"] * {"a": 2}["a"] == 6 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - CALL [3] { - function: _[_] - args: { - MAP [4] { - MAP_ENTRY [5] { - key: { - CONSTANT [6] { value: "a" } - } - value: { - CONSTANT [7] { value: 2 } - } - } - } - CONSTANT [8] { value: "a" } - } - } - } - } - CALL [9] { - function: _==_ - args: { - CALL [10] { - function: _+_ - args: { - IDENT [11] { - name: @index0 - } - CALL [12] { - function: _*_ - args: { - IDENT [13] { - name: @index0 - } - IDENT [14] { - name: @index0 - } - } - } - } - } - CONSTANT [15] { value: 6 } - } - } - } -} -Test case: NESTED_MAP_CONSTRUCTION -Source: {'a': {'b': 1}, 'c': {'b': 1}, 'd': {'e': {'b': 1}}, 'e': {'e': {'b': 1}}} -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - MAP [3] { - MAP_ENTRY [4] { - key: { - CONSTANT [5] { value: "e" } - } - value: { - MAP [6] { - MAP_ENTRY [7] { - key: { - CONSTANT [8] { value: "b" } - } - value: { - CONSTANT [9] { value: 1 } - } - } - } - } - } - } - MAP [10] { - MAP_ENTRY [11] { - key: { - CONSTANT [12] { value: "b" } - } - value: { - CONSTANT [13] { value: 1 } - } - } - } - } - } - MAP [14] { - MAP_ENTRY [15] { - key: { - CONSTANT [16] { value: "a" } - } - value: { - IDENT [17] { - name: @index1 - } - } - } - MAP_ENTRY [18] { - key: { - CONSTANT [19] { value: "c" } - } - value: { - IDENT [20] { - name: @index1 - } - } - } - MAP_ENTRY [21] { - key: { - CONSTANT [22] { value: "d" } - } - value: { - IDENT [23] { - name: @index0 - } - } - } - MAP_ENTRY [24] { - key: { - CONSTANT [25] { value: "e" } - } - value: { - IDENT [26] { - name: @index0 - } - } - } - } - } -} -Test case: NESTED_LIST_CONSTRUCTION -Source: [1, [1,2,3,4], 2, [1,2,3,4], 5, [1,2,3,4], 7, [[1,2], [1,2,3,4]], [1,2]] -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - LIST [3] { - elements: { - CONSTANT [4] { value: 1 } - CONSTANT [5] { value: 2 } - CONSTANT [6] { value: 3 } - CONSTANT [7] { value: 4 } - } - } - LIST [8] { - elements: { - CONSTANT [9] { value: 1 } - CONSTANT [10] { value: 2 } - } - } - } - } - LIST [11] { - elements: { - CONSTANT [12] { value: 1 } - IDENT [13] { - name: @index0 - } - CONSTANT [14] { value: 2 } - IDENT [15] { - name: @index0 - } - CONSTANT [16] { value: 5 } - IDENT [17] { - name: @index0 - } - CONSTANT [18] { value: 7 } - LIST [19] { - elements: { - IDENT [20] { - name: @index1 - } - IDENT [21] { - name: @index0 - } - } - } - IDENT [22] { - name: @index1 - } - } - } - } -} -Test case: SELECT -Source: msg.single_int64 + msg.single_int64 == 6 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - SELECT [3] { - IDENT [4] { - name: msg - }.single_int64 - } - } - } - CALL [5] { - function: _==_ - args: { - CALL [6] { - function: _+_ - args: { - IDENT [7] { - name: @index0 - } - IDENT [8] { - name: @index0 - } - } - } - CONSTANT [9] { value: 6 } - } - } - } -} -Test case: SELECT_NESTED_1 -Source: msg.oneof_type.payload.single_int64 + msg.oneof_type.payload.single_int32 + msg.oneof_type.payload.single_int64 + msg.single_int64 + msg.oneof_type.payload.oneof_type.payload.single_int64 == 31 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - SELECT [3] { - SELECT [4] { - SELECT [5] { - IDENT [6] { - name: msg - }.oneof_type - }.payload - }.single_int64 - } - SELECT [7] { - SELECT [8] { - IDENT [9] { - name: msg - }.oneof_type - }.payload - } - } - } - CALL [10] { - function: _==_ - args: { - CALL [11] { - function: _+_ - args: { - CALL [12] { - function: _+_ - args: { - CALL [13] { - function: _+_ - args: { - CALL [14] { - function: _+_ - args: { - IDENT [15] { - name: @index0 - } - SELECT [16] { - IDENT [17] { - name: @index1 - }.single_int32 - } - } - } - IDENT [18] { - name: @index0 - } - } - } - SELECT [19] { - IDENT [20] { - name: msg - }.single_int64 - } - } - } - SELECT [21] { - SELECT [22] { - SELECT [23] { - IDENT [24] { - name: @index1 - }.oneof_type - }.payload - }.single_int64 - } - } - } - CONSTANT [25] { value: 31 } - } - } - } -} -Test case: SELECT_NESTED_2 -Source: true || msg.oneof_type.payload.oneof_type.payload.oneof_type.payload.oneof_type.payload.single_bool || msg.oneof_type.payload.oneof_type.payload.oneof_type.child.child.payload.single_bool -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - SELECT [3] { - SELECT [4] { - SELECT [5] { - SELECT [6] { - SELECT [7] { - IDENT [8] { - name: msg - }.oneof_type - }.payload - }.oneof_type - }.payload - }.oneof_type - } - } - } - CALL [9] { - function: _||_ - args: { - CALL [10] { - function: _||_ - args: { - CONSTANT [11] { value: true } - SELECT [12] { - SELECT [13] { - SELECT [14] { - SELECT [15] { - IDENT [16] { - name: @index0 - }.payload - }.oneof_type - }.payload - }.single_bool - } - } - } - SELECT [17] { - SELECT [18] { - SELECT [19] { - SELECT [20] { - IDENT [21] { - name: @index0 - }.child - }.child - }.payload - }.single_bool - } - } - } - } -} -Test case: SELECT_NESTED_MESSAGE_MAP_INDEX_1 -Source: msg.oneof_type.payload.map_int32_int64[1] + msg.oneof_type.payload.map_int32_int64[1] + msg.oneof_type.payload.map_int32_int64[1] == 15 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - CALL [3] { - function: _[_] - args: { - SELECT [4] { - SELECT [5] { - SELECT [6] { - IDENT [7] { - name: msg - }.oneof_type - }.payload - }.map_int32_int64 - } - CONSTANT [8] { value: 1 } - } - } - } - } - CALL [9] { - function: _==_ - args: { - CALL [10] { - function: _+_ - args: { - CALL [11] { - function: _+_ - args: { - IDENT [12] { - name: @index0 - } - IDENT [13] { - name: @index0 - } - } - } - IDENT [14] { - name: @index0 - } - } - } - CONSTANT [15] { value: 15 } - } - } - } -} -Test case: SELECT_NESTED_MESSAGE_MAP_INDEX_2 -Source: msg.oneof_type.payload.map_int32_int64[0] + msg.oneof_type.payload.map_int32_int64[1] + msg.oneof_type.payload.map_int32_int64[2] == 8 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - SELECT [3] { - SELECT [4] { - SELECT [5] { - IDENT [6] { - name: msg - }.oneof_type - }.payload - }.map_int32_int64 - } - } - } - CALL [7] { - function: _==_ - args: { - CALL [8] { - function: _+_ - args: { - CALL [9] { - function: _+_ - args: { - CALL [10] { - function: _[_] - args: { - IDENT [11] { - name: @index0 - } - CONSTANT [12] { value: 0 } - } - } - CALL [13] { - function: _[_] - args: { - IDENT [14] { - name: @index0 - } - CONSTANT [15] { value: 1 } - } - } - } - } - CALL [16] { - function: _[_] - args: { - IDENT [17] { - name: @index0 - } - CONSTANT [18] { value: 2 } - } - } - } - } - CONSTANT [19] { value: 8 } - } - } - } -} -Test case: SELECT_NESTED_NO_COMMON_SUBEXPR -Source: msg.oneof_type.payload.oneof_type.payload.oneof_type.payload.oneof_type.payload.single_int64 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - SELECT [3] { - SELECT [4] { - SELECT [5] { - SELECT [6] { - SELECT [7] { - SELECT [8] { - IDENT [9] { - name: msg - }.oneof_type - }.payload - }.oneof_type - }.payload - }.oneof_type - }.payload - } - } - } - SELECT [10] { - SELECT [11] { - SELECT [12] { - IDENT [13] { - name: @index0 - }.oneof_type - }.payload - }.single_int64 - } - } -} -Test case: TERNARY -Source: (msg.single_int64 > 0 ? msg.single_int64 : 0) == 3 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - SELECT [3] { - IDENT [4] { - name: msg - }.single_int64 - } - } - } - CALL [5] { - function: _==_ - args: { - CALL [6] { - function: _?_:_ - args: { - CALL [7] { - function: _>_ - args: { - IDENT [8] { - name: @index0 - } - CONSTANT [9] { value: 0 } - } - } - IDENT [10] { - name: @index0 - } - CONSTANT [11] { value: 0 } - } - } - CONSTANT [12] { value: 3 } - } - } - } -} -Test case: TERNARY_BIND_RHS_ONLY -Source: false ? false : (msg.single_int64) + ((msg.single_int64 + 1) * 2) == 11 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - SELECT [3] { - IDENT [4] { - name: msg - }.single_int64 - } - } - } - CALL [5] { - function: _?_:_ - args: { - CONSTANT [6] { value: false } - CONSTANT [7] { value: false } - CALL [8] { - function: _==_ - args: { - CALL [9] { - function: _+_ - args: { - IDENT [10] { - name: @index0 - } - CALL [11] { - function: _*_ - args: { - CALL [12] { - function: _+_ - args: { - IDENT [13] { - name: @index0 - } - CONSTANT [14] { value: 1 } - } - } - CONSTANT [15] { value: 2 } - } - } - } - } - CONSTANT [16] { value: 11 } - } - } - } - } - } -} -Test case: NESTED_TERNARY -Source: (msg.single_int64 > 0 ? (msg.single_int32 > 0 ? msg.single_int64 + msg.single_int32 : 0) : 0) == 8 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - SELECT [3] { - IDENT [4] { - name: msg - }.single_int64 - } - SELECT [5] { - IDENT [6] { - name: msg - }.single_int32 - } - } - } - CALL [7] { - function: _==_ - args: { - CALL [8] { - function: _?_:_ - args: { - CALL [9] { - function: _>_ - args: { - IDENT [10] { - name: @index0 - } - CONSTANT [11] { value: 0 } - } - } - CALL [12] { - function: _?_:_ - args: { - CALL [13] { - function: _>_ - args: { - IDENT [14] { - name: @index1 - } - CONSTANT [15] { value: 0 } - } - } - CALL [16] { - function: _+_ - args: { - IDENT [17] { - name: @index0 - } - IDENT [18] { - name: @index1 - } - } - } - CONSTANT [19] { value: 0 } - } - } - CONSTANT [20] { value: 0 } - } - } - CONSTANT [21] { value: 8 } - } - } - } -} -Test case: MULTIPLE_MACROS_1 -Source: size([[1].exists(i, i > 0)]) + size([[1].exists(j, j > 0)]) + size([[2].exists(k, k > 1)]) + size([[2].exists(l, l > 1)]) == 4 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - COMPREHENSION [3] { - iter_var: @it:0:0 - iter_range: { - LIST [4] { - elements: { - CONSTANT [5] { value: 1 } - } - } - } - accu_var: @ac:0:0 - accu_init: { - CONSTANT [6] { value: false } - } - loop_condition: { - CALL [7] { - function: @not_strictly_false - args: { - CALL [8] { - function: !_ - args: { - IDENT [9] { - name: @ac:0:0 - } - } - } - } - } - } - loop_step: { - CALL [10] { - function: _||_ - args: { - IDENT [11] { - name: @ac:0:0 - } - CALL [12] { - function: _>_ - args: { - IDENT [13] { - name: @it:0:0 - } - CONSTANT [14] { value: 0 } - } - } - } - } - } - result: { - IDENT [15] { - name: @ac:0:0 - } - } - } - COMPREHENSION [16] { - iter_var: @it:0:0 - iter_range: { - LIST [17] { - elements: { - CONSTANT [18] { value: 2 } - } - } - } - accu_var: @ac:0:0 - accu_init: { - CONSTANT [19] { value: false } - } - loop_condition: { - CALL [20] { - function: @not_strictly_false - args: { - CALL [21] { - function: !_ - args: { - IDENT [22] { - name: @ac:0:0 - } - } - } - } - } - } - loop_step: { - CALL [23] { - function: _||_ - args: { - IDENT [24] { - name: @ac:0:0 - } - CALL [25] { - function: _>_ - args: { - IDENT [26] { - name: @it:0:0 - } - CONSTANT [27] { value: 1 } - } - } - } - } - } - result: { - IDENT [28] { - name: @ac:0:0 - } - } - } - CALL [29] { - function: size - args: { - LIST [30] { - elements: { - IDENT [31] { - name: @index0 - } - } - } - } - } - CALL [32] { - function: size - args: { - LIST [33] { - elements: { - IDENT [34] { - name: @index1 - } - } - } - } - } - } - } - CALL [35] { - function: _==_ - args: { - CALL [36] { - function: _+_ - args: { - CALL [37] { - function: _+_ - args: { - CALL [38] { - function: _+_ - args: { - IDENT [39] { - name: @index2 - } - IDENT [40] { - name: @index2 - } - } - } - IDENT [41] { - name: @index3 - } - } - } - IDENT [42] { - name: @index3 - } - } - } - CONSTANT [43] { value: 4 } - } - } - } -} -Test case: MULTIPLE_MACROS_2 -Source: [[1].exists(i, i > 0)] + [[1].exists(j, j > 0)] + [['a'].exists(k, k == 'a')] + [['a'].exists(l, l == 'a')] == [true, true, true, true] -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - COMPREHENSION [3] { - iter_var: @it:0:0 - iter_range: { - LIST [4] { - elements: { - CONSTANT [5] { value: 1 } - } - } - } - accu_var: @ac:0:0 - accu_init: { - CONSTANT [6] { value: false } - } - loop_condition: { - CALL [7] { - function: @not_strictly_false - args: { - CALL [8] { - function: !_ - args: { - IDENT [9] { - name: @ac:0:0 - } - } - } - } - } - } - loop_step: { - CALL [10] { - function: _||_ - args: { - IDENT [11] { - name: @ac:0:0 - } - CALL [12] { - function: _>_ - args: { - IDENT [13] { - name: @it:0:0 - } - CONSTANT [14] { value: 0 } - } - } - } - } - } - result: { - IDENT [15] { - name: @ac:0:0 - } - } - } - COMPREHENSION [16] { - iter_var: @it:0:1 - iter_range: { - LIST [17] { - elements: { - CONSTANT [18] { value: "a" } - } - } - } - accu_var: @ac:0:1 - accu_init: { - CONSTANT [19] { value: false } - } - loop_condition: { - CALL [20] { - function: @not_strictly_false - args: { - CALL [21] { - function: !_ - args: { - IDENT [22] { - name: @ac:0:1 - } - } - } - } - } - } - loop_step: { - CALL [23] { - function: _||_ - args: { - IDENT [24] { - name: @ac:0:1 - } - CALL [25] { - function: _==_ - args: { - IDENT [26] { - name: @it:0:1 - } - CONSTANT [27] { value: "a" } - } - } - } - } - } - result: { - IDENT [28] { - name: @ac:0:1 - } - } - } - LIST [29] { - elements: { - IDENT [30] { - name: @index0 - } - } - } - LIST [31] { - elements: { - IDENT [32] { - name: @index1 - } - } - } - } - } - CALL [33] { - function: _==_ - args: { - CALL [34] { - function: _+_ - args: { - CALL [35] { - function: _+_ - args: { - CALL [36] { - function: _+_ - args: { - IDENT [37] { - name: @index2 - } - IDENT [38] { - name: @index2 - } - } - } - IDENT [39] { - name: @index3 - } - } - } - IDENT [40] { - name: @index3 - } - } - } - LIST [41] { - elements: { - CONSTANT [42] { value: true } - CONSTANT [43] { value: true } - CONSTANT [44] { value: true } - CONSTANT [45] { value: true } - } - } - } - } - } -} -Test case: MULTIPLE_MACROS_3 -Source: [1].exists(i, i > 0) && [1].exists(j, j > 0) && [1].exists(k, k > 1) && [2].exists(l, l > 1) -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - COMPREHENSION [3] { - iter_var: @it:0:0 - iter_range: { - LIST [4] { - elements: { - CONSTANT [5] { value: 1 } - } - } - } - accu_var: @ac:0:0 - accu_init: { - CONSTANT [6] { value: false } - } - loop_condition: { - CALL [7] { - function: @not_strictly_false - args: { - CALL [8] { - function: !_ - args: { - IDENT [9] { - name: @ac:0:0 - } - } - } - } - } - } - loop_step: { - CALL [10] { - function: _||_ - args: { - IDENT [11] { - name: @ac:0:0 - } - CALL [12] { - function: _>_ - args: { - IDENT [13] { - name: @it:0:0 - } - CONSTANT [14] { value: 0 } - } - } - } - } - } - result: { - IDENT [15] { - name: @ac:0:0 - } - } - } - } - } - CALL [16] { - function: _&&_ - args: { - CALL [17] { - function: _&&_ - args: { - IDENT [18] { - name: @index0 - } - IDENT [19] { - name: @index0 - } - } - } - CALL [20] { - function: _&&_ - args: { - COMPREHENSION [21] { - iter_var: @it:0:0 - iter_range: { - LIST [22] { - elements: { - CONSTANT [23] { value: 1 } - } - } - } - accu_var: @ac:0:0 - accu_init: { - CONSTANT [24] { value: false } - } - loop_condition: { - CALL [25] { - function: @not_strictly_false - args: { - CALL [26] { - function: !_ - args: { - IDENT [27] { - name: @ac:0:0 - } - } - } - } - } - } - loop_step: { - CALL [28] { - function: _||_ - args: { - IDENT [29] { - name: @ac:0:0 - } - CALL [30] { - function: _>_ - args: { - IDENT [31] { - name: @it:0:0 - } - CONSTANT [32] { value: 1 } - } - } - } - } - } - result: { - IDENT [33] { - name: @ac:0:0 - } - } - } - COMPREHENSION [34] { - iter_var: @it:0:0 - iter_range: { - LIST [35] { - elements: { - CONSTANT [36] { value: 2 } - } - } - } - accu_var: @ac:0:0 - accu_init: { - CONSTANT [37] { value: false } - } - loop_condition: { - CALL [38] { - function: @not_strictly_false - args: { - CALL [39] { - function: !_ - args: { - IDENT [40] { - name: @ac:0:0 - } - } - } - } - } - } - loop_step: { - CALL [41] { - function: _||_ - args: { - IDENT [42] { - name: @ac:0:0 - } - CALL [43] { - function: _>_ - args: { - IDENT [44] { - name: @it:0:0 - } - CONSTANT [45] { value: 1 } - } - } - } - } - } - result: { - IDENT [46] { - name: @ac:0:0 - } - } - } - } - } - } - } - } -} -Test case: MULTIPLE_MACROS_COMP_V2_1 -Source: size([[1].exists(i,x,i > 0 && x >= 0)]) + size([[1].exists(j, y, j > 0 && y >= 0)]) + size([[2].exists(k,z,k > 1 && z >= 0)]) + size([[2].exists(l, w, l > 1 && w >= 0)]) == 4 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - COMPREHENSION [3] { - iter_var: @it:0:0 - iter_var2: @it2:0:0 - iter_range: { - LIST [4] { - elements: { - CONSTANT [5] { value: 1 } - } - } - } - accu_var: @ac:0:0 - accu_init: { - CONSTANT [6] { value: false } - } - loop_condition: { - CALL [7] { - function: @not_strictly_false - args: { - CALL [8] { - function: !_ - args: { - IDENT [9] { - name: @ac:0:0 - } - } - } - } - } - } - loop_step: { - CALL [10] { - function: _||_ - args: { - IDENT [11] { - name: @ac:0:0 - } - CALL [12] { - function: _&&_ - args: { - CALL [13] { - function: _>_ - args: { - IDENT [14] { - name: @it:0:0 - } - CONSTANT [15] { value: 0 } - } - } - CALL [16] { - function: _>=_ - args: { - IDENT [17] { - name: @it2:0:0 - } - CONSTANT [18] { value: 0 } - } - } - } - } - } - } - } - result: { - IDENT [19] { - name: @ac:0:0 - } - } - } - COMPREHENSION [20] { - iter_var: @it:0:0 - iter_var2: @it2:0:0 - iter_range: { - LIST [21] { - elements: { - CONSTANT [22] { value: 2 } - } - } - } - accu_var: @ac:0:0 - accu_init: { - CONSTANT [23] { value: false } - } - loop_condition: { - CALL [24] { - function: @not_strictly_false - args: { - CALL [25] { - function: !_ - args: { - IDENT [26] { - name: @ac:0:0 - } - } - } - } - } - } - loop_step: { - CALL [27] { - function: _||_ - args: { - IDENT [28] { - name: @ac:0:0 - } - CALL [29] { - function: _&&_ - args: { - CALL [30] { - function: _>_ - args: { - IDENT [31] { - name: @it:0:0 - } - CONSTANT [32] { value: 1 } - } - } - CALL [33] { - function: _>=_ - args: { - IDENT [34] { - name: @it2:0:0 - } - CONSTANT [35] { value: 0 } - } - } - } - } - } - } - } - result: { - IDENT [36] { - name: @ac:0:0 - } - } - } - CALL [37] { - function: size - args: { - LIST [38] { - elements: { - IDENT [39] { - name: @index0 - } - } - } - } - } - CALL [40] { - function: size - args: { - LIST [41] { - elements: { - IDENT [42] { - name: @index1 - } - } - } - } - } - } - } - CALL [43] { - function: _==_ - args: { - CALL [44] { - function: _+_ - args: { - CALL [45] { - function: _+_ - args: { - CALL [46] { - function: _+_ - args: { - IDENT [47] { - name: @index2 - } - IDENT [48] { - name: @index2 - } - } - } - IDENT [49] { - name: @index3 - } - } - } - IDENT [50] { - name: @index3 - } - } - } - CONSTANT [51] { value: 4 } - } - } - } -} -Test case: MULTIPLE_MACROS_COMP_V2_2 -Source: [1].exists(i, x, i > 0 && x > 0) && [1].exists(j, y, j > 0 && y > 0) && [1].exists(k, z, k > 1 && z > 0) && [2].exists(l, w, l > 1 && w > 0) -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - COMPREHENSION [3] { - iter_var: @it:0:0 - iter_var2: @it2:0:0 - iter_range: { - LIST [4] { - elements: { - CONSTANT [5] { value: 1 } - } - } - } - accu_var: @ac:0:0 - accu_init: { - CONSTANT [6] { value: false } - } - loop_condition: { - CALL [7] { - function: @not_strictly_false - args: { - CALL [8] { - function: !_ - args: { - IDENT [9] { - name: @ac:0:0 - } - } - } - } - } - } - loop_step: { - CALL [10] { - function: _||_ - args: { - IDENT [11] { - name: @ac:0:0 - } - CALL [12] { - function: _&&_ - args: { - CALL [13] { - function: _>_ - args: { - IDENT [14] { - name: @it:0:0 - } - CONSTANT [15] { value: 0 } - } - } - CALL [16] { - function: _>_ - args: { - IDENT [17] { - name: @it2:0:0 - } - CONSTANT [18] { value: 0 } - } - } - } - } - } - } - } - result: { - IDENT [19] { - name: @ac:0:0 - } - } - } - } - } - CALL [20] { - function: _&&_ - args: { - CALL [21] { - function: _&&_ - args: { - IDENT [22] { - name: @index0 - } - IDENT [23] { - name: @index0 - } - } - } - CALL [24] { - function: _&&_ - args: { - COMPREHENSION [25] { - iter_var: @it:0:0 - iter_var2: @it2:0:0 - iter_range: { - LIST [26] { - elements: { - CONSTANT [27] { value: 1 } - } - } - } - accu_var: @ac:0:0 - accu_init: { - CONSTANT [28] { value: false } - } - loop_condition: { - CALL [29] { - function: @not_strictly_false - args: { - CALL [30] { - function: !_ - args: { - IDENT [31] { - name: @ac:0:0 - } - } - } - } - } - } - loop_step: { - CALL [32] { - function: _||_ - args: { - IDENT [33] { - name: @ac:0:0 - } - CALL [34] { - function: _&&_ - args: { - CALL [35] { - function: _>_ - args: { - IDENT [36] { - name: @it:0:0 - } - CONSTANT [37] { value: 1 } - } - } - CALL [38] { - function: _>_ - args: { - IDENT [39] { - name: @it2:0:0 - } - CONSTANT [40] { value: 0 } - } - } - } - } - } - } - } - result: { - IDENT [41] { - name: @ac:0:0 - } - } - } - COMPREHENSION [42] { - iter_var: @it:0:0 - iter_var2: @it2:0:0 - iter_range: { - LIST [43] { - elements: { - CONSTANT [44] { value: 2 } - } - } - } - accu_var: @ac:0:0 - accu_init: { - CONSTANT [45] { value: false } - } - loop_condition: { - CALL [46] { - function: @not_strictly_false - args: { - CALL [47] { - function: !_ - args: { - IDENT [48] { - name: @ac:0:0 - } - } - } - } - } - } - loop_step: { - CALL [49] { - function: _||_ - args: { - IDENT [50] { - name: @ac:0:0 - } - CALL [51] { - function: _&&_ - args: { - CALL [52] { - function: _>_ - args: { - IDENT [53] { - name: @it:0:0 - } - CONSTANT [54] { value: 1 } - } - } - CALL [55] { - function: _>_ - args: { - IDENT [56] { - name: @it2:0:0 - } - CONSTANT [57] { value: 0 } - } - } - } - } - } - } - } - result: { - IDENT [58] { - name: @ac:0:0 - } - } - } - } - } - } - } - } -} -Test case: NESTED_MACROS -Source: [1,2,3].map(i, [1, 2, 3].map(i, i + 1)) == [[2, 3, 4], [2, 3, 4], [2, 3, 4]] -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - LIST [3] { - elements: { - CONSTANT [4] { value: 1 } - CONSTANT [5] { value: 2 } - CONSTANT [6] { value: 3 } - } - } - LIST [7] { - elements: { - CONSTANT [8] { value: 2 } - CONSTANT [9] { value: 3 } - CONSTANT [10] { value: 4 } - } - } - COMPREHENSION [11] { - iter_var: @it:0:0 - iter_range: { - IDENT [12] { - name: @index0 - } - } - accu_var: @ac:0:0 - accu_init: { - LIST [13] { - elements: { - } - } - } - loop_condition: { - CONSTANT [14] { value: true } - } - loop_step: { - CALL [15] { - function: _+_ - args: { - IDENT [16] { - name: @ac:0:0 - } - LIST [17] { - elements: { - CALL [18] { - function: _+_ - args: { - IDENT [19] { - name: @it:0:0 - } - CONSTANT [20] { value: 1 } - } - } - } - } - } - } - } - result: { - IDENT [21] { - name: @ac:0:0 - } - } - } - } - } - CALL [22] { - function: _==_ - args: { - COMPREHENSION [23] { - iter_var: @it:1:0 - iter_range: { - IDENT [24] { - name: @index0 - } - } - accu_var: @ac:1:0 - accu_init: { - LIST [25] { - elements: { - } - } - } - loop_condition: { - CONSTANT [26] { value: true } - } - loop_step: { - CALL [27] { - function: _+_ - args: { - IDENT [28] { - name: @ac:1:0 - } - LIST [29] { - elements: { - IDENT [30] { - name: @index2 - } - } - } - } - } - } - result: { - IDENT [31] { - name: @ac:1:0 - } - } - } - LIST [32] { - elements: { - IDENT [33] { - name: @index1 - } - IDENT [34] { - name: @index1 - } - IDENT [35] { - name: @index1 - } - } - } - } - } - } -} -Test case: NESTED_MACROS_2 -Source: [1, 2].map(y, [1, 2, 3].filter(x, x == y)) == [[1], [2]] -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - LIST [3] { - elements: { - LIST [4] { - elements: { - CONSTANT [5] { value: 1 } - } - } - LIST [6] { - elements: { - CONSTANT [7] { value: 2 } - } - } - } - } - LIST [8] { - elements: { - CONSTANT [9] { value: 1 } - CONSTANT [10] { value: 2 } - } - } - LIST [11] { - elements: { - CONSTANT [12] { value: 1 } - CONSTANT [13] { value: 2 } - CONSTANT [14] { value: 3 } - } - } - } - } - CALL [15] { - function: _==_ - args: { - COMPREHENSION [16] { - iter_var: @it:1:0 - iter_range: { - IDENT [17] { - name: @index1 - } - } - accu_var: @ac:1:0 - accu_init: { - LIST [18] { - elements: { - } - } - } - loop_condition: { - CONSTANT [19] { value: true } - } - loop_step: { - CALL [20] { - function: _+_ - args: { - IDENT [21] { - name: @ac:1:0 - } - LIST [22] { - elements: { - COMPREHENSION [23] { - iter_var: @it:0:0 - iter_range: { - IDENT [24] { - name: @index2 - } - } - accu_var: @ac:0:0 - accu_init: { - LIST [25] { - elements: { - } - } - } - loop_condition: { - CONSTANT [26] { value: true } - } - loop_step: { - CALL [27] { - function: _?_:_ - args: { - CALL [28] { - function: _==_ - args: { - IDENT [29] { - name: @it:0:0 - } - IDENT [30] { - name: @it:1:0 - } - } - } - CALL [31] { - function: _+_ - args: { - IDENT [32] { - name: @ac:0:0 - } - LIST [33] { - elements: { - IDENT [34] { - name: @it:0:0 - } - } - } - } - } - IDENT [35] { - name: @ac:0:0 - } - } - } - } - result: { - IDENT [36] { - name: @ac:0:0 - } - } - } - } - } - } - } - } - result: { - IDENT [37] { - name: @ac:1:0 - } - } - } - IDENT [38] { - name: @index0 - } - } - } - } -} -Test case: NESTED_MACROS_3 -Source: [1,2,3].map(i, i * 2) + [1,2,3].map(i, i * 2).map(i, i * 2) -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - COMPREHENSION [3] { - iter_var: @it:0:0 - iter_range: { - LIST [4] { - elements: { - CONSTANT [5] { value: 1 } - CONSTANT [6] { value: 2 } - CONSTANT [7] { value: 3 } - } - } - } - accu_var: @ac:0:0 - accu_init: { - LIST [8] { - elements: { - } - } - } - loop_condition: { - CONSTANT [9] { value: true } - } - loop_step: { - CALL [10] { - function: _+_ - args: { - IDENT [11] { - name: @ac:0:0 - } - LIST [12] { - elements: { - CALL [13] { - function: _*_ - args: { - IDENT [14] { - name: @it:0:0 - } - CONSTANT [15] { value: 2 } - } - } - } - } - } - } - } - result: { - IDENT [16] { - name: @ac:0:0 - } - } - } - } - } - CALL [17] { - function: _+_ - args: { - IDENT [18] { - name: @index0 - } - COMPREHENSION [19] { - iter_var: @it:1:0 - iter_range: { - IDENT [20] { - name: @index0 - } - } - accu_var: @ac:1:0 - accu_init: { - LIST [21] { - elements: { - } - } - } - loop_condition: { - CONSTANT [22] { value: true } - } - loop_step: { - CALL [23] { - function: _+_ - args: { - IDENT [24] { - name: @ac:1:0 - } - LIST [25] { - elements: { - CALL [26] { - function: _*_ - args: { - IDENT [27] { - name: @it:1:0 - } - CONSTANT [28] { value: 2 } - } - } - } - } - } - } - } - result: { - IDENT [29] { - name: @ac:1:0 - } - } - } - } - } - } -} -Test case: NESTED_MACROS_COMP_V2_1 -Source: [1,2,3].transformList(i, v, [1, 2, 3].transformList(i, v, i + v + 1)) == [[2, 4, 6], [2, 4, 6], [2, 4, 6]] -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - LIST [3] { - elements: { - CONSTANT [4] { value: 1 } - CONSTANT [5] { value: 2 } - CONSTANT [6] { value: 3 } - } - } - LIST [7] { - elements: { - CONSTANT [8] { value: 2 } - CONSTANT [9] { value: 4 } - CONSTANT [10] { value: 6 } - } - } - COMPREHENSION [11] { - iter_var: @it:0:0 - iter_var2: @it2:0:0 - iter_range: { - IDENT [12] { - name: @index0 - } - } - accu_var: @ac:0:0 - accu_init: { - LIST [13] { - elements: { - } - } - } - loop_condition: { - CONSTANT [14] { value: true } - } - loop_step: { - CALL [15] { - function: _+_ - args: { - IDENT [16] { - name: @ac:0:0 - } - LIST [17] { - elements: { - CALL [18] { - function: _+_ - args: { - CALL [19] { - function: _+_ - args: { - IDENT [20] { - name: @it:0:0 - } - IDENT [21] { - name: @it2:0:0 - } - } - } - CONSTANT [22] { value: 1 } - } - } - } - } - } - } - } - result: { - IDENT [23] { - name: @ac:0:0 - } - } - } - } - } - CALL [24] { - function: _==_ - args: { - COMPREHENSION [25] { - iter_var: @it:1:0 - iter_var2: @it2:1:0 - iter_range: { - IDENT [26] { - name: @index0 - } - } - accu_var: @ac:1:0 - accu_init: { - LIST [27] { - elements: { - } - } - } - loop_condition: { - CONSTANT [28] { value: true } - } - loop_step: { - CALL [29] { - function: _+_ - args: { - IDENT [30] { - name: @ac:1:0 - } - LIST [31] { - elements: { - IDENT [32] { - name: @index2 - } - } - } - } - } - } - result: { - IDENT [33] { - name: @ac:1:0 - } - } - } - LIST [34] { - elements: { - IDENT [35] { - name: @index1 - } - IDENT [36] { - name: @index1 - } - IDENT [37] { - name: @index1 - } - } - } - } - } - } -} -Test case: NESTED_MACROS_COMP_V2_2 -Source: [1, 2].transformList(i, y, [1, 2, 3].filter(x, x == y && i < y)) == [[1], [2]] -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - LIST [3] { - elements: { - LIST [4] { - elements: { - CONSTANT [5] { value: 1 } - } - } - LIST [6] { - elements: { - CONSTANT [7] { value: 2 } - } - } - } - } - LIST [8] { - elements: { - CONSTANT [9] { value: 1 } - CONSTANT [10] { value: 2 } - } - } - LIST [11] { - elements: { - CONSTANT [12] { value: 1 } - CONSTANT [13] { value: 2 } - CONSTANT [14] { value: 3 } - } - } - } - } - CALL [15] { - function: _==_ - args: { - COMPREHENSION [16] { - iter_var: @it:1:0 - iter_var2: @it2:1:0 - iter_range: { - IDENT [17] { - name: @index1 - } - } - accu_var: @ac:1:0 - accu_init: { - LIST [18] { - elements: { - } - } - } - loop_condition: { - CONSTANT [19] { value: true } - } - loop_step: { - CALL [20] { - function: _+_ - args: { - IDENT [21] { - name: @ac:1:0 - } - LIST [22] { - elements: { - COMPREHENSION [23] { - iter_var: @it:0:0 - iter_range: { - IDENT [24] { - name: @index2 - } - } - accu_var: @ac:0:0 - accu_init: { - LIST [25] { - elements: { - } - } - } - loop_condition: { - CONSTANT [26] { value: true } - } - loop_step: { - CALL [27] { - function: _?_:_ - args: { - CALL [28] { - function: _&&_ - args: { - CALL [29] { - function: _==_ - args: { - IDENT [30] { - name: @it:0:0 - } - IDENT [31] { - name: @it2:1:0 - } - } - } - CALL [32] { - function: _<_ - args: { - IDENT [33] { - name: @it:1:0 - } - IDENT [34] { - name: @it2:1:0 - } - } - } - } - } - CALL [35] { - function: _+_ - args: { - IDENT [36] { - name: @ac:0:0 - } - LIST [37] { - elements: { - IDENT [38] { - name: @it:0:0 - } - } - } - } - } - IDENT [39] { - name: @ac:0:0 - } - } - } - } - result: { - IDENT [40] { - name: @ac:0:0 - } - } - } - } - } - } - } - } - result: { - IDENT [41] { - name: @ac:1:0 - } - } - } - IDENT [42] { - name: @index0 - } - } - } - } -} -Test case: ADJACENT_NESTED_MACROS -Source: [1,2,3].map(i, [1, 2, 3].map(i, i + 1)) == [1,2,3].map(j, [1, 2, 3].map(j, j + 1)) -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - COMPREHENSION [3] { - iter_var: @it:0:0 - iter_range: { - LIST [4] { - elements: { - CONSTANT [5] { value: 1 } - CONSTANT [6] { value: 2 } - CONSTANT [7] { value: 3 } - } - } - } - accu_var: @ac:0:0 - accu_init: { - LIST [8] { - elements: { - } - } - } - loop_condition: { - CONSTANT [9] { value: true } - } - loop_step: { - CALL [10] { - function: _+_ - args: { - IDENT [11] { - name: @ac:0:0 - } - LIST [12] { - elements: { - CALL [13] { - function: _+_ - args: { - IDENT [14] { - name: @it:0:0 - } - CONSTANT [15] { value: 1 } - } - } - } - } - } - } - } - result: { - IDENT [16] { - name: @ac:0:0 - } - } - } - COMPREHENSION [17] { - iter_var: @it:1:0 - iter_range: { - LIST [18] { - elements: { - CONSTANT [19] { value: 1 } - CONSTANT [20] { value: 2 } - CONSTANT [21] { value: 3 } - } - } - } - accu_var: @ac:1:0 - accu_init: { - LIST [22] { - elements: { - } - } - } - loop_condition: { - CONSTANT [23] { value: true } - } - loop_step: { - CALL [24] { - function: _+_ - args: { - IDENT [25] { - name: @ac:1:0 - } - LIST [26] { - elements: { - IDENT [27] { - name: @index0 - } - } - } - } - } - } - result: { - IDENT [28] { - name: @ac:1:0 - } - } - } - } - } - CALL [29] { - function: _==_ - args: { - IDENT [30] { - name: @index1 - } - IDENT [31] { - name: @index1 - } - } - } - } -} -Test case: ADJACENT_NESTED_MACROS_COMP_V2 -Source: [1,2,3].transformMap(i, x, [1, 2, 3].transformMap(i, x, i + x + 1)) == [1,2,3].transformMap(j, y, [1, 2, 3].transformMap(j, y, j + y + 1)) -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - COMPREHENSION [3] { - iter_var: @it:1:0 - iter_var2: @it2:1:0 - iter_range: { - LIST [4] { - elements: { - CONSTANT [5] { value: 1 } - CONSTANT [6] { value: 2 } - CONSTANT [7] { value: 3 } - } - } - } - accu_var: @ac:1:0 - accu_init: { - MAP [8] { - - } - } - loop_condition: { - CONSTANT [9] { value: true } - } - loop_step: { - CALL [10] { - function: cel.@mapInsert - args: { - IDENT [11] { - name: @ac:1:0 - } - IDENT [12] { - name: @it:1:0 - } - COMPREHENSION [13] { - iter_var: @it:0:0 - iter_var2: @it2:0:0 - iter_range: { - LIST [14] { - elements: { - CONSTANT [15] { value: 1 } - CONSTANT [16] { value: 2 } - CONSTANT [17] { value: 3 } - } - } - } - accu_var: @ac:0:0 - accu_init: { - MAP [18] { - - } - } - loop_condition: { - CONSTANT [19] { value: true } - } - loop_step: { - CALL [20] { - function: cel.@mapInsert - args: { - IDENT [21] { - name: @ac:0:0 - } - IDENT [22] { - name: @it:0:0 - } - CALL [23] { - function: _+_ - args: { - CALL [24] { - function: _+_ - args: { - IDENT [25] { - name: @it:0:0 - } - IDENT [26] { - name: @it2:0:0 - } - } - } - CONSTANT [27] { value: 1 } - } - } - } - } - } - result: { - IDENT [28] { - name: @ac:0:0 - } - } - } - } - } - } - result: { - IDENT [29] { - name: @ac:1:0 - } - } - } - } - } - CALL [30] { - function: _==_ - args: { - IDENT [31] { - name: @index0 - } - IDENT [32] { - name: @index0 - } - } - } - } -} -Test case: INCLUSION_LIST -Source: 1 in [1,2,3] && 2 in [1,2,3] && 3 in [3, [1,2,3]] && 1 in [1,2,3] -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - CALL [3] { - function: @in - args: { - CONSTANT [4] { value: 1 } - LIST [5] { - elements: { - CONSTANT [6] { value: 1 } - CONSTANT [7] { value: 2 } - CONSTANT [8] { value: 3 } - } - } - } - } - LIST [9] { - elements: { - CONSTANT [10] { value: 1 } - CONSTANT [11] { value: 2 } - CONSTANT [12] { value: 3 } - } - } - } - } - CALL [13] { - function: _&&_ - args: { - CALL [14] { - function: _&&_ - args: { - IDENT [15] { - name: @index0 - } - CALL [16] { - function: @in - args: { - CONSTANT [17] { value: 2 } - IDENT [18] { - name: @index1 - } - } - } - } - } - CALL [19] { - function: _&&_ - args: { - CALL [20] { - function: @in - args: { - CONSTANT [21] { value: 3 } - LIST [22] { - elements: { - CONSTANT [23] { value: 3 } - IDENT [24] { - name: @index1 - } - } - } - } - } - IDENT [25] { - name: @index0 - } - } - } - } - } - } -} -Test case: INCLUSION_MAP -Source: 2 in {'a': 1, 2: {true: false}, 3: {true: false}} -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - MAP [3] { - MAP_ENTRY [4] { - key: { - CONSTANT [5] { value: true } - } - value: { - CONSTANT [6] { value: false } - } - } - } - } - } - CALL [7] { - function: @in - args: { - CONSTANT [8] { value: 2 } - MAP [9] { - MAP_ENTRY [10] { - key: { - CONSTANT [11] { value: "a" } - } - value: { - CONSTANT [12] { value: 1 } - } - } - MAP_ENTRY [13] { - key: { - CONSTANT [14] { value: 2 } - } - value: { - IDENT [15] { - name: @index0 - } - } - } - MAP_ENTRY [16] { - key: { - CONSTANT [17] { value: 3 } - } - value: { - IDENT [18] { - name: @index0 - } - } - } - } - } - } - } -} -Test case: MACRO_ITER_VAR_NOT_REFERENCED -Source: [1,2].map(i, [1, 2].map(i, [3,4])) == [[[3, 4], [3, 4]], [[3, 4], [3, 4]]] -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - LIST [3] { - elements: { - LIST [4] { - elements: { - CONSTANT [5] { value: 3 } - CONSTANT [6] { value: 4 } - } - } - LIST [7] { - elements: { - CONSTANT [8] { value: 3 } - CONSTANT [9] { value: 4 } - } - } - } - } - LIST [10] { - elements: { - CONSTANT [11] { value: 1 } - CONSTANT [12] { value: 2 } - } - } - COMPREHENSION [13] { - iter_var: @it:0:0 - iter_range: { - IDENT [14] { - name: @index1 - } - } - accu_var: @ac:0:0 - accu_init: { - LIST [15] { - elements: { - } - } - } - loop_condition: { - CONSTANT [16] { value: true } - } - loop_step: { - CALL [17] { - function: _+_ - args: { - IDENT [18] { - name: @ac:0:0 - } - LIST [19] { - elements: { - LIST [20] { - elements: { - CONSTANT [21] { value: 3 } - CONSTANT [22] { value: 4 } - } - } - } - } - } - } - } - result: { - IDENT [23] { - name: @ac:0:0 - } - } - } - } - } - CALL [24] { - function: _==_ - args: { - COMPREHENSION [25] { - iter_var: @it:1:0 - iter_range: { - IDENT [26] { - name: @index1 - } - } - accu_var: @ac:1:0 - accu_init: { - LIST [27] { - elements: { - } - } - } - loop_condition: { - CONSTANT [28] { value: true } - } - loop_step: { - CALL [29] { - function: _+_ - args: { - IDENT [30] { - name: @ac:1:0 - } - LIST [31] { - elements: { - IDENT [32] { - name: @index2 - } - } - } - } - } - } - result: { - IDENT [33] { - name: @ac:1:0 - } - } - } - LIST [34] { - elements: { - IDENT [35] { - name: @index0 - } - IDENT [36] { - name: @index0 - } - } - } - } - } - } -} -Test case: MACRO_ITER_VAR2_NOT_REFERENCED -Source: [1,2].transformList(i, v, [1, 2].transformList(i, v, [3,4])) == [[[3, 4], [3, 4]], [[3, 4], [3, 4]]] -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - LIST [3] { - elements: { - LIST [4] { - elements: { - CONSTANT [5] { value: 3 } - CONSTANT [6] { value: 4 } - } - } - LIST [7] { - elements: { - CONSTANT [8] { value: 3 } - CONSTANT [9] { value: 4 } - } - } - } - } - LIST [10] { - elements: { - CONSTANT [11] { value: 1 } - CONSTANT [12] { value: 2 } - } - } - COMPREHENSION [13] { - iter_var: @it:0:0 - iter_var2: @it2:0:0 - iter_range: { - IDENT [14] { - name: @index1 - } - } - accu_var: @ac:0:0 - accu_init: { - LIST [15] { - elements: { - } - } - } - loop_condition: { - CONSTANT [16] { value: true } - } - loop_step: { - CALL [17] { - function: _+_ - args: { - IDENT [18] { - name: @ac:0:0 - } - LIST [19] { - elements: { - LIST [20] { - elements: { - CONSTANT [21] { value: 3 } - CONSTANT [22] { value: 4 } - } - } - } - } - } - } - } - result: { - IDENT [23] { - name: @ac:0:0 - } - } - } - } - } - CALL [24] { - function: _==_ - args: { - COMPREHENSION [25] { - iter_var: @it:1:0 - iter_var2: @it2:1:0 - iter_range: { - IDENT [26] { - name: @index1 - } - } - accu_var: @ac:1:0 - accu_init: { - LIST [27] { - elements: { - } - } - } - loop_condition: { - CONSTANT [28] { value: true } - } - loop_step: { - CALL [29] { - function: _+_ - args: { - IDENT [30] { - name: @ac:1:0 - } - LIST [31] { - elements: { - IDENT [32] { - name: @index2 - } - } - } - } - } - } - result: { - IDENT [33] { - name: @ac:1:0 - } - } - } - LIST [34] { - elements: { - IDENT [35] { - name: @index0 - } - IDENT [36] { - name: @index0 - } - } - } - } - } - } -} -Test case: MACRO_SHADOWED_VARIABLE -Source: [x - 1 > 3 ? x - 1 : 5].exists(x, x - 1 > 3) || x - 1 > 3 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - CALL [3] { - function: _>_ - args: { - CALL [4] { - function: _-_ - args: { - IDENT [5] { - name: x - } - CONSTANT [6] { value: 1 } - } - } - CONSTANT [7] { value: 3 } - } - } - } - } - CALL [8] { - function: _||_ - args: { - COMPREHENSION [9] { - iter_var: @it:0:0 - iter_range: { - LIST [10] { - elements: { - CALL [11] { - function: _?_:_ - args: { - IDENT [12] { - name: @index0 - } - CALL [13] { - function: _-_ - args: { - IDENT [14] { - name: x - } - CONSTANT [15] { value: 1 } - } - } - CONSTANT [16] { value: 5 } - } - } - } - } - } - accu_var: @ac:0:0 - accu_init: { - CONSTANT [17] { value: false } - } - loop_condition: { - CALL [18] { - function: @not_strictly_false - args: { - CALL [19] { - function: !_ - args: { - IDENT [20] { - name: @ac:0:0 - } - } - } - } - } - } - loop_step: { - CALL [21] { - function: _||_ - args: { - IDENT [22] { - name: @ac:0:0 - } - CALL [23] { - function: _>_ - args: { - CALL [24] { - function: _-_ - args: { - IDENT [25] { - name: @it:0:0 - } - CONSTANT [26] { value: 1 } - } - } - CONSTANT [27] { value: 3 } - } - } - } - } - } - result: { - IDENT [28] { - name: @ac:0:0 - } - } - } - IDENT [29] { - name: @index0 - } - } - } - } -} -Test case: MACRO_SHADOWED_VARIABLE_2 -Source: ["foo", "bar"].map(x, [x + x, x + x]).map(x, [x + x, x + x]) -=====> -COMPREHENSION [35] { - iter_var: x - iter_range: { - COMPREHENSION [19] { - iter_var: x - iter_range: { - LIST [1] { - elements: { - CONSTANT [2] { value: "foo" } - CONSTANT [3] { value: "bar" } - } - } - } - accu_var: @result - accu_init: { - LIST [13] { - elements: { - } - } - } - loop_condition: { - CONSTANT [14] { value: true } - } - loop_step: { - CALL [17] { - function: _+_ - args: { - IDENT [15] { - name: @result - } - LIST [16] { - elements: { - LIST [6] { - elements: { - CALL [8] { - function: _+_ - args: { - IDENT [7] { - name: x - } - IDENT [9] { - name: x - } - } - } - CALL [11] { - function: _+_ - args: { - IDENT [10] { - name: x - } - IDENT [12] { - name: x - } - } - } - } - } - } - } - } - } - } - result: { - IDENT [18] { - name: @result - } - } - } - } - accu_var: @result - accu_init: { - LIST [29] { - elements: { - } - } - } - loop_condition: { - CONSTANT [30] { value: true } - } - loop_step: { - CALL [33] { - function: _+_ - args: { - IDENT [31] { - name: @result - } - LIST [32] { - elements: { - LIST [22] { - elements: { - CALL [24] { - function: _+_ - args: { - IDENT [23] { - name: x - } - IDENT [25] { - name: x - } - } - } - CALL [27] { - function: _+_ - args: { - IDENT [26] { - name: x - } - IDENT [28] { - name: x - } - } - } - } - } - } - } - } - } - } - result: { - IDENT [34] { - name: @result - } - } -} -Test case: MACRO_SHADOWED_VARIABLE_COMP_V2_1 -Source: [x - y - 1 > 3 ? x - y - 1 : 5].exists(x, y, x - y - 1 > 3) || x - y - 1 > 3 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - CALL [3] { - function: _>_ - args: { - CALL [4] { - function: _-_ - args: { - CALL [5] { - function: _-_ - args: { - IDENT [6] { - name: x - } - IDENT [7] { - name: y - } - } - } - CONSTANT [8] { value: 1 } - } - } - CONSTANT [9] { value: 3 } - } - } - } - } - CALL [10] { - function: _||_ - args: { - COMPREHENSION [11] { - iter_var: @it:0:0 - iter_var2: @it2:0:0 - iter_range: { - LIST [12] { - elements: { - CALL [13] { - function: _?_:_ - args: { - IDENT [14] { - name: @index0 - } - CALL [15] { - function: _-_ - args: { - CALL [16] { - function: _-_ - args: { - IDENT [17] { - name: x - } - IDENT [18] { - name: y - } - } - } - CONSTANT [19] { value: 1 } - } - } - CONSTANT [20] { value: 5 } - } - } - } - } - } - accu_var: @ac:0:0 - accu_init: { - CONSTANT [21] { value: false } - } - loop_condition: { - CALL [22] { - function: @not_strictly_false - args: { - CALL [23] { - function: !_ - args: { - IDENT [24] { - name: @ac:0:0 - } - } - } - } - } - } - loop_step: { - CALL [25] { - function: _||_ - args: { - IDENT [26] { - name: @ac:0:0 - } - CALL [27] { - function: _>_ - args: { - CALL [28] { - function: _-_ - args: { - CALL [29] { - function: _-_ - args: { - IDENT [30] { - name: @it:0:0 - } - IDENT [31] { - name: @it2:0:0 - } - } - } - CONSTANT [32] { value: 1 } - } - } - CONSTANT [33] { value: 3 } - } - } - } - } - } - result: { - IDENT [34] { - name: @ac:0:0 - } - } - } - IDENT [35] { - name: @index0 - } - } - } - } -} -Test case: MACRO_SHADOWED_VARIABLE_COMP_V2_2 -Source: ["foo", "bar"].transformMap(x, y, [x + x, y + y]).transformMap(x, y, [x + x, y + y]) -=====> -COMPREHENSION [35] { - iter_var: x - iter_var2: y - iter_range: { - COMPREHENSION [19] { - iter_var: x - iter_var2: y - iter_range: { - LIST [1] { - elements: { - CONSTANT [2] { value: "foo" } - CONSTANT [3] { value: "bar" } - } - } - } - accu_var: @result - accu_init: { - MAP [14] { - - } - } - loop_condition: { - CONSTANT [15] { value: true } - } - loop_step: { - CALL [17] { - function: cel.@mapInsert - args: { - IDENT [16] { - name: @result - } - IDENT [5] { - name: x - } - LIST [7] { - elements: { - CALL [9] { - function: _+_ - args: { - IDENT [8] { - name: x - } - IDENT [10] { - name: x - } - } - } - CALL [12] { - function: _+_ - args: { - IDENT [11] { - name: y - } - IDENT [13] { - name: y - } - } - } - } - } - } - } - } - result: { - IDENT [18] { - name: @result - } - } - } - } - accu_var: @result - accu_init: { - MAP [30] { - - } - } - loop_condition: { - CONSTANT [31] { value: true } - } - loop_step: { - CALL [33] { - function: cel.@mapInsert - args: { - IDENT [32] { - name: @result - } - IDENT [21] { - name: x - } - LIST [23] { - elements: { - CALL [25] { - function: _+_ - args: { - IDENT [24] { - name: x - } - IDENT [26] { - name: x - } - } - } - CALL [28] { - function: _+_ - args: { - IDENT [27] { - name: y - } - IDENT [29] { - name: y - } - } - } - } - } - } - } - } - result: { - IDENT [34] { - name: @result - } - } -} -Test case: PRESENCE_TEST -Source: has({'a': true}.a) && {'a':true}['a'] -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - MAP [3] { - MAP_ENTRY [4] { - key: { - CONSTANT [5] { value: "a" } - } - value: { - CONSTANT [6] { value: true } - } - } - } - } - } - CALL [7] { - function: _&&_ - args: { - SELECT [8] { - IDENT [9] { - name: @index0 - }.a~presence_test - } - CALL [10] { - function: _[_] - args: { - IDENT [11] { - name: @index0 - } - CONSTANT [12] { value: "a" } - } - } - } - } - } -} -Test case: PRESENCE_TEST_2 -Source: has({'a': true}.a) && has({'a': true}.a) -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - SELECT [3] { - MAP [4] { - MAP_ENTRY [5] { - key: { - CONSTANT [6] { value: "a" } - } - value: { - CONSTANT [7] { value: true } - } - } - }.a~presence_test - } - } - } - CALL [8] { - function: _&&_ - args: { - IDENT [9] { - name: @index0 - } - IDENT [10] { - name: @index0 - } - } - } - } -} -Test case: PRESENCE_TEST_WITH_TERNARY -Source: (has(msg.oneof_type.payload) ? msg.oneof_type.payload.single_int64 : 0) == 10 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - SELECT [3] { - IDENT [4] { - name: msg - }.oneof_type - } - } - } - CALL [5] { - function: _==_ - args: { - CALL [6] { - function: _?_:_ - args: { - SELECT [7] { - IDENT [8] { - name: @index0 - }.payload~presence_test - } - SELECT [9] { - SELECT [10] { - IDENT [11] { - name: @index0 - }.payload - }.single_int64 - } - CONSTANT [12] { value: 0 } - } - } - CONSTANT [13] { value: 10 } - } - } - } -} -Test case: PRESENCE_TEST_WITH_TERNARY_2 -Source: (has(msg.oneof_type.payload) ? msg.oneof_type.payload.single_int64 : msg.oneof_type.payload.single_int64 * 0) == 10 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - SELECT [3] { - SELECT [4] { - SELECT [5] { - IDENT [6] { - name: msg - }.oneof_type - }.payload - }.single_int64 - } - } - } - CALL [7] { - function: _==_ - args: { - CALL [8] { - function: _?_:_ - args: { - SELECT [9] { - SELECT [10] { - IDENT [11] { - name: msg - }.oneof_type - }.payload~presence_test - } - IDENT [12] { - name: @index0 - } - CALL [13] { - function: _*_ - args: { - IDENT [14] { - name: @index0 - } - CONSTANT [15] { value: 0 } - } - } - } - } - CONSTANT [16] { value: 10 } - } - } - } -} -Test case: PRESENCE_TEST_WITH_TERNARY_3 -Source: (has(msg.oneof_type.payload.single_int64) ? msg.oneof_type.payload.single_int64 : msg.oneof_type.payload.single_int64 * 0) == 10 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - SELECT [3] { - SELECT [4] { - SELECT [5] { - IDENT [6] { - name: msg - }.oneof_type - }.payload - }.single_int64 - } - } - } - CALL [7] { - function: _==_ - args: { - CALL [8] { - function: _?_:_ - args: { - SELECT [9] { - SELECT [10] { - SELECT [11] { - IDENT [12] { - name: msg - }.oneof_type - }.payload - }.single_int64~presence_test - } - IDENT [13] { - name: @index0 - } - CALL [14] { - function: _*_ - args: { - IDENT [15] { - name: @index0 - } - CONSTANT [16] { value: 0 } - } - } - } - } - CONSTANT [17] { value: 10 } - } - } - } -} -Test case: PRESENCE_TEST_WITH_TERNARY_NESTED -Source: (has(msg.oneof_type) && has(msg.oneof_type.payload) && has(msg.oneof_type.payload.single_int64)) ? ((has(msg.oneof_type.payload.map_string_string) && has(msg.oneof_type.payload.map_string_string.key)) ? msg.oneof_type.payload.map_string_string.key == 'A' : false) : false -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - SELECT [3] { - SELECT [4] { - SELECT [5] { - IDENT [6] { - name: msg - }.oneof_type - }.payload - }.map_string_string - } - SELECT [7] { - SELECT [8] { - IDENT [9] { - name: msg - }.oneof_type - }.payload - } - } - } - CALL [10] { - function: _?_:_ - args: { - CALL [11] { - function: _&&_ - args: { - CALL [12] { - function: _&&_ - args: { - SELECT [13] { - IDENT [14] { - name: msg - }.oneof_type~presence_test - } - SELECT [15] { - SELECT [16] { - IDENT [17] { - name: msg - }.oneof_type - }.payload~presence_test - } - } - } - SELECT [18] { - IDENT [19] { - name: @index1 - }.single_int64~presence_test - } - } - } - CALL [20] { - function: _?_:_ - args: { - CALL [21] { - function: _&&_ - args: { - SELECT [22] { - IDENT [23] { - name: @index1 - }.map_string_string~presence_test - } - SELECT [24] { - IDENT [25] { - name: @index0 - }.key~presence_test - } - } - } - CALL [26] { - function: _==_ - args: { - SELECT [27] { - IDENT [28] { - name: @index0 - }.key - } - CONSTANT [29] { value: "A" } - } - } - CONSTANT [30] { value: false } - } - } - CONSTANT [31] { value: false } - } - } - } -} -Test case: OPTIONAL_LIST -Source: [10, ?optional.none(), [?optional.none(), ?opt_x], [?optional.none(), ?opt_x]] == [10, [5], [5]] -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - LIST [3] { - elements: { - CALL [4] { - function: optional.none - args: { - } - } - IDENT [5] { - name: opt_x - } - } - optional_indices: [0, 1] - } - LIST [6] { - elements: { - CONSTANT [7] { value: 5 } - } - } - } - } - CALL [8] { - function: _==_ - args: { - LIST [9] { - elements: { - CONSTANT [10] { value: 10 } - CALL [11] { - function: optional.none - args: { - } - } - IDENT [12] { - name: @index0 - } - IDENT [13] { - name: @index0 - } - } - optional_indices: [0] - } - LIST [14] { - elements: { - CONSTANT [15] { value: 10 } - IDENT [16] { - name: @index1 - } - IDENT [17] { - name: @index1 - } - } - } - } - } - } -} -Test case: OPTIONAL_MAP -Source: {?'hello': optional.of('hello')}['hello'] + {?'hello': optional.of('hello')}['hello'] == 'hellohello' -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - CALL [3] { - function: _[_] - args: { - MAP [4] { - MAP_ENTRY [5] { - key: { - CONSTANT [6] { value: "hello" } - } - optional_entry: true - value: { - CALL [7] { - function: optional.of - args: { - CONSTANT [8] { value: "hello" } - } - } - } - } - } - CONSTANT [9] { value: "hello" } - } - } - } - } - CALL [10] { - function: _==_ - args: { - CALL [11] { - function: _+_ - args: { - IDENT [12] { - name: @index0 - } - IDENT [13] { - name: @index0 - } - } - } - CONSTANT [14] { value: "hellohello" } - } - } - } -} -Test case: OPTIONAL_MAP_CHAINED -Source: {?'key': optional.of('test')}[?'bogus'].or({'key': 'test'}[?'bogus']).orValue({'key': 'test'}['key']) == 'test' -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - MAP [3] { - MAP_ENTRY [4] { - key: { - CONSTANT [5] { value: "key" } - } - value: { - CONSTANT [6] { value: "test" } - } - } - } - } - } - CALL [7] { - function: _==_ - args: { - CALL [8] { - function: orValue - target: { - CALL [9] { - function: or - target: { - CALL [10] { - function: _[?_] - args: { - MAP [11] { - MAP_ENTRY [12] { - key: { - CONSTANT [13] { value: "key" } - } - optional_entry: true - value: { - CALL [14] { - function: optional.of - args: { - CONSTANT [15] { value: "test" } - } - } - } - } - } - CONSTANT [16] { value: "bogus" } - } - } - } - args: { - CALL [17] { - function: _[?_] - args: { - IDENT [18] { - name: @index0 - } - CONSTANT [19] { value: "bogus" } - } - } - } - } - } - args: { - CALL [20] { - function: _[_] - args: { - IDENT [21] { - name: @index0 - } - CONSTANT [22] { value: "key" } - } - } - } - } - CONSTANT [23] { value: "test" } - } - } - } -} -Test case: OPTIONAL_MESSAGE -Source: TestAllTypes{?single_int64: optional.ofNonZeroValue(1), ?single_int32: optional.of(4)}.single_int32 + TestAllTypes{?single_int64: optional.ofNonZeroValue(1), ?single_int32: optional.of(4)}.single_int64 == 5 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - STRUCT [3] { - name: cel.expr.conformance.proto3.TestAllTypes - entries: { - ENTRY [4] { - field_key: single_int64 - optional_entry: true - value: { - CALL [5] { - function: optional.ofNonZeroValue - args: { - CONSTANT [6] { value: 1 } - } - } - } - } - ENTRY [7] { - field_key: single_int32 - optional_entry: true - value: { - CALL [8] { - function: optional.of - args: { - CONSTANT [9] { value: 4 } - } - } - } - } - } - } - } - } - CALL [10] { - function: _==_ - args: { - CALL [11] { - function: _+_ - args: { - SELECT [12] { - IDENT [13] { - name: @index0 - }.single_int32 - } - SELECT [14] { - IDENT [15] { - name: @index0 - }.single_int64 - } - } - } - CONSTANT [16] { value: 5 } - } - } - } -} -Test case: CALL -Source: ('h' + 'e' + 'l' + 'l' + 'o' + ' world').matches('h' + 'e' + 'l' + 'l' + 'o') -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - CALL [3] { - function: _+_ - args: { - CALL [4] { - function: _+_ - args: { - CALL [5] { - function: _+_ - args: { - CALL [6] { - function: _+_ - args: { - CONSTANT [7] { value: "h" } - CONSTANT [8] { value: "e" } - } - } - CONSTANT [9] { value: "l" } - } - } - CONSTANT [10] { value: "l" } - } - } - CONSTANT [11] { value: "o" } - } - } - } - } - CALL [12] { - function: matches - target: { - CALL [13] { - function: _+_ - args: { - IDENT [14] { - name: @index0 - } - CONSTANT [15] { value: " world" } - } - } - } - args: { - IDENT [16] { - name: @index0 - } - } - } - } -} -Test case: CALL_ARGUMENT_NESTED_NO_COMMON_SUBEXPR -Source: 'hello world'.matches('h' + 'e' + 'l' + 'l' + 'o') -=====> -CALL [2] { - function: matches - target: { - CONSTANT [1] { value: "hello world" } - } - args: { - CALL [10] { - function: _+_ - args: { - CALL [8] { - function: _+_ - args: { - CALL [6] { - function: _+_ - args: { - CALL [4] { - function: _+_ - args: { - CONSTANT [3] { value: "h" } - CONSTANT [5] { value: "e" } - } - } - CONSTANT [7] { value: "l" } - } - } - CONSTANT [9] { value: "l" } - } - } - CONSTANT [11] { value: "o" } - } - } - } -} -Test case: CALL_TARGET_NESTED_NO_COMMON_SUBEXPR -Source: ('h' + 'e' + 'l' + 'l' + 'o' + ' world').matches('hello') -=====> -CALL [12] { - function: matches - target: { - CALL [10] { - function: _+_ - args: { - CALL [8] { - function: _+_ - args: { - CALL [6] { - function: _+_ - args: { - CALL [4] { - function: _+_ - args: { - CALL [2] { - function: _+_ - args: { - CONSTANT [1] { value: "h" } - CONSTANT [3] { value: "e" } - } - } - CONSTANT [5] { value: "l" } - } - } - CONSTANT [7] { value: "l" } - } - } - CONSTANT [9] { value: "o" } - } - } - CONSTANT [11] { value: " world" } - } - } - } - args: { - CONSTANT [13] { value: "hello" } - } -} -Test case: CALL_BOTH_ARGUMENT_TARGET_NESTED_NO_COMMON_SUBEXPR -Source: ('h' + 'e' + 'l' + 'l' + 'o' + ' world').matches('w' + 'o' + 'r' + 'l' + 'd') -=====> -CALL [12] { - function: matches - target: { - CALL [10] { - function: _+_ - args: { - CALL [8] { - function: _+_ - args: { - CALL [6] { - function: _+_ - args: { - CALL [4] { - function: _+_ - args: { - CALL [2] { - function: _+_ - args: { - CONSTANT [1] { value: "h" } - CONSTANT [3] { value: "e" } - } - } - CONSTANT [5] { value: "l" } - } - } - CONSTANT [7] { value: "l" } - } - } - CONSTANT [9] { value: "o" } - } - } - CONSTANT [11] { value: " world" } - } - } - } - args: { - CALL [20] { - function: _+_ - args: { - CALL [18] { - function: _+_ - args: { - CALL [16] { - function: _+_ - args: { - CALL [14] { - function: _+_ - args: { - CONSTANT [13] { value: "w" } - CONSTANT [15] { value: "o" } - } - } - CONSTANT [17] { value: "r" } - } - } - CONSTANT [19] { value: "l" } - } - } - CONSTANT [21] { value: "d" } - } - } - } -} -Test case: CUSTOM_FUNCTION_INELIMINABLE -Source: non_pure_custom_func(msg.oneof_type.payload.single_int64) + non_pure_custom_func(msg.oneof_type.payload.single_int32) + non_pure_custom_func(msg.oneof_type.payload.single_int64) + non_pure_custom_func(msg.single_int64) -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - SELECT [3] { - SELECT [4] { - SELECT [5] { - IDENT [6] { - name: msg - }.oneof_type - }.payload - }.single_int64 - } - } - } - CALL [7] { - function: _+_ - args: { - CALL [8] { - function: _+_ - args: { - CALL [9] { - function: _+_ - args: { - CALL [10] { - function: non_pure_custom_func - args: { - IDENT [11] { - name: @index0 - } - } - } - CALL [12] { - function: non_pure_custom_func - args: { - SELECT [13] { - SELECT [14] { - SELECT [15] { - IDENT [16] { - name: msg - }.oneof_type - }.payload - }.single_int32 - } - } - } - } - } - CALL [17] { - function: non_pure_custom_func - args: { - IDENT [18] { - name: @index0 - } - } - } - } - } - CALL [19] { - function: non_pure_custom_func - args: { - SELECT [20] { - IDENT [21] { - name: msg - }.single_int64 - } - } - } - } - } - } -} -Test case: CUSTOM_FUNCTION_ELIMINABLE -Source: pure_custom_func(msg.oneof_type.payload.single_int64) + pure_custom_func(msg.oneof_type.payload.single_int32) + pure_custom_func(msg.oneof_type.payload.single_int64) + pure_custom_func(msg.single_int64) -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - CALL [3] { - function: pure_custom_func - args: { - SELECT [4] { - SELECT [5] { - SELECT [6] { - IDENT [7] { - name: msg - }.oneof_type - }.payload - }.single_int64 - } - } - } - CALL [8] { - function: _+_ - args: { - CALL [9] { - function: _+_ - args: { - IDENT [10] { - name: @index0 - } - CALL [11] { - function: pure_custom_func - args: { - SELECT [12] { - SELECT [13] { - SELECT [14] { - IDENT [15] { - name: msg - }.oneof_type - }.payload - }.single_int32 - } - } - } - } - } - IDENT [16] { - name: @index0 - } - } - } - } - } - CALL [17] { - function: _+_ - args: { - IDENT [18] { - name: @index1 - } - CALL [19] { - function: pure_custom_func - args: { - SELECT [20] { - IDENT [21] { - name: msg - }.single_int64 - } - } - } - } - } - } -} \ No newline at end of file diff --git a/optimizer/src/test/resources/subexpression_ast_block_recursion_depth_7.baseline b/optimizer/src/test/resources/subexpression_ast_block_recursion_depth_7.baseline deleted file mode 100644 index 020447afd..000000000 --- a/optimizer/src/test/resources/subexpression_ast_block_recursion_depth_7.baseline +++ /dev/null @@ -1,4817 +0,0 @@ -Test case: SIZE_1 -Source: size([1,2]) + size([1,2]) + 1 == 5 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - CALL [3] { - function: size - args: { - LIST [4] { - elements: { - CONSTANT [5] { value: 1 } - CONSTANT [6] { value: 2 } - } - } - } - } - } - } - CALL [7] { - function: _==_ - args: { - CALL [8] { - function: _+_ - args: { - CALL [9] { - function: _+_ - args: { - IDENT [10] { - name: @index0 - } - IDENT [11] { - name: @index0 - } - } - } - CONSTANT [12] { value: 1 } - } - } - CONSTANT [13] { value: 5 } - } - } - } -} -Test case: SIZE_2 -Source: 2 + size([1,2]) + size([1,2]) + 1 == 7 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - CALL [3] { - function: size - args: { - LIST [4] { - elements: { - CONSTANT [5] { value: 1 } - CONSTANT [6] { value: 2 } - } - } - } - } - } - } - CALL [7] { - function: _==_ - args: { - CALL [8] { - function: _+_ - args: { - CALL [9] { - function: _+_ - args: { - CALL [10] { - function: _+_ - args: { - CONSTANT [11] { value: 2 } - IDENT [12] { - name: @index0 - } - } - } - IDENT [13] { - name: @index0 - } - } - } - CONSTANT [14] { value: 1 } - } - } - CONSTANT [15] { value: 7 } - } - } - } -} -Test case: SIZE_3 -Source: size([0]) + size([0]) + size([1,2]) + size([1,2]) == 6 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - CALL [3] { - function: size - args: { - LIST [4] { - elements: { - CONSTANT [5] { value: 0 } - } - } - } - } - CALL [6] { - function: size - args: { - LIST [7] { - elements: { - CONSTANT [8] { value: 1 } - CONSTANT [9] { value: 2 } - } - } - } - } - } - } - CALL [10] { - function: _==_ - args: { - CALL [11] { - function: _+_ - args: { - CALL [12] { - function: _+_ - args: { - CALL [13] { - function: _+_ - args: { - IDENT [14] { - name: @index0 - } - IDENT [15] { - name: @index0 - } - } - } - IDENT [16] { - name: @index1 - } - } - } - IDENT [17] { - name: @index1 - } - } - } - CONSTANT [18] { value: 6 } - } - } - } -} -Test case: SIZE_4 -Source: 5 + size([0]) + size([0]) + size([1,2]) + size([1,2]) + size([1,2,3]) + size([1,2,3]) == 17 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - CALL [3] { - function: size - args: { - LIST [4] { - elements: { - CONSTANT [5] { value: 0 } - } - } - } - } - CALL [6] { - function: size - args: { - LIST [7] { - elements: { - CONSTANT [8] { value: 1 } - CONSTANT [9] { value: 2 } - } - } - } - } - CALL [10] { - function: size - args: { - LIST [11] { - elements: { - CONSTANT [12] { value: 1 } - CONSTANT [13] { value: 2 } - CONSTANT [14] { value: 3 } - } - } - } - } - } - } - CALL [15] { - function: _==_ - args: { - CALL [16] { - function: _+_ - args: { - CALL [17] { - function: _+_ - args: { - CALL [18] { - function: _+_ - args: { - CALL [19] { - function: _+_ - args: { - CALL [20] { - function: _+_ - args: { - CALL [21] { - function: _+_ - args: { - CONSTANT [22] { value: 5 } - IDENT [23] { - name: @index0 - } - } - } - IDENT [24] { - name: @index0 - } - } - } - IDENT [25] { - name: @index1 - } - } - } - IDENT [26] { - name: @index1 - } - } - } - IDENT [27] { - name: @index2 - } - } - } - IDENT [28] { - name: @index2 - } - } - } - CONSTANT [29] { value: 17 } - } - } - } -} -Test case: TIMESTAMP -Source: timestamp(int(timestamp(1000000000))).getFullYear() + timestamp(int(timestamp(75))).getFullYear() + timestamp(int(timestamp(50))).getFullYear() + timestamp(int(timestamp(1000000000))).getFullYear() + timestamp(int(timestamp(50))).getSeconds() + timestamp(int(timestamp(200))).getFullYear() + timestamp(int(timestamp(200))).getFullYear() + timestamp(int(timestamp(75))).getMinutes() + timestamp(int(timestamp(1000000000))).getFullYear() == 13934 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - CALL [3] { - function: getFullYear - target: { - CALL [4] { - function: timestamp - args: { - CALL [5] { - function: int - args: { - CALL [6] { - function: timestamp - args: { - CONSTANT [7] { value: 1000000000 } - } - } - } - } - } - } - } - args: { - } - } - CALL [8] { - function: getFullYear - target: { - CALL [9] { - function: timestamp - args: { - CALL [10] { - function: int - args: { - CALL [11] { - function: timestamp - args: { - CONSTANT [12] { value: 200 } - } - } - } - } - } - } - } - args: { - } - } - CALL [13] { - function: timestamp - args: { - CALL [14] { - function: int - args: { - CALL [15] { - function: timestamp - args: { - CONSTANT [16] { value: 50 } - } - } - } - } - } - } - CALL [17] { - function: timestamp - args: { - CALL [18] { - function: int - args: { - CALL [19] { - function: timestamp - args: { - CONSTANT [20] { value: 75 } - } - } - } - } - } - } - CALL [21] { - function: _+_ - args: { - CALL [22] { - function: _+_ - args: { - CALL [23] { - function: _+_ - args: { - CALL [24] { - function: _+_ - args: { - CALL [25] { - function: _+_ - args: { - CALL [26] { - function: _+_ - args: { - IDENT [27] { - name: @index0 - } - CALL [28] { - function: getFullYear - target: { - IDENT [29] { - name: @index3 - } - } - args: { - } - } - } - } - CALL [30] { - function: getFullYear - target: { - IDENT [31] { - name: @index2 - } - } - args: { - } - } - } - } - IDENT [32] { - name: @index0 - } - } - } - CALL [33] { - function: getSeconds - target: { - IDENT [34] { - name: @index2 - } - } - args: { - } - } - } - } - IDENT [35] { - name: @index1 - } - } - } - IDENT [36] { - name: @index1 - } - } - } - } - } - CALL [37] { - function: _==_ - args: { - CALL [38] { - function: _+_ - args: { - CALL [39] { - function: _+_ - args: { - IDENT [40] { - name: @index4 - } - CALL [41] { - function: getMinutes - target: { - IDENT [42] { - name: @index3 - } - } - args: { - } - } - } - } - IDENT [43] { - name: @index0 - } - } - } - CONSTANT [44] { value: 13934 } - } - } - } -} -Test case: MAP_INDEX -Source: {"a": 2}["a"] + {"a": 2}["a"] * {"a": 2}["a"] == 6 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - CALL [3] { - function: _[_] - args: { - MAP [4] { - MAP_ENTRY [5] { - key: { - CONSTANT [6] { value: "a" } - } - value: { - CONSTANT [7] { value: 2 } - } - } - } - CONSTANT [8] { value: "a" } - } - } - } - } - CALL [9] { - function: _==_ - args: { - CALL [10] { - function: _+_ - args: { - IDENT [11] { - name: @index0 - } - CALL [12] { - function: _*_ - args: { - IDENT [13] { - name: @index0 - } - IDENT [14] { - name: @index0 - } - } - } - } - } - CONSTANT [15] { value: 6 } - } - } - } -} -Test case: NESTED_MAP_CONSTRUCTION -Source: {'a': {'b': 1}, 'c': {'b': 1}, 'd': {'e': {'b': 1}}, 'e': {'e': {'b': 1}}} -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - MAP [3] { - MAP_ENTRY [4] { - key: { - CONSTANT [5] { value: "e" } - } - value: { - MAP [6] { - MAP_ENTRY [7] { - key: { - CONSTANT [8] { value: "b" } - } - value: { - CONSTANT [9] { value: 1 } - } - } - } - } - } - } - MAP [10] { - MAP_ENTRY [11] { - key: { - CONSTANT [12] { value: "b" } - } - value: { - CONSTANT [13] { value: 1 } - } - } - } - } - } - MAP [14] { - MAP_ENTRY [15] { - key: { - CONSTANT [16] { value: "a" } - } - value: { - IDENT [17] { - name: @index1 - } - } - } - MAP_ENTRY [18] { - key: { - CONSTANT [19] { value: "c" } - } - value: { - IDENT [20] { - name: @index1 - } - } - } - MAP_ENTRY [21] { - key: { - CONSTANT [22] { value: "d" } - } - value: { - IDENT [23] { - name: @index0 - } - } - } - MAP_ENTRY [24] { - key: { - CONSTANT [25] { value: "e" } - } - value: { - IDENT [26] { - name: @index0 - } - } - } - } - } -} -Test case: NESTED_LIST_CONSTRUCTION -Source: [1, [1,2,3,4], 2, [1,2,3,4], 5, [1,2,3,4], 7, [[1,2], [1,2,3,4]], [1,2]] -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - LIST [3] { - elements: { - CONSTANT [4] { value: 1 } - CONSTANT [5] { value: 2 } - CONSTANT [6] { value: 3 } - CONSTANT [7] { value: 4 } - } - } - LIST [8] { - elements: { - CONSTANT [9] { value: 1 } - CONSTANT [10] { value: 2 } - } - } - } - } - LIST [11] { - elements: { - CONSTANT [12] { value: 1 } - IDENT [13] { - name: @index0 - } - CONSTANT [14] { value: 2 } - IDENT [15] { - name: @index0 - } - CONSTANT [16] { value: 5 } - IDENT [17] { - name: @index0 - } - CONSTANT [18] { value: 7 } - LIST [19] { - elements: { - IDENT [20] { - name: @index1 - } - IDENT [21] { - name: @index0 - } - } - } - IDENT [22] { - name: @index1 - } - } - } - } -} -Test case: SELECT -Source: msg.single_int64 + msg.single_int64 == 6 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - SELECT [3] { - IDENT [4] { - name: msg - }.single_int64 - } - } - } - CALL [5] { - function: _==_ - args: { - CALL [6] { - function: _+_ - args: { - IDENT [7] { - name: @index0 - } - IDENT [8] { - name: @index0 - } - } - } - CONSTANT [9] { value: 6 } - } - } - } -} -Test case: SELECT_NESTED_1 -Source: msg.oneof_type.payload.single_int64 + msg.oneof_type.payload.single_int32 + msg.oneof_type.payload.single_int64 + msg.single_int64 + msg.oneof_type.payload.oneof_type.payload.single_int64 == 31 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - SELECT [3] { - SELECT [4] { - SELECT [5] { - IDENT [6] { - name: msg - }.oneof_type - }.payload - }.single_int64 - } - SELECT [7] { - SELECT [8] { - IDENT [9] { - name: msg - }.oneof_type - }.payload - } - } - } - CALL [10] { - function: _==_ - args: { - CALL [11] { - function: _+_ - args: { - CALL [12] { - function: _+_ - args: { - CALL [13] { - function: _+_ - args: { - CALL [14] { - function: _+_ - args: { - IDENT [15] { - name: @index0 - } - SELECT [16] { - IDENT [17] { - name: @index1 - }.single_int32 - } - } - } - IDENT [18] { - name: @index0 - } - } - } - SELECT [19] { - IDENT [20] { - name: msg - }.single_int64 - } - } - } - SELECT [21] { - SELECT [22] { - SELECT [23] { - IDENT [24] { - name: @index1 - }.oneof_type - }.payload - }.single_int64 - } - } - } - CONSTANT [25] { value: 31 } - } - } - } -} -Test case: SELECT_NESTED_2 -Source: true || msg.oneof_type.payload.oneof_type.payload.oneof_type.payload.oneof_type.payload.single_bool || msg.oneof_type.payload.oneof_type.payload.oneof_type.child.child.payload.single_bool -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - SELECT [3] { - SELECT [4] { - SELECT [5] { - SELECT [6] { - SELECT [7] { - IDENT [8] { - name: msg - }.oneof_type - }.payload - }.oneof_type - }.payload - }.oneof_type - } - } - } - CALL [9] { - function: _||_ - args: { - CALL [10] { - function: _||_ - args: { - CONSTANT [11] { value: true } - SELECT [12] { - SELECT [13] { - SELECT [14] { - SELECT [15] { - IDENT [16] { - name: @index0 - }.payload - }.oneof_type - }.payload - }.single_bool - } - } - } - SELECT [17] { - SELECT [18] { - SELECT [19] { - SELECT [20] { - IDENT [21] { - name: @index0 - }.child - }.child - }.payload - }.single_bool - } - } - } - } -} -Test case: SELECT_NESTED_MESSAGE_MAP_INDEX_1 -Source: msg.oneof_type.payload.map_int32_int64[1] + msg.oneof_type.payload.map_int32_int64[1] + msg.oneof_type.payload.map_int32_int64[1] == 15 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - CALL [3] { - function: _[_] - args: { - SELECT [4] { - SELECT [5] { - SELECT [6] { - IDENT [7] { - name: msg - }.oneof_type - }.payload - }.map_int32_int64 - } - CONSTANT [8] { value: 1 } - } - } - } - } - CALL [9] { - function: _==_ - args: { - CALL [10] { - function: _+_ - args: { - CALL [11] { - function: _+_ - args: { - IDENT [12] { - name: @index0 - } - IDENT [13] { - name: @index0 - } - } - } - IDENT [14] { - name: @index0 - } - } - } - CONSTANT [15] { value: 15 } - } - } - } -} -Test case: SELECT_NESTED_MESSAGE_MAP_INDEX_2 -Source: msg.oneof_type.payload.map_int32_int64[0] + msg.oneof_type.payload.map_int32_int64[1] + msg.oneof_type.payload.map_int32_int64[2] == 8 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - SELECT [3] { - SELECT [4] { - SELECT [5] { - IDENT [6] { - name: msg - }.oneof_type - }.payload - }.map_int32_int64 - } - } - } - CALL [7] { - function: _==_ - args: { - CALL [8] { - function: _+_ - args: { - CALL [9] { - function: _+_ - args: { - CALL [10] { - function: _[_] - args: { - IDENT [11] { - name: @index0 - } - CONSTANT [12] { value: 0 } - } - } - CALL [13] { - function: _[_] - args: { - IDENT [14] { - name: @index0 - } - CONSTANT [15] { value: 1 } - } - } - } - } - CALL [16] { - function: _[_] - args: { - IDENT [17] { - name: @index0 - } - CONSTANT [18] { value: 2 } - } - } - } - } - CONSTANT [19] { value: 8 } - } - } - } -} -Test case: SELECT_NESTED_NO_COMMON_SUBEXPR -Source: msg.oneof_type.payload.oneof_type.payload.oneof_type.payload.oneof_type.payload.single_int64 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - SELECT [3] { - SELECT [4] { - SELECT [5] { - SELECT [6] { - SELECT [7] { - SELECT [8] { - SELECT [9] { - IDENT [10] { - name: msg - }.oneof_type - }.payload - }.oneof_type - }.payload - }.oneof_type - }.payload - }.oneof_type - } - } - } - SELECT [11] { - SELECT [12] { - IDENT [13] { - name: @index0 - }.payload - }.single_int64 - } - } -} -Test case: TERNARY -Source: (msg.single_int64 > 0 ? msg.single_int64 : 0) == 3 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - SELECT [3] { - IDENT [4] { - name: msg - }.single_int64 - } - } - } - CALL [5] { - function: _==_ - args: { - CALL [6] { - function: _?_:_ - args: { - CALL [7] { - function: _>_ - args: { - IDENT [8] { - name: @index0 - } - CONSTANT [9] { value: 0 } - } - } - IDENT [10] { - name: @index0 - } - CONSTANT [11] { value: 0 } - } - } - CONSTANT [12] { value: 3 } - } - } - } -} -Test case: TERNARY_BIND_RHS_ONLY -Source: false ? false : (msg.single_int64) + ((msg.single_int64 + 1) * 2) == 11 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - SELECT [3] { - IDENT [4] { - name: msg - }.single_int64 - } - } - } - CALL [5] { - function: _?_:_ - args: { - CONSTANT [6] { value: false } - CONSTANT [7] { value: false } - CALL [8] { - function: _==_ - args: { - CALL [9] { - function: _+_ - args: { - IDENT [10] { - name: @index0 - } - CALL [11] { - function: _*_ - args: { - CALL [12] { - function: _+_ - args: { - IDENT [13] { - name: @index0 - } - CONSTANT [14] { value: 1 } - } - } - CONSTANT [15] { value: 2 } - } - } - } - } - CONSTANT [16] { value: 11 } - } - } - } - } - } -} -Test case: NESTED_TERNARY -Source: (msg.single_int64 > 0 ? (msg.single_int32 > 0 ? msg.single_int64 + msg.single_int32 : 0) : 0) == 8 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - SELECT [3] { - IDENT [4] { - name: msg - }.single_int64 - } - SELECT [5] { - IDENT [6] { - name: msg - }.single_int32 - } - } - } - CALL [7] { - function: _==_ - args: { - CALL [8] { - function: _?_:_ - args: { - CALL [9] { - function: _>_ - args: { - IDENT [10] { - name: @index0 - } - CONSTANT [11] { value: 0 } - } - } - CALL [12] { - function: _?_:_ - args: { - CALL [13] { - function: _>_ - args: { - IDENT [14] { - name: @index1 - } - CONSTANT [15] { value: 0 } - } - } - CALL [16] { - function: _+_ - args: { - IDENT [17] { - name: @index0 - } - IDENT [18] { - name: @index1 - } - } - } - CONSTANT [19] { value: 0 } - } - } - CONSTANT [20] { value: 0 } - } - } - CONSTANT [21] { value: 8 } - } - } - } -} -Test case: MULTIPLE_MACROS_1 -Source: size([[1].exists(i, i > 0)]) + size([[1].exists(j, j > 0)]) + size([[2].exists(k, k > 1)]) + size([[2].exists(l, l > 1)]) == 4 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - COMPREHENSION [3] { - iter_var: @it:0:0 - iter_range: { - LIST [4] { - elements: { - CONSTANT [5] { value: 1 } - } - } - } - accu_var: @ac:0:0 - accu_init: { - CONSTANT [6] { value: false } - } - loop_condition: { - CALL [7] { - function: @not_strictly_false - args: { - CALL [8] { - function: !_ - args: { - IDENT [9] { - name: @ac:0:0 - } - } - } - } - } - } - loop_step: { - CALL [10] { - function: _||_ - args: { - IDENT [11] { - name: @ac:0:0 - } - CALL [12] { - function: _>_ - args: { - IDENT [13] { - name: @it:0:0 - } - CONSTANT [14] { value: 0 } - } - } - } - } - } - result: { - IDENT [15] { - name: @ac:0:0 - } - } - } - COMPREHENSION [16] { - iter_var: @it:0:0 - iter_range: { - LIST [17] { - elements: { - CONSTANT [18] { value: 2 } - } - } - } - accu_var: @ac:0:0 - accu_init: { - CONSTANT [19] { value: false } - } - loop_condition: { - CALL [20] { - function: @not_strictly_false - args: { - CALL [21] { - function: !_ - args: { - IDENT [22] { - name: @ac:0:0 - } - } - } - } - } - } - loop_step: { - CALL [23] { - function: _||_ - args: { - IDENT [24] { - name: @ac:0:0 - } - CALL [25] { - function: _>_ - args: { - IDENT [26] { - name: @it:0:0 - } - CONSTANT [27] { value: 1 } - } - } - } - } - } - result: { - IDENT [28] { - name: @ac:0:0 - } - } - } - CALL [29] { - function: size - args: { - LIST [30] { - elements: { - IDENT [31] { - name: @index0 - } - } - } - } - } - CALL [32] { - function: size - args: { - LIST [33] { - elements: { - IDENT [34] { - name: @index1 - } - } - } - } - } - } - } - CALL [35] { - function: _==_ - args: { - CALL [36] { - function: _+_ - args: { - CALL [37] { - function: _+_ - args: { - CALL [38] { - function: _+_ - args: { - IDENT [39] { - name: @index2 - } - IDENT [40] { - name: @index2 - } - } - } - IDENT [41] { - name: @index3 - } - } - } - IDENT [42] { - name: @index3 - } - } - } - CONSTANT [43] { value: 4 } - } - } - } -} -Test case: MULTIPLE_MACROS_2 -Source: [[1].exists(i, i > 0)] + [[1].exists(j, j > 0)] + [['a'].exists(k, k == 'a')] + [['a'].exists(l, l == 'a')] == [true, true, true, true] -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - COMPREHENSION [3] { - iter_var: @it:0:0 - iter_range: { - LIST [4] { - elements: { - CONSTANT [5] { value: 1 } - } - } - } - accu_var: @ac:0:0 - accu_init: { - CONSTANT [6] { value: false } - } - loop_condition: { - CALL [7] { - function: @not_strictly_false - args: { - CALL [8] { - function: !_ - args: { - IDENT [9] { - name: @ac:0:0 - } - } - } - } - } - } - loop_step: { - CALL [10] { - function: _||_ - args: { - IDENT [11] { - name: @ac:0:0 - } - CALL [12] { - function: _>_ - args: { - IDENT [13] { - name: @it:0:0 - } - CONSTANT [14] { value: 0 } - } - } - } - } - } - result: { - IDENT [15] { - name: @ac:0:0 - } - } - } - COMPREHENSION [16] { - iter_var: @it:0:1 - iter_range: { - LIST [17] { - elements: { - CONSTANT [18] { value: "a" } - } - } - } - accu_var: @ac:0:1 - accu_init: { - CONSTANT [19] { value: false } - } - loop_condition: { - CALL [20] { - function: @not_strictly_false - args: { - CALL [21] { - function: !_ - args: { - IDENT [22] { - name: @ac:0:1 - } - } - } - } - } - } - loop_step: { - CALL [23] { - function: _||_ - args: { - IDENT [24] { - name: @ac:0:1 - } - CALL [25] { - function: _==_ - args: { - IDENT [26] { - name: @it:0:1 - } - CONSTANT [27] { value: "a" } - } - } - } - } - } - result: { - IDENT [28] { - name: @ac:0:1 - } - } - } - LIST [29] { - elements: { - IDENT [30] { - name: @index0 - } - } - } - LIST [31] { - elements: { - IDENT [32] { - name: @index1 - } - } - } - } - } - CALL [33] { - function: _==_ - args: { - CALL [34] { - function: _+_ - args: { - CALL [35] { - function: _+_ - args: { - CALL [36] { - function: _+_ - args: { - IDENT [37] { - name: @index2 - } - IDENT [38] { - name: @index2 - } - } - } - IDENT [39] { - name: @index3 - } - } - } - IDENT [40] { - name: @index3 - } - } - } - LIST [41] { - elements: { - CONSTANT [42] { value: true } - CONSTANT [43] { value: true } - CONSTANT [44] { value: true } - CONSTANT [45] { value: true } - } - } - } - } - } -} -Test case: MULTIPLE_MACROS_3 -Source: [1].exists(i, i > 0) && [1].exists(j, j > 0) && [1].exists(k, k > 1) && [2].exists(l, l > 1) -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - COMPREHENSION [3] { - iter_var: @it:0:0 - iter_range: { - LIST [4] { - elements: { - CONSTANT [5] { value: 1 } - } - } - } - accu_var: @ac:0:0 - accu_init: { - CONSTANT [6] { value: false } - } - loop_condition: { - CALL [7] { - function: @not_strictly_false - args: { - CALL [8] { - function: !_ - args: { - IDENT [9] { - name: @ac:0:0 - } - } - } - } - } - } - loop_step: { - CALL [10] { - function: _||_ - args: { - IDENT [11] { - name: @ac:0:0 - } - CALL [12] { - function: _>_ - args: { - IDENT [13] { - name: @it:0:0 - } - CONSTANT [14] { value: 0 } - } - } - } - } - } - result: { - IDENT [15] { - name: @ac:0:0 - } - } - } - } - } - CALL [16] { - function: _&&_ - args: { - CALL [17] { - function: _&&_ - args: { - IDENT [18] { - name: @index0 - } - IDENT [19] { - name: @index0 - } - } - } - CALL [20] { - function: _&&_ - args: { - COMPREHENSION [21] { - iter_var: @it:0:0 - iter_range: { - LIST [22] { - elements: { - CONSTANT [23] { value: 1 } - } - } - } - accu_var: @ac:0:0 - accu_init: { - CONSTANT [24] { value: false } - } - loop_condition: { - CALL [25] { - function: @not_strictly_false - args: { - CALL [26] { - function: !_ - args: { - IDENT [27] { - name: @ac:0:0 - } - } - } - } - } - } - loop_step: { - CALL [28] { - function: _||_ - args: { - IDENT [29] { - name: @ac:0:0 - } - CALL [30] { - function: _>_ - args: { - IDENT [31] { - name: @it:0:0 - } - CONSTANT [32] { value: 1 } - } - } - } - } - } - result: { - IDENT [33] { - name: @ac:0:0 - } - } - } - COMPREHENSION [34] { - iter_var: @it:0:0 - iter_range: { - LIST [35] { - elements: { - CONSTANT [36] { value: 2 } - } - } - } - accu_var: @ac:0:0 - accu_init: { - CONSTANT [37] { value: false } - } - loop_condition: { - CALL [38] { - function: @not_strictly_false - args: { - CALL [39] { - function: !_ - args: { - IDENT [40] { - name: @ac:0:0 - } - } - } - } - } - } - loop_step: { - CALL [41] { - function: _||_ - args: { - IDENT [42] { - name: @ac:0:0 - } - CALL [43] { - function: _>_ - args: { - IDENT [44] { - name: @it:0:0 - } - CONSTANT [45] { value: 1 } - } - } - } - } - } - result: { - IDENT [46] { - name: @ac:0:0 - } - } - } - } - } - } - } - } -} -Test case: MULTIPLE_MACROS_COMP_V2_1 -Source: size([[1].exists(i,x,i > 0 && x >= 0)]) + size([[1].exists(j, y, j > 0 && y >= 0)]) + size([[2].exists(k,z,k > 1 && z >= 0)]) + size([[2].exists(l, w, l > 1 && w >= 0)]) == 4 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - COMPREHENSION [3] { - iter_var: @it:0:0 - iter_var2: @it2:0:0 - iter_range: { - LIST [4] { - elements: { - CONSTANT [5] { value: 1 } - } - } - } - accu_var: @ac:0:0 - accu_init: { - CONSTANT [6] { value: false } - } - loop_condition: { - CALL [7] { - function: @not_strictly_false - args: { - CALL [8] { - function: !_ - args: { - IDENT [9] { - name: @ac:0:0 - } - } - } - } - } - } - loop_step: { - CALL [10] { - function: _||_ - args: { - IDENT [11] { - name: @ac:0:0 - } - CALL [12] { - function: _&&_ - args: { - CALL [13] { - function: _>_ - args: { - IDENT [14] { - name: @it:0:0 - } - CONSTANT [15] { value: 0 } - } - } - CALL [16] { - function: _>=_ - args: { - IDENT [17] { - name: @it2:0:0 - } - CONSTANT [18] { value: 0 } - } - } - } - } - } - } - } - result: { - IDENT [19] { - name: @ac:0:0 - } - } - } - COMPREHENSION [20] { - iter_var: @it:0:0 - iter_var2: @it2:0:0 - iter_range: { - LIST [21] { - elements: { - CONSTANT [22] { value: 2 } - } - } - } - accu_var: @ac:0:0 - accu_init: { - CONSTANT [23] { value: false } - } - loop_condition: { - CALL [24] { - function: @not_strictly_false - args: { - CALL [25] { - function: !_ - args: { - IDENT [26] { - name: @ac:0:0 - } - } - } - } - } - } - loop_step: { - CALL [27] { - function: _||_ - args: { - IDENT [28] { - name: @ac:0:0 - } - CALL [29] { - function: _&&_ - args: { - CALL [30] { - function: _>_ - args: { - IDENT [31] { - name: @it:0:0 - } - CONSTANT [32] { value: 1 } - } - } - CALL [33] { - function: _>=_ - args: { - IDENT [34] { - name: @it2:0:0 - } - CONSTANT [35] { value: 0 } - } - } - } - } - } - } - } - result: { - IDENT [36] { - name: @ac:0:0 - } - } - } - CALL [37] { - function: size - args: { - LIST [38] { - elements: { - IDENT [39] { - name: @index0 - } - } - } - } - } - CALL [40] { - function: size - args: { - LIST [41] { - elements: { - IDENT [42] { - name: @index1 - } - } - } - } - } - } - } - CALL [43] { - function: _==_ - args: { - CALL [44] { - function: _+_ - args: { - CALL [45] { - function: _+_ - args: { - CALL [46] { - function: _+_ - args: { - IDENT [47] { - name: @index2 - } - IDENT [48] { - name: @index2 - } - } - } - IDENT [49] { - name: @index3 - } - } - } - IDENT [50] { - name: @index3 - } - } - } - CONSTANT [51] { value: 4 } - } - } - } -} -Test case: MULTIPLE_MACROS_COMP_V2_2 -Source: [1].exists(i, x, i > 0 && x > 0) && [1].exists(j, y, j > 0 && y > 0) && [1].exists(k, z, k > 1 && z > 0) && [2].exists(l, w, l > 1 && w > 0) -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - COMPREHENSION [3] { - iter_var: @it:0:0 - iter_var2: @it2:0:0 - iter_range: { - LIST [4] { - elements: { - CONSTANT [5] { value: 1 } - } - } - } - accu_var: @ac:0:0 - accu_init: { - CONSTANT [6] { value: false } - } - loop_condition: { - CALL [7] { - function: @not_strictly_false - args: { - CALL [8] { - function: !_ - args: { - IDENT [9] { - name: @ac:0:0 - } - } - } - } - } - } - loop_step: { - CALL [10] { - function: _||_ - args: { - IDENT [11] { - name: @ac:0:0 - } - CALL [12] { - function: _&&_ - args: { - CALL [13] { - function: _>_ - args: { - IDENT [14] { - name: @it:0:0 - } - CONSTANT [15] { value: 0 } - } - } - CALL [16] { - function: _>_ - args: { - IDENT [17] { - name: @it2:0:0 - } - CONSTANT [18] { value: 0 } - } - } - } - } - } - } - } - result: { - IDENT [19] { - name: @ac:0:0 - } - } - } - } - } - CALL [20] { - function: _&&_ - args: { - CALL [21] { - function: _&&_ - args: { - IDENT [22] { - name: @index0 - } - IDENT [23] { - name: @index0 - } - } - } - CALL [24] { - function: _&&_ - args: { - COMPREHENSION [25] { - iter_var: @it:0:0 - iter_var2: @it2:0:0 - iter_range: { - LIST [26] { - elements: { - CONSTANT [27] { value: 1 } - } - } - } - accu_var: @ac:0:0 - accu_init: { - CONSTANT [28] { value: false } - } - loop_condition: { - CALL [29] { - function: @not_strictly_false - args: { - CALL [30] { - function: !_ - args: { - IDENT [31] { - name: @ac:0:0 - } - } - } - } - } - } - loop_step: { - CALL [32] { - function: _||_ - args: { - IDENT [33] { - name: @ac:0:0 - } - CALL [34] { - function: _&&_ - args: { - CALL [35] { - function: _>_ - args: { - IDENT [36] { - name: @it:0:0 - } - CONSTANT [37] { value: 1 } - } - } - CALL [38] { - function: _>_ - args: { - IDENT [39] { - name: @it2:0:0 - } - CONSTANT [40] { value: 0 } - } - } - } - } - } - } - } - result: { - IDENT [41] { - name: @ac:0:0 - } - } - } - COMPREHENSION [42] { - iter_var: @it:0:0 - iter_var2: @it2:0:0 - iter_range: { - LIST [43] { - elements: { - CONSTANT [44] { value: 2 } - } - } - } - accu_var: @ac:0:0 - accu_init: { - CONSTANT [45] { value: false } - } - loop_condition: { - CALL [46] { - function: @not_strictly_false - args: { - CALL [47] { - function: !_ - args: { - IDENT [48] { - name: @ac:0:0 - } - } - } - } - } - } - loop_step: { - CALL [49] { - function: _||_ - args: { - IDENT [50] { - name: @ac:0:0 - } - CALL [51] { - function: _&&_ - args: { - CALL [52] { - function: _>_ - args: { - IDENT [53] { - name: @it:0:0 - } - CONSTANT [54] { value: 1 } - } - } - CALL [55] { - function: _>_ - args: { - IDENT [56] { - name: @it2:0:0 - } - CONSTANT [57] { value: 0 } - } - } - } - } - } - } - } - result: { - IDENT [58] { - name: @ac:0:0 - } - } - } - } - } - } - } - } -} -Test case: NESTED_MACROS -Source: [1,2,3].map(i, [1, 2, 3].map(i, i + 1)) == [[2, 3, 4], [2, 3, 4], [2, 3, 4]] -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - LIST [3] { - elements: { - CONSTANT [4] { value: 1 } - CONSTANT [5] { value: 2 } - CONSTANT [6] { value: 3 } - } - } - LIST [7] { - elements: { - CONSTANT [8] { value: 2 } - CONSTANT [9] { value: 3 } - CONSTANT [10] { value: 4 } - } - } - } - } - CALL [11] { - function: _==_ - args: { - COMPREHENSION [12] { - iter_var: @it:1:0 - iter_range: { - IDENT [13] { - name: @index0 - } - } - accu_var: @ac:1:0 - accu_init: { - LIST [14] { - elements: { - } - } - } - loop_condition: { - CONSTANT [15] { value: true } - } - loop_step: { - CALL [16] { - function: _+_ - args: { - IDENT [17] { - name: @ac:1:0 - } - LIST [18] { - elements: { - COMPREHENSION [19] { - iter_var: @it:0:0 - iter_range: { - IDENT [20] { - name: @index0 - } - } - accu_var: @ac:0:0 - accu_init: { - LIST [21] { - elements: { - } - } - } - loop_condition: { - CONSTANT [22] { value: true } - } - loop_step: { - CALL [23] { - function: _+_ - args: { - IDENT [24] { - name: @ac:0:0 - } - LIST [25] { - elements: { - CALL [26] { - function: _+_ - args: { - IDENT [27] { - name: @it:0:0 - } - CONSTANT [28] { value: 1 } - } - } - } - } - } - } - } - result: { - IDENT [29] { - name: @ac:0:0 - } - } - } - } - } - } - } - } - result: { - IDENT [30] { - name: @ac:1:0 - } - } - } - LIST [31] { - elements: { - IDENT [32] { - name: @index1 - } - IDENT [33] { - name: @index1 - } - IDENT [34] { - name: @index1 - } - } - } - } - } - } -} -Test case: NESTED_MACROS_2 -Source: [1, 2].map(y, [1, 2, 3].filter(x, x == y)) == [[1], [2]] -=====> -CALL [31] { - function: _==_ - args: { - COMPREHENSION [30] { - iter_var: y - iter_range: { - LIST [1] { - elements: { - CONSTANT [2] { value: 1 } - CONSTANT [3] { value: 2 } - } - } - } - accu_var: @result - accu_init: { - LIST [24] { - elements: { - } - } - } - loop_condition: { - CONSTANT [25] { value: true } - } - loop_step: { - CALL [28] { - function: _+_ - args: { - IDENT [26] { - name: @result - } - LIST [27] { - elements: { - COMPREHENSION [23] { - iter_var: x - iter_range: { - LIST [6] { - elements: { - CONSTANT [7] { value: 1 } - CONSTANT [8] { value: 2 } - CONSTANT [9] { value: 3 } - } - } - } - accu_var: @result - accu_init: { - LIST [15] { - elements: { - } - } - } - loop_condition: { - CONSTANT [16] { value: true } - } - loop_step: { - CALL [21] { - function: _?_:_ - args: { - CALL [13] { - function: _==_ - args: { - IDENT [12] { - name: x - } - IDENT [14] { - name: y - } - } - } - CALL [19] { - function: _+_ - args: { - IDENT [17] { - name: @result - } - LIST [18] { - elements: { - IDENT [11] { - name: x - } - } - } - } - } - IDENT [20] { - name: @result - } - } - } - } - result: { - IDENT [22] { - name: @result - } - } - } - } - } - } - } - } - result: { - IDENT [29] { - name: @result - } - } - } - LIST [32] { - elements: { - LIST [33] { - elements: { - CONSTANT [34] { value: 1 } - } - } - LIST [35] { - elements: { - CONSTANT [36] { value: 2 } - } - } - } - } - } -} -Test case: NESTED_MACROS_3 -Source: [1,2,3].map(i, i * 2) + [1,2,3].map(i, i * 2).map(i, i * 2) -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - COMPREHENSION [3] { - iter_var: @it:0:0 - iter_range: { - LIST [4] { - elements: { - CONSTANT [5] { value: 1 } - CONSTANT [6] { value: 2 } - CONSTANT [7] { value: 3 } - } - } - } - accu_var: @ac:0:0 - accu_init: { - LIST [8] { - elements: { - } - } - } - loop_condition: { - CONSTANT [9] { value: true } - } - loop_step: { - CALL [10] { - function: _+_ - args: { - IDENT [11] { - name: @ac:0:0 - } - LIST [12] { - elements: { - CALL [13] { - function: _*_ - args: { - IDENT [14] { - name: @it:0:0 - } - CONSTANT [15] { value: 2 } - } - } - } - } - } - } - } - result: { - IDENT [16] { - name: @ac:0:0 - } - } - } - } - } - CALL [17] { - function: _+_ - args: { - IDENT [18] { - name: @index0 - } - COMPREHENSION [19] { - iter_var: @it:1:0 - iter_range: { - IDENT [20] { - name: @index0 - } - } - accu_var: @ac:1:0 - accu_init: { - LIST [21] { - elements: { - } - } - } - loop_condition: { - CONSTANT [22] { value: true } - } - loop_step: { - CALL [23] { - function: _+_ - args: { - IDENT [24] { - name: @ac:1:0 - } - LIST [25] { - elements: { - CALL [26] { - function: _*_ - args: { - IDENT [27] { - name: @it:1:0 - } - CONSTANT [28] { value: 2 } - } - } - } - } - } - } - } - result: { - IDENT [29] { - name: @ac:1:0 - } - } - } - } - } - } -} -Test case: NESTED_MACROS_COMP_V2_1 -Source: [1,2,3].transformList(i, v, [1, 2, 3].transformList(i, v, i + v + 1)) == [[2, 4, 6], [2, 4, 6], [2, 4, 6]] -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - LIST [3] { - elements: { - CONSTANT [4] { value: 1 } - CONSTANT [5] { value: 2 } - CONSTANT [6] { value: 3 } - } - } - LIST [7] { - elements: { - CONSTANT [8] { value: 2 } - CONSTANT [9] { value: 4 } - CONSTANT [10] { value: 6 } - } - } - COMPREHENSION [11] { - iter_var: @it:0:0 - iter_var2: @it2:0:0 - iter_range: { - IDENT [12] { - name: @index0 - } - } - accu_var: @ac:0:0 - accu_init: { - LIST [13] { - elements: { - } - } - } - loop_condition: { - CONSTANT [14] { value: true } - } - loop_step: { - CALL [15] { - function: _+_ - args: { - IDENT [16] { - name: @ac:0:0 - } - LIST [17] { - elements: { - CALL [18] { - function: _+_ - args: { - CALL [19] { - function: _+_ - args: { - IDENT [20] { - name: @it:0:0 - } - IDENT [21] { - name: @it2:0:0 - } - } - } - CONSTANT [22] { value: 1 } - } - } - } - } - } - } - } - result: { - IDENT [23] { - name: @ac:0:0 - } - } - } - } - } - CALL [24] { - function: _==_ - args: { - COMPREHENSION [25] { - iter_var: @it:1:0 - iter_var2: @it2:1:0 - iter_range: { - IDENT [26] { - name: @index0 - } - } - accu_var: @ac:1:0 - accu_init: { - LIST [27] { - elements: { - } - } - } - loop_condition: { - CONSTANT [28] { value: true } - } - loop_step: { - CALL [29] { - function: _+_ - args: { - IDENT [30] { - name: @ac:1:0 - } - LIST [31] { - elements: { - IDENT [32] { - name: @index2 - } - } - } - } - } - } - result: { - IDENT [33] { - name: @ac:1:0 - } - } - } - LIST [34] { - elements: { - IDENT [35] { - name: @index1 - } - IDENT [36] { - name: @index1 - } - IDENT [37] { - name: @index1 - } - } - } - } - } - } -} -Test case: NESTED_MACROS_COMP_V2_2 -Source: [1, 2].transformList(i, y, [1, 2, 3].filter(x, x == y && i < y)) == [[1], [2]] -=====> -CALL [36] { - function: _==_ - args: { - COMPREHENSION [35] { - iter_var: i - iter_var2: y - iter_range: { - LIST [1] { - elements: { - CONSTANT [2] { value: 1 } - CONSTANT [3] { value: 2 } - } - } - } - accu_var: @result - accu_init: { - LIST [29] { - elements: { - } - } - } - loop_condition: { - CONSTANT [30] { value: true } - } - loop_step: { - CALL [33] { - function: _+_ - args: { - IDENT [31] { - name: @result - } - LIST [32] { - elements: { - COMPREHENSION [28] { - iter_var: x - iter_range: { - LIST [7] { - elements: { - CONSTANT [8] { value: 1 } - CONSTANT [9] { value: 2 } - CONSTANT [10] { value: 3 } - } - } - } - accu_var: @result - accu_init: { - LIST [20] { - elements: { - } - } - } - loop_condition: { - CONSTANT [21] { value: true } - } - loop_step: { - CALL [26] { - function: _?_:_ - args: { - CALL [16] { - function: _&&_ - args: { - CALL [14] { - function: _==_ - args: { - IDENT [13] { - name: x - } - IDENT [15] { - name: y - } - } - } - CALL [18] { - function: _<_ - args: { - IDENT [17] { - name: i - } - IDENT [19] { - name: y - } - } - } - } - } - CALL [24] { - function: _+_ - args: { - IDENT [22] { - name: @result - } - LIST [23] { - elements: { - IDENT [12] { - name: x - } - } - } - } - } - IDENT [25] { - name: @result - } - } - } - } - result: { - IDENT [27] { - name: @result - } - } - } - } - } - } - } - } - result: { - IDENT [34] { - name: @result - } - } - } - LIST [37] { - elements: { - LIST [38] { - elements: { - CONSTANT [39] { value: 1 } - } - } - LIST [40] { - elements: { - CONSTANT [41] { value: 2 } - } - } - } - } - } -} -Test case: ADJACENT_NESTED_MACROS -Source: [1,2,3].map(i, [1, 2, 3].map(i, i + 1)) == [1,2,3].map(j, [1, 2, 3].map(j, j + 1)) -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - COMPREHENSION [3] { - iter_var: @it:1:0 - iter_range: { - LIST [4] { - elements: { - CONSTANT [5] { value: 1 } - CONSTANT [6] { value: 2 } - CONSTANT [7] { value: 3 } - } - } - } - accu_var: @ac:1:0 - accu_init: { - LIST [8] { - elements: { - } - } - } - loop_condition: { - CONSTANT [9] { value: true } - } - loop_step: { - CALL [10] { - function: _+_ - args: { - IDENT [11] { - name: @ac:1:0 - } - LIST [12] { - elements: { - COMPREHENSION [13] { - iter_var: @it:0:0 - iter_range: { - LIST [14] { - elements: { - CONSTANT [15] { value: 1 } - CONSTANT [16] { value: 2 } - CONSTANT [17] { value: 3 } - } - } - } - accu_var: @ac:0:0 - accu_init: { - LIST [18] { - elements: { - } - } - } - loop_condition: { - CONSTANT [19] { value: true } - } - loop_step: { - CALL [20] { - function: _+_ - args: { - IDENT [21] { - name: @ac:0:0 - } - LIST [22] { - elements: { - CALL [23] { - function: _+_ - args: { - IDENT [24] { - name: @it:0:0 - } - CONSTANT [25] { value: 1 } - } - } - } - } - } - } - } - result: { - IDENT [26] { - name: @ac:0:0 - } - } - } - } - } - } - } - } - result: { - IDENT [27] { - name: @ac:1:0 - } - } - } - } - } - CALL [28] { - function: _==_ - args: { - IDENT [29] { - name: @index0 - } - IDENT [30] { - name: @index0 - } - } - } - } -} -Test case: ADJACENT_NESTED_MACROS_COMP_V2 -Source: [1,2,3].transformMap(i, x, [1, 2, 3].transformMap(i, x, i + x + 1)) == [1,2,3].transformMap(j, y, [1, 2, 3].transformMap(j, y, j + y + 1)) -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - COMPREHENSION [3] { - iter_var: @it:1:0 - iter_var2: @it2:1:0 - iter_range: { - LIST [4] { - elements: { - CONSTANT [5] { value: 1 } - CONSTANT [6] { value: 2 } - CONSTANT [7] { value: 3 } - } - } - } - accu_var: @ac:1:0 - accu_init: { - MAP [8] { - - } - } - loop_condition: { - CONSTANT [9] { value: true } - } - loop_step: { - CALL [10] { - function: cel.@mapInsert - args: { - IDENT [11] { - name: @ac:1:0 - } - IDENT [12] { - name: @it:1:0 - } - COMPREHENSION [13] { - iter_var: @it:0:0 - iter_var2: @it2:0:0 - iter_range: { - LIST [14] { - elements: { - CONSTANT [15] { value: 1 } - CONSTANT [16] { value: 2 } - CONSTANT [17] { value: 3 } - } - } - } - accu_var: @ac:0:0 - accu_init: { - MAP [18] { - - } - } - loop_condition: { - CONSTANT [19] { value: true } - } - loop_step: { - CALL [20] { - function: cel.@mapInsert - args: { - IDENT [21] { - name: @ac:0:0 - } - IDENT [22] { - name: @it:0:0 - } - CALL [23] { - function: _+_ - args: { - CALL [24] { - function: _+_ - args: { - IDENT [25] { - name: @it:0:0 - } - IDENT [26] { - name: @it2:0:0 - } - } - } - CONSTANT [27] { value: 1 } - } - } - } - } - } - result: { - IDENT [28] { - name: @ac:0:0 - } - } - } - } - } - } - result: { - IDENT [29] { - name: @ac:1:0 - } - } - } - } - } - CALL [30] { - function: _==_ - args: { - IDENT [31] { - name: @index0 - } - IDENT [32] { - name: @index0 - } - } - } - } -} -Test case: INCLUSION_LIST -Source: 1 in [1,2,3] && 2 in [1,2,3] && 3 in [3, [1,2,3]] && 1 in [1,2,3] -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - CALL [3] { - function: @in - args: { - CONSTANT [4] { value: 1 } - LIST [5] { - elements: { - CONSTANT [6] { value: 1 } - CONSTANT [7] { value: 2 } - CONSTANT [8] { value: 3 } - } - } - } - } - LIST [9] { - elements: { - CONSTANT [10] { value: 1 } - CONSTANT [11] { value: 2 } - CONSTANT [12] { value: 3 } - } - } - } - } - CALL [13] { - function: _&&_ - args: { - CALL [14] { - function: _&&_ - args: { - IDENT [15] { - name: @index0 - } - CALL [16] { - function: @in - args: { - CONSTANT [17] { value: 2 } - IDENT [18] { - name: @index1 - } - } - } - } - } - CALL [19] { - function: _&&_ - args: { - CALL [20] { - function: @in - args: { - CONSTANT [21] { value: 3 } - LIST [22] { - elements: { - CONSTANT [23] { value: 3 } - IDENT [24] { - name: @index1 - } - } - } - } - } - IDENT [25] { - name: @index0 - } - } - } - } - } - } -} -Test case: INCLUSION_MAP -Source: 2 in {'a': 1, 2: {true: false}, 3: {true: false}} -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - MAP [3] { - MAP_ENTRY [4] { - key: { - CONSTANT [5] { value: true } - } - value: { - CONSTANT [6] { value: false } - } - } - } - } - } - CALL [7] { - function: @in - args: { - CONSTANT [8] { value: 2 } - MAP [9] { - MAP_ENTRY [10] { - key: { - CONSTANT [11] { value: "a" } - } - value: { - CONSTANT [12] { value: 1 } - } - } - MAP_ENTRY [13] { - key: { - CONSTANT [14] { value: 2 } - } - value: { - IDENT [15] { - name: @index0 - } - } - } - MAP_ENTRY [16] { - key: { - CONSTANT [17] { value: 3 } - } - value: { - IDENT [18] { - name: @index0 - } - } - } - } - } - } - } -} -Test case: MACRO_ITER_VAR_NOT_REFERENCED -Source: [1,2].map(i, [1, 2].map(i, [3,4])) == [[[3, 4], [3, 4]], [[3, 4], [3, 4]]] -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - LIST [3] { - elements: { - LIST [4] { - elements: { - CONSTANT [5] { value: 3 } - CONSTANT [6] { value: 4 } - } - } - LIST [7] { - elements: { - CONSTANT [8] { value: 3 } - CONSTANT [9] { value: 4 } - } - } - } - } - LIST [10] { - elements: { - CONSTANT [11] { value: 1 } - CONSTANT [12] { value: 2 } - } - } - } - } - CALL [13] { - function: _==_ - args: { - COMPREHENSION [14] { - iter_var: @it:1:0 - iter_range: { - IDENT [15] { - name: @index1 - } - } - accu_var: @ac:1:0 - accu_init: { - LIST [16] { - elements: { - } - } - } - loop_condition: { - CONSTANT [17] { value: true } - } - loop_step: { - CALL [18] { - function: _+_ - args: { - IDENT [19] { - name: @ac:1:0 - } - LIST [20] { - elements: { - COMPREHENSION [21] { - iter_var: @it:0:0 - iter_range: { - IDENT [22] { - name: @index1 - } - } - accu_var: @ac:0:0 - accu_init: { - LIST [23] { - elements: { - } - } - } - loop_condition: { - CONSTANT [24] { value: true } - } - loop_step: { - CALL [25] { - function: _+_ - args: { - IDENT [26] { - name: @ac:0:0 - } - LIST [27] { - elements: { - LIST [28] { - elements: { - CONSTANT [29] { value: 3 } - CONSTANT [30] { value: 4 } - } - } - } - } - } - } - } - result: { - IDENT [31] { - name: @ac:0:0 - } - } - } - } - } - } - } - } - result: { - IDENT [32] { - name: @ac:1:0 - } - } - } - LIST [33] { - elements: { - IDENT [34] { - name: @index0 - } - IDENT [35] { - name: @index0 - } - } - } - } - } - } -} -Test case: MACRO_ITER_VAR2_NOT_REFERENCED -Source: [1,2].transformList(i, v, [1, 2].transformList(i, v, [3,4])) == [[[3, 4], [3, 4]], [[3, 4], [3, 4]]] -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - LIST [3] { - elements: { - LIST [4] { - elements: { - CONSTANT [5] { value: 3 } - CONSTANT [6] { value: 4 } - } - } - LIST [7] { - elements: { - CONSTANT [8] { value: 3 } - CONSTANT [9] { value: 4 } - } - } - } - } - LIST [10] { - elements: { - CONSTANT [11] { value: 1 } - CONSTANT [12] { value: 2 } - } - } - } - } - CALL [13] { - function: _==_ - args: { - COMPREHENSION [14] { - iter_var: @it:1:0 - iter_var2: @it2:1:0 - iter_range: { - IDENT [15] { - name: @index1 - } - } - accu_var: @ac:1:0 - accu_init: { - LIST [16] { - elements: { - } - } - } - loop_condition: { - CONSTANT [17] { value: true } - } - loop_step: { - CALL [18] { - function: _+_ - args: { - IDENT [19] { - name: @ac:1:0 - } - LIST [20] { - elements: { - COMPREHENSION [21] { - iter_var: @it:0:0 - iter_var2: @it2:0:0 - iter_range: { - IDENT [22] { - name: @index1 - } - } - accu_var: @ac:0:0 - accu_init: { - LIST [23] { - elements: { - } - } - } - loop_condition: { - CONSTANT [24] { value: true } - } - loop_step: { - CALL [25] { - function: _+_ - args: { - IDENT [26] { - name: @ac:0:0 - } - LIST [27] { - elements: { - LIST [28] { - elements: { - CONSTANT [29] { value: 3 } - CONSTANT [30] { value: 4 } - } - } - } - } - } - } - } - result: { - IDENT [31] { - name: @ac:0:0 - } - } - } - } - } - } - } - } - result: { - IDENT [32] { - name: @ac:1:0 - } - } - } - LIST [33] { - elements: { - IDENT [34] { - name: @index0 - } - IDENT [35] { - name: @index0 - } - } - } - } - } - } -} -Test case: MACRO_SHADOWED_VARIABLE -Source: [x - 1 > 3 ? x - 1 : 5].exists(x, x - 1 > 3) || x - 1 > 3 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - CALL [3] { - function: _>_ - args: { - CALL [4] { - function: _-_ - args: { - IDENT [5] { - name: x - } - CONSTANT [6] { value: 1 } - } - } - CONSTANT [7] { value: 3 } - } - } - } - } - CALL [8] { - function: _||_ - args: { - COMPREHENSION [9] { - iter_var: @it:0:0 - iter_range: { - LIST [10] { - elements: { - CALL [11] { - function: _?_:_ - args: { - IDENT [12] { - name: @index0 - } - CALL [13] { - function: _-_ - args: { - IDENT [14] { - name: x - } - CONSTANT [15] { value: 1 } - } - } - CONSTANT [16] { value: 5 } - } - } - } - } - } - accu_var: @ac:0:0 - accu_init: { - CONSTANT [17] { value: false } - } - loop_condition: { - CALL [18] { - function: @not_strictly_false - args: { - CALL [19] { - function: !_ - args: { - IDENT [20] { - name: @ac:0:0 - } - } - } - } - } - } - loop_step: { - CALL [21] { - function: _||_ - args: { - IDENT [22] { - name: @ac:0:0 - } - CALL [23] { - function: _>_ - args: { - CALL [24] { - function: _-_ - args: { - IDENT [25] { - name: @it:0:0 - } - CONSTANT [26] { value: 1 } - } - } - CONSTANT [27] { value: 3 } - } - } - } - } - } - result: { - IDENT [28] { - name: @ac:0:0 - } - } - } - IDENT [29] { - name: @index0 - } - } - } - } -} -Test case: MACRO_SHADOWED_VARIABLE_2 -Source: ["foo", "bar"].map(x, [x + x, x + x]).map(x, [x + x, x + x]) -=====> -COMPREHENSION [35] { - iter_var: x - iter_range: { - COMPREHENSION [19] { - iter_var: x - iter_range: { - LIST [1] { - elements: { - CONSTANT [2] { value: "foo" } - CONSTANT [3] { value: "bar" } - } - } - } - accu_var: @result - accu_init: { - LIST [13] { - elements: { - } - } - } - loop_condition: { - CONSTANT [14] { value: true } - } - loop_step: { - CALL [17] { - function: _+_ - args: { - IDENT [15] { - name: @result - } - LIST [16] { - elements: { - LIST [6] { - elements: { - CALL [8] { - function: _+_ - args: { - IDENT [7] { - name: x - } - IDENT [9] { - name: x - } - } - } - CALL [11] { - function: _+_ - args: { - IDENT [10] { - name: x - } - IDENT [12] { - name: x - } - } - } - } - } - } - } - } - } - } - result: { - IDENT [18] { - name: @result - } - } - } - } - accu_var: @result - accu_init: { - LIST [29] { - elements: { - } - } - } - loop_condition: { - CONSTANT [30] { value: true } - } - loop_step: { - CALL [33] { - function: _+_ - args: { - IDENT [31] { - name: @result - } - LIST [32] { - elements: { - LIST [22] { - elements: { - CALL [24] { - function: _+_ - args: { - IDENT [23] { - name: x - } - IDENT [25] { - name: x - } - } - } - CALL [27] { - function: _+_ - args: { - IDENT [26] { - name: x - } - IDENT [28] { - name: x - } - } - } - } - } - } - } - } - } - } - result: { - IDENT [34] { - name: @result - } - } -} -Test case: MACRO_SHADOWED_VARIABLE_COMP_V2_1 -Source: [x - y - 1 > 3 ? x - y - 1 : 5].exists(x, y, x - y - 1 > 3) || x - y - 1 > 3 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - CALL [3] { - function: _>_ - args: { - CALL [4] { - function: _-_ - args: { - CALL [5] { - function: _-_ - args: { - IDENT [6] { - name: x - } - IDENT [7] { - name: y - } - } - } - CONSTANT [8] { value: 1 } - } - } - CONSTANT [9] { value: 3 } - } - } - } - } - CALL [10] { - function: _||_ - args: { - COMPREHENSION [11] { - iter_var: @it:0:0 - iter_var2: @it2:0:0 - iter_range: { - LIST [12] { - elements: { - CALL [13] { - function: _?_:_ - args: { - IDENT [14] { - name: @index0 - } - CALL [15] { - function: _-_ - args: { - CALL [16] { - function: _-_ - args: { - IDENT [17] { - name: x - } - IDENT [18] { - name: y - } - } - } - CONSTANT [19] { value: 1 } - } - } - CONSTANT [20] { value: 5 } - } - } - } - } - } - accu_var: @ac:0:0 - accu_init: { - CONSTANT [21] { value: false } - } - loop_condition: { - CALL [22] { - function: @not_strictly_false - args: { - CALL [23] { - function: !_ - args: { - IDENT [24] { - name: @ac:0:0 - } - } - } - } - } - } - loop_step: { - CALL [25] { - function: _||_ - args: { - IDENT [26] { - name: @ac:0:0 - } - CALL [27] { - function: _>_ - args: { - CALL [28] { - function: _-_ - args: { - CALL [29] { - function: _-_ - args: { - IDENT [30] { - name: @it:0:0 - } - IDENT [31] { - name: @it2:0:0 - } - } - } - CONSTANT [32] { value: 1 } - } - } - CONSTANT [33] { value: 3 } - } - } - } - } - } - result: { - IDENT [34] { - name: @ac:0:0 - } - } - } - IDENT [35] { - name: @index0 - } - } - } - } -} -Test case: MACRO_SHADOWED_VARIABLE_COMP_V2_2 -Source: ["foo", "bar"].transformMap(x, y, [x + x, y + y]).transformMap(x, y, [x + x, y + y]) -=====> -COMPREHENSION [35] { - iter_var: x - iter_var2: y - iter_range: { - COMPREHENSION [19] { - iter_var: x - iter_var2: y - iter_range: { - LIST [1] { - elements: { - CONSTANT [2] { value: "foo" } - CONSTANT [3] { value: "bar" } - } - } - } - accu_var: @result - accu_init: { - MAP [14] { - - } - } - loop_condition: { - CONSTANT [15] { value: true } - } - loop_step: { - CALL [17] { - function: cel.@mapInsert - args: { - IDENT [16] { - name: @result - } - IDENT [5] { - name: x - } - LIST [7] { - elements: { - CALL [9] { - function: _+_ - args: { - IDENT [8] { - name: x - } - IDENT [10] { - name: x - } - } - } - CALL [12] { - function: _+_ - args: { - IDENT [11] { - name: y - } - IDENT [13] { - name: y - } - } - } - } - } - } - } - } - result: { - IDENT [18] { - name: @result - } - } - } - } - accu_var: @result - accu_init: { - MAP [30] { - - } - } - loop_condition: { - CONSTANT [31] { value: true } - } - loop_step: { - CALL [33] { - function: cel.@mapInsert - args: { - IDENT [32] { - name: @result - } - IDENT [21] { - name: x - } - LIST [23] { - elements: { - CALL [25] { - function: _+_ - args: { - IDENT [24] { - name: x - } - IDENT [26] { - name: x - } - } - } - CALL [28] { - function: _+_ - args: { - IDENT [27] { - name: y - } - IDENT [29] { - name: y - } - } - } - } - } - } - } - } - result: { - IDENT [34] { - name: @result - } - } -} -Test case: PRESENCE_TEST -Source: has({'a': true}.a) && {'a':true}['a'] -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - MAP [3] { - MAP_ENTRY [4] { - key: { - CONSTANT [5] { value: "a" } - } - value: { - CONSTANT [6] { value: true } - } - } - } - } - } - CALL [7] { - function: _&&_ - args: { - SELECT [8] { - IDENT [9] { - name: @index0 - }.a~presence_test - } - CALL [10] { - function: _[_] - args: { - IDENT [11] { - name: @index0 - } - CONSTANT [12] { value: "a" } - } - } - } - } - } -} -Test case: PRESENCE_TEST_2 -Source: has({'a': true}.a) && has({'a': true}.a) -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - SELECT [3] { - MAP [4] { - MAP_ENTRY [5] { - key: { - CONSTANT [6] { value: "a" } - } - value: { - CONSTANT [7] { value: true } - } - } - }.a~presence_test - } - } - } - CALL [8] { - function: _&&_ - args: { - IDENT [9] { - name: @index0 - } - IDENT [10] { - name: @index0 - } - } - } - } -} -Test case: PRESENCE_TEST_WITH_TERNARY -Source: (has(msg.oneof_type.payload) ? msg.oneof_type.payload.single_int64 : 0) == 10 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - SELECT [3] { - IDENT [4] { - name: msg - }.oneof_type - } - } - } - CALL [5] { - function: _==_ - args: { - CALL [6] { - function: _?_:_ - args: { - SELECT [7] { - IDENT [8] { - name: @index0 - }.payload~presence_test - } - SELECT [9] { - SELECT [10] { - IDENT [11] { - name: @index0 - }.payload - }.single_int64 - } - CONSTANT [12] { value: 0 } - } - } - CONSTANT [13] { value: 10 } - } - } - } -} -Test case: PRESENCE_TEST_WITH_TERNARY_2 -Source: (has(msg.oneof_type.payload) ? msg.oneof_type.payload.single_int64 : msg.oneof_type.payload.single_int64 * 0) == 10 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - SELECT [3] { - SELECT [4] { - SELECT [5] { - IDENT [6] { - name: msg - }.oneof_type - }.payload - }.single_int64 - } - } - } - CALL [7] { - function: _==_ - args: { - CALL [8] { - function: _?_:_ - args: { - SELECT [9] { - SELECT [10] { - IDENT [11] { - name: msg - }.oneof_type - }.payload~presence_test - } - IDENT [12] { - name: @index0 - } - CALL [13] { - function: _*_ - args: { - IDENT [14] { - name: @index0 - } - CONSTANT [15] { value: 0 } - } - } - } - } - CONSTANT [16] { value: 10 } - } - } - } -} -Test case: PRESENCE_TEST_WITH_TERNARY_3 -Source: (has(msg.oneof_type.payload.single_int64) ? msg.oneof_type.payload.single_int64 : msg.oneof_type.payload.single_int64 * 0) == 10 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - SELECT [3] { - SELECT [4] { - SELECT [5] { - IDENT [6] { - name: msg - }.oneof_type - }.payload - }.single_int64 - } - } - } - CALL [7] { - function: _==_ - args: { - CALL [8] { - function: _?_:_ - args: { - SELECT [9] { - SELECT [10] { - SELECT [11] { - IDENT [12] { - name: msg - }.oneof_type - }.payload - }.single_int64~presence_test - } - IDENT [13] { - name: @index0 - } - CALL [14] { - function: _*_ - args: { - IDENT [15] { - name: @index0 - } - CONSTANT [16] { value: 0 } - } - } - } - } - CONSTANT [17] { value: 10 } - } - } - } -} -Test case: PRESENCE_TEST_WITH_TERNARY_NESTED -Source: (has(msg.oneof_type) && has(msg.oneof_type.payload) && has(msg.oneof_type.payload.single_int64)) ? ((has(msg.oneof_type.payload.map_string_string) && has(msg.oneof_type.payload.map_string_string.key)) ? msg.oneof_type.payload.map_string_string.key == 'A' : false) : false -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - SELECT [3] { - SELECT [4] { - SELECT [5] { - IDENT [6] { - name: msg - }.oneof_type - }.payload - }.map_string_string - } - SELECT [7] { - SELECT [8] { - IDENT [9] { - name: msg - }.oneof_type - }.payload - } - } - } - CALL [10] { - function: _?_:_ - args: { - CALL [11] { - function: _&&_ - args: { - CALL [12] { - function: _&&_ - args: { - SELECT [13] { - IDENT [14] { - name: msg - }.oneof_type~presence_test - } - SELECT [15] { - SELECT [16] { - IDENT [17] { - name: msg - }.oneof_type - }.payload~presence_test - } - } - } - SELECT [18] { - IDENT [19] { - name: @index1 - }.single_int64~presence_test - } - } - } - CALL [20] { - function: _?_:_ - args: { - CALL [21] { - function: _&&_ - args: { - SELECT [22] { - IDENT [23] { - name: @index1 - }.map_string_string~presence_test - } - SELECT [24] { - IDENT [25] { - name: @index0 - }.key~presence_test - } - } - } - CALL [26] { - function: _==_ - args: { - SELECT [27] { - IDENT [28] { - name: @index0 - }.key - } - CONSTANT [29] { value: "A" } - } - } - CONSTANT [30] { value: false } - } - } - CONSTANT [31] { value: false } - } - } - } -} -Test case: OPTIONAL_LIST -Source: [10, ?optional.none(), [?optional.none(), ?opt_x], [?optional.none(), ?opt_x]] == [10, [5], [5]] -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - LIST [3] { - elements: { - CALL [4] { - function: optional.none - args: { - } - } - IDENT [5] { - name: opt_x - } - } - optional_indices: [0, 1] - } - LIST [6] { - elements: { - CONSTANT [7] { value: 5 } - } - } - } - } - CALL [8] { - function: _==_ - args: { - LIST [9] { - elements: { - CONSTANT [10] { value: 10 } - CALL [11] { - function: optional.none - args: { - } - } - IDENT [12] { - name: @index0 - } - IDENT [13] { - name: @index0 - } - } - optional_indices: [0] - } - LIST [14] { - elements: { - CONSTANT [15] { value: 10 } - IDENT [16] { - name: @index1 - } - IDENT [17] { - name: @index1 - } - } - } - } - } - } -} -Test case: OPTIONAL_MAP -Source: {?'hello': optional.of('hello')}['hello'] + {?'hello': optional.of('hello')}['hello'] == 'hellohello' -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - CALL [3] { - function: _[_] - args: { - MAP [4] { - MAP_ENTRY [5] { - key: { - CONSTANT [6] { value: "hello" } - } - optional_entry: true - value: { - CALL [7] { - function: optional.of - args: { - CONSTANT [8] { value: "hello" } - } - } - } - } - } - CONSTANT [9] { value: "hello" } - } - } - } - } - CALL [10] { - function: _==_ - args: { - CALL [11] { - function: _+_ - args: { - IDENT [12] { - name: @index0 - } - IDENT [13] { - name: @index0 - } - } - } - CONSTANT [14] { value: "hellohello" } - } - } - } -} -Test case: OPTIONAL_MAP_CHAINED -Source: {?'key': optional.of('test')}[?'bogus'].or({'key': 'test'}[?'bogus']).orValue({'key': 'test'}['key']) == 'test' -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - MAP [3] { - MAP_ENTRY [4] { - key: { - CONSTANT [5] { value: "key" } - } - value: { - CONSTANT [6] { value: "test" } - } - } - } - } - } - CALL [7] { - function: _==_ - args: { - CALL [8] { - function: orValue - target: { - CALL [9] { - function: or - target: { - CALL [10] { - function: _[?_] - args: { - MAP [11] { - MAP_ENTRY [12] { - key: { - CONSTANT [13] { value: "key" } - } - optional_entry: true - value: { - CALL [14] { - function: optional.of - args: { - CONSTANT [15] { value: "test" } - } - } - } - } - } - CONSTANT [16] { value: "bogus" } - } - } - } - args: { - CALL [17] { - function: _[?_] - args: { - IDENT [18] { - name: @index0 - } - CONSTANT [19] { value: "bogus" } - } - } - } - } - } - args: { - CALL [20] { - function: _[_] - args: { - IDENT [21] { - name: @index0 - } - CONSTANT [22] { value: "key" } - } - } - } - } - CONSTANT [23] { value: "test" } - } - } - } -} -Test case: OPTIONAL_MESSAGE -Source: TestAllTypes{?single_int64: optional.ofNonZeroValue(1), ?single_int32: optional.of(4)}.single_int32 + TestAllTypes{?single_int64: optional.ofNonZeroValue(1), ?single_int32: optional.of(4)}.single_int64 == 5 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - STRUCT [3] { - name: cel.expr.conformance.proto3.TestAllTypes - entries: { - ENTRY [4] { - field_key: single_int64 - optional_entry: true - value: { - CALL [5] { - function: optional.ofNonZeroValue - args: { - CONSTANT [6] { value: 1 } - } - } - } - } - ENTRY [7] { - field_key: single_int32 - optional_entry: true - value: { - CALL [8] { - function: optional.of - args: { - CONSTANT [9] { value: 4 } - } - } - } - } - } - } - } - } - CALL [10] { - function: _==_ - args: { - CALL [11] { - function: _+_ - args: { - SELECT [12] { - IDENT [13] { - name: @index0 - }.single_int32 - } - SELECT [14] { - IDENT [15] { - name: @index0 - }.single_int64 - } - } - } - CONSTANT [16] { value: 5 } - } - } - } -} -Test case: CALL -Source: ('h' + 'e' + 'l' + 'l' + 'o' + ' world').matches('h' + 'e' + 'l' + 'l' + 'o') -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - CALL [3] { - function: _+_ - args: { - CALL [4] { - function: _+_ - args: { - CALL [5] { - function: _+_ - args: { - CALL [6] { - function: _+_ - args: { - CONSTANT [7] { value: "h" } - CONSTANT [8] { value: "e" } - } - } - CONSTANT [9] { value: "l" } - } - } - CONSTANT [10] { value: "l" } - } - } - CONSTANT [11] { value: "o" } - } - } - } - } - CALL [12] { - function: matches - target: { - CALL [13] { - function: _+_ - args: { - IDENT [14] { - name: @index0 - } - CONSTANT [15] { value: " world" } - } - } - } - args: { - IDENT [16] { - name: @index0 - } - } - } - } -} -Test case: CALL_ARGUMENT_NESTED_NO_COMMON_SUBEXPR -Source: 'hello world'.matches('h' + 'e' + 'l' + 'l' + 'o') -=====> -CALL [2] { - function: matches - target: { - CONSTANT [1] { value: "hello world" } - } - args: { - CALL [10] { - function: _+_ - args: { - CALL [8] { - function: _+_ - args: { - CALL [6] { - function: _+_ - args: { - CALL [4] { - function: _+_ - args: { - CONSTANT [3] { value: "h" } - CONSTANT [5] { value: "e" } - } - } - CONSTANT [7] { value: "l" } - } - } - CONSTANT [9] { value: "l" } - } - } - CONSTANT [11] { value: "o" } - } - } - } -} -Test case: CALL_TARGET_NESTED_NO_COMMON_SUBEXPR -Source: ('h' + 'e' + 'l' + 'l' + 'o' + ' world').matches('hello') -=====> -CALL [12] { - function: matches - target: { - CALL [10] { - function: _+_ - args: { - CALL [8] { - function: _+_ - args: { - CALL [6] { - function: _+_ - args: { - CALL [4] { - function: _+_ - args: { - CALL [2] { - function: _+_ - args: { - CONSTANT [1] { value: "h" } - CONSTANT [3] { value: "e" } - } - } - CONSTANT [5] { value: "l" } - } - } - CONSTANT [7] { value: "l" } - } - } - CONSTANT [9] { value: "o" } - } - } - CONSTANT [11] { value: " world" } - } - } - } - args: { - CONSTANT [13] { value: "hello" } - } -} -Test case: CALL_BOTH_ARGUMENT_TARGET_NESTED_NO_COMMON_SUBEXPR -Source: ('h' + 'e' + 'l' + 'l' + 'o' + ' world').matches('w' + 'o' + 'r' + 'l' + 'd') -=====> -CALL [12] { - function: matches - target: { - CALL [10] { - function: _+_ - args: { - CALL [8] { - function: _+_ - args: { - CALL [6] { - function: _+_ - args: { - CALL [4] { - function: _+_ - args: { - CALL [2] { - function: _+_ - args: { - CONSTANT [1] { value: "h" } - CONSTANT [3] { value: "e" } - } - } - CONSTANT [5] { value: "l" } - } - } - CONSTANT [7] { value: "l" } - } - } - CONSTANT [9] { value: "o" } - } - } - CONSTANT [11] { value: " world" } - } - } - } - args: { - CALL [20] { - function: _+_ - args: { - CALL [18] { - function: _+_ - args: { - CALL [16] { - function: _+_ - args: { - CALL [14] { - function: _+_ - args: { - CONSTANT [13] { value: "w" } - CONSTANT [15] { value: "o" } - } - } - CONSTANT [17] { value: "r" } - } - } - CONSTANT [19] { value: "l" } - } - } - CONSTANT [21] { value: "d" } - } - } - } -} -Test case: CUSTOM_FUNCTION_INELIMINABLE -Source: non_pure_custom_func(msg.oneof_type.payload.single_int64) + non_pure_custom_func(msg.oneof_type.payload.single_int32) + non_pure_custom_func(msg.oneof_type.payload.single_int64) + non_pure_custom_func(msg.single_int64) -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - SELECT [3] { - SELECT [4] { - SELECT [5] { - IDENT [6] { - name: msg - }.oneof_type - }.payload - }.single_int64 - } - } - } - CALL [7] { - function: _+_ - args: { - CALL [8] { - function: _+_ - args: { - CALL [9] { - function: _+_ - args: { - CALL [10] { - function: non_pure_custom_func - args: { - IDENT [11] { - name: @index0 - } - } - } - CALL [12] { - function: non_pure_custom_func - args: { - SELECT [13] { - SELECT [14] { - SELECT [15] { - IDENT [16] { - name: msg - }.oneof_type - }.payload - }.single_int32 - } - } - } - } - } - CALL [17] { - function: non_pure_custom_func - args: { - IDENT [18] { - name: @index0 - } - } - } - } - } - CALL [19] { - function: non_pure_custom_func - args: { - SELECT [20] { - IDENT [21] { - name: msg - }.single_int64 - } - } - } - } - } - } -} -Test case: CUSTOM_FUNCTION_ELIMINABLE -Source: pure_custom_func(msg.oneof_type.payload.single_int64) + pure_custom_func(msg.oneof_type.payload.single_int32) + pure_custom_func(msg.oneof_type.payload.single_int64) + pure_custom_func(msg.single_int64) -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - CALL [3] { - function: pure_custom_func - args: { - SELECT [4] { - SELECT [5] { - SELECT [6] { - IDENT [7] { - name: msg - }.oneof_type - }.payload - }.single_int64 - } - } - } - } - } - CALL [8] { - function: _+_ - args: { - CALL [9] { - function: _+_ - args: { - CALL [10] { - function: _+_ - args: { - IDENT [11] { - name: @index0 - } - CALL [12] { - function: pure_custom_func - args: { - SELECT [13] { - SELECT [14] { - SELECT [15] { - IDENT [16] { - name: msg - }.oneof_type - }.payload - }.single_int32 - } - } - } - } - } - IDENT [17] { - name: @index0 - } - } - } - CALL [18] { - function: pure_custom_func - args: { - SELECT [19] { - IDENT [20] { - name: msg - }.single_int64 - } - } - } - } - } - } -} \ No newline at end of file diff --git a/optimizer/src/test/resources/subexpression_ast_block_recursion_depth_8.baseline b/optimizer/src/test/resources/subexpression_ast_block_recursion_depth_8.baseline deleted file mode 100644 index bd1fa8d45..000000000 --- a/optimizer/src/test/resources/subexpression_ast_block_recursion_depth_8.baseline +++ /dev/null @@ -1,4814 +0,0 @@ -Test case: SIZE_1 -Source: size([1,2]) + size([1,2]) + 1 == 5 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - CALL [3] { - function: size - args: { - LIST [4] { - elements: { - CONSTANT [5] { value: 1 } - CONSTANT [6] { value: 2 } - } - } - } - } - } - } - CALL [7] { - function: _==_ - args: { - CALL [8] { - function: _+_ - args: { - CALL [9] { - function: _+_ - args: { - IDENT [10] { - name: @index0 - } - IDENT [11] { - name: @index0 - } - } - } - CONSTANT [12] { value: 1 } - } - } - CONSTANT [13] { value: 5 } - } - } - } -} -Test case: SIZE_2 -Source: 2 + size([1,2]) + size([1,2]) + 1 == 7 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - CALL [3] { - function: size - args: { - LIST [4] { - elements: { - CONSTANT [5] { value: 1 } - CONSTANT [6] { value: 2 } - } - } - } - } - } - } - CALL [7] { - function: _==_ - args: { - CALL [8] { - function: _+_ - args: { - CALL [9] { - function: _+_ - args: { - CALL [10] { - function: _+_ - args: { - CONSTANT [11] { value: 2 } - IDENT [12] { - name: @index0 - } - } - } - IDENT [13] { - name: @index0 - } - } - } - CONSTANT [14] { value: 1 } - } - } - CONSTANT [15] { value: 7 } - } - } - } -} -Test case: SIZE_3 -Source: size([0]) + size([0]) + size([1,2]) + size([1,2]) == 6 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - CALL [3] { - function: size - args: { - LIST [4] { - elements: { - CONSTANT [5] { value: 0 } - } - } - } - } - CALL [6] { - function: size - args: { - LIST [7] { - elements: { - CONSTANT [8] { value: 1 } - CONSTANT [9] { value: 2 } - } - } - } - } - } - } - CALL [10] { - function: _==_ - args: { - CALL [11] { - function: _+_ - args: { - CALL [12] { - function: _+_ - args: { - CALL [13] { - function: _+_ - args: { - IDENT [14] { - name: @index0 - } - IDENT [15] { - name: @index0 - } - } - } - IDENT [16] { - name: @index1 - } - } - } - IDENT [17] { - name: @index1 - } - } - } - CONSTANT [18] { value: 6 } - } - } - } -} -Test case: SIZE_4 -Source: 5 + size([0]) + size([0]) + size([1,2]) + size([1,2]) + size([1,2,3]) + size([1,2,3]) == 17 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - CALL [3] { - function: size - args: { - LIST [4] { - elements: { - CONSTANT [5] { value: 0 } - } - } - } - } - CALL [6] { - function: size - args: { - LIST [7] { - elements: { - CONSTANT [8] { value: 1 } - CONSTANT [9] { value: 2 } - } - } - } - } - CALL [10] { - function: size - args: { - LIST [11] { - elements: { - CONSTANT [12] { value: 1 } - CONSTANT [13] { value: 2 } - CONSTANT [14] { value: 3 } - } - } - } - } - } - } - CALL [15] { - function: _==_ - args: { - CALL [16] { - function: _+_ - args: { - CALL [17] { - function: _+_ - args: { - CALL [18] { - function: _+_ - args: { - CALL [19] { - function: _+_ - args: { - CALL [20] { - function: _+_ - args: { - CALL [21] { - function: _+_ - args: { - CONSTANT [22] { value: 5 } - IDENT [23] { - name: @index0 - } - } - } - IDENT [24] { - name: @index0 - } - } - } - IDENT [25] { - name: @index1 - } - } - } - IDENT [26] { - name: @index1 - } - } - } - IDENT [27] { - name: @index2 - } - } - } - IDENT [28] { - name: @index2 - } - } - } - CONSTANT [29] { value: 17 } - } - } - } -} -Test case: TIMESTAMP -Source: timestamp(int(timestamp(1000000000))).getFullYear() + timestamp(int(timestamp(75))).getFullYear() + timestamp(int(timestamp(50))).getFullYear() + timestamp(int(timestamp(1000000000))).getFullYear() + timestamp(int(timestamp(50))).getSeconds() + timestamp(int(timestamp(200))).getFullYear() + timestamp(int(timestamp(200))).getFullYear() + timestamp(int(timestamp(75))).getMinutes() + timestamp(int(timestamp(1000000000))).getFullYear() == 13934 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - CALL [3] { - function: getFullYear - target: { - CALL [4] { - function: timestamp - args: { - CALL [5] { - function: int - args: { - CALL [6] { - function: timestamp - args: { - CONSTANT [7] { value: 1000000000 } - } - } - } - } - } - } - } - args: { - } - } - CALL [8] { - function: getFullYear - target: { - CALL [9] { - function: timestamp - args: { - CALL [10] { - function: int - args: { - CALL [11] { - function: timestamp - args: { - CONSTANT [12] { value: 200 } - } - } - } - } - } - } - } - args: { - } - } - CALL [13] { - function: timestamp - args: { - CALL [14] { - function: int - args: { - CALL [15] { - function: timestamp - args: { - CONSTANT [16] { value: 50 } - } - } - } - } - } - } - CALL [17] { - function: timestamp - args: { - CALL [18] { - function: int - args: { - CALL [19] { - function: timestamp - args: { - CONSTANT [20] { value: 75 } - } - } - } - } - } - } - CALL [21] { - function: _+_ - args: { - CALL [22] { - function: _+_ - args: { - CALL [23] { - function: _+_ - args: { - CALL [24] { - function: _+_ - args: { - CALL [25] { - function: _+_ - args: { - CALL [26] { - function: _+_ - args: { - CALL [27] { - function: _+_ - args: { - IDENT [28] { - name: @index0 - } - CALL [29] { - function: getFullYear - target: { - IDENT [30] { - name: @index3 - } - } - args: { - } - } - } - } - CALL [31] { - function: getFullYear - target: { - IDENT [32] { - name: @index2 - } - } - args: { - } - } - } - } - IDENT [33] { - name: @index0 - } - } - } - CALL [34] { - function: getSeconds - target: { - IDENT [35] { - name: @index2 - } - } - args: { - } - } - } - } - IDENT [36] { - name: @index1 - } - } - } - IDENT [37] { - name: @index1 - } - } - } - CALL [38] { - function: getMinutes - target: { - IDENT [39] { - name: @index3 - } - } - args: { - } - } - } - } - } - } - CALL [40] { - function: _==_ - args: { - CALL [41] { - function: _+_ - args: { - IDENT [42] { - name: @index4 - } - IDENT [43] { - name: @index0 - } - } - } - CONSTANT [44] { value: 13934 } - } - } - } -} -Test case: MAP_INDEX -Source: {"a": 2}["a"] + {"a": 2}["a"] * {"a": 2}["a"] == 6 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - CALL [3] { - function: _[_] - args: { - MAP [4] { - MAP_ENTRY [5] { - key: { - CONSTANT [6] { value: "a" } - } - value: { - CONSTANT [7] { value: 2 } - } - } - } - CONSTANT [8] { value: "a" } - } - } - } - } - CALL [9] { - function: _==_ - args: { - CALL [10] { - function: _+_ - args: { - IDENT [11] { - name: @index0 - } - CALL [12] { - function: _*_ - args: { - IDENT [13] { - name: @index0 - } - IDENT [14] { - name: @index0 - } - } - } - } - } - CONSTANT [15] { value: 6 } - } - } - } -} -Test case: NESTED_MAP_CONSTRUCTION -Source: {'a': {'b': 1}, 'c': {'b': 1}, 'd': {'e': {'b': 1}}, 'e': {'e': {'b': 1}}} -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - MAP [3] { - MAP_ENTRY [4] { - key: { - CONSTANT [5] { value: "e" } - } - value: { - MAP [6] { - MAP_ENTRY [7] { - key: { - CONSTANT [8] { value: "b" } - } - value: { - CONSTANT [9] { value: 1 } - } - } - } - } - } - } - MAP [10] { - MAP_ENTRY [11] { - key: { - CONSTANT [12] { value: "b" } - } - value: { - CONSTANT [13] { value: 1 } - } - } - } - } - } - MAP [14] { - MAP_ENTRY [15] { - key: { - CONSTANT [16] { value: "a" } - } - value: { - IDENT [17] { - name: @index1 - } - } - } - MAP_ENTRY [18] { - key: { - CONSTANT [19] { value: "c" } - } - value: { - IDENT [20] { - name: @index1 - } - } - } - MAP_ENTRY [21] { - key: { - CONSTANT [22] { value: "d" } - } - value: { - IDENT [23] { - name: @index0 - } - } - } - MAP_ENTRY [24] { - key: { - CONSTANT [25] { value: "e" } - } - value: { - IDENT [26] { - name: @index0 - } - } - } - } - } -} -Test case: NESTED_LIST_CONSTRUCTION -Source: [1, [1,2,3,4], 2, [1,2,3,4], 5, [1,2,3,4], 7, [[1,2], [1,2,3,4]], [1,2]] -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - LIST [3] { - elements: { - CONSTANT [4] { value: 1 } - CONSTANT [5] { value: 2 } - CONSTANT [6] { value: 3 } - CONSTANT [7] { value: 4 } - } - } - LIST [8] { - elements: { - CONSTANT [9] { value: 1 } - CONSTANT [10] { value: 2 } - } - } - } - } - LIST [11] { - elements: { - CONSTANT [12] { value: 1 } - IDENT [13] { - name: @index0 - } - CONSTANT [14] { value: 2 } - IDENT [15] { - name: @index0 - } - CONSTANT [16] { value: 5 } - IDENT [17] { - name: @index0 - } - CONSTANT [18] { value: 7 } - LIST [19] { - elements: { - IDENT [20] { - name: @index1 - } - IDENT [21] { - name: @index0 - } - } - } - IDENT [22] { - name: @index1 - } - } - } - } -} -Test case: SELECT -Source: msg.single_int64 + msg.single_int64 == 6 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - SELECT [3] { - IDENT [4] { - name: msg - }.single_int64 - } - } - } - CALL [5] { - function: _==_ - args: { - CALL [6] { - function: _+_ - args: { - IDENT [7] { - name: @index0 - } - IDENT [8] { - name: @index0 - } - } - } - CONSTANT [9] { value: 6 } - } - } - } -} -Test case: SELECT_NESTED_1 -Source: msg.oneof_type.payload.single_int64 + msg.oneof_type.payload.single_int32 + msg.oneof_type.payload.single_int64 + msg.single_int64 + msg.oneof_type.payload.oneof_type.payload.single_int64 == 31 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - SELECT [3] { - SELECT [4] { - SELECT [5] { - IDENT [6] { - name: msg - }.oneof_type - }.payload - }.single_int64 - } - SELECT [7] { - SELECT [8] { - IDENT [9] { - name: msg - }.oneof_type - }.payload - } - } - } - CALL [10] { - function: _==_ - args: { - CALL [11] { - function: _+_ - args: { - CALL [12] { - function: _+_ - args: { - CALL [13] { - function: _+_ - args: { - CALL [14] { - function: _+_ - args: { - IDENT [15] { - name: @index0 - } - SELECT [16] { - IDENT [17] { - name: @index1 - }.single_int32 - } - } - } - IDENT [18] { - name: @index0 - } - } - } - SELECT [19] { - IDENT [20] { - name: msg - }.single_int64 - } - } - } - SELECT [21] { - SELECT [22] { - SELECT [23] { - IDENT [24] { - name: @index1 - }.oneof_type - }.payload - }.single_int64 - } - } - } - CONSTANT [25] { value: 31 } - } - } - } -} -Test case: SELECT_NESTED_2 -Source: true || msg.oneof_type.payload.oneof_type.payload.oneof_type.payload.oneof_type.payload.single_bool || msg.oneof_type.payload.oneof_type.payload.oneof_type.child.child.payload.single_bool -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - SELECT [3] { - SELECT [4] { - SELECT [5] { - SELECT [6] { - SELECT [7] { - IDENT [8] { - name: msg - }.oneof_type - }.payload - }.oneof_type - }.payload - }.oneof_type - } - } - } - CALL [9] { - function: _||_ - args: { - CALL [10] { - function: _||_ - args: { - CONSTANT [11] { value: true } - SELECT [12] { - SELECT [13] { - SELECT [14] { - SELECT [15] { - IDENT [16] { - name: @index0 - }.payload - }.oneof_type - }.payload - }.single_bool - } - } - } - SELECT [17] { - SELECT [18] { - SELECT [19] { - SELECT [20] { - IDENT [21] { - name: @index0 - }.child - }.child - }.payload - }.single_bool - } - } - } - } -} -Test case: SELECT_NESTED_MESSAGE_MAP_INDEX_1 -Source: msg.oneof_type.payload.map_int32_int64[1] + msg.oneof_type.payload.map_int32_int64[1] + msg.oneof_type.payload.map_int32_int64[1] == 15 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - CALL [3] { - function: _[_] - args: { - SELECT [4] { - SELECT [5] { - SELECT [6] { - IDENT [7] { - name: msg - }.oneof_type - }.payload - }.map_int32_int64 - } - CONSTANT [8] { value: 1 } - } - } - } - } - CALL [9] { - function: _==_ - args: { - CALL [10] { - function: _+_ - args: { - CALL [11] { - function: _+_ - args: { - IDENT [12] { - name: @index0 - } - IDENT [13] { - name: @index0 - } - } - } - IDENT [14] { - name: @index0 - } - } - } - CONSTANT [15] { value: 15 } - } - } - } -} -Test case: SELECT_NESTED_MESSAGE_MAP_INDEX_2 -Source: msg.oneof_type.payload.map_int32_int64[0] + msg.oneof_type.payload.map_int32_int64[1] + msg.oneof_type.payload.map_int32_int64[2] == 8 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - SELECT [3] { - SELECT [4] { - SELECT [5] { - IDENT [6] { - name: msg - }.oneof_type - }.payload - }.map_int32_int64 - } - } - } - CALL [7] { - function: _==_ - args: { - CALL [8] { - function: _+_ - args: { - CALL [9] { - function: _+_ - args: { - CALL [10] { - function: _[_] - args: { - IDENT [11] { - name: @index0 - } - CONSTANT [12] { value: 0 } - } - } - CALL [13] { - function: _[_] - args: { - IDENT [14] { - name: @index0 - } - CONSTANT [15] { value: 1 } - } - } - } - } - CALL [16] { - function: _[_] - args: { - IDENT [17] { - name: @index0 - } - CONSTANT [18] { value: 2 } - } - } - } - } - CONSTANT [19] { value: 8 } - } - } - } -} -Test case: SELECT_NESTED_NO_COMMON_SUBEXPR -Source: msg.oneof_type.payload.oneof_type.payload.oneof_type.payload.oneof_type.payload.single_int64 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - SELECT [3] { - SELECT [4] { - SELECT [5] { - SELECT [6] { - SELECT [7] { - SELECT [8] { - SELECT [9] { - SELECT [10] { - IDENT [11] { - name: msg - }.oneof_type - }.payload - }.oneof_type - }.payload - }.oneof_type - }.payload - }.oneof_type - }.payload - } - } - } - SELECT [12] { - IDENT [13] { - name: @index0 - }.single_int64 - } - } -} -Test case: TERNARY -Source: (msg.single_int64 > 0 ? msg.single_int64 : 0) == 3 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - SELECT [3] { - IDENT [4] { - name: msg - }.single_int64 - } - } - } - CALL [5] { - function: _==_ - args: { - CALL [6] { - function: _?_:_ - args: { - CALL [7] { - function: _>_ - args: { - IDENT [8] { - name: @index0 - } - CONSTANT [9] { value: 0 } - } - } - IDENT [10] { - name: @index0 - } - CONSTANT [11] { value: 0 } - } - } - CONSTANT [12] { value: 3 } - } - } - } -} -Test case: TERNARY_BIND_RHS_ONLY -Source: false ? false : (msg.single_int64) + ((msg.single_int64 + 1) * 2) == 11 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - SELECT [3] { - IDENT [4] { - name: msg - }.single_int64 - } - } - } - CALL [5] { - function: _?_:_ - args: { - CONSTANT [6] { value: false } - CONSTANT [7] { value: false } - CALL [8] { - function: _==_ - args: { - CALL [9] { - function: _+_ - args: { - IDENT [10] { - name: @index0 - } - CALL [11] { - function: _*_ - args: { - CALL [12] { - function: _+_ - args: { - IDENT [13] { - name: @index0 - } - CONSTANT [14] { value: 1 } - } - } - CONSTANT [15] { value: 2 } - } - } - } - } - CONSTANT [16] { value: 11 } - } - } - } - } - } -} -Test case: NESTED_TERNARY -Source: (msg.single_int64 > 0 ? (msg.single_int32 > 0 ? msg.single_int64 + msg.single_int32 : 0) : 0) == 8 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - SELECT [3] { - IDENT [4] { - name: msg - }.single_int64 - } - SELECT [5] { - IDENT [6] { - name: msg - }.single_int32 - } - } - } - CALL [7] { - function: _==_ - args: { - CALL [8] { - function: _?_:_ - args: { - CALL [9] { - function: _>_ - args: { - IDENT [10] { - name: @index0 - } - CONSTANT [11] { value: 0 } - } - } - CALL [12] { - function: _?_:_ - args: { - CALL [13] { - function: _>_ - args: { - IDENT [14] { - name: @index1 - } - CONSTANT [15] { value: 0 } - } - } - CALL [16] { - function: _+_ - args: { - IDENT [17] { - name: @index0 - } - IDENT [18] { - name: @index1 - } - } - } - CONSTANT [19] { value: 0 } - } - } - CONSTANT [20] { value: 0 } - } - } - CONSTANT [21] { value: 8 } - } - } - } -} -Test case: MULTIPLE_MACROS_1 -Source: size([[1].exists(i, i > 0)]) + size([[1].exists(j, j > 0)]) + size([[2].exists(k, k > 1)]) + size([[2].exists(l, l > 1)]) == 4 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - COMPREHENSION [3] { - iter_var: @it:0:0 - iter_range: { - LIST [4] { - elements: { - CONSTANT [5] { value: 1 } - } - } - } - accu_var: @ac:0:0 - accu_init: { - CONSTANT [6] { value: false } - } - loop_condition: { - CALL [7] { - function: @not_strictly_false - args: { - CALL [8] { - function: !_ - args: { - IDENT [9] { - name: @ac:0:0 - } - } - } - } - } - } - loop_step: { - CALL [10] { - function: _||_ - args: { - IDENT [11] { - name: @ac:0:0 - } - CALL [12] { - function: _>_ - args: { - IDENT [13] { - name: @it:0:0 - } - CONSTANT [14] { value: 0 } - } - } - } - } - } - result: { - IDENT [15] { - name: @ac:0:0 - } - } - } - COMPREHENSION [16] { - iter_var: @it:0:0 - iter_range: { - LIST [17] { - elements: { - CONSTANT [18] { value: 2 } - } - } - } - accu_var: @ac:0:0 - accu_init: { - CONSTANT [19] { value: false } - } - loop_condition: { - CALL [20] { - function: @not_strictly_false - args: { - CALL [21] { - function: !_ - args: { - IDENT [22] { - name: @ac:0:0 - } - } - } - } - } - } - loop_step: { - CALL [23] { - function: _||_ - args: { - IDENT [24] { - name: @ac:0:0 - } - CALL [25] { - function: _>_ - args: { - IDENT [26] { - name: @it:0:0 - } - CONSTANT [27] { value: 1 } - } - } - } - } - } - result: { - IDENT [28] { - name: @ac:0:0 - } - } - } - CALL [29] { - function: size - args: { - LIST [30] { - elements: { - IDENT [31] { - name: @index0 - } - } - } - } - } - CALL [32] { - function: size - args: { - LIST [33] { - elements: { - IDENT [34] { - name: @index1 - } - } - } - } - } - } - } - CALL [35] { - function: _==_ - args: { - CALL [36] { - function: _+_ - args: { - CALL [37] { - function: _+_ - args: { - CALL [38] { - function: _+_ - args: { - IDENT [39] { - name: @index2 - } - IDENT [40] { - name: @index2 - } - } - } - IDENT [41] { - name: @index3 - } - } - } - IDENT [42] { - name: @index3 - } - } - } - CONSTANT [43] { value: 4 } - } - } - } -} -Test case: MULTIPLE_MACROS_2 -Source: [[1].exists(i, i > 0)] + [[1].exists(j, j > 0)] + [['a'].exists(k, k == 'a')] + [['a'].exists(l, l == 'a')] == [true, true, true, true] -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - COMPREHENSION [3] { - iter_var: @it:0:0 - iter_range: { - LIST [4] { - elements: { - CONSTANT [5] { value: 1 } - } - } - } - accu_var: @ac:0:0 - accu_init: { - CONSTANT [6] { value: false } - } - loop_condition: { - CALL [7] { - function: @not_strictly_false - args: { - CALL [8] { - function: !_ - args: { - IDENT [9] { - name: @ac:0:0 - } - } - } - } - } - } - loop_step: { - CALL [10] { - function: _||_ - args: { - IDENT [11] { - name: @ac:0:0 - } - CALL [12] { - function: _>_ - args: { - IDENT [13] { - name: @it:0:0 - } - CONSTANT [14] { value: 0 } - } - } - } - } - } - result: { - IDENT [15] { - name: @ac:0:0 - } - } - } - COMPREHENSION [16] { - iter_var: @it:0:1 - iter_range: { - LIST [17] { - elements: { - CONSTANT [18] { value: "a" } - } - } - } - accu_var: @ac:0:1 - accu_init: { - CONSTANT [19] { value: false } - } - loop_condition: { - CALL [20] { - function: @not_strictly_false - args: { - CALL [21] { - function: !_ - args: { - IDENT [22] { - name: @ac:0:1 - } - } - } - } - } - } - loop_step: { - CALL [23] { - function: _||_ - args: { - IDENT [24] { - name: @ac:0:1 - } - CALL [25] { - function: _==_ - args: { - IDENT [26] { - name: @it:0:1 - } - CONSTANT [27] { value: "a" } - } - } - } - } - } - result: { - IDENT [28] { - name: @ac:0:1 - } - } - } - LIST [29] { - elements: { - IDENT [30] { - name: @index0 - } - } - } - LIST [31] { - elements: { - IDENT [32] { - name: @index1 - } - } - } - } - } - CALL [33] { - function: _==_ - args: { - CALL [34] { - function: _+_ - args: { - CALL [35] { - function: _+_ - args: { - CALL [36] { - function: _+_ - args: { - IDENT [37] { - name: @index2 - } - IDENT [38] { - name: @index2 - } - } - } - IDENT [39] { - name: @index3 - } - } - } - IDENT [40] { - name: @index3 - } - } - } - LIST [41] { - elements: { - CONSTANT [42] { value: true } - CONSTANT [43] { value: true } - CONSTANT [44] { value: true } - CONSTANT [45] { value: true } - } - } - } - } - } -} -Test case: MULTIPLE_MACROS_3 -Source: [1].exists(i, i > 0) && [1].exists(j, j > 0) && [1].exists(k, k > 1) && [2].exists(l, l > 1) -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - COMPREHENSION [3] { - iter_var: @it:0:0 - iter_range: { - LIST [4] { - elements: { - CONSTANT [5] { value: 1 } - } - } - } - accu_var: @ac:0:0 - accu_init: { - CONSTANT [6] { value: false } - } - loop_condition: { - CALL [7] { - function: @not_strictly_false - args: { - CALL [8] { - function: !_ - args: { - IDENT [9] { - name: @ac:0:0 - } - } - } - } - } - } - loop_step: { - CALL [10] { - function: _||_ - args: { - IDENT [11] { - name: @ac:0:0 - } - CALL [12] { - function: _>_ - args: { - IDENT [13] { - name: @it:0:0 - } - CONSTANT [14] { value: 0 } - } - } - } - } - } - result: { - IDENT [15] { - name: @ac:0:0 - } - } - } - } - } - CALL [16] { - function: _&&_ - args: { - CALL [17] { - function: _&&_ - args: { - IDENT [18] { - name: @index0 - } - IDENT [19] { - name: @index0 - } - } - } - CALL [20] { - function: _&&_ - args: { - COMPREHENSION [21] { - iter_var: @it:0:0 - iter_range: { - LIST [22] { - elements: { - CONSTANT [23] { value: 1 } - } - } - } - accu_var: @ac:0:0 - accu_init: { - CONSTANT [24] { value: false } - } - loop_condition: { - CALL [25] { - function: @not_strictly_false - args: { - CALL [26] { - function: !_ - args: { - IDENT [27] { - name: @ac:0:0 - } - } - } - } - } - } - loop_step: { - CALL [28] { - function: _||_ - args: { - IDENT [29] { - name: @ac:0:0 - } - CALL [30] { - function: _>_ - args: { - IDENT [31] { - name: @it:0:0 - } - CONSTANT [32] { value: 1 } - } - } - } - } - } - result: { - IDENT [33] { - name: @ac:0:0 - } - } - } - COMPREHENSION [34] { - iter_var: @it:0:0 - iter_range: { - LIST [35] { - elements: { - CONSTANT [36] { value: 2 } - } - } - } - accu_var: @ac:0:0 - accu_init: { - CONSTANT [37] { value: false } - } - loop_condition: { - CALL [38] { - function: @not_strictly_false - args: { - CALL [39] { - function: !_ - args: { - IDENT [40] { - name: @ac:0:0 - } - } - } - } - } - } - loop_step: { - CALL [41] { - function: _||_ - args: { - IDENT [42] { - name: @ac:0:0 - } - CALL [43] { - function: _>_ - args: { - IDENT [44] { - name: @it:0:0 - } - CONSTANT [45] { value: 1 } - } - } - } - } - } - result: { - IDENT [46] { - name: @ac:0:0 - } - } - } - } - } - } - } - } -} -Test case: MULTIPLE_MACROS_COMP_V2_1 -Source: size([[1].exists(i,x,i > 0 && x >= 0)]) + size([[1].exists(j, y, j > 0 && y >= 0)]) + size([[2].exists(k,z,k > 1 && z >= 0)]) + size([[2].exists(l, w, l > 1 && w >= 0)]) == 4 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - COMPREHENSION [3] { - iter_var: @it:0:0 - iter_var2: @it2:0:0 - iter_range: { - LIST [4] { - elements: { - CONSTANT [5] { value: 1 } - } - } - } - accu_var: @ac:0:0 - accu_init: { - CONSTANT [6] { value: false } - } - loop_condition: { - CALL [7] { - function: @not_strictly_false - args: { - CALL [8] { - function: !_ - args: { - IDENT [9] { - name: @ac:0:0 - } - } - } - } - } - } - loop_step: { - CALL [10] { - function: _||_ - args: { - IDENT [11] { - name: @ac:0:0 - } - CALL [12] { - function: _&&_ - args: { - CALL [13] { - function: _>_ - args: { - IDENT [14] { - name: @it:0:0 - } - CONSTANT [15] { value: 0 } - } - } - CALL [16] { - function: _>=_ - args: { - IDENT [17] { - name: @it2:0:0 - } - CONSTANT [18] { value: 0 } - } - } - } - } - } - } - } - result: { - IDENT [19] { - name: @ac:0:0 - } - } - } - COMPREHENSION [20] { - iter_var: @it:0:0 - iter_var2: @it2:0:0 - iter_range: { - LIST [21] { - elements: { - CONSTANT [22] { value: 2 } - } - } - } - accu_var: @ac:0:0 - accu_init: { - CONSTANT [23] { value: false } - } - loop_condition: { - CALL [24] { - function: @not_strictly_false - args: { - CALL [25] { - function: !_ - args: { - IDENT [26] { - name: @ac:0:0 - } - } - } - } - } - } - loop_step: { - CALL [27] { - function: _||_ - args: { - IDENT [28] { - name: @ac:0:0 - } - CALL [29] { - function: _&&_ - args: { - CALL [30] { - function: _>_ - args: { - IDENT [31] { - name: @it:0:0 - } - CONSTANT [32] { value: 1 } - } - } - CALL [33] { - function: _>=_ - args: { - IDENT [34] { - name: @it2:0:0 - } - CONSTANT [35] { value: 0 } - } - } - } - } - } - } - } - result: { - IDENT [36] { - name: @ac:0:0 - } - } - } - CALL [37] { - function: size - args: { - LIST [38] { - elements: { - IDENT [39] { - name: @index0 - } - } - } - } - } - CALL [40] { - function: size - args: { - LIST [41] { - elements: { - IDENT [42] { - name: @index1 - } - } - } - } - } - } - } - CALL [43] { - function: _==_ - args: { - CALL [44] { - function: _+_ - args: { - CALL [45] { - function: _+_ - args: { - CALL [46] { - function: _+_ - args: { - IDENT [47] { - name: @index2 - } - IDENT [48] { - name: @index2 - } - } - } - IDENT [49] { - name: @index3 - } - } - } - IDENT [50] { - name: @index3 - } - } - } - CONSTANT [51] { value: 4 } - } - } - } -} -Test case: MULTIPLE_MACROS_COMP_V2_2 -Source: [1].exists(i, x, i > 0 && x > 0) && [1].exists(j, y, j > 0 && y > 0) && [1].exists(k, z, k > 1 && z > 0) && [2].exists(l, w, l > 1 && w > 0) -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - COMPREHENSION [3] { - iter_var: @it:0:0 - iter_var2: @it2:0:0 - iter_range: { - LIST [4] { - elements: { - CONSTANT [5] { value: 1 } - } - } - } - accu_var: @ac:0:0 - accu_init: { - CONSTANT [6] { value: false } - } - loop_condition: { - CALL [7] { - function: @not_strictly_false - args: { - CALL [8] { - function: !_ - args: { - IDENT [9] { - name: @ac:0:0 - } - } - } - } - } - } - loop_step: { - CALL [10] { - function: _||_ - args: { - IDENT [11] { - name: @ac:0:0 - } - CALL [12] { - function: _&&_ - args: { - CALL [13] { - function: _>_ - args: { - IDENT [14] { - name: @it:0:0 - } - CONSTANT [15] { value: 0 } - } - } - CALL [16] { - function: _>_ - args: { - IDENT [17] { - name: @it2:0:0 - } - CONSTANT [18] { value: 0 } - } - } - } - } - } - } - } - result: { - IDENT [19] { - name: @ac:0:0 - } - } - } - } - } - CALL [20] { - function: _&&_ - args: { - CALL [21] { - function: _&&_ - args: { - IDENT [22] { - name: @index0 - } - IDENT [23] { - name: @index0 - } - } - } - CALL [24] { - function: _&&_ - args: { - COMPREHENSION [25] { - iter_var: @it:0:0 - iter_var2: @it2:0:0 - iter_range: { - LIST [26] { - elements: { - CONSTANT [27] { value: 1 } - } - } - } - accu_var: @ac:0:0 - accu_init: { - CONSTANT [28] { value: false } - } - loop_condition: { - CALL [29] { - function: @not_strictly_false - args: { - CALL [30] { - function: !_ - args: { - IDENT [31] { - name: @ac:0:0 - } - } - } - } - } - } - loop_step: { - CALL [32] { - function: _||_ - args: { - IDENT [33] { - name: @ac:0:0 - } - CALL [34] { - function: _&&_ - args: { - CALL [35] { - function: _>_ - args: { - IDENT [36] { - name: @it:0:0 - } - CONSTANT [37] { value: 1 } - } - } - CALL [38] { - function: _>_ - args: { - IDENT [39] { - name: @it2:0:0 - } - CONSTANT [40] { value: 0 } - } - } - } - } - } - } - } - result: { - IDENT [41] { - name: @ac:0:0 - } - } - } - COMPREHENSION [42] { - iter_var: @it:0:0 - iter_var2: @it2:0:0 - iter_range: { - LIST [43] { - elements: { - CONSTANT [44] { value: 2 } - } - } - } - accu_var: @ac:0:0 - accu_init: { - CONSTANT [45] { value: false } - } - loop_condition: { - CALL [46] { - function: @not_strictly_false - args: { - CALL [47] { - function: !_ - args: { - IDENT [48] { - name: @ac:0:0 - } - } - } - } - } - } - loop_step: { - CALL [49] { - function: _||_ - args: { - IDENT [50] { - name: @ac:0:0 - } - CALL [51] { - function: _&&_ - args: { - CALL [52] { - function: _>_ - args: { - IDENT [53] { - name: @it:0:0 - } - CONSTANT [54] { value: 1 } - } - } - CALL [55] { - function: _>_ - args: { - IDENT [56] { - name: @it2:0:0 - } - CONSTANT [57] { value: 0 } - } - } - } - } - } - } - } - result: { - IDENT [58] { - name: @ac:0:0 - } - } - } - } - } - } - } - } -} -Test case: NESTED_MACROS -Source: [1,2,3].map(i, [1, 2, 3].map(i, i + 1)) == [[2, 3, 4], [2, 3, 4], [2, 3, 4]] -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - LIST [3] { - elements: { - CONSTANT [4] { value: 1 } - CONSTANT [5] { value: 2 } - CONSTANT [6] { value: 3 } - } - } - LIST [7] { - elements: { - CONSTANT [8] { value: 2 } - CONSTANT [9] { value: 3 } - CONSTANT [10] { value: 4 } - } - } - } - } - CALL [11] { - function: _==_ - args: { - COMPREHENSION [12] { - iter_var: @it:1:0 - iter_range: { - IDENT [13] { - name: @index0 - } - } - accu_var: @ac:1:0 - accu_init: { - LIST [14] { - elements: { - } - } - } - loop_condition: { - CONSTANT [15] { value: true } - } - loop_step: { - CALL [16] { - function: _+_ - args: { - IDENT [17] { - name: @ac:1:0 - } - LIST [18] { - elements: { - COMPREHENSION [19] { - iter_var: @it:0:0 - iter_range: { - IDENT [20] { - name: @index0 - } - } - accu_var: @ac:0:0 - accu_init: { - LIST [21] { - elements: { - } - } - } - loop_condition: { - CONSTANT [22] { value: true } - } - loop_step: { - CALL [23] { - function: _+_ - args: { - IDENT [24] { - name: @ac:0:0 - } - LIST [25] { - elements: { - CALL [26] { - function: _+_ - args: { - IDENT [27] { - name: @it:0:0 - } - CONSTANT [28] { value: 1 } - } - } - } - } - } - } - } - result: { - IDENT [29] { - name: @ac:0:0 - } - } - } - } - } - } - } - } - result: { - IDENT [30] { - name: @ac:1:0 - } - } - } - LIST [31] { - elements: { - IDENT [32] { - name: @index1 - } - IDENT [33] { - name: @index1 - } - IDENT [34] { - name: @index1 - } - } - } - } - } - } -} -Test case: NESTED_MACROS_2 -Source: [1, 2].map(y, [1, 2, 3].filter(x, x == y)) == [[1], [2]] -=====> -CALL [31] { - function: _==_ - args: { - COMPREHENSION [30] { - iter_var: y - iter_range: { - LIST [1] { - elements: { - CONSTANT [2] { value: 1 } - CONSTANT [3] { value: 2 } - } - } - } - accu_var: @result - accu_init: { - LIST [24] { - elements: { - } - } - } - loop_condition: { - CONSTANT [25] { value: true } - } - loop_step: { - CALL [28] { - function: _+_ - args: { - IDENT [26] { - name: @result - } - LIST [27] { - elements: { - COMPREHENSION [23] { - iter_var: x - iter_range: { - LIST [6] { - elements: { - CONSTANT [7] { value: 1 } - CONSTANT [8] { value: 2 } - CONSTANT [9] { value: 3 } - } - } - } - accu_var: @result - accu_init: { - LIST [15] { - elements: { - } - } - } - loop_condition: { - CONSTANT [16] { value: true } - } - loop_step: { - CALL [21] { - function: _?_:_ - args: { - CALL [13] { - function: _==_ - args: { - IDENT [12] { - name: x - } - IDENT [14] { - name: y - } - } - } - CALL [19] { - function: _+_ - args: { - IDENT [17] { - name: @result - } - LIST [18] { - elements: { - IDENT [11] { - name: x - } - } - } - } - } - IDENT [20] { - name: @result - } - } - } - } - result: { - IDENT [22] { - name: @result - } - } - } - } - } - } - } - } - result: { - IDENT [29] { - name: @result - } - } - } - LIST [32] { - elements: { - LIST [33] { - elements: { - CONSTANT [34] { value: 1 } - } - } - LIST [35] { - elements: { - CONSTANT [36] { value: 2 } - } - } - } - } - } -} -Test case: NESTED_MACROS_3 -Source: [1,2,3].map(i, i * 2) + [1,2,3].map(i, i * 2).map(i, i * 2) -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - COMPREHENSION [3] { - iter_var: @it:0:0 - iter_range: { - LIST [4] { - elements: { - CONSTANT [5] { value: 1 } - CONSTANT [6] { value: 2 } - CONSTANT [7] { value: 3 } - } - } - } - accu_var: @ac:0:0 - accu_init: { - LIST [8] { - elements: { - } - } - } - loop_condition: { - CONSTANT [9] { value: true } - } - loop_step: { - CALL [10] { - function: _+_ - args: { - IDENT [11] { - name: @ac:0:0 - } - LIST [12] { - elements: { - CALL [13] { - function: _*_ - args: { - IDENT [14] { - name: @it:0:0 - } - CONSTANT [15] { value: 2 } - } - } - } - } - } - } - } - result: { - IDENT [16] { - name: @ac:0:0 - } - } - } - } - } - CALL [17] { - function: _+_ - args: { - IDENT [18] { - name: @index0 - } - COMPREHENSION [19] { - iter_var: @it:1:0 - iter_range: { - IDENT [20] { - name: @index0 - } - } - accu_var: @ac:1:0 - accu_init: { - LIST [21] { - elements: { - } - } - } - loop_condition: { - CONSTANT [22] { value: true } - } - loop_step: { - CALL [23] { - function: _+_ - args: { - IDENT [24] { - name: @ac:1:0 - } - LIST [25] { - elements: { - CALL [26] { - function: _*_ - args: { - IDENT [27] { - name: @it:1:0 - } - CONSTANT [28] { value: 2 } - } - } - } - } - } - } - } - result: { - IDENT [29] { - name: @ac:1:0 - } - } - } - } - } - } -} -Test case: NESTED_MACROS_COMP_V2_1 -Source: [1,2,3].transformList(i, v, [1, 2, 3].transformList(i, v, i + v + 1)) == [[2, 4, 6], [2, 4, 6], [2, 4, 6]] -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - LIST [3] { - elements: { - CONSTANT [4] { value: 1 } - CONSTANT [5] { value: 2 } - CONSTANT [6] { value: 3 } - } - } - LIST [7] { - elements: { - CONSTANT [8] { value: 2 } - CONSTANT [9] { value: 4 } - CONSTANT [10] { value: 6 } - } - } - } - } - CALL [11] { - function: _==_ - args: { - COMPREHENSION [12] { - iter_var: @it:1:0 - iter_var2: @it2:1:0 - iter_range: { - IDENT [13] { - name: @index0 - } - } - accu_var: @ac:1:0 - accu_init: { - LIST [14] { - elements: { - } - } - } - loop_condition: { - CONSTANT [15] { value: true } - } - loop_step: { - CALL [16] { - function: _+_ - args: { - IDENT [17] { - name: @ac:1:0 - } - LIST [18] { - elements: { - COMPREHENSION [19] { - iter_var: @it:0:0 - iter_var2: @it2:0:0 - iter_range: { - IDENT [20] { - name: @index0 - } - } - accu_var: @ac:0:0 - accu_init: { - LIST [21] { - elements: { - } - } - } - loop_condition: { - CONSTANT [22] { value: true } - } - loop_step: { - CALL [23] { - function: _+_ - args: { - IDENT [24] { - name: @ac:0:0 - } - LIST [25] { - elements: { - CALL [26] { - function: _+_ - args: { - CALL [27] { - function: _+_ - args: { - IDENT [28] { - name: @it:0:0 - } - IDENT [29] { - name: @it2:0:0 - } - } - } - CONSTANT [30] { value: 1 } - } - } - } - } - } - } - } - result: { - IDENT [31] { - name: @ac:0:0 - } - } - } - } - } - } - } - } - result: { - IDENT [32] { - name: @ac:1:0 - } - } - } - LIST [33] { - elements: { - IDENT [34] { - name: @index1 - } - IDENT [35] { - name: @index1 - } - IDENT [36] { - name: @index1 - } - } - } - } - } - } -} -Test case: NESTED_MACROS_COMP_V2_2 -Source: [1, 2].transformList(i, y, [1, 2, 3].filter(x, x == y && i < y)) == [[1], [2]] -=====> -CALL [36] { - function: _==_ - args: { - COMPREHENSION [35] { - iter_var: i - iter_var2: y - iter_range: { - LIST [1] { - elements: { - CONSTANT [2] { value: 1 } - CONSTANT [3] { value: 2 } - } - } - } - accu_var: @result - accu_init: { - LIST [29] { - elements: { - } - } - } - loop_condition: { - CONSTANT [30] { value: true } - } - loop_step: { - CALL [33] { - function: _+_ - args: { - IDENT [31] { - name: @result - } - LIST [32] { - elements: { - COMPREHENSION [28] { - iter_var: x - iter_range: { - LIST [7] { - elements: { - CONSTANT [8] { value: 1 } - CONSTANT [9] { value: 2 } - CONSTANT [10] { value: 3 } - } - } - } - accu_var: @result - accu_init: { - LIST [20] { - elements: { - } - } - } - loop_condition: { - CONSTANT [21] { value: true } - } - loop_step: { - CALL [26] { - function: _?_:_ - args: { - CALL [16] { - function: _&&_ - args: { - CALL [14] { - function: _==_ - args: { - IDENT [13] { - name: x - } - IDENT [15] { - name: y - } - } - } - CALL [18] { - function: _<_ - args: { - IDENT [17] { - name: i - } - IDENT [19] { - name: y - } - } - } - } - } - CALL [24] { - function: _+_ - args: { - IDENT [22] { - name: @result - } - LIST [23] { - elements: { - IDENT [12] { - name: x - } - } - } - } - } - IDENT [25] { - name: @result - } - } - } - } - result: { - IDENT [27] { - name: @result - } - } - } - } - } - } - } - } - result: { - IDENT [34] { - name: @result - } - } - } - LIST [37] { - elements: { - LIST [38] { - elements: { - CONSTANT [39] { value: 1 } - } - } - LIST [40] { - elements: { - CONSTANT [41] { value: 2 } - } - } - } - } - } -} -Test case: ADJACENT_NESTED_MACROS -Source: [1,2,3].map(i, [1, 2, 3].map(i, i + 1)) == [1,2,3].map(j, [1, 2, 3].map(j, j + 1)) -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - COMPREHENSION [3] { - iter_var: @it:1:0 - iter_range: { - LIST [4] { - elements: { - CONSTANT [5] { value: 1 } - CONSTANT [6] { value: 2 } - CONSTANT [7] { value: 3 } - } - } - } - accu_var: @ac:1:0 - accu_init: { - LIST [8] { - elements: { - } - } - } - loop_condition: { - CONSTANT [9] { value: true } - } - loop_step: { - CALL [10] { - function: _+_ - args: { - IDENT [11] { - name: @ac:1:0 - } - LIST [12] { - elements: { - COMPREHENSION [13] { - iter_var: @it:0:0 - iter_range: { - LIST [14] { - elements: { - CONSTANT [15] { value: 1 } - CONSTANT [16] { value: 2 } - CONSTANT [17] { value: 3 } - } - } - } - accu_var: @ac:0:0 - accu_init: { - LIST [18] { - elements: { - } - } - } - loop_condition: { - CONSTANT [19] { value: true } - } - loop_step: { - CALL [20] { - function: _+_ - args: { - IDENT [21] { - name: @ac:0:0 - } - LIST [22] { - elements: { - CALL [23] { - function: _+_ - args: { - IDENT [24] { - name: @it:0:0 - } - CONSTANT [25] { value: 1 } - } - } - } - } - } - } - } - result: { - IDENT [26] { - name: @ac:0:0 - } - } - } - } - } - } - } - } - result: { - IDENT [27] { - name: @ac:1:0 - } - } - } - } - } - CALL [28] { - function: _==_ - args: { - IDENT [29] { - name: @index0 - } - IDENT [30] { - name: @index0 - } - } - } - } -} -Test case: ADJACENT_NESTED_MACROS_COMP_V2 -Source: [1,2,3].transformMap(i, x, [1, 2, 3].transformMap(i, x, i + x + 1)) == [1,2,3].transformMap(j, y, [1, 2, 3].transformMap(j, y, j + y + 1)) -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - COMPREHENSION [3] { - iter_var: @it:1:0 - iter_var2: @it2:1:0 - iter_range: { - LIST [4] { - elements: { - CONSTANT [5] { value: 1 } - CONSTANT [6] { value: 2 } - CONSTANT [7] { value: 3 } - } - } - } - accu_var: @ac:1:0 - accu_init: { - MAP [8] { - - } - } - loop_condition: { - CONSTANT [9] { value: true } - } - loop_step: { - CALL [10] { - function: cel.@mapInsert - args: { - IDENT [11] { - name: @ac:1:0 - } - IDENT [12] { - name: @it:1:0 - } - COMPREHENSION [13] { - iter_var: @it:0:0 - iter_var2: @it2:0:0 - iter_range: { - LIST [14] { - elements: { - CONSTANT [15] { value: 1 } - CONSTANT [16] { value: 2 } - CONSTANT [17] { value: 3 } - } - } - } - accu_var: @ac:0:0 - accu_init: { - MAP [18] { - - } - } - loop_condition: { - CONSTANT [19] { value: true } - } - loop_step: { - CALL [20] { - function: cel.@mapInsert - args: { - IDENT [21] { - name: @ac:0:0 - } - IDENT [22] { - name: @it:0:0 - } - CALL [23] { - function: _+_ - args: { - CALL [24] { - function: _+_ - args: { - IDENT [25] { - name: @it:0:0 - } - IDENT [26] { - name: @it2:0:0 - } - } - } - CONSTANT [27] { value: 1 } - } - } - } - } - } - result: { - IDENT [28] { - name: @ac:0:0 - } - } - } - } - } - } - result: { - IDENT [29] { - name: @ac:1:0 - } - } - } - } - } - CALL [30] { - function: _==_ - args: { - IDENT [31] { - name: @index0 - } - IDENT [32] { - name: @index0 - } - } - } - } -} -Test case: INCLUSION_LIST -Source: 1 in [1,2,3] && 2 in [1,2,3] && 3 in [3, [1,2,3]] && 1 in [1,2,3] -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - CALL [3] { - function: @in - args: { - CONSTANT [4] { value: 1 } - LIST [5] { - elements: { - CONSTANT [6] { value: 1 } - CONSTANT [7] { value: 2 } - CONSTANT [8] { value: 3 } - } - } - } - } - LIST [9] { - elements: { - CONSTANT [10] { value: 1 } - CONSTANT [11] { value: 2 } - CONSTANT [12] { value: 3 } - } - } - } - } - CALL [13] { - function: _&&_ - args: { - CALL [14] { - function: _&&_ - args: { - IDENT [15] { - name: @index0 - } - CALL [16] { - function: @in - args: { - CONSTANT [17] { value: 2 } - IDENT [18] { - name: @index1 - } - } - } - } - } - CALL [19] { - function: _&&_ - args: { - CALL [20] { - function: @in - args: { - CONSTANT [21] { value: 3 } - LIST [22] { - elements: { - CONSTANT [23] { value: 3 } - IDENT [24] { - name: @index1 - } - } - } - } - } - IDENT [25] { - name: @index0 - } - } - } - } - } - } -} -Test case: INCLUSION_MAP -Source: 2 in {'a': 1, 2: {true: false}, 3: {true: false}} -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - MAP [3] { - MAP_ENTRY [4] { - key: { - CONSTANT [5] { value: true } - } - value: { - CONSTANT [6] { value: false } - } - } - } - } - } - CALL [7] { - function: @in - args: { - CONSTANT [8] { value: 2 } - MAP [9] { - MAP_ENTRY [10] { - key: { - CONSTANT [11] { value: "a" } - } - value: { - CONSTANT [12] { value: 1 } - } - } - MAP_ENTRY [13] { - key: { - CONSTANT [14] { value: 2 } - } - value: { - IDENT [15] { - name: @index0 - } - } - } - MAP_ENTRY [16] { - key: { - CONSTANT [17] { value: 3 } - } - value: { - IDENT [18] { - name: @index0 - } - } - } - } - } - } - } -} -Test case: MACRO_ITER_VAR_NOT_REFERENCED -Source: [1,2].map(i, [1, 2].map(i, [3,4])) == [[[3, 4], [3, 4]], [[3, 4], [3, 4]]] -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - LIST [3] { - elements: { - LIST [4] { - elements: { - CONSTANT [5] { value: 3 } - CONSTANT [6] { value: 4 } - } - } - LIST [7] { - elements: { - CONSTANT [8] { value: 3 } - CONSTANT [9] { value: 4 } - } - } - } - } - LIST [10] { - elements: { - CONSTANT [11] { value: 1 } - CONSTANT [12] { value: 2 } - } - } - } - } - CALL [13] { - function: _==_ - args: { - COMPREHENSION [14] { - iter_var: @it:1:0 - iter_range: { - IDENT [15] { - name: @index1 - } - } - accu_var: @ac:1:0 - accu_init: { - LIST [16] { - elements: { - } - } - } - loop_condition: { - CONSTANT [17] { value: true } - } - loop_step: { - CALL [18] { - function: _+_ - args: { - IDENT [19] { - name: @ac:1:0 - } - LIST [20] { - elements: { - COMPREHENSION [21] { - iter_var: @it:0:0 - iter_range: { - IDENT [22] { - name: @index1 - } - } - accu_var: @ac:0:0 - accu_init: { - LIST [23] { - elements: { - } - } - } - loop_condition: { - CONSTANT [24] { value: true } - } - loop_step: { - CALL [25] { - function: _+_ - args: { - IDENT [26] { - name: @ac:0:0 - } - LIST [27] { - elements: { - LIST [28] { - elements: { - CONSTANT [29] { value: 3 } - CONSTANT [30] { value: 4 } - } - } - } - } - } - } - } - result: { - IDENT [31] { - name: @ac:0:0 - } - } - } - } - } - } - } - } - result: { - IDENT [32] { - name: @ac:1:0 - } - } - } - LIST [33] { - elements: { - IDENT [34] { - name: @index0 - } - IDENT [35] { - name: @index0 - } - } - } - } - } - } -} -Test case: MACRO_ITER_VAR2_NOT_REFERENCED -Source: [1,2].transformList(i, v, [1, 2].transformList(i, v, [3,4])) == [[[3, 4], [3, 4]], [[3, 4], [3, 4]]] -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - LIST [3] { - elements: { - LIST [4] { - elements: { - CONSTANT [5] { value: 3 } - CONSTANT [6] { value: 4 } - } - } - LIST [7] { - elements: { - CONSTANT [8] { value: 3 } - CONSTANT [9] { value: 4 } - } - } - } - } - LIST [10] { - elements: { - CONSTANT [11] { value: 1 } - CONSTANT [12] { value: 2 } - } - } - } - } - CALL [13] { - function: _==_ - args: { - COMPREHENSION [14] { - iter_var: @it:1:0 - iter_var2: @it2:1:0 - iter_range: { - IDENT [15] { - name: @index1 - } - } - accu_var: @ac:1:0 - accu_init: { - LIST [16] { - elements: { - } - } - } - loop_condition: { - CONSTANT [17] { value: true } - } - loop_step: { - CALL [18] { - function: _+_ - args: { - IDENT [19] { - name: @ac:1:0 - } - LIST [20] { - elements: { - COMPREHENSION [21] { - iter_var: @it:0:0 - iter_var2: @it2:0:0 - iter_range: { - IDENT [22] { - name: @index1 - } - } - accu_var: @ac:0:0 - accu_init: { - LIST [23] { - elements: { - } - } - } - loop_condition: { - CONSTANT [24] { value: true } - } - loop_step: { - CALL [25] { - function: _+_ - args: { - IDENT [26] { - name: @ac:0:0 - } - LIST [27] { - elements: { - LIST [28] { - elements: { - CONSTANT [29] { value: 3 } - CONSTANT [30] { value: 4 } - } - } - } - } - } - } - } - result: { - IDENT [31] { - name: @ac:0:0 - } - } - } - } - } - } - } - } - result: { - IDENT [32] { - name: @ac:1:0 - } - } - } - LIST [33] { - elements: { - IDENT [34] { - name: @index0 - } - IDENT [35] { - name: @index0 - } - } - } - } - } - } -} -Test case: MACRO_SHADOWED_VARIABLE -Source: [x - 1 > 3 ? x - 1 : 5].exists(x, x - 1 > 3) || x - 1 > 3 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - CALL [3] { - function: _>_ - args: { - CALL [4] { - function: _-_ - args: { - IDENT [5] { - name: x - } - CONSTANT [6] { value: 1 } - } - } - CONSTANT [7] { value: 3 } - } - } - } - } - CALL [8] { - function: _||_ - args: { - COMPREHENSION [9] { - iter_var: @it:0:0 - iter_range: { - LIST [10] { - elements: { - CALL [11] { - function: _?_:_ - args: { - IDENT [12] { - name: @index0 - } - CALL [13] { - function: _-_ - args: { - IDENT [14] { - name: x - } - CONSTANT [15] { value: 1 } - } - } - CONSTANT [16] { value: 5 } - } - } - } - } - } - accu_var: @ac:0:0 - accu_init: { - CONSTANT [17] { value: false } - } - loop_condition: { - CALL [18] { - function: @not_strictly_false - args: { - CALL [19] { - function: !_ - args: { - IDENT [20] { - name: @ac:0:0 - } - } - } - } - } - } - loop_step: { - CALL [21] { - function: _||_ - args: { - IDENT [22] { - name: @ac:0:0 - } - CALL [23] { - function: _>_ - args: { - CALL [24] { - function: _-_ - args: { - IDENT [25] { - name: @it:0:0 - } - CONSTANT [26] { value: 1 } - } - } - CONSTANT [27] { value: 3 } - } - } - } - } - } - result: { - IDENT [28] { - name: @ac:0:0 - } - } - } - IDENT [29] { - name: @index0 - } - } - } - } -} -Test case: MACRO_SHADOWED_VARIABLE_2 -Source: ["foo", "bar"].map(x, [x + x, x + x]).map(x, [x + x, x + x]) -=====> -COMPREHENSION [35] { - iter_var: x - iter_range: { - COMPREHENSION [19] { - iter_var: x - iter_range: { - LIST [1] { - elements: { - CONSTANT [2] { value: "foo" } - CONSTANT [3] { value: "bar" } - } - } - } - accu_var: @result - accu_init: { - LIST [13] { - elements: { - } - } - } - loop_condition: { - CONSTANT [14] { value: true } - } - loop_step: { - CALL [17] { - function: _+_ - args: { - IDENT [15] { - name: @result - } - LIST [16] { - elements: { - LIST [6] { - elements: { - CALL [8] { - function: _+_ - args: { - IDENT [7] { - name: x - } - IDENT [9] { - name: x - } - } - } - CALL [11] { - function: _+_ - args: { - IDENT [10] { - name: x - } - IDENT [12] { - name: x - } - } - } - } - } - } - } - } - } - } - result: { - IDENT [18] { - name: @result - } - } - } - } - accu_var: @result - accu_init: { - LIST [29] { - elements: { - } - } - } - loop_condition: { - CONSTANT [30] { value: true } - } - loop_step: { - CALL [33] { - function: _+_ - args: { - IDENT [31] { - name: @result - } - LIST [32] { - elements: { - LIST [22] { - elements: { - CALL [24] { - function: _+_ - args: { - IDENT [23] { - name: x - } - IDENT [25] { - name: x - } - } - } - CALL [27] { - function: _+_ - args: { - IDENT [26] { - name: x - } - IDENT [28] { - name: x - } - } - } - } - } - } - } - } - } - } - result: { - IDENT [34] { - name: @result - } - } -} -Test case: MACRO_SHADOWED_VARIABLE_COMP_V2_1 -Source: [x - y - 1 > 3 ? x - y - 1 : 5].exists(x, y, x - y - 1 > 3) || x - y - 1 > 3 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - CALL [3] { - function: _>_ - args: { - CALL [4] { - function: _-_ - args: { - CALL [5] { - function: _-_ - args: { - IDENT [6] { - name: x - } - IDENT [7] { - name: y - } - } - } - CONSTANT [8] { value: 1 } - } - } - CONSTANT [9] { value: 3 } - } - } - } - } - CALL [10] { - function: _||_ - args: { - COMPREHENSION [11] { - iter_var: @it:0:0 - iter_var2: @it2:0:0 - iter_range: { - LIST [12] { - elements: { - CALL [13] { - function: _?_:_ - args: { - IDENT [14] { - name: @index0 - } - CALL [15] { - function: _-_ - args: { - CALL [16] { - function: _-_ - args: { - IDENT [17] { - name: x - } - IDENT [18] { - name: y - } - } - } - CONSTANT [19] { value: 1 } - } - } - CONSTANT [20] { value: 5 } - } - } - } - } - } - accu_var: @ac:0:0 - accu_init: { - CONSTANT [21] { value: false } - } - loop_condition: { - CALL [22] { - function: @not_strictly_false - args: { - CALL [23] { - function: !_ - args: { - IDENT [24] { - name: @ac:0:0 - } - } - } - } - } - } - loop_step: { - CALL [25] { - function: _||_ - args: { - IDENT [26] { - name: @ac:0:0 - } - CALL [27] { - function: _>_ - args: { - CALL [28] { - function: _-_ - args: { - CALL [29] { - function: _-_ - args: { - IDENT [30] { - name: @it:0:0 - } - IDENT [31] { - name: @it2:0:0 - } - } - } - CONSTANT [32] { value: 1 } - } - } - CONSTANT [33] { value: 3 } - } - } - } - } - } - result: { - IDENT [34] { - name: @ac:0:0 - } - } - } - IDENT [35] { - name: @index0 - } - } - } - } -} -Test case: MACRO_SHADOWED_VARIABLE_COMP_V2_2 -Source: ["foo", "bar"].transformMap(x, y, [x + x, y + y]).transformMap(x, y, [x + x, y + y]) -=====> -COMPREHENSION [35] { - iter_var: x - iter_var2: y - iter_range: { - COMPREHENSION [19] { - iter_var: x - iter_var2: y - iter_range: { - LIST [1] { - elements: { - CONSTANT [2] { value: "foo" } - CONSTANT [3] { value: "bar" } - } - } - } - accu_var: @result - accu_init: { - MAP [14] { - - } - } - loop_condition: { - CONSTANT [15] { value: true } - } - loop_step: { - CALL [17] { - function: cel.@mapInsert - args: { - IDENT [16] { - name: @result - } - IDENT [5] { - name: x - } - LIST [7] { - elements: { - CALL [9] { - function: _+_ - args: { - IDENT [8] { - name: x - } - IDENT [10] { - name: x - } - } - } - CALL [12] { - function: _+_ - args: { - IDENT [11] { - name: y - } - IDENT [13] { - name: y - } - } - } - } - } - } - } - } - result: { - IDENT [18] { - name: @result - } - } - } - } - accu_var: @result - accu_init: { - MAP [30] { - - } - } - loop_condition: { - CONSTANT [31] { value: true } - } - loop_step: { - CALL [33] { - function: cel.@mapInsert - args: { - IDENT [32] { - name: @result - } - IDENT [21] { - name: x - } - LIST [23] { - elements: { - CALL [25] { - function: _+_ - args: { - IDENT [24] { - name: x - } - IDENT [26] { - name: x - } - } - } - CALL [28] { - function: _+_ - args: { - IDENT [27] { - name: y - } - IDENT [29] { - name: y - } - } - } - } - } - } - } - } - result: { - IDENT [34] { - name: @result - } - } -} -Test case: PRESENCE_TEST -Source: has({'a': true}.a) && {'a':true}['a'] -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - MAP [3] { - MAP_ENTRY [4] { - key: { - CONSTANT [5] { value: "a" } - } - value: { - CONSTANT [6] { value: true } - } - } - } - } - } - CALL [7] { - function: _&&_ - args: { - SELECT [8] { - IDENT [9] { - name: @index0 - }.a~presence_test - } - CALL [10] { - function: _[_] - args: { - IDENT [11] { - name: @index0 - } - CONSTANT [12] { value: "a" } - } - } - } - } - } -} -Test case: PRESENCE_TEST_2 -Source: has({'a': true}.a) && has({'a': true}.a) -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - SELECT [3] { - MAP [4] { - MAP_ENTRY [5] { - key: { - CONSTANT [6] { value: "a" } - } - value: { - CONSTANT [7] { value: true } - } - } - }.a~presence_test - } - } - } - CALL [8] { - function: _&&_ - args: { - IDENT [9] { - name: @index0 - } - IDENT [10] { - name: @index0 - } - } - } - } -} -Test case: PRESENCE_TEST_WITH_TERNARY -Source: (has(msg.oneof_type.payload) ? msg.oneof_type.payload.single_int64 : 0) == 10 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - SELECT [3] { - IDENT [4] { - name: msg - }.oneof_type - } - } - } - CALL [5] { - function: _==_ - args: { - CALL [6] { - function: _?_:_ - args: { - SELECT [7] { - IDENT [8] { - name: @index0 - }.payload~presence_test - } - SELECT [9] { - SELECT [10] { - IDENT [11] { - name: @index0 - }.payload - }.single_int64 - } - CONSTANT [12] { value: 0 } - } - } - CONSTANT [13] { value: 10 } - } - } - } -} -Test case: PRESENCE_TEST_WITH_TERNARY_2 -Source: (has(msg.oneof_type.payload) ? msg.oneof_type.payload.single_int64 : msg.oneof_type.payload.single_int64 * 0) == 10 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - SELECT [3] { - SELECT [4] { - SELECT [5] { - IDENT [6] { - name: msg - }.oneof_type - }.payload - }.single_int64 - } - } - } - CALL [7] { - function: _==_ - args: { - CALL [8] { - function: _?_:_ - args: { - SELECT [9] { - SELECT [10] { - IDENT [11] { - name: msg - }.oneof_type - }.payload~presence_test - } - IDENT [12] { - name: @index0 - } - CALL [13] { - function: _*_ - args: { - IDENT [14] { - name: @index0 - } - CONSTANT [15] { value: 0 } - } - } - } - } - CONSTANT [16] { value: 10 } - } - } - } -} -Test case: PRESENCE_TEST_WITH_TERNARY_3 -Source: (has(msg.oneof_type.payload.single_int64) ? msg.oneof_type.payload.single_int64 : msg.oneof_type.payload.single_int64 * 0) == 10 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - SELECT [3] { - SELECT [4] { - SELECT [5] { - IDENT [6] { - name: msg - }.oneof_type - }.payload - }.single_int64 - } - } - } - CALL [7] { - function: _==_ - args: { - CALL [8] { - function: _?_:_ - args: { - SELECT [9] { - SELECT [10] { - SELECT [11] { - IDENT [12] { - name: msg - }.oneof_type - }.payload - }.single_int64~presence_test - } - IDENT [13] { - name: @index0 - } - CALL [14] { - function: _*_ - args: { - IDENT [15] { - name: @index0 - } - CONSTANT [16] { value: 0 } - } - } - } - } - CONSTANT [17] { value: 10 } - } - } - } -} -Test case: PRESENCE_TEST_WITH_TERNARY_NESTED -Source: (has(msg.oneof_type) && has(msg.oneof_type.payload) && has(msg.oneof_type.payload.single_int64)) ? ((has(msg.oneof_type.payload.map_string_string) && has(msg.oneof_type.payload.map_string_string.key)) ? msg.oneof_type.payload.map_string_string.key == 'A' : false) : false -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - SELECT [3] { - SELECT [4] { - SELECT [5] { - IDENT [6] { - name: msg - }.oneof_type - }.payload - }.map_string_string - } - SELECT [7] { - SELECT [8] { - IDENT [9] { - name: msg - }.oneof_type - }.payload - } - } - } - CALL [10] { - function: _?_:_ - args: { - CALL [11] { - function: _&&_ - args: { - CALL [12] { - function: _&&_ - args: { - SELECT [13] { - IDENT [14] { - name: msg - }.oneof_type~presence_test - } - SELECT [15] { - SELECT [16] { - IDENT [17] { - name: msg - }.oneof_type - }.payload~presence_test - } - } - } - SELECT [18] { - IDENT [19] { - name: @index1 - }.single_int64~presence_test - } - } - } - CALL [20] { - function: _?_:_ - args: { - CALL [21] { - function: _&&_ - args: { - SELECT [22] { - IDENT [23] { - name: @index1 - }.map_string_string~presence_test - } - SELECT [24] { - IDENT [25] { - name: @index0 - }.key~presence_test - } - } - } - CALL [26] { - function: _==_ - args: { - SELECT [27] { - IDENT [28] { - name: @index0 - }.key - } - CONSTANT [29] { value: "A" } - } - } - CONSTANT [30] { value: false } - } - } - CONSTANT [31] { value: false } - } - } - } -} -Test case: OPTIONAL_LIST -Source: [10, ?optional.none(), [?optional.none(), ?opt_x], [?optional.none(), ?opt_x]] == [10, [5], [5]] -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - LIST [3] { - elements: { - CALL [4] { - function: optional.none - args: { - } - } - IDENT [5] { - name: opt_x - } - } - optional_indices: [0, 1] - } - LIST [6] { - elements: { - CONSTANT [7] { value: 5 } - } - } - } - } - CALL [8] { - function: _==_ - args: { - LIST [9] { - elements: { - CONSTANT [10] { value: 10 } - CALL [11] { - function: optional.none - args: { - } - } - IDENT [12] { - name: @index0 - } - IDENT [13] { - name: @index0 - } - } - optional_indices: [0] - } - LIST [14] { - elements: { - CONSTANT [15] { value: 10 } - IDENT [16] { - name: @index1 - } - IDENT [17] { - name: @index1 - } - } - } - } - } - } -} -Test case: OPTIONAL_MAP -Source: {?'hello': optional.of('hello')}['hello'] + {?'hello': optional.of('hello')}['hello'] == 'hellohello' -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - CALL [3] { - function: _[_] - args: { - MAP [4] { - MAP_ENTRY [5] { - key: { - CONSTANT [6] { value: "hello" } - } - optional_entry: true - value: { - CALL [7] { - function: optional.of - args: { - CONSTANT [8] { value: "hello" } - } - } - } - } - } - CONSTANT [9] { value: "hello" } - } - } - } - } - CALL [10] { - function: _==_ - args: { - CALL [11] { - function: _+_ - args: { - IDENT [12] { - name: @index0 - } - IDENT [13] { - name: @index0 - } - } - } - CONSTANT [14] { value: "hellohello" } - } - } - } -} -Test case: OPTIONAL_MAP_CHAINED -Source: {?'key': optional.of('test')}[?'bogus'].or({'key': 'test'}[?'bogus']).orValue({'key': 'test'}['key']) == 'test' -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - MAP [3] { - MAP_ENTRY [4] { - key: { - CONSTANT [5] { value: "key" } - } - value: { - CONSTANT [6] { value: "test" } - } - } - } - } - } - CALL [7] { - function: _==_ - args: { - CALL [8] { - function: orValue - target: { - CALL [9] { - function: or - target: { - CALL [10] { - function: _[?_] - args: { - MAP [11] { - MAP_ENTRY [12] { - key: { - CONSTANT [13] { value: "key" } - } - optional_entry: true - value: { - CALL [14] { - function: optional.of - args: { - CONSTANT [15] { value: "test" } - } - } - } - } - } - CONSTANT [16] { value: "bogus" } - } - } - } - args: { - CALL [17] { - function: _[?_] - args: { - IDENT [18] { - name: @index0 - } - CONSTANT [19] { value: "bogus" } - } - } - } - } - } - args: { - CALL [20] { - function: _[_] - args: { - IDENT [21] { - name: @index0 - } - CONSTANT [22] { value: "key" } - } - } - } - } - CONSTANT [23] { value: "test" } - } - } - } -} -Test case: OPTIONAL_MESSAGE -Source: TestAllTypes{?single_int64: optional.ofNonZeroValue(1), ?single_int32: optional.of(4)}.single_int32 + TestAllTypes{?single_int64: optional.ofNonZeroValue(1), ?single_int32: optional.of(4)}.single_int64 == 5 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - STRUCT [3] { - name: cel.expr.conformance.proto3.TestAllTypes - entries: { - ENTRY [4] { - field_key: single_int64 - optional_entry: true - value: { - CALL [5] { - function: optional.ofNonZeroValue - args: { - CONSTANT [6] { value: 1 } - } - } - } - } - ENTRY [7] { - field_key: single_int32 - optional_entry: true - value: { - CALL [8] { - function: optional.of - args: { - CONSTANT [9] { value: 4 } - } - } - } - } - } - } - } - } - CALL [10] { - function: _==_ - args: { - CALL [11] { - function: _+_ - args: { - SELECT [12] { - IDENT [13] { - name: @index0 - }.single_int32 - } - SELECT [14] { - IDENT [15] { - name: @index0 - }.single_int64 - } - } - } - CONSTANT [16] { value: 5 } - } - } - } -} -Test case: CALL -Source: ('h' + 'e' + 'l' + 'l' + 'o' + ' world').matches('h' + 'e' + 'l' + 'l' + 'o') -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - CALL [3] { - function: _+_ - args: { - CALL [4] { - function: _+_ - args: { - CALL [5] { - function: _+_ - args: { - CALL [6] { - function: _+_ - args: { - CONSTANT [7] { value: "h" } - CONSTANT [8] { value: "e" } - } - } - CONSTANT [9] { value: "l" } - } - } - CONSTANT [10] { value: "l" } - } - } - CONSTANT [11] { value: "o" } - } - } - } - } - CALL [12] { - function: matches - target: { - CALL [13] { - function: _+_ - args: { - IDENT [14] { - name: @index0 - } - CONSTANT [15] { value: " world" } - } - } - } - args: { - IDENT [16] { - name: @index0 - } - } - } - } -} -Test case: CALL_ARGUMENT_NESTED_NO_COMMON_SUBEXPR -Source: 'hello world'.matches('h' + 'e' + 'l' + 'l' + 'o') -=====> -CALL [2] { - function: matches - target: { - CONSTANT [1] { value: "hello world" } - } - args: { - CALL [10] { - function: _+_ - args: { - CALL [8] { - function: _+_ - args: { - CALL [6] { - function: _+_ - args: { - CALL [4] { - function: _+_ - args: { - CONSTANT [3] { value: "h" } - CONSTANT [5] { value: "e" } - } - } - CONSTANT [7] { value: "l" } - } - } - CONSTANT [9] { value: "l" } - } - } - CONSTANT [11] { value: "o" } - } - } - } -} -Test case: CALL_TARGET_NESTED_NO_COMMON_SUBEXPR -Source: ('h' + 'e' + 'l' + 'l' + 'o' + ' world').matches('hello') -=====> -CALL [12] { - function: matches - target: { - CALL [10] { - function: _+_ - args: { - CALL [8] { - function: _+_ - args: { - CALL [6] { - function: _+_ - args: { - CALL [4] { - function: _+_ - args: { - CALL [2] { - function: _+_ - args: { - CONSTANT [1] { value: "h" } - CONSTANT [3] { value: "e" } - } - } - CONSTANT [5] { value: "l" } - } - } - CONSTANT [7] { value: "l" } - } - } - CONSTANT [9] { value: "o" } - } - } - CONSTANT [11] { value: " world" } - } - } - } - args: { - CONSTANT [13] { value: "hello" } - } -} -Test case: CALL_BOTH_ARGUMENT_TARGET_NESTED_NO_COMMON_SUBEXPR -Source: ('h' + 'e' + 'l' + 'l' + 'o' + ' world').matches('w' + 'o' + 'r' + 'l' + 'd') -=====> -CALL [12] { - function: matches - target: { - CALL [10] { - function: _+_ - args: { - CALL [8] { - function: _+_ - args: { - CALL [6] { - function: _+_ - args: { - CALL [4] { - function: _+_ - args: { - CALL [2] { - function: _+_ - args: { - CONSTANT [1] { value: "h" } - CONSTANT [3] { value: "e" } - } - } - CONSTANT [5] { value: "l" } - } - } - CONSTANT [7] { value: "l" } - } - } - CONSTANT [9] { value: "o" } - } - } - CONSTANT [11] { value: " world" } - } - } - } - args: { - CALL [20] { - function: _+_ - args: { - CALL [18] { - function: _+_ - args: { - CALL [16] { - function: _+_ - args: { - CALL [14] { - function: _+_ - args: { - CONSTANT [13] { value: "w" } - CONSTANT [15] { value: "o" } - } - } - CONSTANT [17] { value: "r" } - } - } - CONSTANT [19] { value: "l" } - } - } - CONSTANT [21] { value: "d" } - } - } - } -} -Test case: CUSTOM_FUNCTION_INELIMINABLE -Source: non_pure_custom_func(msg.oneof_type.payload.single_int64) + non_pure_custom_func(msg.oneof_type.payload.single_int32) + non_pure_custom_func(msg.oneof_type.payload.single_int64) + non_pure_custom_func(msg.single_int64) -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - SELECT [3] { - SELECT [4] { - SELECT [5] { - IDENT [6] { - name: msg - }.oneof_type - }.payload - }.single_int64 - } - } - } - CALL [7] { - function: _+_ - args: { - CALL [8] { - function: _+_ - args: { - CALL [9] { - function: _+_ - args: { - CALL [10] { - function: non_pure_custom_func - args: { - IDENT [11] { - name: @index0 - } - } - } - CALL [12] { - function: non_pure_custom_func - args: { - SELECT [13] { - SELECT [14] { - SELECT [15] { - IDENT [16] { - name: msg - }.oneof_type - }.payload - }.single_int32 - } - } - } - } - } - CALL [17] { - function: non_pure_custom_func - args: { - IDENT [18] { - name: @index0 - } - } - } - } - } - CALL [19] { - function: non_pure_custom_func - args: { - SELECT [20] { - IDENT [21] { - name: msg - }.single_int64 - } - } - } - } - } - } -} -Test case: CUSTOM_FUNCTION_ELIMINABLE -Source: pure_custom_func(msg.oneof_type.payload.single_int64) + pure_custom_func(msg.oneof_type.payload.single_int32) + pure_custom_func(msg.oneof_type.payload.single_int64) + pure_custom_func(msg.single_int64) -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - CALL [3] { - function: pure_custom_func - args: { - SELECT [4] { - SELECT [5] { - SELECT [6] { - IDENT [7] { - name: msg - }.oneof_type - }.payload - }.single_int64 - } - } - } - } - } - CALL [8] { - function: _+_ - args: { - CALL [9] { - function: _+_ - args: { - CALL [10] { - function: _+_ - args: { - IDENT [11] { - name: @index0 - } - CALL [12] { - function: pure_custom_func - args: { - SELECT [13] { - SELECT [14] { - SELECT [15] { - IDENT [16] { - name: msg - }.oneof_type - }.payload - }.single_int32 - } - } - } - } - } - IDENT [17] { - name: @index0 - } - } - } - CALL [18] { - function: pure_custom_func - args: { - SELECT [19] { - IDENT [20] { - name: msg - }.single_int64 - } - } - } - } - } - } -} \ No newline at end of file diff --git a/optimizer/src/test/resources/subexpression_ast_block_recursion_depth_9.baseline b/optimizer/src/test/resources/subexpression_ast_block_recursion_depth_9.baseline deleted file mode 100644 index c2d7334af..000000000 --- a/optimizer/src/test/resources/subexpression_ast_block_recursion_depth_9.baseline +++ /dev/null @@ -1,4802 +0,0 @@ -Test case: SIZE_1 -Source: size([1,2]) + size([1,2]) + 1 == 5 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - CALL [3] { - function: size - args: { - LIST [4] { - elements: { - CONSTANT [5] { value: 1 } - CONSTANT [6] { value: 2 } - } - } - } - } - } - } - CALL [7] { - function: _==_ - args: { - CALL [8] { - function: _+_ - args: { - CALL [9] { - function: _+_ - args: { - IDENT [10] { - name: @index0 - } - IDENT [11] { - name: @index0 - } - } - } - CONSTANT [12] { value: 1 } - } - } - CONSTANT [13] { value: 5 } - } - } - } -} -Test case: SIZE_2 -Source: 2 + size([1,2]) + size([1,2]) + 1 == 7 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - CALL [3] { - function: size - args: { - LIST [4] { - elements: { - CONSTANT [5] { value: 1 } - CONSTANT [6] { value: 2 } - } - } - } - } - } - } - CALL [7] { - function: _==_ - args: { - CALL [8] { - function: _+_ - args: { - CALL [9] { - function: _+_ - args: { - CALL [10] { - function: _+_ - args: { - CONSTANT [11] { value: 2 } - IDENT [12] { - name: @index0 - } - } - } - IDENT [13] { - name: @index0 - } - } - } - CONSTANT [14] { value: 1 } - } - } - CONSTANT [15] { value: 7 } - } - } - } -} -Test case: SIZE_3 -Source: size([0]) + size([0]) + size([1,2]) + size([1,2]) == 6 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - CALL [3] { - function: size - args: { - LIST [4] { - elements: { - CONSTANT [5] { value: 0 } - } - } - } - } - CALL [6] { - function: size - args: { - LIST [7] { - elements: { - CONSTANT [8] { value: 1 } - CONSTANT [9] { value: 2 } - } - } - } - } - } - } - CALL [10] { - function: _==_ - args: { - CALL [11] { - function: _+_ - args: { - CALL [12] { - function: _+_ - args: { - CALL [13] { - function: _+_ - args: { - IDENT [14] { - name: @index0 - } - IDENT [15] { - name: @index0 - } - } - } - IDENT [16] { - name: @index1 - } - } - } - IDENT [17] { - name: @index1 - } - } - } - CONSTANT [18] { value: 6 } - } - } - } -} -Test case: SIZE_4 -Source: 5 + size([0]) + size([0]) + size([1,2]) + size([1,2]) + size([1,2,3]) + size([1,2,3]) == 17 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - CALL [3] { - function: size - args: { - LIST [4] { - elements: { - CONSTANT [5] { value: 0 } - } - } - } - } - CALL [6] { - function: size - args: { - LIST [7] { - elements: { - CONSTANT [8] { value: 1 } - CONSTANT [9] { value: 2 } - } - } - } - } - CALL [10] { - function: size - args: { - LIST [11] { - elements: { - CONSTANT [12] { value: 1 } - CONSTANT [13] { value: 2 } - CONSTANT [14] { value: 3 } - } - } - } - } - } - } - CALL [15] { - function: _==_ - args: { - CALL [16] { - function: _+_ - args: { - CALL [17] { - function: _+_ - args: { - CALL [18] { - function: _+_ - args: { - CALL [19] { - function: _+_ - args: { - CALL [20] { - function: _+_ - args: { - CALL [21] { - function: _+_ - args: { - CONSTANT [22] { value: 5 } - IDENT [23] { - name: @index0 - } - } - } - IDENT [24] { - name: @index0 - } - } - } - IDENT [25] { - name: @index1 - } - } - } - IDENT [26] { - name: @index1 - } - } - } - IDENT [27] { - name: @index2 - } - } - } - IDENT [28] { - name: @index2 - } - } - } - CONSTANT [29] { value: 17 } - } - } - } -} -Test case: TIMESTAMP -Source: timestamp(int(timestamp(1000000000))).getFullYear() + timestamp(int(timestamp(75))).getFullYear() + timestamp(int(timestamp(50))).getFullYear() + timestamp(int(timestamp(1000000000))).getFullYear() + timestamp(int(timestamp(50))).getSeconds() + timestamp(int(timestamp(200))).getFullYear() + timestamp(int(timestamp(200))).getFullYear() + timestamp(int(timestamp(75))).getMinutes() + timestamp(int(timestamp(1000000000))).getFullYear() == 13934 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - CALL [3] { - function: getFullYear - target: { - CALL [4] { - function: timestamp - args: { - CALL [5] { - function: int - args: { - CALL [6] { - function: timestamp - args: { - CONSTANT [7] { value: 1000000000 } - } - } - } - } - } - } - } - args: { - } - } - CALL [8] { - function: getFullYear - target: { - CALL [9] { - function: timestamp - args: { - CALL [10] { - function: int - args: { - CALL [11] { - function: timestamp - args: { - CONSTANT [12] { value: 200 } - } - } - } - } - } - } - } - args: { - } - } - CALL [13] { - function: timestamp - args: { - CALL [14] { - function: int - args: { - CALL [15] { - function: timestamp - args: { - CONSTANT [16] { value: 50 } - } - } - } - } - } - } - CALL [17] { - function: timestamp - args: { - CALL [18] { - function: int - args: { - CALL [19] { - function: timestamp - args: { - CONSTANT [20] { value: 75 } - } - } - } - } - } - } - CALL [21] { - function: _+_ - args: { - CALL [22] { - function: _+_ - args: { - CALL [23] { - function: _+_ - args: { - CALL [24] { - function: _+_ - args: { - CALL [25] { - function: _+_ - args: { - CALL [26] { - function: _+_ - args: { - CALL [27] { - function: _+_ - args: { - CALL [28] { - function: _+_ - args: { - IDENT [29] { - name: @index0 - } - CALL [30] { - function: getFullYear - target: { - IDENT [31] { - name: @index3 - } - } - args: { - } - } - } - } - CALL [32] { - function: getFullYear - target: { - IDENT [33] { - name: @index2 - } - } - args: { - } - } - } - } - IDENT [34] { - name: @index0 - } - } - } - CALL [35] { - function: getSeconds - target: { - IDENT [36] { - name: @index2 - } - } - args: { - } - } - } - } - IDENT [37] { - name: @index1 - } - } - } - IDENT [38] { - name: @index1 - } - } - } - CALL [39] { - function: getMinutes - target: { - IDENT [40] { - name: @index3 - } - } - args: { - } - } - } - } - IDENT [41] { - name: @index0 - } - } - } - } - } - CALL [42] { - function: _==_ - args: { - IDENT [43] { - name: @index4 - } - CONSTANT [44] { value: 13934 } - } - } - } -} -Test case: MAP_INDEX -Source: {"a": 2}["a"] + {"a": 2}["a"] * {"a": 2}["a"] == 6 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - CALL [3] { - function: _[_] - args: { - MAP [4] { - MAP_ENTRY [5] { - key: { - CONSTANT [6] { value: "a" } - } - value: { - CONSTANT [7] { value: 2 } - } - } - } - CONSTANT [8] { value: "a" } - } - } - } - } - CALL [9] { - function: _==_ - args: { - CALL [10] { - function: _+_ - args: { - IDENT [11] { - name: @index0 - } - CALL [12] { - function: _*_ - args: { - IDENT [13] { - name: @index0 - } - IDENT [14] { - name: @index0 - } - } - } - } - } - CONSTANT [15] { value: 6 } - } - } - } -} -Test case: NESTED_MAP_CONSTRUCTION -Source: {'a': {'b': 1}, 'c': {'b': 1}, 'd': {'e': {'b': 1}}, 'e': {'e': {'b': 1}}} -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - MAP [3] { - MAP_ENTRY [4] { - key: { - CONSTANT [5] { value: "e" } - } - value: { - MAP [6] { - MAP_ENTRY [7] { - key: { - CONSTANT [8] { value: "b" } - } - value: { - CONSTANT [9] { value: 1 } - } - } - } - } - } - } - MAP [10] { - MAP_ENTRY [11] { - key: { - CONSTANT [12] { value: "b" } - } - value: { - CONSTANT [13] { value: 1 } - } - } - } - } - } - MAP [14] { - MAP_ENTRY [15] { - key: { - CONSTANT [16] { value: "a" } - } - value: { - IDENT [17] { - name: @index1 - } - } - } - MAP_ENTRY [18] { - key: { - CONSTANT [19] { value: "c" } - } - value: { - IDENT [20] { - name: @index1 - } - } - } - MAP_ENTRY [21] { - key: { - CONSTANT [22] { value: "d" } - } - value: { - IDENT [23] { - name: @index0 - } - } - } - MAP_ENTRY [24] { - key: { - CONSTANT [25] { value: "e" } - } - value: { - IDENT [26] { - name: @index0 - } - } - } - } - } -} -Test case: NESTED_LIST_CONSTRUCTION -Source: [1, [1,2,3,4], 2, [1,2,3,4], 5, [1,2,3,4], 7, [[1,2], [1,2,3,4]], [1,2]] -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - LIST [3] { - elements: { - CONSTANT [4] { value: 1 } - CONSTANT [5] { value: 2 } - CONSTANT [6] { value: 3 } - CONSTANT [7] { value: 4 } - } - } - LIST [8] { - elements: { - CONSTANT [9] { value: 1 } - CONSTANT [10] { value: 2 } - } - } - } - } - LIST [11] { - elements: { - CONSTANT [12] { value: 1 } - IDENT [13] { - name: @index0 - } - CONSTANT [14] { value: 2 } - IDENT [15] { - name: @index0 - } - CONSTANT [16] { value: 5 } - IDENT [17] { - name: @index0 - } - CONSTANT [18] { value: 7 } - LIST [19] { - elements: { - IDENT [20] { - name: @index1 - } - IDENT [21] { - name: @index0 - } - } - } - IDENT [22] { - name: @index1 - } - } - } - } -} -Test case: SELECT -Source: msg.single_int64 + msg.single_int64 == 6 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - SELECT [3] { - IDENT [4] { - name: msg - }.single_int64 - } - } - } - CALL [5] { - function: _==_ - args: { - CALL [6] { - function: _+_ - args: { - IDENT [7] { - name: @index0 - } - IDENT [8] { - name: @index0 - } - } - } - CONSTANT [9] { value: 6 } - } - } - } -} -Test case: SELECT_NESTED_1 -Source: msg.oneof_type.payload.single_int64 + msg.oneof_type.payload.single_int32 + msg.oneof_type.payload.single_int64 + msg.single_int64 + msg.oneof_type.payload.oneof_type.payload.single_int64 == 31 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - SELECT [3] { - SELECT [4] { - SELECT [5] { - IDENT [6] { - name: msg - }.oneof_type - }.payload - }.single_int64 - } - SELECT [7] { - SELECT [8] { - IDENT [9] { - name: msg - }.oneof_type - }.payload - } - } - } - CALL [10] { - function: _==_ - args: { - CALL [11] { - function: _+_ - args: { - CALL [12] { - function: _+_ - args: { - CALL [13] { - function: _+_ - args: { - CALL [14] { - function: _+_ - args: { - IDENT [15] { - name: @index0 - } - SELECT [16] { - IDENT [17] { - name: @index1 - }.single_int32 - } - } - } - IDENT [18] { - name: @index0 - } - } - } - SELECT [19] { - IDENT [20] { - name: msg - }.single_int64 - } - } - } - SELECT [21] { - SELECT [22] { - SELECT [23] { - IDENT [24] { - name: @index1 - }.oneof_type - }.payload - }.single_int64 - } - } - } - CONSTANT [25] { value: 31 } - } - } - } -} -Test case: SELECT_NESTED_2 -Source: true || msg.oneof_type.payload.oneof_type.payload.oneof_type.payload.oneof_type.payload.single_bool || msg.oneof_type.payload.oneof_type.payload.oneof_type.child.child.payload.single_bool -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - SELECT [3] { - SELECT [4] { - SELECT [5] { - SELECT [6] { - SELECT [7] { - IDENT [8] { - name: msg - }.oneof_type - }.payload - }.oneof_type - }.payload - }.oneof_type - } - } - } - CALL [9] { - function: _||_ - args: { - CALL [10] { - function: _||_ - args: { - CONSTANT [11] { value: true } - SELECT [12] { - SELECT [13] { - SELECT [14] { - SELECT [15] { - IDENT [16] { - name: @index0 - }.payload - }.oneof_type - }.payload - }.single_bool - } - } - } - SELECT [17] { - SELECT [18] { - SELECT [19] { - SELECT [20] { - IDENT [21] { - name: @index0 - }.child - }.child - }.payload - }.single_bool - } - } - } - } -} -Test case: SELECT_NESTED_MESSAGE_MAP_INDEX_1 -Source: msg.oneof_type.payload.map_int32_int64[1] + msg.oneof_type.payload.map_int32_int64[1] + msg.oneof_type.payload.map_int32_int64[1] == 15 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - CALL [3] { - function: _[_] - args: { - SELECT [4] { - SELECT [5] { - SELECT [6] { - IDENT [7] { - name: msg - }.oneof_type - }.payload - }.map_int32_int64 - } - CONSTANT [8] { value: 1 } - } - } - } - } - CALL [9] { - function: _==_ - args: { - CALL [10] { - function: _+_ - args: { - CALL [11] { - function: _+_ - args: { - IDENT [12] { - name: @index0 - } - IDENT [13] { - name: @index0 - } - } - } - IDENT [14] { - name: @index0 - } - } - } - CONSTANT [15] { value: 15 } - } - } - } -} -Test case: SELECT_NESTED_MESSAGE_MAP_INDEX_2 -Source: msg.oneof_type.payload.map_int32_int64[0] + msg.oneof_type.payload.map_int32_int64[1] + msg.oneof_type.payload.map_int32_int64[2] == 8 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - SELECT [3] { - SELECT [4] { - SELECT [5] { - IDENT [6] { - name: msg - }.oneof_type - }.payload - }.map_int32_int64 - } - } - } - CALL [7] { - function: _==_ - args: { - CALL [8] { - function: _+_ - args: { - CALL [9] { - function: _+_ - args: { - CALL [10] { - function: _[_] - args: { - IDENT [11] { - name: @index0 - } - CONSTANT [12] { value: 0 } - } - } - CALL [13] { - function: _[_] - args: { - IDENT [14] { - name: @index0 - } - CONSTANT [15] { value: 1 } - } - } - } - } - CALL [16] { - function: _[_] - args: { - IDENT [17] { - name: @index0 - } - CONSTANT [18] { value: 2 } - } - } - } - } - CONSTANT [19] { value: 8 } - } - } - } -} -Test case: SELECT_NESTED_NO_COMMON_SUBEXPR -Source: msg.oneof_type.payload.oneof_type.payload.oneof_type.payload.oneof_type.payload.single_int64 -=====> -SELECT [10] { - SELECT [9] { - SELECT [8] { - SELECT [7] { - SELECT [6] { - SELECT [5] { - SELECT [4] { - SELECT [3] { - SELECT [2] { - IDENT [1] { - name: msg - }.oneof_type - }.payload - }.oneof_type - }.payload - }.oneof_type - }.payload - }.oneof_type - }.payload - }.single_int64 -} -Test case: TERNARY -Source: (msg.single_int64 > 0 ? msg.single_int64 : 0) == 3 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - SELECT [3] { - IDENT [4] { - name: msg - }.single_int64 - } - } - } - CALL [5] { - function: _==_ - args: { - CALL [6] { - function: _?_:_ - args: { - CALL [7] { - function: _>_ - args: { - IDENT [8] { - name: @index0 - } - CONSTANT [9] { value: 0 } - } - } - IDENT [10] { - name: @index0 - } - CONSTANT [11] { value: 0 } - } - } - CONSTANT [12] { value: 3 } - } - } - } -} -Test case: TERNARY_BIND_RHS_ONLY -Source: false ? false : (msg.single_int64) + ((msg.single_int64 + 1) * 2) == 11 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - SELECT [3] { - IDENT [4] { - name: msg - }.single_int64 - } - } - } - CALL [5] { - function: _?_:_ - args: { - CONSTANT [6] { value: false } - CONSTANT [7] { value: false } - CALL [8] { - function: _==_ - args: { - CALL [9] { - function: _+_ - args: { - IDENT [10] { - name: @index0 - } - CALL [11] { - function: _*_ - args: { - CALL [12] { - function: _+_ - args: { - IDENT [13] { - name: @index0 - } - CONSTANT [14] { value: 1 } - } - } - CONSTANT [15] { value: 2 } - } - } - } - } - CONSTANT [16] { value: 11 } - } - } - } - } - } -} -Test case: NESTED_TERNARY -Source: (msg.single_int64 > 0 ? (msg.single_int32 > 0 ? msg.single_int64 + msg.single_int32 : 0) : 0) == 8 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - SELECT [3] { - IDENT [4] { - name: msg - }.single_int64 - } - SELECT [5] { - IDENT [6] { - name: msg - }.single_int32 - } - } - } - CALL [7] { - function: _==_ - args: { - CALL [8] { - function: _?_:_ - args: { - CALL [9] { - function: _>_ - args: { - IDENT [10] { - name: @index0 - } - CONSTANT [11] { value: 0 } - } - } - CALL [12] { - function: _?_:_ - args: { - CALL [13] { - function: _>_ - args: { - IDENT [14] { - name: @index1 - } - CONSTANT [15] { value: 0 } - } - } - CALL [16] { - function: _+_ - args: { - IDENT [17] { - name: @index0 - } - IDENT [18] { - name: @index1 - } - } - } - CONSTANT [19] { value: 0 } - } - } - CONSTANT [20] { value: 0 } - } - } - CONSTANT [21] { value: 8 } - } - } - } -} -Test case: MULTIPLE_MACROS_1 -Source: size([[1].exists(i, i > 0)]) + size([[1].exists(j, j > 0)]) + size([[2].exists(k, k > 1)]) + size([[2].exists(l, l > 1)]) == 4 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - COMPREHENSION [3] { - iter_var: @it:0:0 - iter_range: { - LIST [4] { - elements: { - CONSTANT [5] { value: 1 } - } - } - } - accu_var: @ac:0:0 - accu_init: { - CONSTANT [6] { value: false } - } - loop_condition: { - CALL [7] { - function: @not_strictly_false - args: { - CALL [8] { - function: !_ - args: { - IDENT [9] { - name: @ac:0:0 - } - } - } - } - } - } - loop_step: { - CALL [10] { - function: _||_ - args: { - IDENT [11] { - name: @ac:0:0 - } - CALL [12] { - function: _>_ - args: { - IDENT [13] { - name: @it:0:0 - } - CONSTANT [14] { value: 0 } - } - } - } - } - } - result: { - IDENT [15] { - name: @ac:0:0 - } - } - } - COMPREHENSION [16] { - iter_var: @it:0:0 - iter_range: { - LIST [17] { - elements: { - CONSTANT [18] { value: 2 } - } - } - } - accu_var: @ac:0:0 - accu_init: { - CONSTANT [19] { value: false } - } - loop_condition: { - CALL [20] { - function: @not_strictly_false - args: { - CALL [21] { - function: !_ - args: { - IDENT [22] { - name: @ac:0:0 - } - } - } - } - } - } - loop_step: { - CALL [23] { - function: _||_ - args: { - IDENT [24] { - name: @ac:0:0 - } - CALL [25] { - function: _>_ - args: { - IDENT [26] { - name: @it:0:0 - } - CONSTANT [27] { value: 1 } - } - } - } - } - } - result: { - IDENT [28] { - name: @ac:0:0 - } - } - } - CALL [29] { - function: size - args: { - LIST [30] { - elements: { - IDENT [31] { - name: @index0 - } - } - } - } - } - CALL [32] { - function: size - args: { - LIST [33] { - elements: { - IDENT [34] { - name: @index1 - } - } - } - } - } - } - } - CALL [35] { - function: _==_ - args: { - CALL [36] { - function: _+_ - args: { - CALL [37] { - function: _+_ - args: { - CALL [38] { - function: _+_ - args: { - IDENT [39] { - name: @index2 - } - IDENT [40] { - name: @index2 - } - } - } - IDENT [41] { - name: @index3 - } - } - } - IDENT [42] { - name: @index3 - } - } - } - CONSTANT [43] { value: 4 } - } - } - } -} -Test case: MULTIPLE_MACROS_2 -Source: [[1].exists(i, i > 0)] + [[1].exists(j, j > 0)] + [['a'].exists(k, k == 'a')] + [['a'].exists(l, l == 'a')] == [true, true, true, true] -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - COMPREHENSION [3] { - iter_var: @it:0:0 - iter_range: { - LIST [4] { - elements: { - CONSTANT [5] { value: 1 } - } - } - } - accu_var: @ac:0:0 - accu_init: { - CONSTANT [6] { value: false } - } - loop_condition: { - CALL [7] { - function: @not_strictly_false - args: { - CALL [8] { - function: !_ - args: { - IDENT [9] { - name: @ac:0:0 - } - } - } - } - } - } - loop_step: { - CALL [10] { - function: _||_ - args: { - IDENT [11] { - name: @ac:0:0 - } - CALL [12] { - function: _>_ - args: { - IDENT [13] { - name: @it:0:0 - } - CONSTANT [14] { value: 0 } - } - } - } - } - } - result: { - IDENT [15] { - name: @ac:0:0 - } - } - } - COMPREHENSION [16] { - iter_var: @it:0:1 - iter_range: { - LIST [17] { - elements: { - CONSTANT [18] { value: "a" } - } - } - } - accu_var: @ac:0:1 - accu_init: { - CONSTANT [19] { value: false } - } - loop_condition: { - CALL [20] { - function: @not_strictly_false - args: { - CALL [21] { - function: !_ - args: { - IDENT [22] { - name: @ac:0:1 - } - } - } - } - } - } - loop_step: { - CALL [23] { - function: _||_ - args: { - IDENT [24] { - name: @ac:0:1 - } - CALL [25] { - function: _==_ - args: { - IDENT [26] { - name: @it:0:1 - } - CONSTANT [27] { value: "a" } - } - } - } - } - } - result: { - IDENT [28] { - name: @ac:0:1 - } - } - } - LIST [29] { - elements: { - IDENT [30] { - name: @index0 - } - } - } - LIST [31] { - elements: { - IDENT [32] { - name: @index1 - } - } - } - } - } - CALL [33] { - function: _==_ - args: { - CALL [34] { - function: _+_ - args: { - CALL [35] { - function: _+_ - args: { - CALL [36] { - function: _+_ - args: { - IDENT [37] { - name: @index2 - } - IDENT [38] { - name: @index2 - } - } - } - IDENT [39] { - name: @index3 - } - } - } - IDENT [40] { - name: @index3 - } - } - } - LIST [41] { - elements: { - CONSTANT [42] { value: true } - CONSTANT [43] { value: true } - CONSTANT [44] { value: true } - CONSTANT [45] { value: true } - } - } - } - } - } -} -Test case: MULTIPLE_MACROS_3 -Source: [1].exists(i, i > 0) && [1].exists(j, j > 0) && [1].exists(k, k > 1) && [2].exists(l, l > 1) -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - COMPREHENSION [3] { - iter_var: @it:0:0 - iter_range: { - LIST [4] { - elements: { - CONSTANT [5] { value: 1 } - } - } - } - accu_var: @ac:0:0 - accu_init: { - CONSTANT [6] { value: false } - } - loop_condition: { - CALL [7] { - function: @not_strictly_false - args: { - CALL [8] { - function: !_ - args: { - IDENT [9] { - name: @ac:0:0 - } - } - } - } - } - } - loop_step: { - CALL [10] { - function: _||_ - args: { - IDENT [11] { - name: @ac:0:0 - } - CALL [12] { - function: _>_ - args: { - IDENT [13] { - name: @it:0:0 - } - CONSTANT [14] { value: 0 } - } - } - } - } - } - result: { - IDENT [15] { - name: @ac:0:0 - } - } - } - } - } - CALL [16] { - function: _&&_ - args: { - CALL [17] { - function: _&&_ - args: { - IDENT [18] { - name: @index0 - } - IDENT [19] { - name: @index0 - } - } - } - CALL [20] { - function: _&&_ - args: { - COMPREHENSION [21] { - iter_var: @it:0:0 - iter_range: { - LIST [22] { - elements: { - CONSTANT [23] { value: 1 } - } - } - } - accu_var: @ac:0:0 - accu_init: { - CONSTANT [24] { value: false } - } - loop_condition: { - CALL [25] { - function: @not_strictly_false - args: { - CALL [26] { - function: !_ - args: { - IDENT [27] { - name: @ac:0:0 - } - } - } - } - } - } - loop_step: { - CALL [28] { - function: _||_ - args: { - IDENT [29] { - name: @ac:0:0 - } - CALL [30] { - function: _>_ - args: { - IDENT [31] { - name: @it:0:0 - } - CONSTANT [32] { value: 1 } - } - } - } - } - } - result: { - IDENT [33] { - name: @ac:0:0 - } - } - } - COMPREHENSION [34] { - iter_var: @it:0:0 - iter_range: { - LIST [35] { - elements: { - CONSTANT [36] { value: 2 } - } - } - } - accu_var: @ac:0:0 - accu_init: { - CONSTANT [37] { value: false } - } - loop_condition: { - CALL [38] { - function: @not_strictly_false - args: { - CALL [39] { - function: !_ - args: { - IDENT [40] { - name: @ac:0:0 - } - } - } - } - } - } - loop_step: { - CALL [41] { - function: _||_ - args: { - IDENT [42] { - name: @ac:0:0 - } - CALL [43] { - function: _>_ - args: { - IDENT [44] { - name: @it:0:0 - } - CONSTANT [45] { value: 1 } - } - } - } - } - } - result: { - IDENT [46] { - name: @ac:0:0 - } - } - } - } - } - } - } - } -} -Test case: MULTIPLE_MACROS_COMP_V2_1 -Source: size([[1].exists(i,x,i > 0 && x >= 0)]) + size([[1].exists(j, y, j > 0 && y >= 0)]) + size([[2].exists(k,z,k > 1 && z >= 0)]) + size([[2].exists(l, w, l > 1 && w >= 0)]) == 4 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - COMPREHENSION [3] { - iter_var: @it:0:0 - iter_var2: @it2:0:0 - iter_range: { - LIST [4] { - elements: { - CONSTANT [5] { value: 1 } - } - } - } - accu_var: @ac:0:0 - accu_init: { - CONSTANT [6] { value: false } - } - loop_condition: { - CALL [7] { - function: @not_strictly_false - args: { - CALL [8] { - function: !_ - args: { - IDENT [9] { - name: @ac:0:0 - } - } - } - } - } - } - loop_step: { - CALL [10] { - function: _||_ - args: { - IDENT [11] { - name: @ac:0:0 - } - CALL [12] { - function: _&&_ - args: { - CALL [13] { - function: _>_ - args: { - IDENT [14] { - name: @it:0:0 - } - CONSTANT [15] { value: 0 } - } - } - CALL [16] { - function: _>=_ - args: { - IDENT [17] { - name: @it2:0:0 - } - CONSTANT [18] { value: 0 } - } - } - } - } - } - } - } - result: { - IDENT [19] { - name: @ac:0:0 - } - } - } - COMPREHENSION [20] { - iter_var: @it:0:0 - iter_var2: @it2:0:0 - iter_range: { - LIST [21] { - elements: { - CONSTANT [22] { value: 2 } - } - } - } - accu_var: @ac:0:0 - accu_init: { - CONSTANT [23] { value: false } - } - loop_condition: { - CALL [24] { - function: @not_strictly_false - args: { - CALL [25] { - function: !_ - args: { - IDENT [26] { - name: @ac:0:0 - } - } - } - } - } - } - loop_step: { - CALL [27] { - function: _||_ - args: { - IDENT [28] { - name: @ac:0:0 - } - CALL [29] { - function: _&&_ - args: { - CALL [30] { - function: _>_ - args: { - IDENT [31] { - name: @it:0:0 - } - CONSTANT [32] { value: 1 } - } - } - CALL [33] { - function: _>=_ - args: { - IDENT [34] { - name: @it2:0:0 - } - CONSTANT [35] { value: 0 } - } - } - } - } - } - } - } - result: { - IDENT [36] { - name: @ac:0:0 - } - } - } - CALL [37] { - function: size - args: { - LIST [38] { - elements: { - IDENT [39] { - name: @index0 - } - } - } - } - } - CALL [40] { - function: size - args: { - LIST [41] { - elements: { - IDENT [42] { - name: @index1 - } - } - } - } - } - } - } - CALL [43] { - function: _==_ - args: { - CALL [44] { - function: _+_ - args: { - CALL [45] { - function: _+_ - args: { - CALL [46] { - function: _+_ - args: { - IDENT [47] { - name: @index2 - } - IDENT [48] { - name: @index2 - } - } - } - IDENT [49] { - name: @index3 - } - } - } - IDENT [50] { - name: @index3 - } - } - } - CONSTANT [51] { value: 4 } - } - } - } -} -Test case: MULTIPLE_MACROS_COMP_V2_2 -Source: [1].exists(i, x, i > 0 && x > 0) && [1].exists(j, y, j > 0 && y > 0) && [1].exists(k, z, k > 1 && z > 0) && [2].exists(l, w, l > 1 && w > 0) -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - COMPREHENSION [3] { - iter_var: @it:0:0 - iter_var2: @it2:0:0 - iter_range: { - LIST [4] { - elements: { - CONSTANT [5] { value: 1 } - } - } - } - accu_var: @ac:0:0 - accu_init: { - CONSTANT [6] { value: false } - } - loop_condition: { - CALL [7] { - function: @not_strictly_false - args: { - CALL [8] { - function: !_ - args: { - IDENT [9] { - name: @ac:0:0 - } - } - } - } - } - } - loop_step: { - CALL [10] { - function: _||_ - args: { - IDENT [11] { - name: @ac:0:0 - } - CALL [12] { - function: _&&_ - args: { - CALL [13] { - function: _>_ - args: { - IDENT [14] { - name: @it:0:0 - } - CONSTANT [15] { value: 0 } - } - } - CALL [16] { - function: _>_ - args: { - IDENT [17] { - name: @it2:0:0 - } - CONSTANT [18] { value: 0 } - } - } - } - } - } - } - } - result: { - IDENT [19] { - name: @ac:0:0 - } - } - } - } - } - CALL [20] { - function: _&&_ - args: { - CALL [21] { - function: _&&_ - args: { - IDENT [22] { - name: @index0 - } - IDENT [23] { - name: @index0 - } - } - } - CALL [24] { - function: _&&_ - args: { - COMPREHENSION [25] { - iter_var: @it:0:0 - iter_var2: @it2:0:0 - iter_range: { - LIST [26] { - elements: { - CONSTANT [27] { value: 1 } - } - } - } - accu_var: @ac:0:0 - accu_init: { - CONSTANT [28] { value: false } - } - loop_condition: { - CALL [29] { - function: @not_strictly_false - args: { - CALL [30] { - function: !_ - args: { - IDENT [31] { - name: @ac:0:0 - } - } - } - } - } - } - loop_step: { - CALL [32] { - function: _||_ - args: { - IDENT [33] { - name: @ac:0:0 - } - CALL [34] { - function: _&&_ - args: { - CALL [35] { - function: _>_ - args: { - IDENT [36] { - name: @it:0:0 - } - CONSTANT [37] { value: 1 } - } - } - CALL [38] { - function: _>_ - args: { - IDENT [39] { - name: @it2:0:0 - } - CONSTANT [40] { value: 0 } - } - } - } - } - } - } - } - result: { - IDENT [41] { - name: @ac:0:0 - } - } - } - COMPREHENSION [42] { - iter_var: @it:0:0 - iter_var2: @it2:0:0 - iter_range: { - LIST [43] { - elements: { - CONSTANT [44] { value: 2 } - } - } - } - accu_var: @ac:0:0 - accu_init: { - CONSTANT [45] { value: false } - } - loop_condition: { - CALL [46] { - function: @not_strictly_false - args: { - CALL [47] { - function: !_ - args: { - IDENT [48] { - name: @ac:0:0 - } - } - } - } - } - } - loop_step: { - CALL [49] { - function: _||_ - args: { - IDENT [50] { - name: @ac:0:0 - } - CALL [51] { - function: _&&_ - args: { - CALL [52] { - function: _>_ - args: { - IDENT [53] { - name: @it:0:0 - } - CONSTANT [54] { value: 1 } - } - } - CALL [55] { - function: _>_ - args: { - IDENT [56] { - name: @it2:0:0 - } - CONSTANT [57] { value: 0 } - } - } - } - } - } - } - } - result: { - IDENT [58] { - name: @ac:0:0 - } - } - } - } - } - } - } - } -} -Test case: NESTED_MACROS -Source: [1,2,3].map(i, [1, 2, 3].map(i, i + 1)) == [[2, 3, 4], [2, 3, 4], [2, 3, 4]] -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - LIST [3] { - elements: { - CONSTANT [4] { value: 1 } - CONSTANT [5] { value: 2 } - CONSTANT [6] { value: 3 } - } - } - LIST [7] { - elements: { - CONSTANT [8] { value: 2 } - CONSTANT [9] { value: 3 } - CONSTANT [10] { value: 4 } - } - } - } - } - CALL [11] { - function: _==_ - args: { - COMPREHENSION [12] { - iter_var: @it:1:0 - iter_range: { - IDENT [13] { - name: @index0 - } - } - accu_var: @ac:1:0 - accu_init: { - LIST [14] { - elements: { - } - } - } - loop_condition: { - CONSTANT [15] { value: true } - } - loop_step: { - CALL [16] { - function: _+_ - args: { - IDENT [17] { - name: @ac:1:0 - } - LIST [18] { - elements: { - COMPREHENSION [19] { - iter_var: @it:0:0 - iter_range: { - IDENT [20] { - name: @index0 - } - } - accu_var: @ac:0:0 - accu_init: { - LIST [21] { - elements: { - } - } - } - loop_condition: { - CONSTANT [22] { value: true } - } - loop_step: { - CALL [23] { - function: _+_ - args: { - IDENT [24] { - name: @ac:0:0 - } - LIST [25] { - elements: { - CALL [26] { - function: _+_ - args: { - IDENT [27] { - name: @it:0:0 - } - CONSTANT [28] { value: 1 } - } - } - } - } - } - } - } - result: { - IDENT [29] { - name: @ac:0:0 - } - } - } - } - } - } - } - } - result: { - IDENT [30] { - name: @ac:1:0 - } - } - } - LIST [31] { - elements: { - IDENT [32] { - name: @index1 - } - IDENT [33] { - name: @index1 - } - IDENT [34] { - name: @index1 - } - } - } - } - } - } -} -Test case: NESTED_MACROS_2 -Source: [1, 2].map(y, [1, 2, 3].filter(x, x == y)) == [[1], [2]] -=====> -CALL [31] { - function: _==_ - args: { - COMPREHENSION [30] { - iter_var: y - iter_range: { - LIST [1] { - elements: { - CONSTANT [2] { value: 1 } - CONSTANT [3] { value: 2 } - } - } - } - accu_var: @result - accu_init: { - LIST [24] { - elements: { - } - } - } - loop_condition: { - CONSTANT [25] { value: true } - } - loop_step: { - CALL [28] { - function: _+_ - args: { - IDENT [26] { - name: @result - } - LIST [27] { - elements: { - COMPREHENSION [23] { - iter_var: x - iter_range: { - LIST [6] { - elements: { - CONSTANT [7] { value: 1 } - CONSTANT [8] { value: 2 } - CONSTANT [9] { value: 3 } - } - } - } - accu_var: @result - accu_init: { - LIST [15] { - elements: { - } - } - } - loop_condition: { - CONSTANT [16] { value: true } - } - loop_step: { - CALL [21] { - function: _?_:_ - args: { - CALL [13] { - function: _==_ - args: { - IDENT [12] { - name: x - } - IDENT [14] { - name: y - } - } - } - CALL [19] { - function: _+_ - args: { - IDENT [17] { - name: @result - } - LIST [18] { - elements: { - IDENT [11] { - name: x - } - } - } - } - } - IDENT [20] { - name: @result - } - } - } - } - result: { - IDENT [22] { - name: @result - } - } - } - } - } - } - } - } - result: { - IDENT [29] { - name: @result - } - } - } - LIST [32] { - elements: { - LIST [33] { - elements: { - CONSTANT [34] { value: 1 } - } - } - LIST [35] { - elements: { - CONSTANT [36] { value: 2 } - } - } - } - } - } -} -Test case: NESTED_MACROS_3 -Source: [1,2,3].map(i, i * 2) + [1,2,3].map(i, i * 2).map(i, i * 2) -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - COMPREHENSION [3] { - iter_var: @it:0:0 - iter_range: { - LIST [4] { - elements: { - CONSTANT [5] { value: 1 } - CONSTANT [6] { value: 2 } - CONSTANT [7] { value: 3 } - } - } - } - accu_var: @ac:0:0 - accu_init: { - LIST [8] { - elements: { - } - } - } - loop_condition: { - CONSTANT [9] { value: true } - } - loop_step: { - CALL [10] { - function: _+_ - args: { - IDENT [11] { - name: @ac:0:0 - } - LIST [12] { - elements: { - CALL [13] { - function: _*_ - args: { - IDENT [14] { - name: @it:0:0 - } - CONSTANT [15] { value: 2 } - } - } - } - } - } - } - } - result: { - IDENT [16] { - name: @ac:0:0 - } - } - } - } - } - CALL [17] { - function: _+_ - args: { - IDENT [18] { - name: @index0 - } - COMPREHENSION [19] { - iter_var: @it:1:0 - iter_range: { - IDENT [20] { - name: @index0 - } - } - accu_var: @ac:1:0 - accu_init: { - LIST [21] { - elements: { - } - } - } - loop_condition: { - CONSTANT [22] { value: true } - } - loop_step: { - CALL [23] { - function: _+_ - args: { - IDENT [24] { - name: @ac:1:0 - } - LIST [25] { - elements: { - CALL [26] { - function: _*_ - args: { - IDENT [27] { - name: @it:1:0 - } - CONSTANT [28] { value: 2 } - } - } - } - } - } - } - } - result: { - IDENT [29] { - name: @ac:1:0 - } - } - } - } - } - } -} -Test case: NESTED_MACROS_COMP_V2_1 -Source: [1,2,3].transformList(i, v, [1, 2, 3].transformList(i, v, i + v + 1)) == [[2, 4, 6], [2, 4, 6], [2, 4, 6]] -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - LIST [3] { - elements: { - CONSTANT [4] { value: 1 } - CONSTANT [5] { value: 2 } - CONSTANT [6] { value: 3 } - } - } - LIST [7] { - elements: { - CONSTANT [8] { value: 2 } - CONSTANT [9] { value: 4 } - CONSTANT [10] { value: 6 } - } - } - } - } - CALL [11] { - function: _==_ - args: { - COMPREHENSION [12] { - iter_var: @it:1:0 - iter_var2: @it2:1:0 - iter_range: { - IDENT [13] { - name: @index0 - } - } - accu_var: @ac:1:0 - accu_init: { - LIST [14] { - elements: { - } - } - } - loop_condition: { - CONSTANT [15] { value: true } - } - loop_step: { - CALL [16] { - function: _+_ - args: { - IDENT [17] { - name: @ac:1:0 - } - LIST [18] { - elements: { - COMPREHENSION [19] { - iter_var: @it:0:0 - iter_var2: @it2:0:0 - iter_range: { - IDENT [20] { - name: @index0 - } - } - accu_var: @ac:0:0 - accu_init: { - LIST [21] { - elements: { - } - } - } - loop_condition: { - CONSTANT [22] { value: true } - } - loop_step: { - CALL [23] { - function: _+_ - args: { - IDENT [24] { - name: @ac:0:0 - } - LIST [25] { - elements: { - CALL [26] { - function: _+_ - args: { - CALL [27] { - function: _+_ - args: { - IDENT [28] { - name: @it:0:0 - } - IDENT [29] { - name: @it2:0:0 - } - } - } - CONSTANT [30] { value: 1 } - } - } - } - } - } - } - } - result: { - IDENT [31] { - name: @ac:0:0 - } - } - } - } - } - } - } - } - result: { - IDENT [32] { - name: @ac:1:0 - } - } - } - LIST [33] { - elements: { - IDENT [34] { - name: @index1 - } - IDENT [35] { - name: @index1 - } - IDENT [36] { - name: @index1 - } - } - } - } - } - } -} -Test case: NESTED_MACROS_COMP_V2_2 -Source: [1, 2].transformList(i, y, [1, 2, 3].filter(x, x == y && i < y)) == [[1], [2]] -=====> -CALL [36] { - function: _==_ - args: { - COMPREHENSION [35] { - iter_var: i - iter_var2: y - iter_range: { - LIST [1] { - elements: { - CONSTANT [2] { value: 1 } - CONSTANT [3] { value: 2 } - } - } - } - accu_var: @result - accu_init: { - LIST [29] { - elements: { - } - } - } - loop_condition: { - CONSTANT [30] { value: true } - } - loop_step: { - CALL [33] { - function: _+_ - args: { - IDENT [31] { - name: @result - } - LIST [32] { - elements: { - COMPREHENSION [28] { - iter_var: x - iter_range: { - LIST [7] { - elements: { - CONSTANT [8] { value: 1 } - CONSTANT [9] { value: 2 } - CONSTANT [10] { value: 3 } - } - } - } - accu_var: @result - accu_init: { - LIST [20] { - elements: { - } - } - } - loop_condition: { - CONSTANT [21] { value: true } - } - loop_step: { - CALL [26] { - function: _?_:_ - args: { - CALL [16] { - function: _&&_ - args: { - CALL [14] { - function: _==_ - args: { - IDENT [13] { - name: x - } - IDENT [15] { - name: y - } - } - } - CALL [18] { - function: _<_ - args: { - IDENT [17] { - name: i - } - IDENT [19] { - name: y - } - } - } - } - } - CALL [24] { - function: _+_ - args: { - IDENT [22] { - name: @result - } - LIST [23] { - elements: { - IDENT [12] { - name: x - } - } - } - } - } - IDENT [25] { - name: @result - } - } - } - } - result: { - IDENT [27] { - name: @result - } - } - } - } - } - } - } - } - result: { - IDENT [34] { - name: @result - } - } - } - LIST [37] { - elements: { - LIST [38] { - elements: { - CONSTANT [39] { value: 1 } - } - } - LIST [40] { - elements: { - CONSTANT [41] { value: 2 } - } - } - } - } - } -} -Test case: ADJACENT_NESTED_MACROS -Source: [1,2,3].map(i, [1, 2, 3].map(i, i + 1)) == [1,2,3].map(j, [1, 2, 3].map(j, j + 1)) -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - COMPREHENSION [3] { - iter_var: @it:1:0 - iter_range: { - LIST [4] { - elements: { - CONSTANT [5] { value: 1 } - CONSTANT [6] { value: 2 } - CONSTANT [7] { value: 3 } - } - } - } - accu_var: @ac:1:0 - accu_init: { - LIST [8] { - elements: { - } - } - } - loop_condition: { - CONSTANT [9] { value: true } - } - loop_step: { - CALL [10] { - function: _+_ - args: { - IDENT [11] { - name: @ac:1:0 - } - LIST [12] { - elements: { - COMPREHENSION [13] { - iter_var: @it:0:0 - iter_range: { - LIST [14] { - elements: { - CONSTANT [15] { value: 1 } - CONSTANT [16] { value: 2 } - CONSTANT [17] { value: 3 } - } - } - } - accu_var: @ac:0:0 - accu_init: { - LIST [18] { - elements: { - } - } - } - loop_condition: { - CONSTANT [19] { value: true } - } - loop_step: { - CALL [20] { - function: _+_ - args: { - IDENT [21] { - name: @ac:0:0 - } - LIST [22] { - elements: { - CALL [23] { - function: _+_ - args: { - IDENT [24] { - name: @it:0:0 - } - CONSTANT [25] { value: 1 } - } - } - } - } - } - } - } - result: { - IDENT [26] { - name: @ac:0:0 - } - } - } - } - } - } - } - } - result: { - IDENT [27] { - name: @ac:1:0 - } - } - } - } - } - CALL [28] { - function: _==_ - args: { - IDENT [29] { - name: @index0 - } - IDENT [30] { - name: @index0 - } - } - } - } -} -Test case: ADJACENT_NESTED_MACROS_COMP_V2 -Source: [1,2,3].transformMap(i, x, [1, 2, 3].transformMap(i, x, i + x + 1)) == [1,2,3].transformMap(j, y, [1, 2, 3].transformMap(j, y, j + y + 1)) -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - COMPREHENSION [3] { - iter_var: @it:1:0 - iter_var2: @it2:1:0 - iter_range: { - LIST [4] { - elements: { - CONSTANT [5] { value: 1 } - CONSTANT [6] { value: 2 } - CONSTANT [7] { value: 3 } - } - } - } - accu_var: @ac:1:0 - accu_init: { - MAP [8] { - - } - } - loop_condition: { - CONSTANT [9] { value: true } - } - loop_step: { - CALL [10] { - function: cel.@mapInsert - args: { - IDENT [11] { - name: @ac:1:0 - } - IDENT [12] { - name: @it:1:0 - } - COMPREHENSION [13] { - iter_var: @it:0:0 - iter_var2: @it2:0:0 - iter_range: { - LIST [14] { - elements: { - CONSTANT [15] { value: 1 } - CONSTANT [16] { value: 2 } - CONSTANT [17] { value: 3 } - } - } - } - accu_var: @ac:0:0 - accu_init: { - MAP [18] { - - } - } - loop_condition: { - CONSTANT [19] { value: true } - } - loop_step: { - CALL [20] { - function: cel.@mapInsert - args: { - IDENT [21] { - name: @ac:0:0 - } - IDENT [22] { - name: @it:0:0 - } - CALL [23] { - function: _+_ - args: { - CALL [24] { - function: _+_ - args: { - IDENT [25] { - name: @it:0:0 - } - IDENT [26] { - name: @it2:0:0 - } - } - } - CONSTANT [27] { value: 1 } - } - } - } - } - } - result: { - IDENT [28] { - name: @ac:0:0 - } - } - } - } - } - } - result: { - IDENT [29] { - name: @ac:1:0 - } - } - } - } - } - CALL [30] { - function: _==_ - args: { - IDENT [31] { - name: @index0 - } - IDENT [32] { - name: @index0 - } - } - } - } -} -Test case: INCLUSION_LIST -Source: 1 in [1,2,3] && 2 in [1,2,3] && 3 in [3, [1,2,3]] && 1 in [1,2,3] -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - CALL [3] { - function: @in - args: { - CONSTANT [4] { value: 1 } - LIST [5] { - elements: { - CONSTANT [6] { value: 1 } - CONSTANT [7] { value: 2 } - CONSTANT [8] { value: 3 } - } - } - } - } - LIST [9] { - elements: { - CONSTANT [10] { value: 1 } - CONSTANT [11] { value: 2 } - CONSTANT [12] { value: 3 } - } - } - } - } - CALL [13] { - function: _&&_ - args: { - CALL [14] { - function: _&&_ - args: { - IDENT [15] { - name: @index0 - } - CALL [16] { - function: @in - args: { - CONSTANT [17] { value: 2 } - IDENT [18] { - name: @index1 - } - } - } - } - } - CALL [19] { - function: _&&_ - args: { - CALL [20] { - function: @in - args: { - CONSTANT [21] { value: 3 } - LIST [22] { - elements: { - CONSTANT [23] { value: 3 } - IDENT [24] { - name: @index1 - } - } - } - } - } - IDENT [25] { - name: @index0 - } - } - } - } - } - } -} -Test case: INCLUSION_MAP -Source: 2 in {'a': 1, 2: {true: false}, 3: {true: false}} -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - MAP [3] { - MAP_ENTRY [4] { - key: { - CONSTANT [5] { value: true } - } - value: { - CONSTANT [6] { value: false } - } - } - } - } - } - CALL [7] { - function: @in - args: { - CONSTANT [8] { value: 2 } - MAP [9] { - MAP_ENTRY [10] { - key: { - CONSTANT [11] { value: "a" } - } - value: { - CONSTANT [12] { value: 1 } - } - } - MAP_ENTRY [13] { - key: { - CONSTANT [14] { value: 2 } - } - value: { - IDENT [15] { - name: @index0 - } - } - } - MAP_ENTRY [16] { - key: { - CONSTANT [17] { value: 3 } - } - value: { - IDENT [18] { - name: @index0 - } - } - } - } - } - } - } -} -Test case: MACRO_ITER_VAR_NOT_REFERENCED -Source: [1,2].map(i, [1, 2].map(i, [3,4])) == [[[3, 4], [3, 4]], [[3, 4], [3, 4]]] -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - LIST [3] { - elements: { - LIST [4] { - elements: { - CONSTANT [5] { value: 3 } - CONSTANT [6] { value: 4 } - } - } - LIST [7] { - elements: { - CONSTANT [8] { value: 3 } - CONSTANT [9] { value: 4 } - } - } - } - } - LIST [10] { - elements: { - CONSTANT [11] { value: 1 } - CONSTANT [12] { value: 2 } - } - } - } - } - CALL [13] { - function: _==_ - args: { - COMPREHENSION [14] { - iter_var: @it:1:0 - iter_range: { - IDENT [15] { - name: @index1 - } - } - accu_var: @ac:1:0 - accu_init: { - LIST [16] { - elements: { - } - } - } - loop_condition: { - CONSTANT [17] { value: true } - } - loop_step: { - CALL [18] { - function: _+_ - args: { - IDENT [19] { - name: @ac:1:0 - } - LIST [20] { - elements: { - COMPREHENSION [21] { - iter_var: @it:0:0 - iter_range: { - IDENT [22] { - name: @index1 - } - } - accu_var: @ac:0:0 - accu_init: { - LIST [23] { - elements: { - } - } - } - loop_condition: { - CONSTANT [24] { value: true } - } - loop_step: { - CALL [25] { - function: _+_ - args: { - IDENT [26] { - name: @ac:0:0 - } - LIST [27] { - elements: { - LIST [28] { - elements: { - CONSTANT [29] { value: 3 } - CONSTANT [30] { value: 4 } - } - } - } - } - } - } - } - result: { - IDENT [31] { - name: @ac:0:0 - } - } - } - } - } - } - } - } - result: { - IDENT [32] { - name: @ac:1:0 - } - } - } - LIST [33] { - elements: { - IDENT [34] { - name: @index0 - } - IDENT [35] { - name: @index0 - } - } - } - } - } - } -} -Test case: MACRO_ITER_VAR2_NOT_REFERENCED -Source: [1,2].transformList(i, v, [1, 2].transformList(i, v, [3,4])) == [[[3, 4], [3, 4]], [[3, 4], [3, 4]]] -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - LIST [3] { - elements: { - LIST [4] { - elements: { - CONSTANT [5] { value: 3 } - CONSTANT [6] { value: 4 } - } - } - LIST [7] { - elements: { - CONSTANT [8] { value: 3 } - CONSTANT [9] { value: 4 } - } - } - } - } - LIST [10] { - elements: { - CONSTANT [11] { value: 1 } - CONSTANT [12] { value: 2 } - } - } - } - } - CALL [13] { - function: _==_ - args: { - COMPREHENSION [14] { - iter_var: @it:1:0 - iter_var2: @it2:1:0 - iter_range: { - IDENT [15] { - name: @index1 - } - } - accu_var: @ac:1:0 - accu_init: { - LIST [16] { - elements: { - } - } - } - loop_condition: { - CONSTANT [17] { value: true } - } - loop_step: { - CALL [18] { - function: _+_ - args: { - IDENT [19] { - name: @ac:1:0 - } - LIST [20] { - elements: { - COMPREHENSION [21] { - iter_var: @it:0:0 - iter_var2: @it2:0:0 - iter_range: { - IDENT [22] { - name: @index1 - } - } - accu_var: @ac:0:0 - accu_init: { - LIST [23] { - elements: { - } - } - } - loop_condition: { - CONSTANT [24] { value: true } - } - loop_step: { - CALL [25] { - function: _+_ - args: { - IDENT [26] { - name: @ac:0:0 - } - LIST [27] { - elements: { - LIST [28] { - elements: { - CONSTANT [29] { value: 3 } - CONSTANT [30] { value: 4 } - } - } - } - } - } - } - } - result: { - IDENT [31] { - name: @ac:0:0 - } - } - } - } - } - } - } - } - result: { - IDENT [32] { - name: @ac:1:0 - } - } - } - LIST [33] { - elements: { - IDENT [34] { - name: @index0 - } - IDENT [35] { - name: @index0 - } - } - } - } - } - } -} -Test case: MACRO_SHADOWED_VARIABLE -Source: [x - 1 > 3 ? x - 1 : 5].exists(x, x - 1 > 3) || x - 1 > 3 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - CALL [3] { - function: _>_ - args: { - CALL [4] { - function: _-_ - args: { - IDENT [5] { - name: x - } - CONSTANT [6] { value: 1 } - } - } - CONSTANT [7] { value: 3 } - } - } - } - } - CALL [8] { - function: _||_ - args: { - COMPREHENSION [9] { - iter_var: @it:0:0 - iter_range: { - LIST [10] { - elements: { - CALL [11] { - function: _?_:_ - args: { - IDENT [12] { - name: @index0 - } - CALL [13] { - function: _-_ - args: { - IDENT [14] { - name: x - } - CONSTANT [15] { value: 1 } - } - } - CONSTANT [16] { value: 5 } - } - } - } - } - } - accu_var: @ac:0:0 - accu_init: { - CONSTANT [17] { value: false } - } - loop_condition: { - CALL [18] { - function: @not_strictly_false - args: { - CALL [19] { - function: !_ - args: { - IDENT [20] { - name: @ac:0:0 - } - } - } - } - } - } - loop_step: { - CALL [21] { - function: _||_ - args: { - IDENT [22] { - name: @ac:0:0 - } - CALL [23] { - function: _>_ - args: { - CALL [24] { - function: _-_ - args: { - IDENT [25] { - name: @it:0:0 - } - CONSTANT [26] { value: 1 } - } - } - CONSTANT [27] { value: 3 } - } - } - } - } - } - result: { - IDENT [28] { - name: @ac:0:0 - } - } - } - IDENT [29] { - name: @index0 - } - } - } - } -} -Test case: MACRO_SHADOWED_VARIABLE_2 -Source: ["foo", "bar"].map(x, [x + x, x + x]).map(x, [x + x, x + x]) -=====> -COMPREHENSION [35] { - iter_var: x - iter_range: { - COMPREHENSION [19] { - iter_var: x - iter_range: { - LIST [1] { - elements: { - CONSTANT [2] { value: "foo" } - CONSTANT [3] { value: "bar" } - } - } - } - accu_var: @result - accu_init: { - LIST [13] { - elements: { - } - } - } - loop_condition: { - CONSTANT [14] { value: true } - } - loop_step: { - CALL [17] { - function: _+_ - args: { - IDENT [15] { - name: @result - } - LIST [16] { - elements: { - LIST [6] { - elements: { - CALL [8] { - function: _+_ - args: { - IDENT [7] { - name: x - } - IDENT [9] { - name: x - } - } - } - CALL [11] { - function: _+_ - args: { - IDENT [10] { - name: x - } - IDENT [12] { - name: x - } - } - } - } - } - } - } - } - } - } - result: { - IDENT [18] { - name: @result - } - } - } - } - accu_var: @result - accu_init: { - LIST [29] { - elements: { - } - } - } - loop_condition: { - CONSTANT [30] { value: true } - } - loop_step: { - CALL [33] { - function: _+_ - args: { - IDENT [31] { - name: @result - } - LIST [32] { - elements: { - LIST [22] { - elements: { - CALL [24] { - function: _+_ - args: { - IDENT [23] { - name: x - } - IDENT [25] { - name: x - } - } - } - CALL [27] { - function: _+_ - args: { - IDENT [26] { - name: x - } - IDENT [28] { - name: x - } - } - } - } - } - } - } - } - } - } - result: { - IDENT [34] { - name: @result - } - } -} -Test case: MACRO_SHADOWED_VARIABLE_COMP_V2_1 -Source: [x - y - 1 > 3 ? x - y - 1 : 5].exists(x, y, x - y - 1 > 3) || x - y - 1 > 3 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - CALL [3] { - function: _>_ - args: { - CALL [4] { - function: _-_ - args: { - CALL [5] { - function: _-_ - args: { - IDENT [6] { - name: x - } - IDENT [7] { - name: y - } - } - } - CONSTANT [8] { value: 1 } - } - } - CONSTANT [9] { value: 3 } - } - } - } - } - CALL [10] { - function: _||_ - args: { - COMPREHENSION [11] { - iter_var: @it:0:0 - iter_var2: @it2:0:0 - iter_range: { - LIST [12] { - elements: { - CALL [13] { - function: _?_:_ - args: { - IDENT [14] { - name: @index0 - } - CALL [15] { - function: _-_ - args: { - CALL [16] { - function: _-_ - args: { - IDENT [17] { - name: x - } - IDENT [18] { - name: y - } - } - } - CONSTANT [19] { value: 1 } - } - } - CONSTANT [20] { value: 5 } - } - } - } - } - } - accu_var: @ac:0:0 - accu_init: { - CONSTANT [21] { value: false } - } - loop_condition: { - CALL [22] { - function: @not_strictly_false - args: { - CALL [23] { - function: !_ - args: { - IDENT [24] { - name: @ac:0:0 - } - } - } - } - } - } - loop_step: { - CALL [25] { - function: _||_ - args: { - IDENT [26] { - name: @ac:0:0 - } - CALL [27] { - function: _>_ - args: { - CALL [28] { - function: _-_ - args: { - CALL [29] { - function: _-_ - args: { - IDENT [30] { - name: @it:0:0 - } - IDENT [31] { - name: @it2:0:0 - } - } - } - CONSTANT [32] { value: 1 } - } - } - CONSTANT [33] { value: 3 } - } - } - } - } - } - result: { - IDENT [34] { - name: @ac:0:0 - } - } - } - IDENT [35] { - name: @index0 - } - } - } - } -} -Test case: MACRO_SHADOWED_VARIABLE_COMP_V2_2 -Source: ["foo", "bar"].transformMap(x, y, [x + x, y + y]).transformMap(x, y, [x + x, y + y]) -=====> -COMPREHENSION [35] { - iter_var: x - iter_var2: y - iter_range: { - COMPREHENSION [19] { - iter_var: x - iter_var2: y - iter_range: { - LIST [1] { - elements: { - CONSTANT [2] { value: "foo" } - CONSTANT [3] { value: "bar" } - } - } - } - accu_var: @result - accu_init: { - MAP [14] { - - } - } - loop_condition: { - CONSTANT [15] { value: true } - } - loop_step: { - CALL [17] { - function: cel.@mapInsert - args: { - IDENT [16] { - name: @result - } - IDENT [5] { - name: x - } - LIST [7] { - elements: { - CALL [9] { - function: _+_ - args: { - IDENT [8] { - name: x - } - IDENT [10] { - name: x - } - } - } - CALL [12] { - function: _+_ - args: { - IDENT [11] { - name: y - } - IDENT [13] { - name: y - } - } - } - } - } - } - } - } - result: { - IDENT [18] { - name: @result - } - } - } - } - accu_var: @result - accu_init: { - MAP [30] { - - } - } - loop_condition: { - CONSTANT [31] { value: true } - } - loop_step: { - CALL [33] { - function: cel.@mapInsert - args: { - IDENT [32] { - name: @result - } - IDENT [21] { - name: x - } - LIST [23] { - elements: { - CALL [25] { - function: _+_ - args: { - IDENT [24] { - name: x - } - IDENT [26] { - name: x - } - } - } - CALL [28] { - function: _+_ - args: { - IDENT [27] { - name: y - } - IDENT [29] { - name: y - } - } - } - } - } - } - } - } - result: { - IDENT [34] { - name: @result - } - } -} -Test case: PRESENCE_TEST -Source: has({'a': true}.a) && {'a':true}['a'] -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - MAP [3] { - MAP_ENTRY [4] { - key: { - CONSTANT [5] { value: "a" } - } - value: { - CONSTANT [6] { value: true } - } - } - } - } - } - CALL [7] { - function: _&&_ - args: { - SELECT [8] { - IDENT [9] { - name: @index0 - }.a~presence_test - } - CALL [10] { - function: _[_] - args: { - IDENT [11] { - name: @index0 - } - CONSTANT [12] { value: "a" } - } - } - } - } - } -} -Test case: PRESENCE_TEST_2 -Source: has({'a': true}.a) && has({'a': true}.a) -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - SELECT [3] { - MAP [4] { - MAP_ENTRY [5] { - key: { - CONSTANT [6] { value: "a" } - } - value: { - CONSTANT [7] { value: true } - } - } - }.a~presence_test - } - } - } - CALL [8] { - function: _&&_ - args: { - IDENT [9] { - name: @index0 - } - IDENT [10] { - name: @index0 - } - } - } - } -} -Test case: PRESENCE_TEST_WITH_TERNARY -Source: (has(msg.oneof_type.payload) ? msg.oneof_type.payload.single_int64 : 0) == 10 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - SELECT [3] { - IDENT [4] { - name: msg - }.oneof_type - } - } - } - CALL [5] { - function: _==_ - args: { - CALL [6] { - function: _?_:_ - args: { - SELECT [7] { - IDENT [8] { - name: @index0 - }.payload~presence_test - } - SELECT [9] { - SELECT [10] { - IDENT [11] { - name: @index0 - }.payload - }.single_int64 - } - CONSTANT [12] { value: 0 } - } - } - CONSTANT [13] { value: 10 } - } - } - } -} -Test case: PRESENCE_TEST_WITH_TERNARY_2 -Source: (has(msg.oneof_type.payload) ? msg.oneof_type.payload.single_int64 : msg.oneof_type.payload.single_int64 * 0) == 10 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - SELECT [3] { - SELECT [4] { - SELECT [5] { - IDENT [6] { - name: msg - }.oneof_type - }.payload - }.single_int64 - } - } - } - CALL [7] { - function: _==_ - args: { - CALL [8] { - function: _?_:_ - args: { - SELECT [9] { - SELECT [10] { - IDENT [11] { - name: msg - }.oneof_type - }.payload~presence_test - } - IDENT [12] { - name: @index0 - } - CALL [13] { - function: _*_ - args: { - IDENT [14] { - name: @index0 - } - CONSTANT [15] { value: 0 } - } - } - } - } - CONSTANT [16] { value: 10 } - } - } - } -} -Test case: PRESENCE_TEST_WITH_TERNARY_3 -Source: (has(msg.oneof_type.payload.single_int64) ? msg.oneof_type.payload.single_int64 : msg.oneof_type.payload.single_int64 * 0) == 10 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - SELECT [3] { - SELECT [4] { - SELECT [5] { - IDENT [6] { - name: msg - }.oneof_type - }.payload - }.single_int64 - } - } - } - CALL [7] { - function: _==_ - args: { - CALL [8] { - function: _?_:_ - args: { - SELECT [9] { - SELECT [10] { - SELECT [11] { - IDENT [12] { - name: msg - }.oneof_type - }.payload - }.single_int64~presence_test - } - IDENT [13] { - name: @index0 - } - CALL [14] { - function: _*_ - args: { - IDENT [15] { - name: @index0 - } - CONSTANT [16] { value: 0 } - } - } - } - } - CONSTANT [17] { value: 10 } - } - } - } -} -Test case: PRESENCE_TEST_WITH_TERNARY_NESTED -Source: (has(msg.oneof_type) && has(msg.oneof_type.payload) && has(msg.oneof_type.payload.single_int64)) ? ((has(msg.oneof_type.payload.map_string_string) && has(msg.oneof_type.payload.map_string_string.key)) ? msg.oneof_type.payload.map_string_string.key == 'A' : false) : false -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - SELECT [3] { - SELECT [4] { - SELECT [5] { - IDENT [6] { - name: msg - }.oneof_type - }.payload - }.map_string_string - } - SELECT [7] { - SELECT [8] { - IDENT [9] { - name: msg - }.oneof_type - }.payload - } - } - } - CALL [10] { - function: _?_:_ - args: { - CALL [11] { - function: _&&_ - args: { - CALL [12] { - function: _&&_ - args: { - SELECT [13] { - IDENT [14] { - name: msg - }.oneof_type~presence_test - } - SELECT [15] { - SELECT [16] { - IDENT [17] { - name: msg - }.oneof_type - }.payload~presence_test - } - } - } - SELECT [18] { - IDENT [19] { - name: @index1 - }.single_int64~presence_test - } - } - } - CALL [20] { - function: _?_:_ - args: { - CALL [21] { - function: _&&_ - args: { - SELECT [22] { - IDENT [23] { - name: @index1 - }.map_string_string~presence_test - } - SELECT [24] { - IDENT [25] { - name: @index0 - }.key~presence_test - } - } - } - CALL [26] { - function: _==_ - args: { - SELECT [27] { - IDENT [28] { - name: @index0 - }.key - } - CONSTANT [29] { value: "A" } - } - } - CONSTANT [30] { value: false } - } - } - CONSTANT [31] { value: false } - } - } - } -} -Test case: OPTIONAL_LIST -Source: [10, ?optional.none(), [?optional.none(), ?opt_x], [?optional.none(), ?opt_x]] == [10, [5], [5]] -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - LIST [3] { - elements: { - CALL [4] { - function: optional.none - args: { - } - } - IDENT [5] { - name: opt_x - } - } - optional_indices: [0, 1] - } - LIST [6] { - elements: { - CONSTANT [7] { value: 5 } - } - } - } - } - CALL [8] { - function: _==_ - args: { - LIST [9] { - elements: { - CONSTANT [10] { value: 10 } - CALL [11] { - function: optional.none - args: { - } - } - IDENT [12] { - name: @index0 - } - IDENT [13] { - name: @index0 - } - } - optional_indices: [0] - } - LIST [14] { - elements: { - CONSTANT [15] { value: 10 } - IDENT [16] { - name: @index1 - } - IDENT [17] { - name: @index1 - } - } - } - } - } - } -} -Test case: OPTIONAL_MAP -Source: {?'hello': optional.of('hello')}['hello'] + {?'hello': optional.of('hello')}['hello'] == 'hellohello' -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - CALL [3] { - function: _[_] - args: { - MAP [4] { - MAP_ENTRY [5] { - key: { - CONSTANT [6] { value: "hello" } - } - optional_entry: true - value: { - CALL [7] { - function: optional.of - args: { - CONSTANT [8] { value: "hello" } - } - } - } - } - } - CONSTANT [9] { value: "hello" } - } - } - } - } - CALL [10] { - function: _==_ - args: { - CALL [11] { - function: _+_ - args: { - IDENT [12] { - name: @index0 - } - IDENT [13] { - name: @index0 - } - } - } - CONSTANT [14] { value: "hellohello" } - } - } - } -} -Test case: OPTIONAL_MAP_CHAINED -Source: {?'key': optional.of('test')}[?'bogus'].or({'key': 'test'}[?'bogus']).orValue({'key': 'test'}['key']) == 'test' -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - MAP [3] { - MAP_ENTRY [4] { - key: { - CONSTANT [5] { value: "key" } - } - value: { - CONSTANT [6] { value: "test" } - } - } - } - } - } - CALL [7] { - function: _==_ - args: { - CALL [8] { - function: orValue - target: { - CALL [9] { - function: or - target: { - CALL [10] { - function: _[?_] - args: { - MAP [11] { - MAP_ENTRY [12] { - key: { - CONSTANT [13] { value: "key" } - } - optional_entry: true - value: { - CALL [14] { - function: optional.of - args: { - CONSTANT [15] { value: "test" } - } - } - } - } - } - CONSTANT [16] { value: "bogus" } - } - } - } - args: { - CALL [17] { - function: _[?_] - args: { - IDENT [18] { - name: @index0 - } - CONSTANT [19] { value: "bogus" } - } - } - } - } - } - args: { - CALL [20] { - function: _[_] - args: { - IDENT [21] { - name: @index0 - } - CONSTANT [22] { value: "key" } - } - } - } - } - CONSTANT [23] { value: "test" } - } - } - } -} -Test case: OPTIONAL_MESSAGE -Source: TestAllTypes{?single_int64: optional.ofNonZeroValue(1), ?single_int32: optional.of(4)}.single_int32 + TestAllTypes{?single_int64: optional.ofNonZeroValue(1), ?single_int32: optional.of(4)}.single_int64 == 5 -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - STRUCT [3] { - name: cel.expr.conformance.proto3.TestAllTypes - entries: { - ENTRY [4] { - field_key: single_int64 - optional_entry: true - value: { - CALL [5] { - function: optional.ofNonZeroValue - args: { - CONSTANT [6] { value: 1 } - } - } - } - } - ENTRY [7] { - field_key: single_int32 - optional_entry: true - value: { - CALL [8] { - function: optional.of - args: { - CONSTANT [9] { value: 4 } - } - } - } - } - } - } - } - } - CALL [10] { - function: _==_ - args: { - CALL [11] { - function: _+_ - args: { - SELECT [12] { - IDENT [13] { - name: @index0 - }.single_int32 - } - SELECT [14] { - IDENT [15] { - name: @index0 - }.single_int64 - } - } - } - CONSTANT [16] { value: 5 } - } - } - } -} -Test case: CALL -Source: ('h' + 'e' + 'l' + 'l' + 'o' + ' world').matches('h' + 'e' + 'l' + 'l' + 'o') -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - CALL [3] { - function: _+_ - args: { - CALL [4] { - function: _+_ - args: { - CALL [5] { - function: _+_ - args: { - CALL [6] { - function: _+_ - args: { - CONSTANT [7] { value: "h" } - CONSTANT [8] { value: "e" } - } - } - CONSTANT [9] { value: "l" } - } - } - CONSTANT [10] { value: "l" } - } - } - CONSTANT [11] { value: "o" } - } - } - } - } - CALL [12] { - function: matches - target: { - CALL [13] { - function: _+_ - args: { - IDENT [14] { - name: @index0 - } - CONSTANT [15] { value: " world" } - } - } - } - args: { - IDENT [16] { - name: @index0 - } - } - } - } -} -Test case: CALL_ARGUMENT_NESTED_NO_COMMON_SUBEXPR -Source: 'hello world'.matches('h' + 'e' + 'l' + 'l' + 'o') -=====> -CALL [2] { - function: matches - target: { - CONSTANT [1] { value: "hello world" } - } - args: { - CALL [10] { - function: _+_ - args: { - CALL [8] { - function: _+_ - args: { - CALL [6] { - function: _+_ - args: { - CALL [4] { - function: _+_ - args: { - CONSTANT [3] { value: "h" } - CONSTANT [5] { value: "e" } - } - } - CONSTANT [7] { value: "l" } - } - } - CONSTANT [9] { value: "l" } - } - } - CONSTANT [11] { value: "o" } - } - } - } -} -Test case: CALL_TARGET_NESTED_NO_COMMON_SUBEXPR -Source: ('h' + 'e' + 'l' + 'l' + 'o' + ' world').matches('hello') -=====> -CALL [12] { - function: matches - target: { - CALL [10] { - function: _+_ - args: { - CALL [8] { - function: _+_ - args: { - CALL [6] { - function: _+_ - args: { - CALL [4] { - function: _+_ - args: { - CALL [2] { - function: _+_ - args: { - CONSTANT [1] { value: "h" } - CONSTANT [3] { value: "e" } - } - } - CONSTANT [5] { value: "l" } - } - } - CONSTANT [7] { value: "l" } - } - } - CONSTANT [9] { value: "o" } - } - } - CONSTANT [11] { value: " world" } - } - } - } - args: { - CONSTANT [13] { value: "hello" } - } -} -Test case: CALL_BOTH_ARGUMENT_TARGET_NESTED_NO_COMMON_SUBEXPR -Source: ('h' + 'e' + 'l' + 'l' + 'o' + ' world').matches('w' + 'o' + 'r' + 'l' + 'd') -=====> -CALL [12] { - function: matches - target: { - CALL [10] { - function: _+_ - args: { - CALL [8] { - function: _+_ - args: { - CALL [6] { - function: _+_ - args: { - CALL [4] { - function: _+_ - args: { - CALL [2] { - function: _+_ - args: { - CONSTANT [1] { value: "h" } - CONSTANT [3] { value: "e" } - } - } - CONSTANT [5] { value: "l" } - } - } - CONSTANT [7] { value: "l" } - } - } - CONSTANT [9] { value: "o" } - } - } - CONSTANT [11] { value: " world" } - } - } - } - args: { - CALL [20] { - function: _+_ - args: { - CALL [18] { - function: _+_ - args: { - CALL [16] { - function: _+_ - args: { - CALL [14] { - function: _+_ - args: { - CONSTANT [13] { value: "w" } - CONSTANT [15] { value: "o" } - } - } - CONSTANT [17] { value: "r" } - } - } - CONSTANT [19] { value: "l" } - } - } - CONSTANT [21] { value: "d" } - } - } - } -} -Test case: CUSTOM_FUNCTION_INELIMINABLE -Source: non_pure_custom_func(msg.oneof_type.payload.single_int64) + non_pure_custom_func(msg.oneof_type.payload.single_int32) + non_pure_custom_func(msg.oneof_type.payload.single_int64) + non_pure_custom_func(msg.single_int64) -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - SELECT [3] { - SELECT [4] { - SELECT [5] { - IDENT [6] { - name: msg - }.oneof_type - }.payload - }.single_int64 - } - } - } - CALL [7] { - function: _+_ - args: { - CALL [8] { - function: _+_ - args: { - CALL [9] { - function: _+_ - args: { - CALL [10] { - function: non_pure_custom_func - args: { - IDENT [11] { - name: @index0 - } - } - } - CALL [12] { - function: non_pure_custom_func - args: { - SELECT [13] { - SELECT [14] { - SELECT [15] { - IDENT [16] { - name: msg - }.oneof_type - }.payload - }.single_int32 - } - } - } - } - } - CALL [17] { - function: non_pure_custom_func - args: { - IDENT [18] { - name: @index0 - } - } - } - } - } - CALL [19] { - function: non_pure_custom_func - args: { - SELECT [20] { - IDENT [21] { - name: msg - }.single_int64 - } - } - } - } - } - } -} -Test case: CUSTOM_FUNCTION_ELIMINABLE -Source: pure_custom_func(msg.oneof_type.payload.single_int64) + pure_custom_func(msg.oneof_type.payload.single_int32) + pure_custom_func(msg.oneof_type.payload.single_int64) + pure_custom_func(msg.single_int64) -=====> -CALL [1] { - function: cel.@block - args: { - LIST [2] { - elements: { - CALL [3] { - function: pure_custom_func - args: { - SELECT [4] { - SELECT [5] { - SELECT [6] { - IDENT [7] { - name: msg - }.oneof_type - }.payload - }.single_int64 - } - } - } - } - } - CALL [8] { - function: _+_ - args: { - CALL [9] { - function: _+_ - args: { - CALL [10] { - function: _+_ - args: { - IDENT [11] { - name: @index0 - } - CALL [12] { - function: pure_custom_func - args: { - SELECT [13] { - SELECT [14] { - SELECT [15] { - IDENT [16] { - name: msg - }.oneof_type - }.payload - }.single_int32 - } - } - } - } - } - IDENT [17] { - name: @index0 - } - } - } - CALL [18] { - function: pure_custom_func - args: { - SELECT [19] { - IDENT [20] { - name: msg - }.single_int64 - } - } - } - } - } - } -} \ No newline at end of file diff --git a/optimizer/src/test/resources/subexpression_ast_cascaded_binds.baseline b/optimizer/src/test/resources/subexpression_ast_cascaded_binds.baseline deleted file mode 100644 index 016dc257d..000000000 --- a/optimizer/src/test/resources/subexpression_ast_cascaded_binds.baseline +++ /dev/null @@ -1,4795 +0,0 @@ -Test case: SIZE_1 -Source: size([1,2]) + size([1,2]) + 1 == 5 -=====> -CALL [1] { - function: _==_ - args: { - CALL [2] { - function: _+_ - args: { - COMPREHENSION [3] { - iter_var: #unused - iter_range: { - LIST [4] { - elements: { - } - } - } - accu_var: @r0 - accu_init: { - CALL [5] { - function: size - args: { - LIST [6] { - elements: { - CONSTANT [7] { value: 1 } - CONSTANT [8] { value: 2 } - } - } - } - } - } - loop_condition: { - CONSTANT [9] { value: false } - } - loop_step: { - IDENT [10] { - name: @r0 - } - } - result: { - CALL [11] { - function: _+_ - args: { - IDENT [12] { - name: @r0 - } - IDENT [13] { - name: @r0 - } - } - } - } - } - CONSTANT [14] { value: 1 } - } - } - CONSTANT [15] { value: 5 } - } -} -Test case: SIZE_2 -Source: 2 + size([1,2]) + size([1,2]) + 1 == 7 -=====> -CALL [1] { - function: _==_ - args: { - CALL [2] { - function: _+_ - args: { - COMPREHENSION [3] { - iter_var: #unused - iter_range: { - LIST [4] { - elements: { - } - } - } - accu_var: @r0 - accu_init: { - CALL [5] { - function: size - args: { - LIST [6] { - elements: { - CONSTANT [7] { value: 1 } - CONSTANT [8] { value: 2 } - } - } - } - } - } - loop_condition: { - CONSTANT [9] { value: false } - } - loop_step: { - IDENT [10] { - name: @r0 - } - } - result: { - CALL [11] { - function: _+_ - args: { - CALL [12] { - function: _+_ - args: { - CONSTANT [13] { value: 2 } - IDENT [14] { - name: @r0 - } - } - } - IDENT [15] { - name: @r0 - } - } - } - } - } - CONSTANT [16] { value: 1 } - } - } - CONSTANT [17] { value: 7 } - } -} -Test case: SIZE_3 -Source: size([0]) + size([0]) + size([1,2]) + size([1,2]) == 6 -=====> -CALL [1] { - function: _==_ - args: { - COMPREHENSION [2] { - iter_var: #unused - iter_range: { - LIST [3] { - elements: { - } - } - } - accu_var: @r1 - accu_init: { - CALL [4] { - function: size - args: { - LIST [5] { - elements: { - CONSTANT [6] { value: 1 } - CONSTANT [7] { value: 2 } - } - } - } - } - } - loop_condition: { - CONSTANT [8] { value: false } - } - loop_step: { - IDENT [9] { - name: @r1 - } - } - result: { - CALL [10] { - function: _+_ - args: { - CALL [11] { - function: _+_ - args: { - COMPREHENSION [12] { - iter_var: #unused - iter_range: { - LIST [13] { - elements: { - } - } - } - accu_var: @r0 - accu_init: { - CALL [14] { - function: size - args: { - LIST [15] { - elements: { - CONSTANT [16] { value: 0 } - } - } - } - } - } - loop_condition: { - CONSTANT [17] { value: false } - } - loop_step: { - IDENT [18] { - name: @r0 - } - } - result: { - CALL [19] { - function: _+_ - args: { - IDENT [20] { - name: @r0 - } - IDENT [21] { - name: @r0 - } - } - } - } - } - IDENT [22] { - name: @r1 - } - } - } - IDENT [23] { - name: @r1 - } - } - } - } - } - CONSTANT [24] { value: 6 } - } -} -Test case: SIZE_4 -Source: 5 + size([0]) + size([0]) + size([1,2]) + size([1,2]) + size([1,2,3]) + size([1,2,3]) == 17 -=====> -CALL [1] { - function: _==_ - args: { - COMPREHENSION [2] { - iter_var: #unused - iter_range: { - LIST [3] { - elements: { - } - } - } - accu_var: @r2 - accu_init: { - CALL [4] { - function: size - args: { - LIST [5] { - elements: { - CONSTANT [6] { value: 1 } - CONSTANT [7] { value: 2 } - CONSTANT [8] { value: 3 } - } - } - } - } - } - loop_condition: { - CONSTANT [9] { value: false } - } - loop_step: { - IDENT [10] { - name: @r2 - } - } - result: { - CALL [11] { - function: _+_ - args: { - CALL [12] { - function: _+_ - args: { - COMPREHENSION [13] { - iter_var: #unused - iter_range: { - LIST [14] { - elements: { - } - } - } - accu_var: @r1 - accu_init: { - CALL [15] { - function: size - args: { - LIST [16] { - elements: { - CONSTANT [17] { value: 1 } - CONSTANT [18] { value: 2 } - } - } - } - } - } - loop_condition: { - CONSTANT [19] { value: false } - } - loop_step: { - IDENT [20] { - name: @r1 - } - } - result: { - CALL [21] { - function: _+_ - args: { - CALL [22] { - function: _+_ - args: { - COMPREHENSION [23] { - iter_var: #unused - iter_range: { - LIST [24] { - elements: { - } - } - } - accu_var: @r0 - accu_init: { - CALL [25] { - function: size - args: { - LIST [26] { - elements: { - CONSTANT [27] { value: 0 } - } - } - } - } - } - loop_condition: { - CONSTANT [28] { value: false } - } - loop_step: { - IDENT [29] { - name: @r0 - } - } - result: { - CALL [30] { - function: _+_ - args: { - CALL [31] { - function: _+_ - args: { - CONSTANT [32] { value: 5 } - IDENT [33] { - name: @r0 - } - } - } - IDENT [34] { - name: @r0 - } - } - } - } - } - IDENT [35] { - name: @r1 - } - } - } - IDENT [36] { - name: @r1 - } - } - } - } - } - IDENT [37] { - name: @r2 - } - } - } - IDENT [38] { - name: @r2 - } - } - } - } - } - CONSTANT [39] { value: 17 } - } -} -Test case: TIMESTAMP -Source: timestamp(int(timestamp(1000000000))).getFullYear() + timestamp(int(timestamp(75))).getFullYear() + timestamp(int(timestamp(50))).getFullYear() + timestamp(int(timestamp(1000000000))).getFullYear() + timestamp(int(timestamp(50))).getSeconds() + timestamp(int(timestamp(200))).getFullYear() + timestamp(int(timestamp(200))).getFullYear() + timestamp(int(timestamp(75))).getMinutes() + timestamp(int(timestamp(1000000000))).getFullYear() == 13934 -=====> -CALL [1] { - function: _==_ - args: { - COMPREHENSION [2] { - iter_var: #unused - iter_range: { - LIST [3] { - elements: { - } - } - } - accu_var: @r0 - accu_init: { - CALL [4] { - function: getFullYear - target: { - CALL [5] { - function: timestamp - args: { - CALL [6] { - function: int - args: { - CALL [7] { - function: timestamp - args: { - CONSTANT [8] { value: 1000000000 } - } - } - } - } - } - } - } - args: { - } - } - } - loop_condition: { - CONSTANT [9] { value: false } - } - loop_step: { - IDENT [10] { - name: @r0 - } - } - result: { - CALL [11] { - function: _+_ - args: { - COMPREHENSION [12] { - iter_var: #unused - iter_range: { - LIST [13] { - elements: { - } - } - } - accu_var: @r3 - accu_init: { - CALL [14] { - function: timestamp - args: { - CALL [15] { - function: int - args: { - CALL [16] { - function: timestamp - args: { - CONSTANT [17] { value: 75 } - } - } - } - } - } - } - } - loop_condition: { - CONSTANT [18] { value: false } - } - loop_step: { - IDENT [19] { - name: @r3 - } - } - result: { - CALL [20] { - function: _+_ - args: { - COMPREHENSION [21] { - iter_var: #unused - iter_range: { - LIST [22] { - elements: { - } - } - } - accu_var: @r2 - accu_init: { - CALL [23] { - function: getFullYear - target: { - CALL [24] { - function: timestamp - args: { - CALL [25] { - function: int - args: { - CALL [26] { - function: timestamp - args: { - CONSTANT [27] { value: 200 } - } - } - } - } - } - } - } - args: { - } - } - } - loop_condition: { - CONSTANT [28] { value: false } - } - loop_step: { - IDENT [29] { - name: @r2 - } - } - result: { - CALL [30] { - function: _+_ - args: { - CALL [31] { - function: _+_ - args: { - COMPREHENSION [32] { - iter_var: #unused - iter_range: { - LIST [33] { - elements: { - } - } - } - accu_var: @r1 - accu_init: { - CALL [34] { - function: timestamp - args: { - CALL [35] { - function: int - args: { - CALL [36] { - function: timestamp - args: { - CONSTANT [37] { value: 50 } - } - } - } - } - } - } - } - loop_condition: { - CONSTANT [38] { value: false } - } - loop_step: { - IDENT [39] { - name: @r1 - } - } - result: { - CALL [40] { - function: _+_ - args: { - CALL [41] { - function: _+_ - args: { - CALL [42] { - function: _+_ - args: { - CALL [43] { - function: _+_ - args: { - IDENT [44] { - name: @r0 - } - CALL [45] { - function: getFullYear - target: { - IDENT [46] { - name: @r3 - } - } - args: { - } - } - } - } - CALL [47] { - function: getFullYear - target: { - IDENT [48] { - name: @r1 - } - } - args: { - } - } - } - } - IDENT [49] { - name: @r0 - } - } - } - CALL [50] { - function: getSeconds - target: { - IDENT [51] { - name: @r1 - } - } - args: { - } - } - } - } - } - } - IDENT [52] { - name: @r2 - } - } - } - IDENT [53] { - name: @r2 - } - } - } - } - } - CALL [54] { - function: getMinutes - target: { - IDENT [55] { - name: @r3 - } - } - args: { - } - } - } - } - } - } - IDENT [56] { - name: @r0 - } - } - } - } - } - CONSTANT [57] { value: 13934 } - } -} -Test case: MAP_INDEX -Source: {"a": 2}["a"] + {"a": 2}["a"] * {"a": 2}["a"] == 6 -=====> -CALL [1] { - function: _==_ - args: { - COMPREHENSION [2] { - iter_var: #unused - iter_range: { - LIST [3] { - elements: { - } - } - } - accu_var: @r0 - accu_init: { - CALL [4] { - function: _[_] - args: { - MAP [5] { - MAP_ENTRY [6] { - key: { - CONSTANT [7] { value: "a" } - } - value: { - CONSTANT [8] { value: 2 } - } - } - } - CONSTANT [9] { value: "a" } - } - } - } - loop_condition: { - CONSTANT [10] { value: false } - } - loop_step: { - IDENT [11] { - name: @r0 - } - } - result: { - CALL [12] { - function: _+_ - args: { - IDENT [13] { - name: @r0 - } - CALL [14] { - function: _*_ - args: { - IDENT [15] { - name: @r0 - } - IDENT [16] { - name: @r0 - } - } - } - } - } - } - } - CONSTANT [17] { value: 6 } - } -} -Test case: NESTED_MAP_CONSTRUCTION -Source: {'a': {'b': 1}, 'c': {'b': 1}, 'd': {'e': {'b': 1}}, 'e': {'e': {'b': 1}}} -=====> -COMPREHENSION [1] { - iter_var: #unused - iter_range: { - LIST [2] { - elements: { - } - } - } - accu_var: @r0 - accu_init: { - MAP [3] { - MAP_ENTRY [4] { - key: { - CONSTANT [5] { value: "b" } - } - value: { - CONSTANT [6] { value: 1 } - } - } - } - } - loop_condition: { - CONSTANT [7] { value: false } - } - loop_step: { - IDENT [8] { - name: @r0 - } - } - result: { - COMPREHENSION [9] { - iter_var: #unused - iter_range: { - LIST [10] { - elements: { - } - } - } - accu_var: @r1 - accu_init: { - MAP [11] { - MAP_ENTRY [12] { - key: { - CONSTANT [13] { value: "e" } - } - value: { - IDENT [14] { - name: @r0 - } - } - } - } - } - loop_condition: { - CONSTANT [15] { value: false } - } - loop_step: { - IDENT [16] { - name: @r1 - } - } - result: { - MAP [17] { - MAP_ENTRY [18] { - key: { - CONSTANT [19] { value: "a" } - } - value: { - IDENT [20] { - name: @r0 - } - } - } - MAP_ENTRY [21] { - key: { - CONSTANT [22] { value: "c" } - } - value: { - IDENT [23] { - name: @r0 - } - } - } - MAP_ENTRY [24] { - key: { - CONSTANT [25] { value: "d" } - } - value: { - IDENT [26] { - name: @r1 - } - } - } - MAP_ENTRY [27] { - key: { - CONSTANT [28] { value: "e" } - } - value: { - IDENT [29] { - name: @r1 - } - } - } - } - } - } - } -} -Test case: NESTED_LIST_CONSTRUCTION -Source: [1, [1,2,3,4], 2, [1,2,3,4], 5, [1,2,3,4], 7, [[1,2], [1,2,3,4]], [1,2]] -=====> -COMPREHENSION [1] { - iter_var: #unused - iter_range: { - LIST [2] { - elements: { - } - } - } - accu_var: @r0 - accu_init: { - LIST [3] { - elements: { - CONSTANT [4] { value: 1 } - CONSTANT [5] { value: 2 } - CONSTANT [6] { value: 3 } - CONSTANT [7] { value: 4 } - } - } - } - loop_condition: { - CONSTANT [8] { value: false } - } - loop_step: { - IDENT [9] { - name: @r0 - } - } - result: { - COMPREHENSION [10] { - iter_var: #unused - iter_range: { - LIST [11] { - elements: { - } - } - } - accu_var: @r1 - accu_init: { - LIST [12] { - elements: { - CONSTANT [13] { value: 1 } - CONSTANT [14] { value: 2 } - } - } - } - loop_condition: { - CONSTANT [15] { value: false } - } - loop_step: { - IDENT [16] { - name: @r1 - } - } - result: { - LIST [17] { - elements: { - CONSTANT [18] { value: 1 } - IDENT [19] { - name: @r0 - } - CONSTANT [20] { value: 2 } - IDENT [21] { - name: @r0 - } - CONSTANT [22] { value: 5 } - IDENT [23] { - name: @r0 - } - CONSTANT [24] { value: 7 } - LIST [25] { - elements: { - IDENT [26] { - name: @r1 - } - IDENT [27] { - name: @r0 - } - } - } - IDENT [28] { - name: @r1 - } - } - } - } - } - } -} -Test case: SELECT -Source: msg.single_int64 + msg.single_int64 == 6 -=====> -CALL [1] { - function: _==_ - args: { - COMPREHENSION [2] { - iter_var: #unused - iter_range: { - LIST [3] { - elements: { - } - } - } - accu_var: @r0 - accu_init: { - SELECT [4] { - IDENT [5] { - name: msg - }.single_int64 - } - } - loop_condition: { - CONSTANT [6] { value: false } - } - loop_step: { - IDENT [7] { - name: @r0 - } - } - result: { - CALL [8] { - function: _+_ - args: { - IDENT [9] { - name: @r0 - } - IDENT [10] { - name: @r0 - } - } - } - } - } - CONSTANT [11] { value: 6 } - } -} -Test case: SELECT_NESTED_1 -Source: msg.oneof_type.payload.single_int64 + msg.oneof_type.payload.single_int32 + msg.oneof_type.payload.single_int64 + msg.single_int64 + msg.oneof_type.payload.oneof_type.payload.single_int64 == 31 -=====> -CALL [1] { - function: _==_ - args: { - COMPREHENSION [2] { - iter_var: #unused - iter_range: { - LIST [3] { - elements: { - } - } - } - accu_var: @r0 - accu_init: { - SELECT [4] { - SELECT [5] { - IDENT [6] { - name: msg - }.oneof_type - }.payload - } - } - loop_condition: { - CONSTANT [7] { value: false } - } - loop_step: { - IDENT [8] { - name: @r0 - } - } - result: { - CALL [9] { - function: _+_ - args: { - CALL [10] { - function: _+_ - args: { - COMPREHENSION [11] { - iter_var: #unused - iter_range: { - LIST [12] { - elements: { - } - } - } - accu_var: @r1 - accu_init: { - SELECT [13] { - IDENT [14] { - name: @r0 - }.single_int64 - } - } - loop_condition: { - CONSTANT [15] { value: false } - } - loop_step: { - IDENT [16] { - name: @r1 - } - } - result: { - CALL [17] { - function: _+_ - args: { - CALL [18] { - function: _+_ - args: { - IDENT [19] { - name: @r1 - } - SELECT [20] { - IDENT [21] { - name: @r0 - }.single_int32 - } - } - } - IDENT [22] { - name: @r1 - } - } - } - } - } - SELECT [23] { - IDENT [24] { - name: msg - }.single_int64 - } - } - } - SELECT [25] { - SELECT [26] { - SELECT [27] { - IDENT [28] { - name: @r0 - }.oneof_type - }.payload - }.single_int64 - } - } - } - } - } - CONSTANT [29] { value: 31 } - } -} -Test case: SELECT_NESTED_2 -Source: true || msg.oneof_type.payload.oneof_type.payload.oneof_type.payload.oneof_type.payload.single_bool || msg.oneof_type.payload.oneof_type.payload.oneof_type.child.child.payload.single_bool -=====> -COMPREHENSION [1] { - iter_var: #unused - iter_range: { - LIST [2] { - elements: { - } - } - } - accu_var: @r0 - accu_init: { - SELECT [3] { - SELECT [4] { - SELECT [5] { - SELECT [6] { - SELECT [7] { - IDENT [8] { - name: msg - }.oneof_type - }.payload - }.oneof_type - }.payload - }.oneof_type - } - } - loop_condition: { - CONSTANT [9] { value: false } - } - loop_step: { - IDENT [10] { - name: @r0 - } - } - result: { - CALL [11] { - function: _||_ - args: { - CALL [12] { - function: _||_ - args: { - CONSTANT [13] { value: true } - SELECT [14] { - SELECT [15] { - SELECT [16] { - SELECT [17] { - IDENT [18] { - name: @r0 - }.payload - }.oneof_type - }.payload - }.single_bool - } - } - } - SELECT [19] { - SELECT [20] { - SELECT [21] { - SELECT [22] { - IDENT [23] { - name: @r0 - }.child - }.child - }.payload - }.single_bool - } - } - } - } -} -Test case: SELECT_NESTED_MESSAGE_MAP_INDEX_1 -Source: msg.oneof_type.payload.map_int32_int64[1] + msg.oneof_type.payload.map_int32_int64[1] + msg.oneof_type.payload.map_int32_int64[1] == 15 -=====> -CALL [1] { - function: _==_ - args: { - COMPREHENSION [2] { - iter_var: #unused - iter_range: { - LIST [3] { - elements: { - } - } - } - accu_var: @r0 - accu_init: { - CALL [4] { - function: _[_] - args: { - SELECT [5] { - SELECT [6] { - SELECT [7] { - IDENT [8] { - name: msg - }.oneof_type - }.payload - }.map_int32_int64 - } - CONSTANT [9] { value: 1 } - } - } - } - loop_condition: { - CONSTANT [10] { value: false } - } - loop_step: { - IDENT [11] { - name: @r0 - } - } - result: { - CALL [12] { - function: _+_ - args: { - CALL [13] { - function: _+_ - args: { - IDENT [14] { - name: @r0 - } - IDENT [15] { - name: @r0 - } - } - } - IDENT [16] { - name: @r0 - } - } - } - } - } - CONSTANT [17] { value: 15 } - } -} -Test case: SELECT_NESTED_MESSAGE_MAP_INDEX_2 -Source: msg.oneof_type.payload.map_int32_int64[0] + msg.oneof_type.payload.map_int32_int64[1] + msg.oneof_type.payload.map_int32_int64[2] == 8 -=====> -CALL [1] { - function: _==_ - args: { - COMPREHENSION [2] { - iter_var: #unused - iter_range: { - LIST [3] { - elements: { - } - } - } - accu_var: @r0 - accu_init: { - SELECT [4] { - SELECT [5] { - SELECT [6] { - IDENT [7] { - name: msg - }.oneof_type - }.payload - }.map_int32_int64 - } - } - loop_condition: { - CONSTANT [8] { value: false } - } - loop_step: { - IDENT [9] { - name: @r0 - } - } - result: { - CALL [10] { - function: _+_ - args: { - CALL [11] { - function: _+_ - args: { - CALL [12] { - function: _[_] - args: { - IDENT [13] { - name: @r0 - } - CONSTANT [14] { value: 0 } - } - } - CALL [15] { - function: _[_] - args: { - IDENT [16] { - name: @r0 - } - CONSTANT [17] { value: 1 } - } - } - } - } - CALL [18] { - function: _[_] - args: { - IDENT [19] { - name: @r0 - } - CONSTANT [20] { value: 2 } - } - } - } - } - } - } - CONSTANT [21] { value: 8 } - } -} -Test case: SELECT_NESTED_NO_COMMON_SUBEXPR -Source: msg.oneof_type.payload.oneof_type.payload.oneof_type.payload.oneof_type.payload.single_int64 -=====> -SELECT [10] { - SELECT [9] { - SELECT [8] { - SELECT [7] { - SELECT [6] { - SELECT [5] { - SELECT [4] { - SELECT [3] { - SELECT [2] { - IDENT [1] { - name: msg - }.oneof_type - }.payload - }.oneof_type - }.payload - }.oneof_type - }.payload - }.oneof_type - }.payload - }.single_int64 -} -Test case: TERNARY -Source: (msg.single_int64 > 0 ? msg.single_int64 : 0) == 3 -=====> -CALL [1] { - function: _==_ - args: { - COMPREHENSION [2] { - iter_var: #unused - iter_range: { - LIST [3] { - elements: { - } - } - } - accu_var: @r0 - accu_init: { - SELECT [4] { - IDENT [5] { - name: msg - }.single_int64 - } - } - loop_condition: { - CONSTANT [6] { value: false } - } - loop_step: { - IDENT [7] { - name: @r0 - } - } - result: { - CALL [8] { - function: _?_:_ - args: { - CALL [9] { - function: _>_ - args: { - IDENT [10] { - name: @r0 - } - CONSTANT [11] { value: 0 } - } - } - IDENT [12] { - name: @r0 - } - CONSTANT [13] { value: 0 } - } - } - } - } - CONSTANT [14] { value: 3 } - } -} -Test case: TERNARY_BIND_RHS_ONLY -Source: false ? false : (msg.single_int64) + ((msg.single_int64 + 1) * 2) == 11 -=====> -CALL [1] { - function: _?_:_ - args: { - CONSTANT [2] { value: false } - CONSTANT [3] { value: false } - CALL [4] { - function: _==_ - args: { - COMPREHENSION [5] { - iter_var: #unused - iter_range: { - LIST [6] { - elements: { - } - } - } - accu_var: @r0 - accu_init: { - SELECT [7] { - IDENT [8] { - name: msg - }.single_int64 - } - } - loop_condition: { - CONSTANT [9] { value: false } - } - loop_step: { - IDENT [10] { - name: @r0 - } - } - result: { - CALL [11] { - function: _+_ - args: { - IDENT [12] { - name: @r0 - } - CALL [13] { - function: _*_ - args: { - CALL [14] { - function: _+_ - args: { - IDENT [15] { - name: @r0 - } - CONSTANT [16] { value: 1 } - } - } - CONSTANT [17] { value: 2 } - } - } - } - } - } - } - CONSTANT [18] { value: 11 } - } - } - } -} -Test case: NESTED_TERNARY -Source: (msg.single_int64 > 0 ? (msg.single_int32 > 0 ? msg.single_int64 + msg.single_int32 : 0) : 0) == 8 -=====> -CALL [1] { - function: _==_ - args: { - COMPREHENSION [2] { - iter_var: #unused - iter_range: { - LIST [3] { - elements: { - } - } - } - accu_var: @r0 - accu_init: { - SELECT [4] { - IDENT [5] { - name: msg - }.single_int64 - } - } - loop_condition: { - CONSTANT [6] { value: false } - } - loop_step: { - IDENT [7] { - name: @r0 - } - } - result: { - CALL [8] { - function: _?_:_ - args: { - CALL [9] { - function: _>_ - args: { - IDENT [10] { - name: @r0 - } - CONSTANT [11] { value: 0 } - } - } - COMPREHENSION [12] { - iter_var: #unused - iter_range: { - LIST [13] { - elements: { - } - } - } - accu_var: @r1 - accu_init: { - SELECT [14] { - IDENT [15] { - name: msg - }.single_int32 - } - } - loop_condition: { - CONSTANT [16] { value: false } - } - loop_step: { - IDENT [17] { - name: @r1 - } - } - result: { - CALL [18] { - function: _?_:_ - args: { - CALL [19] { - function: _>_ - args: { - IDENT [20] { - name: @r1 - } - CONSTANT [21] { value: 0 } - } - } - CALL [22] { - function: _+_ - args: { - IDENT [23] { - name: @r0 - } - IDENT [24] { - name: @r1 - } - } - } - CONSTANT [25] { value: 0 } - } - } - } - } - CONSTANT [26] { value: 0 } - } - } - } - } - CONSTANT [27] { value: 8 } - } -} -Test case: MULTIPLE_MACROS_1 -Source: size([[1].exists(i, i > 0)]) + size([[1].exists(j, j > 0)]) + size([[2].exists(k, k > 1)]) + size([[2].exists(l, l > 1)]) == 4 -=====> -CALL [1] { - function: _==_ - args: { - COMPREHENSION [2] { - iter_var: #unused - iter_range: { - LIST [3] { - elements: { - } - } - } - accu_var: @r1 - accu_init: { - LIST [4] { - elements: { - CONSTANT [5] { value: 2 } - } - } - } - loop_condition: { - CONSTANT [6] { value: false } - } - loop_step: { - IDENT [7] { - name: @r1 - } - } - result: { - CALL [8] { - function: _+_ - args: { - CALL [9] { - function: _+_ - args: { - COMPREHENSION [10] { - iter_var: #unused - iter_range: { - LIST [11] { - elements: { - } - } - } - accu_var: @r0 - accu_init: { - LIST [12] { - elements: { - CONSTANT [13] { value: 1 } - } - } - } - loop_condition: { - CONSTANT [14] { value: false } - } - loop_step: { - IDENT [15] { - name: @r0 - } - } - result: { - CALL [16] { - function: _+_ - args: { - CALL [17] { - function: size - args: { - LIST [18] { - elements: { - COMPREHENSION [19] { - iter_var: @it:0 - iter_range: { - IDENT [20] { - name: @r0 - } - } - accu_var: @ac:0 - accu_init: { - CONSTANT [21] { value: false } - } - loop_condition: { - CALL [22] { - function: @not_strictly_false - args: { - CALL [23] { - function: !_ - args: { - IDENT [24] { - name: @ac:0 - } - } - } - } - } - } - loop_step: { - CALL [25] { - function: _||_ - args: { - IDENT [26] { - name: @ac:0 - } - CALL [27] { - function: _>_ - args: { - IDENT [28] { - name: @it:0 - } - CONSTANT [29] { value: 0 } - } - } - } - } - } - result: { - IDENT [30] { - name: @ac:0 - } - } - } - } - } - } - } - CALL [31] { - function: size - args: { - LIST [32] { - elements: { - COMPREHENSION [33] { - iter_var: @it:1 - iter_range: { - IDENT [34] { - name: @r0 - } - } - accu_var: @ac:1 - accu_init: { - CONSTANT [35] { value: false } - } - loop_condition: { - CALL [36] { - function: @not_strictly_false - args: { - CALL [37] { - function: !_ - args: { - IDENT [38] { - name: @ac:1 - } - } - } - } - } - } - loop_step: { - CALL [39] { - function: _||_ - args: { - IDENT [40] { - name: @ac:1 - } - CALL [41] { - function: _>_ - args: { - IDENT [42] { - name: @it:1 - } - CONSTANT [43] { value: 0 } - } - } - } - } - } - result: { - IDENT [44] { - name: @ac:1 - } - } - } - } - } - } - } - } - } - } - } - CALL [45] { - function: size - args: { - LIST [46] { - elements: { - COMPREHENSION [47] { - iter_var: @it:2 - iter_range: { - IDENT [48] { - name: @r1 - } - } - accu_var: @ac:2 - accu_init: { - CONSTANT [49] { value: false } - } - loop_condition: { - CALL [50] { - function: @not_strictly_false - args: { - CALL [51] { - function: !_ - args: { - IDENT [52] { - name: @ac:2 - } - } - } - } - } - } - loop_step: { - CALL [53] { - function: _||_ - args: { - IDENT [54] { - name: @ac:2 - } - CALL [55] { - function: _>_ - args: { - IDENT [56] { - name: @it:2 - } - CONSTANT [57] { value: 1 } - } - } - } - } - } - result: { - IDENT [58] { - name: @ac:2 - } - } - } - } - } - } - } - } - } - CALL [59] { - function: size - args: { - LIST [60] { - elements: { - COMPREHENSION [61] { - iter_var: @it:3 - iter_range: { - IDENT [62] { - name: @r1 - } - } - accu_var: @ac:3 - accu_init: { - CONSTANT [63] { value: false } - } - loop_condition: { - CALL [64] { - function: @not_strictly_false - args: { - CALL [65] { - function: !_ - args: { - IDENT [66] { - name: @ac:3 - } - } - } - } - } - } - loop_step: { - CALL [67] { - function: _||_ - args: { - IDENT [68] { - name: @ac:3 - } - CALL [69] { - function: _>_ - args: { - IDENT [70] { - name: @it:3 - } - CONSTANT [71] { value: 1 } - } - } - } - } - } - result: { - IDENT [72] { - name: @ac:3 - } - } - } - } - } - } - } - } - } - } - } - CONSTANT [73] { value: 4 } - } -} -Test case: MULTIPLE_MACROS_2 -Source: [[1].exists(i, i > 0)] + [[1].exists(j, j > 0)] + [['a'].exists(k, k == 'a')] + [['a'].exists(l, l == 'a')] == [true, true, true, true] -=====> -CALL [1] { - function: _==_ - args: { - COMPREHENSION [2] { - iter_var: #unused - iter_range: { - LIST [3] { - elements: { - } - } - } - accu_var: @r1 - accu_init: { - LIST [4] { - elements: { - CONSTANT [5] { value: "a" } - } - } - } - loop_condition: { - CONSTANT [6] { value: false } - } - loop_step: { - IDENT [7] { - name: @r1 - } - } - result: { - CALL [8] { - function: _+_ - args: { - CALL [9] { - function: _+_ - args: { - COMPREHENSION [10] { - iter_var: #unused - iter_range: { - LIST [11] { - elements: { - } - } - } - accu_var: @r0 - accu_init: { - LIST [12] { - elements: { - CONSTANT [13] { value: 1 } - } - } - } - loop_condition: { - CONSTANT [14] { value: false } - } - loop_step: { - IDENT [15] { - name: @r0 - } - } - result: { - CALL [16] { - function: _+_ - args: { - LIST [17] { - elements: { - COMPREHENSION [18] { - iter_var: @it:0 - iter_range: { - IDENT [19] { - name: @r0 - } - } - accu_var: @ac:0 - accu_init: { - CONSTANT [20] { value: false } - } - loop_condition: { - CALL [21] { - function: @not_strictly_false - args: { - CALL [22] { - function: !_ - args: { - IDENT [23] { - name: @ac:0 - } - } - } - } - } - } - loop_step: { - CALL [24] { - function: _||_ - args: { - IDENT [25] { - name: @ac:0 - } - CALL [26] { - function: _>_ - args: { - IDENT [27] { - name: @it:0 - } - CONSTANT [28] { value: 0 } - } - } - } - } - } - result: { - IDENT [29] { - name: @ac:0 - } - } - } - } - } - LIST [30] { - elements: { - COMPREHENSION [31] { - iter_var: @it:1 - iter_range: { - IDENT [32] { - name: @r0 - } - } - accu_var: @ac:1 - accu_init: { - CONSTANT [33] { value: false } - } - loop_condition: { - CALL [34] { - function: @not_strictly_false - args: { - CALL [35] { - function: !_ - args: { - IDENT [36] { - name: @ac:1 - } - } - } - } - } - } - loop_step: { - CALL [37] { - function: _||_ - args: { - IDENT [38] { - name: @ac:1 - } - CALL [39] { - function: _>_ - args: { - IDENT [40] { - name: @it:1 - } - CONSTANT [41] { value: 0 } - } - } - } - } - } - result: { - IDENT [42] { - name: @ac:1 - } - } - } - } - } - } - } - } - } - LIST [43] { - elements: { - COMPREHENSION [44] { - iter_var: @it:2 - iter_range: { - IDENT [45] { - name: @r1 - } - } - accu_var: @ac:2 - accu_init: { - CONSTANT [46] { value: false } - } - loop_condition: { - CALL [47] { - function: @not_strictly_false - args: { - CALL [48] { - function: !_ - args: { - IDENT [49] { - name: @ac:2 - } - } - } - } - } - } - loop_step: { - CALL [50] { - function: _||_ - args: { - IDENT [51] { - name: @ac:2 - } - CALL [52] { - function: _==_ - args: { - IDENT [53] { - name: @it:2 - } - CONSTANT [54] { value: "a" } - } - } - } - } - } - result: { - IDENT [55] { - name: @ac:2 - } - } - } - } - } - } - } - LIST [56] { - elements: { - COMPREHENSION [57] { - iter_var: @it:3 - iter_range: { - IDENT [58] { - name: @r1 - } - } - accu_var: @ac:3 - accu_init: { - CONSTANT [59] { value: false } - } - loop_condition: { - CALL [60] { - function: @not_strictly_false - args: { - CALL [61] { - function: !_ - args: { - IDENT [62] { - name: @ac:3 - } - } - } - } - } - } - loop_step: { - CALL [63] { - function: _||_ - args: { - IDENT [64] { - name: @ac:3 - } - CALL [65] { - function: _==_ - args: { - IDENT [66] { - name: @it:3 - } - CONSTANT [67] { value: "a" } - } - } - } - } - } - result: { - IDENT [68] { - name: @ac:3 - } - } - } - } - } - } - } - } - } - LIST [69] { - elements: { - CONSTANT [70] { value: true } - CONSTANT [71] { value: true } - CONSTANT [72] { value: true } - CONSTANT [73] { value: true } - } - } - } -} -Test case: MULTIPLE_MACROS_3 -Source: [1].exists(i, i > 0) && [1].exists(j, j > 0) && [1].exists(k, k > 1) && [2].exists(l, l > 1) -=====> -COMPREHENSION [1] { - iter_var: #unused - iter_range: { - LIST [2] { - elements: { - } - } - } - accu_var: @r0 - accu_init: { - LIST [3] { - elements: { - CONSTANT [4] { value: 1 } - } - } - } - loop_condition: { - CONSTANT [5] { value: false } - } - loop_step: { - IDENT [6] { - name: @r0 - } - } - result: { - CALL [7] { - function: _&&_ - args: { - CALL [8] { - function: _&&_ - args: { - COMPREHENSION [9] { - iter_var: @it:0 - iter_range: { - IDENT [10] { - name: @r0 - } - } - accu_var: @ac:0 - accu_init: { - CONSTANT [11] { value: false } - } - loop_condition: { - CALL [12] { - function: @not_strictly_false - args: { - CALL [13] { - function: !_ - args: { - IDENT [14] { - name: @ac:0 - } - } - } - } - } - } - loop_step: { - CALL [15] { - function: _||_ - args: { - IDENT [16] { - name: @ac:0 - } - CALL [17] { - function: _>_ - args: { - IDENT [18] { - name: @it:0 - } - CONSTANT [19] { value: 0 } - } - } - } - } - } - result: { - IDENT [20] { - name: @ac:0 - } - } - } - COMPREHENSION [21] { - iter_var: @it:1 - iter_range: { - IDENT [22] { - name: @r0 - } - } - accu_var: @ac:1 - accu_init: { - CONSTANT [23] { value: false } - } - loop_condition: { - CALL [24] { - function: @not_strictly_false - args: { - CALL [25] { - function: !_ - args: { - IDENT [26] { - name: @ac:1 - } - } - } - } - } - } - loop_step: { - CALL [27] { - function: _||_ - args: { - IDENT [28] { - name: @ac:1 - } - CALL [29] { - function: _>_ - args: { - IDENT [30] { - name: @it:1 - } - CONSTANT [31] { value: 0 } - } - } - } - } - } - result: { - IDENT [32] { - name: @ac:1 - } - } - } - } - } - CALL [33] { - function: _&&_ - args: { - COMPREHENSION [34] { - iter_var: @it:2 - iter_range: { - IDENT [35] { - name: @r0 - } - } - accu_var: @ac:2 - accu_init: { - CONSTANT [36] { value: false } - } - loop_condition: { - CALL [37] { - function: @not_strictly_false - args: { - CALL [38] { - function: !_ - args: { - IDENT [39] { - name: @ac:2 - } - } - } - } - } - } - loop_step: { - CALL [40] { - function: _||_ - args: { - IDENT [41] { - name: @ac:2 - } - CALL [42] { - function: _>_ - args: { - IDENT [43] { - name: @it:2 - } - CONSTANT [44] { value: 1 } - } - } - } - } - } - result: { - IDENT [45] { - name: @ac:2 - } - } - } - COMPREHENSION [46] { - iter_var: @it:3 - iter_range: { - LIST [47] { - elements: { - CONSTANT [48] { value: 2 } - } - } - } - accu_var: @ac:3 - accu_init: { - CONSTANT [49] { value: false } - } - loop_condition: { - CALL [50] { - function: @not_strictly_false - args: { - CALL [51] { - function: !_ - args: { - IDENT [52] { - name: @ac:3 - } - } - } - } - } - } - loop_step: { - CALL [53] { - function: _||_ - args: { - IDENT [54] { - name: @ac:3 - } - CALL [55] { - function: _>_ - args: { - IDENT [56] { - name: @it:3 - } - CONSTANT [57] { value: 1 } - } - } - } - } - } - result: { - IDENT [58] { - name: @ac:3 - } - } - } - } - } - } - } - } -} -Test case: NESTED_MACROS -Source: [1,2,3].map(i, [1, 2, 3].map(i, i + 1)) == [[2, 3, 4], [2, 3, 4], [2, 3, 4]] -=====> -CALL [1] { - function: _==_ - args: { - COMPREHENSION [2] { - iter_var: #unused - iter_range: { - LIST [3] { - elements: { - } - } - } - accu_var: @r0 - accu_init: { - LIST [4] { - elements: { - CONSTANT [5] { value: 1 } - CONSTANT [6] { value: 2 } - CONSTANT [7] { value: 3 } - } - } - } - loop_condition: { - CONSTANT [8] { value: false } - } - loop_step: { - IDENT [9] { - name: @r0 - } - } - result: { - COMPREHENSION [10] { - iter_var: @it:1 - iter_range: { - IDENT [11] { - name: @r0 - } - } - accu_var: @ac:1 - accu_init: { - LIST [12] { - elements: { - } - } - } - loop_condition: { - CONSTANT [13] { value: true } - } - loop_step: { - CALL [14] { - function: _+_ - args: { - IDENT [15] { - name: @ac:1 - } - LIST [16] { - elements: { - COMPREHENSION [17] { - iter_var: @it:0 - iter_range: { - IDENT [18] { - name: @r0 - } - } - accu_var: @ac:0 - accu_init: { - LIST [19] { - elements: { - } - } - } - loop_condition: { - CONSTANT [20] { value: true } - } - loop_step: { - CALL [21] { - function: _+_ - args: { - IDENT [22] { - name: @ac:0 - } - LIST [23] { - elements: { - CALL [24] { - function: _+_ - args: { - IDENT [25] { - name: @it:0 - } - CONSTANT [26] { value: 1 } - } - } - } - } - } - } - } - result: { - IDENT [27] { - name: @ac:0 - } - } - } - } - } - } - } - } - result: { - IDENT [28] { - name: @ac:1 - } - } - } - } - } - COMPREHENSION [29] { - iter_var: #unused - iter_range: { - LIST [30] { - elements: { - } - } - } - accu_var: @r1 - accu_init: { - LIST [31] { - elements: { - CONSTANT [32] { value: 2 } - CONSTANT [33] { value: 3 } - CONSTANT [34] { value: 4 } - } - } - } - loop_condition: { - CONSTANT [35] { value: false } - } - loop_step: { - IDENT [36] { - name: @r1 - } - } - result: { - LIST [37] { - elements: { - IDENT [38] { - name: @r1 - } - IDENT [39] { - name: @r1 - } - IDENT [40] { - name: @r1 - } - } - } - } - } - } -} -Test case: NESTED_MACROS_2 -Source: [1, 2].map(y, [1, 2, 3].filter(x, x == y)) == [[1], [2]] -=====> -CALL [31] { - function: _==_ - args: { - COMPREHENSION [30] { - iter_var: y - iter_range: { - LIST [1] { - elements: { - CONSTANT [2] { value: 1 } - CONSTANT [3] { value: 2 } - } - } - } - accu_var: @result - accu_init: { - LIST [24] { - elements: { - } - } - } - loop_condition: { - CONSTANT [25] { value: true } - } - loop_step: { - CALL [28] { - function: _+_ - args: { - IDENT [26] { - name: @result - } - LIST [27] { - elements: { - COMPREHENSION [23] { - iter_var: x - iter_range: { - LIST [6] { - elements: { - CONSTANT [7] { value: 1 } - CONSTANT [8] { value: 2 } - CONSTANT [9] { value: 3 } - } - } - } - accu_var: @result - accu_init: { - LIST [15] { - elements: { - } - } - } - loop_condition: { - CONSTANT [16] { value: true } - } - loop_step: { - CALL [21] { - function: _?_:_ - args: { - CALL [13] { - function: _==_ - args: { - IDENT [12] { - name: x - } - IDENT [14] { - name: y - } - } - } - CALL [19] { - function: _+_ - args: { - IDENT [17] { - name: @result - } - LIST [18] { - elements: { - IDENT [11] { - name: x - } - } - } - } - } - IDENT [20] { - name: @result - } - } - } - } - result: { - IDENT [22] { - name: @result - } - } - } - } - } - } - } - } - result: { - IDENT [29] { - name: @result - } - } - } - LIST [32] { - elements: { - LIST [33] { - elements: { - CONSTANT [34] { value: 1 } - } - } - LIST [35] { - elements: { - CONSTANT [36] { value: 2 } - } - } - } - } - } -} -Test case: ADJACENT_NESTED_MACROS -Source: [1,2,3].map(i, [1, 2, 3].map(i, i + 1)) == [1,2,3].map(j, [1, 2, 3].map(j, j + 1)) -=====> -COMPREHENSION [1] { - iter_var: #unused - iter_range: { - LIST [2] { - elements: { - } - } - } - accu_var: @r0 - accu_init: { - LIST [3] { - elements: { - CONSTANT [4] { value: 1 } - CONSTANT [5] { value: 2 } - CONSTANT [6] { value: 3 } - } - } - } - loop_condition: { - CONSTANT [7] { value: false } - } - loop_step: { - IDENT [8] { - name: @r0 - } - } - result: { - CALL [9] { - function: _==_ - args: { - COMPREHENSION [10] { - iter_var: @it:1 - iter_range: { - IDENT [11] { - name: @r0 - } - } - accu_var: @ac:1 - accu_init: { - LIST [12] { - elements: { - } - } - } - loop_condition: { - CONSTANT [13] { value: true } - } - loop_step: { - CALL [14] { - function: _+_ - args: { - IDENT [15] { - name: @ac:1 - } - LIST [16] { - elements: { - COMPREHENSION [17] { - iter_var: @it:0 - iter_range: { - IDENT [18] { - name: @r0 - } - } - accu_var: @ac:0 - accu_init: { - LIST [19] { - elements: { - } - } - } - loop_condition: { - CONSTANT [20] { value: true } - } - loop_step: { - CALL [21] { - function: _+_ - args: { - IDENT [22] { - name: @ac:0 - } - LIST [23] { - elements: { - CALL [24] { - function: _+_ - args: { - IDENT [25] { - name: @it:0 - } - CONSTANT [26] { value: 1 } - } - } - } - } - } - } - } - result: { - IDENT [27] { - name: @ac:0 - } - } - } - } - } - } - } - } - result: { - IDENT [28] { - name: @ac:1 - } - } - } - COMPREHENSION [29] { - iter_var: @it:3 - iter_range: { - IDENT [30] { - name: @r0 - } - } - accu_var: @ac:3 - accu_init: { - LIST [31] { - elements: { - } - } - } - loop_condition: { - CONSTANT [32] { value: true } - } - loop_step: { - CALL [33] { - function: _+_ - args: { - IDENT [34] { - name: @ac:3 - } - LIST [35] { - elements: { - COMPREHENSION [36] { - iter_var: @it:2 - iter_range: { - IDENT [37] { - name: @r0 - } - } - accu_var: @ac:2 - accu_init: { - LIST [38] { - elements: { - } - } - } - loop_condition: { - CONSTANT [39] { value: true } - } - loop_step: { - CALL [40] { - function: _+_ - args: { - IDENT [41] { - name: @ac:2 - } - LIST [42] { - elements: { - CALL [43] { - function: _+_ - args: { - IDENT [44] { - name: @it:2 - } - CONSTANT [45] { value: 1 } - } - } - } - } - } - } - } - result: { - IDENT [46] { - name: @ac:2 - } - } - } - } - } - } - } - } - result: { - IDENT [47] { - name: @ac:3 - } - } - } - } - } - } -} -Test case: INCLUSION_LIST -Source: 1 in [1,2,3] && 2 in [1,2,3] && 3 in [3, [1,2,3]] && 1 in [1,2,3] -=====> -COMPREHENSION [1] { - iter_var: #unused - iter_range: { - LIST [2] { - elements: { - } - } - } - accu_var: @r0 - accu_init: { - LIST [3] { - elements: { - CONSTANT [4] { value: 1 } - CONSTANT [5] { value: 2 } - CONSTANT [6] { value: 3 } - } - } - } - loop_condition: { - CONSTANT [7] { value: false } - } - loop_step: { - IDENT [8] { - name: @r0 - } - } - result: { - COMPREHENSION [9] { - iter_var: #unused - iter_range: { - LIST [10] { - elements: { - } - } - } - accu_var: @r1 - accu_init: { - CALL [11] { - function: @in - args: { - CONSTANT [12] { value: 1 } - IDENT [13] { - name: @r0 - } - } - } - } - loop_condition: { - CONSTANT [14] { value: false } - } - loop_step: { - IDENT [15] { - name: @r1 - } - } - result: { - CALL [16] { - function: _&&_ - args: { - CALL [17] { - function: _&&_ - args: { - IDENT [18] { - name: @r1 - } - CALL [19] { - function: @in - args: { - CONSTANT [20] { value: 2 } - IDENT [21] { - name: @r0 - } - } - } - } - } - CALL [22] { - function: _&&_ - args: { - CALL [23] { - function: @in - args: { - CONSTANT [24] { value: 3 } - LIST [25] { - elements: { - CONSTANT [26] { value: 3 } - IDENT [27] { - name: @r0 - } - } - } - } - } - IDENT [28] { - name: @r1 - } - } - } - } - } - } - } - } -} -Test case: INCLUSION_MAP -Source: 2 in {'a': 1, 2: {true: false}, 3: {true: false}} -=====> -CALL [1] { - function: @in - args: { - CONSTANT [2] { value: 2 } - COMPREHENSION [3] { - iter_var: #unused - iter_range: { - LIST [4] { - elements: { - } - } - } - accu_var: @r0 - accu_init: { - MAP [5] { - MAP_ENTRY [6] { - key: { - CONSTANT [7] { value: true } - } - value: { - CONSTANT [8] { value: false } - } - } - } - } - loop_condition: { - CONSTANT [9] { value: false } - } - loop_step: { - IDENT [10] { - name: @r0 - } - } - result: { - MAP [11] { - MAP_ENTRY [12] { - key: { - CONSTANT [13] { value: "a" } - } - value: { - CONSTANT [14] { value: 1 } - } - } - MAP_ENTRY [15] { - key: { - CONSTANT [16] { value: 2 } - } - value: { - IDENT [17] { - name: @r0 - } - } - } - MAP_ENTRY [18] { - key: { - CONSTANT [19] { value: 3 } - } - value: { - IDENT [20] { - name: @r0 - } - } - } - } - } - } - } -} -Test case: MACRO_ITER_VAR_NOT_REFERENCED -Source: [1,2].map(i, [1, 2].map(i, [3,4])) == [[[3, 4], [3, 4]], [[3, 4], [3, 4]]] -=====> -COMPREHENSION [1] { - iter_var: #unused - iter_range: { - LIST [2] { - elements: { - } - } - } - accu_var: @r1 - accu_init: { - LIST [3] { - elements: { - CONSTANT [4] { value: 3 } - CONSTANT [5] { value: 4 } - } - } - } - loop_condition: { - CONSTANT [6] { value: false } - } - loop_step: { - IDENT [7] { - name: @r1 - } - } - result: { - CALL [8] { - function: _==_ - args: { - COMPREHENSION [9] { - iter_var: #unused - iter_range: { - LIST [10] { - elements: { - } - } - } - accu_var: @r0 - accu_init: { - LIST [11] { - elements: { - CONSTANT [12] { value: 1 } - CONSTANT [13] { value: 2 } - } - } - } - loop_condition: { - CONSTANT [14] { value: false } - } - loop_step: { - IDENT [15] { - name: @r0 - } - } - result: { - COMPREHENSION [16] { - iter_var: @it:1 - iter_range: { - IDENT [17] { - name: @r0 - } - } - accu_var: @ac:1 - accu_init: { - LIST [18] { - elements: { - } - } - } - loop_condition: { - CONSTANT [19] { value: true } - } - loop_step: { - CALL [20] { - function: _+_ - args: { - IDENT [21] { - name: @ac:1 - } - LIST [22] { - elements: { - COMPREHENSION [23] { - iter_var: @it:0 - iter_range: { - IDENT [24] { - name: @r0 - } - } - accu_var: @ac:0 - accu_init: { - LIST [25] { - elements: { - } - } - } - loop_condition: { - CONSTANT [26] { value: true } - } - loop_step: { - CALL [27] { - function: _+_ - args: { - IDENT [28] { - name: @ac:0 - } - LIST [29] { - elements: { - IDENT [30] { - name: @r1 - } - } - } - } - } - } - result: { - IDENT [31] { - name: @ac:0 - } - } - } - } - } - } - } - } - result: { - IDENT [32] { - name: @ac:1 - } - } - } - } - } - COMPREHENSION [33] { - iter_var: #unused - iter_range: { - LIST [34] { - elements: { - } - } - } - accu_var: @r2 - accu_init: { - LIST [35] { - elements: { - IDENT [36] { - name: @r1 - } - IDENT [37] { - name: @r1 - } - } - } - } - loop_condition: { - CONSTANT [38] { value: false } - } - loop_step: { - IDENT [39] { - name: @r2 - } - } - result: { - LIST [40] { - elements: { - IDENT [41] { - name: @r2 - } - IDENT [42] { - name: @r2 - } - } - } - } - } - } - } - } -} -Test case: MACRO_SHADOWED_VARIABLE -Source: [x - 1 > 3 ? x - 1 : 5].exists(x, x - 1 > 3) || x - 1 > 3 -=====> -COMPREHENSION [1] { - iter_var: #unused - iter_range: { - LIST [2] { - elements: { - } - } - } - accu_var: @r0 - accu_init: { - CALL [3] { - function: _-_ - args: { - IDENT [4] { - name: x - } - CONSTANT [5] { value: 1 } - } - } - } - loop_condition: { - CONSTANT [6] { value: false } - } - loop_step: { - IDENT [7] { - name: @r0 - } - } - result: { - COMPREHENSION [8] { - iter_var: #unused - iter_range: { - LIST [9] { - elements: { - } - } - } - accu_var: @r1 - accu_init: { - CALL [10] { - function: _>_ - args: { - IDENT [11] { - name: @r0 - } - CONSTANT [12] { value: 3 } - } - } - } - loop_condition: { - CONSTANT [13] { value: false } - } - loop_step: { - IDENT [14] { - name: @r1 - } - } - result: { - CALL [15] { - function: _||_ - args: { - COMPREHENSION [16] { - iter_var: @it:0 - iter_range: { - LIST [17] { - elements: { - CALL [18] { - function: _?_:_ - args: { - IDENT [19] { - name: @r1 - } - IDENT [20] { - name: @r0 - } - CONSTANT [21] { value: 5 } - } - } - } - } - } - accu_var: @ac:0 - accu_init: { - CONSTANT [22] { value: false } - } - loop_condition: { - CALL [23] { - function: @not_strictly_false - args: { - CALL [24] { - function: !_ - args: { - IDENT [25] { - name: @ac:0 - } - } - } - } - } - } - loop_step: { - CALL [26] { - function: _||_ - args: { - IDENT [27] { - name: @ac:0 - } - CALL [28] { - function: _>_ - args: { - CALL [29] { - function: _-_ - args: { - IDENT [30] { - name: @it:0 - } - CONSTANT [31] { value: 1 } - } - } - CONSTANT [32] { value: 3 } - } - } - } - } - } - result: { - IDENT [33] { - name: @ac:0 - } - } - } - IDENT [34] { - name: @r1 - } - } - } - } - } - } -} -Test case: MACRO_SHADOWED_VARIABLE_2 -Source: ["foo", "bar"].map(x, [x + x, x + x]).map(x, [x + x, x + x]) -=====> -COMPREHENSION [35] { - iter_var: x - iter_range: { - COMPREHENSION [19] { - iter_var: x - iter_range: { - LIST [1] { - elements: { - CONSTANT [2] { value: "foo" } - CONSTANT [3] { value: "bar" } - } - } - } - accu_var: @result - accu_init: { - LIST [13] { - elements: { - } - } - } - loop_condition: { - CONSTANT [14] { value: true } - } - loop_step: { - CALL [17] { - function: _+_ - args: { - IDENT [15] { - name: @result - } - LIST [16] { - elements: { - LIST [6] { - elements: { - CALL [8] { - function: _+_ - args: { - IDENT [7] { - name: x - } - IDENT [9] { - name: x - } - } - } - CALL [11] { - function: _+_ - args: { - IDENT [10] { - name: x - } - IDENT [12] { - name: x - } - } - } - } - } - } - } - } - } - } - result: { - IDENT [18] { - name: @result - } - } - } - } - accu_var: @result - accu_init: { - LIST [29] { - elements: { - } - } - } - loop_condition: { - CONSTANT [30] { value: true } - } - loop_step: { - CALL [33] { - function: _+_ - args: { - IDENT [31] { - name: @result - } - LIST [32] { - elements: { - LIST [22] { - elements: { - CALL [24] { - function: _+_ - args: { - IDENT [23] { - name: x - } - IDENT [25] { - name: x - } - } - } - CALL [27] { - function: _+_ - args: { - IDENT [26] { - name: x - } - IDENT [28] { - name: x - } - } - } - } - } - } - } - } - } - } - result: { - IDENT [34] { - name: @result - } - } -} -Test case: PRESENCE_TEST -Source: has({'a': true}.a) && {'a':true}['a'] -=====> -COMPREHENSION [1] { - iter_var: #unused - iter_range: { - LIST [2] { - elements: { - } - } - } - accu_var: @r0 - accu_init: { - MAP [3] { - MAP_ENTRY [4] { - key: { - CONSTANT [5] { value: "a" } - } - value: { - CONSTANT [6] { value: true } - } - } - } - } - loop_condition: { - CONSTANT [7] { value: false } - } - loop_step: { - IDENT [8] { - name: @r0 - } - } - result: { - CALL [9] { - function: _&&_ - args: { - SELECT [10] { - IDENT [11] { - name: @r0 - }.a~presence_test - } - CALL [12] { - function: _[_] - args: { - IDENT [13] { - name: @r0 - } - CONSTANT [14] { value: "a" } - } - } - } - } - } -} -Test case: PRESENCE_TEST_2 -Source: has({'a': true}.a) && has({'a': true}.a) -=====> -COMPREHENSION [1] { - iter_var: #unused - iter_range: { - LIST [2] { - elements: { - } - } - } - accu_var: @r0 - accu_init: { - SELECT [3] { - MAP [4] { - MAP_ENTRY [5] { - key: { - CONSTANT [6] { value: "a" } - } - value: { - CONSTANT [7] { value: true } - } - } - }.a~presence_test - } - } - loop_condition: { - CONSTANT [8] { value: false } - } - loop_step: { - IDENT [9] { - name: @r0 - } - } - result: { - CALL [10] { - function: _&&_ - args: { - IDENT [11] { - name: @r0 - } - IDENT [12] { - name: @r0 - } - } - } - } -} -Test case: PRESENCE_TEST_WITH_TERNARY -Source: (has(msg.oneof_type.payload) ? msg.oneof_type.payload.single_int64 : 0) == 10 -=====> -CALL [1] { - function: _==_ - args: { - COMPREHENSION [2] { - iter_var: #unused - iter_range: { - LIST [3] { - elements: { - } - } - } - accu_var: @r0 - accu_init: { - SELECT [4] { - IDENT [5] { - name: msg - }.oneof_type - } - } - loop_condition: { - CONSTANT [6] { value: false } - } - loop_step: { - IDENT [7] { - name: @r0 - } - } - result: { - CALL [8] { - function: _?_:_ - args: { - SELECT [9] { - IDENT [10] { - name: @r0 - }.payload~presence_test - } - SELECT [11] { - SELECT [12] { - IDENT [13] { - name: @r0 - }.payload - }.single_int64 - } - CONSTANT [14] { value: 0 } - } - } - } - } - CONSTANT [15] { value: 10 } - } -} -Test case: PRESENCE_TEST_WITH_TERNARY_2 -Source: (has(msg.oneof_type.payload) ? msg.oneof_type.payload.single_int64 : msg.oneof_type.payload.single_int64 * 0) == 10 -=====> -CALL [1] { - function: _==_ - args: { - COMPREHENSION [2] { - iter_var: #unused - iter_range: { - LIST [3] { - elements: { - } - } - } - accu_var: @r0 - accu_init: { - SELECT [4] { - IDENT [5] { - name: msg - }.oneof_type - } - } - loop_condition: { - CONSTANT [6] { value: false } - } - loop_step: { - IDENT [7] { - name: @r0 - } - } - result: { - COMPREHENSION [8] { - iter_var: #unused - iter_range: { - LIST [9] { - elements: { - } - } - } - accu_var: @r1 - accu_init: { - SELECT [10] { - SELECT [11] { - IDENT [12] { - name: @r0 - }.payload - }.single_int64 - } - } - loop_condition: { - CONSTANT [13] { value: false } - } - loop_step: { - IDENT [14] { - name: @r1 - } - } - result: { - CALL [15] { - function: _?_:_ - args: { - SELECT [16] { - IDENT [17] { - name: @r0 - }.payload~presence_test - } - IDENT [18] { - name: @r1 - } - CALL [19] { - function: _*_ - args: { - IDENT [20] { - name: @r1 - } - CONSTANT [21] { value: 0 } - } - } - } - } - } - } - } - } - CONSTANT [22] { value: 10 } - } -} -Test case: PRESENCE_TEST_WITH_TERNARY_3 -Source: (has(msg.oneof_type.payload.single_int64) ? msg.oneof_type.payload.single_int64 : msg.oneof_type.payload.single_int64 * 0) == 10 -=====> -CALL [1] { - function: _==_ - args: { - COMPREHENSION [2] { - iter_var: #unused - iter_range: { - LIST [3] { - elements: { - } - } - } - accu_var: @r0 - accu_init: { - SELECT [4] { - SELECT [5] { - IDENT [6] { - name: msg - }.oneof_type - }.payload - } - } - loop_condition: { - CONSTANT [7] { value: false } - } - loop_step: { - IDENT [8] { - name: @r0 - } - } - result: { - COMPREHENSION [9] { - iter_var: #unused - iter_range: { - LIST [10] { - elements: { - } - } - } - accu_var: @r1 - accu_init: { - SELECT [11] { - IDENT [12] { - name: @r0 - }.single_int64 - } - } - loop_condition: { - CONSTANT [13] { value: false } - } - loop_step: { - IDENT [14] { - name: @r1 - } - } - result: { - CALL [15] { - function: _?_:_ - args: { - SELECT [16] { - IDENT [17] { - name: @r0 - }.single_int64~presence_test - } - IDENT [18] { - name: @r1 - } - CALL [19] { - function: _*_ - args: { - IDENT [20] { - name: @r1 - } - CONSTANT [21] { value: 0 } - } - } - } - } - } - } - } - } - CONSTANT [22] { value: 10 } - } -} -Test case: PRESENCE_TEST_WITH_TERNARY_NESTED -Source: (has(msg.oneof_type) && has(msg.oneof_type.payload) && has(msg.oneof_type.payload.single_int64)) ? ((has(msg.oneof_type.payload.map_string_string) && has(msg.oneof_type.payload.map_string_string.key)) ? msg.oneof_type.payload.map_string_string.key == 'A' : false) : false -=====> -COMPREHENSION [1] { - iter_var: #unused - iter_range: { - LIST [2] { - elements: { - } - } - } - accu_var: @r0 - accu_init: { - SELECT [3] { - IDENT [4] { - name: msg - }.oneof_type - } - } - loop_condition: { - CONSTANT [5] { value: false } - } - loop_step: { - IDENT [6] { - name: @r0 - } - } - result: { - COMPREHENSION [7] { - iter_var: #unused - iter_range: { - LIST [8] { - elements: { - } - } - } - accu_var: @r1 - accu_init: { - SELECT [9] { - IDENT [10] { - name: @r0 - }.payload - } - } - loop_condition: { - CONSTANT [11] { value: false } - } - loop_step: { - IDENT [12] { - name: @r1 - } - } - result: { - CALL [13] { - function: _?_:_ - args: { - CALL [14] { - function: _&&_ - args: { - CALL [15] { - function: _&&_ - args: { - SELECT [16] { - IDENT [17] { - name: msg - }.oneof_type~presence_test - } - SELECT [18] { - IDENT [19] { - name: @r0 - }.payload~presence_test - } - } - } - SELECT [20] { - IDENT [21] { - name: @r1 - }.single_int64~presence_test - } - } - } - COMPREHENSION [22] { - iter_var: #unused - iter_range: { - LIST [23] { - elements: { - } - } - } - accu_var: @r2 - accu_init: { - SELECT [24] { - IDENT [25] { - name: @r1 - }.map_string_string - } - } - loop_condition: { - CONSTANT [26] { value: false } - } - loop_step: { - IDENT [27] { - name: @r2 - } - } - result: { - CALL [28] { - function: _?_:_ - args: { - CALL [29] { - function: _&&_ - args: { - SELECT [30] { - IDENT [31] { - name: @r1 - }.map_string_string~presence_test - } - SELECT [32] { - IDENT [33] { - name: @r2 - }.key~presence_test - } - } - } - CALL [34] { - function: _==_ - args: { - SELECT [35] { - IDENT [36] { - name: @r2 - }.key - } - CONSTANT [37] { value: "A" } - } - } - CONSTANT [38] { value: false } - } - } - } - } - CONSTANT [39] { value: false } - } - } - } - } - } -} -Test case: OPTIONAL_LIST -Source: [10, ?optional.none(), [?optional.none(), ?opt_x], [?optional.none(), ?opt_x]] == [10, [5], [5]] -=====> -CALL [1] { - function: _==_ - args: { - COMPREHENSION [2] { - iter_var: #unused - iter_range: { - LIST [3] { - elements: { - } - } - } - accu_var: @r0 - accu_init: { - CALL [4] { - function: optional.none - args: { - } - } - } - loop_condition: { - CONSTANT [5] { value: false } - } - loop_step: { - IDENT [6] { - name: @r0 - } - } - result: { - COMPREHENSION [7] { - iter_var: #unused - iter_range: { - LIST [8] { - elements: { - } - } - } - accu_var: @r1 - accu_init: { - LIST [9] { - elements: { - IDENT [10] { - name: @r0 - } - IDENT [11] { - name: opt_x - } - } - optional_indices: [0, 1] - } - } - loop_condition: { - CONSTANT [12] { value: false } - } - loop_step: { - IDENT [13] { - name: @r1 - } - } - result: { - LIST [14] { - elements: { - CONSTANT [15] { value: 10 } - IDENT [16] { - name: @r0 - } - IDENT [17] { - name: @r1 - } - IDENT [18] { - name: @r1 - } - } - optional_indices: [0] - } - } - } - } - } - COMPREHENSION [19] { - iter_var: #unused - iter_range: { - LIST [20] { - elements: { - } - } - } - accu_var: @r2 - accu_init: { - LIST [21] { - elements: { - CONSTANT [22] { value: 5 } - } - } - } - loop_condition: { - CONSTANT [23] { value: false } - } - loop_step: { - IDENT [24] { - name: @r2 - } - } - result: { - LIST [25] { - elements: { - CONSTANT [26] { value: 10 } - IDENT [27] { - name: @r2 - } - IDENT [28] { - name: @r2 - } - } - } - } - } - } -} -Test case: OPTIONAL_MAP -Source: {?'hello': optional.of('hello')}['hello'] + {?'hello': optional.of('hello')}['hello'] == 'hellohello' -=====> -CALL [1] { - function: _==_ - args: { - COMPREHENSION [2] { - iter_var: #unused - iter_range: { - LIST [3] { - elements: { - } - } - } - accu_var: @r0 - accu_init: { - CALL [4] { - function: _[_] - args: { - MAP [5] { - MAP_ENTRY [6] { - key: { - CONSTANT [7] { value: "hello" } - } - optional_entry: true - value: { - CALL [8] { - function: optional.of - args: { - CONSTANT [9] { value: "hello" } - } - } - } - } - } - CONSTANT [10] { value: "hello" } - } - } - } - loop_condition: { - CONSTANT [11] { value: false } - } - loop_step: { - IDENT [12] { - name: @r0 - } - } - result: { - CALL [13] { - function: _+_ - args: { - IDENT [14] { - name: @r0 - } - IDENT [15] { - name: @r0 - } - } - } - } - } - CONSTANT [16] { value: "hellohello" } - } -} -Test case: OPTIONAL_MAP_CHAINED -Source: {?'key': optional.of('test')}[?'bogus'].or({'key': 'test'}[?'bogus']).orValue({'key': 'test'}['key']) == 'test' -=====> -CALL [1] { - function: _==_ - args: { - COMPREHENSION [2] { - iter_var: #unused - iter_range: { - LIST [3] { - elements: { - } - } - } - accu_var: @r0 - accu_init: { - MAP [4] { - MAP_ENTRY [5] { - key: { - CONSTANT [6] { value: "key" } - } - value: { - CONSTANT [7] { value: "test" } - } - } - } - } - loop_condition: { - CONSTANT [8] { value: false } - } - loop_step: { - IDENT [9] { - name: @r0 - } - } - result: { - CALL [10] { - function: orValue - target: { - CALL [11] { - function: or - target: { - CALL [12] { - function: _[?_] - args: { - MAP [13] { - MAP_ENTRY [14] { - key: { - CONSTANT [15] { value: "key" } - } - optional_entry: true - value: { - CALL [16] { - function: optional.of - args: { - CONSTANT [17] { value: "test" } - } - } - } - } - } - CONSTANT [18] { value: "bogus" } - } - } - } - args: { - CALL [19] { - function: _[?_] - args: { - IDENT [20] { - name: @r0 - } - CONSTANT [21] { value: "bogus" } - } - } - } - } - } - args: { - CALL [22] { - function: _[_] - args: { - IDENT [23] { - name: @r0 - } - CONSTANT [24] { value: "key" } - } - } - } - } - } - } - CONSTANT [25] { value: "test" } - } -} -Test case: OPTIONAL_MESSAGE -Source: TestAllTypes{?single_int64: optional.ofNonZeroValue(1), ?single_int32: optional.of(4)}.single_int32 + TestAllTypes{?single_int64: optional.ofNonZeroValue(1), ?single_int32: optional.of(4)}.single_int64 == 5 -=====> -CALL [1] { - function: _==_ - args: { - COMPREHENSION [2] { - iter_var: #unused - iter_range: { - LIST [3] { - elements: { - } - } - } - accu_var: @r0 - accu_init: { - STRUCT [4] { - name: TestAllTypes - entries: { - ENTRY [5] { - field_key: single_int64 - optional_entry: true - value: { - CALL [6] { - function: optional.ofNonZeroValue - args: { - CONSTANT [7] { value: 1 } - } - } - } - } - ENTRY [8] { - field_key: single_int32 - optional_entry: true - value: { - CALL [9] { - function: optional.of - args: { - CONSTANT [10] { value: 4 } - } - } - } - } - } - } - } - loop_condition: { - CONSTANT [11] { value: false } - } - loop_step: { - IDENT [12] { - name: @r0 - } - } - result: { - CALL [13] { - function: _+_ - args: { - SELECT [14] { - IDENT [15] { - name: @r0 - }.single_int32 - } - SELECT [16] { - IDENT [17] { - name: @r0 - }.single_int64 - } - } - } - } - } - CONSTANT [18] { value: 5 } - } -} -Test case: CALL -Source: ('h' + 'e' + 'l' + 'l' + 'o' + ' world').matches('h' + 'e' + 'l' + 'l' + 'o') -=====> -COMPREHENSION [1] { - iter_var: #unused - iter_range: { - LIST [2] { - elements: { - } - } - } - accu_var: @r0 - accu_init: { - CALL [3] { - function: _+_ - args: { - CALL [4] { - function: _+_ - args: { - CALL [5] { - function: _+_ - args: { - CALL [6] { - function: _+_ - args: { - CONSTANT [7] { value: "h" } - CONSTANT [8] { value: "e" } - } - } - CONSTANT [9] { value: "l" } - } - } - CONSTANT [10] { value: "l" } - } - } - CONSTANT [11] { value: "o" } - } - } - } - loop_condition: { - CONSTANT [12] { value: false } - } - loop_step: { - IDENT [13] { - name: @r0 - } - } - result: { - CALL [14] { - function: matches - target: { - CALL [15] { - function: _+_ - args: { - IDENT [16] { - name: @r0 - } - CONSTANT [17] { value: " world" } - } - } - } - args: { - IDENT [18] { - name: @r0 - } - } - } - } -} -Test case: CALL_ARGUMENT_NESTED_NO_COMMON_SUBEXPR -Source: 'hello world'.matches('h' + 'e' + 'l' + 'l' + 'o') -=====> -CALL [2] { - function: matches - target: { - CONSTANT [1] { value: "hello world" } - } - args: { - CALL [10] { - function: _+_ - args: { - CALL [8] { - function: _+_ - args: { - CALL [6] { - function: _+_ - args: { - CALL [4] { - function: _+_ - args: { - CONSTANT [3] { value: "h" } - CONSTANT [5] { value: "e" } - } - } - CONSTANT [7] { value: "l" } - } - } - CONSTANT [9] { value: "l" } - } - } - CONSTANT [11] { value: "o" } - } - } - } -} -Test case: CALL_TARGET_NESTED_NO_COMMON_SUBEXPR -Source: ('h' + 'e' + 'l' + 'l' + 'o' + ' world').matches('hello') -=====> -CALL [12] { - function: matches - target: { - CALL [10] { - function: _+_ - args: { - CALL [8] { - function: _+_ - args: { - CALL [6] { - function: _+_ - args: { - CALL [4] { - function: _+_ - args: { - CALL [2] { - function: _+_ - args: { - CONSTANT [1] { value: "h" } - CONSTANT [3] { value: "e" } - } - } - CONSTANT [5] { value: "l" } - } - } - CONSTANT [7] { value: "l" } - } - } - CONSTANT [9] { value: "o" } - } - } - CONSTANT [11] { value: " world" } - } - } - } - args: { - CONSTANT [13] { value: "hello" } - } -} -Test case: CALL_BOTH_ARGUMENT_TARGET_NESTED_NO_COMMON_SUBEXPR -Source: ('h' + 'e' + 'l' + 'l' + 'o' + ' world').matches('w' + 'o' + 'r' + 'l' + 'd') -=====> -CALL [12] { - function: matches - target: { - CALL [10] { - function: _+_ - args: { - CALL [8] { - function: _+_ - args: { - CALL [6] { - function: _+_ - args: { - CALL [4] { - function: _+_ - args: { - CALL [2] { - function: _+_ - args: { - CONSTANT [1] { value: "h" } - CONSTANT [3] { value: "e" } - } - } - CONSTANT [5] { value: "l" } - } - } - CONSTANT [7] { value: "l" } - } - } - CONSTANT [9] { value: "o" } - } - } - CONSTANT [11] { value: " world" } - } - } - } - args: { - CALL [20] { - function: _+_ - args: { - CALL [18] { - function: _+_ - args: { - CALL [16] { - function: _+_ - args: { - CALL [14] { - function: _+_ - args: { - CONSTANT [13] { value: "w" } - CONSTANT [15] { value: "o" } - } - } - CONSTANT [17] { value: "r" } - } - } - CONSTANT [19] { value: "l" } - } - } - CONSTANT [21] { value: "d" } - } - } - } -} -Test case: CUSTOM_FUNCTION_INELIMINABLE -Source: non_pure_custom_func(msg.oneof_type.payload.single_int64) + non_pure_custom_func(msg.oneof_type.payload.single_int32) + non_pure_custom_func(msg.oneof_type.payload.single_int64) + non_pure_custom_func(msg.single_int64) -=====> -CALL [1] { - function: _+_ - args: { - COMPREHENSION [2] { - iter_var: #unused - iter_range: { - LIST [3] { - elements: { - } - } - } - accu_var: @r0 - accu_init: { - SELECT [4] { - SELECT [5] { - IDENT [6] { - name: msg - }.oneof_type - }.payload - } - } - loop_condition: { - CONSTANT [7] { value: false } - } - loop_step: { - IDENT [8] { - name: @r0 - } - } - result: { - COMPREHENSION [9] { - iter_var: #unused - iter_range: { - LIST [10] { - elements: { - } - } - } - accu_var: @r1 - accu_init: { - SELECT [11] { - IDENT [12] { - name: @r0 - }.single_int64 - } - } - loop_condition: { - CONSTANT [13] { value: false } - } - loop_step: { - IDENT [14] { - name: @r1 - } - } - result: { - CALL [15] { - function: _+_ - args: { - CALL [16] { - function: _+_ - args: { - CALL [17] { - function: non_pure_custom_func - args: { - IDENT [18] { - name: @r1 - } - } - } - CALL [19] { - function: non_pure_custom_func - args: { - SELECT [20] { - IDENT [21] { - name: @r0 - }.single_int32 - } - } - } - } - } - CALL [22] { - function: non_pure_custom_func - args: { - IDENT [23] { - name: @r1 - } - } - } - } - } - } - } - } - } - CALL [24] { - function: non_pure_custom_func - args: { - SELECT [25] { - IDENT [26] { - name: msg - }.single_int64 - } - } - } - } -} -Test case: CUSTOM_FUNCTION_ELIMINABLE -Source: pure_custom_func(msg.oneof_type.payload.single_int64) + pure_custom_func(msg.oneof_type.payload.single_int32) + pure_custom_func(msg.oneof_type.payload.single_int64) + pure_custom_func(msg.single_int64) -=====> -CALL [1] { - function: _+_ - args: { - COMPREHENSION [2] { - iter_var: #unused - iter_range: { - LIST [3] { - elements: { - } - } - } - accu_var: @r0 - accu_init: { - SELECT [4] { - SELECT [5] { - IDENT [6] { - name: msg - }.oneof_type - }.payload - } - } - loop_condition: { - CONSTANT [7] { value: false } - } - loop_step: { - IDENT [8] { - name: @r0 - } - } - result: { - COMPREHENSION [9] { - iter_var: #unused - iter_range: { - LIST [10] { - elements: { - } - } - } - accu_var: @r1 - accu_init: { - CALL [11] { - function: pure_custom_func - args: { - SELECT [12] { - IDENT [13] { - name: @r0 - }.single_int64 - } - } - } - } - loop_condition: { - CONSTANT [14] { value: false } - } - loop_step: { - IDENT [15] { - name: @r1 - } - } - result: { - CALL [16] { - function: _+_ - args: { - CALL [17] { - function: _+_ - args: { - IDENT [18] { - name: @r1 - } - CALL [19] { - function: pure_custom_func - args: { - SELECT [20] { - IDENT [21] { - name: @r0 - }.single_int32 - } - } - } - } - } - IDENT [22] { - name: @r1 - } - } - } - } - } - } - } - CALL [23] { - function: pure_custom_func - args: { - SELECT [24] { - IDENT [25] { - name: msg - }.single_int64 - } - } - } - } -} \ No newline at end of file diff --git a/optimizer/src/test/resources/subexpression_unparsed.baseline b/optimizer/src/test/resources/subexpression_unparsed.baseline index 780664a14..411d74828 100644 --- a/optimizer/src/test/resources/subexpression_unparsed.baseline +++ b/optimizer/src/test/resources/subexpression_unparsed.baseline @@ -2,793 +2,316 @@ Test case: SIZE_1 Source: size([1,2]) + size([1,2]) + 1 == 5 =====> Result: true -[BLOCK_COMMON_SUBEXPR_ONLY]: cel.@block([size([1, 2])], @index0 + @index0 + 1 == 5) -[BLOCK_RECURSION_DEPTH_1]: cel.@block([[1, 2], size(@index0), @index1 + @index1, @index2 + 1], @index3 == 5) -[BLOCK_RECURSION_DEPTH_2]: cel.@block([size([1, 2]), @index0 + @index0 + 1], @index1 == 5) -[BLOCK_RECURSION_DEPTH_3]: cel.@block([size([1, 2])], @index0 + @index0 + 1 == 5) -[BLOCK_RECURSION_DEPTH_4]: cel.@block([size([1, 2])], @index0 + @index0 + 1 == 5) -[BLOCK_RECURSION_DEPTH_5]: cel.@block([size([1, 2])], @index0 + @index0 + 1 == 5) -[BLOCK_RECURSION_DEPTH_6]: cel.@block([size([1, 2])], @index0 + @index0 + 1 == 5) -[BLOCK_RECURSION_DEPTH_7]: cel.@block([size([1, 2])], @index0 + @index0 + 1 == 5) -[BLOCK_RECURSION_DEPTH_8]: cel.@block([size([1, 2])], @index0 + @index0 + 1 == 5) -[BLOCK_RECURSION_DEPTH_9]: cel.@block([size([1, 2])], @index0 + @index0 + 1 == 5) +Unparsed: cel.@block([size([1, 2])], @index0 + @index0 + 1 == 5) Test case: SIZE_2 Source: 2 + size([1,2]) + size([1,2]) + 1 == 7 =====> Result: true -[BLOCK_COMMON_SUBEXPR_ONLY]: cel.@block([size([1, 2])], 2 + @index0 + @index0 + 1 == 7) -[BLOCK_RECURSION_DEPTH_1]: cel.@block([[1, 2], size(@index0), 2 + @index1, @index2 + @index1, @index3 + 1], @index4 == 7) -[BLOCK_RECURSION_DEPTH_2]: cel.@block([size([1, 2]), 2 + @index0 + @index0], @index1 + 1 == 7) -[BLOCK_RECURSION_DEPTH_3]: cel.@block([size([1, 2]), 2 + @index0 + @index0 + 1], @index1 == 7) -[BLOCK_RECURSION_DEPTH_4]: cel.@block([size([1, 2])], 2 + @index0 + @index0 + 1 == 7) -[BLOCK_RECURSION_DEPTH_5]: cel.@block([size([1, 2])], 2 + @index0 + @index0 + 1 == 7) -[BLOCK_RECURSION_DEPTH_6]: cel.@block([size([1, 2])], 2 + @index0 + @index0 + 1 == 7) -[BLOCK_RECURSION_DEPTH_7]: cel.@block([size([1, 2])], 2 + @index0 + @index0 + 1 == 7) -[BLOCK_RECURSION_DEPTH_8]: cel.@block([size([1, 2])], 2 + @index0 + @index0 + 1 == 7) -[BLOCK_RECURSION_DEPTH_9]: cel.@block([size([1, 2])], 2 + @index0 + @index0 + 1 == 7) +Unparsed: cel.@block([size([1, 2])], 2 + @index0 + @index0 + 1 == 7) Test case: SIZE_3 Source: size([0]) + size([0]) + size([1,2]) + size([1,2]) == 6 =====> Result: true -[BLOCK_COMMON_SUBEXPR_ONLY]: cel.@block([size([0]), size([1, 2])], @index0 + @index0 + @index1 + @index1 == 6) -[BLOCK_RECURSION_DEPTH_1]: cel.@block([[0], size(@index0), [1, 2], size(@index2), @index1 + @index1, @index4 + @index3, @index5 + @index3], @index6 == 6) -[BLOCK_RECURSION_DEPTH_2]: cel.@block([size([0]), size([1, 2]), @index0 + @index0 + @index1], @index2 + @index1 == 6) -[BLOCK_RECURSION_DEPTH_3]: cel.@block([size([0]), size([1, 2]), @index0 + @index0 + @index1 + @index1], @index2 == 6) -[BLOCK_RECURSION_DEPTH_4]: cel.@block([size([0]), size([1, 2])], @index0 + @index0 + @index1 + @index1 == 6) -[BLOCK_RECURSION_DEPTH_5]: cel.@block([size([0]), size([1, 2])], @index0 + @index0 + @index1 + @index1 == 6) -[BLOCK_RECURSION_DEPTH_6]: cel.@block([size([0]), size([1, 2])], @index0 + @index0 + @index1 + @index1 == 6) -[BLOCK_RECURSION_DEPTH_7]: cel.@block([size([0]), size([1, 2])], @index0 + @index0 + @index1 + @index1 == 6) -[BLOCK_RECURSION_DEPTH_8]: cel.@block([size([0]), size([1, 2])], @index0 + @index0 + @index1 + @index1 == 6) -[BLOCK_RECURSION_DEPTH_9]: cel.@block([size([0]), size([1, 2])], @index0 + @index0 + @index1 + @index1 == 6) +Unparsed: cel.@block([size([0]), size([1, 2])], @index0 + @index0 + @index1 + @index1 == 6) Test case: SIZE_4 Source: 5 + size([0]) + size([0]) + size([1,2]) + size([1,2]) + size([1,2,3]) + size([1,2,3]) == 17 =====> Result: true -[BLOCK_COMMON_SUBEXPR_ONLY]: cel.@block([size([0]), size([1, 2]), size([1, 2, 3])], 5 + @index0 + @index0 + @index1 + @index1 + @index2 + @index2 == 17) -[BLOCK_RECURSION_DEPTH_1]: cel.@block([[0], size(@index0), [1, 2], size(@index2), [1, 2, 3], size(@index4), 5 + @index1, @index6 + @index1, @index7 + @index3, @index8 + @index3, @index9 + @index5, @index10 + @index5], @index11 == 17) -[BLOCK_RECURSION_DEPTH_2]: cel.@block([size([0]), size([1, 2]), size([1, 2, 3]), 5 + @index0 + @index0, @index3 + @index1 + @index1, @index4 + @index2 + @index2], @index5 == 17) -[BLOCK_RECURSION_DEPTH_3]: cel.@block([size([0]), size([1, 2]), size([1, 2, 3]), 5 + @index0 + @index0 + @index1, @index3 + @index1 + @index2 + @index2], @index4 == 17) -[BLOCK_RECURSION_DEPTH_4]: cel.@block([size([0]), size([1, 2]), size([1, 2, 3]), 5 + @index0 + @index0 + @index1 + @index1], @index3 + @index2 + @index2 == 17) -[BLOCK_RECURSION_DEPTH_5]: cel.@block([size([0]), size([1, 2]), size([1, 2, 3]), 5 + @index0 + @index0 + @index1 + @index1 + @index2], @index3 + @index2 == 17) -[BLOCK_RECURSION_DEPTH_6]: cel.@block([size([0]), size([1, 2]), size([1, 2, 3]), 5 + @index0 + @index0 + @index1 + @index1 + @index2 + @index2], @index3 == 17) -[BLOCK_RECURSION_DEPTH_7]: cel.@block([size([0]), size([1, 2]), size([1, 2, 3])], 5 + @index0 + @index0 + @index1 + @index1 + @index2 + @index2 == 17) -[BLOCK_RECURSION_DEPTH_8]: cel.@block([size([0]), size([1, 2]), size([1, 2, 3])], 5 + @index0 + @index0 + @index1 + @index1 + @index2 + @index2 == 17) -[BLOCK_RECURSION_DEPTH_9]: cel.@block([size([0]), size([1, 2]), size([1, 2, 3])], 5 + @index0 + @index0 + @index1 + @index1 + @index2 + @index2 == 17) +Unparsed: cel.@block([size([0]), size([1, 2]), size([1, 2, 3])], 5 + @index0 + @index0 + @index1 + @index1 + @index2 + @index2 == 17) Test case: TIMESTAMP Source: timestamp(int(timestamp(1000000000))).getFullYear() + timestamp(int(timestamp(75))).getFullYear() + timestamp(int(timestamp(50))).getFullYear() + timestamp(int(timestamp(1000000000))).getFullYear() + timestamp(int(timestamp(50))).getSeconds() + timestamp(int(timestamp(200))).getFullYear() + timestamp(int(timestamp(200))).getFullYear() + timestamp(int(timestamp(75))).getMinutes() + timestamp(int(timestamp(1000000000))).getFullYear() == 13934 =====> Result: true -[BLOCK_COMMON_SUBEXPR_ONLY]: cel.@block([timestamp(int(timestamp(1000000000))).getFullYear(), timestamp(int(timestamp(50))), timestamp(int(timestamp(200))).getFullYear(), timestamp(int(timestamp(75)))], @index0 + @index3.getFullYear() + @index1.getFullYear() + @index0 + @index1.getSeconds() + @index2 + @index2 + @index3.getMinutes() + @index0 == 13934) -[BLOCK_RECURSION_DEPTH_1]: cel.@block([timestamp(1000000000), int(@index0), timestamp(@index1), @index2.getFullYear(), timestamp(50), int(@index4), timestamp(@index5), timestamp(200), int(@index7), timestamp(@index8), @index9.getFullYear(), timestamp(75), int(@index11), timestamp(@index12), @index13.getFullYear(), @index3 + @index14, @index6.getFullYear(), @index15 + @index16, @index17 + @index3, @index6.getSeconds(), @index18 + @index19, @index20 + @index10, @index21 + @index10, @index13.getMinutes(), @index22 + @index23, @index24 + @index3], @index25 == 13934) -[BLOCK_RECURSION_DEPTH_2]: cel.@block([int(timestamp(1000000000)), timestamp(@index0).getFullYear(), int(timestamp(50)), int(timestamp(200)), timestamp(@index3).getFullYear(), int(timestamp(75)), timestamp(@index2), timestamp(@index5), @index1 + @index7.getFullYear(), @index8 + @index6.getFullYear(), @index9 + @index1 + @index6.getSeconds(), @index10 + @index4 + @index4, @index11 + @index7.getMinutes()], @index12 + @index1 == 13934) -[BLOCK_RECURSION_DEPTH_3]: cel.@block([timestamp(int(timestamp(1000000000))), timestamp(int(timestamp(50))), timestamp(int(timestamp(200))), timestamp(int(timestamp(75))), @index0.getFullYear(), @index2.getFullYear(), @index4 + @index3.getFullYear() + @index1.getFullYear(), @index6 + @index4 + @index1.getSeconds() + @index5, @index7 + @index5 + @index3.getMinutes() + @index4], @index8 == 13934) -[BLOCK_RECURSION_DEPTH_4]: cel.@block([timestamp(int(timestamp(1000000000))).getFullYear(), timestamp(int(timestamp(200))).getFullYear(), timestamp(int(timestamp(50))), timestamp(int(timestamp(75))), @index0 + @index3.getFullYear() + @index2.getFullYear() + @index0, @index4 + @index2.getSeconds() + @index1 + @index1], @index5 + @index3.getMinutes() + @index0 == 13934) -[BLOCK_RECURSION_DEPTH_5]: cel.@block([timestamp(int(timestamp(1000000000))).getFullYear(), timestamp(int(timestamp(200))).getFullYear(), timestamp(int(timestamp(50))), timestamp(int(timestamp(75))), @index0 + @index3.getFullYear() + @index2.getFullYear() + @index0 + @index2.getSeconds()], @index4 + @index1 + @index1 + @index3.getMinutes() + @index0 == 13934) -[BLOCK_RECURSION_DEPTH_6]: cel.@block([timestamp(int(timestamp(1000000000))).getFullYear(), timestamp(int(timestamp(200))).getFullYear(), timestamp(int(timestamp(50))), timestamp(int(timestamp(75))), @index0 + @index3.getFullYear() + @index2.getFullYear() + @index0 + @index2.getSeconds() + @index1], @index4 + @index1 + @index3.getMinutes() + @index0 == 13934) -[BLOCK_RECURSION_DEPTH_7]: cel.@block([timestamp(int(timestamp(1000000000))).getFullYear(), timestamp(int(timestamp(200))).getFullYear(), timestamp(int(timestamp(50))), timestamp(int(timestamp(75))), @index0 + @index3.getFullYear() + @index2.getFullYear() + @index0 + @index2.getSeconds() + @index1 + @index1], @index4 + @index3.getMinutes() + @index0 == 13934) -[BLOCK_RECURSION_DEPTH_8]: cel.@block([timestamp(int(timestamp(1000000000))).getFullYear(), timestamp(int(timestamp(200))).getFullYear(), timestamp(int(timestamp(50))), timestamp(int(timestamp(75))), @index0 + @index3.getFullYear() + @index2.getFullYear() + @index0 + @index2.getSeconds() + @index1 + @index1 + @index3.getMinutes()], @index4 + @index0 == 13934) -[BLOCK_RECURSION_DEPTH_9]: cel.@block([timestamp(int(timestamp(1000000000))).getFullYear(), timestamp(int(timestamp(200))).getFullYear(), timestamp(int(timestamp(50))), timestamp(int(timestamp(75))), @index0 + @index3.getFullYear() + @index2.getFullYear() + @index0 + @index2.getSeconds() + @index1 + @index1 + @index3.getMinutes() + @index0], @index4 == 13934) +Unparsed: cel.@block([timestamp(int(timestamp(1000000000))).getFullYear(), timestamp(int(timestamp(50))), timestamp(int(timestamp(200))).getFullYear(), timestamp(int(timestamp(75)))], @index0 + @index3.getFullYear() + @index1.getFullYear() + @index0 + @index1.getSeconds() + @index2 + @index2 + @index3.getMinutes() + @index0 == 13934) Test case: MAP_INDEX Source: {"a": 2}["a"] + {"a": 2}["a"] * {"a": 2}["a"] == 6 =====> Result: true -[BLOCK_COMMON_SUBEXPR_ONLY]: cel.@block([{"a": 2}["a"]], @index0 + @index0 * @index0 == 6) -[BLOCK_RECURSION_DEPTH_1]: cel.@block([{"a": 2}, @index0["a"], @index1 * @index1, @index1 + @index2], @index3 == 6) -[BLOCK_RECURSION_DEPTH_2]: cel.@block([{"a": 2}["a"], @index0 + @index0 * @index0], @index1 == 6) -[BLOCK_RECURSION_DEPTH_3]: cel.@block([{"a": 2}["a"]], @index0 + @index0 * @index0 == 6) -[BLOCK_RECURSION_DEPTH_4]: cel.@block([{"a": 2}["a"]], @index0 + @index0 * @index0 == 6) -[BLOCK_RECURSION_DEPTH_5]: cel.@block([{"a": 2}["a"]], @index0 + @index0 * @index0 == 6) -[BLOCK_RECURSION_DEPTH_6]: cel.@block([{"a": 2}["a"]], @index0 + @index0 * @index0 == 6) -[BLOCK_RECURSION_DEPTH_7]: cel.@block([{"a": 2}["a"]], @index0 + @index0 * @index0 == 6) -[BLOCK_RECURSION_DEPTH_8]: cel.@block([{"a": 2}["a"]], @index0 + @index0 * @index0 == 6) -[BLOCK_RECURSION_DEPTH_9]: cel.@block([{"a": 2}["a"]], @index0 + @index0 * @index0 == 6) +Unparsed: cel.@block([{"a": 2}["a"]], @index0 + @index0 * @index0 == 6) Test case: NESTED_MAP_CONSTRUCTION Source: {'a': {'b': 1}, 'c': {'b': 1}, 'd': {'e': {'b': 1}}, 'e': {'e': {'b': 1}}} =====> Result: {a={b=1}, c={b=1}, d={e={b=1}}, e={e={b=1}}} -[BLOCK_COMMON_SUBEXPR_ONLY]: cel.@block([{"b": 1}, {"e": @index0}], {"a": @index0, "c": @index0, "d": @index1, "e": @index1}) -[BLOCK_RECURSION_DEPTH_1]: cel.@block([{"b": 1}, {"e": @index0}], {"a": @index0, "c": @index0, "d": @index1, "e": @index1}) -[BLOCK_RECURSION_DEPTH_2]: cel.@block([{"e": {"b": 1}}, {"b": 1}], {"a": @index1, "c": @index1, "d": @index0, "e": @index0}) -[BLOCK_RECURSION_DEPTH_3]: cel.@block([{"e": {"b": 1}}, {"b": 1}], {"a": @index1, "c": @index1, "d": @index0, "e": @index0}) -[BLOCK_RECURSION_DEPTH_4]: cel.@block([{"e": {"b": 1}}, {"b": 1}], {"a": @index1, "c": @index1, "d": @index0, "e": @index0}) -[BLOCK_RECURSION_DEPTH_5]: cel.@block([{"e": {"b": 1}}, {"b": 1}], {"a": @index1, "c": @index1, "d": @index0, "e": @index0}) -[BLOCK_RECURSION_DEPTH_6]: cel.@block([{"e": {"b": 1}}, {"b": 1}], {"a": @index1, "c": @index1, "d": @index0, "e": @index0}) -[BLOCK_RECURSION_DEPTH_7]: cel.@block([{"e": {"b": 1}}, {"b": 1}], {"a": @index1, "c": @index1, "d": @index0, "e": @index0}) -[BLOCK_RECURSION_DEPTH_8]: cel.@block([{"e": {"b": 1}}, {"b": 1}], {"a": @index1, "c": @index1, "d": @index0, "e": @index0}) -[BLOCK_RECURSION_DEPTH_9]: cel.@block([{"e": {"b": 1}}, {"b": 1}], {"a": @index1, "c": @index1, "d": @index0, "e": @index0}) +Unparsed: cel.@block([{"b": 1}, {"e": @index0}], {"a": @index0, "c": @index0, "d": @index1, "e": @index1}) Test case: NESTED_LIST_CONSTRUCTION Source: [1, [1,2,3,4], 2, [1,2,3,4], 5, [1,2,3,4], 7, [[1,2], [1,2,3,4]], [1,2]] =====> Result: [1, [1, 2, 3, 4], 2, [1, 2, 3, 4], 5, [1, 2, 3, 4], 7, [[1, 2], [1, 2, 3, 4]], [1, 2]] -[BLOCK_COMMON_SUBEXPR_ONLY]: cel.@block([[1, 2, 3, 4], [1, 2]], [1, @index0, 2, @index0, 5, @index0, 7, [@index1, @index0], @index1]) -[BLOCK_RECURSION_DEPTH_1]: cel.@block([[1, 2, 3, 4], [1, 2], [@index1, @index0]], [1, @index0, 2, @index0, 5, @index0, 7, @index2, @index1]) -[BLOCK_RECURSION_DEPTH_2]: cel.@block([[1, 2, 3, 4], [1, 2]], [1, @index0, 2, @index0, 5, @index0, 7, [@index1, @index0], @index1]) -[BLOCK_RECURSION_DEPTH_3]: cel.@block([[1, 2, 3, 4], [1, 2]], [1, @index0, 2, @index0, 5, @index0, 7, [@index1, @index0], @index1]) -[BLOCK_RECURSION_DEPTH_4]: cel.@block([[1, 2, 3, 4], [1, 2]], [1, @index0, 2, @index0, 5, @index0, 7, [@index1, @index0], @index1]) -[BLOCK_RECURSION_DEPTH_5]: cel.@block([[1, 2, 3, 4], [1, 2]], [1, @index0, 2, @index0, 5, @index0, 7, [@index1, @index0], @index1]) -[BLOCK_RECURSION_DEPTH_6]: cel.@block([[1, 2, 3, 4], [1, 2]], [1, @index0, 2, @index0, 5, @index0, 7, [@index1, @index0], @index1]) -[BLOCK_RECURSION_DEPTH_7]: cel.@block([[1, 2, 3, 4], [1, 2]], [1, @index0, 2, @index0, 5, @index0, 7, [@index1, @index0], @index1]) -[BLOCK_RECURSION_DEPTH_8]: cel.@block([[1, 2, 3, 4], [1, 2]], [1, @index0, 2, @index0, 5, @index0, 7, [@index1, @index0], @index1]) -[BLOCK_RECURSION_DEPTH_9]: cel.@block([[1, 2, 3, 4], [1, 2]], [1, @index0, 2, @index0, 5, @index0, 7, [@index1, @index0], @index1]) +Unparsed: cel.@block([[1, 2, 3, 4], [1, 2]], [1, @index0, 2, @index0, 5, @index0, 7, [@index1, @index0], @index1]) Test case: SELECT Source: msg.single_int64 + msg.single_int64 == 6 =====> Result: true -[BLOCK_COMMON_SUBEXPR_ONLY]: cel.@block([msg.single_int64], @index0 + @index0 == 6) -[BLOCK_RECURSION_DEPTH_1]: cel.@block([msg.single_int64, @index0 + @index0], @index1 == 6) -[BLOCK_RECURSION_DEPTH_2]: cel.@block([msg.single_int64], @index0 + @index0 == 6) -[BLOCK_RECURSION_DEPTH_3]: cel.@block([msg.single_int64], @index0 + @index0 == 6) -[BLOCK_RECURSION_DEPTH_4]: cel.@block([msg.single_int64], @index0 + @index0 == 6) -[BLOCK_RECURSION_DEPTH_5]: cel.@block([msg.single_int64], @index0 + @index0 == 6) -[BLOCK_RECURSION_DEPTH_6]: cel.@block([msg.single_int64], @index0 + @index0 == 6) -[BLOCK_RECURSION_DEPTH_7]: cel.@block([msg.single_int64], @index0 + @index0 == 6) -[BLOCK_RECURSION_DEPTH_8]: cel.@block([msg.single_int64], @index0 + @index0 == 6) -[BLOCK_RECURSION_DEPTH_9]: cel.@block([msg.single_int64], @index0 + @index0 == 6) +Unparsed: cel.@block([msg.single_int64], @index0 + @index0 == 6) Test case: SELECT_NESTED_1 Source: msg.oneof_type.payload.single_int64 + msg.oneof_type.payload.single_int32 + msg.oneof_type.payload.single_int64 + msg.single_int64 + msg.oneof_type.payload.oneof_type.payload.single_int64 == 31 =====> Result: true -[BLOCK_COMMON_SUBEXPR_ONLY]: cel.@block([msg.oneof_type.payload, @index0.single_int64], @index1 + @index0.single_int32 + @index1 + msg.single_int64 + @index0.oneof_type.payload.single_int64 == 31) -[BLOCK_RECURSION_DEPTH_1]: cel.@block([msg.oneof_type, @index0.payload, @index1.single_int64, @index1.single_int32, @index2 + @index3, @index4 + @index2, msg.single_int64, @index5 + @index6, @index1.oneof_type, @index8.payload, @index9.single_int64, @index7 + @index10], @index11 == 31) -[BLOCK_RECURSION_DEPTH_2]: cel.@block([msg.oneof_type.payload, @index0.single_int64, @index1 + @index0.single_int32, @index2 + @index1 + msg.single_int64, @index0.oneof_type.payload, @index3 + @index4.single_int64], @index5 == 31) -[BLOCK_RECURSION_DEPTH_3]: cel.@block([msg.oneof_type.payload.single_int64, msg.oneof_type.payload, @index0 + @index1.single_int32 + @index0, @index1.oneof_type.payload.single_int64, @index2 + msg.single_int64 + @index3], @index4 == 31) -[BLOCK_RECURSION_DEPTH_4]: cel.@block([msg.oneof_type.payload.single_int64, msg.oneof_type.payload, @index0 + @index1.single_int32 + @index0 + msg.single_int64, @index2 + @index1.oneof_type.payload.single_int64], @index3 == 31) -[BLOCK_RECURSION_DEPTH_5]: cel.@block([msg.oneof_type.payload.single_int64, msg.oneof_type.payload, @index0 + @index1.single_int32 + @index0 + msg.single_int64 + @index1.oneof_type.payload.single_int64], @index2 == 31) -[BLOCK_RECURSION_DEPTH_6]: cel.@block([msg.oneof_type.payload.single_int64, msg.oneof_type.payload], @index0 + @index1.single_int32 + @index0 + msg.single_int64 + @index1.oneof_type.payload.single_int64 == 31) -[BLOCK_RECURSION_DEPTH_7]: cel.@block([msg.oneof_type.payload.single_int64, msg.oneof_type.payload], @index0 + @index1.single_int32 + @index0 + msg.single_int64 + @index1.oneof_type.payload.single_int64 == 31) -[BLOCK_RECURSION_DEPTH_8]: cel.@block([msg.oneof_type.payload.single_int64, msg.oneof_type.payload], @index0 + @index1.single_int32 + @index0 + msg.single_int64 + @index1.oneof_type.payload.single_int64 == 31) -[BLOCK_RECURSION_DEPTH_9]: cel.@block([msg.oneof_type.payload.single_int64, msg.oneof_type.payload], @index0 + @index1.single_int32 + @index0 + msg.single_int64 + @index1.oneof_type.payload.single_int64 == 31) +Unparsed: cel.@block([msg.oneof_type.payload, @index0.single_int64], @index1 + @index0.single_int32 + @index1 + msg.single_int64 + @index0.oneof_type.payload.single_int64 == 31) Test case: SELECT_NESTED_2 Source: true || msg.oneof_type.payload.oneof_type.payload.oneof_type.payload.oneof_type.payload.single_bool || msg.oneof_type.payload.oneof_type.payload.oneof_type.child.child.payload.single_bool =====> Result: true -[BLOCK_COMMON_SUBEXPR_ONLY]: cel.@block([msg.oneof_type.payload.oneof_type.payload.oneof_type], true || @index0.payload.oneof_type.payload.single_bool || @index0.child.child.payload.single_bool) -[BLOCK_RECURSION_DEPTH_1]: cel.@block([msg.oneof_type, @index0.payload, @index1.oneof_type, @index2.payload, @index3.oneof_type, @index4.payload, @index5.oneof_type, @index6.payload, @index7.single_bool, true || @index8, @index4.child, @index10.child, @index11.payload, @index12.single_bool], @index9 || @index13) -[BLOCK_RECURSION_DEPTH_2]: cel.@block([msg.oneof_type.payload, @index0.oneof_type.payload, @index1.oneof_type, @index2.payload.oneof_type, @index3.payload.single_bool, @index2.child.child, @index5.payload.single_bool], true || @index4 || @index6) -[BLOCK_RECURSION_DEPTH_3]: cel.@block([msg.oneof_type.payload.oneof_type, @index0.payload.oneof_type, @index1.payload.oneof_type.payload, @index1.child.child.payload], true || @index2.single_bool || @index3.single_bool) -[BLOCK_RECURSION_DEPTH_4]: cel.@block([msg.oneof_type.payload.oneof_type.payload, @index0.oneof_type, @index1.payload.oneof_type.payload.single_bool, @index1.child.child.payload.single_bool], true || @index2 || @index3) -[BLOCK_RECURSION_DEPTH_5]: cel.@block([msg.oneof_type.payload.oneof_type.payload.oneof_type, true || @index0.payload.oneof_type.payload.single_bool], @index1 || @index0.child.child.payload.single_bool) -[BLOCK_RECURSION_DEPTH_6]: cel.@block([msg.oneof_type.payload.oneof_type.payload.oneof_type], true || @index0.payload.oneof_type.payload.single_bool || @index0.child.child.payload.single_bool) -[BLOCK_RECURSION_DEPTH_7]: cel.@block([msg.oneof_type.payload.oneof_type.payload.oneof_type], true || @index0.payload.oneof_type.payload.single_bool || @index0.child.child.payload.single_bool) -[BLOCK_RECURSION_DEPTH_8]: cel.@block([msg.oneof_type.payload.oneof_type.payload.oneof_type], true || @index0.payload.oneof_type.payload.single_bool || @index0.child.child.payload.single_bool) -[BLOCK_RECURSION_DEPTH_9]: cel.@block([msg.oneof_type.payload.oneof_type.payload.oneof_type], true || @index0.payload.oneof_type.payload.single_bool || @index0.child.child.payload.single_bool) +Unparsed: cel.@block([msg.oneof_type.payload.oneof_type.payload.oneof_type], true || @index0.payload.oneof_type.payload.single_bool || @index0.child.child.payload.single_bool) Test case: SELECT_NESTED_MESSAGE_MAP_INDEX_1 Source: msg.oneof_type.payload.map_int32_int64[1] + msg.oneof_type.payload.map_int32_int64[1] + msg.oneof_type.payload.map_int32_int64[1] == 15 =====> Result: true -[BLOCK_COMMON_SUBEXPR_ONLY]: cel.@block([msg.oneof_type.payload.map_int32_int64[1]], @index0 + @index0 + @index0 == 15) -[BLOCK_RECURSION_DEPTH_1]: cel.@block([msg.oneof_type, @index0.payload, @index1.map_int32_int64, @index2[1], @index3 + @index3, @index4 + @index3], @index5 == 15) -[BLOCK_RECURSION_DEPTH_2]: cel.@block([msg.oneof_type.payload, @index0.map_int32_int64[1], @index1 + @index1 + @index1], @index2 == 15) -[BLOCK_RECURSION_DEPTH_3]: cel.@block([msg.oneof_type.payload.map_int32_int64, @index0[1]], @index1 + @index1 + @index1 == 15) -[BLOCK_RECURSION_DEPTH_4]: cel.@block([msg.oneof_type.payload.map_int32_int64[1]], @index0 + @index0 + @index0 == 15) -[BLOCK_RECURSION_DEPTH_5]: cel.@block([msg.oneof_type.payload.map_int32_int64[1]], @index0 + @index0 + @index0 == 15) -[BLOCK_RECURSION_DEPTH_6]: cel.@block([msg.oneof_type.payload.map_int32_int64[1]], @index0 + @index0 + @index0 == 15) -[BLOCK_RECURSION_DEPTH_7]: cel.@block([msg.oneof_type.payload.map_int32_int64[1]], @index0 + @index0 + @index0 == 15) -[BLOCK_RECURSION_DEPTH_8]: cel.@block([msg.oneof_type.payload.map_int32_int64[1]], @index0 + @index0 + @index0 == 15) -[BLOCK_RECURSION_DEPTH_9]: cel.@block([msg.oneof_type.payload.map_int32_int64[1]], @index0 + @index0 + @index0 == 15) +Unparsed: cel.@block([msg.oneof_type.payload.map_int32_int64[1]], @index0 + @index0 + @index0 == 15) Test case: SELECT_NESTED_MESSAGE_MAP_INDEX_2 Source: msg.oneof_type.payload.map_int32_int64[0] + msg.oneof_type.payload.map_int32_int64[1] + msg.oneof_type.payload.map_int32_int64[2] == 8 =====> Result: true -[BLOCK_COMMON_SUBEXPR_ONLY]: cel.@block([msg.oneof_type.payload.map_int32_int64], @index0[0] + @index0[1] + @index0[2] == 8) -[BLOCK_RECURSION_DEPTH_1]: cel.@block([msg.oneof_type, @index0.payload, @index1.map_int32_int64, @index2[0], @index2[1], @index3 + @index4, @index2[2], @index5 + @index6], @index7 == 8) -[BLOCK_RECURSION_DEPTH_2]: cel.@block([msg.oneof_type.payload, @index0.map_int32_int64, @index1[0] + @index1[1], @index2 + @index1[2]], @index3 == 8) -[BLOCK_RECURSION_DEPTH_3]: cel.@block([msg.oneof_type.payload.map_int32_int64, @index0[0] + @index0[1] + @index0[2]], @index1 == 8) -[BLOCK_RECURSION_DEPTH_4]: cel.@block([msg.oneof_type.payload.map_int32_int64], @index0[0] + @index0[1] + @index0[2] == 8) -[BLOCK_RECURSION_DEPTH_5]: cel.@block([msg.oneof_type.payload.map_int32_int64], @index0[0] + @index0[1] + @index0[2] == 8) -[BLOCK_RECURSION_DEPTH_6]: cel.@block([msg.oneof_type.payload.map_int32_int64], @index0[0] + @index0[1] + @index0[2] == 8) -[BLOCK_RECURSION_DEPTH_7]: cel.@block([msg.oneof_type.payload.map_int32_int64], @index0[0] + @index0[1] + @index0[2] == 8) -[BLOCK_RECURSION_DEPTH_8]: cel.@block([msg.oneof_type.payload.map_int32_int64], @index0[0] + @index0[1] + @index0[2] == 8) -[BLOCK_RECURSION_DEPTH_9]: cel.@block([msg.oneof_type.payload.map_int32_int64], @index0[0] + @index0[1] + @index0[2] == 8) +Unparsed: cel.@block([msg.oneof_type.payload.map_int32_int64], @index0[0] + @index0[1] + @index0[2] == 8) Test case: SELECT_NESTED_NO_COMMON_SUBEXPR Source: msg.oneof_type.payload.oneof_type.payload.oneof_type.payload.oneof_type.payload.single_int64 =====> Result: 0 -[BLOCK_COMMON_SUBEXPR_ONLY]: msg.oneof_type.payload.oneof_type.payload.oneof_type.payload.oneof_type.payload.single_int64 -[BLOCK_RECURSION_DEPTH_1]: cel.@block([msg.oneof_type, @index0.payload, @index1.oneof_type, @index2.payload, @index3.oneof_type, @index4.payload, @index5.oneof_type, @index6.payload], @index7.single_int64) -[BLOCK_RECURSION_DEPTH_2]: cel.@block([msg.oneof_type.payload, @index0.oneof_type.payload, @index1.oneof_type.payload, @index2.oneof_type.payload], @index3.single_int64) -[BLOCK_RECURSION_DEPTH_3]: cel.@block([msg.oneof_type.payload.oneof_type, @index0.payload.oneof_type.payload], @index1.oneof_type.payload.single_int64) -[BLOCK_RECURSION_DEPTH_4]: cel.@block([msg.oneof_type.payload.oneof_type.payload, @index0.oneof_type.payload.oneof_type.payload], @index1.single_int64) -[BLOCK_RECURSION_DEPTH_5]: cel.@block([msg.oneof_type.payload.oneof_type.payload.oneof_type], @index0.payload.oneof_type.payload.single_int64) -[BLOCK_RECURSION_DEPTH_6]: cel.@block([msg.oneof_type.payload.oneof_type.payload.oneof_type.payload], @index0.oneof_type.payload.single_int64) -[BLOCK_RECURSION_DEPTH_7]: cel.@block([msg.oneof_type.payload.oneof_type.payload.oneof_type.payload.oneof_type], @index0.payload.single_int64) -[BLOCK_RECURSION_DEPTH_8]: cel.@block([msg.oneof_type.payload.oneof_type.payload.oneof_type.payload.oneof_type.payload], @index0.single_int64) -[BLOCK_RECURSION_DEPTH_9]: msg.oneof_type.payload.oneof_type.payload.oneof_type.payload.oneof_type.payload.single_int64 +Unparsed: msg.oneof_type.payload.oneof_type.payload.oneof_type.payload.oneof_type.payload.single_int64 Test case: TERNARY Source: (msg.single_int64 > 0 ? msg.single_int64 : 0) == 3 =====> Result: true -[BLOCK_COMMON_SUBEXPR_ONLY]: cel.@block([msg.single_int64], ((@index0 > 0) ? @index0 : 0) == 3) -[BLOCK_RECURSION_DEPTH_1]: cel.@block([msg.single_int64, @index0 > 0, @index1 ? @index0 : 0], @index2 == 3) -[BLOCK_RECURSION_DEPTH_2]: cel.@block([msg.single_int64, (@index0 > 0) ? @index0 : 0], @index1 == 3) -[BLOCK_RECURSION_DEPTH_3]: cel.@block([msg.single_int64], ((@index0 > 0) ? @index0 : 0) == 3) -[BLOCK_RECURSION_DEPTH_4]: cel.@block([msg.single_int64], ((@index0 > 0) ? @index0 : 0) == 3) -[BLOCK_RECURSION_DEPTH_5]: cel.@block([msg.single_int64], ((@index0 > 0) ? @index0 : 0) == 3) -[BLOCK_RECURSION_DEPTH_6]: cel.@block([msg.single_int64], ((@index0 > 0) ? @index0 : 0) == 3) -[BLOCK_RECURSION_DEPTH_7]: cel.@block([msg.single_int64], ((@index0 > 0) ? @index0 : 0) == 3) -[BLOCK_RECURSION_DEPTH_8]: cel.@block([msg.single_int64], ((@index0 > 0) ? @index0 : 0) == 3) -[BLOCK_RECURSION_DEPTH_9]: cel.@block([msg.single_int64], ((@index0 > 0) ? @index0 : 0) == 3) +Unparsed: cel.@block([msg.single_int64], ((@index0 > 0) ? @index0 : 0) == 3) Test case: TERNARY_BIND_RHS_ONLY Source: false ? false : (msg.single_int64) + ((msg.single_int64 + 1) * 2) == 11 =====> Result: true -[BLOCK_COMMON_SUBEXPR_ONLY]: cel.@block([msg.single_int64], false ? false : (@index0 + (@index0 + 1) * 2 == 11)) -[BLOCK_RECURSION_DEPTH_1]: cel.@block([msg.single_int64, @index0 + 1, @index1 * 2, @index0 + @index2, @index3 == 11], false ? false : @index4) -[BLOCK_RECURSION_DEPTH_2]: cel.@block([msg.single_int64, (@index0 + 1) * 2, @index0 + @index1 == 11], false ? false : @index2) -[BLOCK_RECURSION_DEPTH_3]: cel.@block([msg.single_int64, @index0 + (@index0 + 1) * 2], false ? false : (@index1 == 11)) -[BLOCK_RECURSION_DEPTH_4]: cel.@block([msg.single_int64, @index0 + (@index0 + 1) * 2 == 11], false ? false : @index1) -[BLOCK_RECURSION_DEPTH_5]: cel.@block([msg.single_int64], false ? false : (@index0 + (@index0 + 1) * 2 == 11)) -[BLOCK_RECURSION_DEPTH_6]: cel.@block([msg.single_int64], false ? false : (@index0 + (@index0 + 1) * 2 == 11)) -[BLOCK_RECURSION_DEPTH_7]: cel.@block([msg.single_int64], false ? false : (@index0 + (@index0 + 1) * 2 == 11)) -[BLOCK_RECURSION_DEPTH_8]: cel.@block([msg.single_int64], false ? false : (@index0 + (@index0 + 1) * 2 == 11)) -[BLOCK_RECURSION_DEPTH_9]: cel.@block([msg.single_int64], false ? false : (@index0 + (@index0 + 1) * 2 == 11)) +Unparsed: cel.@block([msg.single_int64], false ? false : (@index0 + (@index0 + 1) * 2 == 11)) Test case: NESTED_TERNARY Source: (msg.single_int64 > 0 ? (msg.single_int32 > 0 ? msg.single_int64 + msg.single_int32 : 0) : 0) == 8 =====> Result: true -[BLOCK_COMMON_SUBEXPR_ONLY]: cel.@block([msg.single_int64, msg.single_int32], ((@index0 > 0) ? ((@index1 > 0) ? (@index0 + @index1) : 0) : 0) == 8) -[BLOCK_RECURSION_DEPTH_1]: cel.@block([msg.single_int64, msg.single_int32, @index0 > 0, @index1 > 0, @index0 + @index1, @index3 ? @index4 : 0, @index2 ? @index5 : 0], @index6 == 8) -[BLOCK_RECURSION_DEPTH_2]: cel.@block([msg.single_int64, msg.single_int32, (@index1 > 0) ? (@index0 + @index1) : 0, (@index0 > 0) ? @index2 : 0], @index3 == 8) -[BLOCK_RECURSION_DEPTH_3]: cel.@block([msg.single_int64, msg.single_int32, (@index0 > 0) ? ((@index1 > 0) ? (@index0 + @index1) : 0) : 0], @index2 == 8) -[BLOCK_RECURSION_DEPTH_4]: cel.@block([msg.single_int64, msg.single_int32], ((@index0 > 0) ? ((@index1 > 0) ? (@index0 + @index1) : 0) : 0) == 8) -[BLOCK_RECURSION_DEPTH_5]: cel.@block([msg.single_int64, msg.single_int32], ((@index0 > 0) ? ((@index1 > 0) ? (@index0 + @index1) : 0) : 0) == 8) -[BLOCK_RECURSION_DEPTH_6]: cel.@block([msg.single_int64, msg.single_int32], ((@index0 > 0) ? ((@index1 > 0) ? (@index0 + @index1) : 0) : 0) == 8) -[BLOCK_RECURSION_DEPTH_7]: cel.@block([msg.single_int64, msg.single_int32], ((@index0 > 0) ? ((@index1 > 0) ? (@index0 + @index1) : 0) : 0) == 8) -[BLOCK_RECURSION_DEPTH_8]: cel.@block([msg.single_int64, msg.single_int32], ((@index0 > 0) ? ((@index1 > 0) ? (@index0 + @index1) : 0) : 0) == 8) -[BLOCK_RECURSION_DEPTH_9]: cel.@block([msg.single_int64, msg.single_int32], ((@index0 > 0) ? ((@index1 > 0) ? (@index0 + @index1) : 0) : 0) == 8) +Unparsed: cel.@block([msg.single_int64, msg.single_int32], ((@index0 > 0) ? ((@index1 > 0) ? (@index0 + @index1) : 0) : 0) == 8) Test case: MULTIPLE_MACROS_1 Source: size([[1].exists(i, i > 0)]) + size([[1].exists(j, j > 0)]) + size([[2].exists(k, k > 1)]) + size([[2].exists(l, l > 1)]) == 4 =====> Result: true -[BLOCK_COMMON_SUBEXPR_ONLY]: cel.@block([[1].exists(@it:0:0, @it:0:0 > 0), size([@index0]), [2].exists(@it:0:0, @it:0:0 > 1), size([@index2])], @index1 + @index1 + @index3 + @index3 == 4) -[BLOCK_RECURSION_DEPTH_1]: cel.@block([[1], [2]], size([@index0.exists(@it:0:0, @it:0:0 > 0)]) + size([@index0.exists(@it:0:0, @it:0:0 > 0)]) + size([@index1.exists(@it:0:0, @it:0:0 > 1)]) + size([@index1.exists(@it:0:0, @it:0:0 > 1)]) == 4) -[BLOCK_RECURSION_DEPTH_2]: cel.@block([[1], [2]], size([@index0.exists(@it:0:0, @it:0:0 > 0)]) + size([@index0.exists(@it:0:0, @it:0:0 > 0)]) + size([@index1.exists(@it:0:0, @it:0:0 > 1)]) + size([@index1.exists(@it:0:0, @it:0:0 > 1)]) == 4) -[BLOCK_RECURSION_DEPTH_3]: cel.@block([[1].exists(@it:0:0, @it:0:0 > 0), [2].exists(@it:0:0, @it:0:0 > 1), size([@index0]), size([@index1]), @index2 + @index2 + @index3 + @index3], @index4 == 4) -[BLOCK_RECURSION_DEPTH_4]: cel.@block([[1].exists(@it:0:0, @it:0:0 > 0), [2].exists(@it:0:0, @it:0:0 > 1), size([@index0]), size([@index1])], @index2 + @index2 + @index3 + @index3 == 4) -[BLOCK_RECURSION_DEPTH_5]: cel.@block([[1].exists(@it:0:0, @it:0:0 > 0), [2].exists(@it:0:0, @it:0:0 > 1), size([@index0]), size([@index1])], @index2 + @index2 + @index3 + @index3 == 4) -[BLOCK_RECURSION_DEPTH_6]: cel.@block([[1].exists(@it:0:0, @it:0:0 > 0), [2].exists(@it:0:0, @it:0:0 > 1), size([@index0]), size([@index1])], @index2 + @index2 + @index3 + @index3 == 4) -[BLOCK_RECURSION_DEPTH_7]: cel.@block([[1].exists(@it:0:0, @it:0:0 > 0), [2].exists(@it:0:0, @it:0:0 > 1), size([@index0]), size([@index1])], @index2 + @index2 + @index3 + @index3 == 4) -[BLOCK_RECURSION_DEPTH_8]: cel.@block([[1].exists(@it:0:0, @it:0:0 > 0), [2].exists(@it:0:0, @it:0:0 > 1), size([@index0]), size([@index1])], @index2 + @index2 + @index3 + @index3 == 4) -[BLOCK_RECURSION_DEPTH_9]: cel.@block([[1].exists(@it:0:0, @it:0:0 > 0), [2].exists(@it:0:0, @it:0:0 > 1), size([@index0]), size([@index1])], @index2 + @index2 + @index3 + @index3 == 4) +Unparsed: cel.@block([[1].exists(@it:0:0, @it:0:0 > 0), size([@index0]), [2].exists(@it:0:0, @it:0:0 > 1), size([@index2])], @index1 + @index1 + @index3 + @index3 == 4) Test case: MULTIPLE_MACROS_2 Source: [[1].exists(i, i > 0)] + [[1].exists(j, j > 0)] + [['a'].exists(k, k == 'a')] + [['a'].exists(l, l == 'a')] == [true, true, true, true] =====> Result: true -[BLOCK_COMMON_SUBEXPR_ONLY]: cel.@block([[1].exists(@it:0:0, @it:0:0 > 0), [@index0], ["a"].exists(@it:0:1, @it:0:1 == "a"), [@index2]], @index1 + @index1 + @index3 + @index3 == [true, true, true, true]) -[BLOCK_RECURSION_DEPTH_1]: cel.@block([[1], ["a"], [true, true, true, true]], [@index0.exists(@it:0:0, @it:0:0 > 0)] + [@index0.exists(@it:0:0, @it:0:0 > 0)] + [@index1.exists(@it:0:1, @it:0:1 == "a")] + [@index1.exists(@it:0:1, @it:0:1 == "a")] == @index2) -[BLOCK_RECURSION_DEPTH_2]: cel.@block([[1], ["a"], [true, true, true, true]], [@index0.exists(@it:0:0, @it:0:0 > 0)] + [@index0.exists(@it:0:0, @it:0:0 > 0)] + [@index1.exists(@it:0:1, @it:0:1 == "a")] + [@index1.exists(@it:0:1, @it:0:1 == "a")] == @index2) -[BLOCK_RECURSION_DEPTH_3]: cel.@block([[1].exists(@it:0:0, @it:0:0 > 0), ["a"].exists(@it:0:1, @it:0:1 == "a"), [@index0], [@index1], @index2 + @index2 + @index3 + @index3], @index4 == [true, true, true, true]) -[BLOCK_RECURSION_DEPTH_4]: cel.@block([[1].exists(@it:0:0, @it:0:0 > 0), ["a"].exists(@it:0:1, @it:0:1 == "a"), [@index0], [@index1]], @index2 + @index2 + @index3 + @index3 == [true, true, true, true]) -[BLOCK_RECURSION_DEPTH_5]: cel.@block([[1].exists(@it:0:0, @it:0:0 > 0), ["a"].exists(@it:0:1, @it:0:1 == "a"), [@index0], [@index1]], @index2 + @index2 + @index3 + @index3 == [true, true, true, true]) -[BLOCK_RECURSION_DEPTH_6]: cel.@block([[1].exists(@it:0:0, @it:0:0 > 0), ["a"].exists(@it:0:1, @it:0:1 == "a"), [@index0], [@index1]], @index2 + @index2 + @index3 + @index3 == [true, true, true, true]) -[BLOCK_RECURSION_DEPTH_7]: cel.@block([[1].exists(@it:0:0, @it:0:0 > 0), ["a"].exists(@it:0:1, @it:0:1 == "a"), [@index0], [@index1]], @index2 + @index2 + @index3 + @index3 == [true, true, true, true]) -[BLOCK_RECURSION_DEPTH_8]: cel.@block([[1].exists(@it:0:0, @it:0:0 > 0), ["a"].exists(@it:0:1, @it:0:1 == "a"), [@index0], [@index1]], @index2 + @index2 + @index3 + @index3 == [true, true, true, true]) -[BLOCK_RECURSION_DEPTH_9]: cel.@block([[1].exists(@it:0:0, @it:0:0 > 0), ["a"].exists(@it:0:1, @it:0:1 == "a"), [@index0], [@index1]], @index2 + @index2 + @index3 + @index3 == [true, true, true, true]) +Unparsed: cel.@block([[1].exists(@it:0:0, @it:0:0 > 0), [@index0], ["a"].exists(@it:0:1, @it:0:1 == "a"), [@index2]], @index1 + @index1 + @index3 + @index3 == [true, true, true, true]) Test case: MULTIPLE_MACROS_3 Source: [1].exists(i, i > 0) && [1].exists(j, j > 0) && [1].exists(k, k > 1) && [2].exists(l, l > 1) =====> Result: false -[BLOCK_COMMON_SUBEXPR_ONLY]: cel.@block([[1].exists(@it:0:0, @it:0:0 > 0)], @index0 && @index0 && [1].exists(@it:0:0, @it:0:0 > 1) && [2].exists(@it:0:0, @it:0:0 > 1)) -[BLOCK_RECURSION_DEPTH_1]: cel.@block([[1], [2]], @index0.exists(@it:0:0, @it:0:0 > 0) && @index0.exists(@it:0:0, @it:0:0 > 0) && @index0.exists(@it:0:0, @it:0:0 > 1) && @index1.exists(@it:0:0, @it:0:0 > 1)) -[BLOCK_RECURSION_DEPTH_2]: cel.@block([[1], [2]], @index0.exists(@it:0:0, @it:0:0 > 0) && @index0.exists(@it:0:0, @it:0:0 > 0) && @index0.exists(@it:0:0, @it:0:0 > 1) && @index1.exists(@it:0:0, @it:0:0 > 1)) -[BLOCK_RECURSION_DEPTH_3]: cel.@block([[1].exists(@it:0:0, @it:0:0 > 0)], @index0 && @index0 && [1].exists(@it:0:0, @it:0:0 > 1) && [2].exists(@it:0:0, @it:0:0 > 1)) -[BLOCK_RECURSION_DEPTH_4]: cel.@block([[1].exists(@it:0:0, @it:0:0 > 0)], @index0 && @index0 && [1].exists(@it:0:0, @it:0:0 > 1) && [2].exists(@it:0:0, @it:0:0 > 1)) -[BLOCK_RECURSION_DEPTH_5]: cel.@block([[1].exists(@it:0:0, @it:0:0 > 0)], @index0 && @index0 && [1].exists(@it:0:0, @it:0:0 > 1) && [2].exists(@it:0:0, @it:0:0 > 1)) -[BLOCK_RECURSION_DEPTH_6]: cel.@block([[1].exists(@it:0:0, @it:0:0 > 0)], @index0 && @index0 && [1].exists(@it:0:0, @it:0:0 > 1) && [2].exists(@it:0:0, @it:0:0 > 1)) -[BLOCK_RECURSION_DEPTH_7]: cel.@block([[1].exists(@it:0:0, @it:0:0 > 0)], @index0 && @index0 && [1].exists(@it:0:0, @it:0:0 > 1) && [2].exists(@it:0:0, @it:0:0 > 1)) -[BLOCK_RECURSION_DEPTH_8]: cel.@block([[1].exists(@it:0:0, @it:0:0 > 0)], @index0 && @index0 && [1].exists(@it:0:0, @it:0:0 > 1) && [2].exists(@it:0:0, @it:0:0 > 1)) -[BLOCK_RECURSION_DEPTH_9]: cel.@block([[1].exists(@it:0:0, @it:0:0 > 0)], @index0 && @index0 && [1].exists(@it:0:0, @it:0:0 > 1) && [2].exists(@it:0:0, @it:0:0 > 1)) +Unparsed: cel.@block([[1].exists(@it:0:0, @it:0:0 > 0)], @index0 && @index0 && [1].exists(@it:0:0, @it:0:0 > 1) && [2].exists(@it:0:0, @it:0:0 > 1)) Test case: MULTIPLE_MACROS_COMP_V2_1 Source: size([[1].exists(i,x,i > 0 && x >= 0)]) + size([[1].exists(j, y, j > 0 && y >= 0)]) + size([[2].exists(k,z,k > 1 && z >= 0)]) + size([[2].exists(l, w, l > 1 && w >= 0)]) == 4 =====> Result: true -[BLOCK_COMMON_SUBEXPR_ONLY]: cel.@block([[1].exists(@it:0:0, @it2:0:0, @it:0:0 > 0 && @it2:0:0 >= 0), size([@index0]), [2].exists(@it:0:0, @it2:0:0, @it:0:0 > 1 && @it2:0:0 >= 0), size([@index2])], @index1 + @index1 + @index3 + @index3 == 4) -[BLOCK_RECURSION_DEPTH_1]: cel.@block([[1], [2]], size([@index0.exists(@it:0:0, @it2:0:0, @it:0:0 > 0 && @it2:0:0 >= 0)]) + size([@index0.exists(@it:0:0, @it2:0:0, @it:0:0 > 0 && @it2:0:0 >= 0)]) + size([@index1.exists(@it:0:0, @it2:0:0, @it:0:0 > 1 && @it2:0:0 >= 0)]) + size([@index1.exists(@it:0:0, @it2:0:0, @it:0:0 > 1 && @it2:0:0 >= 0)]) == 4) -[BLOCK_RECURSION_DEPTH_2]: cel.@block([[1], [2]], size([@index0.exists(@it:0:0, @it2:0:0, @it:0:0 > 0 && @it2:0:0 >= 0)]) + size([@index0.exists(@it:0:0, @it2:0:0, @it:0:0 > 0 && @it2:0:0 >= 0)]) + size([@index1.exists(@it:0:0, @it2:0:0, @it:0:0 > 1 && @it2:0:0 >= 0)]) + size([@index1.exists(@it:0:0, @it2:0:0, @it:0:0 > 1 && @it2:0:0 >= 0)]) == 4) -[BLOCK_RECURSION_DEPTH_3]: cel.@block([[1], [2]], size([@index0.exists(@it:0:0, @it2:0:0, @it:0:0 > 0 && @it2:0:0 >= 0)]) + size([@index0.exists(@it:0:0, @it2:0:0, @it:0:0 > 0 && @it2:0:0 >= 0)]) + size([@index1.exists(@it:0:0, @it2:0:0, @it:0:0 > 1 && @it2:0:0 >= 0)]) + size([@index1.exists(@it:0:0, @it2:0:0, @it:0:0 > 1 && @it2:0:0 >= 0)]) == 4) -[BLOCK_RECURSION_DEPTH_4]: cel.@block([[1].exists(@it:0:0, @it2:0:0, @it:0:0 > 0 && @it2:0:0 >= 0), [2].exists(@it:0:0, @it2:0:0, @it:0:0 > 1 && @it2:0:0 >= 0), size([@index0]), size([@index1])], @index2 + @index2 + @index3 + @index3 == 4) -[BLOCK_RECURSION_DEPTH_5]: cel.@block([[1].exists(@it:0:0, @it2:0:0, @it:0:0 > 0 && @it2:0:0 >= 0), [2].exists(@it:0:0, @it2:0:0, @it:0:0 > 1 && @it2:0:0 >= 0), size([@index0]), size([@index1])], @index2 + @index2 + @index3 + @index3 == 4) -[BLOCK_RECURSION_DEPTH_6]: cel.@block([[1].exists(@it:0:0, @it2:0:0, @it:0:0 > 0 && @it2:0:0 >= 0), [2].exists(@it:0:0, @it2:0:0, @it:0:0 > 1 && @it2:0:0 >= 0), size([@index0]), size([@index1])], @index2 + @index2 + @index3 + @index3 == 4) -[BLOCK_RECURSION_DEPTH_7]: cel.@block([[1].exists(@it:0:0, @it2:0:0, @it:0:0 > 0 && @it2:0:0 >= 0), [2].exists(@it:0:0, @it2:0:0, @it:0:0 > 1 && @it2:0:0 >= 0), size([@index0]), size([@index1])], @index2 + @index2 + @index3 + @index3 == 4) -[BLOCK_RECURSION_DEPTH_8]: cel.@block([[1].exists(@it:0:0, @it2:0:0, @it:0:0 > 0 && @it2:0:0 >= 0), [2].exists(@it:0:0, @it2:0:0, @it:0:0 > 1 && @it2:0:0 >= 0), size([@index0]), size([@index1])], @index2 + @index2 + @index3 + @index3 == 4) -[BLOCK_RECURSION_DEPTH_9]: cel.@block([[1].exists(@it:0:0, @it2:0:0, @it:0:0 > 0 && @it2:0:0 >= 0), [2].exists(@it:0:0, @it2:0:0, @it:0:0 > 1 && @it2:0:0 >= 0), size([@index0]), size([@index1])], @index2 + @index2 + @index3 + @index3 == 4) +Unparsed: cel.@block([[1].exists(@it:0:0, @it2:0:0, @it:0:0 > 0 && @it2:0:0 >= 0), size([@index0]), [2].exists(@it:0:0, @it2:0:0, @it:0:0 > 1 && @it2:0:0 >= 0), size([@index2])], @index1 + @index1 + @index3 + @index3 == 4) Test case: MULTIPLE_MACROS_COMP_V2_2 Source: [1].exists(i, x, i > 0 && x > 0) && [1].exists(j, y, j > 0 && y > 0) && [1].exists(k, z, k > 1 && z > 0) && [2].exists(l, w, l > 1 && w > 0) =====> Result: false -[BLOCK_COMMON_SUBEXPR_ONLY]: cel.@block([[1].exists(@it:0:0, @it2:0:0, @it:0:0 > 0 && @it2:0:0 > 0)], @index0 && @index0 && [1].exists(@it:0:0, @it2:0:0, @it:0:0 > 1 && @it2:0:0 > 0) && [2].exists(@it:0:0, @it2:0:0, @it:0:0 > 1 && @it2:0:0 > 0)) -[BLOCK_RECURSION_DEPTH_1]: cel.@block([[1], [2]], @index0.exists(@it:0:0, @it2:0:0, @it:0:0 > 0 && @it2:0:0 > 0) && @index0.exists(@it:0:0, @it2:0:0, @it:0:0 > 0 && @it2:0:0 > 0) && @index0.exists(@it:0:0, @it2:0:0, @it:0:0 > 1 && @it2:0:0 > 0) && @index1.exists(@it:0:0, @it2:0:0, @it:0:0 > 1 && @it2:0:0 > 0)) -[BLOCK_RECURSION_DEPTH_2]: cel.@block([[1], [2]], @index0.exists(@it:0:0, @it2:0:0, @it:0:0 > 0 && @it2:0:0 > 0) && @index0.exists(@it:0:0, @it2:0:0, @it:0:0 > 0 && @it2:0:0 > 0) && @index0.exists(@it:0:0, @it2:0:0, @it:0:0 > 1 && @it2:0:0 > 0) && @index1.exists(@it:0:0, @it2:0:0, @it:0:0 > 1 && @it2:0:0 > 0)) -[BLOCK_RECURSION_DEPTH_3]: cel.@block([[1], [2]], @index0.exists(@it:0:0, @it2:0:0, @it:0:0 > 0 && @it2:0:0 > 0) && @index0.exists(@it:0:0, @it2:0:0, @it:0:0 > 0 && @it2:0:0 > 0) && @index0.exists(@it:0:0, @it2:0:0, @it:0:0 > 1 && @it2:0:0 > 0) && @index1.exists(@it:0:0, @it2:0:0, @it:0:0 > 1 && @it2:0:0 > 0)) -[BLOCK_RECURSION_DEPTH_4]: cel.@block([[1].exists(@it:0:0, @it2:0:0, @it:0:0 > 0 && @it2:0:0 > 0)], @index0 && @index0 && [1].exists(@it:0:0, @it2:0:0, @it:0:0 > 1 && @it2:0:0 > 0) && [2].exists(@it:0:0, @it2:0:0, @it:0:0 > 1 && @it2:0:0 > 0)) -[BLOCK_RECURSION_DEPTH_5]: cel.@block([[1].exists(@it:0:0, @it2:0:0, @it:0:0 > 0 && @it2:0:0 > 0)], @index0 && @index0 && [1].exists(@it:0:0, @it2:0:0, @it:0:0 > 1 && @it2:0:0 > 0) && [2].exists(@it:0:0, @it2:0:0, @it:0:0 > 1 && @it2:0:0 > 0)) -[BLOCK_RECURSION_DEPTH_6]: cel.@block([[1].exists(@it:0:0, @it2:0:0, @it:0:0 > 0 && @it2:0:0 > 0)], @index0 && @index0 && [1].exists(@it:0:0, @it2:0:0, @it:0:0 > 1 && @it2:0:0 > 0) && [2].exists(@it:0:0, @it2:0:0, @it:0:0 > 1 && @it2:0:0 > 0)) -[BLOCK_RECURSION_DEPTH_7]: cel.@block([[1].exists(@it:0:0, @it2:0:0, @it:0:0 > 0 && @it2:0:0 > 0)], @index0 && @index0 && [1].exists(@it:0:0, @it2:0:0, @it:0:0 > 1 && @it2:0:0 > 0) && [2].exists(@it:0:0, @it2:0:0, @it:0:0 > 1 && @it2:0:0 > 0)) -[BLOCK_RECURSION_DEPTH_8]: cel.@block([[1].exists(@it:0:0, @it2:0:0, @it:0:0 > 0 && @it2:0:0 > 0)], @index0 && @index0 && [1].exists(@it:0:0, @it2:0:0, @it:0:0 > 1 && @it2:0:0 > 0) && [2].exists(@it:0:0, @it2:0:0, @it:0:0 > 1 && @it2:0:0 > 0)) -[BLOCK_RECURSION_DEPTH_9]: cel.@block([[1].exists(@it:0:0, @it2:0:0, @it:0:0 > 0 && @it2:0:0 > 0)], @index0 && @index0 && [1].exists(@it:0:0, @it2:0:0, @it:0:0 > 1 && @it2:0:0 > 0) && [2].exists(@it:0:0, @it2:0:0, @it:0:0 > 1 && @it2:0:0 > 0)) +Unparsed: cel.@block([[1].exists(@it:0:0, @it2:0:0, @it:0:0 > 0 && @it2:0:0 > 0)], @index0 && @index0 && [1].exists(@it:0:0, @it2:0:0, @it:0:0 > 1 && @it2:0:0 > 0) && [2].exists(@it:0:0, @it2:0:0, @it:0:0 > 1 && @it2:0:0 > 0)) Test case: NESTED_MACROS Source: [1,2,3].map(i, [1, 2, 3].map(i, i + 1)) == [[2, 3, 4], [2, 3, 4], [2, 3, 4]] =====> Result: true -[BLOCK_COMMON_SUBEXPR_ONLY]: cel.@block([[1, 2, 3], [2, 3, 4]], @index0.map(@it:1:0, @index0.map(@it:0:0, @it:0:0 + 1)) == [@index1, @index1, @index1]) -[BLOCK_RECURSION_DEPTH_1]: cel.@block([[1, 2, 3], [2, 3, 4], [@index1, @index1, @index1]], @index0.map(@it:1:0, @index0.map(@it:0:0, @it:0:0 + 1)) == @index2) -[BLOCK_RECURSION_DEPTH_2]: cel.@block([[1, 2, 3], [2, 3, 4], [@index1, @index1, @index1]], @index0.map(@it:1:0, @index0.map(@it:0:0, @it:0:0 + 1)) == @index2) -[BLOCK_RECURSION_DEPTH_3]: cel.@block([[1, 2, 3], [2, 3, 4], [@index1, @index1, @index1]], @index0.map(@it:1:0, @index0.map(@it:0:0, @it:0:0 + 1)) == @index2) -[BLOCK_RECURSION_DEPTH_4]: cel.@block([[1, 2, 3], [2, 3, 4], @index0.map(@it:0:0, @it:0:0 + 1)], @index0.map(@it:1:0, @index2) == [@index1, @index1, @index1]) -[BLOCK_RECURSION_DEPTH_5]: cel.@block([[1, 2, 3], [2, 3, 4], @index0.map(@it:0:0, @it:0:0 + 1)], @index0.map(@it:1:0, @index2) == [@index1, @index1, @index1]) -[BLOCK_RECURSION_DEPTH_6]: cel.@block([[1, 2, 3], [2, 3, 4], @index0.map(@it:0:0, @it:0:0 + 1)], @index0.map(@it:1:0, @index2) == [@index1, @index1, @index1]) -[BLOCK_RECURSION_DEPTH_7]: cel.@block([[1, 2, 3], [2, 3, 4]], @index0.map(@it:1:0, @index0.map(@it:0:0, @it:0:0 + 1)) == [@index1, @index1, @index1]) -[BLOCK_RECURSION_DEPTH_8]: cel.@block([[1, 2, 3], [2, 3, 4]], @index0.map(@it:1:0, @index0.map(@it:0:0, @it:0:0 + 1)) == [@index1, @index1, @index1]) -[BLOCK_RECURSION_DEPTH_9]: cel.@block([[1, 2, 3], [2, 3, 4]], @index0.map(@it:1:0, @index0.map(@it:0:0, @it:0:0 + 1)) == [@index1, @index1, @index1]) +Unparsed: cel.@block([[1, 2, 3], [2, 3, 4]], @index0.map(@it:1:0, @index0.map(@it:0:0, @it:0:0 + 1)) == [@index1, @index1, @index1]) Test case: NESTED_MACROS_2 Source: [1, 2].map(y, [1, 2, 3].filter(x, x == y)) == [[1], [2]] =====> Result: true -[BLOCK_COMMON_SUBEXPR_ONLY]: [1, 2].map(y, [1, 2, 3].filter(x, x == y)) == [[1], [2]] -[BLOCK_RECURSION_DEPTH_1]: cel.@block([[1, 2], [1, 2, 3], [1], [2], [@index2, @index3]], @index0.map(@it:1:0, @index1.filter(@it:0:0, @it:0:0 == @it:1:0)) == @index4) -[BLOCK_RECURSION_DEPTH_2]: cel.@block([[[1], [2]], [1, 2], [1, 2, 3]], @index1.map(@it:1:0, @index2.filter(@it:0:0, @it:0:0 == @it:1:0)) == @index0) -[BLOCK_RECURSION_DEPTH_3]: cel.@block([[[1], [2]], [1, 2], [1, 2, 3]], @index1.map(@it:1:0, @index2.filter(@it:0:0, @it:0:0 == @it:1:0)) == @index0) -[BLOCK_RECURSION_DEPTH_4]: cel.@block([[[1], [2]], [1, 2], [1, 2, 3]], @index1.map(@it:1:0, @index2.filter(@it:0:0, @it:0:0 == @it:1:0)) == @index0) -[BLOCK_RECURSION_DEPTH_5]: cel.@block([[[1], [2]], [1, 2], [1, 2, 3]], @index1.map(@it:1:0, @index2.filter(@it:0:0, @it:0:0 == @it:1:0)) == @index0) -[BLOCK_RECURSION_DEPTH_6]: cel.@block([[[1], [2]], [1, 2], [1, 2, 3]], @index1.map(@it:1:0, @index2.filter(@it:0:0, @it:0:0 == @it:1:0)) == @index0) -[BLOCK_RECURSION_DEPTH_7]: [1, 2].map(y, [1, 2, 3].filter(x, x == y)) == [[1], [2]] -[BLOCK_RECURSION_DEPTH_8]: [1, 2].map(y, [1, 2, 3].filter(x, x == y)) == [[1], [2]] -[BLOCK_RECURSION_DEPTH_9]: [1, 2].map(y, [1, 2, 3].filter(x, x == y)) == [[1], [2]] +Unparsed: [1, 2].map(y, [1, 2, 3].filter(x, x == y)) == [[1], [2]] Test case: NESTED_MACROS_3 Source: [1,2,3].map(i, i * 2) + [1,2,3].map(i, i * 2).map(i, i * 2) =====> Result: [2, 4, 6, 4, 8, 12] -[BLOCK_COMMON_SUBEXPR_ONLY]: cel.@block([[1, 2, 3].map(@it:0:0, @it:0:0 * 2)], @index0 + @index0.map(@it:1:0, @it:1:0 * 2)) -[BLOCK_RECURSION_DEPTH_1]: cel.@block([[1, 2, 3]], @index0.map(@it:0:0, @it:0:0 * 2) + @index0.map(@it:0:0, @it:0:0 * 2).map(@it:1:0, @it:1:0 * 2)) -[BLOCK_RECURSION_DEPTH_2]: cel.@block([[1, 2, 3]], @index0.map(@it:0:0, @it:0:0 * 2) + @index0.map(@it:0:0, @it:0:0 * 2).map(@it:1:0, @it:1:0 * 2)) -[BLOCK_RECURSION_DEPTH_3]: cel.@block([[1, 2, 3]], @index0.map(@it:0:0, @it:0:0 * 2) + @index0.map(@it:0:0, @it:0:0 * 2).map(@it:1:0, @it:1:0 * 2)) -[BLOCK_RECURSION_DEPTH_4]: cel.@block([[1, 2, 3].map(@it:0:0, @it:0:0 * 2)], @index0 + @index0.map(@it:1:0, @it:1:0 * 2)) -[BLOCK_RECURSION_DEPTH_5]: cel.@block([[1, 2, 3].map(@it:0:0, @it:0:0 * 2)], @index0 + @index0.map(@it:1:0, @it:1:0 * 2)) -[BLOCK_RECURSION_DEPTH_6]: cel.@block([[1, 2, 3].map(@it:0:0, @it:0:0 * 2)], @index0 + @index0.map(@it:1:0, @it:1:0 * 2)) -[BLOCK_RECURSION_DEPTH_7]: cel.@block([[1, 2, 3].map(@it:0:0, @it:0:0 * 2)], @index0 + @index0.map(@it:1:0, @it:1:0 * 2)) -[BLOCK_RECURSION_DEPTH_8]: cel.@block([[1, 2, 3].map(@it:0:0, @it:0:0 * 2)], @index0 + @index0.map(@it:1:0, @it:1:0 * 2)) -[BLOCK_RECURSION_DEPTH_9]: cel.@block([[1, 2, 3].map(@it:0:0, @it:0:0 * 2)], @index0 + @index0.map(@it:1:0, @it:1:0 * 2)) +Unparsed: cel.@block([[1, 2, 3].map(@it:0:0, @it:0:0 * 2)], @index0 + @index0.map(@it:1:0, @it:1:0 * 2)) Test case: NESTED_MACROS_COMP_V2_1 Source: [1,2,3].transformList(i, v, [1, 2, 3].transformList(i, v, i + v + 1)) == [[2, 4, 6], [2, 4, 6], [2, 4, 6]] =====> Result: true -[BLOCK_COMMON_SUBEXPR_ONLY]: cel.@block([[1, 2, 3], [2, 4, 6]], @index0.transformList(@it:1:0, @it2:1:0, @index0.transformList(@it:0:0, @it2:0:0, @it:0:0 + @it2:0:0 + 1)) == [@index1, @index1, @index1]) -[BLOCK_RECURSION_DEPTH_1]: cel.@block([[1, 2, 3], [2, 4, 6], [@index1, @index1, @index1]], @index0.transformList(@it:1:0, @it2:1:0, @index0.transformList(@it:0:0, @it2:0:0, @it:0:0 + @it2:0:0 + 1)) == @index2) -[BLOCK_RECURSION_DEPTH_2]: cel.@block([[1, 2, 3], [2, 4, 6], [@index1, @index1, @index1]], @index0.transformList(@it:1:0, @it2:1:0, @index0.transformList(@it:0:0, @it2:0:0, @it:0:0 + @it2:0:0 + 1)) == @index2) -[BLOCK_RECURSION_DEPTH_3]: cel.@block([[1, 2, 3], [2, 4, 6], [@index1, @index1, @index1]], @index0.transformList(@it:1:0, @it2:1:0, @index0.transformList(@it:0:0, @it2:0:0, @it:0:0 + @it2:0:0 + 1)) == @index2) -[BLOCK_RECURSION_DEPTH_4]: cel.@block([[1, 2, 3], [2, 4, 6], [@index1, @index1, @index1]], @index0.transformList(@it:1:0, @it2:1:0, @index0.transformList(@it:0:0, @it2:0:0, @it:0:0 + @it2:0:0 + 1)) == @index2) -[BLOCK_RECURSION_DEPTH_5]: cel.@block([[1, 2, 3], [2, 4, 6], @index0.transformList(@it:0:0, @it2:0:0, @it:0:0 + @it2:0:0 + 1)], @index0.transformList(@it:1:0, @it2:1:0, @index2) == [@index1, @index1, @index1]) -[BLOCK_RECURSION_DEPTH_6]: cel.@block([[1, 2, 3], [2, 4, 6], @index0.transformList(@it:0:0, @it2:0:0, @it:0:0 + @it2:0:0 + 1)], @index0.transformList(@it:1:0, @it2:1:0, @index2) == [@index1, @index1, @index1]) -[BLOCK_RECURSION_DEPTH_7]: cel.@block([[1, 2, 3], [2, 4, 6], @index0.transformList(@it:0:0, @it2:0:0, @it:0:0 + @it2:0:0 + 1)], @index0.transformList(@it:1:0, @it2:1:0, @index2) == [@index1, @index1, @index1]) -[BLOCK_RECURSION_DEPTH_8]: cel.@block([[1, 2, 3], [2, 4, 6]], @index0.transformList(@it:1:0, @it2:1:0, @index0.transformList(@it:0:0, @it2:0:0, @it:0:0 + @it2:0:0 + 1)) == [@index1, @index1, @index1]) -[BLOCK_RECURSION_DEPTH_9]: cel.@block([[1, 2, 3], [2, 4, 6]], @index0.transformList(@it:1:0, @it2:1:0, @index0.transformList(@it:0:0, @it2:0:0, @it:0:0 + @it2:0:0 + 1)) == [@index1, @index1, @index1]) +Unparsed: cel.@block([[1, 2, 3], [2, 4, 6]], @index0.transformList(@it:1:0, @it2:1:0, @index0.transformList(@it:0:0, @it2:0:0, @it:0:0 + @it2:0:0 + 1)) == [@index1, @index1, @index1]) Test case: NESTED_MACROS_COMP_V2_2 Source: [1, 2].transformList(i, y, [1, 2, 3].filter(x, x == y && i < y)) == [[1], [2]] =====> Result: true -[BLOCK_COMMON_SUBEXPR_ONLY]: [1, 2].transformList(i, y, [1, 2, 3].filter(x, x == y && i < y)) == [[1], [2]] -[BLOCK_RECURSION_DEPTH_1]: cel.@block([[1, 2], [1, 2, 3], [1], [2], [@index2, @index3]], @index0.transformList(@it:1:0, @it2:1:0, @index1.filter(@it:0:0, @it:0:0 == @it2:1:0 && @it:1:0 < @it2:1:0)) == @index4) -[BLOCK_RECURSION_DEPTH_2]: cel.@block([[[1], [2]], [1, 2], [1, 2, 3]], @index1.transformList(@it:1:0, @it2:1:0, @index2.filter(@it:0:0, @it:0:0 == @it2:1:0 && @it:1:0 < @it2:1:0)) == @index0) -[BLOCK_RECURSION_DEPTH_3]: cel.@block([[[1], [2]], [1, 2], [1, 2, 3]], @index1.transformList(@it:1:0, @it2:1:0, @index2.filter(@it:0:0, @it:0:0 == @it2:1:0 && @it:1:0 < @it2:1:0)) == @index0) -[BLOCK_RECURSION_DEPTH_4]: cel.@block([[[1], [2]], [1, 2], [1, 2, 3]], @index1.transformList(@it:1:0, @it2:1:0, @index2.filter(@it:0:0, @it:0:0 == @it2:1:0 && @it:1:0 < @it2:1:0)) == @index0) -[BLOCK_RECURSION_DEPTH_5]: cel.@block([[[1], [2]], [1, 2], [1, 2, 3]], @index1.transformList(@it:1:0, @it2:1:0, @index2.filter(@it:0:0, @it:0:0 == @it2:1:0 && @it:1:0 < @it2:1:0)) == @index0) -[BLOCK_RECURSION_DEPTH_6]: cel.@block([[[1], [2]], [1, 2], [1, 2, 3]], @index1.transformList(@it:1:0, @it2:1:0, @index2.filter(@it:0:0, @it:0:0 == @it2:1:0 && @it:1:0 < @it2:1:0)) == @index0) -[BLOCK_RECURSION_DEPTH_7]: [1, 2].transformList(i, y, [1, 2, 3].filter(x, x == y && i < y)) == [[1], [2]] -[BLOCK_RECURSION_DEPTH_8]: [1, 2].transformList(i, y, [1, 2, 3].filter(x, x == y && i < y)) == [[1], [2]] -[BLOCK_RECURSION_DEPTH_9]: [1, 2].transformList(i, y, [1, 2, 3].filter(x, x == y && i < y)) == [[1], [2]] +Unparsed: [1, 2].transformList(i, y, [1, 2, 3].filter(x, x == y && i < y)) == [[1], [2]] Test case: ADJACENT_NESTED_MACROS Source: [1,2,3].map(i, [1, 2, 3].map(i, i + 1)) == [1,2,3].map(j, [1, 2, 3].map(j, j + 1)) =====> Result: true -[BLOCK_COMMON_SUBEXPR_ONLY]: cel.@block([[1, 2, 3], @index0.map(@it:1:0, @index0.map(@it:0:0, @it:0:0 + 1))], @index1 == @index1) -[BLOCK_RECURSION_DEPTH_1]: cel.@block([[1, 2, 3]], @index0.map(@it:1:0, @index0.map(@it:0:0, @it:0:0 + 1)) == @index0.map(@it:1:0, @index0.map(@it:0:0, @it:0:0 + 1))) -[BLOCK_RECURSION_DEPTH_2]: cel.@block([[1, 2, 3]], @index0.map(@it:1:0, @index0.map(@it:0:0, @it:0:0 + 1)) == @index0.map(@it:1:0, @index0.map(@it:0:0, @it:0:0 + 1))) -[BLOCK_RECURSION_DEPTH_3]: cel.@block([[1, 2, 3]], @index0.map(@it:1:0, @index0.map(@it:0:0, @it:0:0 + 1)) == @index0.map(@it:1:0, @index0.map(@it:0:0, @it:0:0 + 1))) -[BLOCK_RECURSION_DEPTH_4]: cel.@block([[1, 2, 3].map(@it:0:0, @it:0:0 + 1), [1, 2, 3].map(@it:1:0, @index0)], @index1 == @index1) -[BLOCK_RECURSION_DEPTH_5]: cel.@block([[1, 2, 3].map(@it:0:0, @it:0:0 + 1), [1, 2, 3].map(@it:1:0, @index0)], @index1 == @index1) -[BLOCK_RECURSION_DEPTH_6]: cel.@block([[1, 2, 3].map(@it:0:0, @it:0:0 + 1), [1, 2, 3].map(@it:1:0, @index0)], @index1 == @index1) -[BLOCK_RECURSION_DEPTH_7]: cel.@block([[1, 2, 3].map(@it:1:0, [1, 2, 3].map(@it:0:0, @it:0:0 + 1))], @index0 == @index0) -[BLOCK_RECURSION_DEPTH_8]: cel.@block([[1, 2, 3].map(@it:1:0, [1, 2, 3].map(@it:0:0, @it:0:0 + 1))], @index0 == @index0) -[BLOCK_RECURSION_DEPTH_9]: cel.@block([[1, 2, 3].map(@it:1:0, [1, 2, 3].map(@it:0:0, @it:0:0 + 1))], @index0 == @index0) +Unparsed: cel.@block([[1, 2, 3], @index0.map(@it:1:0, @index0.map(@it:0:0, @it:0:0 + 1))], @index1 == @index1) Test case: ADJACENT_NESTED_MACROS_COMP_V2 Source: [1,2,3].transformMap(i, x, [1, 2, 3].transformMap(i, x, i + x + 1)) == [1,2,3].transformMap(j, y, [1, 2, 3].transformMap(j, y, j + y + 1)) =====> Result: true -[BLOCK_COMMON_SUBEXPR_ONLY]: cel.@block([[1, 2, 3], @index0.transformMap(@it:1:0, @it2:1:0, @index0.transformMap(@it:0:0, @it2:0:0, @it:0:0 + @it2:0:0 + 1))], @index1 == @index1) -[BLOCK_RECURSION_DEPTH_1]: cel.@block([[1, 2, 3]], @index0.transformMap(@it:1:0, @it2:1:0, @index0.transformMap(@it:0:0, @it2:0:0, @it:0:0 + @it2:0:0 + 1)) == @index0.transformMap(@it:1:0, @it2:1:0, @index0.transformMap(@it:0:0, @it2:0:0, @it:0:0 + @it2:0:0 + 1))) -[BLOCK_RECURSION_DEPTH_2]: cel.@block([[1, 2, 3]], @index0.transformMap(@it:1:0, @it2:1:0, @index0.transformMap(@it:0:0, @it2:0:0, @it:0:0 + @it2:0:0 + 1)) == @index0.transformMap(@it:1:0, @it2:1:0, @index0.transformMap(@it:0:0, @it2:0:0, @it:0:0 + @it2:0:0 + 1))) -[BLOCK_RECURSION_DEPTH_3]: cel.@block([[1, 2, 3]], @index0.transformMap(@it:1:0, @it2:1:0, @index0.transformMap(@it:0:0, @it2:0:0, @it:0:0 + @it2:0:0 + 1)) == @index0.transformMap(@it:1:0, @it2:1:0, @index0.transformMap(@it:0:0, @it2:0:0, @it:0:0 + @it2:0:0 + 1))) -[BLOCK_RECURSION_DEPTH_4]: cel.@block([[1, 2, 3].transformMap(@it:0:0, @it2:0:0, @it:0:0 + @it2:0:0 + 1), [1, 2, 3].transformMap(@it:1:0, @it2:1:0, @index0)], @index1 == @index1) -[BLOCK_RECURSION_DEPTH_5]: cel.@block([[1, 2, 3].transformMap(@it:0:0, @it2:0:0, @it:0:0 + @it2:0:0 + 1), [1, 2, 3].transformMap(@it:1:0, @it2:1:0, @index0)], @index1 == @index1) -[BLOCK_RECURSION_DEPTH_6]: cel.@block([[1, 2, 3].transformMap(@it:1:0, @it2:1:0, [1, 2, 3].transformMap(@it:0:0, @it2:0:0, @it:0:0 + @it2:0:0 + 1))], @index0 == @index0) -[BLOCK_RECURSION_DEPTH_7]: cel.@block([[1, 2, 3].transformMap(@it:1:0, @it2:1:0, [1, 2, 3].transformMap(@it:0:0, @it2:0:0, @it:0:0 + @it2:0:0 + 1))], @index0 == @index0) -[BLOCK_RECURSION_DEPTH_8]: cel.@block([[1, 2, 3].transformMap(@it:1:0, @it2:1:0, [1, 2, 3].transformMap(@it:0:0, @it2:0:0, @it:0:0 + @it2:0:0 + 1))], @index0 == @index0) -[BLOCK_RECURSION_DEPTH_9]: cel.@block([[1, 2, 3].transformMap(@it:1:0, @it2:1:0, [1, 2, 3].transformMap(@it:0:0, @it2:0:0, @it:0:0 + @it2:0:0 + 1))], @index0 == @index0) +Unparsed: cel.@block([[1, 2, 3], @index0.transformMap(@it:1:0, @it2:1:0, @index0.transformMap(@it:0:0, @it2:0:0, @it:0:0 + @it2:0:0 + 1))], @index1 == @index1) Test case: INCLUSION_LIST Source: 1 in [1,2,3] && 2 in [1,2,3] && 3 in [3, [1,2,3]] && 1 in [1,2,3] =====> Result: true -[BLOCK_COMMON_SUBEXPR_ONLY]: cel.@block([[1, 2, 3], 1 in @index0], @index1 && 2 in @index0 && 3 in [3, @index0] && @index1) -[BLOCK_RECURSION_DEPTH_1]: cel.@block([[1, 2, 3], 1 in @index0, 2 in @index0, @index1 && @index2, [3, @index0], 3 in @index4, @index5 && @index1], @index3 && @index6) -[BLOCK_RECURSION_DEPTH_2]: cel.@block([1 in [1, 2, 3], [1, 2, 3], @index0 && 2 in @index1, 3 in [3, @index1]], @index2 && @index3 && @index0) -[BLOCK_RECURSION_DEPTH_3]: cel.@block([1 in [1, 2, 3], [1, 2, 3], 3 in [3, @index1] && @index0], @index0 && 2 in @index1 && @index2) -[BLOCK_RECURSION_DEPTH_4]: cel.@block([1 in [1, 2, 3], [1, 2, 3]], @index0 && 2 in @index1 && 3 in [3, @index1] && @index0) -[BLOCK_RECURSION_DEPTH_5]: cel.@block([1 in [1, 2, 3], [1, 2, 3]], @index0 && 2 in @index1 && 3 in [3, @index1] && @index0) -[BLOCK_RECURSION_DEPTH_6]: cel.@block([1 in [1, 2, 3], [1, 2, 3]], @index0 && 2 in @index1 && 3 in [3, @index1] && @index0) -[BLOCK_RECURSION_DEPTH_7]: cel.@block([1 in [1, 2, 3], [1, 2, 3]], @index0 && 2 in @index1 && 3 in [3, @index1] && @index0) -[BLOCK_RECURSION_DEPTH_8]: cel.@block([1 in [1, 2, 3], [1, 2, 3]], @index0 && 2 in @index1 && 3 in [3, @index1] && @index0) -[BLOCK_RECURSION_DEPTH_9]: cel.@block([1 in [1, 2, 3], [1, 2, 3]], @index0 && 2 in @index1 && 3 in [3, @index1] && @index0) +Unparsed: cel.@block([[1, 2, 3], 1 in @index0], @index1 && 2 in @index0 && 3 in [3, @index0] && @index1) Test case: INCLUSION_MAP Source: 2 in {'a': 1, 2: {true: false}, 3: {true: false}} =====> Result: true -[BLOCK_COMMON_SUBEXPR_ONLY]: cel.@block([{true: false}], 2 in {"a": 1, 2: @index0, 3: @index0}) -[BLOCK_RECURSION_DEPTH_1]: cel.@block([{true: false}, {"a": 1, 2: @index0, 3: @index0}], 2 in @index1) -[BLOCK_RECURSION_DEPTH_2]: cel.@block([{true: false}], 2 in {"a": 1, 2: @index0, 3: @index0}) -[BLOCK_RECURSION_DEPTH_3]: cel.@block([{true: false}], 2 in {"a": 1, 2: @index0, 3: @index0}) -[BLOCK_RECURSION_DEPTH_4]: cel.@block([{true: false}], 2 in {"a": 1, 2: @index0, 3: @index0}) -[BLOCK_RECURSION_DEPTH_5]: cel.@block([{true: false}], 2 in {"a": 1, 2: @index0, 3: @index0}) -[BLOCK_RECURSION_DEPTH_6]: cel.@block([{true: false}], 2 in {"a": 1, 2: @index0, 3: @index0}) -[BLOCK_RECURSION_DEPTH_7]: cel.@block([{true: false}], 2 in {"a": 1, 2: @index0, 3: @index0}) -[BLOCK_RECURSION_DEPTH_8]: cel.@block([{true: false}], 2 in {"a": 1, 2: @index0, 3: @index0}) -[BLOCK_RECURSION_DEPTH_9]: cel.@block([{true: false}], 2 in {"a": 1, 2: @index0, 3: @index0}) +Unparsed: cel.@block([{true: false}], 2 in {"a": 1, 2: @index0, 3: @index0}) Test case: MACRO_ITER_VAR_NOT_REFERENCED Source: [1,2].map(i, [1, 2].map(i, [3,4])) == [[[3, 4], [3, 4]], [[3, 4], [3, 4]]] =====> Result: true -[BLOCK_COMMON_SUBEXPR_ONLY]: cel.@block([[1, 2], [3, 4], [@index1, @index1]], @index0.map(@it:1:0, @index0.map(@it:0:0, @index1)) == [@index2, @index2]) -[BLOCK_RECURSION_DEPTH_1]: cel.@block([[1, 2], [3, 4], [@index1, @index1], [@index1], [@index2, @index2]], @index0.map(@it:1:0, @index0.map(@it:0:0, @index1)) == @index4) -[BLOCK_RECURSION_DEPTH_2]: cel.@block([[[3, 4], [3, 4]], [1, 2], [[3, 4]], @index1.map(@it:0:0, [3, 4]), [@index3]], @index1.map(@it:1:0, @index3) == [@index0, @index0]) -[BLOCK_RECURSION_DEPTH_3]: cel.@block([[[3, 4], [3, 4]], [1, 2], [[3, 4]], @index1.map(@it:0:0, [3, 4])], @index1.map(@it:1:0, @index3) == [@index0, @index0]) -[BLOCK_RECURSION_DEPTH_4]: cel.@block([[[3, 4], [3, 4]], [1, 2], @index1.map(@it:0:0, [3, 4])], @index1.map(@it:1:0, @index2) == [@index0, @index0]) -[BLOCK_RECURSION_DEPTH_5]: cel.@block([[[3, 4], [3, 4]], [1, 2], @index1.map(@it:0:0, [3, 4])], @index1.map(@it:1:0, @index2) == [@index0, @index0]) -[BLOCK_RECURSION_DEPTH_6]: cel.@block([[[3, 4], [3, 4]], [1, 2], @index1.map(@it:0:0, [3, 4])], @index1.map(@it:1:0, @index2) == [@index0, @index0]) -[BLOCK_RECURSION_DEPTH_7]: cel.@block([[[3, 4], [3, 4]], [1, 2]], @index1.map(@it:1:0, @index1.map(@it:0:0, [3, 4])) == [@index0, @index0]) -[BLOCK_RECURSION_DEPTH_8]: cel.@block([[[3, 4], [3, 4]], [1, 2]], @index1.map(@it:1:0, @index1.map(@it:0:0, [3, 4])) == [@index0, @index0]) -[BLOCK_RECURSION_DEPTH_9]: cel.@block([[[3, 4], [3, 4]], [1, 2]], @index1.map(@it:1:0, @index1.map(@it:0:0, [3, 4])) == [@index0, @index0]) +Unparsed: cel.@block([[1, 2], [3, 4], [@index1, @index1]], @index0.map(@it:1:0, @index0.map(@it:0:0, @index1)) == [@index2, @index2]) Test case: MACRO_ITER_VAR2_NOT_REFERENCED Source: [1,2].transformList(i, v, [1, 2].transformList(i, v, [3,4])) == [[[3, 4], [3, 4]], [[3, 4], [3, 4]]] =====> Result: true -[BLOCK_COMMON_SUBEXPR_ONLY]: cel.@block([[1, 2], [3, 4], [@index1, @index1]], @index0.transformList(@it:1:0, @it2:1:0, @index0.transformList(@it:0:0, @it2:0:0, @index1)) == [@index2, @index2]) -[BLOCK_RECURSION_DEPTH_1]: cel.@block([[1, 2], [3, 4], [@index1, @index1], [@index1], [@index2, @index2]], @index0.transformList(@it:1:0, @it2:1:0, @index0.transformList(@it:0:0, @it2:0:0, @index1)) == @index4) -[BLOCK_RECURSION_DEPTH_2]: cel.@block([[[3, 4], [3, 4]], [1, 2], [[3, 4]], @index1.transformList(@it:0:0, @it2:0:0, [3, 4]), [@index3]], @index1.transformList(@it:1:0, @it2:1:0, @index3) == [@index0, @index0]) -[BLOCK_RECURSION_DEPTH_3]: cel.@block([[[3, 4], [3, 4]], [1, 2], [[3, 4]], @index1.transformList(@it:0:0, @it2:0:0, [3, 4])], @index1.transformList(@it:1:0, @it2:1:0, @index3) == [@index0, @index0]) -[BLOCK_RECURSION_DEPTH_4]: cel.@block([[[3, 4], [3, 4]], [1, 2], @index1.transformList(@it:0:0, @it2:0:0, [3, 4])], @index1.transformList(@it:1:0, @it2:1:0, @index2) == [@index0, @index0]) -[BLOCK_RECURSION_DEPTH_5]: cel.@block([[[3, 4], [3, 4]], [1, 2], @index1.transformList(@it:0:0, @it2:0:0, [3, 4])], @index1.transformList(@it:1:0, @it2:1:0, @index2) == [@index0, @index0]) -[BLOCK_RECURSION_DEPTH_6]: cel.@block([[[3, 4], [3, 4]], [1, 2], @index1.transformList(@it:0:0, @it2:0:0, [3, 4])], @index1.transformList(@it:1:0, @it2:1:0, @index2) == [@index0, @index0]) -[BLOCK_RECURSION_DEPTH_7]: cel.@block([[[3, 4], [3, 4]], [1, 2]], @index1.transformList(@it:1:0, @it2:1:0, @index1.transformList(@it:0:0, @it2:0:0, [3, 4])) == [@index0, @index0]) -[BLOCK_RECURSION_DEPTH_8]: cel.@block([[[3, 4], [3, 4]], [1, 2]], @index1.transformList(@it:1:0, @it2:1:0, @index1.transformList(@it:0:0, @it2:0:0, [3, 4])) == [@index0, @index0]) -[BLOCK_RECURSION_DEPTH_9]: cel.@block([[[3, 4], [3, 4]], [1, 2]], @index1.transformList(@it:1:0, @it2:1:0, @index1.transformList(@it:0:0, @it2:0:0, [3, 4])) == [@index0, @index0]) +Unparsed: cel.@block([[1, 2], [3, 4], [@index1, @index1]], @index0.transformList(@it:1:0, @it2:1:0, @index0.transformList(@it:0:0, @it2:0:0, @index1)) == [@index2, @index2]) Test case: MACRO_SHADOWED_VARIABLE Source: [x - 1 > 3 ? x - 1 : 5].exists(x, x - 1 > 3) || x - 1 > 3 =====> Result: true -[BLOCK_COMMON_SUBEXPR_ONLY]: cel.@block([x - 1, @index0 > 3], [@index1 ? @index0 : 5].exists(@it:0:0, @it:0:0 - 1 > 3) || @index1) -[BLOCK_RECURSION_DEPTH_1]: cel.@block([x - 1, @index0 > 3, @index1 ? @index0 : 5, [@index2]], @index3.exists(@it:0:0, @it:0:0 - 1 > 3) || @index1) -[BLOCK_RECURSION_DEPTH_2]: cel.@block([x - 1 > 3, @index0 ? (x - 1) : 5, [@index1]], @index2.exists(@it:0:0, @it:0:0 - 1 > 3) || @index0) -[BLOCK_RECURSION_DEPTH_3]: cel.@block([x - 1 > 3, [@index0 ? (x - 1) : 5]], @index1.exists(@it:0:0, @it:0:0 - 1 > 3) || @index0) -[BLOCK_RECURSION_DEPTH_4]: cel.@block([x - 1 > 3], [@index0 ? (x - 1) : 5].exists(@it:0:0, @it:0:0 - 1 > 3) || @index0) -[BLOCK_RECURSION_DEPTH_5]: cel.@block([x - 1 > 3], [@index0 ? (x - 1) : 5].exists(@it:0:0, @it:0:0 - 1 > 3) || @index0) -[BLOCK_RECURSION_DEPTH_6]: cel.@block([x - 1 > 3], [@index0 ? (x - 1) : 5].exists(@it:0:0, @it:0:0 - 1 > 3) || @index0) -[BLOCK_RECURSION_DEPTH_7]: cel.@block([x - 1 > 3], [@index0 ? (x - 1) : 5].exists(@it:0:0, @it:0:0 - 1 > 3) || @index0) -[BLOCK_RECURSION_DEPTH_8]: cel.@block([x - 1 > 3], [@index0 ? (x - 1) : 5].exists(@it:0:0, @it:0:0 - 1 > 3) || @index0) -[BLOCK_RECURSION_DEPTH_9]: cel.@block([x - 1 > 3], [@index0 ? (x - 1) : 5].exists(@it:0:0, @it:0:0 - 1 > 3) || @index0) +Unparsed: cel.@block([x - 1, @index0 > 3], [@index1 ? @index0 : 5].exists(@it:0:0, @it:0:0 - 1 > 3) || @index1) Test case: MACRO_SHADOWED_VARIABLE_2 Source: ["foo", "bar"].map(x, [x + x, x + x]).map(x, [x + x, x + x]) =====> Result: [[[foofoo, foofoo, foofoo, foofoo], [foofoo, foofoo, foofoo, foofoo]], [[barbar, barbar, barbar, barbar], [barbar, barbar, barbar, barbar]]] -[BLOCK_COMMON_SUBEXPR_ONLY]: ["foo", "bar"].map(x, [x + x, x + x]).map(x, [x + x, x + x]) -[BLOCK_RECURSION_DEPTH_1]: cel.@block([["foo", "bar"]], @index0.map(@it:0:0, [@it:0:0 + @it:0:0, @it:0:0 + @it:0:0]).map(@it:1:0, [@it:1:0 + @it:1:0, @it:1:0 + @it:1:0])) -[BLOCK_RECURSION_DEPTH_2]: cel.@block([["foo", "bar"]], @index0.map(@it:0:0, [@it:0:0 + @it:0:0, @it:0:0 + @it:0:0]).map(@it:1:0, [@it:1:0 + @it:1:0, @it:1:0 + @it:1:0])) -[BLOCK_RECURSION_DEPTH_3]: cel.@block([["foo", "bar"]], @index0.map(@it:0:0, [@it:0:0 + @it:0:0, @it:0:0 + @it:0:0]).map(@it:1:0, [@it:1:0 + @it:1:0, @it:1:0 + @it:1:0])) -[BLOCK_RECURSION_DEPTH_4]: cel.@block([["foo", "bar"]], @index0.map(@it:0:0, [@it:0:0 + @it:0:0, @it:0:0 + @it:0:0]).map(@it:1:0, [@it:1:0 + @it:1:0, @it:1:0 + @it:1:0])) -[BLOCK_RECURSION_DEPTH_5]: cel.@block([["foo", "bar"].map(@it:0:0, [@it:0:0 + @it:0:0, @it:0:0 + @it:0:0])], @index0.map(@it:1:0, [@it:1:0 + @it:1:0, @it:1:0 + @it:1:0])) -[BLOCK_RECURSION_DEPTH_6]: ["foo", "bar"].map(x, [x + x, x + x]).map(x, [x + x, x + x]) -[BLOCK_RECURSION_DEPTH_7]: ["foo", "bar"].map(x, [x + x, x + x]).map(x, [x + x, x + x]) -[BLOCK_RECURSION_DEPTH_8]: ["foo", "bar"].map(x, [x + x, x + x]).map(x, [x + x, x + x]) -[BLOCK_RECURSION_DEPTH_9]: ["foo", "bar"].map(x, [x + x, x + x]).map(x, [x + x, x + x]) +Unparsed: ["foo", "bar"].map(x, [x + x, x + x]).map(x, [x + x, x + x]) Test case: MACRO_SHADOWED_VARIABLE_COMP_V2_1 Source: [x - y - 1 > 3 ? x - y - 1 : 5].exists(x, y, x - y - 1 > 3) || x - y - 1 > 3 =====> Result: false -[BLOCK_COMMON_SUBEXPR_ONLY]: cel.@block([x - y - 1, @index0 > 3], [@index1 ? @index0 : 5].exists(@it:0:0, @it2:0:0, @it:0:0 - @it2:0:0 - 1 > 3) || @index1) -[BLOCK_RECURSION_DEPTH_1]: cel.@block([x - y, @index0 - 1, @index1 > 3, @index2 ? @index1 : 5, [@index3]], @index4.exists(@it:0:0, @it2:0:0, @it:0:0 - @it2:0:0 - 1 > 3) || @index2) -[BLOCK_RECURSION_DEPTH_2]: cel.@block([x - y - 1, @index0 > 3, [@index1 ? @index0 : 5]], @index2.exists(@it:0:0, @it2:0:0, @it:0:0 - @it2:0:0 - 1 > 3) || @index1) -[BLOCK_RECURSION_DEPTH_3]: cel.@block([x - y - 1 > 3, @index0 ? (x - y - 1) : 5, [@index1]], @index2.exists(@it:0:0, @it2:0:0, @it:0:0 - @it2:0:0 - 1 > 3) || @index0) -[BLOCK_RECURSION_DEPTH_4]: cel.@block([x - y - 1 > 3, [@index0 ? (x - y - 1) : 5]], @index1.exists(@it:0:0, @it2:0:0, @it:0:0 - @it2:0:0 - 1 > 3) || @index0) -[BLOCK_RECURSION_DEPTH_5]: cel.@block([x - y - 1 > 3], [@index0 ? (x - y - 1) : 5].exists(@it:0:0, @it2:0:0, @it:0:0 - @it2:0:0 - 1 > 3) || @index0) -[BLOCK_RECURSION_DEPTH_6]: cel.@block([x - y - 1 > 3], [@index0 ? (x - y - 1) : 5].exists(@it:0:0, @it2:0:0, @it:0:0 - @it2:0:0 - 1 > 3) || @index0) -[BLOCK_RECURSION_DEPTH_7]: cel.@block([x - y - 1 > 3], [@index0 ? (x - y - 1) : 5].exists(@it:0:0, @it2:0:0, @it:0:0 - @it2:0:0 - 1 > 3) || @index0) -[BLOCK_RECURSION_DEPTH_8]: cel.@block([x - y - 1 > 3], [@index0 ? (x - y - 1) : 5].exists(@it:0:0, @it2:0:0, @it:0:0 - @it2:0:0 - 1 > 3) || @index0) -[BLOCK_RECURSION_DEPTH_9]: cel.@block([x - y - 1 > 3], [@index0 ? (x - y - 1) : 5].exists(@it:0:0, @it2:0:0, @it:0:0 - @it2:0:0 - 1 > 3) || @index0) +Unparsed: cel.@block([x - y - 1, @index0 > 3], [@index1 ? @index0 : 5].exists(@it:0:0, @it2:0:0, @it:0:0 - @it2:0:0 - 1 > 3) || @index1) Test case: MACRO_SHADOWED_VARIABLE_COMP_V2_2 Source: ["foo", "bar"].transformMap(x, y, [x + x, y + y]).transformMap(x, y, [x + x, y + y]) =====> Result: {0=[0, [0, foofoo, 0, foofoo]], 1=[2, [2, barbar, 2, barbar]]} -[BLOCK_COMMON_SUBEXPR_ONLY]: ["foo", "bar"].transformMap(x, y, [x + x, y + y]).transformMap(x, y, [x + x, y + y]) -[BLOCK_RECURSION_DEPTH_1]: cel.@block([["foo", "bar"]], @index0.transformMap(@it:0:0, @it2:0:0, [@it:0:0 + @it:0:0, @it2:0:0 + @it2:0:0]).transformMap(@it:1:0, @it2:1:0, [@it:1:0 + @it:1:0, @it2:1:0 + @it2:1:0])) -[BLOCK_RECURSION_DEPTH_2]: cel.@block([["foo", "bar"]], @index0.transformMap(@it:0:0, @it2:0:0, [@it:0:0 + @it:0:0, @it2:0:0 + @it2:0:0]).transformMap(@it:1:0, @it2:1:0, [@it:1:0 + @it:1:0, @it2:1:0 + @it2:1:0])) -[BLOCK_RECURSION_DEPTH_3]: cel.@block([["foo", "bar"]], @index0.transformMap(@it:0:0, @it2:0:0, [@it:0:0 + @it:0:0, @it2:0:0 + @it2:0:0]).transformMap(@it:1:0, @it2:1:0, [@it:1:0 + @it:1:0, @it2:1:0 + @it2:1:0])) -[BLOCK_RECURSION_DEPTH_4]: cel.@block([["foo", "bar"].transformMap(@it:0:0, @it2:0:0, [@it:0:0 + @it:0:0, @it2:0:0 + @it2:0:0])], @index0.transformMap(@it:1:0, @it2:1:0, [@it:1:0 + @it:1:0, @it2:1:0 + @it2:1:0])) -[BLOCK_RECURSION_DEPTH_5]: ["foo", "bar"].transformMap(x, y, [x + x, y + y]).transformMap(x, y, [x + x, y + y]) -[BLOCK_RECURSION_DEPTH_6]: ["foo", "bar"].transformMap(x, y, [x + x, y + y]).transformMap(x, y, [x + x, y + y]) -[BLOCK_RECURSION_DEPTH_7]: ["foo", "bar"].transformMap(x, y, [x + x, y + y]).transformMap(x, y, [x + x, y + y]) -[BLOCK_RECURSION_DEPTH_8]: ["foo", "bar"].transformMap(x, y, [x + x, y + y]).transformMap(x, y, [x + x, y + y]) -[BLOCK_RECURSION_DEPTH_9]: ["foo", "bar"].transformMap(x, y, [x + x, y + y]).transformMap(x, y, [x + x, y + y]) +Unparsed: ["foo", "bar"].transformMap(x, y, [x + x, y + y]).transformMap(x, y, [x + x, y + y]) Test case: PRESENCE_TEST Source: has({'a': true}.a) && {'a':true}['a'] =====> Result: true -[BLOCK_COMMON_SUBEXPR_ONLY]: cel.@block([{"a": true}], has(@index0.a) && @index0["a"]) -[BLOCK_RECURSION_DEPTH_1]: cel.@block([{"a": true}, has(@index0.a), @index0["a"]], @index1 && @index2) -[BLOCK_RECURSION_DEPTH_2]: cel.@block([{"a": true}], has(@index0.a) && @index0["a"]) -[BLOCK_RECURSION_DEPTH_3]: cel.@block([{"a": true}], has(@index0.a) && @index0["a"]) -[BLOCK_RECURSION_DEPTH_4]: cel.@block([{"a": true}], has(@index0.a) && @index0["a"]) -[BLOCK_RECURSION_DEPTH_5]: cel.@block([{"a": true}], has(@index0.a) && @index0["a"]) -[BLOCK_RECURSION_DEPTH_6]: cel.@block([{"a": true}], has(@index0.a) && @index0["a"]) -[BLOCK_RECURSION_DEPTH_7]: cel.@block([{"a": true}], has(@index0.a) && @index0["a"]) -[BLOCK_RECURSION_DEPTH_8]: cel.@block([{"a": true}], has(@index0.a) && @index0["a"]) -[BLOCK_RECURSION_DEPTH_9]: cel.@block([{"a": true}], has(@index0.a) && @index0["a"]) +Unparsed: cel.@block([{"a": true}], has(@index0.a) && @index0["a"]) Test case: PRESENCE_TEST_2 Source: has({'a': true}.a) && has({'a': true}.a) =====> Result: true -[BLOCK_COMMON_SUBEXPR_ONLY]: cel.@block([has({"a": true}.a)], @index0 && @index0) -[BLOCK_RECURSION_DEPTH_1]: cel.@block([{"a": true}, has(@index0.a)], @index1 && @index1) -[BLOCK_RECURSION_DEPTH_2]: cel.@block([has({"a": true}.a)], @index0 && @index0) -[BLOCK_RECURSION_DEPTH_3]: cel.@block([has({"a": true}.a)], @index0 && @index0) -[BLOCK_RECURSION_DEPTH_4]: cel.@block([has({"a": true}.a)], @index0 && @index0) -[BLOCK_RECURSION_DEPTH_5]: cel.@block([has({"a": true}.a)], @index0 && @index0) -[BLOCK_RECURSION_DEPTH_6]: cel.@block([has({"a": true}.a)], @index0 && @index0) -[BLOCK_RECURSION_DEPTH_7]: cel.@block([has({"a": true}.a)], @index0 && @index0) -[BLOCK_RECURSION_DEPTH_8]: cel.@block([has({"a": true}.a)], @index0 && @index0) -[BLOCK_RECURSION_DEPTH_9]: cel.@block([has({"a": true}.a)], @index0 && @index0) +Unparsed: cel.@block([has({"a": true}.a)], @index0 && @index0) Test case: PRESENCE_TEST_WITH_TERNARY Source: (has(msg.oneof_type.payload) ? msg.oneof_type.payload.single_int64 : 0) == 10 =====> Result: true -[BLOCK_COMMON_SUBEXPR_ONLY]: cel.@block([msg.oneof_type], (has(@index0.payload) ? @index0.payload.single_int64 : 0) == 10) -[BLOCK_RECURSION_DEPTH_1]: cel.@block([msg.oneof_type, has(@index0.payload), @index0.payload, @index2.single_int64, @index1 ? @index3 : 0], @index4 == 10) -[BLOCK_RECURSION_DEPTH_2]: cel.@block([msg.oneof_type, @index0.payload.single_int64, has(@index0.payload) ? @index1 : 0], @index2 == 10) -[BLOCK_RECURSION_DEPTH_3]: cel.@block([msg.oneof_type, has(@index0.payload) ? @index0.payload.single_int64 : 0], @index1 == 10) -[BLOCK_RECURSION_DEPTH_4]: cel.@block([msg.oneof_type], (has(@index0.payload) ? @index0.payload.single_int64 : 0) == 10) -[BLOCK_RECURSION_DEPTH_5]: cel.@block([msg.oneof_type], (has(@index0.payload) ? @index0.payload.single_int64 : 0) == 10) -[BLOCK_RECURSION_DEPTH_6]: cel.@block([msg.oneof_type], (has(@index0.payload) ? @index0.payload.single_int64 : 0) == 10) -[BLOCK_RECURSION_DEPTH_7]: cel.@block([msg.oneof_type], (has(@index0.payload) ? @index0.payload.single_int64 : 0) == 10) -[BLOCK_RECURSION_DEPTH_8]: cel.@block([msg.oneof_type], (has(@index0.payload) ? @index0.payload.single_int64 : 0) == 10) -[BLOCK_RECURSION_DEPTH_9]: cel.@block([msg.oneof_type], (has(@index0.payload) ? @index0.payload.single_int64 : 0) == 10) +Unparsed: cel.@block([msg.oneof_type], (has(@index0.payload) ? @index0.payload.single_int64 : 0) == 10) Test case: PRESENCE_TEST_WITH_TERNARY_2 Source: (has(msg.oneof_type.payload) ? msg.oneof_type.payload.single_int64 : msg.oneof_type.payload.single_int64 * 0) == 10 =====> Result: true -[BLOCK_COMMON_SUBEXPR_ONLY]: cel.@block([msg.oneof_type, @index0.payload.single_int64], (has(@index0.payload) ? @index1 : (@index1 * 0)) == 10) -[BLOCK_RECURSION_DEPTH_1]: cel.@block([msg.oneof_type, @index0.payload, @index1.single_int64, has(@index0.payload), @index2 * 0, @index3 ? @index2 : @index4], @index5 == 10) -[BLOCK_RECURSION_DEPTH_2]: cel.@block([msg.oneof_type.payload, @index0.single_int64, has(msg.oneof_type.payload), @index2 ? @index1 : (@index1 * 0)], @index3 == 10) -[BLOCK_RECURSION_DEPTH_3]: cel.@block([msg.oneof_type.payload.single_int64, has(msg.oneof_type.payload) ? @index0 : (@index0 * 0)], @index1 == 10) -[BLOCK_RECURSION_DEPTH_4]: cel.@block([msg.oneof_type.payload.single_int64], (has(msg.oneof_type.payload) ? @index0 : (@index0 * 0)) == 10) -[BLOCK_RECURSION_DEPTH_5]: cel.@block([msg.oneof_type.payload.single_int64], (has(msg.oneof_type.payload) ? @index0 : (@index0 * 0)) == 10) -[BLOCK_RECURSION_DEPTH_6]: cel.@block([msg.oneof_type.payload.single_int64], (has(msg.oneof_type.payload) ? @index0 : (@index0 * 0)) == 10) -[BLOCK_RECURSION_DEPTH_7]: cel.@block([msg.oneof_type.payload.single_int64], (has(msg.oneof_type.payload) ? @index0 : (@index0 * 0)) == 10) -[BLOCK_RECURSION_DEPTH_8]: cel.@block([msg.oneof_type.payload.single_int64], (has(msg.oneof_type.payload) ? @index0 : (@index0 * 0)) == 10) -[BLOCK_RECURSION_DEPTH_9]: cel.@block([msg.oneof_type.payload.single_int64], (has(msg.oneof_type.payload) ? @index0 : (@index0 * 0)) == 10) +Unparsed: cel.@block([msg.oneof_type, @index0.payload.single_int64], (has(@index0.payload) ? @index1 : (@index1 * 0)) == 10) Test case: PRESENCE_TEST_WITH_TERNARY_3 Source: (has(msg.oneof_type.payload.single_int64) ? msg.oneof_type.payload.single_int64 : msg.oneof_type.payload.single_int64 * 0) == 10 =====> Result: true -[BLOCK_COMMON_SUBEXPR_ONLY]: cel.@block([msg.oneof_type.payload, @index0.single_int64], (has(@index0.single_int64) ? @index1 : (@index1 * 0)) == 10) -[BLOCK_RECURSION_DEPTH_1]: cel.@block([msg.oneof_type, @index0.payload, @index1.single_int64, has(@index1.single_int64), @index2 * 0, @index3 ? @index2 : @index4], @index5 == 10) -[BLOCK_RECURSION_DEPTH_2]: cel.@block([msg.oneof_type.payload, @index0.single_int64, has(@index0.single_int64) ? @index1 : (@index1 * 0)], @index2 == 10) -[BLOCK_RECURSION_DEPTH_3]: cel.@block([msg.oneof_type.payload.single_int64, has(msg.oneof_type.payload.single_int64)], (@index1 ? @index0 : (@index0 * 0)) == 10) -[BLOCK_RECURSION_DEPTH_4]: cel.@block([msg.oneof_type.payload.single_int64, has(msg.oneof_type.payload.single_int64) ? @index0 : (@index0 * 0)], @index1 == 10) -[BLOCK_RECURSION_DEPTH_5]: cel.@block([msg.oneof_type.payload.single_int64], (has(msg.oneof_type.payload.single_int64) ? @index0 : (@index0 * 0)) == 10) -[BLOCK_RECURSION_DEPTH_6]: cel.@block([msg.oneof_type.payload.single_int64], (has(msg.oneof_type.payload.single_int64) ? @index0 : (@index0 * 0)) == 10) -[BLOCK_RECURSION_DEPTH_7]: cel.@block([msg.oneof_type.payload.single_int64], (has(msg.oneof_type.payload.single_int64) ? @index0 : (@index0 * 0)) == 10) -[BLOCK_RECURSION_DEPTH_8]: cel.@block([msg.oneof_type.payload.single_int64], (has(msg.oneof_type.payload.single_int64) ? @index0 : (@index0 * 0)) == 10) -[BLOCK_RECURSION_DEPTH_9]: cel.@block([msg.oneof_type.payload.single_int64], (has(msg.oneof_type.payload.single_int64) ? @index0 : (@index0 * 0)) == 10) +Unparsed: cel.@block([msg.oneof_type.payload, @index0.single_int64], (has(@index0.single_int64) ? @index1 : (@index1 * 0)) == 10) Test case: PRESENCE_TEST_WITH_TERNARY_NESTED Source: (has(msg.oneof_type) && has(msg.oneof_type.payload) && has(msg.oneof_type.payload.single_int64)) ? ((has(msg.oneof_type.payload.map_string_string) && has(msg.oneof_type.payload.map_string_string.key)) ? msg.oneof_type.payload.map_string_string.key == 'A' : false) : false =====> Result: true -[BLOCK_COMMON_SUBEXPR_ONLY]: cel.@block([msg.oneof_type, @index0.payload, @index1.map_string_string], (has(msg.oneof_type) && has(@index0.payload) && has(@index1.single_int64)) ? ((has(@index1.map_string_string) && has(@index2.key)) ? (@index2.key == "A") : false) : false) -[BLOCK_RECURSION_DEPTH_1]: cel.@block([msg.oneof_type, @index0.payload, @index1.map_string_string, has(msg.oneof_type), has(@index0.payload), @index3 && @index4, has(@index1.single_int64), @index5 && @index6, has(@index1.map_string_string), has(@index2.key), @index8 && @index9, @index2.key, @index11 == "A", @index10 ? @index12 : false], @index7 ? @index13 : false) -[BLOCK_RECURSION_DEPTH_2]: cel.@block([msg.oneof_type.payload, @index0.map_string_string, has(msg.oneof_type.payload), has(msg.oneof_type) && @index2, @index3 && has(@index0.single_int64), has(@index0.map_string_string) && has(@index1.key), @index1.key == "A"], @index4 ? (@index5 ? @index6 : false) : false) -[BLOCK_RECURSION_DEPTH_3]: cel.@block([msg.oneof_type.payload.map_string_string, msg.oneof_type.payload, has(msg.oneof_type) && has(msg.oneof_type.payload), (has(@index1.map_string_string) && has(@index0.key)) ? (@index0.key == "A") : false], (@index2 && has(@index1.single_int64)) ? @index3 : false) -[BLOCK_RECURSION_DEPTH_4]: cel.@block([msg.oneof_type.payload.map_string_string, msg.oneof_type.payload, has(msg.oneof_type) && has(msg.oneof_type.payload) && has(@index1.single_int64)], @index2 ? ((has(@index1.map_string_string) && has(@index0.key)) ? (@index0.key == "A") : false) : false) -[BLOCK_RECURSION_DEPTH_5]: cel.@block([msg.oneof_type.payload.map_string_string, msg.oneof_type.payload], (has(msg.oneof_type) && has(msg.oneof_type.payload) && has(@index1.single_int64)) ? ((has(@index1.map_string_string) && has(@index0.key)) ? (@index0.key == "A") : false) : false) -[BLOCK_RECURSION_DEPTH_6]: cel.@block([msg.oneof_type.payload.map_string_string, msg.oneof_type.payload], (has(msg.oneof_type) && has(msg.oneof_type.payload) && has(@index1.single_int64)) ? ((has(@index1.map_string_string) && has(@index0.key)) ? (@index0.key == "A") : false) : false) -[BLOCK_RECURSION_DEPTH_7]: cel.@block([msg.oneof_type.payload.map_string_string, msg.oneof_type.payload], (has(msg.oneof_type) && has(msg.oneof_type.payload) && has(@index1.single_int64)) ? ((has(@index1.map_string_string) && has(@index0.key)) ? (@index0.key == "A") : false) : false) -[BLOCK_RECURSION_DEPTH_8]: cel.@block([msg.oneof_type.payload.map_string_string, msg.oneof_type.payload], (has(msg.oneof_type) && has(msg.oneof_type.payload) && has(@index1.single_int64)) ? ((has(@index1.map_string_string) && has(@index0.key)) ? (@index0.key == "A") : false) : false) -[BLOCK_RECURSION_DEPTH_9]: cel.@block([msg.oneof_type.payload.map_string_string, msg.oneof_type.payload], (has(msg.oneof_type) && has(msg.oneof_type.payload) && has(@index1.single_int64)) ? ((has(@index1.map_string_string) && has(@index0.key)) ? (@index0.key == "A") : false) : false) +Unparsed: cel.@block([msg.oneof_type, @index0.payload, @index1.map_string_string], (has(msg.oneof_type) && has(@index0.payload) && has(@index1.single_int64)) ? ((has(@index1.map_string_string) && has(@index2.key)) ? (@index2.key == "A") : false) : false) Test case: OPTIONAL_LIST Source: [10, ?optional.none(), [?optional.none(), ?opt_x], [?optional.none(), ?opt_x]] == [10, [5], [5]] =====> Result: true -[BLOCK_COMMON_SUBEXPR_ONLY]: cel.@block([optional.none(), [?@index0, ?opt_x], [5]], [10, ?@index0, @index1, @index1] == [10, @index2, @index2]) -[BLOCK_RECURSION_DEPTH_1]: cel.@block([optional.none(), [?@index0, ?opt_x], [5], [10, ?@index0, @index1, @index1], [10, @index2, @index2]], @index3 == @index4) -[BLOCK_RECURSION_DEPTH_2]: cel.@block([[?optional.none(), ?opt_x], [5], [10, ?optional.none(), @index0, @index0]], @index2 == [10, @index1, @index1]) -[BLOCK_RECURSION_DEPTH_3]: cel.@block([[?optional.none(), ?opt_x], [5]], [10, ?optional.none(), @index0, @index0] == [10, @index1, @index1]) -[BLOCK_RECURSION_DEPTH_4]: cel.@block([[?optional.none(), ?opt_x], [5]], [10, ?optional.none(), @index0, @index0] == [10, @index1, @index1]) -[BLOCK_RECURSION_DEPTH_5]: cel.@block([[?optional.none(), ?opt_x], [5]], [10, ?optional.none(), @index0, @index0] == [10, @index1, @index1]) -[BLOCK_RECURSION_DEPTH_6]: cel.@block([[?optional.none(), ?opt_x], [5]], [10, ?optional.none(), @index0, @index0] == [10, @index1, @index1]) -[BLOCK_RECURSION_DEPTH_7]: cel.@block([[?optional.none(), ?opt_x], [5]], [10, ?optional.none(), @index0, @index0] == [10, @index1, @index1]) -[BLOCK_RECURSION_DEPTH_8]: cel.@block([[?optional.none(), ?opt_x], [5]], [10, ?optional.none(), @index0, @index0] == [10, @index1, @index1]) -[BLOCK_RECURSION_DEPTH_9]: cel.@block([[?optional.none(), ?opt_x], [5]], [10, ?optional.none(), @index0, @index0] == [10, @index1, @index1]) +Unparsed: cel.@block([optional.none(), [?@index0, ?opt_x], [5]], [10, ?@index0, @index1, @index1] == [10, @index2, @index2]) Test case: OPTIONAL_MAP Source: {?'hello': optional.of('hello')}['hello'] + {?'hello': optional.of('hello')}['hello'] == 'hellohello' =====> Result: true -[BLOCK_COMMON_SUBEXPR_ONLY]: cel.@block([{?"hello": optional.of("hello")}["hello"]], @index0 + @index0 == "hellohello") -[BLOCK_RECURSION_DEPTH_1]: cel.@block([optional.of("hello"), {?"hello": @index0}, @index1["hello"], @index2 + @index2], @index3 == "hellohello") -[BLOCK_RECURSION_DEPTH_2]: cel.@block([{?"hello": optional.of("hello")}, @index0["hello"]], @index1 + @index1 == "hellohello") -[BLOCK_RECURSION_DEPTH_3]: cel.@block([{?"hello": optional.of("hello")}["hello"]], @index0 + @index0 == "hellohello") -[BLOCK_RECURSION_DEPTH_4]: cel.@block([{?"hello": optional.of("hello")}["hello"]], @index0 + @index0 == "hellohello") -[BLOCK_RECURSION_DEPTH_5]: cel.@block([{?"hello": optional.of("hello")}["hello"]], @index0 + @index0 == "hellohello") -[BLOCK_RECURSION_DEPTH_6]: cel.@block([{?"hello": optional.of("hello")}["hello"]], @index0 + @index0 == "hellohello") -[BLOCK_RECURSION_DEPTH_7]: cel.@block([{?"hello": optional.of("hello")}["hello"]], @index0 + @index0 == "hellohello") -[BLOCK_RECURSION_DEPTH_8]: cel.@block([{?"hello": optional.of("hello")}["hello"]], @index0 + @index0 == "hellohello") -[BLOCK_RECURSION_DEPTH_9]: cel.@block([{?"hello": optional.of("hello")}["hello"]], @index0 + @index0 == "hellohello") +Unparsed: cel.@block([{?"hello": optional.of("hello")}["hello"]], @index0 + @index0 == "hellohello") Test case: OPTIONAL_MAP_CHAINED Source: {?'key': optional.of('test')}[?'bogus'].or({'key': 'test'}[?'bogus']).orValue({'key': 'test'}['key']) == 'test' =====> Result: true -[BLOCK_COMMON_SUBEXPR_ONLY]: cel.@block([{"key": "test"}], {?"key": optional.of("test")}[?"bogus"].or(@index0[?"bogus"]).orValue(@index0["key"]) == "test") -[BLOCK_RECURSION_DEPTH_1]: cel.@block([{"key": "test"}, optional.of("test"), {?"key": @index1}, @index2[?"bogus"], @index0[?"bogus"], @index3.or(@index4), @index0["key"], @index5.orValue(@index6)], @index7 == "test") -[BLOCK_RECURSION_DEPTH_2]: cel.@block([{"key": "test"}, {?"key": optional.of("test")}, @index1[?"bogus"].or(@index0[?"bogus"]), @index2.orValue(@index0["key"])], @index3 == "test") -[BLOCK_RECURSION_DEPTH_3]: cel.@block([{"key": "test"}, {?"key": optional.of("test")}[?"bogus"], @index1.or(@index0[?"bogus"]).orValue(@index0["key"])], @index2 == "test") -[BLOCK_RECURSION_DEPTH_4]: cel.@block([{"key": "test"}, {?"key": optional.of("test")}[?"bogus"].or(@index0[?"bogus"])], @index1.orValue(@index0["key"]) == "test") -[BLOCK_RECURSION_DEPTH_5]: cel.@block([{"key": "test"}, {?"key": optional.of("test")}[?"bogus"].or(@index0[?"bogus"]).orValue(@index0["key"])], @index1 == "test") -[BLOCK_RECURSION_DEPTH_6]: cel.@block([{"key": "test"}], {?"key": optional.of("test")}[?"bogus"].or(@index0[?"bogus"]).orValue(@index0["key"]) == "test") -[BLOCK_RECURSION_DEPTH_7]: cel.@block([{"key": "test"}], {?"key": optional.of("test")}[?"bogus"].or(@index0[?"bogus"]).orValue(@index0["key"]) == "test") -[BLOCK_RECURSION_DEPTH_8]: cel.@block([{"key": "test"}], {?"key": optional.of("test")}[?"bogus"].or(@index0[?"bogus"]).orValue(@index0["key"]) == "test") -[BLOCK_RECURSION_DEPTH_9]: cel.@block([{"key": "test"}], {?"key": optional.of("test")}[?"bogus"].or(@index0[?"bogus"]).orValue(@index0["key"]) == "test") +Unparsed: cel.@block([{"key": "test"}], {?"key": optional.of("test")}[?"bogus"].or(@index0[?"bogus"]).orValue(@index0["key"]) == "test") Test case: OPTIONAL_MESSAGE Source: TestAllTypes{?single_int64: optional.ofNonZeroValue(1), ?single_int32: optional.of(4)}.single_int32 + TestAllTypes{?single_int64: optional.ofNonZeroValue(1), ?single_int32: optional.of(4)}.single_int64 == 5 =====> Result: true -[BLOCK_COMMON_SUBEXPR_ONLY]: cel.@block([cel.expr.conformance.proto3.TestAllTypes{?single_int64: optional.ofNonZeroValue(1), ?single_int32: optional.of(4)}], @index0.single_int32 + @index0.single_int64 == 5) -[BLOCK_RECURSION_DEPTH_1]: cel.@block([optional.ofNonZeroValue(1), optional.of(4), cel.expr.conformance.proto3.TestAllTypes{?single_int64: @index0, ?single_int32: @index1}, @index2.single_int32, @index2.single_int64, @index3 + @index4], @index5 == 5) -[BLOCK_RECURSION_DEPTH_2]: cel.@block([cel.expr.conformance.proto3.TestAllTypes{?single_int64: optional.ofNonZeroValue(1), ?single_int32: optional.of(4)}, @index0.single_int32 + @index0.single_int64], @index1 == 5) -[BLOCK_RECURSION_DEPTH_3]: cel.@block([cel.expr.conformance.proto3.TestAllTypes{?single_int64: optional.ofNonZeroValue(1), ?single_int32: optional.of(4)}], @index0.single_int32 + @index0.single_int64 == 5) -[BLOCK_RECURSION_DEPTH_4]: cel.@block([cel.expr.conformance.proto3.TestAllTypes{?single_int64: optional.ofNonZeroValue(1), ?single_int32: optional.of(4)}], @index0.single_int32 + @index0.single_int64 == 5) -[BLOCK_RECURSION_DEPTH_5]: cel.@block([cel.expr.conformance.proto3.TestAllTypes{?single_int64: optional.ofNonZeroValue(1), ?single_int32: optional.of(4)}], @index0.single_int32 + @index0.single_int64 == 5) -[BLOCK_RECURSION_DEPTH_6]: cel.@block([cel.expr.conformance.proto3.TestAllTypes{?single_int64: optional.ofNonZeroValue(1), ?single_int32: optional.of(4)}], @index0.single_int32 + @index0.single_int64 == 5) -[BLOCK_RECURSION_DEPTH_7]: cel.@block([cel.expr.conformance.proto3.TestAllTypes{?single_int64: optional.ofNonZeroValue(1), ?single_int32: optional.of(4)}], @index0.single_int32 + @index0.single_int64 == 5) -[BLOCK_RECURSION_DEPTH_8]: cel.@block([cel.expr.conformance.proto3.TestAllTypes{?single_int64: optional.ofNonZeroValue(1), ?single_int32: optional.of(4)}], @index0.single_int32 + @index0.single_int64 == 5) -[BLOCK_RECURSION_DEPTH_9]: cel.@block([cel.expr.conformance.proto3.TestAllTypes{?single_int64: optional.ofNonZeroValue(1), ?single_int32: optional.of(4)}], @index0.single_int32 + @index0.single_int64 == 5) +Unparsed: cel.@block([cel.expr.conformance.proto3.TestAllTypes{?single_int64: optional.ofNonZeroValue(1), ?single_int32: optional.of(4)}], @index0.single_int32 + @index0.single_int64 == 5) Test case: CALL Source: ('h' + 'e' + 'l' + 'l' + 'o' + ' world').matches('h' + 'e' + 'l' + 'l' + 'o') =====> Result: true -[BLOCK_COMMON_SUBEXPR_ONLY]: cel.@block(["h" + "e" + "l" + "l" + "o"], (@index0 + " world").matches(@index0)) -[BLOCK_RECURSION_DEPTH_1]: cel.@block(["h" + "e", @index0 + "l", @index1 + "l", @index2 + "o", @index3 + " world"], @index4.matches(@index3)) -[BLOCK_RECURSION_DEPTH_2]: cel.@block(["h" + "e" + "l", @index0 + "l" + "o"], (@index1 + " world").matches(@index1)) -[BLOCK_RECURSION_DEPTH_3]: cel.@block(["h" + "e" + "l" + "l", @index0 + "o"], (@index1 + " world").matches(@index1)) -[BLOCK_RECURSION_DEPTH_4]: cel.@block(["h" + "e" + "l" + "l" + "o"], (@index0 + " world").matches(@index0)) -[BLOCK_RECURSION_DEPTH_5]: cel.@block(["h" + "e" + "l" + "l" + "o"], (@index0 + " world").matches(@index0)) -[BLOCK_RECURSION_DEPTH_6]: cel.@block(["h" + "e" + "l" + "l" + "o"], (@index0 + " world").matches(@index0)) -[BLOCK_RECURSION_DEPTH_7]: cel.@block(["h" + "e" + "l" + "l" + "o"], (@index0 + " world").matches(@index0)) -[BLOCK_RECURSION_DEPTH_8]: cel.@block(["h" + "e" + "l" + "l" + "o"], (@index0 + " world").matches(@index0)) -[BLOCK_RECURSION_DEPTH_9]: cel.@block(["h" + "e" + "l" + "l" + "o"], (@index0 + " world").matches(@index0)) +Unparsed: cel.@block(["h" + "e" + "l" + "l" + "o"], (@index0 + " world").matches(@index0)) Test case: CALL_ARGUMENT_NESTED_NO_COMMON_SUBEXPR Source: 'hello world'.matches('h' + 'e' + 'l' + 'l' + 'o') =====> Result: true -[BLOCK_COMMON_SUBEXPR_ONLY]: "hello world".matches("h" + "e" + "l" + "l" + "o") -[BLOCK_RECURSION_DEPTH_1]: cel.@block(["h" + "e", @index0 + "l", @index1 + "l", @index2 + "o"], "hello world".matches(@index3)) -[BLOCK_RECURSION_DEPTH_2]: cel.@block(["h" + "e" + "l", @index0 + "l" + "o"], "hello world".matches(@index1)) -[BLOCK_RECURSION_DEPTH_3]: cel.@block(["h" + "e" + "l" + "l"], "hello world".matches(@index0 + "o")) -[BLOCK_RECURSION_DEPTH_4]: cel.@block(["h" + "e" + "l" + "l" + "o"], "hello world".matches(@index0)) -[BLOCK_RECURSION_DEPTH_5]: "hello world".matches("h" + "e" + "l" + "l" + "o") -[BLOCK_RECURSION_DEPTH_6]: "hello world".matches("h" + "e" + "l" + "l" + "o") -[BLOCK_RECURSION_DEPTH_7]: "hello world".matches("h" + "e" + "l" + "l" + "o") -[BLOCK_RECURSION_DEPTH_8]: "hello world".matches("h" + "e" + "l" + "l" + "o") -[BLOCK_RECURSION_DEPTH_9]: "hello world".matches("h" + "e" + "l" + "l" + "o") +Unparsed: "hello world".matches("h" + "e" + "l" + "l" + "o") Test case: CALL_TARGET_NESTED_NO_COMMON_SUBEXPR Source: ('h' + 'e' + 'l' + 'l' + 'o' + ' world').matches('hello') =====> Result: true -[BLOCK_COMMON_SUBEXPR_ONLY]: ("h" + "e" + "l" + "l" + "o" + " world").matches("hello") -[BLOCK_RECURSION_DEPTH_1]: cel.@block(["h" + "e", @index0 + "l", @index1 + "l", @index2 + "o", @index3 + " world"], @index4.matches("hello")) -[BLOCK_RECURSION_DEPTH_2]: cel.@block(["h" + "e" + "l", @index0 + "l" + "o"], (@index1 + " world").matches("hello")) -[BLOCK_RECURSION_DEPTH_3]: cel.@block(["h" + "e" + "l" + "l"], (@index0 + "o" + " world").matches("hello")) -[BLOCK_RECURSION_DEPTH_4]: cel.@block(["h" + "e" + "l" + "l" + "o"], (@index0 + " world").matches("hello")) -[BLOCK_RECURSION_DEPTH_5]: cel.@block(["h" + "e" + "l" + "l" + "o" + " world"], @index0.matches("hello")) -[BLOCK_RECURSION_DEPTH_6]: ("h" + "e" + "l" + "l" + "o" + " world").matches("hello") -[BLOCK_RECURSION_DEPTH_7]: ("h" + "e" + "l" + "l" + "o" + " world").matches("hello") -[BLOCK_RECURSION_DEPTH_8]: ("h" + "e" + "l" + "l" + "o" + " world").matches("hello") -[BLOCK_RECURSION_DEPTH_9]: ("h" + "e" + "l" + "l" + "o" + " world").matches("hello") +Unparsed: ("h" + "e" + "l" + "l" + "o" + " world").matches("hello") Test case: CALL_BOTH_ARGUMENT_TARGET_NESTED_NO_COMMON_SUBEXPR Source: ('h' + 'e' + 'l' + 'l' + 'o' + ' world').matches('w' + 'o' + 'r' + 'l' + 'd') =====> Result: true -[BLOCK_COMMON_SUBEXPR_ONLY]: ("h" + "e" + "l" + "l" + "o" + " world").matches("w" + "o" + "r" + "l" + "d") -[BLOCK_RECURSION_DEPTH_1]: cel.@block(["h" + "e", @index0 + "l", @index1 + "l", @index2 + "o", @index3 + " world", "w" + "o", @index5 + "r", @index6 + "l", @index7 + "d"], @index4.matches(@index8)) -[BLOCK_RECURSION_DEPTH_2]: cel.@block(["h" + "e" + "l", @index0 + "l" + "o", "w" + "o" + "r", @index2 + "l" + "d"], (@index1 + " world").matches(@index3)) -[BLOCK_RECURSION_DEPTH_3]: cel.@block(["h" + "e" + "l" + "l", "w" + "o" + "r" + "l"], (@index0 + "o" + " world").matches(@index1 + "d")) -[BLOCK_RECURSION_DEPTH_4]: cel.@block(["h" + "e" + "l" + "l" + "o", "w" + "o" + "r" + "l" + "d"], (@index0 + " world").matches(@index1)) -[BLOCK_RECURSION_DEPTH_5]: cel.@block(["h" + "e" + "l" + "l" + "o" + " world"], @index0.matches("w" + "o" + "r" + "l" + "d")) -[BLOCK_RECURSION_DEPTH_6]: ("h" + "e" + "l" + "l" + "o" + " world").matches("w" + "o" + "r" + "l" + "d") -[BLOCK_RECURSION_DEPTH_7]: ("h" + "e" + "l" + "l" + "o" + " world").matches("w" + "o" + "r" + "l" + "d") -[BLOCK_RECURSION_DEPTH_8]: ("h" + "e" + "l" + "l" + "o" + " world").matches("w" + "o" + "r" + "l" + "d") -[BLOCK_RECURSION_DEPTH_9]: ("h" + "e" + "l" + "l" + "o" + " world").matches("w" + "o" + "r" + "l" + "d") +Unparsed: ("h" + "e" + "l" + "l" + "o" + " world").matches("w" + "o" + "r" + "l" + "d") Test case: CUSTOM_FUNCTION_INELIMINABLE Source: non_pure_custom_func(msg.oneof_type.payload.single_int64) + non_pure_custom_func(msg.oneof_type.payload.single_int32) + non_pure_custom_func(msg.oneof_type.payload.single_int64) + non_pure_custom_func(msg.single_int64) =====> Result: 31 -[BLOCK_COMMON_SUBEXPR_ONLY]: cel.@block([msg.oneof_type.payload, @index0.single_int64], non_pure_custom_func(@index1) + non_pure_custom_func(@index0.single_int32) + non_pure_custom_func(@index1) + non_pure_custom_func(msg.single_int64)) -[BLOCK_RECURSION_DEPTH_1]: cel.@block([msg.oneof_type, @index0.payload, @index1.single_int64], non_pure_custom_func(@index2) + non_pure_custom_func(@index1.single_int32) + non_pure_custom_func(@index2) + non_pure_custom_func(msg.single_int64)) -[BLOCK_RECURSION_DEPTH_2]: cel.@block([msg.oneof_type.payload, @index0.single_int64], non_pure_custom_func(@index1) + non_pure_custom_func(@index0.single_int32) + non_pure_custom_func(@index1) + non_pure_custom_func(msg.single_int64)) -[BLOCK_RECURSION_DEPTH_3]: cel.@block([msg.oneof_type.payload.single_int64], non_pure_custom_func(@index0) + non_pure_custom_func(msg.oneof_type.payload.single_int32) + non_pure_custom_func(@index0) + non_pure_custom_func(msg.single_int64)) -[BLOCK_RECURSION_DEPTH_4]: cel.@block([msg.oneof_type.payload.single_int64], non_pure_custom_func(@index0) + non_pure_custom_func(msg.oneof_type.payload.single_int32) + non_pure_custom_func(@index0) + non_pure_custom_func(msg.single_int64)) -[BLOCK_RECURSION_DEPTH_5]: cel.@block([msg.oneof_type.payload.single_int64], non_pure_custom_func(@index0) + non_pure_custom_func(msg.oneof_type.payload.single_int32) + non_pure_custom_func(@index0) + non_pure_custom_func(msg.single_int64)) -[BLOCK_RECURSION_DEPTH_6]: cel.@block([msg.oneof_type.payload.single_int64], non_pure_custom_func(@index0) + non_pure_custom_func(msg.oneof_type.payload.single_int32) + non_pure_custom_func(@index0) + non_pure_custom_func(msg.single_int64)) -[BLOCK_RECURSION_DEPTH_7]: cel.@block([msg.oneof_type.payload.single_int64], non_pure_custom_func(@index0) + non_pure_custom_func(msg.oneof_type.payload.single_int32) + non_pure_custom_func(@index0) + non_pure_custom_func(msg.single_int64)) -[BLOCK_RECURSION_DEPTH_8]: cel.@block([msg.oneof_type.payload.single_int64], non_pure_custom_func(@index0) + non_pure_custom_func(msg.oneof_type.payload.single_int32) + non_pure_custom_func(@index0) + non_pure_custom_func(msg.single_int64)) -[BLOCK_RECURSION_DEPTH_9]: cel.@block([msg.oneof_type.payload.single_int64], non_pure_custom_func(@index0) + non_pure_custom_func(msg.oneof_type.payload.single_int32) + non_pure_custom_func(@index0) + non_pure_custom_func(msg.single_int64)) +Unparsed: cel.@block([msg.oneof_type.payload, @index0.single_int64], non_pure_custom_func(@index1) + non_pure_custom_func(@index0.single_int32) + non_pure_custom_func(@index1) + non_pure_custom_func(msg.single_int64)) Test case: CUSTOM_FUNCTION_ELIMINABLE Source: pure_custom_func(msg.oneof_type.payload.single_int64) + pure_custom_func(msg.oneof_type.payload.single_int32) + pure_custom_func(msg.oneof_type.payload.single_int64) + pure_custom_func(msg.single_int64) =====> Result: 31 -[BLOCK_COMMON_SUBEXPR_ONLY]: cel.@block([msg.oneof_type.payload, pure_custom_func(@index0.single_int64)], @index1 + pure_custom_func(@index0.single_int32) + @index1 + pure_custom_func(msg.single_int64)) -[BLOCK_RECURSION_DEPTH_1]: cel.@block([msg.oneof_type, @index0.payload, @index1.single_int64, pure_custom_func(@index2), @index1.single_int32, pure_custom_func(@index4), @index3 + @index5, @index6 + @index3, msg.single_int64, pure_custom_func(@index8)], @index7 + @index9) -[BLOCK_RECURSION_DEPTH_2]: cel.@block([msg.oneof_type.payload, pure_custom_func(@index0.single_int64), pure_custom_func(@index0.single_int32), @index1 + @index2 + @index1, pure_custom_func(msg.single_int64)], @index3 + @index4) -[BLOCK_RECURSION_DEPTH_3]: cel.@block([msg.oneof_type.payload.single_int64, pure_custom_func(@index0), msg.oneof_type.payload.single_int32, @index1 + pure_custom_func(@index2) + @index1], @index3 + pure_custom_func(msg.single_int64)) -[BLOCK_RECURSION_DEPTH_4]: cel.@block([pure_custom_func(msg.oneof_type.payload.single_int64), pure_custom_func(msg.oneof_type.payload.single_int32)], @index0 + @index1 + @index0 + pure_custom_func(msg.single_int64)) -[BLOCK_RECURSION_DEPTH_5]: cel.@block([pure_custom_func(msg.oneof_type.payload.single_int64), @index0 + pure_custom_func(msg.oneof_type.payload.single_int32)], @index1 + @index0 + pure_custom_func(msg.single_int64)) -[BLOCK_RECURSION_DEPTH_6]: cel.@block([pure_custom_func(msg.oneof_type.payload.single_int64), @index0 + pure_custom_func(msg.oneof_type.payload.single_int32) + @index0], @index1 + pure_custom_func(msg.single_int64)) -[BLOCK_RECURSION_DEPTH_7]: cel.@block([pure_custom_func(msg.oneof_type.payload.single_int64)], @index0 + pure_custom_func(msg.oneof_type.payload.single_int32) + @index0 + pure_custom_func(msg.single_int64)) -[BLOCK_RECURSION_DEPTH_8]: cel.@block([pure_custom_func(msg.oneof_type.payload.single_int64)], @index0 + pure_custom_func(msg.oneof_type.payload.single_int32) + @index0 + pure_custom_func(msg.single_int64)) -[BLOCK_RECURSION_DEPTH_9]: cel.@block([pure_custom_func(msg.oneof_type.payload.single_int64)], @index0 + pure_custom_func(msg.oneof_type.payload.single_int32) + @index0 + pure_custom_func(msg.single_int64)) \ No newline at end of file +Unparsed: cel.@block([msg.oneof_type.payload, pure_custom_func(@index0.single_int64)], @index1 + pure_custom_func(@index0.single_int32) + @index1 + pure_custom_func(msg.single_int64)) \ No newline at end of file