diff --git a/.github/workflows/pkg-go-build.yaml b/.github/workflows/pkg-go-build.yaml index e9c6bf4f..e0b760ed 100644 --- a/.github/workflows/pkg-go-build.yaml +++ b/.github/workflows/pkg-go-build.yaml @@ -10,13 +10,17 @@ jobs: lint: runs-on: ubuntu-latest steps: - - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 with: fetch-depth: 0 - uses: actions/setup-go@b7ad1dad31e06c5925ef5d2fc7ad053ef454303e # v7.0.0 with: - go-version: ">=1.25.0" + # golangci-lint v1 cannot read export data emitted by Go 1.27 or later, + # so the lint job tracks the newest Go the linter supports rather than + # the newest Go available. Raise this together with the linter version + # in pkg/go/Makefile. + go-version: "1.26" cache-dependency-path: "./pkg/go/go.sum" check-latest: true @@ -30,7 +34,7 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 - name: Generate Antlr code and validate up to date run: | @@ -43,12 +47,12 @@ jobs: matrix: go-version: ["1.25", "1.26"] steps: - - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 with: fetch-depth: 0 - name: Set up Docker Buildx - uses: docker/setup-buildx-action@bb05f3f5519dd87d3ba754cc423b652a5edd6d2c # v4.2.0 + uses: docker/setup-buildx-action@37fe631027851001ddb9b187196cc803df7f5f0e # v4.3.0 - uses: actions/setup-go@b7ad1dad31e06c5925ef5d2fc7ad053ef454303e # v7.0.0 with: diff --git a/.github/workflows/pkg-java-build.yaml b/.github/workflows/pkg-java-build.yaml index 19578322..724dc92c 100644 --- a/.github/workflows/pkg-java-build.yaml +++ b/.github/workflows/pkg-java-build.yaml @@ -10,7 +10,7 @@ jobs: testCheckout: runs-on: ubuntu-latest steps: - - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 with: fetch-depth: 0 @@ -18,15 +18,15 @@ jobs: name: Lint Java runs-on: ubuntu-latest steps: - - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 with: fetch-depth: 0 - name: Set up Docker Buildx - uses: docker/setup-buildx-action@bb05f3f5519dd87d3ba754cc423b652a5edd6d2c # v4.2.0 + uses: docker/setup-buildx-action@37fe631027851001ddb9b187196cc803df7f5f0e # v4.3.0 - name: Set up JDK - uses: actions/setup-java@0f481fcb613427c0f801b606911222b5b6f3083a # v5.5.0 + uses: actions/setup-java@dd06d9cba3e5552c54d9f8ea23572deb30010f7c # v6.0.0 with: java-version: 20 distribution: "temurin" @@ -42,7 +42,7 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 - name: Generate Antlr code and validate up to date run: | @@ -59,15 +59,15 @@ jobs: java: ["11", "17", "20"] steps: - - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 with: fetch-depth: 0 - name: Set up Docker Buildx - uses: docker/setup-buildx-action@bb05f3f5519dd87d3ba754cc423b652a5edd6d2c # v4.2.0 + uses: docker/setup-buildx-action@37fe631027851001ddb9b187196cc803df7f5f0e # v4.3.0 - name: Set up JDK - uses: actions/setup-java@0f481fcb613427c0f801b606911222b5b6f3083a # v5.5.0 + uses: actions/setup-java@dd06d9cba3e5552c54d9f8ea23572deb30010f7c # v6.0.0 with: java-version: ${{ matrix.java }} distribution: "temurin" diff --git a/.github/workflows/pkg-java-release.yaml b/.github/workflows/pkg-java-release.yaml index 9a174f58..d8a1944c 100644 --- a/.github/workflows/pkg-java-release.yaml +++ b/.github/workflows/pkg-java-release.yaml @@ -24,7 +24,7 @@ jobs: working-directory: "pkg/java" steps: - - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 with: fetch-depth: 0 path: "." @@ -32,16 +32,16 @@ jobs: sparse-checkout-cone-mode: false - name: Set up JDK - uses: actions/setup-java@0f481fcb613427c0f801b606911222b5b6f3083a # v5.5.0 + uses: actions/setup-java@dd06d9cba3e5552c54d9f8ea23572deb30010f7c # v6.0.0 with: java-version: 11 distribution: "temurin" - name: Validate Gradle wrapper - uses: gradle/actions/wrapper-validation@3f131e8634966bd73d06cc69884922b02e6faf92 # v6.2.0 + uses: gradle/actions/wrapper-validation@9c971963bec38e04b3d30dcc455b5382be2fdbfb # v6.3.0 - name: Setup Gradle - uses: gradle/actions/setup-gradle@3f131e8634966bd73d06cc69884922b02e6faf92 # v6.2.0 + uses: gradle/actions/setup-gradle@9c971963bec38e04b3d30dcc455b5382be2fdbfb # v6.3.0 with: cache-provider: basic # Use the open-source basic cache provider @@ -65,7 +65,7 @@ jobs: working-directory: "pkg/java" steps: - - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 with: fetch-depth: 0 path: "." @@ -73,16 +73,16 @@ jobs: sparse-checkout-cone-mode: false - name: Set up JDK - uses: actions/setup-java@0f481fcb613427c0f801b606911222b5b6f3083a # v5.5.0 + uses: actions/setup-java@dd06d9cba3e5552c54d9f8ea23572deb30010f7c # v6.0.0 with: java-version: 11 distribution: "temurin" - name: Validate Gradle wrapper - uses: gradle/actions/wrapper-validation@3f131e8634966bd73d06cc69884922b02e6faf92 # v6.2.0 + uses: gradle/actions/wrapper-validation@9c971963bec38e04b3d30dcc455b5382be2fdbfb # v6.3.0 - name: Setup Gradle - uses: gradle/actions/setup-gradle@3f131e8634966bd73d06cc69884922b02e6faf92 # v6.2.0 + uses: gradle/actions/setup-gradle@9c971963bec38e04b3d30dcc455b5382be2fdbfb # v6.3.0 with: cache-provider: basic # Use the open-source basic cache provider diff --git a/.github/workflows/pkg-js-build.yaml b/.github/workflows/pkg-js-build.yaml index 95f38532..48ee85fc 100644 --- a/.github/workflows/pkg-js-build.yaml +++ b/.github/workflows/pkg-js-build.yaml @@ -11,7 +11,7 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 - name: Set up node uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0 @@ -30,7 +30,7 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 - name: Generate Antlr code and validate up to date run: | @@ -45,12 +45,12 @@ jobs: node-version: [20.x, 22.x, 24.x, 25.x] steps: - - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 with: fetch-depth: 0 - name: Set up Docker Buildx - uses: docker/setup-buildx-action@bb05f3f5519dd87d3ba754cc423b652a5edd6d2c # v4.2.0 + uses: docker/setup-buildx-action@37fe631027851001ddb9b187196cc803df7f5f0e # v4.3.0 - name: Set up node uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0 diff --git a/.github/workflows/pkg-js-release.yaml b/.github/workflows/pkg-js-release.yaml index 95ca4870..08d76897 100644 --- a/.github/workflows/pkg-js-release.yaml +++ b/.github/workflows/pkg-js-release.yaml @@ -27,7 +27,7 @@ jobs: working-directory: "pkg/js" steps: - - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 with: fetch-depth: 0 path: "." diff --git a/.github/workflows/reusable-release-please.yaml b/.github/workflows/reusable-release-please.yaml index d09e19e5..c7bb85ff 100644 --- a/.github/workflows/reusable-release-please.yaml +++ b/.github/workflows/reusable-release-please.yaml @@ -53,7 +53,7 @@ jobs: private-key: ${{ secrets.RELEASER_APP_PRIVATE_KEY }} - name: Checkout (full history + tags) - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 with: fetch-depth: 0 token: ${{ steps.app-token.outputs.token }} @@ -243,7 +243,7 @@ jobs: private-key: ${{ secrets.RELEASER_APP_PRIVATE_KEY }} - name: Checkout (full history + tags) - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 with: fetch-depth: 0 token: ${{ steps.app-token.outputs.token }} diff --git a/.github/workflows/scorecard.yml b/.github/workflows/scorecard.yml index 61633a88..a047b0dc 100644 --- a/.github/workflows/scorecard.yml +++ b/.github/workflows/scorecard.yml @@ -34,12 +34,12 @@ jobs: steps: - name: "Checkout code" - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 with: persist-credentials: false - name: "Run analysis" - uses: ossf/scorecard-action@4eaacf0543bb3f2c246792bd56e8cdeffafb205a # v2.4.3 + uses: ossf/scorecard-action@2d1146689b8cda280b9bc96326124645441f03bc # v2.4.4 with: results_file: results.sarif results_format: sarif diff --git a/.github/workflows/test-release-scripts.yml b/.github/workflows/test-release-scripts.yml index a1b8cd07..97e5252e 100644 --- a/.github/workflows/test-release-scripts.yml +++ b/.github/workflows/test-release-scripts.yml @@ -19,7 +19,7 @@ jobs: test: runs-on: ubuntu-latest steps: - - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 - name: Run parse-release tests run: bash .github/workflows/scripts/parse-release.test.sh diff --git a/OpenFGALexer.g4 b/OpenFGALexer.g4 index be992bd3..388ba16a 100644 --- a/OpenFGALexer.g4 +++ b/OpenFGALexer.g4 @@ -129,6 +129,12 @@ STRING: BYTES: ('b' | 'B') STRING; +// Reserved condition name for inline expressions on a type restriction +// (e.g. `define viewer: [user with $expression]`). It is intentionally placed +// before IDENTIFIER so the literal wins, and `$` exists nowhere else in the +// lexer, so this cannot collide with any existing token. +DOLLAR_EXPRESSION: '$expression'; + IDENTIFIER: (LETTER | '_') (LETTER | DIGIT | '_' | MINUS)*; // NOTE: MINUS is not allowed in CEL, but allowed in FGA, CEL will be revalidated after diff --git a/OpenFGAParser.g4 b/OpenFGAParser.g4 index 3c8c3948..0f9fd864 100644 --- a/OpenFGAParser.g4 +++ b/OpenFGAParser.g4 @@ -43,7 +43,7 @@ relationDefRewrite: rewriteComputedusersetName=extended_identifier (WHITESPACE F relationDefTypeRestriction: NEWLINE? ( relationDefTypeRestrictionBase - | (relationDefTypeRestrictionBase WHITESPACE KEYWORD_WITH WHITESPACE conditionName) + | (relationDefTypeRestrictionBase WHITESPACE KEYWORD_WITH WHITESPACE (conditionName | DOLLAR_EXPRESSION)) ) NEWLINE?; relationDefTypeRestrictionBase: relationDefTypeRestrictionType=extended_identifier ((COLON relationDefTypeRestrictionWildcard=STAR) diff --git a/pkg/go/Makefile b/pkg/go/Makefile index a0680d7f..6a20e3b1 100644 --- a/pkg/go/Makefile +++ b/pkg/go/Makefile @@ -1,6 +1,7 @@ BINARY_NAME=openfga-language DOCKER_BINARY=docker GO_BIN ?= $(shell go env GOPATH)/bin +GOLANGCI_LINT_VERSION ?= v1.64.8 .DEFAULT_GOAL := help help: ## Show this help @@ -12,7 +13,7 @@ help: ## Show this help #----------------------------------------------------------------------------------------------------------------------- $(GO_BIN)/golangci-lint: @echo "==> Installing golangci-lint within "${GO_BIN}"" - @go install -v github.com/golangci/golangci-lint/cmd/golangci-lint@latest + @go install -v github.com/golangci/golangci-lint/cmd/golangci-lint@$(GOLANGCI_LINT_VERSION) $(GO_BIN)/govulncheck: @echo "==> Installing govulncheck within "${GO_BIN}"" diff --git a/pkg/go/gen/OpenFGALexer.interp b/pkg/go/gen/OpenFGALexer.interp index 79d5cbb7..bfaefca8 100644 --- a/pkg/go/gen/OpenFGALexer.interp +++ b/pkg/go/gen/OpenFGALexer.interp @@ -53,6 +53,7 @@ null null null null +'$expression' null null null @@ -113,6 +114,7 @@ NUM_INT NUM_UINT STRING BYTES +DOLLAR_EXPRESSION EXTENDED_IDENTIFIER NEWLINE CONDITION_PARAM_CONTAINER @@ -181,6 +183,7 @@ NUM_INT NUM_UINT STRING BYTES +DOLLAR_EXPRESSION IDENTIFIER EXTENDED_IDENTIFIER NEWLINE @@ -204,4 +207,4 @@ DEFAULT_MODE CONDITION_DEF atn: -[4, 0, 57, 717, 6, -1, 6, -1, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 2, 41, 7, 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 2, 45, 7, 45, 2, 46, 7, 46, 2, 47, 7, 47, 2, 48, 7, 48, 2, 49, 7, 49, 2, 50, 7, 50, 2, 51, 7, 51, 2, 52, 7, 52, 2, 53, 7, 53, 2, 54, 7, 54, 2, 55, 7, 55, 2, 56, 7, 56, 2, 57, 7, 57, 2, 58, 7, 58, 2, 59, 7, 59, 2, 60, 7, 60, 2, 61, 7, 61, 2, 62, 7, 62, 2, 63, 7, 63, 2, 64, 7, 64, 2, 65, 7, 65, 2, 66, 7, 66, 2, 67, 7, 67, 2, 68, 7, 68, 2, 69, 7, 69, 2, 70, 7, 70, 2, 71, 7, 71, 2, 72, 7, 72, 2, 73, 7, 73, 2, 74, 7, 74, 1, 0, 1, 0, 1, 1, 1, 1, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 10, 4, 10, 200, 8, 10, 11, 10, 12, 10, 201, 1, 10, 1, 10, 4, 10, 206, 8, 10, 11, 10, 12, 10, 207, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 18, 1, 18, 1, 18, 1, 19, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 21, 1, 21, 1, 22, 1, 22, 1, 22, 1, 23, 1, 23, 1, 23, 1, 24, 1, 24, 1, 25, 1, 25, 1, 25, 1, 26, 1, 26, 1, 26, 1, 27, 1, 27, 1, 28, 1, 28, 1, 29, 1, 29, 1, 30, 1, 30, 1, 31, 1, 31, 1, 32, 1, 32, 1, 33, 1, 33, 1, 34, 1, 34, 1, 35, 1, 35, 1, 36, 1, 36, 1, 37, 1, 37, 1, 38, 1, 38, 1, 39, 1, 39, 1, 40, 1, 40, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 44, 1, 44, 1, 45, 1, 45, 1, 46, 1, 46, 1, 47, 1, 47, 3, 47, 342, 8, 47, 1, 47, 4, 47, 345, 8, 47, 11, 47, 12, 47, 346, 1, 48, 1, 48, 1, 49, 1, 49, 1, 50, 1, 50, 1, 50, 1, 50, 3, 50, 357, 8, 50, 1, 51, 1, 51, 1, 51, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 3, 54, 390, 8, 54, 1, 55, 4, 55, 393, 8, 55, 11, 55, 12, 55, 394, 1, 56, 1, 56, 1, 56, 1, 56, 5, 56, 401, 8, 56, 10, 56, 12, 56, 404, 9, 56, 1, 56, 1, 56, 1, 57, 4, 57, 409, 8, 57, 11, 57, 12, 57, 410, 1, 57, 1, 57, 4, 57, 415, 8, 57, 11, 57, 12, 57, 416, 1, 57, 3, 57, 420, 8, 57, 1, 57, 4, 57, 423, 8, 57, 11, 57, 12, 57, 424, 1, 57, 1, 57, 1, 57, 1, 57, 4, 57, 431, 8, 57, 11, 57, 12, 57, 432, 1, 57, 3, 57, 436, 8, 57, 3, 57, 438, 8, 57, 1, 58, 4, 58, 441, 8, 58, 11, 58, 12, 58, 442, 1, 58, 1, 58, 1, 58, 1, 58, 4, 58, 449, 8, 58, 11, 58, 12, 58, 450, 3, 58, 453, 8, 58, 1, 59, 4, 59, 456, 8, 59, 11, 59, 12, 59, 457, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 4, 59, 466, 8, 59, 11, 59, 12, 59, 467, 1, 59, 1, 59, 3, 59, 472, 8, 59, 1, 60, 1, 60, 1, 60, 5, 60, 477, 8, 60, 10, 60, 12, 60, 480, 9, 60, 1, 60, 1, 60, 1, 60, 1, 60, 5, 60, 486, 8, 60, 10, 60, 12, 60, 489, 9, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 5, 60, 498, 8, 60, 10, 60, 12, 60, 501, 9, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 5, 60, 512, 8, 60, 10, 60, 12, 60, 515, 9, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 5, 60, 523, 8, 60, 10, 60, 12, 60, 526, 9, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 5, 60, 533, 8, 60, 10, 60, 12, 60, 536, 9, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 5, 60, 546, 8, 60, 10, 60, 12, 60, 549, 9, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 5, 60, 561, 8, 60, 10, 60, 12, 60, 564, 9, 60, 1, 60, 1, 60, 1, 60, 1, 60, 3, 60, 570, 8, 60, 1, 61, 1, 61, 1, 61, 1, 62, 1, 62, 3, 62, 577, 8, 62, 1, 62, 1, 62, 1, 62, 1, 62, 5, 62, 583, 8, 62, 10, 62, 12, 62, 586, 9, 62, 1, 63, 1, 63, 3, 63, 590, 8, 63, 1, 63, 1, 63, 1, 63, 3, 63, 595, 8, 63, 1, 63, 1, 63, 1, 63, 4, 63, 600, 8, 63, 11, 63, 12, 63, 601, 5, 63, 604, 8, 63, 10, 63, 12, 63, 607, 9, 63, 1, 64, 3, 64, 610, 8, 64, 1, 64, 3, 64, 613, 8, 64, 1, 64, 1, 64, 3, 64, 617, 8, 64, 1, 64, 3, 64, 620, 8, 64, 1, 64, 3, 64, 623, 8, 64, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 3, 66, 637, 8, 66, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 3, 67, 688, 8, 67, 1, 68, 1, 68, 1, 68, 1, 68, 1, 69, 1, 69, 1, 69, 1, 69, 1, 70, 1, 70, 1, 70, 1, 70, 1, 71, 1, 71, 1, 71, 1, 71, 1, 72, 1, 72, 1, 72, 1, 72, 1, 73, 1, 73, 1, 73, 1, 73, 1, 74, 1, 74, 1, 74, 1, 74, 4, 499, 513, 547, 562, 0, 75, 2, 11, 4, 1, 6, 2, 8, 12, 10, 13, 12, 14, 14, 15, 16, 16, 18, 17, 20, 18, 22, 19, 24, 20, 26, 21, 28, 22, 30, 23, 32, 24, 34, 25, 36, 26, 38, 27, 40, 28, 42, 29, 44, 3, 46, 30, 48, 31, 50, 4, 52, 32, 54, 33, 56, 5, 58, 34, 60, 35, 62, 36, 64, 7, 66, 8, 68, 37, 70, 38, 72, 39, 74, 40, 76, 41, 78, 42, 80, 43, 82, 44, 84, 45, 86, 46, 88, 47, 90, 0, 92, 0, 94, 0, 96, 0, 98, 0, 100, 0, 102, 0, 104, 0, 106, 0, 108, 0, 110, 0, 112, 9, 114, 48, 116, 49, 118, 50, 120, 51, 122, 52, 124, 53, 126, 10, 128, 54, 130, 55, 132, 0, 134, 56, 136, 57, 138, 0, 140, 0, 142, 0, 144, 0, 146, 0, 148, 0, 150, 0, 2, 0, 1, 16, 2, 0, 65, 90, 97, 122, 2, 0, 69, 69, 101, 101, 2, 0, 43, 43, 45, 45, 3, 0, 48, 57, 65, 70, 97, 102, 2, 0, 82, 82, 114, 114, 10, 0, 34, 34, 39, 39, 63, 63, 92, 92, 96, 98, 102, 102, 110, 110, 114, 114, 116, 116, 118, 118, 2, 0, 88, 88, 120, 120, 3, 0, 9, 9, 12, 12, 32, 32, 1, 0, 10, 10, 2, 0, 85, 85, 117, 117, 4, 0, 10, 10, 13, 13, 34, 34, 92, 92, 4, 0, 10, 10, 13, 13, 39, 39, 92, 92, 1, 0, 92, 92, 3, 0, 10, 10, 13, 13, 34, 34, 3, 0, 10, 10, 13, 13, 39, 39, 2, 0, 66, 66, 98, 98, 773, 0, 2, 1, 0, 0, 0, 0, 4, 1, 0, 0, 0, 0, 6, 1, 0, 0, 0, 0, 8, 1, 0, 0, 0, 0, 10, 1, 0, 0, 0, 0, 12, 1, 0, 0, 0, 0, 14, 1, 0, 0, 0, 0, 16, 1, 0, 0, 0, 0, 18, 1, 0, 0, 0, 0, 20, 1, 0, 0, 0, 0, 22, 1, 0, 0, 0, 0, 24, 1, 0, 0, 0, 0, 26, 1, 0, 0, 0, 0, 28, 1, 0, 0, 0, 0, 30, 1, 0, 0, 0, 0, 32, 1, 0, 0, 0, 0, 34, 1, 0, 0, 0, 0, 36, 1, 0, 0, 0, 0, 38, 1, 0, 0, 0, 0, 40, 1, 0, 0, 0, 0, 42, 1, 0, 0, 0, 0, 44, 1, 0, 0, 0, 0, 46, 1, 0, 0, 0, 0, 48, 1, 0, 0, 0, 0, 50, 1, 0, 0, 0, 0, 52, 1, 0, 0, 0, 0, 54, 1, 0, 0, 0, 0, 56, 1, 0, 0, 0, 0, 58, 1, 0, 0, 0, 0, 60, 1, 0, 0, 0, 0, 62, 1, 0, 0, 0, 0, 64, 1, 0, 0, 0, 0, 66, 1, 0, 0, 0, 0, 68, 1, 0, 0, 0, 0, 70, 1, 0, 0, 0, 0, 72, 1, 0, 0, 0, 0, 74, 1, 0, 0, 0, 0, 76, 1, 0, 0, 0, 0, 78, 1, 0, 0, 0, 0, 80, 1, 0, 0, 0, 0, 82, 1, 0, 0, 0, 0, 84, 1, 0, 0, 0, 0, 86, 1, 0, 0, 0, 0, 88, 1, 0, 0, 0, 0, 112, 1, 0, 0, 0, 0, 114, 1, 0, 0, 0, 0, 116, 1, 0, 0, 0, 0, 118, 1, 0, 0, 0, 0, 120, 1, 0, 0, 0, 0, 122, 1, 0, 0, 0, 0, 124, 1, 0, 0, 0, 0, 126, 1, 0, 0, 0, 0, 128, 1, 0, 0, 0, 0, 130, 1, 0, 0, 0, 1, 132, 1, 0, 0, 0, 1, 134, 1, 0, 0, 0, 1, 136, 1, 0, 0, 0, 1, 138, 1, 0, 0, 0, 1, 140, 1, 0, 0, 0, 1, 142, 1, 0, 0, 0, 1, 144, 1, 0, 0, 0, 1, 146, 1, 0, 0, 0, 1, 148, 1, 0, 0, 0, 1, 150, 1, 0, 0, 0, 2, 152, 1, 0, 0, 0, 4, 154, 1, 0, 0, 0, 6, 156, 1, 0, 0, 0, 8, 158, 1, 0, 0, 0, 10, 162, 1, 0, 0, 0, 12, 165, 1, 0, 0, 0, 14, 173, 1, 0, 0, 0, 16, 178, 1, 0, 0, 0, 18, 185, 1, 0, 0, 0, 20, 191, 1, 0, 0, 0, 22, 199, 1, 0, 0, 0, 24, 209, 1, 0, 0, 0, 26, 216, 1, 0, 0, 0, 28, 221, 1, 0, 0, 0, 30, 233, 1, 0, 0, 0, 32, 243, 1, 0, 0, 0, 34, 252, 1, 0, 0, 0, 36, 259, 1, 0, 0, 0, 38, 264, 1, 0, 0, 0, 40, 267, 1, 0, 0, 0, 42, 270, 1, 0, 0, 0, 44, 273, 1, 0, 0, 0, 46, 275, 1, 0, 0, 0, 48, 278, 1, 0, 0, 0, 50, 281, 1, 0, 0, 0, 52, 283, 1, 0, 0, 0, 54, 286, 1, 0, 0, 0, 56, 289, 1, 0, 0, 0, 58, 291, 1, 0, 0, 0, 60, 293, 1, 0, 0, 0, 62, 295, 1, 0, 0, 0, 64, 297, 1, 0, 0, 0, 66, 299, 1, 0, 0, 0, 68, 301, 1, 0, 0, 0, 70, 303, 1, 0, 0, 0, 72, 305, 1, 0, 0, 0, 74, 307, 1, 0, 0, 0, 76, 309, 1, 0, 0, 0, 78, 311, 1, 0, 0, 0, 80, 313, 1, 0, 0, 0, 82, 315, 1, 0, 0, 0, 84, 317, 1, 0, 0, 0, 86, 322, 1, 0, 0, 0, 88, 328, 1, 0, 0, 0, 90, 333, 1, 0, 0, 0, 92, 335, 1, 0, 0, 0, 94, 337, 1, 0, 0, 0, 96, 339, 1, 0, 0, 0, 98, 348, 1, 0, 0, 0, 100, 350, 1, 0, 0, 0, 102, 356, 1, 0, 0, 0, 104, 358, 1, 0, 0, 0, 106, 361, 1, 0, 0, 0, 108, 366, 1, 0, 0, 0, 110, 389, 1, 0, 0, 0, 112, 392, 1, 0, 0, 0, 114, 396, 1, 0, 0, 0, 116, 437, 1, 0, 0, 0, 118, 452, 1, 0, 0, 0, 120, 471, 1, 0, 0, 0, 122, 569, 1, 0, 0, 0, 124, 571, 1, 0, 0, 0, 126, 576, 1, 0, 0, 0, 128, 589, 1, 0, 0, 0, 130, 609, 1, 0, 0, 0, 132, 624, 1, 0, 0, 0, 134, 636, 1, 0, 0, 0, 136, 687, 1, 0, 0, 0, 138, 689, 1, 0, 0, 0, 140, 693, 1, 0, 0, 0, 142, 697, 1, 0, 0, 0, 144, 701, 1, 0, 0, 0, 146, 705, 1, 0, 0, 0, 148, 709, 1, 0, 0, 0, 150, 713, 1, 0, 0, 0, 152, 153, 5, 35, 0, 0, 153, 3, 1, 0, 0, 0, 154, 155, 5, 58, 0, 0, 155, 5, 1, 0, 0, 0, 156, 157, 5, 44, 0, 0, 157, 7, 1, 0, 0, 0, 158, 159, 5, 97, 0, 0, 159, 160, 5, 110, 0, 0, 160, 161, 5, 100, 0, 0, 161, 9, 1, 0, 0, 0, 162, 163, 5, 111, 0, 0, 163, 164, 5, 114, 0, 0, 164, 11, 1, 0, 0, 0, 165, 166, 5, 98, 0, 0, 166, 167, 5, 117, 0, 0, 167, 168, 5, 116, 0, 0, 168, 169, 5, 32, 0, 0, 169, 170, 5, 110, 0, 0, 170, 171, 5, 111, 0, 0, 171, 172, 5, 116, 0, 0, 172, 13, 1, 0, 0, 0, 173, 174, 5, 102, 0, 0, 174, 175, 5, 114, 0, 0, 175, 176, 5, 111, 0, 0, 176, 177, 5, 109, 0, 0, 177, 15, 1, 0, 0, 0, 178, 179, 5, 109, 0, 0, 179, 180, 5, 111, 0, 0, 180, 181, 5, 100, 0, 0, 181, 182, 5, 117, 0, 0, 182, 183, 5, 108, 0, 0, 183, 184, 5, 101, 0, 0, 184, 17, 1, 0, 0, 0, 185, 186, 5, 109, 0, 0, 186, 187, 5, 111, 0, 0, 187, 188, 5, 100, 0, 0, 188, 189, 5, 101, 0, 0, 189, 190, 5, 108, 0, 0, 190, 19, 1, 0, 0, 0, 191, 192, 5, 115, 0, 0, 192, 193, 5, 99, 0, 0, 193, 194, 5, 104, 0, 0, 194, 195, 5, 101, 0, 0, 195, 196, 5, 109, 0, 0, 196, 197, 5, 97, 0, 0, 197, 21, 1, 0, 0, 0, 198, 200, 3, 94, 46, 0, 199, 198, 1, 0, 0, 0, 200, 201, 1, 0, 0, 0, 201, 199, 1, 0, 0, 0, 201, 202, 1, 0, 0, 0, 202, 203, 1, 0, 0, 0, 203, 205, 5, 46, 0, 0, 204, 206, 3, 94, 46, 0, 205, 204, 1, 0, 0, 0, 206, 207, 1, 0, 0, 0, 207, 205, 1, 0, 0, 0, 207, 208, 1, 0, 0, 0, 208, 23, 1, 0, 0, 0, 209, 210, 5, 101, 0, 0, 210, 211, 5, 120, 0, 0, 211, 212, 5, 116, 0, 0, 212, 213, 5, 101, 0, 0, 213, 214, 5, 110, 0, 0, 214, 215, 5, 100, 0, 0, 215, 25, 1, 0, 0, 0, 216, 217, 5, 116, 0, 0, 217, 218, 5, 121, 0, 0, 218, 219, 5, 112, 0, 0, 219, 220, 5, 101, 0, 0, 220, 27, 1, 0, 0, 0, 221, 222, 5, 99, 0, 0, 222, 223, 5, 111, 0, 0, 223, 224, 5, 110, 0, 0, 224, 225, 5, 100, 0, 0, 225, 226, 5, 105, 0, 0, 226, 227, 5, 116, 0, 0, 227, 228, 5, 105, 0, 0, 228, 229, 5, 111, 0, 0, 229, 230, 5, 110, 0, 0, 230, 231, 1, 0, 0, 0, 231, 232, 6, 13, 0, 0, 232, 29, 1, 0, 0, 0, 233, 234, 5, 114, 0, 0, 234, 235, 5, 101, 0, 0, 235, 236, 5, 108, 0, 0, 236, 237, 5, 97, 0, 0, 237, 238, 5, 116, 0, 0, 238, 239, 5, 105, 0, 0, 239, 240, 5, 111, 0, 0, 240, 241, 5, 110, 0, 0, 241, 242, 5, 115, 0, 0, 242, 31, 1, 0, 0, 0, 243, 244, 5, 114, 0, 0, 244, 245, 5, 101, 0, 0, 245, 246, 5, 108, 0, 0, 246, 247, 5, 97, 0, 0, 247, 248, 5, 116, 0, 0, 248, 249, 5, 105, 0, 0, 249, 250, 5, 111, 0, 0, 250, 251, 5, 110, 0, 0, 251, 33, 1, 0, 0, 0, 252, 253, 5, 100, 0, 0, 253, 254, 5, 101, 0, 0, 254, 255, 5, 102, 0, 0, 255, 256, 5, 105, 0, 0, 256, 257, 5, 110, 0, 0, 257, 258, 5, 101, 0, 0, 258, 35, 1, 0, 0, 0, 259, 260, 5, 119, 0, 0, 260, 261, 5, 105, 0, 0, 261, 262, 5, 116, 0, 0, 262, 263, 5, 104, 0, 0, 263, 37, 1, 0, 0, 0, 264, 265, 5, 61, 0, 0, 265, 266, 5, 61, 0, 0, 266, 39, 1, 0, 0, 0, 267, 268, 5, 33, 0, 0, 268, 269, 5, 61, 0, 0, 269, 41, 1, 0, 0, 0, 270, 271, 5, 105, 0, 0, 271, 272, 5, 110, 0, 0, 272, 43, 1, 0, 0, 0, 273, 274, 5, 60, 0, 0, 274, 45, 1, 0, 0, 0, 275, 276, 5, 60, 0, 0, 276, 277, 5, 61, 0, 0, 277, 47, 1, 0, 0, 0, 278, 279, 5, 62, 0, 0, 279, 280, 5, 61, 0, 0, 280, 49, 1, 0, 0, 0, 281, 282, 5, 62, 0, 0, 282, 51, 1, 0, 0, 0, 283, 284, 5, 38, 0, 0, 284, 285, 5, 38, 0, 0, 285, 53, 1, 0, 0, 0, 286, 287, 5, 124, 0, 0, 287, 288, 5, 124, 0, 0, 288, 55, 1, 0, 0, 0, 289, 290, 5, 91, 0, 0, 290, 57, 1, 0, 0, 0, 291, 292, 5, 93, 0, 0, 292, 59, 1, 0, 0, 0, 293, 294, 5, 123, 0, 0, 294, 61, 1, 0, 0, 0, 295, 296, 5, 125, 0, 0, 296, 63, 1, 0, 0, 0, 297, 298, 5, 40, 0, 0, 298, 65, 1, 0, 0, 0, 299, 300, 5, 41, 0, 0, 300, 67, 1, 0, 0, 0, 301, 302, 5, 46, 0, 0, 302, 69, 1, 0, 0, 0, 303, 304, 5, 45, 0, 0, 304, 71, 1, 0, 0, 0, 305, 306, 5, 33, 0, 0, 306, 73, 1, 0, 0, 0, 307, 308, 5, 63, 0, 0, 308, 75, 1, 0, 0, 0, 309, 310, 5, 43, 0, 0, 310, 77, 1, 0, 0, 0, 311, 312, 5, 42, 0, 0, 312, 79, 1, 0, 0, 0, 313, 314, 5, 47, 0, 0, 314, 81, 1, 0, 0, 0, 315, 316, 5, 37, 0, 0, 316, 83, 1, 0, 0, 0, 317, 318, 5, 116, 0, 0, 318, 319, 5, 114, 0, 0, 319, 320, 5, 117, 0, 0, 320, 321, 5, 101, 0, 0, 321, 85, 1, 0, 0, 0, 322, 323, 5, 102, 0, 0, 323, 324, 5, 97, 0, 0, 324, 325, 5, 108, 0, 0, 325, 326, 5, 115, 0, 0, 326, 327, 5, 101, 0, 0, 327, 87, 1, 0, 0, 0, 328, 329, 5, 110, 0, 0, 329, 330, 5, 117, 0, 0, 330, 331, 5, 108, 0, 0, 331, 332, 5, 108, 0, 0, 332, 89, 1, 0, 0, 0, 333, 334, 5, 92, 0, 0, 334, 91, 1, 0, 0, 0, 335, 336, 7, 0, 0, 0, 336, 93, 1, 0, 0, 0, 337, 338, 2, 48, 57, 0, 338, 95, 1, 0, 0, 0, 339, 341, 7, 1, 0, 0, 340, 342, 7, 2, 0, 0, 341, 340, 1, 0, 0, 0, 341, 342, 1, 0, 0, 0, 342, 344, 1, 0, 0, 0, 343, 345, 3, 94, 46, 0, 344, 343, 1, 0, 0, 0, 345, 346, 1, 0, 0, 0, 346, 344, 1, 0, 0, 0, 346, 347, 1, 0, 0, 0, 347, 97, 1, 0, 0, 0, 348, 349, 7, 3, 0, 0, 349, 99, 1, 0, 0, 0, 350, 351, 7, 4, 0, 0, 351, 101, 1, 0, 0, 0, 352, 357, 3, 104, 51, 0, 353, 357, 3, 108, 53, 0, 354, 357, 3, 110, 54, 0, 355, 357, 3, 106, 52, 0, 356, 352, 1, 0, 0, 0, 356, 353, 1, 0, 0, 0, 356, 354, 1, 0, 0, 0, 356, 355, 1, 0, 0, 0, 357, 103, 1, 0, 0, 0, 358, 359, 3, 90, 44, 0, 359, 360, 7, 5, 0, 0, 360, 105, 1, 0, 0, 0, 361, 362, 3, 90, 44, 0, 362, 363, 2, 48, 51, 0, 363, 364, 2, 48, 55, 0, 364, 365, 2, 48, 55, 0, 365, 107, 1, 0, 0, 0, 366, 367, 3, 90, 44, 0, 367, 368, 7, 6, 0, 0, 368, 369, 3, 98, 48, 0, 369, 370, 3, 98, 48, 0, 370, 109, 1, 0, 0, 0, 371, 372, 3, 90, 44, 0, 372, 373, 5, 117, 0, 0, 373, 374, 3, 98, 48, 0, 374, 375, 3, 98, 48, 0, 375, 376, 3, 98, 48, 0, 376, 377, 3, 98, 48, 0, 377, 390, 1, 0, 0, 0, 378, 379, 3, 90, 44, 0, 379, 380, 5, 85, 0, 0, 380, 381, 3, 98, 48, 0, 381, 382, 3, 98, 48, 0, 382, 383, 3, 98, 48, 0, 383, 384, 3, 98, 48, 0, 384, 385, 3, 98, 48, 0, 385, 386, 3, 98, 48, 0, 386, 387, 3, 98, 48, 0, 387, 388, 3, 98, 48, 0, 388, 390, 1, 0, 0, 0, 389, 371, 1, 0, 0, 0, 389, 378, 1, 0, 0, 0, 390, 111, 1, 0, 0, 0, 391, 393, 7, 7, 0, 0, 392, 391, 1, 0, 0, 0, 393, 394, 1, 0, 0, 0, 394, 392, 1, 0, 0, 0, 394, 395, 1, 0, 0, 0, 395, 113, 1, 0, 0, 0, 396, 397, 5, 47, 0, 0, 397, 398, 5, 47, 0, 0, 398, 402, 1, 0, 0, 0, 399, 401, 8, 8, 0, 0, 400, 399, 1, 0, 0, 0, 401, 404, 1, 0, 0, 0, 402, 400, 1, 0, 0, 0, 402, 403, 1, 0, 0, 0, 403, 405, 1, 0, 0, 0, 404, 402, 1, 0, 0, 0, 405, 406, 6, 56, 1, 0, 406, 115, 1, 0, 0, 0, 407, 409, 3, 94, 46, 0, 408, 407, 1, 0, 0, 0, 409, 410, 1, 0, 0, 0, 410, 408, 1, 0, 0, 0, 410, 411, 1, 0, 0, 0, 411, 412, 1, 0, 0, 0, 412, 414, 5, 46, 0, 0, 413, 415, 3, 94, 46, 0, 414, 413, 1, 0, 0, 0, 415, 416, 1, 0, 0, 0, 416, 414, 1, 0, 0, 0, 416, 417, 1, 0, 0, 0, 417, 419, 1, 0, 0, 0, 418, 420, 3, 96, 47, 0, 419, 418, 1, 0, 0, 0, 419, 420, 1, 0, 0, 0, 420, 438, 1, 0, 0, 0, 421, 423, 3, 94, 46, 0, 422, 421, 1, 0, 0, 0, 423, 424, 1, 0, 0, 0, 424, 422, 1, 0, 0, 0, 424, 425, 1, 0, 0, 0, 425, 426, 1, 0, 0, 0, 426, 427, 3, 96, 47, 0, 427, 438, 1, 0, 0, 0, 428, 430, 5, 46, 0, 0, 429, 431, 3, 94, 46, 0, 430, 429, 1, 0, 0, 0, 431, 432, 1, 0, 0, 0, 432, 430, 1, 0, 0, 0, 432, 433, 1, 0, 0, 0, 433, 435, 1, 0, 0, 0, 434, 436, 3, 96, 47, 0, 435, 434, 1, 0, 0, 0, 435, 436, 1, 0, 0, 0, 436, 438, 1, 0, 0, 0, 437, 408, 1, 0, 0, 0, 437, 422, 1, 0, 0, 0, 437, 428, 1, 0, 0, 0, 438, 117, 1, 0, 0, 0, 439, 441, 3, 94, 46, 0, 440, 439, 1, 0, 0, 0, 441, 442, 1, 0, 0, 0, 442, 440, 1, 0, 0, 0, 442, 443, 1, 0, 0, 0, 443, 453, 1, 0, 0, 0, 444, 445, 5, 48, 0, 0, 445, 446, 5, 120, 0, 0, 446, 448, 1, 0, 0, 0, 447, 449, 3, 98, 48, 0, 448, 447, 1, 0, 0, 0, 449, 450, 1, 0, 0, 0, 450, 448, 1, 0, 0, 0, 450, 451, 1, 0, 0, 0, 451, 453, 1, 0, 0, 0, 452, 440, 1, 0, 0, 0, 452, 444, 1, 0, 0, 0, 453, 119, 1, 0, 0, 0, 454, 456, 3, 94, 46, 0, 455, 454, 1, 0, 0, 0, 456, 457, 1, 0, 0, 0, 457, 455, 1, 0, 0, 0, 457, 458, 1, 0, 0, 0, 458, 459, 1, 0, 0, 0, 459, 460, 7, 9, 0, 0, 460, 472, 1, 0, 0, 0, 461, 462, 5, 48, 0, 0, 462, 463, 5, 120, 0, 0, 463, 465, 1, 0, 0, 0, 464, 466, 3, 98, 48, 0, 465, 464, 1, 0, 0, 0, 466, 467, 1, 0, 0, 0, 467, 465, 1, 0, 0, 0, 467, 468, 1, 0, 0, 0, 468, 469, 1, 0, 0, 0, 469, 470, 7, 9, 0, 0, 470, 472, 1, 0, 0, 0, 471, 455, 1, 0, 0, 0, 471, 461, 1, 0, 0, 0, 472, 121, 1, 0, 0, 0, 473, 478, 5, 34, 0, 0, 474, 477, 3, 102, 50, 0, 475, 477, 8, 10, 0, 0, 476, 474, 1, 0, 0, 0, 476, 475, 1, 0, 0, 0, 477, 480, 1, 0, 0, 0, 478, 476, 1, 0, 0, 0, 478, 479, 1, 0, 0, 0, 479, 481, 1, 0, 0, 0, 480, 478, 1, 0, 0, 0, 481, 570, 5, 34, 0, 0, 482, 487, 5, 39, 0, 0, 483, 486, 3, 102, 50, 0, 484, 486, 8, 11, 0, 0, 485, 483, 1, 0, 0, 0, 485, 484, 1, 0, 0, 0, 486, 489, 1, 0, 0, 0, 487, 485, 1, 0, 0, 0, 487, 488, 1, 0, 0, 0, 488, 490, 1, 0, 0, 0, 489, 487, 1, 0, 0, 0, 490, 570, 5, 39, 0, 0, 491, 492, 5, 34, 0, 0, 492, 493, 5, 34, 0, 0, 493, 494, 5, 34, 0, 0, 494, 499, 1, 0, 0, 0, 495, 498, 3, 102, 50, 0, 496, 498, 8, 12, 0, 0, 497, 495, 1, 0, 0, 0, 497, 496, 1, 0, 0, 0, 498, 501, 1, 0, 0, 0, 499, 500, 1, 0, 0, 0, 499, 497, 1, 0, 0, 0, 500, 502, 1, 0, 0, 0, 501, 499, 1, 0, 0, 0, 502, 503, 5, 34, 0, 0, 503, 504, 5, 34, 0, 0, 504, 570, 5, 34, 0, 0, 505, 506, 5, 39, 0, 0, 506, 507, 5, 39, 0, 0, 507, 508, 5, 39, 0, 0, 508, 513, 1, 0, 0, 0, 509, 512, 3, 102, 50, 0, 510, 512, 8, 12, 0, 0, 511, 509, 1, 0, 0, 0, 511, 510, 1, 0, 0, 0, 512, 515, 1, 0, 0, 0, 513, 514, 1, 0, 0, 0, 513, 511, 1, 0, 0, 0, 514, 516, 1, 0, 0, 0, 515, 513, 1, 0, 0, 0, 516, 517, 5, 39, 0, 0, 517, 518, 5, 39, 0, 0, 518, 570, 5, 39, 0, 0, 519, 520, 3, 100, 49, 0, 520, 524, 5, 34, 0, 0, 521, 523, 8, 13, 0, 0, 522, 521, 1, 0, 0, 0, 523, 526, 1, 0, 0, 0, 524, 522, 1, 0, 0, 0, 524, 525, 1, 0, 0, 0, 525, 527, 1, 0, 0, 0, 526, 524, 1, 0, 0, 0, 527, 528, 5, 34, 0, 0, 528, 570, 1, 0, 0, 0, 529, 530, 3, 100, 49, 0, 530, 534, 5, 39, 0, 0, 531, 533, 8, 14, 0, 0, 532, 531, 1, 0, 0, 0, 533, 536, 1, 0, 0, 0, 534, 532, 1, 0, 0, 0, 534, 535, 1, 0, 0, 0, 535, 537, 1, 0, 0, 0, 536, 534, 1, 0, 0, 0, 537, 538, 5, 39, 0, 0, 538, 570, 1, 0, 0, 0, 539, 540, 3, 100, 49, 0, 540, 541, 5, 34, 0, 0, 541, 542, 5, 34, 0, 0, 542, 543, 5, 34, 0, 0, 543, 547, 1, 0, 0, 0, 544, 546, 9, 0, 0, 0, 545, 544, 1, 0, 0, 0, 546, 549, 1, 0, 0, 0, 547, 548, 1, 0, 0, 0, 547, 545, 1, 0, 0, 0, 548, 550, 1, 0, 0, 0, 549, 547, 1, 0, 0, 0, 550, 551, 5, 34, 0, 0, 551, 552, 5, 34, 0, 0, 552, 553, 5, 34, 0, 0, 553, 570, 1, 0, 0, 0, 554, 555, 3, 100, 49, 0, 555, 556, 5, 39, 0, 0, 556, 557, 5, 39, 0, 0, 557, 558, 5, 39, 0, 0, 558, 562, 1, 0, 0, 0, 559, 561, 9, 0, 0, 0, 560, 559, 1, 0, 0, 0, 561, 564, 1, 0, 0, 0, 562, 563, 1, 0, 0, 0, 562, 560, 1, 0, 0, 0, 563, 565, 1, 0, 0, 0, 564, 562, 1, 0, 0, 0, 565, 566, 5, 39, 0, 0, 566, 567, 5, 39, 0, 0, 567, 568, 5, 39, 0, 0, 568, 570, 1, 0, 0, 0, 569, 473, 1, 0, 0, 0, 569, 482, 1, 0, 0, 0, 569, 491, 1, 0, 0, 0, 569, 505, 1, 0, 0, 0, 569, 519, 1, 0, 0, 0, 569, 529, 1, 0, 0, 0, 569, 539, 1, 0, 0, 0, 569, 554, 1, 0, 0, 0, 570, 123, 1, 0, 0, 0, 571, 572, 7, 15, 0, 0, 572, 573, 3, 122, 60, 0, 573, 125, 1, 0, 0, 0, 574, 577, 3, 92, 45, 0, 575, 577, 5, 95, 0, 0, 576, 574, 1, 0, 0, 0, 576, 575, 1, 0, 0, 0, 577, 584, 1, 0, 0, 0, 578, 583, 3, 92, 45, 0, 579, 583, 3, 94, 46, 0, 580, 583, 5, 95, 0, 0, 581, 583, 3, 70, 34, 0, 582, 578, 1, 0, 0, 0, 582, 579, 1, 0, 0, 0, 582, 580, 1, 0, 0, 0, 582, 581, 1, 0, 0, 0, 583, 586, 1, 0, 0, 0, 584, 582, 1, 0, 0, 0, 584, 585, 1, 0, 0, 0, 585, 127, 1, 0, 0, 0, 586, 584, 1, 0, 0, 0, 587, 590, 3, 92, 45, 0, 588, 590, 5, 95, 0, 0, 589, 587, 1, 0, 0, 0, 589, 588, 1, 0, 0, 0, 590, 605, 1, 0, 0, 0, 591, 595, 3, 80, 39, 0, 592, 595, 3, 68, 33, 0, 593, 595, 3, 70, 34, 0, 594, 591, 1, 0, 0, 0, 594, 592, 1, 0, 0, 0, 594, 593, 1, 0, 0, 0, 594, 595, 1, 0, 0, 0, 595, 599, 1, 0, 0, 0, 596, 600, 3, 92, 45, 0, 597, 600, 3, 94, 46, 0, 598, 600, 5, 95, 0, 0, 599, 596, 1, 0, 0, 0, 599, 597, 1, 0, 0, 0, 599, 598, 1, 0, 0, 0, 600, 601, 1, 0, 0, 0, 601, 599, 1, 0, 0, 0, 601, 602, 1, 0, 0, 0, 602, 604, 1, 0, 0, 0, 603, 594, 1, 0, 0, 0, 604, 607, 1, 0, 0, 0, 605, 603, 1, 0, 0, 0, 605, 606, 1, 0, 0, 0, 606, 129, 1, 0, 0, 0, 607, 605, 1, 0, 0, 0, 608, 610, 3, 112, 55, 0, 609, 608, 1, 0, 0, 0, 609, 610, 1, 0, 0, 0, 610, 616, 1, 0, 0, 0, 611, 613, 5, 13, 0, 0, 612, 611, 1, 0, 0, 0, 612, 613, 1, 0, 0, 0, 613, 614, 1, 0, 0, 0, 614, 617, 5, 10, 0, 0, 615, 617, 2, 12, 13, 0, 616, 612, 1, 0, 0, 0, 616, 615, 1, 0, 0, 0, 617, 619, 1, 0, 0, 0, 618, 620, 3, 112, 55, 0, 619, 618, 1, 0, 0, 0, 619, 620, 1, 0, 0, 0, 620, 622, 1, 0, 0, 0, 621, 623, 3, 130, 64, 0, 622, 621, 1, 0, 0, 0, 622, 623, 1, 0, 0, 0, 623, 131, 1, 0, 0, 0, 624, 625, 3, 66, 32, 0, 625, 626, 1, 0, 0, 0, 626, 627, 6, 65, 2, 0, 627, 628, 6, 65, 3, 0, 628, 133, 1, 0, 0, 0, 629, 630, 5, 109, 0, 0, 630, 631, 5, 97, 0, 0, 631, 637, 5, 112, 0, 0, 632, 633, 5, 108, 0, 0, 633, 634, 5, 105, 0, 0, 634, 635, 5, 115, 0, 0, 635, 637, 5, 116, 0, 0, 636, 629, 1, 0, 0, 0, 636, 632, 1, 0, 0, 0, 637, 135, 1, 0, 0, 0, 638, 639, 5, 98, 0, 0, 639, 640, 5, 111, 0, 0, 640, 641, 5, 111, 0, 0, 641, 688, 5, 108, 0, 0, 642, 643, 5, 115, 0, 0, 643, 644, 5, 116, 0, 0, 644, 645, 5, 114, 0, 0, 645, 646, 5, 105, 0, 0, 646, 647, 5, 110, 0, 0, 647, 688, 5, 103, 0, 0, 648, 649, 5, 105, 0, 0, 649, 650, 5, 110, 0, 0, 650, 688, 5, 116, 0, 0, 651, 652, 5, 117, 0, 0, 652, 653, 5, 105, 0, 0, 653, 654, 5, 110, 0, 0, 654, 688, 5, 116, 0, 0, 655, 656, 5, 100, 0, 0, 656, 657, 5, 111, 0, 0, 657, 658, 5, 117, 0, 0, 658, 659, 5, 98, 0, 0, 659, 660, 5, 108, 0, 0, 660, 688, 5, 101, 0, 0, 661, 662, 5, 100, 0, 0, 662, 663, 5, 117, 0, 0, 663, 664, 5, 114, 0, 0, 664, 665, 5, 97, 0, 0, 665, 666, 5, 116, 0, 0, 666, 667, 5, 105, 0, 0, 667, 668, 5, 111, 0, 0, 668, 688, 5, 110, 0, 0, 669, 670, 5, 116, 0, 0, 670, 671, 5, 105, 0, 0, 671, 672, 5, 109, 0, 0, 672, 673, 5, 101, 0, 0, 673, 674, 5, 115, 0, 0, 674, 675, 5, 116, 0, 0, 675, 676, 5, 97, 0, 0, 676, 677, 5, 109, 0, 0, 677, 688, 5, 112, 0, 0, 678, 679, 5, 105, 0, 0, 679, 680, 5, 112, 0, 0, 680, 681, 5, 97, 0, 0, 681, 682, 5, 100, 0, 0, 682, 683, 5, 100, 0, 0, 683, 684, 5, 114, 0, 0, 684, 685, 5, 101, 0, 0, 685, 686, 5, 115, 0, 0, 686, 688, 5, 115, 0, 0, 687, 638, 1, 0, 0, 0, 687, 642, 1, 0, 0, 0, 687, 648, 1, 0, 0, 0, 687, 651, 1, 0, 0, 0, 687, 655, 1, 0, 0, 0, 687, 661, 1, 0, 0, 0, 687, 669, 1, 0, 0, 0, 687, 678, 1, 0, 0, 0, 688, 137, 1, 0, 0, 0, 689, 690, 3, 44, 21, 0, 690, 691, 1, 0, 0, 0, 691, 692, 6, 68, 4, 0, 692, 139, 1, 0, 0, 0, 693, 694, 3, 50, 24, 0, 694, 695, 1, 0, 0, 0, 695, 696, 6, 69, 5, 0, 696, 141, 1, 0, 0, 0, 697, 698, 3, 64, 31, 0, 698, 699, 1, 0, 0, 0, 699, 700, 6, 70, 6, 0, 700, 143, 1, 0, 0, 0, 701, 702, 3, 4, 1, 0, 702, 703, 1, 0, 0, 0, 703, 704, 6, 71, 7, 0, 704, 145, 1, 0, 0, 0, 705, 706, 3, 6, 2, 0, 706, 707, 1, 0, 0, 0, 707, 708, 6, 72, 8, 0, 708, 147, 1, 0, 0, 0, 709, 710, 3, 112, 55, 0, 710, 711, 1, 0, 0, 0, 711, 712, 6, 73, 9, 0, 712, 149, 1, 0, 0, 0, 713, 714, 3, 126, 62, 0, 714, 715, 1, 0, 0, 0, 715, 716, 6, 74, 10, 0, 716, 151, 1, 0, 0, 0, 51, 0, 1, 201, 207, 341, 346, 356, 389, 394, 402, 410, 416, 419, 424, 432, 435, 437, 442, 450, 452, 457, 467, 471, 476, 478, 485, 487, 497, 499, 511, 513, 524, 534, 547, 562, 569, 576, 582, 584, 589, 594, 599, 601, 605, 609, 612, 616, 619, 622, 636, 687, 11, 5, 1, 0, 0, 1, 0, 7, 8, 0, 4, 0, 0, 7, 3, 0, 7, 4, 0, 7, 7, 0, 7, 1, 0, 7, 2, 0, 7, 9, 0, 7, 10, 0] \ No newline at end of file +[4, 0, 58, 731, 6, -1, 6, -1, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 2, 41, 7, 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 2, 45, 7, 45, 2, 46, 7, 46, 2, 47, 7, 47, 2, 48, 7, 48, 2, 49, 7, 49, 2, 50, 7, 50, 2, 51, 7, 51, 2, 52, 7, 52, 2, 53, 7, 53, 2, 54, 7, 54, 2, 55, 7, 55, 2, 56, 7, 56, 2, 57, 7, 57, 2, 58, 7, 58, 2, 59, 7, 59, 2, 60, 7, 60, 2, 61, 7, 61, 2, 62, 7, 62, 2, 63, 7, 63, 2, 64, 7, 64, 2, 65, 7, 65, 2, 66, 7, 66, 2, 67, 7, 67, 2, 68, 7, 68, 2, 69, 7, 69, 2, 70, 7, 70, 2, 71, 7, 71, 2, 72, 7, 72, 2, 73, 7, 73, 2, 74, 7, 74, 2, 75, 7, 75, 1, 0, 1, 0, 1, 1, 1, 1, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 10, 4, 10, 202, 8, 10, 11, 10, 12, 10, 203, 1, 10, 1, 10, 4, 10, 208, 8, 10, 11, 10, 12, 10, 209, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 18, 1, 18, 1, 18, 1, 19, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 21, 1, 21, 1, 22, 1, 22, 1, 22, 1, 23, 1, 23, 1, 23, 1, 24, 1, 24, 1, 25, 1, 25, 1, 25, 1, 26, 1, 26, 1, 26, 1, 27, 1, 27, 1, 28, 1, 28, 1, 29, 1, 29, 1, 30, 1, 30, 1, 31, 1, 31, 1, 32, 1, 32, 1, 33, 1, 33, 1, 34, 1, 34, 1, 35, 1, 35, 1, 36, 1, 36, 1, 37, 1, 37, 1, 38, 1, 38, 1, 39, 1, 39, 1, 40, 1, 40, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 44, 1, 44, 1, 45, 1, 45, 1, 46, 1, 46, 1, 47, 1, 47, 3, 47, 344, 8, 47, 1, 47, 4, 47, 347, 8, 47, 11, 47, 12, 47, 348, 1, 48, 1, 48, 1, 49, 1, 49, 1, 50, 1, 50, 1, 50, 1, 50, 3, 50, 359, 8, 50, 1, 51, 1, 51, 1, 51, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 3, 54, 392, 8, 54, 1, 55, 4, 55, 395, 8, 55, 11, 55, 12, 55, 396, 1, 56, 1, 56, 1, 56, 1, 56, 5, 56, 403, 8, 56, 10, 56, 12, 56, 406, 9, 56, 1, 56, 1, 56, 1, 57, 4, 57, 411, 8, 57, 11, 57, 12, 57, 412, 1, 57, 1, 57, 4, 57, 417, 8, 57, 11, 57, 12, 57, 418, 1, 57, 3, 57, 422, 8, 57, 1, 57, 4, 57, 425, 8, 57, 11, 57, 12, 57, 426, 1, 57, 1, 57, 1, 57, 1, 57, 4, 57, 433, 8, 57, 11, 57, 12, 57, 434, 1, 57, 3, 57, 438, 8, 57, 3, 57, 440, 8, 57, 1, 58, 4, 58, 443, 8, 58, 11, 58, 12, 58, 444, 1, 58, 1, 58, 1, 58, 1, 58, 4, 58, 451, 8, 58, 11, 58, 12, 58, 452, 3, 58, 455, 8, 58, 1, 59, 4, 59, 458, 8, 59, 11, 59, 12, 59, 459, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 4, 59, 468, 8, 59, 11, 59, 12, 59, 469, 1, 59, 1, 59, 3, 59, 474, 8, 59, 1, 60, 1, 60, 1, 60, 5, 60, 479, 8, 60, 10, 60, 12, 60, 482, 9, 60, 1, 60, 1, 60, 1, 60, 1, 60, 5, 60, 488, 8, 60, 10, 60, 12, 60, 491, 9, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 5, 60, 500, 8, 60, 10, 60, 12, 60, 503, 9, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 5, 60, 514, 8, 60, 10, 60, 12, 60, 517, 9, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 5, 60, 525, 8, 60, 10, 60, 12, 60, 528, 9, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 5, 60, 535, 8, 60, 10, 60, 12, 60, 538, 9, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 5, 60, 548, 8, 60, 10, 60, 12, 60, 551, 9, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 5, 60, 563, 8, 60, 10, 60, 12, 60, 566, 9, 60, 1, 60, 1, 60, 1, 60, 1, 60, 3, 60, 572, 8, 60, 1, 61, 1, 61, 1, 61, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 63, 1, 63, 3, 63, 591, 8, 63, 1, 63, 1, 63, 1, 63, 1, 63, 5, 63, 597, 8, 63, 10, 63, 12, 63, 600, 9, 63, 1, 64, 1, 64, 3, 64, 604, 8, 64, 1, 64, 1, 64, 1, 64, 3, 64, 609, 8, 64, 1, 64, 1, 64, 1, 64, 4, 64, 614, 8, 64, 11, 64, 12, 64, 615, 5, 64, 618, 8, 64, 10, 64, 12, 64, 621, 9, 64, 1, 65, 3, 65, 624, 8, 65, 1, 65, 3, 65, 627, 8, 65, 1, 65, 1, 65, 3, 65, 631, 8, 65, 1, 65, 3, 65, 634, 8, 65, 1, 65, 3, 65, 637, 8, 65, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 3, 67, 651, 8, 67, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 3, 68, 702, 8, 68, 1, 69, 1, 69, 1, 69, 1, 69, 1, 70, 1, 70, 1, 70, 1, 70, 1, 71, 1, 71, 1, 71, 1, 71, 1, 72, 1, 72, 1, 72, 1, 72, 1, 73, 1, 73, 1, 73, 1, 73, 1, 74, 1, 74, 1, 74, 1, 74, 1, 75, 1, 75, 1, 75, 1, 75, 4, 501, 515, 549, 564, 0, 76, 2, 11, 4, 1, 6, 2, 8, 12, 10, 13, 12, 14, 14, 15, 16, 16, 18, 17, 20, 18, 22, 19, 24, 20, 26, 21, 28, 22, 30, 23, 32, 24, 34, 25, 36, 26, 38, 27, 40, 28, 42, 29, 44, 3, 46, 30, 48, 31, 50, 4, 52, 32, 54, 33, 56, 5, 58, 34, 60, 35, 62, 36, 64, 7, 66, 8, 68, 37, 70, 38, 72, 39, 74, 40, 76, 41, 78, 42, 80, 43, 82, 44, 84, 45, 86, 46, 88, 47, 90, 0, 92, 0, 94, 0, 96, 0, 98, 0, 100, 0, 102, 0, 104, 0, 106, 0, 108, 0, 110, 0, 112, 9, 114, 48, 116, 49, 118, 50, 120, 51, 122, 52, 124, 53, 126, 54, 128, 10, 130, 55, 132, 56, 134, 0, 136, 57, 138, 58, 140, 0, 142, 0, 144, 0, 146, 0, 148, 0, 150, 0, 152, 0, 2, 0, 1, 16, 2, 0, 65, 90, 97, 122, 2, 0, 69, 69, 101, 101, 2, 0, 43, 43, 45, 45, 3, 0, 48, 57, 65, 70, 97, 102, 2, 0, 82, 82, 114, 114, 10, 0, 34, 34, 39, 39, 63, 63, 92, 92, 96, 98, 102, 102, 110, 110, 114, 114, 116, 116, 118, 118, 2, 0, 88, 88, 120, 120, 3, 0, 9, 9, 12, 12, 32, 32, 1, 0, 10, 10, 2, 0, 85, 85, 117, 117, 4, 0, 10, 10, 13, 13, 34, 34, 92, 92, 4, 0, 10, 10, 13, 13, 39, 39, 92, 92, 1, 0, 92, 92, 3, 0, 10, 10, 13, 13, 34, 34, 3, 0, 10, 10, 13, 13, 39, 39, 2, 0, 66, 66, 98, 98, 787, 0, 2, 1, 0, 0, 0, 0, 4, 1, 0, 0, 0, 0, 6, 1, 0, 0, 0, 0, 8, 1, 0, 0, 0, 0, 10, 1, 0, 0, 0, 0, 12, 1, 0, 0, 0, 0, 14, 1, 0, 0, 0, 0, 16, 1, 0, 0, 0, 0, 18, 1, 0, 0, 0, 0, 20, 1, 0, 0, 0, 0, 22, 1, 0, 0, 0, 0, 24, 1, 0, 0, 0, 0, 26, 1, 0, 0, 0, 0, 28, 1, 0, 0, 0, 0, 30, 1, 0, 0, 0, 0, 32, 1, 0, 0, 0, 0, 34, 1, 0, 0, 0, 0, 36, 1, 0, 0, 0, 0, 38, 1, 0, 0, 0, 0, 40, 1, 0, 0, 0, 0, 42, 1, 0, 0, 0, 0, 44, 1, 0, 0, 0, 0, 46, 1, 0, 0, 0, 0, 48, 1, 0, 0, 0, 0, 50, 1, 0, 0, 0, 0, 52, 1, 0, 0, 0, 0, 54, 1, 0, 0, 0, 0, 56, 1, 0, 0, 0, 0, 58, 1, 0, 0, 0, 0, 60, 1, 0, 0, 0, 0, 62, 1, 0, 0, 0, 0, 64, 1, 0, 0, 0, 0, 66, 1, 0, 0, 0, 0, 68, 1, 0, 0, 0, 0, 70, 1, 0, 0, 0, 0, 72, 1, 0, 0, 0, 0, 74, 1, 0, 0, 0, 0, 76, 1, 0, 0, 0, 0, 78, 1, 0, 0, 0, 0, 80, 1, 0, 0, 0, 0, 82, 1, 0, 0, 0, 0, 84, 1, 0, 0, 0, 0, 86, 1, 0, 0, 0, 0, 88, 1, 0, 0, 0, 0, 112, 1, 0, 0, 0, 0, 114, 1, 0, 0, 0, 0, 116, 1, 0, 0, 0, 0, 118, 1, 0, 0, 0, 0, 120, 1, 0, 0, 0, 0, 122, 1, 0, 0, 0, 0, 124, 1, 0, 0, 0, 0, 126, 1, 0, 0, 0, 0, 128, 1, 0, 0, 0, 0, 130, 1, 0, 0, 0, 0, 132, 1, 0, 0, 0, 1, 134, 1, 0, 0, 0, 1, 136, 1, 0, 0, 0, 1, 138, 1, 0, 0, 0, 1, 140, 1, 0, 0, 0, 1, 142, 1, 0, 0, 0, 1, 144, 1, 0, 0, 0, 1, 146, 1, 0, 0, 0, 1, 148, 1, 0, 0, 0, 1, 150, 1, 0, 0, 0, 1, 152, 1, 0, 0, 0, 2, 154, 1, 0, 0, 0, 4, 156, 1, 0, 0, 0, 6, 158, 1, 0, 0, 0, 8, 160, 1, 0, 0, 0, 10, 164, 1, 0, 0, 0, 12, 167, 1, 0, 0, 0, 14, 175, 1, 0, 0, 0, 16, 180, 1, 0, 0, 0, 18, 187, 1, 0, 0, 0, 20, 193, 1, 0, 0, 0, 22, 201, 1, 0, 0, 0, 24, 211, 1, 0, 0, 0, 26, 218, 1, 0, 0, 0, 28, 223, 1, 0, 0, 0, 30, 235, 1, 0, 0, 0, 32, 245, 1, 0, 0, 0, 34, 254, 1, 0, 0, 0, 36, 261, 1, 0, 0, 0, 38, 266, 1, 0, 0, 0, 40, 269, 1, 0, 0, 0, 42, 272, 1, 0, 0, 0, 44, 275, 1, 0, 0, 0, 46, 277, 1, 0, 0, 0, 48, 280, 1, 0, 0, 0, 50, 283, 1, 0, 0, 0, 52, 285, 1, 0, 0, 0, 54, 288, 1, 0, 0, 0, 56, 291, 1, 0, 0, 0, 58, 293, 1, 0, 0, 0, 60, 295, 1, 0, 0, 0, 62, 297, 1, 0, 0, 0, 64, 299, 1, 0, 0, 0, 66, 301, 1, 0, 0, 0, 68, 303, 1, 0, 0, 0, 70, 305, 1, 0, 0, 0, 72, 307, 1, 0, 0, 0, 74, 309, 1, 0, 0, 0, 76, 311, 1, 0, 0, 0, 78, 313, 1, 0, 0, 0, 80, 315, 1, 0, 0, 0, 82, 317, 1, 0, 0, 0, 84, 319, 1, 0, 0, 0, 86, 324, 1, 0, 0, 0, 88, 330, 1, 0, 0, 0, 90, 335, 1, 0, 0, 0, 92, 337, 1, 0, 0, 0, 94, 339, 1, 0, 0, 0, 96, 341, 1, 0, 0, 0, 98, 350, 1, 0, 0, 0, 100, 352, 1, 0, 0, 0, 102, 358, 1, 0, 0, 0, 104, 360, 1, 0, 0, 0, 106, 363, 1, 0, 0, 0, 108, 368, 1, 0, 0, 0, 110, 391, 1, 0, 0, 0, 112, 394, 1, 0, 0, 0, 114, 398, 1, 0, 0, 0, 116, 439, 1, 0, 0, 0, 118, 454, 1, 0, 0, 0, 120, 473, 1, 0, 0, 0, 122, 571, 1, 0, 0, 0, 124, 573, 1, 0, 0, 0, 126, 576, 1, 0, 0, 0, 128, 590, 1, 0, 0, 0, 130, 603, 1, 0, 0, 0, 132, 623, 1, 0, 0, 0, 134, 638, 1, 0, 0, 0, 136, 650, 1, 0, 0, 0, 138, 701, 1, 0, 0, 0, 140, 703, 1, 0, 0, 0, 142, 707, 1, 0, 0, 0, 144, 711, 1, 0, 0, 0, 146, 715, 1, 0, 0, 0, 148, 719, 1, 0, 0, 0, 150, 723, 1, 0, 0, 0, 152, 727, 1, 0, 0, 0, 154, 155, 5, 35, 0, 0, 155, 3, 1, 0, 0, 0, 156, 157, 5, 58, 0, 0, 157, 5, 1, 0, 0, 0, 158, 159, 5, 44, 0, 0, 159, 7, 1, 0, 0, 0, 160, 161, 5, 97, 0, 0, 161, 162, 5, 110, 0, 0, 162, 163, 5, 100, 0, 0, 163, 9, 1, 0, 0, 0, 164, 165, 5, 111, 0, 0, 165, 166, 5, 114, 0, 0, 166, 11, 1, 0, 0, 0, 167, 168, 5, 98, 0, 0, 168, 169, 5, 117, 0, 0, 169, 170, 5, 116, 0, 0, 170, 171, 5, 32, 0, 0, 171, 172, 5, 110, 0, 0, 172, 173, 5, 111, 0, 0, 173, 174, 5, 116, 0, 0, 174, 13, 1, 0, 0, 0, 175, 176, 5, 102, 0, 0, 176, 177, 5, 114, 0, 0, 177, 178, 5, 111, 0, 0, 178, 179, 5, 109, 0, 0, 179, 15, 1, 0, 0, 0, 180, 181, 5, 109, 0, 0, 181, 182, 5, 111, 0, 0, 182, 183, 5, 100, 0, 0, 183, 184, 5, 117, 0, 0, 184, 185, 5, 108, 0, 0, 185, 186, 5, 101, 0, 0, 186, 17, 1, 0, 0, 0, 187, 188, 5, 109, 0, 0, 188, 189, 5, 111, 0, 0, 189, 190, 5, 100, 0, 0, 190, 191, 5, 101, 0, 0, 191, 192, 5, 108, 0, 0, 192, 19, 1, 0, 0, 0, 193, 194, 5, 115, 0, 0, 194, 195, 5, 99, 0, 0, 195, 196, 5, 104, 0, 0, 196, 197, 5, 101, 0, 0, 197, 198, 5, 109, 0, 0, 198, 199, 5, 97, 0, 0, 199, 21, 1, 0, 0, 0, 200, 202, 3, 94, 46, 0, 201, 200, 1, 0, 0, 0, 202, 203, 1, 0, 0, 0, 203, 201, 1, 0, 0, 0, 203, 204, 1, 0, 0, 0, 204, 205, 1, 0, 0, 0, 205, 207, 5, 46, 0, 0, 206, 208, 3, 94, 46, 0, 207, 206, 1, 0, 0, 0, 208, 209, 1, 0, 0, 0, 209, 207, 1, 0, 0, 0, 209, 210, 1, 0, 0, 0, 210, 23, 1, 0, 0, 0, 211, 212, 5, 101, 0, 0, 212, 213, 5, 120, 0, 0, 213, 214, 5, 116, 0, 0, 214, 215, 5, 101, 0, 0, 215, 216, 5, 110, 0, 0, 216, 217, 5, 100, 0, 0, 217, 25, 1, 0, 0, 0, 218, 219, 5, 116, 0, 0, 219, 220, 5, 121, 0, 0, 220, 221, 5, 112, 0, 0, 221, 222, 5, 101, 0, 0, 222, 27, 1, 0, 0, 0, 223, 224, 5, 99, 0, 0, 224, 225, 5, 111, 0, 0, 225, 226, 5, 110, 0, 0, 226, 227, 5, 100, 0, 0, 227, 228, 5, 105, 0, 0, 228, 229, 5, 116, 0, 0, 229, 230, 5, 105, 0, 0, 230, 231, 5, 111, 0, 0, 231, 232, 5, 110, 0, 0, 232, 233, 1, 0, 0, 0, 233, 234, 6, 13, 0, 0, 234, 29, 1, 0, 0, 0, 235, 236, 5, 114, 0, 0, 236, 237, 5, 101, 0, 0, 237, 238, 5, 108, 0, 0, 238, 239, 5, 97, 0, 0, 239, 240, 5, 116, 0, 0, 240, 241, 5, 105, 0, 0, 241, 242, 5, 111, 0, 0, 242, 243, 5, 110, 0, 0, 243, 244, 5, 115, 0, 0, 244, 31, 1, 0, 0, 0, 245, 246, 5, 114, 0, 0, 246, 247, 5, 101, 0, 0, 247, 248, 5, 108, 0, 0, 248, 249, 5, 97, 0, 0, 249, 250, 5, 116, 0, 0, 250, 251, 5, 105, 0, 0, 251, 252, 5, 111, 0, 0, 252, 253, 5, 110, 0, 0, 253, 33, 1, 0, 0, 0, 254, 255, 5, 100, 0, 0, 255, 256, 5, 101, 0, 0, 256, 257, 5, 102, 0, 0, 257, 258, 5, 105, 0, 0, 258, 259, 5, 110, 0, 0, 259, 260, 5, 101, 0, 0, 260, 35, 1, 0, 0, 0, 261, 262, 5, 119, 0, 0, 262, 263, 5, 105, 0, 0, 263, 264, 5, 116, 0, 0, 264, 265, 5, 104, 0, 0, 265, 37, 1, 0, 0, 0, 266, 267, 5, 61, 0, 0, 267, 268, 5, 61, 0, 0, 268, 39, 1, 0, 0, 0, 269, 270, 5, 33, 0, 0, 270, 271, 5, 61, 0, 0, 271, 41, 1, 0, 0, 0, 272, 273, 5, 105, 0, 0, 273, 274, 5, 110, 0, 0, 274, 43, 1, 0, 0, 0, 275, 276, 5, 60, 0, 0, 276, 45, 1, 0, 0, 0, 277, 278, 5, 60, 0, 0, 278, 279, 5, 61, 0, 0, 279, 47, 1, 0, 0, 0, 280, 281, 5, 62, 0, 0, 281, 282, 5, 61, 0, 0, 282, 49, 1, 0, 0, 0, 283, 284, 5, 62, 0, 0, 284, 51, 1, 0, 0, 0, 285, 286, 5, 38, 0, 0, 286, 287, 5, 38, 0, 0, 287, 53, 1, 0, 0, 0, 288, 289, 5, 124, 0, 0, 289, 290, 5, 124, 0, 0, 290, 55, 1, 0, 0, 0, 291, 292, 5, 91, 0, 0, 292, 57, 1, 0, 0, 0, 293, 294, 5, 93, 0, 0, 294, 59, 1, 0, 0, 0, 295, 296, 5, 123, 0, 0, 296, 61, 1, 0, 0, 0, 297, 298, 5, 125, 0, 0, 298, 63, 1, 0, 0, 0, 299, 300, 5, 40, 0, 0, 300, 65, 1, 0, 0, 0, 301, 302, 5, 41, 0, 0, 302, 67, 1, 0, 0, 0, 303, 304, 5, 46, 0, 0, 304, 69, 1, 0, 0, 0, 305, 306, 5, 45, 0, 0, 306, 71, 1, 0, 0, 0, 307, 308, 5, 33, 0, 0, 308, 73, 1, 0, 0, 0, 309, 310, 5, 63, 0, 0, 310, 75, 1, 0, 0, 0, 311, 312, 5, 43, 0, 0, 312, 77, 1, 0, 0, 0, 313, 314, 5, 42, 0, 0, 314, 79, 1, 0, 0, 0, 315, 316, 5, 47, 0, 0, 316, 81, 1, 0, 0, 0, 317, 318, 5, 37, 0, 0, 318, 83, 1, 0, 0, 0, 319, 320, 5, 116, 0, 0, 320, 321, 5, 114, 0, 0, 321, 322, 5, 117, 0, 0, 322, 323, 5, 101, 0, 0, 323, 85, 1, 0, 0, 0, 324, 325, 5, 102, 0, 0, 325, 326, 5, 97, 0, 0, 326, 327, 5, 108, 0, 0, 327, 328, 5, 115, 0, 0, 328, 329, 5, 101, 0, 0, 329, 87, 1, 0, 0, 0, 330, 331, 5, 110, 0, 0, 331, 332, 5, 117, 0, 0, 332, 333, 5, 108, 0, 0, 333, 334, 5, 108, 0, 0, 334, 89, 1, 0, 0, 0, 335, 336, 5, 92, 0, 0, 336, 91, 1, 0, 0, 0, 337, 338, 7, 0, 0, 0, 338, 93, 1, 0, 0, 0, 339, 340, 2, 48, 57, 0, 340, 95, 1, 0, 0, 0, 341, 343, 7, 1, 0, 0, 342, 344, 7, 2, 0, 0, 343, 342, 1, 0, 0, 0, 343, 344, 1, 0, 0, 0, 344, 346, 1, 0, 0, 0, 345, 347, 3, 94, 46, 0, 346, 345, 1, 0, 0, 0, 347, 348, 1, 0, 0, 0, 348, 346, 1, 0, 0, 0, 348, 349, 1, 0, 0, 0, 349, 97, 1, 0, 0, 0, 350, 351, 7, 3, 0, 0, 351, 99, 1, 0, 0, 0, 352, 353, 7, 4, 0, 0, 353, 101, 1, 0, 0, 0, 354, 359, 3, 104, 51, 0, 355, 359, 3, 108, 53, 0, 356, 359, 3, 110, 54, 0, 357, 359, 3, 106, 52, 0, 358, 354, 1, 0, 0, 0, 358, 355, 1, 0, 0, 0, 358, 356, 1, 0, 0, 0, 358, 357, 1, 0, 0, 0, 359, 103, 1, 0, 0, 0, 360, 361, 3, 90, 44, 0, 361, 362, 7, 5, 0, 0, 362, 105, 1, 0, 0, 0, 363, 364, 3, 90, 44, 0, 364, 365, 2, 48, 51, 0, 365, 366, 2, 48, 55, 0, 366, 367, 2, 48, 55, 0, 367, 107, 1, 0, 0, 0, 368, 369, 3, 90, 44, 0, 369, 370, 7, 6, 0, 0, 370, 371, 3, 98, 48, 0, 371, 372, 3, 98, 48, 0, 372, 109, 1, 0, 0, 0, 373, 374, 3, 90, 44, 0, 374, 375, 5, 117, 0, 0, 375, 376, 3, 98, 48, 0, 376, 377, 3, 98, 48, 0, 377, 378, 3, 98, 48, 0, 378, 379, 3, 98, 48, 0, 379, 392, 1, 0, 0, 0, 380, 381, 3, 90, 44, 0, 381, 382, 5, 85, 0, 0, 382, 383, 3, 98, 48, 0, 383, 384, 3, 98, 48, 0, 384, 385, 3, 98, 48, 0, 385, 386, 3, 98, 48, 0, 386, 387, 3, 98, 48, 0, 387, 388, 3, 98, 48, 0, 388, 389, 3, 98, 48, 0, 389, 390, 3, 98, 48, 0, 390, 392, 1, 0, 0, 0, 391, 373, 1, 0, 0, 0, 391, 380, 1, 0, 0, 0, 392, 111, 1, 0, 0, 0, 393, 395, 7, 7, 0, 0, 394, 393, 1, 0, 0, 0, 395, 396, 1, 0, 0, 0, 396, 394, 1, 0, 0, 0, 396, 397, 1, 0, 0, 0, 397, 113, 1, 0, 0, 0, 398, 399, 5, 47, 0, 0, 399, 400, 5, 47, 0, 0, 400, 404, 1, 0, 0, 0, 401, 403, 8, 8, 0, 0, 402, 401, 1, 0, 0, 0, 403, 406, 1, 0, 0, 0, 404, 402, 1, 0, 0, 0, 404, 405, 1, 0, 0, 0, 405, 407, 1, 0, 0, 0, 406, 404, 1, 0, 0, 0, 407, 408, 6, 56, 1, 0, 408, 115, 1, 0, 0, 0, 409, 411, 3, 94, 46, 0, 410, 409, 1, 0, 0, 0, 411, 412, 1, 0, 0, 0, 412, 410, 1, 0, 0, 0, 412, 413, 1, 0, 0, 0, 413, 414, 1, 0, 0, 0, 414, 416, 5, 46, 0, 0, 415, 417, 3, 94, 46, 0, 416, 415, 1, 0, 0, 0, 417, 418, 1, 0, 0, 0, 418, 416, 1, 0, 0, 0, 418, 419, 1, 0, 0, 0, 419, 421, 1, 0, 0, 0, 420, 422, 3, 96, 47, 0, 421, 420, 1, 0, 0, 0, 421, 422, 1, 0, 0, 0, 422, 440, 1, 0, 0, 0, 423, 425, 3, 94, 46, 0, 424, 423, 1, 0, 0, 0, 425, 426, 1, 0, 0, 0, 426, 424, 1, 0, 0, 0, 426, 427, 1, 0, 0, 0, 427, 428, 1, 0, 0, 0, 428, 429, 3, 96, 47, 0, 429, 440, 1, 0, 0, 0, 430, 432, 5, 46, 0, 0, 431, 433, 3, 94, 46, 0, 432, 431, 1, 0, 0, 0, 433, 434, 1, 0, 0, 0, 434, 432, 1, 0, 0, 0, 434, 435, 1, 0, 0, 0, 435, 437, 1, 0, 0, 0, 436, 438, 3, 96, 47, 0, 437, 436, 1, 0, 0, 0, 437, 438, 1, 0, 0, 0, 438, 440, 1, 0, 0, 0, 439, 410, 1, 0, 0, 0, 439, 424, 1, 0, 0, 0, 439, 430, 1, 0, 0, 0, 440, 117, 1, 0, 0, 0, 441, 443, 3, 94, 46, 0, 442, 441, 1, 0, 0, 0, 443, 444, 1, 0, 0, 0, 444, 442, 1, 0, 0, 0, 444, 445, 1, 0, 0, 0, 445, 455, 1, 0, 0, 0, 446, 447, 5, 48, 0, 0, 447, 448, 5, 120, 0, 0, 448, 450, 1, 0, 0, 0, 449, 451, 3, 98, 48, 0, 450, 449, 1, 0, 0, 0, 451, 452, 1, 0, 0, 0, 452, 450, 1, 0, 0, 0, 452, 453, 1, 0, 0, 0, 453, 455, 1, 0, 0, 0, 454, 442, 1, 0, 0, 0, 454, 446, 1, 0, 0, 0, 455, 119, 1, 0, 0, 0, 456, 458, 3, 94, 46, 0, 457, 456, 1, 0, 0, 0, 458, 459, 1, 0, 0, 0, 459, 457, 1, 0, 0, 0, 459, 460, 1, 0, 0, 0, 460, 461, 1, 0, 0, 0, 461, 462, 7, 9, 0, 0, 462, 474, 1, 0, 0, 0, 463, 464, 5, 48, 0, 0, 464, 465, 5, 120, 0, 0, 465, 467, 1, 0, 0, 0, 466, 468, 3, 98, 48, 0, 467, 466, 1, 0, 0, 0, 468, 469, 1, 0, 0, 0, 469, 467, 1, 0, 0, 0, 469, 470, 1, 0, 0, 0, 470, 471, 1, 0, 0, 0, 471, 472, 7, 9, 0, 0, 472, 474, 1, 0, 0, 0, 473, 457, 1, 0, 0, 0, 473, 463, 1, 0, 0, 0, 474, 121, 1, 0, 0, 0, 475, 480, 5, 34, 0, 0, 476, 479, 3, 102, 50, 0, 477, 479, 8, 10, 0, 0, 478, 476, 1, 0, 0, 0, 478, 477, 1, 0, 0, 0, 479, 482, 1, 0, 0, 0, 480, 478, 1, 0, 0, 0, 480, 481, 1, 0, 0, 0, 481, 483, 1, 0, 0, 0, 482, 480, 1, 0, 0, 0, 483, 572, 5, 34, 0, 0, 484, 489, 5, 39, 0, 0, 485, 488, 3, 102, 50, 0, 486, 488, 8, 11, 0, 0, 487, 485, 1, 0, 0, 0, 487, 486, 1, 0, 0, 0, 488, 491, 1, 0, 0, 0, 489, 487, 1, 0, 0, 0, 489, 490, 1, 0, 0, 0, 490, 492, 1, 0, 0, 0, 491, 489, 1, 0, 0, 0, 492, 572, 5, 39, 0, 0, 493, 494, 5, 34, 0, 0, 494, 495, 5, 34, 0, 0, 495, 496, 5, 34, 0, 0, 496, 501, 1, 0, 0, 0, 497, 500, 3, 102, 50, 0, 498, 500, 8, 12, 0, 0, 499, 497, 1, 0, 0, 0, 499, 498, 1, 0, 0, 0, 500, 503, 1, 0, 0, 0, 501, 502, 1, 0, 0, 0, 501, 499, 1, 0, 0, 0, 502, 504, 1, 0, 0, 0, 503, 501, 1, 0, 0, 0, 504, 505, 5, 34, 0, 0, 505, 506, 5, 34, 0, 0, 506, 572, 5, 34, 0, 0, 507, 508, 5, 39, 0, 0, 508, 509, 5, 39, 0, 0, 509, 510, 5, 39, 0, 0, 510, 515, 1, 0, 0, 0, 511, 514, 3, 102, 50, 0, 512, 514, 8, 12, 0, 0, 513, 511, 1, 0, 0, 0, 513, 512, 1, 0, 0, 0, 514, 517, 1, 0, 0, 0, 515, 516, 1, 0, 0, 0, 515, 513, 1, 0, 0, 0, 516, 518, 1, 0, 0, 0, 517, 515, 1, 0, 0, 0, 518, 519, 5, 39, 0, 0, 519, 520, 5, 39, 0, 0, 520, 572, 5, 39, 0, 0, 521, 522, 3, 100, 49, 0, 522, 526, 5, 34, 0, 0, 523, 525, 8, 13, 0, 0, 524, 523, 1, 0, 0, 0, 525, 528, 1, 0, 0, 0, 526, 524, 1, 0, 0, 0, 526, 527, 1, 0, 0, 0, 527, 529, 1, 0, 0, 0, 528, 526, 1, 0, 0, 0, 529, 530, 5, 34, 0, 0, 530, 572, 1, 0, 0, 0, 531, 532, 3, 100, 49, 0, 532, 536, 5, 39, 0, 0, 533, 535, 8, 14, 0, 0, 534, 533, 1, 0, 0, 0, 535, 538, 1, 0, 0, 0, 536, 534, 1, 0, 0, 0, 536, 537, 1, 0, 0, 0, 537, 539, 1, 0, 0, 0, 538, 536, 1, 0, 0, 0, 539, 540, 5, 39, 0, 0, 540, 572, 1, 0, 0, 0, 541, 542, 3, 100, 49, 0, 542, 543, 5, 34, 0, 0, 543, 544, 5, 34, 0, 0, 544, 545, 5, 34, 0, 0, 545, 549, 1, 0, 0, 0, 546, 548, 9, 0, 0, 0, 547, 546, 1, 0, 0, 0, 548, 551, 1, 0, 0, 0, 549, 550, 1, 0, 0, 0, 549, 547, 1, 0, 0, 0, 550, 552, 1, 0, 0, 0, 551, 549, 1, 0, 0, 0, 552, 553, 5, 34, 0, 0, 553, 554, 5, 34, 0, 0, 554, 555, 5, 34, 0, 0, 555, 572, 1, 0, 0, 0, 556, 557, 3, 100, 49, 0, 557, 558, 5, 39, 0, 0, 558, 559, 5, 39, 0, 0, 559, 560, 5, 39, 0, 0, 560, 564, 1, 0, 0, 0, 561, 563, 9, 0, 0, 0, 562, 561, 1, 0, 0, 0, 563, 566, 1, 0, 0, 0, 564, 565, 1, 0, 0, 0, 564, 562, 1, 0, 0, 0, 565, 567, 1, 0, 0, 0, 566, 564, 1, 0, 0, 0, 567, 568, 5, 39, 0, 0, 568, 569, 5, 39, 0, 0, 569, 570, 5, 39, 0, 0, 570, 572, 1, 0, 0, 0, 571, 475, 1, 0, 0, 0, 571, 484, 1, 0, 0, 0, 571, 493, 1, 0, 0, 0, 571, 507, 1, 0, 0, 0, 571, 521, 1, 0, 0, 0, 571, 531, 1, 0, 0, 0, 571, 541, 1, 0, 0, 0, 571, 556, 1, 0, 0, 0, 572, 123, 1, 0, 0, 0, 573, 574, 7, 15, 0, 0, 574, 575, 3, 122, 60, 0, 575, 125, 1, 0, 0, 0, 576, 577, 5, 36, 0, 0, 577, 578, 5, 101, 0, 0, 578, 579, 5, 120, 0, 0, 579, 580, 5, 112, 0, 0, 580, 581, 5, 114, 0, 0, 581, 582, 5, 101, 0, 0, 582, 583, 5, 115, 0, 0, 583, 584, 5, 115, 0, 0, 584, 585, 5, 105, 0, 0, 585, 586, 5, 111, 0, 0, 586, 587, 5, 110, 0, 0, 587, 127, 1, 0, 0, 0, 588, 591, 3, 92, 45, 0, 589, 591, 5, 95, 0, 0, 590, 588, 1, 0, 0, 0, 590, 589, 1, 0, 0, 0, 591, 598, 1, 0, 0, 0, 592, 597, 3, 92, 45, 0, 593, 597, 3, 94, 46, 0, 594, 597, 5, 95, 0, 0, 595, 597, 3, 70, 34, 0, 596, 592, 1, 0, 0, 0, 596, 593, 1, 0, 0, 0, 596, 594, 1, 0, 0, 0, 596, 595, 1, 0, 0, 0, 597, 600, 1, 0, 0, 0, 598, 596, 1, 0, 0, 0, 598, 599, 1, 0, 0, 0, 599, 129, 1, 0, 0, 0, 600, 598, 1, 0, 0, 0, 601, 604, 3, 92, 45, 0, 602, 604, 5, 95, 0, 0, 603, 601, 1, 0, 0, 0, 603, 602, 1, 0, 0, 0, 604, 619, 1, 0, 0, 0, 605, 609, 3, 80, 39, 0, 606, 609, 3, 68, 33, 0, 607, 609, 3, 70, 34, 0, 608, 605, 1, 0, 0, 0, 608, 606, 1, 0, 0, 0, 608, 607, 1, 0, 0, 0, 608, 609, 1, 0, 0, 0, 609, 613, 1, 0, 0, 0, 610, 614, 3, 92, 45, 0, 611, 614, 3, 94, 46, 0, 612, 614, 5, 95, 0, 0, 613, 610, 1, 0, 0, 0, 613, 611, 1, 0, 0, 0, 613, 612, 1, 0, 0, 0, 614, 615, 1, 0, 0, 0, 615, 613, 1, 0, 0, 0, 615, 616, 1, 0, 0, 0, 616, 618, 1, 0, 0, 0, 617, 608, 1, 0, 0, 0, 618, 621, 1, 0, 0, 0, 619, 617, 1, 0, 0, 0, 619, 620, 1, 0, 0, 0, 620, 131, 1, 0, 0, 0, 621, 619, 1, 0, 0, 0, 622, 624, 3, 112, 55, 0, 623, 622, 1, 0, 0, 0, 623, 624, 1, 0, 0, 0, 624, 630, 1, 0, 0, 0, 625, 627, 5, 13, 0, 0, 626, 625, 1, 0, 0, 0, 626, 627, 1, 0, 0, 0, 627, 628, 1, 0, 0, 0, 628, 631, 5, 10, 0, 0, 629, 631, 2, 12, 13, 0, 630, 626, 1, 0, 0, 0, 630, 629, 1, 0, 0, 0, 631, 633, 1, 0, 0, 0, 632, 634, 3, 112, 55, 0, 633, 632, 1, 0, 0, 0, 633, 634, 1, 0, 0, 0, 634, 636, 1, 0, 0, 0, 635, 637, 3, 132, 65, 0, 636, 635, 1, 0, 0, 0, 636, 637, 1, 0, 0, 0, 637, 133, 1, 0, 0, 0, 638, 639, 3, 66, 32, 0, 639, 640, 1, 0, 0, 0, 640, 641, 6, 66, 2, 0, 641, 642, 6, 66, 3, 0, 642, 135, 1, 0, 0, 0, 643, 644, 5, 109, 0, 0, 644, 645, 5, 97, 0, 0, 645, 651, 5, 112, 0, 0, 646, 647, 5, 108, 0, 0, 647, 648, 5, 105, 0, 0, 648, 649, 5, 115, 0, 0, 649, 651, 5, 116, 0, 0, 650, 643, 1, 0, 0, 0, 650, 646, 1, 0, 0, 0, 651, 137, 1, 0, 0, 0, 652, 653, 5, 98, 0, 0, 653, 654, 5, 111, 0, 0, 654, 655, 5, 111, 0, 0, 655, 702, 5, 108, 0, 0, 656, 657, 5, 115, 0, 0, 657, 658, 5, 116, 0, 0, 658, 659, 5, 114, 0, 0, 659, 660, 5, 105, 0, 0, 660, 661, 5, 110, 0, 0, 661, 702, 5, 103, 0, 0, 662, 663, 5, 105, 0, 0, 663, 664, 5, 110, 0, 0, 664, 702, 5, 116, 0, 0, 665, 666, 5, 117, 0, 0, 666, 667, 5, 105, 0, 0, 667, 668, 5, 110, 0, 0, 668, 702, 5, 116, 0, 0, 669, 670, 5, 100, 0, 0, 670, 671, 5, 111, 0, 0, 671, 672, 5, 117, 0, 0, 672, 673, 5, 98, 0, 0, 673, 674, 5, 108, 0, 0, 674, 702, 5, 101, 0, 0, 675, 676, 5, 100, 0, 0, 676, 677, 5, 117, 0, 0, 677, 678, 5, 114, 0, 0, 678, 679, 5, 97, 0, 0, 679, 680, 5, 116, 0, 0, 680, 681, 5, 105, 0, 0, 681, 682, 5, 111, 0, 0, 682, 702, 5, 110, 0, 0, 683, 684, 5, 116, 0, 0, 684, 685, 5, 105, 0, 0, 685, 686, 5, 109, 0, 0, 686, 687, 5, 101, 0, 0, 687, 688, 5, 115, 0, 0, 688, 689, 5, 116, 0, 0, 689, 690, 5, 97, 0, 0, 690, 691, 5, 109, 0, 0, 691, 702, 5, 112, 0, 0, 692, 693, 5, 105, 0, 0, 693, 694, 5, 112, 0, 0, 694, 695, 5, 97, 0, 0, 695, 696, 5, 100, 0, 0, 696, 697, 5, 100, 0, 0, 697, 698, 5, 114, 0, 0, 698, 699, 5, 101, 0, 0, 699, 700, 5, 115, 0, 0, 700, 702, 5, 115, 0, 0, 701, 652, 1, 0, 0, 0, 701, 656, 1, 0, 0, 0, 701, 662, 1, 0, 0, 0, 701, 665, 1, 0, 0, 0, 701, 669, 1, 0, 0, 0, 701, 675, 1, 0, 0, 0, 701, 683, 1, 0, 0, 0, 701, 692, 1, 0, 0, 0, 702, 139, 1, 0, 0, 0, 703, 704, 3, 44, 21, 0, 704, 705, 1, 0, 0, 0, 705, 706, 6, 69, 4, 0, 706, 141, 1, 0, 0, 0, 707, 708, 3, 50, 24, 0, 708, 709, 1, 0, 0, 0, 709, 710, 6, 70, 5, 0, 710, 143, 1, 0, 0, 0, 711, 712, 3, 64, 31, 0, 712, 713, 1, 0, 0, 0, 713, 714, 6, 71, 6, 0, 714, 145, 1, 0, 0, 0, 715, 716, 3, 4, 1, 0, 716, 717, 1, 0, 0, 0, 717, 718, 6, 72, 7, 0, 718, 147, 1, 0, 0, 0, 719, 720, 3, 6, 2, 0, 720, 721, 1, 0, 0, 0, 721, 722, 6, 73, 8, 0, 722, 149, 1, 0, 0, 0, 723, 724, 3, 112, 55, 0, 724, 725, 1, 0, 0, 0, 725, 726, 6, 74, 9, 0, 726, 151, 1, 0, 0, 0, 727, 728, 3, 128, 63, 0, 728, 729, 1, 0, 0, 0, 729, 730, 6, 75, 10, 0, 730, 153, 1, 0, 0, 0, 51, 0, 1, 203, 209, 343, 348, 358, 391, 396, 404, 412, 418, 421, 426, 434, 437, 439, 444, 452, 454, 459, 469, 473, 478, 480, 487, 489, 499, 501, 513, 515, 526, 536, 549, 564, 571, 590, 596, 598, 603, 608, 613, 615, 619, 623, 626, 630, 633, 636, 650, 701, 11, 5, 1, 0, 0, 1, 0, 7, 8, 0, 4, 0, 0, 7, 3, 0, 7, 4, 0, 7, 7, 0, 7, 1, 0, 7, 2, 0, 7, 9, 0, 7, 10, 0] \ No newline at end of file diff --git a/pkg/go/gen/OpenFGALexer.tokens b/pkg/go/gen/OpenFGALexer.tokens index 512cec30..b2523ac8 100644 --- a/pkg/go/gen/OpenFGALexer.tokens +++ b/pkg/go/gen/OpenFGALexer.tokens @@ -51,10 +51,11 @@ NUM_INT=50 NUM_UINT=51 STRING=52 BYTES=53 -EXTENDED_IDENTIFIER=54 -NEWLINE=55 -CONDITION_PARAM_CONTAINER=56 -CONDITION_PARAM_TYPE=57 +DOLLAR_EXPRESSION=54 +EXTENDED_IDENTIFIER=55 +NEWLINE=56 +CONDITION_PARAM_CONTAINER=57 +CONDITION_PARAM_TYPE=58 '#'=11 ':'=1 ','=2 @@ -98,3 +99,4 @@ CONDITION_PARAM_TYPE=57 'true'=45 'false'=46 'null'=47 +'$expression'=54 diff --git a/pkg/go/gen/OpenFGAParser.interp b/pkg/go/gen/OpenFGAParser.interp index 56431d97..fffd3847 100644 --- a/pkg/go/gen/OpenFGAParser.interp +++ b/pkg/go/gen/OpenFGAParser.interp @@ -53,6 +53,7 @@ null null null null +'$expression' null null null @@ -113,6 +114,7 @@ NUM_INT NUM_UINT STRING BYTES +DOLLAR_EXPRESSION EXTENDED_IDENTIFIER NEWLINE CONDITION_PARAM_CONTAINER @@ -149,4 +151,4 @@ conditionExpression atn: -[4, 1, 57, 392, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 1, 0, 3, 0, 56, 8, 0, 1, 0, 3, 0, 59, 8, 0, 1, 0, 1, 0, 3, 0, 63, 8, 0, 1, 0, 3, 0, 66, 8, 0, 1, 0, 1, 0, 3, 0, 70, 8, 0, 1, 0, 1, 0, 3, 0, 74, 8, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 3, 1, 81, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 89, 8, 1, 1, 2, 1, 2, 1, 2, 3, 2, 94, 8, 2, 1, 2, 1, 2, 1, 2, 1, 2, 3, 2, 100, 8, 2, 1, 3, 5, 3, 103, 8, 3, 10, 3, 12, 3, 106, 9, 3, 1, 4, 1, 4, 3, 4, 110, 8, 4, 1, 4, 1, 4, 1, 4, 3, 4, 115, 8, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 4, 4, 123, 8, 4, 11, 4, 12, 4, 124, 3, 4, 127, 8, 4, 1, 5, 1, 5, 3, 5, 131, 8, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 3, 5, 138, 8, 5, 1, 5, 1, 5, 3, 5, 142, 8, 5, 1, 5, 1, 5, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 3, 7, 151, 8, 7, 1, 7, 3, 7, 154, 8, 7, 1, 8, 1, 8, 3, 8, 158, 8, 8, 1, 8, 3, 8, 161, 8, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 3, 9, 168, 8, 9, 4, 9, 170, 8, 9, 11, 9, 12, 9, 171, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 3, 9, 179, 8, 9, 4, 9, 181, 8, 9, 11, 9, 12, 9, 182, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 3, 9, 190, 8, 9, 3, 9, 192, 8, 9, 1, 10, 1, 10, 1, 11, 1, 11, 5, 11, 198, 8, 11, 10, 11, 12, 11, 201, 9, 11, 1, 11, 1, 11, 3, 11, 205, 8, 11, 1, 11, 5, 11, 208, 8, 11, 10, 11, 12, 11, 211, 9, 11, 1, 11, 1, 11, 1, 12, 1, 12, 5, 12, 217, 8, 12, 10, 12, 12, 12, 220, 9, 12, 1, 12, 1, 12, 3, 12, 224, 8, 12, 1, 12, 5, 12, 227, 8, 12, 10, 12, 12, 12, 230, 9, 12, 1, 12, 1, 12, 1, 13, 1, 13, 3, 13, 236, 8, 13, 1, 13, 1, 13, 3, 13, 240, 8, 13, 1, 13, 1, 13, 3, 13, 244, 8, 13, 1, 13, 1, 13, 3, 13, 248, 8, 13, 5, 13, 250, 8, 13, 10, 13, 12, 13, 253, 9, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 3, 14, 262, 8, 14, 1, 15, 3, 15, 265, 8, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 3, 15, 274, 8, 15, 1, 15, 3, 15, 277, 8, 15, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 3, 16, 284, 8, 16, 1, 17, 5, 17, 287, 8, 17, 10, 17, 12, 17, 290, 9, 17, 1, 18, 1, 18, 3, 18, 294, 8, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 3, 18, 301, 8, 18, 1, 18, 1, 18, 3, 18, 305, 8, 18, 1, 18, 1, 18, 3, 18, 309, 8, 18, 1, 18, 1, 18, 3, 18, 313, 8, 18, 1, 18, 1, 18, 3, 18, 317, 8, 18, 5, 18, 319, 8, 18, 10, 18, 12, 18, 322, 9, 18, 1, 18, 3, 18, 325, 8, 18, 1, 18, 1, 18, 3, 18, 329, 8, 18, 1, 18, 1, 18, 3, 18, 333, 8, 18, 1, 18, 3, 18, 336, 8, 18, 1, 18, 1, 18, 3, 18, 340, 8, 18, 1, 18, 1, 18, 1, 19, 1, 19, 1, 20, 3, 20, 347, 8, 20, 1, 20, 1, 20, 3, 20, 351, 8, 20, 1, 20, 1, 20, 3, 20, 355, 8, 20, 1, 20, 1, 20, 1, 21, 1, 21, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 3, 22, 366, 8, 22, 1, 23, 1, 23, 5, 23, 370, 8, 23, 10, 23, 12, 23, 373, 9, 23, 1, 23, 1, 23, 3, 23, 377, 8, 23, 1, 24, 1, 24, 1, 25, 1, 25, 3, 25, 383, 8, 25, 1, 26, 1, 26, 5, 26, 387, 8, 26, 10, 26, 12, 26, 390, 9, 26, 1, 26, 0, 0, 27, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 0, 4, 1, 0, 55, 55, 4, 0, 10, 10, 16, 18, 20, 21, 24, 24, 5, 0, 3, 5, 7, 10, 27, 35, 37, 53, 55, 55, 1, 0, 36, 36, 433, 0, 55, 1, 0, 0, 0, 2, 80, 1, 0, 0, 0, 4, 93, 1, 0, 0, 0, 6, 104, 1, 0, 0, 0, 8, 109, 1, 0, 0, 0, 10, 130, 1, 0, 0, 0, 12, 145, 1, 0, 0, 0, 14, 150, 1, 0, 0, 0, 16, 157, 1, 0, 0, 0, 18, 191, 1, 0, 0, 0, 20, 193, 1, 0, 0, 0, 22, 195, 1, 0, 0, 0, 24, 214, 1, 0, 0, 0, 26, 233, 1, 0, 0, 0, 28, 256, 1, 0, 0, 0, 30, 264, 1, 0, 0, 0, 32, 278, 1, 0, 0, 0, 34, 288, 1, 0, 0, 0, 36, 293, 1, 0, 0, 0, 38, 343, 1, 0, 0, 0, 40, 346, 1, 0, 0, 0, 42, 358, 1, 0, 0, 0, 44, 365, 1, 0, 0, 0, 46, 367, 1, 0, 0, 0, 48, 378, 1, 0, 0, 0, 50, 382, 1, 0, 0, 0, 52, 388, 1, 0, 0, 0, 54, 56, 5, 9, 0, 0, 55, 54, 1, 0, 0, 0, 55, 56, 1, 0, 0, 0, 56, 58, 1, 0, 0, 0, 57, 59, 5, 55, 0, 0, 58, 57, 1, 0, 0, 0, 58, 59, 1, 0, 0, 0, 59, 62, 1, 0, 0, 0, 60, 63, 3, 2, 1, 0, 61, 63, 3, 4, 2, 0, 62, 60, 1, 0, 0, 0, 62, 61, 1, 0, 0, 0, 63, 65, 1, 0, 0, 0, 64, 66, 5, 55, 0, 0, 65, 64, 1, 0, 0, 0, 65, 66, 1, 0, 0, 0, 66, 67, 1, 0, 0, 0, 67, 69, 3, 6, 3, 0, 68, 70, 5, 55, 0, 0, 69, 68, 1, 0, 0, 0, 69, 70, 1, 0, 0, 0, 70, 71, 1, 0, 0, 0, 71, 73, 3, 34, 17, 0, 72, 74, 5, 55, 0, 0, 73, 72, 1, 0, 0, 0, 73, 74, 1, 0, 0, 0, 74, 75, 1, 0, 0, 0, 75, 76, 5, 0, 0, 1, 76, 1, 1, 0, 0, 0, 77, 78, 3, 46, 23, 0, 78, 79, 5, 55, 0, 0, 79, 81, 1, 0, 0, 0, 80, 77, 1, 0, 0, 0, 80, 81, 1, 0, 0, 0, 81, 82, 1, 0, 0, 0, 82, 83, 5, 17, 0, 0, 83, 84, 5, 55, 0, 0, 84, 85, 5, 18, 0, 0, 85, 86, 5, 9, 0, 0, 86, 88, 5, 19, 0, 0, 87, 89, 5, 9, 0, 0, 88, 87, 1, 0, 0, 0, 88, 89, 1, 0, 0, 0, 89, 3, 1, 0, 0, 0, 90, 91, 3, 46, 23, 0, 91, 92, 5, 55, 0, 0, 92, 94, 1, 0, 0, 0, 93, 90, 1, 0, 0, 0, 93, 94, 1, 0, 0, 0, 94, 95, 1, 0, 0, 0, 95, 96, 5, 16, 0, 0, 96, 97, 5, 9, 0, 0, 97, 99, 3, 48, 24, 0, 98, 100, 5, 9, 0, 0, 99, 98, 1, 0, 0, 0, 99, 100, 1, 0, 0, 0, 100, 5, 1, 0, 0, 0, 101, 103, 3, 8, 4, 0, 102, 101, 1, 0, 0, 0, 103, 106, 1, 0, 0, 0, 104, 102, 1, 0, 0, 0, 104, 105, 1, 0, 0, 0, 105, 7, 1, 0, 0, 0, 106, 104, 1, 0, 0, 0, 107, 108, 5, 55, 0, 0, 108, 110, 3, 46, 23, 0, 109, 107, 1, 0, 0, 0, 109, 110, 1, 0, 0, 0, 110, 111, 1, 0, 0, 0, 111, 114, 5, 55, 0, 0, 112, 113, 5, 20, 0, 0, 113, 115, 5, 9, 0, 0, 114, 112, 1, 0, 0, 0, 114, 115, 1, 0, 0, 0, 115, 116, 1, 0, 0, 0, 116, 117, 5, 21, 0, 0, 117, 118, 5, 9, 0, 0, 118, 126, 3, 50, 25, 0, 119, 120, 5, 55, 0, 0, 120, 122, 5, 23, 0, 0, 121, 123, 3, 10, 5, 0, 122, 121, 1, 0, 0, 0, 123, 124, 1, 0, 0, 0, 124, 122, 1, 0, 0, 0, 124, 125, 1, 0, 0, 0, 125, 127, 1, 0, 0, 0, 126, 119, 1, 0, 0, 0, 126, 127, 1, 0, 0, 0, 127, 9, 1, 0, 0, 0, 128, 129, 5, 55, 0, 0, 129, 131, 3, 46, 23, 0, 130, 128, 1, 0, 0, 0, 130, 131, 1, 0, 0, 0, 131, 132, 1, 0, 0, 0, 132, 133, 5, 55, 0, 0, 133, 134, 5, 25, 0, 0, 134, 135, 5, 9, 0, 0, 135, 137, 3, 12, 6, 0, 136, 138, 5, 9, 0, 0, 137, 136, 1, 0, 0, 0, 137, 138, 1, 0, 0, 0, 138, 139, 1, 0, 0, 0, 139, 141, 5, 1, 0, 0, 140, 142, 5, 9, 0, 0, 141, 140, 1, 0, 0, 0, 141, 142, 1, 0, 0, 0, 142, 143, 1, 0, 0, 0, 143, 144, 3, 14, 7, 0, 144, 11, 1, 0, 0, 0, 145, 146, 3, 50, 25, 0, 146, 13, 1, 0, 0, 0, 147, 151, 3, 26, 13, 0, 148, 151, 3, 20, 10, 0, 149, 151, 3, 22, 11, 0, 150, 147, 1, 0, 0, 0, 150, 148, 1, 0, 0, 0, 150, 149, 1, 0, 0, 0, 151, 153, 1, 0, 0, 0, 152, 154, 3, 18, 9, 0, 153, 152, 1, 0, 0, 0, 153, 154, 1, 0, 0, 0, 154, 15, 1, 0, 0, 0, 155, 158, 3, 20, 10, 0, 156, 158, 3, 24, 12, 0, 157, 155, 1, 0, 0, 0, 157, 156, 1, 0, 0, 0, 158, 160, 1, 0, 0, 0, 159, 161, 3, 18, 9, 0, 160, 159, 1, 0, 0, 0, 160, 161, 1, 0, 0, 0, 161, 17, 1, 0, 0, 0, 162, 163, 5, 9, 0, 0, 163, 164, 5, 13, 0, 0, 164, 167, 5, 9, 0, 0, 165, 168, 3, 20, 10, 0, 166, 168, 3, 24, 12, 0, 167, 165, 1, 0, 0, 0, 167, 166, 1, 0, 0, 0, 168, 170, 1, 0, 0, 0, 169, 162, 1, 0, 0, 0, 170, 171, 1, 0, 0, 0, 171, 169, 1, 0, 0, 0, 171, 172, 1, 0, 0, 0, 172, 192, 1, 0, 0, 0, 173, 174, 5, 9, 0, 0, 174, 175, 5, 12, 0, 0, 175, 178, 5, 9, 0, 0, 176, 179, 3, 20, 10, 0, 177, 179, 3, 24, 12, 0, 178, 176, 1, 0, 0, 0, 178, 177, 1, 0, 0, 0, 179, 181, 1, 0, 0, 0, 180, 173, 1, 0, 0, 0, 181, 182, 1, 0, 0, 0, 182, 180, 1, 0, 0, 0, 182, 183, 1, 0, 0, 0, 183, 192, 1, 0, 0, 0, 184, 185, 5, 9, 0, 0, 185, 186, 5, 14, 0, 0, 186, 189, 5, 9, 0, 0, 187, 190, 3, 20, 10, 0, 188, 190, 3, 24, 12, 0, 189, 187, 1, 0, 0, 0, 189, 188, 1, 0, 0, 0, 190, 192, 1, 0, 0, 0, 191, 169, 1, 0, 0, 0, 191, 180, 1, 0, 0, 0, 191, 184, 1, 0, 0, 0, 192, 19, 1, 0, 0, 0, 193, 194, 3, 28, 14, 0, 194, 21, 1, 0, 0, 0, 195, 199, 5, 7, 0, 0, 196, 198, 5, 9, 0, 0, 197, 196, 1, 0, 0, 0, 198, 201, 1, 0, 0, 0, 199, 197, 1, 0, 0, 0, 199, 200, 1, 0, 0, 0, 200, 204, 1, 0, 0, 0, 201, 199, 1, 0, 0, 0, 202, 205, 3, 14, 7, 0, 203, 205, 3, 24, 12, 0, 204, 202, 1, 0, 0, 0, 204, 203, 1, 0, 0, 0, 205, 209, 1, 0, 0, 0, 206, 208, 5, 9, 0, 0, 207, 206, 1, 0, 0, 0, 208, 211, 1, 0, 0, 0, 209, 207, 1, 0, 0, 0, 209, 210, 1, 0, 0, 0, 210, 212, 1, 0, 0, 0, 211, 209, 1, 0, 0, 0, 212, 213, 5, 8, 0, 0, 213, 23, 1, 0, 0, 0, 214, 218, 5, 7, 0, 0, 215, 217, 5, 9, 0, 0, 216, 215, 1, 0, 0, 0, 217, 220, 1, 0, 0, 0, 218, 216, 1, 0, 0, 0, 218, 219, 1, 0, 0, 0, 219, 223, 1, 0, 0, 0, 220, 218, 1, 0, 0, 0, 221, 224, 3, 16, 8, 0, 222, 224, 3, 24, 12, 0, 223, 221, 1, 0, 0, 0, 223, 222, 1, 0, 0, 0, 224, 228, 1, 0, 0, 0, 225, 227, 5, 9, 0, 0, 226, 225, 1, 0, 0, 0, 227, 230, 1, 0, 0, 0, 228, 226, 1, 0, 0, 0, 228, 229, 1, 0, 0, 0, 229, 231, 1, 0, 0, 0, 230, 228, 1, 0, 0, 0, 231, 232, 5, 8, 0, 0, 232, 25, 1, 0, 0, 0, 233, 235, 5, 5, 0, 0, 234, 236, 5, 9, 0, 0, 235, 234, 1, 0, 0, 0, 235, 236, 1, 0, 0, 0, 236, 237, 1, 0, 0, 0, 237, 239, 3, 30, 15, 0, 238, 240, 5, 9, 0, 0, 239, 238, 1, 0, 0, 0, 239, 240, 1, 0, 0, 0, 240, 251, 1, 0, 0, 0, 241, 243, 5, 2, 0, 0, 242, 244, 5, 9, 0, 0, 243, 242, 1, 0, 0, 0, 243, 244, 1, 0, 0, 0, 244, 245, 1, 0, 0, 0, 245, 247, 3, 30, 15, 0, 246, 248, 5, 9, 0, 0, 247, 246, 1, 0, 0, 0, 247, 248, 1, 0, 0, 0, 248, 250, 1, 0, 0, 0, 249, 241, 1, 0, 0, 0, 250, 253, 1, 0, 0, 0, 251, 249, 1, 0, 0, 0, 251, 252, 1, 0, 0, 0, 252, 254, 1, 0, 0, 0, 253, 251, 1, 0, 0, 0, 254, 255, 5, 34, 0, 0, 255, 27, 1, 0, 0, 0, 256, 261, 3, 50, 25, 0, 257, 258, 5, 9, 0, 0, 258, 259, 5, 15, 0, 0, 259, 260, 5, 9, 0, 0, 260, 262, 3, 50, 25, 0, 261, 257, 1, 0, 0, 0, 261, 262, 1, 0, 0, 0, 262, 29, 1, 0, 0, 0, 263, 265, 5, 55, 0, 0, 264, 263, 1, 0, 0, 0, 264, 265, 1, 0, 0, 0, 265, 273, 1, 0, 0, 0, 266, 274, 3, 32, 16, 0, 267, 268, 3, 32, 16, 0, 268, 269, 5, 9, 0, 0, 269, 270, 5, 26, 0, 0, 270, 271, 5, 9, 0, 0, 271, 272, 3, 38, 19, 0, 272, 274, 1, 0, 0, 0, 273, 266, 1, 0, 0, 0, 273, 267, 1, 0, 0, 0, 274, 276, 1, 0, 0, 0, 275, 277, 5, 55, 0, 0, 276, 275, 1, 0, 0, 0, 276, 277, 1, 0, 0, 0, 277, 31, 1, 0, 0, 0, 278, 283, 3, 50, 25, 0, 279, 280, 5, 1, 0, 0, 280, 284, 5, 42, 0, 0, 281, 282, 5, 11, 0, 0, 282, 284, 3, 50, 25, 0, 283, 279, 1, 0, 0, 0, 283, 281, 1, 0, 0, 0, 283, 284, 1, 0, 0, 0, 284, 33, 1, 0, 0, 0, 285, 287, 3, 36, 18, 0, 286, 285, 1, 0, 0, 0, 287, 290, 1, 0, 0, 0, 288, 286, 1, 0, 0, 0, 288, 289, 1, 0, 0, 0, 289, 35, 1, 0, 0, 0, 290, 288, 1, 0, 0, 0, 291, 292, 5, 55, 0, 0, 292, 294, 3, 46, 23, 0, 293, 291, 1, 0, 0, 0, 293, 294, 1, 0, 0, 0, 294, 295, 1, 0, 0, 0, 295, 296, 5, 55, 0, 0, 296, 297, 5, 22, 0, 0, 297, 298, 5, 9, 0, 0, 298, 300, 3, 38, 19, 0, 299, 301, 5, 9, 0, 0, 300, 299, 1, 0, 0, 0, 300, 301, 1, 0, 0, 0, 301, 302, 1, 0, 0, 0, 302, 304, 5, 7, 0, 0, 303, 305, 5, 9, 0, 0, 304, 303, 1, 0, 0, 0, 304, 305, 1, 0, 0, 0, 305, 306, 1, 0, 0, 0, 306, 308, 3, 40, 20, 0, 307, 309, 5, 9, 0, 0, 308, 307, 1, 0, 0, 0, 308, 309, 1, 0, 0, 0, 309, 320, 1, 0, 0, 0, 310, 312, 5, 2, 0, 0, 311, 313, 5, 9, 0, 0, 312, 311, 1, 0, 0, 0, 312, 313, 1, 0, 0, 0, 313, 314, 1, 0, 0, 0, 314, 316, 3, 40, 20, 0, 315, 317, 5, 9, 0, 0, 316, 315, 1, 0, 0, 0, 316, 317, 1, 0, 0, 0, 317, 319, 1, 0, 0, 0, 318, 310, 1, 0, 0, 0, 319, 322, 1, 0, 0, 0, 320, 318, 1, 0, 0, 0, 320, 321, 1, 0, 0, 0, 321, 324, 1, 0, 0, 0, 322, 320, 1, 0, 0, 0, 323, 325, 5, 55, 0, 0, 324, 323, 1, 0, 0, 0, 324, 325, 1, 0, 0, 0, 325, 326, 1, 0, 0, 0, 326, 328, 5, 8, 0, 0, 327, 329, 5, 9, 0, 0, 328, 327, 1, 0, 0, 0, 328, 329, 1, 0, 0, 0, 329, 330, 1, 0, 0, 0, 330, 332, 5, 35, 0, 0, 331, 333, 5, 55, 0, 0, 332, 331, 1, 0, 0, 0, 332, 333, 1, 0, 0, 0, 333, 335, 1, 0, 0, 0, 334, 336, 5, 9, 0, 0, 335, 334, 1, 0, 0, 0, 335, 336, 1, 0, 0, 0, 336, 337, 1, 0, 0, 0, 337, 339, 3, 52, 26, 0, 338, 340, 5, 55, 0, 0, 339, 338, 1, 0, 0, 0, 339, 340, 1, 0, 0, 0, 340, 341, 1, 0, 0, 0, 341, 342, 5, 36, 0, 0, 342, 37, 1, 0, 0, 0, 343, 344, 5, 10, 0, 0, 344, 39, 1, 0, 0, 0, 345, 347, 5, 55, 0, 0, 346, 345, 1, 0, 0, 0, 346, 347, 1, 0, 0, 0, 347, 348, 1, 0, 0, 0, 348, 350, 3, 42, 21, 0, 349, 351, 5, 9, 0, 0, 350, 349, 1, 0, 0, 0, 350, 351, 1, 0, 0, 0, 351, 352, 1, 0, 0, 0, 352, 354, 5, 1, 0, 0, 353, 355, 5, 9, 0, 0, 354, 353, 1, 0, 0, 0, 354, 355, 1, 0, 0, 0, 355, 356, 1, 0, 0, 0, 356, 357, 3, 44, 22, 0, 357, 41, 1, 0, 0, 0, 358, 359, 5, 10, 0, 0, 359, 43, 1, 0, 0, 0, 360, 366, 5, 57, 0, 0, 361, 362, 5, 56, 0, 0, 362, 363, 5, 3, 0, 0, 363, 364, 5, 57, 0, 0, 364, 366, 5, 4, 0, 0, 365, 360, 1, 0, 0, 0, 365, 361, 1, 0, 0, 0, 366, 45, 1, 0, 0, 0, 367, 371, 5, 11, 0, 0, 368, 370, 8, 0, 0, 0, 369, 368, 1, 0, 0, 0, 370, 373, 1, 0, 0, 0, 371, 369, 1, 0, 0, 0, 371, 372, 1, 0, 0, 0, 372, 376, 1, 0, 0, 0, 373, 371, 1, 0, 0, 0, 374, 375, 5, 55, 0, 0, 375, 377, 3, 46, 23, 0, 376, 374, 1, 0, 0, 0, 376, 377, 1, 0, 0, 0, 377, 47, 1, 0, 0, 0, 378, 379, 7, 1, 0, 0, 379, 49, 1, 0, 0, 0, 380, 383, 3, 48, 24, 0, 381, 383, 5, 54, 0, 0, 382, 380, 1, 0, 0, 0, 382, 381, 1, 0, 0, 0, 383, 51, 1, 0, 0, 0, 384, 387, 7, 2, 0, 0, 385, 387, 8, 3, 0, 0, 386, 384, 1, 0, 0, 0, 386, 385, 1, 0, 0, 0, 387, 390, 1, 0, 0, 0, 388, 386, 1, 0, 0, 0, 388, 389, 1, 0, 0, 0, 389, 53, 1, 0, 0, 0, 390, 388, 1, 0, 0, 0, 66, 55, 58, 62, 65, 69, 73, 80, 88, 93, 99, 104, 109, 114, 124, 126, 130, 137, 141, 150, 153, 157, 160, 167, 171, 178, 182, 189, 191, 199, 204, 209, 218, 223, 228, 235, 239, 243, 247, 251, 261, 264, 273, 276, 283, 288, 293, 300, 304, 308, 312, 316, 320, 324, 328, 332, 335, 339, 346, 350, 354, 365, 371, 376, 382, 386, 388] \ No newline at end of file +[4, 1, 58, 394, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 1, 0, 3, 0, 56, 8, 0, 1, 0, 3, 0, 59, 8, 0, 1, 0, 1, 0, 3, 0, 63, 8, 0, 1, 0, 3, 0, 66, 8, 0, 1, 0, 1, 0, 3, 0, 70, 8, 0, 1, 0, 1, 0, 3, 0, 74, 8, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 3, 1, 81, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 89, 8, 1, 1, 2, 1, 2, 1, 2, 3, 2, 94, 8, 2, 1, 2, 1, 2, 1, 2, 1, 2, 3, 2, 100, 8, 2, 1, 3, 5, 3, 103, 8, 3, 10, 3, 12, 3, 106, 9, 3, 1, 4, 1, 4, 3, 4, 110, 8, 4, 1, 4, 1, 4, 1, 4, 3, 4, 115, 8, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 4, 4, 123, 8, 4, 11, 4, 12, 4, 124, 3, 4, 127, 8, 4, 1, 5, 1, 5, 3, 5, 131, 8, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 3, 5, 138, 8, 5, 1, 5, 1, 5, 3, 5, 142, 8, 5, 1, 5, 1, 5, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 3, 7, 151, 8, 7, 1, 7, 3, 7, 154, 8, 7, 1, 8, 1, 8, 3, 8, 158, 8, 8, 1, 8, 3, 8, 161, 8, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 3, 9, 168, 8, 9, 4, 9, 170, 8, 9, 11, 9, 12, 9, 171, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 3, 9, 179, 8, 9, 4, 9, 181, 8, 9, 11, 9, 12, 9, 182, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 3, 9, 190, 8, 9, 3, 9, 192, 8, 9, 1, 10, 1, 10, 1, 11, 1, 11, 5, 11, 198, 8, 11, 10, 11, 12, 11, 201, 9, 11, 1, 11, 1, 11, 3, 11, 205, 8, 11, 1, 11, 5, 11, 208, 8, 11, 10, 11, 12, 11, 211, 9, 11, 1, 11, 1, 11, 1, 12, 1, 12, 5, 12, 217, 8, 12, 10, 12, 12, 12, 220, 9, 12, 1, 12, 1, 12, 3, 12, 224, 8, 12, 1, 12, 5, 12, 227, 8, 12, 10, 12, 12, 12, 230, 9, 12, 1, 12, 1, 12, 1, 13, 1, 13, 3, 13, 236, 8, 13, 1, 13, 1, 13, 3, 13, 240, 8, 13, 1, 13, 1, 13, 3, 13, 244, 8, 13, 1, 13, 1, 13, 3, 13, 248, 8, 13, 5, 13, 250, 8, 13, 10, 13, 12, 13, 253, 9, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 3, 14, 262, 8, 14, 1, 15, 3, 15, 265, 8, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 3, 15, 274, 8, 15, 3, 15, 276, 8, 15, 1, 15, 3, 15, 279, 8, 15, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 3, 16, 286, 8, 16, 1, 17, 5, 17, 289, 8, 17, 10, 17, 12, 17, 292, 9, 17, 1, 18, 1, 18, 3, 18, 296, 8, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 3, 18, 303, 8, 18, 1, 18, 1, 18, 3, 18, 307, 8, 18, 1, 18, 1, 18, 3, 18, 311, 8, 18, 1, 18, 1, 18, 3, 18, 315, 8, 18, 1, 18, 1, 18, 3, 18, 319, 8, 18, 5, 18, 321, 8, 18, 10, 18, 12, 18, 324, 9, 18, 1, 18, 3, 18, 327, 8, 18, 1, 18, 1, 18, 3, 18, 331, 8, 18, 1, 18, 1, 18, 3, 18, 335, 8, 18, 1, 18, 3, 18, 338, 8, 18, 1, 18, 1, 18, 3, 18, 342, 8, 18, 1, 18, 1, 18, 1, 19, 1, 19, 1, 20, 3, 20, 349, 8, 20, 1, 20, 1, 20, 3, 20, 353, 8, 20, 1, 20, 1, 20, 3, 20, 357, 8, 20, 1, 20, 1, 20, 1, 21, 1, 21, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 3, 22, 368, 8, 22, 1, 23, 1, 23, 5, 23, 372, 8, 23, 10, 23, 12, 23, 375, 9, 23, 1, 23, 1, 23, 3, 23, 379, 8, 23, 1, 24, 1, 24, 1, 25, 1, 25, 3, 25, 385, 8, 25, 1, 26, 1, 26, 5, 26, 389, 8, 26, 10, 26, 12, 26, 392, 9, 26, 1, 26, 0, 0, 27, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 0, 4, 1, 0, 56, 56, 4, 0, 10, 10, 16, 18, 20, 21, 24, 24, 5, 0, 3, 5, 7, 10, 27, 35, 37, 53, 56, 56, 1, 0, 36, 36, 436, 0, 55, 1, 0, 0, 0, 2, 80, 1, 0, 0, 0, 4, 93, 1, 0, 0, 0, 6, 104, 1, 0, 0, 0, 8, 109, 1, 0, 0, 0, 10, 130, 1, 0, 0, 0, 12, 145, 1, 0, 0, 0, 14, 150, 1, 0, 0, 0, 16, 157, 1, 0, 0, 0, 18, 191, 1, 0, 0, 0, 20, 193, 1, 0, 0, 0, 22, 195, 1, 0, 0, 0, 24, 214, 1, 0, 0, 0, 26, 233, 1, 0, 0, 0, 28, 256, 1, 0, 0, 0, 30, 264, 1, 0, 0, 0, 32, 280, 1, 0, 0, 0, 34, 290, 1, 0, 0, 0, 36, 295, 1, 0, 0, 0, 38, 345, 1, 0, 0, 0, 40, 348, 1, 0, 0, 0, 42, 360, 1, 0, 0, 0, 44, 367, 1, 0, 0, 0, 46, 369, 1, 0, 0, 0, 48, 380, 1, 0, 0, 0, 50, 384, 1, 0, 0, 0, 52, 390, 1, 0, 0, 0, 54, 56, 5, 9, 0, 0, 55, 54, 1, 0, 0, 0, 55, 56, 1, 0, 0, 0, 56, 58, 1, 0, 0, 0, 57, 59, 5, 56, 0, 0, 58, 57, 1, 0, 0, 0, 58, 59, 1, 0, 0, 0, 59, 62, 1, 0, 0, 0, 60, 63, 3, 2, 1, 0, 61, 63, 3, 4, 2, 0, 62, 60, 1, 0, 0, 0, 62, 61, 1, 0, 0, 0, 63, 65, 1, 0, 0, 0, 64, 66, 5, 56, 0, 0, 65, 64, 1, 0, 0, 0, 65, 66, 1, 0, 0, 0, 66, 67, 1, 0, 0, 0, 67, 69, 3, 6, 3, 0, 68, 70, 5, 56, 0, 0, 69, 68, 1, 0, 0, 0, 69, 70, 1, 0, 0, 0, 70, 71, 1, 0, 0, 0, 71, 73, 3, 34, 17, 0, 72, 74, 5, 56, 0, 0, 73, 72, 1, 0, 0, 0, 73, 74, 1, 0, 0, 0, 74, 75, 1, 0, 0, 0, 75, 76, 5, 0, 0, 1, 76, 1, 1, 0, 0, 0, 77, 78, 3, 46, 23, 0, 78, 79, 5, 56, 0, 0, 79, 81, 1, 0, 0, 0, 80, 77, 1, 0, 0, 0, 80, 81, 1, 0, 0, 0, 81, 82, 1, 0, 0, 0, 82, 83, 5, 17, 0, 0, 83, 84, 5, 56, 0, 0, 84, 85, 5, 18, 0, 0, 85, 86, 5, 9, 0, 0, 86, 88, 5, 19, 0, 0, 87, 89, 5, 9, 0, 0, 88, 87, 1, 0, 0, 0, 88, 89, 1, 0, 0, 0, 89, 3, 1, 0, 0, 0, 90, 91, 3, 46, 23, 0, 91, 92, 5, 56, 0, 0, 92, 94, 1, 0, 0, 0, 93, 90, 1, 0, 0, 0, 93, 94, 1, 0, 0, 0, 94, 95, 1, 0, 0, 0, 95, 96, 5, 16, 0, 0, 96, 97, 5, 9, 0, 0, 97, 99, 3, 48, 24, 0, 98, 100, 5, 9, 0, 0, 99, 98, 1, 0, 0, 0, 99, 100, 1, 0, 0, 0, 100, 5, 1, 0, 0, 0, 101, 103, 3, 8, 4, 0, 102, 101, 1, 0, 0, 0, 103, 106, 1, 0, 0, 0, 104, 102, 1, 0, 0, 0, 104, 105, 1, 0, 0, 0, 105, 7, 1, 0, 0, 0, 106, 104, 1, 0, 0, 0, 107, 108, 5, 56, 0, 0, 108, 110, 3, 46, 23, 0, 109, 107, 1, 0, 0, 0, 109, 110, 1, 0, 0, 0, 110, 111, 1, 0, 0, 0, 111, 114, 5, 56, 0, 0, 112, 113, 5, 20, 0, 0, 113, 115, 5, 9, 0, 0, 114, 112, 1, 0, 0, 0, 114, 115, 1, 0, 0, 0, 115, 116, 1, 0, 0, 0, 116, 117, 5, 21, 0, 0, 117, 118, 5, 9, 0, 0, 118, 126, 3, 50, 25, 0, 119, 120, 5, 56, 0, 0, 120, 122, 5, 23, 0, 0, 121, 123, 3, 10, 5, 0, 122, 121, 1, 0, 0, 0, 123, 124, 1, 0, 0, 0, 124, 122, 1, 0, 0, 0, 124, 125, 1, 0, 0, 0, 125, 127, 1, 0, 0, 0, 126, 119, 1, 0, 0, 0, 126, 127, 1, 0, 0, 0, 127, 9, 1, 0, 0, 0, 128, 129, 5, 56, 0, 0, 129, 131, 3, 46, 23, 0, 130, 128, 1, 0, 0, 0, 130, 131, 1, 0, 0, 0, 131, 132, 1, 0, 0, 0, 132, 133, 5, 56, 0, 0, 133, 134, 5, 25, 0, 0, 134, 135, 5, 9, 0, 0, 135, 137, 3, 12, 6, 0, 136, 138, 5, 9, 0, 0, 137, 136, 1, 0, 0, 0, 137, 138, 1, 0, 0, 0, 138, 139, 1, 0, 0, 0, 139, 141, 5, 1, 0, 0, 140, 142, 5, 9, 0, 0, 141, 140, 1, 0, 0, 0, 141, 142, 1, 0, 0, 0, 142, 143, 1, 0, 0, 0, 143, 144, 3, 14, 7, 0, 144, 11, 1, 0, 0, 0, 145, 146, 3, 50, 25, 0, 146, 13, 1, 0, 0, 0, 147, 151, 3, 26, 13, 0, 148, 151, 3, 20, 10, 0, 149, 151, 3, 22, 11, 0, 150, 147, 1, 0, 0, 0, 150, 148, 1, 0, 0, 0, 150, 149, 1, 0, 0, 0, 151, 153, 1, 0, 0, 0, 152, 154, 3, 18, 9, 0, 153, 152, 1, 0, 0, 0, 153, 154, 1, 0, 0, 0, 154, 15, 1, 0, 0, 0, 155, 158, 3, 20, 10, 0, 156, 158, 3, 24, 12, 0, 157, 155, 1, 0, 0, 0, 157, 156, 1, 0, 0, 0, 158, 160, 1, 0, 0, 0, 159, 161, 3, 18, 9, 0, 160, 159, 1, 0, 0, 0, 160, 161, 1, 0, 0, 0, 161, 17, 1, 0, 0, 0, 162, 163, 5, 9, 0, 0, 163, 164, 5, 13, 0, 0, 164, 167, 5, 9, 0, 0, 165, 168, 3, 20, 10, 0, 166, 168, 3, 24, 12, 0, 167, 165, 1, 0, 0, 0, 167, 166, 1, 0, 0, 0, 168, 170, 1, 0, 0, 0, 169, 162, 1, 0, 0, 0, 170, 171, 1, 0, 0, 0, 171, 169, 1, 0, 0, 0, 171, 172, 1, 0, 0, 0, 172, 192, 1, 0, 0, 0, 173, 174, 5, 9, 0, 0, 174, 175, 5, 12, 0, 0, 175, 178, 5, 9, 0, 0, 176, 179, 3, 20, 10, 0, 177, 179, 3, 24, 12, 0, 178, 176, 1, 0, 0, 0, 178, 177, 1, 0, 0, 0, 179, 181, 1, 0, 0, 0, 180, 173, 1, 0, 0, 0, 181, 182, 1, 0, 0, 0, 182, 180, 1, 0, 0, 0, 182, 183, 1, 0, 0, 0, 183, 192, 1, 0, 0, 0, 184, 185, 5, 9, 0, 0, 185, 186, 5, 14, 0, 0, 186, 189, 5, 9, 0, 0, 187, 190, 3, 20, 10, 0, 188, 190, 3, 24, 12, 0, 189, 187, 1, 0, 0, 0, 189, 188, 1, 0, 0, 0, 190, 192, 1, 0, 0, 0, 191, 169, 1, 0, 0, 0, 191, 180, 1, 0, 0, 0, 191, 184, 1, 0, 0, 0, 192, 19, 1, 0, 0, 0, 193, 194, 3, 28, 14, 0, 194, 21, 1, 0, 0, 0, 195, 199, 5, 7, 0, 0, 196, 198, 5, 9, 0, 0, 197, 196, 1, 0, 0, 0, 198, 201, 1, 0, 0, 0, 199, 197, 1, 0, 0, 0, 199, 200, 1, 0, 0, 0, 200, 204, 1, 0, 0, 0, 201, 199, 1, 0, 0, 0, 202, 205, 3, 14, 7, 0, 203, 205, 3, 24, 12, 0, 204, 202, 1, 0, 0, 0, 204, 203, 1, 0, 0, 0, 205, 209, 1, 0, 0, 0, 206, 208, 5, 9, 0, 0, 207, 206, 1, 0, 0, 0, 208, 211, 1, 0, 0, 0, 209, 207, 1, 0, 0, 0, 209, 210, 1, 0, 0, 0, 210, 212, 1, 0, 0, 0, 211, 209, 1, 0, 0, 0, 212, 213, 5, 8, 0, 0, 213, 23, 1, 0, 0, 0, 214, 218, 5, 7, 0, 0, 215, 217, 5, 9, 0, 0, 216, 215, 1, 0, 0, 0, 217, 220, 1, 0, 0, 0, 218, 216, 1, 0, 0, 0, 218, 219, 1, 0, 0, 0, 219, 223, 1, 0, 0, 0, 220, 218, 1, 0, 0, 0, 221, 224, 3, 16, 8, 0, 222, 224, 3, 24, 12, 0, 223, 221, 1, 0, 0, 0, 223, 222, 1, 0, 0, 0, 224, 228, 1, 0, 0, 0, 225, 227, 5, 9, 0, 0, 226, 225, 1, 0, 0, 0, 227, 230, 1, 0, 0, 0, 228, 226, 1, 0, 0, 0, 228, 229, 1, 0, 0, 0, 229, 231, 1, 0, 0, 0, 230, 228, 1, 0, 0, 0, 231, 232, 5, 8, 0, 0, 232, 25, 1, 0, 0, 0, 233, 235, 5, 5, 0, 0, 234, 236, 5, 9, 0, 0, 235, 234, 1, 0, 0, 0, 235, 236, 1, 0, 0, 0, 236, 237, 1, 0, 0, 0, 237, 239, 3, 30, 15, 0, 238, 240, 5, 9, 0, 0, 239, 238, 1, 0, 0, 0, 239, 240, 1, 0, 0, 0, 240, 251, 1, 0, 0, 0, 241, 243, 5, 2, 0, 0, 242, 244, 5, 9, 0, 0, 243, 242, 1, 0, 0, 0, 243, 244, 1, 0, 0, 0, 244, 245, 1, 0, 0, 0, 245, 247, 3, 30, 15, 0, 246, 248, 5, 9, 0, 0, 247, 246, 1, 0, 0, 0, 247, 248, 1, 0, 0, 0, 248, 250, 1, 0, 0, 0, 249, 241, 1, 0, 0, 0, 250, 253, 1, 0, 0, 0, 251, 249, 1, 0, 0, 0, 251, 252, 1, 0, 0, 0, 252, 254, 1, 0, 0, 0, 253, 251, 1, 0, 0, 0, 254, 255, 5, 34, 0, 0, 255, 27, 1, 0, 0, 0, 256, 261, 3, 50, 25, 0, 257, 258, 5, 9, 0, 0, 258, 259, 5, 15, 0, 0, 259, 260, 5, 9, 0, 0, 260, 262, 3, 50, 25, 0, 261, 257, 1, 0, 0, 0, 261, 262, 1, 0, 0, 0, 262, 29, 1, 0, 0, 0, 263, 265, 5, 56, 0, 0, 264, 263, 1, 0, 0, 0, 264, 265, 1, 0, 0, 0, 265, 275, 1, 0, 0, 0, 266, 276, 3, 32, 16, 0, 267, 268, 3, 32, 16, 0, 268, 269, 5, 9, 0, 0, 269, 270, 5, 26, 0, 0, 270, 273, 5, 9, 0, 0, 271, 274, 3, 38, 19, 0, 272, 274, 5, 54, 0, 0, 273, 271, 1, 0, 0, 0, 273, 272, 1, 0, 0, 0, 274, 276, 1, 0, 0, 0, 275, 266, 1, 0, 0, 0, 275, 267, 1, 0, 0, 0, 276, 278, 1, 0, 0, 0, 277, 279, 5, 56, 0, 0, 278, 277, 1, 0, 0, 0, 278, 279, 1, 0, 0, 0, 279, 31, 1, 0, 0, 0, 280, 285, 3, 50, 25, 0, 281, 282, 5, 1, 0, 0, 282, 286, 5, 42, 0, 0, 283, 284, 5, 11, 0, 0, 284, 286, 3, 50, 25, 0, 285, 281, 1, 0, 0, 0, 285, 283, 1, 0, 0, 0, 285, 286, 1, 0, 0, 0, 286, 33, 1, 0, 0, 0, 287, 289, 3, 36, 18, 0, 288, 287, 1, 0, 0, 0, 289, 292, 1, 0, 0, 0, 290, 288, 1, 0, 0, 0, 290, 291, 1, 0, 0, 0, 291, 35, 1, 0, 0, 0, 292, 290, 1, 0, 0, 0, 293, 294, 5, 56, 0, 0, 294, 296, 3, 46, 23, 0, 295, 293, 1, 0, 0, 0, 295, 296, 1, 0, 0, 0, 296, 297, 1, 0, 0, 0, 297, 298, 5, 56, 0, 0, 298, 299, 5, 22, 0, 0, 299, 300, 5, 9, 0, 0, 300, 302, 3, 38, 19, 0, 301, 303, 5, 9, 0, 0, 302, 301, 1, 0, 0, 0, 302, 303, 1, 0, 0, 0, 303, 304, 1, 0, 0, 0, 304, 306, 5, 7, 0, 0, 305, 307, 5, 9, 0, 0, 306, 305, 1, 0, 0, 0, 306, 307, 1, 0, 0, 0, 307, 308, 1, 0, 0, 0, 308, 310, 3, 40, 20, 0, 309, 311, 5, 9, 0, 0, 310, 309, 1, 0, 0, 0, 310, 311, 1, 0, 0, 0, 311, 322, 1, 0, 0, 0, 312, 314, 5, 2, 0, 0, 313, 315, 5, 9, 0, 0, 314, 313, 1, 0, 0, 0, 314, 315, 1, 0, 0, 0, 315, 316, 1, 0, 0, 0, 316, 318, 3, 40, 20, 0, 317, 319, 5, 9, 0, 0, 318, 317, 1, 0, 0, 0, 318, 319, 1, 0, 0, 0, 319, 321, 1, 0, 0, 0, 320, 312, 1, 0, 0, 0, 321, 324, 1, 0, 0, 0, 322, 320, 1, 0, 0, 0, 322, 323, 1, 0, 0, 0, 323, 326, 1, 0, 0, 0, 324, 322, 1, 0, 0, 0, 325, 327, 5, 56, 0, 0, 326, 325, 1, 0, 0, 0, 326, 327, 1, 0, 0, 0, 327, 328, 1, 0, 0, 0, 328, 330, 5, 8, 0, 0, 329, 331, 5, 9, 0, 0, 330, 329, 1, 0, 0, 0, 330, 331, 1, 0, 0, 0, 331, 332, 1, 0, 0, 0, 332, 334, 5, 35, 0, 0, 333, 335, 5, 56, 0, 0, 334, 333, 1, 0, 0, 0, 334, 335, 1, 0, 0, 0, 335, 337, 1, 0, 0, 0, 336, 338, 5, 9, 0, 0, 337, 336, 1, 0, 0, 0, 337, 338, 1, 0, 0, 0, 338, 339, 1, 0, 0, 0, 339, 341, 3, 52, 26, 0, 340, 342, 5, 56, 0, 0, 341, 340, 1, 0, 0, 0, 341, 342, 1, 0, 0, 0, 342, 343, 1, 0, 0, 0, 343, 344, 5, 36, 0, 0, 344, 37, 1, 0, 0, 0, 345, 346, 5, 10, 0, 0, 346, 39, 1, 0, 0, 0, 347, 349, 5, 56, 0, 0, 348, 347, 1, 0, 0, 0, 348, 349, 1, 0, 0, 0, 349, 350, 1, 0, 0, 0, 350, 352, 3, 42, 21, 0, 351, 353, 5, 9, 0, 0, 352, 351, 1, 0, 0, 0, 352, 353, 1, 0, 0, 0, 353, 354, 1, 0, 0, 0, 354, 356, 5, 1, 0, 0, 355, 357, 5, 9, 0, 0, 356, 355, 1, 0, 0, 0, 356, 357, 1, 0, 0, 0, 357, 358, 1, 0, 0, 0, 358, 359, 3, 44, 22, 0, 359, 41, 1, 0, 0, 0, 360, 361, 5, 10, 0, 0, 361, 43, 1, 0, 0, 0, 362, 368, 5, 58, 0, 0, 363, 364, 5, 57, 0, 0, 364, 365, 5, 3, 0, 0, 365, 366, 5, 58, 0, 0, 366, 368, 5, 4, 0, 0, 367, 362, 1, 0, 0, 0, 367, 363, 1, 0, 0, 0, 368, 45, 1, 0, 0, 0, 369, 373, 5, 11, 0, 0, 370, 372, 8, 0, 0, 0, 371, 370, 1, 0, 0, 0, 372, 375, 1, 0, 0, 0, 373, 371, 1, 0, 0, 0, 373, 374, 1, 0, 0, 0, 374, 378, 1, 0, 0, 0, 375, 373, 1, 0, 0, 0, 376, 377, 5, 56, 0, 0, 377, 379, 3, 46, 23, 0, 378, 376, 1, 0, 0, 0, 378, 379, 1, 0, 0, 0, 379, 47, 1, 0, 0, 0, 380, 381, 7, 1, 0, 0, 381, 49, 1, 0, 0, 0, 382, 385, 3, 48, 24, 0, 383, 385, 5, 55, 0, 0, 384, 382, 1, 0, 0, 0, 384, 383, 1, 0, 0, 0, 385, 51, 1, 0, 0, 0, 386, 389, 7, 2, 0, 0, 387, 389, 8, 3, 0, 0, 388, 386, 1, 0, 0, 0, 388, 387, 1, 0, 0, 0, 389, 392, 1, 0, 0, 0, 390, 388, 1, 0, 0, 0, 390, 391, 1, 0, 0, 0, 391, 53, 1, 0, 0, 0, 392, 390, 1, 0, 0, 0, 67, 55, 58, 62, 65, 69, 73, 80, 88, 93, 99, 104, 109, 114, 124, 126, 130, 137, 141, 150, 153, 157, 160, 167, 171, 178, 182, 189, 191, 199, 204, 209, 218, 223, 228, 235, 239, 243, 247, 251, 261, 264, 273, 275, 278, 285, 290, 295, 302, 306, 310, 314, 318, 322, 326, 330, 334, 337, 341, 348, 352, 356, 367, 373, 378, 384, 388, 390] \ No newline at end of file diff --git a/pkg/go/gen/OpenFGAParser.tokens b/pkg/go/gen/OpenFGAParser.tokens index 512cec30..b2523ac8 100644 --- a/pkg/go/gen/OpenFGAParser.tokens +++ b/pkg/go/gen/OpenFGAParser.tokens @@ -51,10 +51,11 @@ NUM_INT=50 NUM_UINT=51 STRING=52 BYTES=53 -EXTENDED_IDENTIFIER=54 -NEWLINE=55 -CONDITION_PARAM_CONTAINER=56 -CONDITION_PARAM_TYPE=57 +DOLLAR_EXPRESSION=54 +EXTENDED_IDENTIFIER=55 +NEWLINE=56 +CONDITION_PARAM_CONTAINER=57 +CONDITION_PARAM_TYPE=58 '#'=11 ':'=1 ','=2 @@ -98,3 +99,4 @@ CONDITION_PARAM_TYPE=57 'true'=45 'false'=46 'null'=47 +'$expression'=54 diff --git a/pkg/go/gen/openfga_lexer.go b/pkg/go/gen/openfga_lexer.go index e661ccd0..ae88f954 100644 --- a/pkg/go/gen/openfga_lexer.go +++ b/pkg/go/gen/openfga_lexer.go @@ -48,7 +48,8 @@ func openfgalexerLexerInit() { "", "'extend'", "'type'", "'condition'", "'relations'", "'relation'", "'define'", "'with'", "'=='", "'!='", "'in'", "'<='", "'>='", "'&&'", "'||'", "']'", "'{'", "'}'", "'.'", "'-'", "'!'", "'?'", "'+'", "'*'", - "'/'", "'%'", "'true'", "'false'", "'null'", + "'/'", "'%'", "'true'", "'false'", "'null'", "", "", "", "", "", "", + "'$expression'", } staticData.SymbolicNames = []string{ "", "COLON", "COMMA", "LESS", "GREATER", "LBRACKET", "RBRACKET", "LPAREN", @@ -59,7 +60,7 @@ func openfgalexerLexerInit() { "LOGICAL_OR", "RPRACKET", "LBRACE", "RBRACE", "DOT", "MINUS", "EXCLAM", "QUESTIONMARK", "PLUS", "STAR", "SLASH", "PERCENT", "CEL_TRUE", "CEL_FALSE", "NUL", "CEL_COMMENT", "NUM_FLOAT", "NUM_INT", "NUM_UINT", "STRING", - "BYTES", "EXTENDED_IDENTIFIER", "NEWLINE", "CONDITION_PARAM_CONTAINER", + "BYTES", "DOLLAR_EXPRESSION", "EXTENDED_IDENTIFIER", "NEWLINE", "CONDITION_PARAM_CONTAINER", "CONDITION_PARAM_TYPE", } staticData.RuleNames = []string{ @@ -72,14 +73,15 @@ func openfgalexerLexerInit() { "SLASH", "PERCENT", "CEL_TRUE", "CEL_FALSE", "NUL", "BACKSLASH", "LETTER", "DIGIT", "EXPONENT", "HEXDIGIT", "RAW", "ESC_SEQ", "ESC_CHAR_SEQ", "ESC_OCT_SEQ", "ESC_BYTE_SEQ", "ESC_UNI_SEQ", "WHITESPACE", "CEL_COMMENT", "NUM_FLOAT", - "NUM_INT", "NUM_UINT", "STRING", "BYTES", "IDENTIFIER", "EXTENDED_IDENTIFIER", - "NEWLINE", "CONDITION_DEF_END", "CONDITION_PARAM_CONTAINER", "CONDITION_PARAM_TYPE", - "CONDITION_PARAM_TYPE_LESS", "CONDITION_PARAM_TYPE_GREATER", "CONDITION_OPEN", - "CONDITION_COLON", "CONDITION_COMMA", "CONDITION_WS", "CONDITION_NAME", + "NUM_INT", "NUM_UINT", "STRING", "BYTES", "DOLLAR_EXPRESSION", "IDENTIFIER", + "EXTENDED_IDENTIFIER", "NEWLINE", "CONDITION_DEF_END", "CONDITION_PARAM_CONTAINER", + "CONDITION_PARAM_TYPE", "CONDITION_PARAM_TYPE_LESS", "CONDITION_PARAM_TYPE_GREATER", + "CONDITION_OPEN", "CONDITION_COLON", "CONDITION_COMMA", "CONDITION_WS", + "CONDITION_NAME", } staticData.PredictionContextCache = antlr.NewPredictionContextCache() staticData.serializedATN = []int32{ - 4, 0, 57, 717, 6, -1, 6, -1, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, + 4, 0, 58, 731, 6, -1, 6, -1, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, @@ -93,325 +95,331 @@ func openfgalexerLexerInit() { 56, 2, 57, 7, 57, 2, 58, 7, 58, 2, 59, 7, 59, 2, 60, 7, 60, 2, 61, 7, 61, 2, 62, 7, 62, 2, 63, 7, 63, 2, 64, 7, 64, 2, 65, 7, 65, 2, 66, 7, 66, 2, 67, 7, 67, 2, 68, 7, 68, 2, 69, 7, 69, 2, 70, 7, 70, 2, 71, 7, 71, 2, 72, - 7, 72, 2, 73, 7, 73, 2, 74, 7, 74, 1, 0, 1, 0, 1, 1, 1, 1, 1, 2, 1, 2, - 1, 3, 1, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, - 1, 5, 1, 5, 1, 5, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 7, - 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 9, 1, 9, 1, 9, - 1, 9, 1, 9, 1, 9, 1, 9, 1, 10, 4, 10, 200, 8, 10, 11, 10, 12, 10, 201, - 1, 10, 1, 10, 4, 10, 206, 8, 10, 11, 10, 12, 10, 207, 1, 11, 1, 11, 1, - 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 13, + 7, 72, 2, 73, 7, 73, 2, 74, 7, 74, 2, 75, 7, 75, 1, 0, 1, 0, 1, 1, 1, 1, + 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, + 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 7, 1, 7, + 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 9, + 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 10, 4, 10, 202, 8, 10, 11, 10, 12, + 10, 203, 1, 10, 1, 10, 4, 10, 208, 8, 10, 11, 10, 12, 10, 209, 1, 11, 1, + 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, - 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, - 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 16, 1, - 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, - 1, 18, 1, 18, 1, 18, 1, 19, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 21, 1, - 21, 1, 22, 1, 22, 1, 22, 1, 23, 1, 23, 1, 23, 1, 24, 1, 24, 1, 25, 1, 25, - 1, 25, 1, 26, 1, 26, 1, 26, 1, 27, 1, 27, 1, 28, 1, 28, 1, 29, 1, 29, 1, - 30, 1, 30, 1, 31, 1, 31, 1, 32, 1, 32, 1, 33, 1, 33, 1, 34, 1, 34, 1, 35, - 1, 35, 1, 36, 1, 36, 1, 37, 1, 37, 1, 38, 1, 38, 1, 39, 1, 39, 1, 40, 1, - 40, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, - 1, 42, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 44, 1, 44, 1, 45, 1, 45, 1, - 46, 1, 46, 1, 47, 1, 47, 3, 47, 342, 8, 47, 1, 47, 4, 47, 345, 8, 47, 11, - 47, 12, 47, 346, 1, 48, 1, 48, 1, 49, 1, 49, 1, 50, 1, 50, 1, 50, 1, 50, - 3, 50, 357, 8, 50, 1, 51, 1, 51, 1, 51, 1, 52, 1, 52, 1, 52, 1, 52, 1, - 52, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, + 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, + 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, + 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 1, 17, + 1, 17, 1, 18, 1, 18, 1, 18, 1, 19, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, + 21, 1, 21, 1, 22, 1, 22, 1, 22, 1, 23, 1, 23, 1, 23, 1, 24, 1, 24, 1, 25, + 1, 25, 1, 25, 1, 26, 1, 26, 1, 26, 1, 27, 1, 27, 1, 28, 1, 28, 1, 29, 1, + 29, 1, 30, 1, 30, 1, 31, 1, 31, 1, 32, 1, 32, 1, 33, 1, 33, 1, 34, 1, 34, + 1, 35, 1, 35, 1, 36, 1, 36, 1, 37, 1, 37, 1, 38, 1, 38, 1, 39, 1, 39, 1, + 40, 1, 40, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 42, 1, 42, 1, 42, 1, 42, + 1, 42, 1, 42, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 44, 1, 44, 1, 45, 1, + 45, 1, 46, 1, 46, 1, 47, 1, 47, 3, 47, 344, 8, 47, 1, 47, 4, 47, 347, 8, + 47, 11, 47, 12, 47, 348, 1, 48, 1, 48, 1, 49, 1, 49, 1, 50, 1, 50, 1, 50, + 1, 50, 3, 50, 359, 8, 50, 1, 51, 1, 51, 1, 51, 1, 52, 1, 52, 1, 52, 1, + 52, 1, 52, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, - 54, 1, 54, 1, 54, 3, 54, 390, 8, 54, 1, 55, 4, 55, 393, 8, 55, 11, 55, - 12, 55, 394, 1, 56, 1, 56, 1, 56, 1, 56, 5, 56, 401, 8, 56, 10, 56, 12, - 56, 404, 9, 56, 1, 56, 1, 56, 1, 57, 4, 57, 409, 8, 57, 11, 57, 12, 57, - 410, 1, 57, 1, 57, 4, 57, 415, 8, 57, 11, 57, 12, 57, 416, 1, 57, 3, 57, - 420, 8, 57, 1, 57, 4, 57, 423, 8, 57, 11, 57, 12, 57, 424, 1, 57, 1, 57, - 1, 57, 1, 57, 4, 57, 431, 8, 57, 11, 57, 12, 57, 432, 1, 57, 3, 57, 436, - 8, 57, 3, 57, 438, 8, 57, 1, 58, 4, 58, 441, 8, 58, 11, 58, 12, 58, 442, - 1, 58, 1, 58, 1, 58, 1, 58, 4, 58, 449, 8, 58, 11, 58, 12, 58, 450, 3, - 58, 453, 8, 58, 1, 59, 4, 59, 456, 8, 59, 11, 59, 12, 59, 457, 1, 59, 1, - 59, 1, 59, 1, 59, 1, 59, 1, 59, 4, 59, 466, 8, 59, 11, 59, 12, 59, 467, - 1, 59, 1, 59, 3, 59, 472, 8, 59, 1, 60, 1, 60, 1, 60, 5, 60, 477, 8, 60, - 10, 60, 12, 60, 480, 9, 60, 1, 60, 1, 60, 1, 60, 1, 60, 5, 60, 486, 8, - 60, 10, 60, 12, 60, 489, 9, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, - 1, 60, 5, 60, 498, 8, 60, 10, 60, 12, 60, 501, 9, 60, 1, 60, 1, 60, 1, - 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 5, 60, 512, 8, 60, 10, 60, - 12, 60, 515, 9, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 5, 60, 523, - 8, 60, 10, 60, 12, 60, 526, 9, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 5, - 60, 533, 8, 60, 10, 60, 12, 60, 536, 9, 60, 1, 60, 1, 60, 1, 60, 1, 60, - 1, 60, 1, 60, 1, 60, 1, 60, 5, 60, 546, 8, 60, 10, 60, 12, 60, 549, 9, + 54, 1, 54, 1, 54, 1, 54, 3, 54, 392, 8, 54, 1, 55, 4, 55, 395, 8, 55, 11, + 55, 12, 55, 396, 1, 56, 1, 56, 1, 56, 1, 56, 5, 56, 403, 8, 56, 10, 56, + 12, 56, 406, 9, 56, 1, 56, 1, 56, 1, 57, 4, 57, 411, 8, 57, 11, 57, 12, + 57, 412, 1, 57, 1, 57, 4, 57, 417, 8, 57, 11, 57, 12, 57, 418, 1, 57, 3, + 57, 422, 8, 57, 1, 57, 4, 57, 425, 8, 57, 11, 57, 12, 57, 426, 1, 57, 1, + 57, 1, 57, 1, 57, 4, 57, 433, 8, 57, 11, 57, 12, 57, 434, 1, 57, 3, 57, + 438, 8, 57, 3, 57, 440, 8, 57, 1, 58, 4, 58, 443, 8, 58, 11, 58, 12, 58, + 444, 1, 58, 1, 58, 1, 58, 1, 58, 4, 58, 451, 8, 58, 11, 58, 12, 58, 452, + 3, 58, 455, 8, 58, 1, 59, 4, 59, 458, 8, 59, 11, 59, 12, 59, 459, 1, 59, + 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 4, 59, 468, 8, 59, 11, 59, 12, 59, 469, + 1, 59, 1, 59, 3, 59, 474, 8, 59, 1, 60, 1, 60, 1, 60, 5, 60, 479, 8, 60, + 10, 60, 12, 60, 482, 9, 60, 1, 60, 1, 60, 1, 60, 1, 60, 5, 60, 488, 8, + 60, 10, 60, 12, 60, 491, 9, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, + 1, 60, 5, 60, 500, 8, 60, 10, 60, 12, 60, 503, 9, 60, 1, 60, 1, 60, 1, + 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 5, 60, 514, 8, 60, 10, 60, + 12, 60, 517, 9, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 5, 60, 525, + 8, 60, 10, 60, 12, 60, 528, 9, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 5, + 60, 535, 8, 60, 10, 60, 12, 60, 538, 9, 60, 1, 60, 1, 60, 1, 60, 1, 60, + 1, 60, 1, 60, 1, 60, 1, 60, 5, 60, 548, 8, 60, 10, 60, 12, 60, 551, 9, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, - 5, 60, 561, 8, 60, 10, 60, 12, 60, 564, 9, 60, 1, 60, 1, 60, 1, 60, 1, - 60, 3, 60, 570, 8, 60, 1, 61, 1, 61, 1, 61, 1, 62, 1, 62, 3, 62, 577, 8, - 62, 1, 62, 1, 62, 1, 62, 1, 62, 5, 62, 583, 8, 62, 10, 62, 12, 62, 586, - 9, 62, 1, 63, 1, 63, 3, 63, 590, 8, 63, 1, 63, 1, 63, 1, 63, 3, 63, 595, - 8, 63, 1, 63, 1, 63, 1, 63, 4, 63, 600, 8, 63, 11, 63, 12, 63, 601, 5, - 63, 604, 8, 63, 10, 63, 12, 63, 607, 9, 63, 1, 64, 3, 64, 610, 8, 64, 1, - 64, 3, 64, 613, 8, 64, 1, 64, 1, 64, 3, 64, 617, 8, 64, 1, 64, 3, 64, 620, - 8, 64, 1, 64, 3, 64, 623, 8, 64, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, - 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 3, 66, 637, 8, 66, 1, 67, - 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, - 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, - 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, - 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, - 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 3, 67, 688, 8, 67, 1, 68, 1, - 68, 1, 68, 1, 68, 1, 69, 1, 69, 1, 69, 1, 69, 1, 70, 1, 70, 1, 70, 1, 70, - 1, 71, 1, 71, 1, 71, 1, 71, 1, 72, 1, 72, 1, 72, 1, 72, 1, 73, 1, 73, 1, - 73, 1, 73, 1, 74, 1, 74, 1, 74, 1, 74, 4, 499, 513, 547, 562, 0, 75, 2, - 11, 4, 1, 6, 2, 8, 12, 10, 13, 12, 14, 14, 15, 16, 16, 18, 17, 20, 18, - 22, 19, 24, 20, 26, 21, 28, 22, 30, 23, 32, 24, 34, 25, 36, 26, 38, 27, - 40, 28, 42, 29, 44, 3, 46, 30, 48, 31, 50, 4, 52, 32, 54, 33, 56, 5, 58, - 34, 60, 35, 62, 36, 64, 7, 66, 8, 68, 37, 70, 38, 72, 39, 74, 40, 76, 41, - 78, 42, 80, 43, 82, 44, 84, 45, 86, 46, 88, 47, 90, 0, 92, 0, 94, 0, 96, - 0, 98, 0, 100, 0, 102, 0, 104, 0, 106, 0, 108, 0, 110, 0, 112, 9, 114, - 48, 116, 49, 118, 50, 120, 51, 122, 52, 124, 53, 126, 10, 128, 54, 130, - 55, 132, 0, 134, 56, 136, 57, 138, 0, 140, 0, 142, 0, 144, 0, 146, 0, 148, - 0, 150, 0, 2, 0, 1, 16, 2, 0, 65, 90, 97, 122, 2, 0, 69, 69, 101, 101, - 2, 0, 43, 43, 45, 45, 3, 0, 48, 57, 65, 70, 97, 102, 2, 0, 82, 82, 114, - 114, 10, 0, 34, 34, 39, 39, 63, 63, 92, 92, 96, 98, 102, 102, 110, 110, - 114, 114, 116, 116, 118, 118, 2, 0, 88, 88, 120, 120, 3, 0, 9, 9, 12, 12, - 32, 32, 1, 0, 10, 10, 2, 0, 85, 85, 117, 117, 4, 0, 10, 10, 13, 13, 34, - 34, 92, 92, 4, 0, 10, 10, 13, 13, 39, 39, 92, 92, 1, 0, 92, 92, 3, 0, 10, - 10, 13, 13, 34, 34, 3, 0, 10, 10, 13, 13, 39, 39, 2, 0, 66, 66, 98, 98, - 773, 0, 2, 1, 0, 0, 0, 0, 4, 1, 0, 0, 0, 0, 6, 1, 0, 0, 0, 0, 8, 1, 0, - 0, 0, 0, 10, 1, 0, 0, 0, 0, 12, 1, 0, 0, 0, 0, 14, 1, 0, 0, 0, 0, 16, 1, - 0, 0, 0, 0, 18, 1, 0, 0, 0, 0, 20, 1, 0, 0, 0, 0, 22, 1, 0, 0, 0, 0, 24, - 1, 0, 0, 0, 0, 26, 1, 0, 0, 0, 0, 28, 1, 0, 0, 0, 0, 30, 1, 0, 0, 0, 0, - 32, 1, 0, 0, 0, 0, 34, 1, 0, 0, 0, 0, 36, 1, 0, 0, 0, 0, 38, 1, 0, 0, 0, - 0, 40, 1, 0, 0, 0, 0, 42, 1, 0, 0, 0, 0, 44, 1, 0, 0, 0, 0, 46, 1, 0, 0, - 0, 0, 48, 1, 0, 0, 0, 0, 50, 1, 0, 0, 0, 0, 52, 1, 0, 0, 0, 0, 54, 1, 0, - 0, 0, 0, 56, 1, 0, 0, 0, 0, 58, 1, 0, 0, 0, 0, 60, 1, 0, 0, 0, 0, 62, 1, - 0, 0, 0, 0, 64, 1, 0, 0, 0, 0, 66, 1, 0, 0, 0, 0, 68, 1, 0, 0, 0, 0, 70, - 1, 0, 0, 0, 0, 72, 1, 0, 0, 0, 0, 74, 1, 0, 0, 0, 0, 76, 1, 0, 0, 0, 0, - 78, 1, 0, 0, 0, 0, 80, 1, 0, 0, 0, 0, 82, 1, 0, 0, 0, 0, 84, 1, 0, 0, 0, - 0, 86, 1, 0, 0, 0, 0, 88, 1, 0, 0, 0, 0, 112, 1, 0, 0, 0, 0, 114, 1, 0, - 0, 0, 0, 116, 1, 0, 0, 0, 0, 118, 1, 0, 0, 0, 0, 120, 1, 0, 0, 0, 0, 122, - 1, 0, 0, 0, 0, 124, 1, 0, 0, 0, 0, 126, 1, 0, 0, 0, 0, 128, 1, 0, 0, 0, - 0, 130, 1, 0, 0, 0, 1, 132, 1, 0, 0, 0, 1, 134, 1, 0, 0, 0, 1, 136, 1, - 0, 0, 0, 1, 138, 1, 0, 0, 0, 1, 140, 1, 0, 0, 0, 1, 142, 1, 0, 0, 0, 1, - 144, 1, 0, 0, 0, 1, 146, 1, 0, 0, 0, 1, 148, 1, 0, 0, 0, 1, 150, 1, 0, - 0, 0, 2, 152, 1, 0, 0, 0, 4, 154, 1, 0, 0, 0, 6, 156, 1, 0, 0, 0, 8, 158, - 1, 0, 0, 0, 10, 162, 1, 0, 0, 0, 12, 165, 1, 0, 0, 0, 14, 173, 1, 0, 0, - 0, 16, 178, 1, 0, 0, 0, 18, 185, 1, 0, 0, 0, 20, 191, 1, 0, 0, 0, 22, 199, - 1, 0, 0, 0, 24, 209, 1, 0, 0, 0, 26, 216, 1, 0, 0, 0, 28, 221, 1, 0, 0, - 0, 30, 233, 1, 0, 0, 0, 32, 243, 1, 0, 0, 0, 34, 252, 1, 0, 0, 0, 36, 259, - 1, 0, 0, 0, 38, 264, 1, 0, 0, 0, 40, 267, 1, 0, 0, 0, 42, 270, 1, 0, 0, - 0, 44, 273, 1, 0, 0, 0, 46, 275, 1, 0, 0, 0, 48, 278, 1, 0, 0, 0, 50, 281, - 1, 0, 0, 0, 52, 283, 1, 0, 0, 0, 54, 286, 1, 0, 0, 0, 56, 289, 1, 0, 0, - 0, 58, 291, 1, 0, 0, 0, 60, 293, 1, 0, 0, 0, 62, 295, 1, 0, 0, 0, 64, 297, - 1, 0, 0, 0, 66, 299, 1, 0, 0, 0, 68, 301, 1, 0, 0, 0, 70, 303, 1, 0, 0, - 0, 72, 305, 1, 0, 0, 0, 74, 307, 1, 0, 0, 0, 76, 309, 1, 0, 0, 0, 78, 311, - 1, 0, 0, 0, 80, 313, 1, 0, 0, 0, 82, 315, 1, 0, 0, 0, 84, 317, 1, 0, 0, - 0, 86, 322, 1, 0, 0, 0, 88, 328, 1, 0, 0, 0, 90, 333, 1, 0, 0, 0, 92, 335, - 1, 0, 0, 0, 94, 337, 1, 0, 0, 0, 96, 339, 1, 0, 0, 0, 98, 348, 1, 0, 0, - 0, 100, 350, 1, 0, 0, 0, 102, 356, 1, 0, 0, 0, 104, 358, 1, 0, 0, 0, 106, - 361, 1, 0, 0, 0, 108, 366, 1, 0, 0, 0, 110, 389, 1, 0, 0, 0, 112, 392, - 1, 0, 0, 0, 114, 396, 1, 0, 0, 0, 116, 437, 1, 0, 0, 0, 118, 452, 1, 0, - 0, 0, 120, 471, 1, 0, 0, 0, 122, 569, 1, 0, 0, 0, 124, 571, 1, 0, 0, 0, - 126, 576, 1, 0, 0, 0, 128, 589, 1, 0, 0, 0, 130, 609, 1, 0, 0, 0, 132, - 624, 1, 0, 0, 0, 134, 636, 1, 0, 0, 0, 136, 687, 1, 0, 0, 0, 138, 689, - 1, 0, 0, 0, 140, 693, 1, 0, 0, 0, 142, 697, 1, 0, 0, 0, 144, 701, 1, 0, - 0, 0, 146, 705, 1, 0, 0, 0, 148, 709, 1, 0, 0, 0, 150, 713, 1, 0, 0, 0, - 152, 153, 5, 35, 0, 0, 153, 3, 1, 0, 0, 0, 154, 155, 5, 58, 0, 0, 155, - 5, 1, 0, 0, 0, 156, 157, 5, 44, 0, 0, 157, 7, 1, 0, 0, 0, 158, 159, 5, - 97, 0, 0, 159, 160, 5, 110, 0, 0, 160, 161, 5, 100, 0, 0, 161, 9, 1, 0, - 0, 0, 162, 163, 5, 111, 0, 0, 163, 164, 5, 114, 0, 0, 164, 11, 1, 0, 0, - 0, 165, 166, 5, 98, 0, 0, 166, 167, 5, 117, 0, 0, 167, 168, 5, 116, 0, - 0, 168, 169, 5, 32, 0, 0, 169, 170, 5, 110, 0, 0, 170, 171, 5, 111, 0, - 0, 171, 172, 5, 116, 0, 0, 172, 13, 1, 0, 0, 0, 173, 174, 5, 102, 0, 0, - 174, 175, 5, 114, 0, 0, 175, 176, 5, 111, 0, 0, 176, 177, 5, 109, 0, 0, - 177, 15, 1, 0, 0, 0, 178, 179, 5, 109, 0, 0, 179, 180, 5, 111, 0, 0, 180, - 181, 5, 100, 0, 0, 181, 182, 5, 117, 0, 0, 182, 183, 5, 108, 0, 0, 183, - 184, 5, 101, 0, 0, 184, 17, 1, 0, 0, 0, 185, 186, 5, 109, 0, 0, 186, 187, - 5, 111, 0, 0, 187, 188, 5, 100, 0, 0, 188, 189, 5, 101, 0, 0, 189, 190, - 5, 108, 0, 0, 190, 19, 1, 0, 0, 0, 191, 192, 5, 115, 0, 0, 192, 193, 5, - 99, 0, 0, 193, 194, 5, 104, 0, 0, 194, 195, 5, 101, 0, 0, 195, 196, 5, - 109, 0, 0, 196, 197, 5, 97, 0, 0, 197, 21, 1, 0, 0, 0, 198, 200, 3, 94, - 46, 0, 199, 198, 1, 0, 0, 0, 200, 201, 1, 0, 0, 0, 201, 199, 1, 0, 0, 0, - 201, 202, 1, 0, 0, 0, 202, 203, 1, 0, 0, 0, 203, 205, 5, 46, 0, 0, 204, - 206, 3, 94, 46, 0, 205, 204, 1, 0, 0, 0, 206, 207, 1, 0, 0, 0, 207, 205, - 1, 0, 0, 0, 207, 208, 1, 0, 0, 0, 208, 23, 1, 0, 0, 0, 209, 210, 5, 101, - 0, 0, 210, 211, 5, 120, 0, 0, 211, 212, 5, 116, 0, 0, 212, 213, 5, 101, - 0, 0, 213, 214, 5, 110, 0, 0, 214, 215, 5, 100, 0, 0, 215, 25, 1, 0, 0, - 0, 216, 217, 5, 116, 0, 0, 217, 218, 5, 121, 0, 0, 218, 219, 5, 112, 0, - 0, 219, 220, 5, 101, 0, 0, 220, 27, 1, 0, 0, 0, 221, 222, 5, 99, 0, 0, - 222, 223, 5, 111, 0, 0, 223, 224, 5, 110, 0, 0, 224, 225, 5, 100, 0, 0, - 225, 226, 5, 105, 0, 0, 226, 227, 5, 116, 0, 0, 227, 228, 5, 105, 0, 0, - 228, 229, 5, 111, 0, 0, 229, 230, 5, 110, 0, 0, 230, 231, 1, 0, 0, 0, 231, - 232, 6, 13, 0, 0, 232, 29, 1, 0, 0, 0, 233, 234, 5, 114, 0, 0, 234, 235, - 5, 101, 0, 0, 235, 236, 5, 108, 0, 0, 236, 237, 5, 97, 0, 0, 237, 238, - 5, 116, 0, 0, 238, 239, 5, 105, 0, 0, 239, 240, 5, 111, 0, 0, 240, 241, - 5, 110, 0, 0, 241, 242, 5, 115, 0, 0, 242, 31, 1, 0, 0, 0, 243, 244, 5, - 114, 0, 0, 244, 245, 5, 101, 0, 0, 245, 246, 5, 108, 0, 0, 246, 247, 5, - 97, 0, 0, 247, 248, 5, 116, 0, 0, 248, 249, 5, 105, 0, 0, 249, 250, 5, - 111, 0, 0, 250, 251, 5, 110, 0, 0, 251, 33, 1, 0, 0, 0, 252, 253, 5, 100, - 0, 0, 253, 254, 5, 101, 0, 0, 254, 255, 5, 102, 0, 0, 255, 256, 5, 105, - 0, 0, 256, 257, 5, 110, 0, 0, 257, 258, 5, 101, 0, 0, 258, 35, 1, 0, 0, - 0, 259, 260, 5, 119, 0, 0, 260, 261, 5, 105, 0, 0, 261, 262, 5, 116, 0, - 0, 262, 263, 5, 104, 0, 0, 263, 37, 1, 0, 0, 0, 264, 265, 5, 61, 0, 0, - 265, 266, 5, 61, 0, 0, 266, 39, 1, 0, 0, 0, 267, 268, 5, 33, 0, 0, 268, - 269, 5, 61, 0, 0, 269, 41, 1, 0, 0, 0, 270, 271, 5, 105, 0, 0, 271, 272, - 5, 110, 0, 0, 272, 43, 1, 0, 0, 0, 273, 274, 5, 60, 0, 0, 274, 45, 1, 0, - 0, 0, 275, 276, 5, 60, 0, 0, 276, 277, 5, 61, 0, 0, 277, 47, 1, 0, 0, 0, - 278, 279, 5, 62, 0, 0, 279, 280, 5, 61, 0, 0, 280, 49, 1, 0, 0, 0, 281, - 282, 5, 62, 0, 0, 282, 51, 1, 0, 0, 0, 283, 284, 5, 38, 0, 0, 284, 285, - 5, 38, 0, 0, 285, 53, 1, 0, 0, 0, 286, 287, 5, 124, 0, 0, 287, 288, 5, - 124, 0, 0, 288, 55, 1, 0, 0, 0, 289, 290, 5, 91, 0, 0, 290, 57, 1, 0, 0, - 0, 291, 292, 5, 93, 0, 0, 292, 59, 1, 0, 0, 0, 293, 294, 5, 123, 0, 0, - 294, 61, 1, 0, 0, 0, 295, 296, 5, 125, 0, 0, 296, 63, 1, 0, 0, 0, 297, - 298, 5, 40, 0, 0, 298, 65, 1, 0, 0, 0, 299, 300, 5, 41, 0, 0, 300, 67, - 1, 0, 0, 0, 301, 302, 5, 46, 0, 0, 302, 69, 1, 0, 0, 0, 303, 304, 5, 45, - 0, 0, 304, 71, 1, 0, 0, 0, 305, 306, 5, 33, 0, 0, 306, 73, 1, 0, 0, 0, - 307, 308, 5, 63, 0, 0, 308, 75, 1, 0, 0, 0, 309, 310, 5, 43, 0, 0, 310, - 77, 1, 0, 0, 0, 311, 312, 5, 42, 0, 0, 312, 79, 1, 0, 0, 0, 313, 314, 5, - 47, 0, 0, 314, 81, 1, 0, 0, 0, 315, 316, 5, 37, 0, 0, 316, 83, 1, 0, 0, - 0, 317, 318, 5, 116, 0, 0, 318, 319, 5, 114, 0, 0, 319, 320, 5, 117, 0, - 0, 320, 321, 5, 101, 0, 0, 321, 85, 1, 0, 0, 0, 322, 323, 5, 102, 0, 0, - 323, 324, 5, 97, 0, 0, 324, 325, 5, 108, 0, 0, 325, 326, 5, 115, 0, 0, - 326, 327, 5, 101, 0, 0, 327, 87, 1, 0, 0, 0, 328, 329, 5, 110, 0, 0, 329, - 330, 5, 117, 0, 0, 330, 331, 5, 108, 0, 0, 331, 332, 5, 108, 0, 0, 332, - 89, 1, 0, 0, 0, 333, 334, 5, 92, 0, 0, 334, 91, 1, 0, 0, 0, 335, 336, 7, - 0, 0, 0, 336, 93, 1, 0, 0, 0, 337, 338, 2, 48, 57, 0, 338, 95, 1, 0, 0, - 0, 339, 341, 7, 1, 0, 0, 340, 342, 7, 2, 0, 0, 341, 340, 1, 0, 0, 0, 341, - 342, 1, 0, 0, 0, 342, 344, 1, 0, 0, 0, 343, 345, 3, 94, 46, 0, 344, 343, - 1, 0, 0, 0, 345, 346, 1, 0, 0, 0, 346, 344, 1, 0, 0, 0, 346, 347, 1, 0, - 0, 0, 347, 97, 1, 0, 0, 0, 348, 349, 7, 3, 0, 0, 349, 99, 1, 0, 0, 0, 350, - 351, 7, 4, 0, 0, 351, 101, 1, 0, 0, 0, 352, 357, 3, 104, 51, 0, 353, 357, - 3, 108, 53, 0, 354, 357, 3, 110, 54, 0, 355, 357, 3, 106, 52, 0, 356, 352, - 1, 0, 0, 0, 356, 353, 1, 0, 0, 0, 356, 354, 1, 0, 0, 0, 356, 355, 1, 0, - 0, 0, 357, 103, 1, 0, 0, 0, 358, 359, 3, 90, 44, 0, 359, 360, 7, 5, 0, - 0, 360, 105, 1, 0, 0, 0, 361, 362, 3, 90, 44, 0, 362, 363, 2, 48, 51, 0, - 363, 364, 2, 48, 55, 0, 364, 365, 2, 48, 55, 0, 365, 107, 1, 0, 0, 0, 366, - 367, 3, 90, 44, 0, 367, 368, 7, 6, 0, 0, 368, 369, 3, 98, 48, 0, 369, 370, - 3, 98, 48, 0, 370, 109, 1, 0, 0, 0, 371, 372, 3, 90, 44, 0, 372, 373, 5, - 117, 0, 0, 373, 374, 3, 98, 48, 0, 374, 375, 3, 98, 48, 0, 375, 376, 3, - 98, 48, 0, 376, 377, 3, 98, 48, 0, 377, 390, 1, 0, 0, 0, 378, 379, 3, 90, - 44, 0, 379, 380, 5, 85, 0, 0, 380, 381, 3, 98, 48, 0, 381, 382, 3, 98, - 48, 0, 382, 383, 3, 98, 48, 0, 383, 384, 3, 98, 48, 0, 384, 385, 3, 98, - 48, 0, 385, 386, 3, 98, 48, 0, 386, 387, 3, 98, 48, 0, 387, 388, 3, 98, - 48, 0, 388, 390, 1, 0, 0, 0, 389, 371, 1, 0, 0, 0, 389, 378, 1, 0, 0, 0, - 390, 111, 1, 0, 0, 0, 391, 393, 7, 7, 0, 0, 392, 391, 1, 0, 0, 0, 393, - 394, 1, 0, 0, 0, 394, 392, 1, 0, 0, 0, 394, 395, 1, 0, 0, 0, 395, 113, - 1, 0, 0, 0, 396, 397, 5, 47, 0, 0, 397, 398, 5, 47, 0, 0, 398, 402, 1, - 0, 0, 0, 399, 401, 8, 8, 0, 0, 400, 399, 1, 0, 0, 0, 401, 404, 1, 0, 0, - 0, 402, 400, 1, 0, 0, 0, 402, 403, 1, 0, 0, 0, 403, 405, 1, 0, 0, 0, 404, - 402, 1, 0, 0, 0, 405, 406, 6, 56, 1, 0, 406, 115, 1, 0, 0, 0, 407, 409, - 3, 94, 46, 0, 408, 407, 1, 0, 0, 0, 409, 410, 1, 0, 0, 0, 410, 408, 1, - 0, 0, 0, 410, 411, 1, 0, 0, 0, 411, 412, 1, 0, 0, 0, 412, 414, 5, 46, 0, - 0, 413, 415, 3, 94, 46, 0, 414, 413, 1, 0, 0, 0, 415, 416, 1, 0, 0, 0, - 416, 414, 1, 0, 0, 0, 416, 417, 1, 0, 0, 0, 417, 419, 1, 0, 0, 0, 418, - 420, 3, 96, 47, 0, 419, 418, 1, 0, 0, 0, 419, 420, 1, 0, 0, 0, 420, 438, - 1, 0, 0, 0, 421, 423, 3, 94, 46, 0, 422, 421, 1, 0, 0, 0, 423, 424, 1, - 0, 0, 0, 424, 422, 1, 0, 0, 0, 424, 425, 1, 0, 0, 0, 425, 426, 1, 0, 0, - 0, 426, 427, 3, 96, 47, 0, 427, 438, 1, 0, 0, 0, 428, 430, 5, 46, 0, 0, - 429, 431, 3, 94, 46, 0, 430, 429, 1, 0, 0, 0, 431, 432, 1, 0, 0, 0, 432, - 430, 1, 0, 0, 0, 432, 433, 1, 0, 0, 0, 433, 435, 1, 0, 0, 0, 434, 436, - 3, 96, 47, 0, 435, 434, 1, 0, 0, 0, 435, 436, 1, 0, 0, 0, 436, 438, 1, - 0, 0, 0, 437, 408, 1, 0, 0, 0, 437, 422, 1, 0, 0, 0, 437, 428, 1, 0, 0, - 0, 438, 117, 1, 0, 0, 0, 439, 441, 3, 94, 46, 0, 440, 439, 1, 0, 0, 0, - 441, 442, 1, 0, 0, 0, 442, 440, 1, 0, 0, 0, 442, 443, 1, 0, 0, 0, 443, - 453, 1, 0, 0, 0, 444, 445, 5, 48, 0, 0, 445, 446, 5, 120, 0, 0, 446, 448, - 1, 0, 0, 0, 447, 449, 3, 98, 48, 0, 448, 447, 1, 0, 0, 0, 449, 450, 1, - 0, 0, 0, 450, 448, 1, 0, 0, 0, 450, 451, 1, 0, 0, 0, 451, 453, 1, 0, 0, - 0, 452, 440, 1, 0, 0, 0, 452, 444, 1, 0, 0, 0, 453, 119, 1, 0, 0, 0, 454, - 456, 3, 94, 46, 0, 455, 454, 1, 0, 0, 0, 456, 457, 1, 0, 0, 0, 457, 455, - 1, 0, 0, 0, 457, 458, 1, 0, 0, 0, 458, 459, 1, 0, 0, 0, 459, 460, 7, 9, - 0, 0, 460, 472, 1, 0, 0, 0, 461, 462, 5, 48, 0, 0, 462, 463, 5, 120, 0, - 0, 463, 465, 1, 0, 0, 0, 464, 466, 3, 98, 48, 0, 465, 464, 1, 0, 0, 0, - 466, 467, 1, 0, 0, 0, 467, 465, 1, 0, 0, 0, 467, 468, 1, 0, 0, 0, 468, - 469, 1, 0, 0, 0, 469, 470, 7, 9, 0, 0, 470, 472, 1, 0, 0, 0, 471, 455, - 1, 0, 0, 0, 471, 461, 1, 0, 0, 0, 472, 121, 1, 0, 0, 0, 473, 478, 5, 34, - 0, 0, 474, 477, 3, 102, 50, 0, 475, 477, 8, 10, 0, 0, 476, 474, 1, 0, 0, - 0, 476, 475, 1, 0, 0, 0, 477, 480, 1, 0, 0, 0, 478, 476, 1, 0, 0, 0, 478, - 479, 1, 0, 0, 0, 479, 481, 1, 0, 0, 0, 480, 478, 1, 0, 0, 0, 481, 570, - 5, 34, 0, 0, 482, 487, 5, 39, 0, 0, 483, 486, 3, 102, 50, 0, 484, 486, - 8, 11, 0, 0, 485, 483, 1, 0, 0, 0, 485, 484, 1, 0, 0, 0, 486, 489, 1, 0, - 0, 0, 487, 485, 1, 0, 0, 0, 487, 488, 1, 0, 0, 0, 488, 490, 1, 0, 0, 0, - 489, 487, 1, 0, 0, 0, 490, 570, 5, 39, 0, 0, 491, 492, 5, 34, 0, 0, 492, - 493, 5, 34, 0, 0, 493, 494, 5, 34, 0, 0, 494, 499, 1, 0, 0, 0, 495, 498, - 3, 102, 50, 0, 496, 498, 8, 12, 0, 0, 497, 495, 1, 0, 0, 0, 497, 496, 1, - 0, 0, 0, 498, 501, 1, 0, 0, 0, 499, 500, 1, 0, 0, 0, 499, 497, 1, 0, 0, - 0, 500, 502, 1, 0, 0, 0, 501, 499, 1, 0, 0, 0, 502, 503, 5, 34, 0, 0, 503, - 504, 5, 34, 0, 0, 504, 570, 5, 34, 0, 0, 505, 506, 5, 39, 0, 0, 506, 507, - 5, 39, 0, 0, 507, 508, 5, 39, 0, 0, 508, 513, 1, 0, 0, 0, 509, 512, 3, - 102, 50, 0, 510, 512, 8, 12, 0, 0, 511, 509, 1, 0, 0, 0, 511, 510, 1, 0, - 0, 0, 512, 515, 1, 0, 0, 0, 513, 514, 1, 0, 0, 0, 513, 511, 1, 0, 0, 0, - 514, 516, 1, 0, 0, 0, 515, 513, 1, 0, 0, 0, 516, 517, 5, 39, 0, 0, 517, - 518, 5, 39, 0, 0, 518, 570, 5, 39, 0, 0, 519, 520, 3, 100, 49, 0, 520, - 524, 5, 34, 0, 0, 521, 523, 8, 13, 0, 0, 522, 521, 1, 0, 0, 0, 523, 526, - 1, 0, 0, 0, 524, 522, 1, 0, 0, 0, 524, 525, 1, 0, 0, 0, 525, 527, 1, 0, - 0, 0, 526, 524, 1, 0, 0, 0, 527, 528, 5, 34, 0, 0, 528, 570, 1, 0, 0, 0, - 529, 530, 3, 100, 49, 0, 530, 534, 5, 39, 0, 0, 531, 533, 8, 14, 0, 0, - 532, 531, 1, 0, 0, 0, 533, 536, 1, 0, 0, 0, 534, 532, 1, 0, 0, 0, 534, - 535, 1, 0, 0, 0, 535, 537, 1, 0, 0, 0, 536, 534, 1, 0, 0, 0, 537, 538, - 5, 39, 0, 0, 538, 570, 1, 0, 0, 0, 539, 540, 3, 100, 49, 0, 540, 541, 5, - 34, 0, 0, 541, 542, 5, 34, 0, 0, 542, 543, 5, 34, 0, 0, 543, 547, 1, 0, - 0, 0, 544, 546, 9, 0, 0, 0, 545, 544, 1, 0, 0, 0, 546, 549, 1, 0, 0, 0, - 547, 548, 1, 0, 0, 0, 547, 545, 1, 0, 0, 0, 548, 550, 1, 0, 0, 0, 549, - 547, 1, 0, 0, 0, 550, 551, 5, 34, 0, 0, 551, 552, 5, 34, 0, 0, 552, 553, - 5, 34, 0, 0, 553, 570, 1, 0, 0, 0, 554, 555, 3, 100, 49, 0, 555, 556, 5, - 39, 0, 0, 556, 557, 5, 39, 0, 0, 557, 558, 5, 39, 0, 0, 558, 562, 1, 0, - 0, 0, 559, 561, 9, 0, 0, 0, 560, 559, 1, 0, 0, 0, 561, 564, 1, 0, 0, 0, - 562, 563, 1, 0, 0, 0, 562, 560, 1, 0, 0, 0, 563, 565, 1, 0, 0, 0, 564, - 562, 1, 0, 0, 0, 565, 566, 5, 39, 0, 0, 566, 567, 5, 39, 0, 0, 567, 568, - 5, 39, 0, 0, 568, 570, 1, 0, 0, 0, 569, 473, 1, 0, 0, 0, 569, 482, 1, 0, - 0, 0, 569, 491, 1, 0, 0, 0, 569, 505, 1, 0, 0, 0, 569, 519, 1, 0, 0, 0, - 569, 529, 1, 0, 0, 0, 569, 539, 1, 0, 0, 0, 569, 554, 1, 0, 0, 0, 570, - 123, 1, 0, 0, 0, 571, 572, 7, 15, 0, 0, 572, 573, 3, 122, 60, 0, 573, 125, - 1, 0, 0, 0, 574, 577, 3, 92, 45, 0, 575, 577, 5, 95, 0, 0, 576, 574, 1, - 0, 0, 0, 576, 575, 1, 0, 0, 0, 577, 584, 1, 0, 0, 0, 578, 583, 3, 92, 45, - 0, 579, 583, 3, 94, 46, 0, 580, 583, 5, 95, 0, 0, 581, 583, 3, 70, 34, - 0, 582, 578, 1, 0, 0, 0, 582, 579, 1, 0, 0, 0, 582, 580, 1, 0, 0, 0, 582, - 581, 1, 0, 0, 0, 583, 586, 1, 0, 0, 0, 584, 582, 1, 0, 0, 0, 584, 585, - 1, 0, 0, 0, 585, 127, 1, 0, 0, 0, 586, 584, 1, 0, 0, 0, 587, 590, 3, 92, - 45, 0, 588, 590, 5, 95, 0, 0, 589, 587, 1, 0, 0, 0, 589, 588, 1, 0, 0, - 0, 590, 605, 1, 0, 0, 0, 591, 595, 3, 80, 39, 0, 592, 595, 3, 68, 33, 0, - 593, 595, 3, 70, 34, 0, 594, 591, 1, 0, 0, 0, 594, 592, 1, 0, 0, 0, 594, - 593, 1, 0, 0, 0, 594, 595, 1, 0, 0, 0, 595, 599, 1, 0, 0, 0, 596, 600, - 3, 92, 45, 0, 597, 600, 3, 94, 46, 0, 598, 600, 5, 95, 0, 0, 599, 596, - 1, 0, 0, 0, 599, 597, 1, 0, 0, 0, 599, 598, 1, 0, 0, 0, 600, 601, 1, 0, - 0, 0, 601, 599, 1, 0, 0, 0, 601, 602, 1, 0, 0, 0, 602, 604, 1, 0, 0, 0, - 603, 594, 1, 0, 0, 0, 604, 607, 1, 0, 0, 0, 605, 603, 1, 0, 0, 0, 605, - 606, 1, 0, 0, 0, 606, 129, 1, 0, 0, 0, 607, 605, 1, 0, 0, 0, 608, 610, - 3, 112, 55, 0, 609, 608, 1, 0, 0, 0, 609, 610, 1, 0, 0, 0, 610, 616, 1, - 0, 0, 0, 611, 613, 5, 13, 0, 0, 612, 611, 1, 0, 0, 0, 612, 613, 1, 0, 0, - 0, 613, 614, 1, 0, 0, 0, 614, 617, 5, 10, 0, 0, 615, 617, 2, 12, 13, 0, - 616, 612, 1, 0, 0, 0, 616, 615, 1, 0, 0, 0, 617, 619, 1, 0, 0, 0, 618, - 620, 3, 112, 55, 0, 619, 618, 1, 0, 0, 0, 619, 620, 1, 0, 0, 0, 620, 622, - 1, 0, 0, 0, 621, 623, 3, 130, 64, 0, 622, 621, 1, 0, 0, 0, 622, 623, 1, - 0, 0, 0, 623, 131, 1, 0, 0, 0, 624, 625, 3, 66, 32, 0, 625, 626, 1, 0, - 0, 0, 626, 627, 6, 65, 2, 0, 627, 628, 6, 65, 3, 0, 628, 133, 1, 0, 0, - 0, 629, 630, 5, 109, 0, 0, 630, 631, 5, 97, 0, 0, 631, 637, 5, 112, 0, - 0, 632, 633, 5, 108, 0, 0, 633, 634, 5, 105, 0, 0, 634, 635, 5, 115, 0, - 0, 635, 637, 5, 116, 0, 0, 636, 629, 1, 0, 0, 0, 636, 632, 1, 0, 0, 0, - 637, 135, 1, 0, 0, 0, 638, 639, 5, 98, 0, 0, 639, 640, 5, 111, 0, 0, 640, - 641, 5, 111, 0, 0, 641, 688, 5, 108, 0, 0, 642, 643, 5, 115, 0, 0, 643, - 644, 5, 116, 0, 0, 644, 645, 5, 114, 0, 0, 645, 646, 5, 105, 0, 0, 646, - 647, 5, 110, 0, 0, 647, 688, 5, 103, 0, 0, 648, 649, 5, 105, 0, 0, 649, - 650, 5, 110, 0, 0, 650, 688, 5, 116, 0, 0, 651, 652, 5, 117, 0, 0, 652, - 653, 5, 105, 0, 0, 653, 654, 5, 110, 0, 0, 654, 688, 5, 116, 0, 0, 655, - 656, 5, 100, 0, 0, 656, 657, 5, 111, 0, 0, 657, 658, 5, 117, 0, 0, 658, - 659, 5, 98, 0, 0, 659, 660, 5, 108, 0, 0, 660, 688, 5, 101, 0, 0, 661, - 662, 5, 100, 0, 0, 662, 663, 5, 117, 0, 0, 663, 664, 5, 114, 0, 0, 664, - 665, 5, 97, 0, 0, 665, 666, 5, 116, 0, 0, 666, 667, 5, 105, 0, 0, 667, - 668, 5, 111, 0, 0, 668, 688, 5, 110, 0, 0, 669, 670, 5, 116, 0, 0, 670, - 671, 5, 105, 0, 0, 671, 672, 5, 109, 0, 0, 672, 673, 5, 101, 0, 0, 673, - 674, 5, 115, 0, 0, 674, 675, 5, 116, 0, 0, 675, 676, 5, 97, 0, 0, 676, - 677, 5, 109, 0, 0, 677, 688, 5, 112, 0, 0, 678, 679, 5, 105, 0, 0, 679, - 680, 5, 112, 0, 0, 680, 681, 5, 97, 0, 0, 681, 682, 5, 100, 0, 0, 682, - 683, 5, 100, 0, 0, 683, 684, 5, 114, 0, 0, 684, 685, 5, 101, 0, 0, 685, - 686, 5, 115, 0, 0, 686, 688, 5, 115, 0, 0, 687, 638, 1, 0, 0, 0, 687, 642, - 1, 0, 0, 0, 687, 648, 1, 0, 0, 0, 687, 651, 1, 0, 0, 0, 687, 655, 1, 0, - 0, 0, 687, 661, 1, 0, 0, 0, 687, 669, 1, 0, 0, 0, 687, 678, 1, 0, 0, 0, - 688, 137, 1, 0, 0, 0, 689, 690, 3, 44, 21, 0, 690, 691, 1, 0, 0, 0, 691, - 692, 6, 68, 4, 0, 692, 139, 1, 0, 0, 0, 693, 694, 3, 50, 24, 0, 694, 695, - 1, 0, 0, 0, 695, 696, 6, 69, 5, 0, 696, 141, 1, 0, 0, 0, 697, 698, 3, 64, - 31, 0, 698, 699, 1, 0, 0, 0, 699, 700, 6, 70, 6, 0, 700, 143, 1, 0, 0, - 0, 701, 702, 3, 4, 1, 0, 702, 703, 1, 0, 0, 0, 703, 704, 6, 71, 7, 0, 704, - 145, 1, 0, 0, 0, 705, 706, 3, 6, 2, 0, 706, 707, 1, 0, 0, 0, 707, 708, - 6, 72, 8, 0, 708, 147, 1, 0, 0, 0, 709, 710, 3, 112, 55, 0, 710, 711, 1, - 0, 0, 0, 711, 712, 6, 73, 9, 0, 712, 149, 1, 0, 0, 0, 713, 714, 3, 126, - 62, 0, 714, 715, 1, 0, 0, 0, 715, 716, 6, 74, 10, 0, 716, 151, 1, 0, 0, - 0, 51, 0, 1, 201, 207, 341, 346, 356, 389, 394, 402, 410, 416, 419, 424, - 432, 435, 437, 442, 450, 452, 457, 467, 471, 476, 478, 485, 487, 497, 499, - 511, 513, 524, 534, 547, 562, 569, 576, 582, 584, 589, 594, 599, 601, 605, - 609, 612, 616, 619, 622, 636, 687, 11, 5, 1, 0, 0, 1, 0, 7, 8, 0, 4, 0, - 0, 7, 3, 0, 7, 4, 0, 7, 7, 0, 7, 1, 0, 7, 2, 0, 7, 9, 0, 7, 10, 0, + 5, 60, 563, 8, 60, 10, 60, 12, 60, 566, 9, 60, 1, 60, 1, 60, 1, 60, 1, + 60, 3, 60, 572, 8, 60, 1, 61, 1, 61, 1, 61, 1, 62, 1, 62, 1, 62, 1, 62, + 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 63, 1, 63, 3, + 63, 591, 8, 63, 1, 63, 1, 63, 1, 63, 1, 63, 5, 63, 597, 8, 63, 10, 63, + 12, 63, 600, 9, 63, 1, 64, 1, 64, 3, 64, 604, 8, 64, 1, 64, 1, 64, 1, 64, + 3, 64, 609, 8, 64, 1, 64, 1, 64, 1, 64, 4, 64, 614, 8, 64, 11, 64, 12, + 64, 615, 5, 64, 618, 8, 64, 10, 64, 12, 64, 621, 9, 64, 1, 65, 3, 65, 624, + 8, 65, 1, 65, 3, 65, 627, 8, 65, 1, 65, 1, 65, 3, 65, 631, 8, 65, 1, 65, + 3, 65, 634, 8, 65, 1, 65, 3, 65, 637, 8, 65, 1, 66, 1, 66, 1, 66, 1, 66, + 1, 66, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 3, 67, 651, 8, + 67, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, + 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, + 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, + 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, + 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 3, 68, 702, 8, 68, + 1, 69, 1, 69, 1, 69, 1, 69, 1, 70, 1, 70, 1, 70, 1, 70, 1, 71, 1, 71, 1, + 71, 1, 71, 1, 72, 1, 72, 1, 72, 1, 72, 1, 73, 1, 73, 1, 73, 1, 73, 1, 74, + 1, 74, 1, 74, 1, 74, 1, 75, 1, 75, 1, 75, 1, 75, 4, 501, 515, 549, 564, + 0, 76, 2, 11, 4, 1, 6, 2, 8, 12, 10, 13, 12, 14, 14, 15, 16, 16, 18, 17, + 20, 18, 22, 19, 24, 20, 26, 21, 28, 22, 30, 23, 32, 24, 34, 25, 36, 26, + 38, 27, 40, 28, 42, 29, 44, 3, 46, 30, 48, 31, 50, 4, 52, 32, 54, 33, 56, + 5, 58, 34, 60, 35, 62, 36, 64, 7, 66, 8, 68, 37, 70, 38, 72, 39, 74, 40, + 76, 41, 78, 42, 80, 43, 82, 44, 84, 45, 86, 46, 88, 47, 90, 0, 92, 0, 94, + 0, 96, 0, 98, 0, 100, 0, 102, 0, 104, 0, 106, 0, 108, 0, 110, 0, 112, 9, + 114, 48, 116, 49, 118, 50, 120, 51, 122, 52, 124, 53, 126, 54, 128, 10, + 130, 55, 132, 56, 134, 0, 136, 57, 138, 58, 140, 0, 142, 0, 144, 0, 146, + 0, 148, 0, 150, 0, 152, 0, 2, 0, 1, 16, 2, 0, 65, 90, 97, 122, 2, 0, 69, + 69, 101, 101, 2, 0, 43, 43, 45, 45, 3, 0, 48, 57, 65, 70, 97, 102, 2, 0, + 82, 82, 114, 114, 10, 0, 34, 34, 39, 39, 63, 63, 92, 92, 96, 98, 102, 102, + 110, 110, 114, 114, 116, 116, 118, 118, 2, 0, 88, 88, 120, 120, 3, 0, 9, + 9, 12, 12, 32, 32, 1, 0, 10, 10, 2, 0, 85, 85, 117, 117, 4, 0, 10, 10, + 13, 13, 34, 34, 92, 92, 4, 0, 10, 10, 13, 13, 39, 39, 92, 92, 1, 0, 92, + 92, 3, 0, 10, 10, 13, 13, 34, 34, 3, 0, 10, 10, 13, 13, 39, 39, 2, 0, 66, + 66, 98, 98, 787, 0, 2, 1, 0, 0, 0, 0, 4, 1, 0, 0, 0, 0, 6, 1, 0, 0, 0, + 0, 8, 1, 0, 0, 0, 0, 10, 1, 0, 0, 0, 0, 12, 1, 0, 0, 0, 0, 14, 1, 0, 0, + 0, 0, 16, 1, 0, 0, 0, 0, 18, 1, 0, 0, 0, 0, 20, 1, 0, 0, 0, 0, 22, 1, 0, + 0, 0, 0, 24, 1, 0, 0, 0, 0, 26, 1, 0, 0, 0, 0, 28, 1, 0, 0, 0, 0, 30, 1, + 0, 0, 0, 0, 32, 1, 0, 0, 0, 0, 34, 1, 0, 0, 0, 0, 36, 1, 0, 0, 0, 0, 38, + 1, 0, 0, 0, 0, 40, 1, 0, 0, 0, 0, 42, 1, 0, 0, 0, 0, 44, 1, 0, 0, 0, 0, + 46, 1, 0, 0, 0, 0, 48, 1, 0, 0, 0, 0, 50, 1, 0, 0, 0, 0, 52, 1, 0, 0, 0, + 0, 54, 1, 0, 0, 0, 0, 56, 1, 0, 0, 0, 0, 58, 1, 0, 0, 0, 0, 60, 1, 0, 0, + 0, 0, 62, 1, 0, 0, 0, 0, 64, 1, 0, 0, 0, 0, 66, 1, 0, 0, 0, 0, 68, 1, 0, + 0, 0, 0, 70, 1, 0, 0, 0, 0, 72, 1, 0, 0, 0, 0, 74, 1, 0, 0, 0, 0, 76, 1, + 0, 0, 0, 0, 78, 1, 0, 0, 0, 0, 80, 1, 0, 0, 0, 0, 82, 1, 0, 0, 0, 0, 84, + 1, 0, 0, 0, 0, 86, 1, 0, 0, 0, 0, 88, 1, 0, 0, 0, 0, 112, 1, 0, 0, 0, 0, + 114, 1, 0, 0, 0, 0, 116, 1, 0, 0, 0, 0, 118, 1, 0, 0, 0, 0, 120, 1, 0, + 0, 0, 0, 122, 1, 0, 0, 0, 0, 124, 1, 0, 0, 0, 0, 126, 1, 0, 0, 0, 0, 128, + 1, 0, 0, 0, 0, 130, 1, 0, 0, 0, 0, 132, 1, 0, 0, 0, 1, 134, 1, 0, 0, 0, + 1, 136, 1, 0, 0, 0, 1, 138, 1, 0, 0, 0, 1, 140, 1, 0, 0, 0, 1, 142, 1, + 0, 0, 0, 1, 144, 1, 0, 0, 0, 1, 146, 1, 0, 0, 0, 1, 148, 1, 0, 0, 0, 1, + 150, 1, 0, 0, 0, 1, 152, 1, 0, 0, 0, 2, 154, 1, 0, 0, 0, 4, 156, 1, 0, + 0, 0, 6, 158, 1, 0, 0, 0, 8, 160, 1, 0, 0, 0, 10, 164, 1, 0, 0, 0, 12, + 167, 1, 0, 0, 0, 14, 175, 1, 0, 0, 0, 16, 180, 1, 0, 0, 0, 18, 187, 1, + 0, 0, 0, 20, 193, 1, 0, 0, 0, 22, 201, 1, 0, 0, 0, 24, 211, 1, 0, 0, 0, + 26, 218, 1, 0, 0, 0, 28, 223, 1, 0, 0, 0, 30, 235, 1, 0, 0, 0, 32, 245, + 1, 0, 0, 0, 34, 254, 1, 0, 0, 0, 36, 261, 1, 0, 0, 0, 38, 266, 1, 0, 0, + 0, 40, 269, 1, 0, 0, 0, 42, 272, 1, 0, 0, 0, 44, 275, 1, 0, 0, 0, 46, 277, + 1, 0, 0, 0, 48, 280, 1, 0, 0, 0, 50, 283, 1, 0, 0, 0, 52, 285, 1, 0, 0, + 0, 54, 288, 1, 0, 0, 0, 56, 291, 1, 0, 0, 0, 58, 293, 1, 0, 0, 0, 60, 295, + 1, 0, 0, 0, 62, 297, 1, 0, 0, 0, 64, 299, 1, 0, 0, 0, 66, 301, 1, 0, 0, + 0, 68, 303, 1, 0, 0, 0, 70, 305, 1, 0, 0, 0, 72, 307, 1, 0, 0, 0, 74, 309, + 1, 0, 0, 0, 76, 311, 1, 0, 0, 0, 78, 313, 1, 0, 0, 0, 80, 315, 1, 0, 0, + 0, 82, 317, 1, 0, 0, 0, 84, 319, 1, 0, 0, 0, 86, 324, 1, 0, 0, 0, 88, 330, + 1, 0, 0, 0, 90, 335, 1, 0, 0, 0, 92, 337, 1, 0, 0, 0, 94, 339, 1, 0, 0, + 0, 96, 341, 1, 0, 0, 0, 98, 350, 1, 0, 0, 0, 100, 352, 1, 0, 0, 0, 102, + 358, 1, 0, 0, 0, 104, 360, 1, 0, 0, 0, 106, 363, 1, 0, 0, 0, 108, 368, + 1, 0, 0, 0, 110, 391, 1, 0, 0, 0, 112, 394, 1, 0, 0, 0, 114, 398, 1, 0, + 0, 0, 116, 439, 1, 0, 0, 0, 118, 454, 1, 0, 0, 0, 120, 473, 1, 0, 0, 0, + 122, 571, 1, 0, 0, 0, 124, 573, 1, 0, 0, 0, 126, 576, 1, 0, 0, 0, 128, + 590, 1, 0, 0, 0, 130, 603, 1, 0, 0, 0, 132, 623, 1, 0, 0, 0, 134, 638, + 1, 0, 0, 0, 136, 650, 1, 0, 0, 0, 138, 701, 1, 0, 0, 0, 140, 703, 1, 0, + 0, 0, 142, 707, 1, 0, 0, 0, 144, 711, 1, 0, 0, 0, 146, 715, 1, 0, 0, 0, + 148, 719, 1, 0, 0, 0, 150, 723, 1, 0, 0, 0, 152, 727, 1, 0, 0, 0, 154, + 155, 5, 35, 0, 0, 155, 3, 1, 0, 0, 0, 156, 157, 5, 58, 0, 0, 157, 5, 1, + 0, 0, 0, 158, 159, 5, 44, 0, 0, 159, 7, 1, 0, 0, 0, 160, 161, 5, 97, 0, + 0, 161, 162, 5, 110, 0, 0, 162, 163, 5, 100, 0, 0, 163, 9, 1, 0, 0, 0, + 164, 165, 5, 111, 0, 0, 165, 166, 5, 114, 0, 0, 166, 11, 1, 0, 0, 0, 167, + 168, 5, 98, 0, 0, 168, 169, 5, 117, 0, 0, 169, 170, 5, 116, 0, 0, 170, + 171, 5, 32, 0, 0, 171, 172, 5, 110, 0, 0, 172, 173, 5, 111, 0, 0, 173, + 174, 5, 116, 0, 0, 174, 13, 1, 0, 0, 0, 175, 176, 5, 102, 0, 0, 176, 177, + 5, 114, 0, 0, 177, 178, 5, 111, 0, 0, 178, 179, 5, 109, 0, 0, 179, 15, + 1, 0, 0, 0, 180, 181, 5, 109, 0, 0, 181, 182, 5, 111, 0, 0, 182, 183, 5, + 100, 0, 0, 183, 184, 5, 117, 0, 0, 184, 185, 5, 108, 0, 0, 185, 186, 5, + 101, 0, 0, 186, 17, 1, 0, 0, 0, 187, 188, 5, 109, 0, 0, 188, 189, 5, 111, + 0, 0, 189, 190, 5, 100, 0, 0, 190, 191, 5, 101, 0, 0, 191, 192, 5, 108, + 0, 0, 192, 19, 1, 0, 0, 0, 193, 194, 5, 115, 0, 0, 194, 195, 5, 99, 0, + 0, 195, 196, 5, 104, 0, 0, 196, 197, 5, 101, 0, 0, 197, 198, 5, 109, 0, + 0, 198, 199, 5, 97, 0, 0, 199, 21, 1, 0, 0, 0, 200, 202, 3, 94, 46, 0, + 201, 200, 1, 0, 0, 0, 202, 203, 1, 0, 0, 0, 203, 201, 1, 0, 0, 0, 203, + 204, 1, 0, 0, 0, 204, 205, 1, 0, 0, 0, 205, 207, 5, 46, 0, 0, 206, 208, + 3, 94, 46, 0, 207, 206, 1, 0, 0, 0, 208, 209, 1, 0, 0, 0, 209, 207, 1, + 0, 0, 0, 209, 210, 1, 0, 0, 0, 210, 23, 1, 0, 0, 0, 211, 212, 5, 101, 0, + 0, 212, 213, 5, 120, 0, 0, 213, 214, 5, 116, 0, 0, 214, 215, 5, 101, 0, + 0, 215, 216, 5, 110, 0, 0, 216, 217, 5, 100, 0, 0, 217, 25, 1, 0, 0, 0, + 218, 219, 5, 116, 0, 0, 219, 220, 5, 121, 0, 0, 220, 221, 5, 112, 0, 0, + 221, 222, 5, 101, 0, 0, 222, 27, 1, 0, 0, 0, 223, 224, 5, 99, 0, 0, 224, + 225, 5, 111, 0, 0, 225, 226, 5, 110, 0, 0, 226, 227, 5, 100, 0, 0, 227, + 228, 5, 105, 0, 0, 228, 229, 5, 116, 0, 0, 229, 230, 5, 105, 0, 0, 230, + 231, 5, 111, 0, 0, 231, 232, 5, 110, 0, 0, 232, 233, 1, 0, 0, 0, 233, 234, + 6, 13, 0, 0, 234, 29, 1, 0, 0, 0, 235, 236, 5, 114, 0, 0, 236, 237, 5, + 101, 0, 0, 237, 238, 5, 108, 0, 0, 238, 239, 5, 97, 0, 0, 239, 240, 5, + 116, 0, 0, 240, 241, 5, 105, 0, 0, 241, 242, 5, 111, 0, 0, 242, 243, 5, + 110, 0, 0, 243, 244, 5, 115, 0, 0, 244, 31, 1, 0, 0, 0, 245, 246, 5, 114, + 0, 0, 246, 247, 5, 101, 0, 0, 247, 248, 5, 108, 0, 0, 248, 249, 5, 97, + 0, 0, 249, 250, 5, 116, 0, 0, 250, 251, 5, 105, 0, 0, 251, 252, 5, 111, + 0, 0, 252, 253, 5, 110, 0, 0, 253, 33, 1, 0, 0, 0, 254, 255, 5, 100, 0, + 0, 255, 256, 5, 101, 0, 0, 256, 257, 5, 102, 0, 0, 257, 258, 5, 105, 0, + 0, 258, 259, 5, 110, 0, 0, 259, 260, 5, 101, 0, 0, 260, 35, 1, 0, 0, 0, + 261, 262, 5, 119, 0, 0, 262, 263, 5, 105, 0, 0, 263, 264, 5, 116, 0, 0, + 264, 265, 5, 104, 0, 0, 265, 37, 1, 0, 0, 0, 266, 267, 5, 61, 0, 0, 267, + 268, 5, 61, 0, 0, 268, 39, 1, 0, 0, 0, 269, 270, 5, 33, 0, 0, 270, 271, + 5, 61, 0, 0, 271, 41, 1, 0, 0, 0, 272, 273, 5, 105, 0, 0, 273, 274, 5, + 110, 0, 0, 274, 43, 1, 0, 0, 0, 275, 276, 5, 60, 0, 0, 276, 45, 1, 0, 0, + 0, 277, 278, 5, 60, 0, 0, 278, 279, 5, 61, 0, 0, 279, 47, 1, 0, 0, 0, 280, + 281, 5, 62, 0, 0, 281, 282, 5, 61, 0, 0, 282, 49, 1, 0, 0, 0, 283, 284, + 5, 62, 0, 0, 284, 51, 1, 0, 0, 0, 285, 286, 5, 38, 0, 0, 286, 287, 5, 38, + 0, 0, 287, 53, 1, 0, 0, 0, 288, 289, 5, 124, 0, 0, 289, 290, 5, 124, 0, + 0, 290, 55, 1, 0, 0, 0, 291, 292, 5, 91, 0, 0, 292, 57, 1, 0, 0, 0, 293, + 294, 5, 93, 0, 0, 294, 59, 1, 0, 0, 0, 295, 296, 5, 123, 0, 0, 296, 61, + 1, 0, 0, 0, 297, 298, 5, 125, 0, 0, 298, 63, 1, 0, 0, 0, 299, 300, 5, 40, + 0, 0, 300, 65, 1, 0, 0, 0, 301, 302, 5, 41, 0, 0, 302, 67, 1, 0, 0, 0, + 303, 304, 5, 46, 0, 0, 304, 69, 1, 0, 0, 0, 305, 306, 5, 45, 0, 0, 306, + 71, 1, 0, 0, 0, 307, 308, 5, 33, 0, 0, 308, 73, 1, 0, 0, 0, 309, 310, 5, + 63, 0, 0, 310, 75, 1, 0, 0, 0, 311, 312, 5, 43, 0, 0, 312, 77, 1, 0, 0, + 0, 313, 314, 5, 42, 0, 0, 314, 79, 1, 0, 0, 0, 315, 316, 5, 47, 0, 0, 316, + 81, 1, 0, 0, 0, 317, 318, 5, 37, 0, 0, 318, 83, 1, 0, 0, 0, 319, 320, 5, + 116, 0, 0, 320, 321, 5, 114, 0, 0, 321, 322, 5, 117, 0, 0, 322, 323, 5, + 101, 0, 0, 323, 85, 1, 0, 0, 0, 324, 325, 5, 102, 0, 0, 325, 326, 5, 97, + 0, 0, 326, 327, 5, 108, 0, 0, 327, 328, 5, 115, 0, 0, 328, 329, 5, 101, + 0, 0, 329, 87, 1, 0, 0, 0, 330, 331, 5, 110, 0, 0, 331, 332, 5, 117, 0, + 0, 332, 333, 5, 108, 0, 0, 333, 334, 5, 108, 0, 0, 334, 89, 1, 0, 0, 0, + 335, 336, 5, 92, 0, 0, 336, 91, 1, 0, 0, 0, 337, 338, 7, 0, 0, 0, 338, + 93, 1, 0, 0, 0, 339, 340, 2, 48, 57, 0, 340, 95, 1, 0, 0, 0, 341, 343, + 7, 1, 0, 0, 342, 344, 7, 2, 0, 0, 343, 342, 1, 0, 0, 0, 343, 344, 1, 0, + 0, 0, 344, 346, 1, 0, 0, 0, 345, 347, 3, 94, 46, 0, 346, 345, 1, 0, 0, + 0, 347, 348, 1, 0, 0, 0, 348, 346, 1, 0, 0, 0, 348, 349, 1, 0, 0, 0, 349, + 97, 1, 0, 0, 0, 350, 351, 7, 3, 0, 0, 351, 99, 1, 0, 0, 0, 352, 353, 7, + 4, 0, 0, 353, 101, 1, 0, 0, 0, 354, 359, 3, 104, 51, 0, 355, 359, 3, 108, + 53, 0, 356, 359, 3, 110, 54, 0, 357, 359, 3, 106, 52, 0, 358, 354, 1, 0, + 0, 0, 358, 355, 1, 0, 0, 0, 358, 356, 1, 0, 0, 0, 358, 357, 1, 0, 0, 0, + 359, 103, 1, 0, 0, 0, 360, 361, 3, 90, 44, 0, 361, 362, 7, 5, 0, 0, 362, + 105, 1, 0, 0, 0, 363, 364, 3, 90, 44, 0, 364, 365, 2, 48, 51, 0, 365, 366, + 2, 48, 55, 0, 366, 367, 2, 48, 55, 0, 367, 107, 1, 0, 0, 0, 368, 369, 3, + 90, 44, 0, 369, 370, 7, 6, 0, 0, 370, 371, 3, 98, 48, 0, 371, 372, 3, 98, + 48, 0, 372, 109, 1, 0, 0, 0, 373, 374, 3, 90, 44, 0, 374, 375, 5, 117, + 0, 0, 375, 376, 3, 98, 48, 0, 376, 377, 3, 98, 48, 0, 377, 378, 3, 98, + 48, 0, 378, 379, 3, 98, 48, 0, 379, 392, 1, 0, 0, 0, 380, 381, 3, 90, 44, + 0, 381, 382, 5, 85, 0, 0, 382, 383, 3, 98, 48, 0, 383, 384, 3, 98, 48, + 0, 384, 385, 3, 98, 48, 0, 385, 386, 3, 98, 48, 0, 386, 387, 3, 98, 48, + 0, 387, 388, 3, 98, 48, 0, 388, 389, 3, 98, 48, 0, 389, 390, 3, 98, 48, + 0, 390, 392, 1, 0, 0, 0, 391, 373, 1, 0, 0, 0, 391, 380, 1, 0, 0, 0, 392, + 111, 1, 0, 0, 0, 393, 395, 7, 7, 0, 0, 394, 393, 1, 0, 0, 0, 395, 396, + 1, 0, 0, 0, 396, 394, 1, 0, 0, 0, 396, 397, 1, 0, 0, 0, 397, 113, 1, 0, + 0, 0, 398, 399, 5, 47, 0, 0, 399, 400, 5, 47, 0, 0, 400, 404, 1, 0, 0, + 0, 401, 403, 8, 8, 0, 0, 402, 401, 1, 0, 0, 0, 403, 406, 1, 0, 0, 0, 404, + 402, 1, 0, 0, 0, 404, 405, 1, 0, 0, 0, 405, 407, 1, 0, 0, 0, 406, 404, + 1, 0, 0, 0, 407, 408, 6, 56, 1, 0, 408, 115, 1, 0, 0, 0, 409, 411, 3, 94, + 46, 0, 410, 409, 1, 0, 0, 0, 411, 412, 1, 0, 0, 0, 412, 410, 1, 0, 0, 0, + 412, 413, 1, 0, 0, 0, 413, 414, 1, 0, 0, 0, 414, 416, 5, 46, 0, 0, 415, + 417, 3, 94, 46, 0, 416, 415, 1, 0, 0, 0, 417, 418, 1, 0, 0, 0, 418, 416, + 1, 0, 0, 0, 418, 419, 1, 0, 0, 0, 419, 421, 1, 0, 0, 0, 420, 422, 3, 96, + 47, 0, 421, 420, 1, 0, 0, 0, 421, 422, 1, 0, 0, 0, 422, 440, 1, 0, 0, 0, + 423, 425, 3, 94, 46, 0, 424, 423, 1, 0, 0, 0, 425, 426, 1, 0, 0, 0, 426, + 424, 1, 0, 0, 0, 426, 427, 1, 0, 0, 0, 427, 428, 1, 0, 0, 0, 428, 429, + 3, 96, 47, 0, 429, 440, 1, 0, 0, 0, 430, 432, 5, 46, 0, 0, 431, 433, 3, + 94, 46, 0, 432, 431, 1, 0, 0, 0, 433, 434, 1, 0, 0, 0, 434, 432, 1, 0, + 0, 0, 434, 435, 1, 0, 0, 0, 435, 437, 1, 0, 0, 0, 436, 438, 3, 96, 47, + 0, 437, 436, 1, 0, 0, 0, 437, 438, 1, 0, 0, 0, 438, 440, 1, 0, 0, 0, 439, + 410, 1, 0, 0, 0, 439, 424, 1, 0, 0, 0, 439, 430, 1, 0, 0, 0, 440, 117, + 1, 0, 0, 0, 441, 443, 3, 94, 46, 0, 442, 441, 1, 0, 0, 0, 443, 444, 1, + 0, 0, 0, 444, 442, 1, 0, 0, 0, 444, 445, 1, 0, 0, 0, 445, 455, 1, 0, 0, + 0, 446, 447, 5, 48, 0, 0, 447, 448, 5, 120, 0, 0, 448, 450, 1, 0, 0, 0, + 449, 451, 3, 98, 48, 0, 450, 449, 1, 0, 0, 0, 451, 452, 1, 0, 0, 0, 452, + 450, 1, 0, 0, 0, 452, 453, 1, 0, 0, 0, 453, 455, 1, 0, 0, 0, 454, 442, + 1, 0, 0, 0, 454, 446, 1, 0, 0, 0, 455, 119, 1, 0, 0, 0, 456, 458, 3, 94, + 46, 0, 457, 456, 1, 0, 0, 0, 458, 459, 1, 0, 0, 0, 459, 457, 1, 0, 0, 0, + 459, 460, 1, 0, 0, 0, 460, 461, 1, 0, 0, 0, 461, 462, 7, 9, 0, 0, 462, + 474, 1, 0, 0, 0, 463, 464, 5, 48, 0, 0, 464, 465, 5, 120, 0, 0, 465, 467, + 1, 0, 0, 0, 466, 468, 3, 98, 48, 0, 467, 466, 1, 0, 0, 0, 468, 469, 1, + 0, 0, 0, 469, 467, 1, 0, 0, 0, 469, 470, 1, 0, 0, 0, 470, 471, 1, 0, 0, + 0, 471, 472, 7, 9, 0, 0, 472, 474, 1, 0, 0, 0, 473, 457, 1, 0, 0, 0, 473, + 463, 1, 0, 0, 0, 474, 121, 1, 0, 0, 0, 475, 480, 5, 34, 0, 0, 476, 479, + 3, 102, 50, 0, 477, 479, 8, 10, 0, 0, 478, 476, 1, 0, 0, 0, 478, 477, 1, + 0, 0, 0, 479, 482, 1, 0, 0, 0, 480, 478, 1, 0, 0, 0, 480, 481, 1, 0, 0, + 0, 481, 483, 1, 0, 0, 0, 482, 480, 1, 0, 0, 0, 483, 572, 5, 34, 0, 0, 484, + 489, 5, 39, 0, 0, 485, 488, 3, 102, 50, 0, 486, 488, 8, 11, 0, 0, 487, + 485, 1, 0, 0, 0, 487, 486, 1, 0, 0, 0, 488, 491, 1, 0, 0, 0, 489, 487, + 1, 0, 0, 0, 489, 490, 1, 0, 0, 0, 490, 492, 1, 0, 0, 0, 491, 489, 1, 0, + 0, 0, 492, 572, 5, 39, 0, 0, 493, 494, 5, 34, 0, 0, 494, 495, 5, 34, 0, + 0, 495, 496, 5, 34, 0, 0, 496, 501, 1, 0, 0, 0, 497, 500, 3, 102, 50, 0, + 498, 500, 8, 12, 0, 0, 499, 497, 1, 0, 0, 0, 499, 498, 1, 0, 0, 0, 500, + 503, 1, 0, 0, 0, 501, 502, 1, 0, 0, 0, 501, 499, 1, 0, 0, 0, 502, 504, + 1, 0, 0, 0, 503, 501, 1, 0, 0, 0, 504, 505, 5, 34, 0, 0, 505, 506, 5, 34, + 0, 0, 506, 572, 5, 34, 0, 0, 507, 508, 5, 39, 0, 0, 508, 509, 5, 39, 0, + 0, 509, 510, 5, 39, 0, 0, 510, 515, 1, 0, 0, 0, 511, 514, 3, 102, 50, 0, + 512, 514, 8, 12, 0, 0, 513, 511, 1, 0, 0, 0, 513, 512, 1, 0, 0, 0, 514, + 517, 1, 0, 0, 0, 515, 516, 1, 0, 0, 0, 515, 513, 1, 0, 0, 0, 516, 518, + 1, 0, 0, 0, 517, 515, 1, 0, 0, 0, 518, 519, 5, 39, 0, 0, 519, 520, 5, 39, + 0, 0, 520, 572, 5, 39, 0, 0, 521, 522, 3, 100, 49, 0, 522, 526, 5, 34, + 0, 0, 523, 525, 8, 13, 0, 0, 524, 523, 1, 0, 0, 0, 525, 528, 1, 0, 0, 0, + 526, 524, 1, 0, 0, 0, 526, 527, 1, 0, 0, 0, 527, 529, 1, 0, 0, 0, 528, + 526, 1, 0, 0, 0, 529, 530, 5, 34, 0, 0, 530, 572, 1, 0, 0, 0, 531, 532, + 3, 100, 49, 0, 532, 536, 5, 39, 0, 0, 533, 535, 8, 14, 0, 0, 534, 533, + 1, 0, 0, 0, 535, 538, 1, 0, 0, 0, 536, 534, 1, 0, 0, 0, 536, 537, 1, 0, + 0, 0, 537, 539, 1, 0, 0, 0, 538, 536, 1, 0, 0, 0, 539, 540, 5, 39, 0, 0, + 540, 572, 1, 0, 0, 0, 541, 542, 3, 100, 49, 0, 542, 543, 5, 34, 0, 0, 543, + 544, 5, 34, 0, 0, 544, 545, 5, 34, 0, 0, 545, 549, 1, 0, 0, 0, 546, 548, + 9, 0, 0, 0, 547, 546, 1, 0, 0, 0, 548, 551, 1, 0, 0, 0, 549, 550, 1, 0, + 0, 0, 549, 547, 1, 0, 0, 0, 550, 552, 1, 0, 0, 0, 551, 549, 1, 0, 0, 0, + 552, 553, 5, 34, 0, 0, 553, 554, 5, 34, 0, 0, 554, 555, 5, 34, 0, 0, 555, + 572, 1, 0, 0, 0, 556, 557, 3, 100, 49, 0, 557, 558, 5, 39, 0, 0, 558, 559, + 5, 39, 0, 0, 559, 560, 5, 39, 0, 0, 560, 564, 1, 0, 0, 0, 561, 563, 9, + 0, 0, 0, 562, 561, 1, 0, 0, 0, 563, 566, 1, 0, 0, 0, 564, 565, 1, 0, 0, + 0, 564, 562, 1, 0, 0, 0, 565, 567, 1, 0, 0, 0, 566, 564, 1, 0, 0, 0, 567, + 568, 5, 39, 0, 0, 568, 569, 5, 39, 0, 0, 569, 570, 5, 39, 0, 0, 570, 572, + 1, 0, 0, 0, 571, 475, 1, 0, 0, 0, 571, 484, 1, 0, 0, 0, 571, 493, 1, 0, + 0, 0, 571, 507, 1, 0, 0, 0, 571, 521, 1, 0, 0, 0, 571, 531, 1, 0, 0, 0, + 571, 541, 1, 0, 0, 0, 571, 556, 1, 0, 0, 0, 572, 123, 1, 0, 0, 0, 573, + 574, 7, 15, 0, 0, 574, 575, 3, 122, 60, 0, 575, 125, 1, 0, 0, 0, 576, 577, + 5, 36, 0, 0, 577, 578, 5, 101, 0, 0, 578, 579, 5, 120, 0, 0, 579, 580, + 5, 112, 0, 0, 580, 581, 5, 114, 0, 0, 581, 582, 5, 101, 0, 0, 582, 583, + 5, 115, 0, 0, 583, 584, 5, 115, 0, 0, 584, 585, 5, 105, 0, 0, 585, 586, + 5, 111, 0, 0, 586, 587, 5, 110, 0, 0, 587, 127, 1, 0, 0, 0, 588, 591, 3, + 92, 45, 0, 589, 591, 5, 95, 0, 0, 590, 588, 1, 0, 0, 0, 590, 589, 1, 0, + 0, 0, 591, 598, 1, 0, 0, 0, 592, 597, 3, 92, 45, 0, 593, 597, 3, 94, 46, + 0, 594, 597, 5, 95, 0, 0, 595, 597, 3, 70, 34, 0, 596, 592, 1, 0, 0, 0, + 596, 593, 1, 0, 0, 0, 596, 594, 1, 0, 0, 0, 596, 595, 1, 0, 0, 0, 597, + 600, 1, 0, 0, 0, 598, 596, 1, 0, 0, 0, 598, 599, 1, 0, 0, 0, 599, 129, + 1, 0, 0, 0, 600, 598, 1, 0, 0, 0, 601, 604, 3, 92, 45, 0, 602, 604, 5, + 95, 0, 0, 603, 601, 1, 0, 0, 0, 603, 602, 1, 0, 0, 0, 604, 619, 1, 0, 0, + 0, 605, 609, 3, 80, 39, 0, 606, 609, 3, 68, 33, 0, 607, 609, 3, 70, 34, + 0, 608, 605, 1, 0, 0, 0, 608, 606, 1, 0, 0, 0, 608, 607, 1, 0, 0, 0, 608, + 609, 1, 0, 0, 0, 609, 613, 1, 0, 0, 0, 610, 614, 3, 92, 45, 0, 611, 614, + 3, 94, 46, 0, 612, 614, 5, 95, 0, 0, 613, 610, 1, 0, 0, 0, 613, 611, 1, + 0, 0, 0, 613, 612, 1, 0, 0, 0, 614, 615, 1, 0, 0, 0, 615, 613, 1, 0, 0, + 0, 615, 616, 1, 0, 0, 0, 616, 618, 1, 0, 0, 0, 617, 608, 1, 0, 0, 0, 618, + 621, 1, 0, 0, 0, 619, 617, 1, 0, 0, 0, 619, 620, 1, 0, 0, 0, 620, 131, + 1, 0, 0, 0, 621, 619, 1, 0, 0, 0, 622, 624, 3, 112, 55, 0, 623, 622, 1, + 0, 0, 0, 623, 624, 1, 0, 0, 0, 624, 630, 1, 0, 0, 0, 625, 627, 5, 13, 0, + 0, 626, 625, 1, 0, 0, 0, 626, 627, 1, 0, 0, 0, 627, 628, 1, 0, 0, 0, 628, + 631, 5, 10, 0, 0, 629, 631, 2, 12, 13, 0, 630, 626, 1, 0, 0, 0, 630, 629, + 1, 0, 0, 0, 631, 633, 1, 0, 0, 0, 632, 634, 3, 112, 55, 0, 633, 632, 1, + 0, 0, 0, 633, 634, 1, 0, 0, 0, 634, 636, 1, 0, 0, 0, 635, 637, 3, 132, + 65, 0, 636, 635, 1, 0, 0, 0, 636, 637, 1, 0, 0, 0, 637, 133, 1, 0, 0, 0, + 638, 639, 3, 66, 32, 0, 639, 640, 1, 0, 0, 0, 640, 641, 6, 66, 2, 0, 641, + 642, 6, 66, 3, 0, 642, 135, 1, 0, 0, 0, 643, 644, 5, 109, 0, 0, 644, 645, + 5, 97, 0, 0, 645, 651, 5, 112, 0, 0, 646, 647, 5, 108, 0, 0, 647, 648, + 5, 105, 0, 0, 648, 649, 5, 115, 0, 0, 649, 651, 5, 116, 0, 0, 650, 643, + 1, 0, 0, 0, 650, 646, 1, 0, 0, 0, 651, 137, 1, 0, 0, 0, 652, 653, 5, 98, + 0, 0, 653, 654, 5, 111, 0, 0, 654, 655, 5, 111, 0, 0, 655, 702, 5, 108, + 0, 0, 656, 657, 5, 115, 0, 0, 657, 658, 5, 116, 0, 0, 658, 659, 5, 114, + 0, 0, 659, 660, 5, 105, 0, 0, 660, 661, 5, 110, 0, 0, 661, 702, 5, 103, + 0, 0, 662, 663, 5, 105, 0, 0, 663, 664, 5, 110, 0, 0, 664, 702, 5, 116, + 0, 0, 665, 666, 5, 117, 0, 0, 666, 667, 5, 105, 0, 0, 667, 668, 5, 110, + 0, 0, 668, 702, 5, 116, 0, 0, 669, 670, 5, 100, 0, 0, 670, 671, 5, 111, + 0, 0, 671, 672, 5, 117, 0, 0, 672, 673, 5, 98, 0, 0, 673, 674, 5, 108, + 0, 0, 674, 702, 5, 101, 0, 0, 675, 676, 5, 100, 0, 0, 676, 677, 5, 117, + 0, 0, 677, 678, 5, 114, 0, 0, 678, 679, 5, 97, 0, 0, 679, 680, 5, 116, + 0, 0, 680, 681, 5, 105, 0, 0, 681, 682, 5, 111, 0, 0, 682, 702, 5, 110, + 0, 0, 683, 684, 5, 116, 0, 0, 684, 685, 5, 105, 0, 0, 685, 686, 5, 109, + 0, 0, 686, 687, 5, 101, 0, 0, 687, 688, 5, 115, 0, 0, 688, 689, 5, 116, + 0, 0, 689, 690, 5, 97, 0, 0, 690, 691, 5, 109, 0, 0, 691, 702, 5, 112, + 0, 0, 692, 693, 5, 105, 0, 0, 693, 694, 5, 112, 0, 0, 694, 695, 5, 97, + 0, 0, 695, 696, 5, 100, 0, 0, 696, 697, 5, 100, 0, 0, 697, 698, 5, 114, + 0, 0, 698, 699, 5, 101, 0, 0, 699, 700, 5, 115, 0, 0, 700, 702, 5, 115, + 0, 0, 701, 652, 1, 0, 0, 0, 701, 656, 1, 0, 0, 0, 701, 662, 1, 0, 0, 0, + 701, 665, 1, 0, 0, 0, 701, 669, 1, 0, 0, 0, 701, 675, 1, 0, 0, 0, 701, + 683, 1, 0, 0, 0, 701, 692, 1, 0, 0, 0, 702, 139, 1, 0, 0, 0, 703, 704, + 3, 44, 21, 0, 704, 705, 1, 0, 0, 0, 705, 706, 6, 69, 4, 0, 706, 141, 1, + 0, 0, 0, 707, 708, 3, 50, 24, 0, 708, 709, 1, 0, 0, 0, 709, 710, 6, 70, + 5, 0, 710, 143, 1, 0, 0, 0, 711, 712, 3, 64, 31, 0, 712, 713, 1, 0, 0, + 0, 713, 714, 6, 71, 6, 0, 714, 145, 1, 0, 0, 0, 715, 716, 3, 4, 1, 0, 716, + 717, 1, 0, 0, 0, 717, 718, 6, 72, 7, 0, 718, 147, 1, 0, 0, 0, 719, 720, + 3, 6, 2, 0, 720, 721, 1, 0, 0, 0, 721, 722, 6, 73, 8, 0, 722, 149, 1, 0, + 0, 0, 723, 724, 3, 112, 55, 0, 724, 725, 1, 0, 0, 0, 725, 726, 6, 74, 9, + 0, 726, 151, 1, 0, 0, 0, 727, 728, 3, 128, 63, 0, 728, 729, 1, 0, 0, 0, + 729, 730, 6, 75, 10, 0, 730, 153, 1, 0, 0, 0, 51, 0, 1, 203, 209, 343, + 348, 358, 391, 396, 404, 412, 418, 421, 426, 434, 437, 439, 444, 452, 454, + 459, 469, 473, 478, 480, 487, 489, 499, 501, 513, 515, 526, 536, 549, 564, + 571, 590, 596, 598, 603, 608, 613, 615, 619, 623, 626, 630, 633, 636, 650, + 701, 11, 5, 1, 0, 0, 1, 0, 7, 8, 0, 4, 0, 0, 7, 3, 0, 7, 4, 0, 7, 7, 0, + 7, 1, 0, 7, 2, 0, 7, 9, 0, 7, 10, 0, } deserializer := antlr.NewATNDeserializer(nil) staticData.atn = deserializer.Deserialize(staticData.serializedATN) @@ -505,10 +513,11 @@ const ( OpenFGALexerNUM_UINT = 51 OpenFGALexerSTRING = 52 OpenFGALexerBYTES = 53 - OpenFGALexerEXTENDED_IDENTIFIER = 54 - OpenFGALexerNEWLINE = 55 - OpenFGALexerCONDITION_PARAM_CONTAINER = 56 - OpenFGALexerCONDITION_PARAM_TYPE = 57 + OpenFGALexerDOLLAR_EXPRESSION = 54 + OpenFGALexerEXTENDED_IDENTIFIER = 55 + OpenFGALexerNEWLINE = 56 + OpenFGALexerCONDITION_PARAM_CONTAINER = 57 + OpenFGALexerCONDITION_PARAM_TYPE = 58 ) // OpenFGALexerCONDITION_DEF is the OpenFGALexer mode. diff --git a/pkg/go/gen/openfga_parser.go b/pkg/go/gen/openfga_parser.go index 6a6e525d..1ba46da5 100644 --- a/pkg/go/gen/openfga_parser.go +++ b/pkg/go/gen/openfga_parser.go @@ -39,7 +39,8 @@ func openfgaparserParserInit() { "", "'extend'", "'type'", "'condition'", "'relations'", "'relation'", "'define'", "'with'", "'=='", "'!='", "'in'", "'<='", "'>='", "'&&'", "'||'", "']'", "'{'", "'}'", "'.'", "'-'", "'!'", "'?'", "'+'", "'*'", - "'/'", "'%'", "'true'", "'false'", "'null'", + "'/'", "'%'", "'true'", "'false'", "'null'", "", "", "", "", "", "", + "'$expression'", } staticData.SymbolicNames = []string{ "", "COLON", "COMMA", "LESS", "GREATER", "LBRACKET", "RBRACKET", "LPAREN", @@ -50,7 +51,7 @@ func openfgaparserParserInit() { "LOGICAL_OR", "RPRACKET", "LBRACE", "RBRACE", "DOT", "MINUS", "EXCLAM", "QUESTIONMARK", "PLUS", "STAR", "SLASH", "PERCENT", "CEL_TRUE", "CEL_FALSE", "NUL", "CEL_COMMENT", "NUM_FLOAT", "NUM_INT", "NUM_UINT", "STRING", - "BYTES", "EXTENDED_IDENTIFIER", "NEWLINE", "CONDITION_PARAM_CONTAINER", + "BYTES", "DOLLAR_EXPRESSION", "EXTENDED_IDENTIFIER", "NEWLINE", "CONDITION_PARAM_CONTAINER", "CONDITION_PARAM_TYPE", } staticData.RuleNames = []string{ @@ -64,7 +65,7 @@ func openfgaparserParserInit() { } staticData.PredictionContextCache = antlr.NewPredictionContextCache() staticData.serializedATN = []int32{ - 4, 1, 57, 392, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, + 4, 1, 58, 394, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, @@ -92,159 +93,160 @@ func openfgaparserParserInit() { 1, 13, 1, 13, 3, 13, 248, 8, 13, 5, 13, 250, 8, 13, 10, 13, 12, 13, 253, 9, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 3, 14, 262, 8, 14, 1, 15, 3, 15, 265, 8, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, - 1, 15, 3, 15, 274, 8, 15, 1, 15, 3, 15, 277, 8, 15, 1, 16, 1, 16, 1, 16, - 1, 16, 1, 16, 3, 16, 284, 8, 16, 1, 17, 5, 17, 287, 8, 17, 10, 17, 12, - 17, 290, 9, 17, 1, 18, 1, 18, 3, 18, 294, 8, 18, 1, 18, 1, 18, 1, 18, 1, - 18, 1, 18, 3, 18, 301, 8, 18, 1, 18, 1, 18, 3, 18, 305, 8, 18, 1, 18, 1, - 18, 3, 18, 309, 8, 18, 1, 18, 1, 18, 3, 18, 313, 8, 18, 1, 18, 1, 18, 3, - 18, 317, 8, 18, 5, 18, 319, 8, 18, 10, 18, 12, 18, 322, 9, 18, 1, 18, 3, - 18, 325, 8, 18, 1, 18, 1, 18, 3, 18, 329, 8, 18, 1, 18, 1, 18, 3, 18, 333, - 8, 18, 1, 18, 3, 18, 336, 8, 18, 1, 18, 1, 18, 3, 18, 340, 8, 18, 1, 18, - 1, 18, 1, 19, 1, 19, 1, 20, 3, 20, 347, 8, 20, 1, 20, 1, 20, 3, 20, 351, - 8, 20, 1, 20, 1, 20, 3, 20, 355, 8, 20, 1, 20, 1, 20, 1, 21, 1, 21, 1, - 22, 1, 22, 1, 22, 1, 22, 1, 22, 3, 22, 366, 8, 22, 1, 23, 1, 23, 5, 23, - 370, 8, 23, 10, 23, 12, 23, 373, 9, 23, 1, 23, 1, 23, 3, 23, 377, 8, 23, - 1, 24, 1, 24, 1, 25, 1, 25, 3, 25, 383, 8, 25, 1, 26, 1, 26, 5, 26, 387, - 8, 26, 10, 26, 12, 26, 390, 9, 26, 1, 26, 0, 0, 27, 0, 2, 4, 6, 8, 10, - 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, - 48, 50, 52, 0, 4, 1, 0, 55, 55, 4, 0, 10, 10, 16, 18, 20, 21, 24, 24, 5, - 0, 3, 5, 7, 10, 27, 35, 37, 53, 55, 55, 1, 0, 36, 36, 433, 0, 55, 1, 0, - 0, 0, 2, 80, 1, 0, 0, 0, 4, 93, 1, 0, 0, 0, 6, 104, 1, 0, 0, 0, 8, 109, - 1, 0, 0, 0, 10, 130, 1, 0, 0, 0, 12, 145, 1, 0, 0, 0, 14, 150, 1, 0, 0, - 0, 16, 157, 1, 0, 0, 0, 18, 191, 1, 0, 0, 0, 20, 193, 1, 0, 0, 0, 22, 195, - 1, 0, 0, 0, 24, 214, 1, 0, 0, 0, 26, 233, 1, 0, 0, 0, 28, 256, 1, 0, 0, - 0, 30, 264, 1, 0, 0, 0, 32, 278, 1, 0, 0, 0, 34, 288, 1, 0, 0, 0, 36, 293, - 1, 0, 0, 0, 38, 343, 1, 0, 0, 0, 40, 346, 1, 0, 0, 0, 42, 358, 1, 0, 0, - 0, 44, 365, 1, 0, 0, 0, 46, 367, 1, 0, 0, 0, 48, 378, 1, 0, 0, 0, 50, 382, - 1, 0, 0, 0, 52, 388, 1, 0, 0, 0, 54, 56, 5, 9, 0, 0, 55, 54, 1, 0, 0, 0, - 55, 56, 1, 0, 0, 0, 56, 58, 1, 0, 0, 0, 57, 59, 5, 55, 0, 0, 58, 57, 1, - 0, 0, 0, 58, 59, 1, 0, 0, 0, 59, 62, 1, 0, 0, 0, 60, 63, 3, 2, 1, 0, 61, - 63, 3, 4, 2, 0, 62, 60, 1, 0, 0, 0, 62, 61, 1, 0, 0, 0, 63, 65, 1, 0, 0, - 0, 64, 66, 5, 55, 0, 0, 65, 64, 1, 0, 0, 0, 65, 66, 1, 0, 0, 0, 66, 67, - 1, 0, 0, 0, 67, 69, 3, 6, 3, 0, 68, 70, 5, 55, 0, 0, 69, 68, 1, 0, 0, 0, - 69, 70, 1, 0, 0, 0, 70, 71, 1, 0, 0, 0, 71, 73, 3, 34, 17, 0, 72, 74, 5, - 55, 0, 0, 73, 72, 1, 0, 0, 0, 73, 74, 1, 0, 0, 0, 74, 75, 1, 0, 0, 0, 75, - 76, 5, 0, 0, 1, 76, 1, 1, 0, 0, 0, 77, 78, 3, 46, 23, 0, 78, 79, 5, 55, - 0, 0, 79, 81, 1, 0, 0, 0, 80, 77, 1, 0, 0, 0, 80, 81, 1, 0, 0, 0, 81, 82, - 1, 0, 0, 0, 82, 83, 5, 17, 0, 0, 83, 84, 5, 55, 0, 0, 84, 85, 5, 18, 0, - 0, 85, 86, 5, 9, 0, 0, 86, 88, 5, 19, 0, 0, 87, 89, 5, 9, 0, 0, 88, 87, - 1, 0, 0, 0, 88, 89, 1, 0, 0, 0, 89, 3, 1, 0, 0, 0, 90, 91, 3, 46, 23, 0, - 91, 92, 5, 55, 0, 0, 92, 94, 1, 0, 0, 0, 93, 90, 1, 0, 0, 0, 93, 94, 1, - 0, 0, 0, 94, 95, 1, 0, 0, 0, 95, 96, 5, 16, 0, 0, 96, 97, 5, 9, 0, 0, 97, - 99, 3, 48, 24, 0, 98, 100, 5, 9, 0, 0, 99, 98, 1, 0, 0, 0, 99, 100, 1, - 0, 0, 0, 100, 5, 1, 0, 0, 0, 101, 103, 3, 8, 4, 0, 102, 101, 1, 0, 0, 0, - 103, 106, 1, 0, 0, 0, 104, 102, 1, 0, 0, 0, 104, 105, 1, 0, 0, 0, 105, - 7, 1, 0, 0, 0, 106, 104, 1, 0, 0, 0, 107, 108, 5, 55, 0, 0, 108, 110, 3, - 46, 23, 0, 109, 107, 1, 0, 0, 0, 109, 110, 1, 0, 0, 0, 110, 111, 1, 0, - 0, 0, 111, 114, 5, 55, 0, 0, 112, 113, 5, 20, 0, 0, 113, 115, 5, 9, 0, - 0, 114, 112, 1, 0, 0, 0, 114, 115, 1, 0, 0, 0, 115, 116, 1, 0, 0, 0, 116, - 117, 5, 21, 0, 0, 117, 118, 5, 9, 0, 0, 118, 126, 3, 50, 25, 0, 119, 120, - 5, 55, 0, 0, 120, 122, 5, 23, 0, 0, 121, 123, 3, 10, 5, 0, 122, 121, 1, - 0, 0, 0, 123, 124, 1, 0, 0, 0, 124, 122, 1, 0, 0, 0, 124, 125, 1, 0, 0, - 0, 125, 127, 1, 0, 0, 0, 126, 119, 1, 0, 0, 0, 126, 127, 1, 0, 0, 0, 127, - 9, 1, 0, 0, 0, 128, 129, 5, 55, 0, 0, 129, 131, 3, 46, 23, 0, 130, 128, - 1, 0, 0, 0, 130, 131, 1, 0, 0, 0, 131, 132, 1, 0, 0, 0, 132, 133, 5, 55, - 0, 0, 133, 134, 5, 25, 0, 0, 134, 135, 5, 9, 0, 0, 135, 137, 3, 12, 6, - 0, 136, 138, 5, 9, 0, 0, 137, 136, 1, 0, 0, 0, 137, 138, 1, 0, 0, 0, 138, - 139, 1, 0, 0, 0, 139, 141, 5, 1, 0, 0, 140, 142, 5, 9, 0, 0, 141, 140, - 1, 0, 0, 0, 141, 142, 1, 0, 0, 0, 142, 143, 1, 0, 0, 0, 143, 144, 3, 14, - 7, 0, 144, 11, 1, 0, 0, 0, 145, 146, 3, 50, 25, 0, 146, 13, 1, 0, 0, 0, - 147, 151, 3, 26, 13, 0, 148, 151, 3, 20, 10, 0, 149, 151, 3, 22, 11, 0, - 150, 147, 1, 0, 0, 0, 150, 148, 1, 0, 0, 0, 150, 149, 1, 0, 0, 0, 151, - 153, 1, 0, 0, 0, 152, 154, 3, 18, 9, 0, 153, 152, 1, 0, 0, 0, 153, 154, - 1, 0, 0, 0, 154, 15, 1, 0, 0, 0, 155, 158, 3, 20, 10, 0, 156, 158, 3, 24, - 12, 0, 157, 155, 1, 0, 0, 0, 157, 156, 1, 0, 0, 0, 158, 160, 1, 0, 0, 0, - 159, 161, 3, 18, 9, 0, 160, 159, 1, 0, 0, 0, 160, 161, 1, 0, 0, 0, 161, - 17, 1, 0, 0, 0, 162, 163, 5, 9, 0, 0, 163, 164, 5, 13, 0, 0, 164, 167, - 5, 9, 0, 0, 165, 168, 3, 20, 10, 0, 166, 168, 3, 24, 12, 0, 167, 165, 1, - 0, 0, 0, 167, 166, 1, 0, 0, 0, 168, 170, 1, 0, 0, 0, 169, 162, 1, 0, 0, - 0, 170, 171, 1, 0, 0, 0, 171, 169, 1, 0, 0, 0, 171, 172, 1, 0, 0, 0, 172, - 192, 1, 0, 0, 0, 173, 174, 5, 9, 0, 0, 174, 175, 5, 12, 0, 0, 175, 178, - 5, 9, 0, 0, 176, 179, 3, 20, 10, 0, 177, 179, 3, 24, 12, 0, 178, 176, 1, - 0, 0, 0, 178, 177, 1, 0, 0, 0, 179, 181, 1, 0, 0, 0, 180, 173, 1, 0, 0, - 0, 181, 182, 1, 0, 0, 0, 182, 180, 1, 0, 0, 0, 182, 183, 1, 0, 0, 0, 183, - 192, 1, 0, 0, 0, 184, 185, 5, 9, 0, 0, 185, 186, 5, 14, 0, 0, 186, 189, - 5, 9, 0, 0, 187, 190, 3, 20, 10, 0, 188, 190, 3, 24, 12, 0, 189, 187, 1, - 0, 0, 0, 189, 188, 1, 0, 0, 0, 190, 192, 1, 0, 0, 0, 191, 169, 1, 0, 0, - 0, 191, 180, 1, 0, 0, 0, 191, 184, 1, 0, 0, 0, 192, 19, 1, 0, 0, 0, 193, - 194, 3, 28, 14, 0, 194, 21, 1, 0, 0, 0, 195, 199, 5, 7, 0, 0, 196, 198, - 5, 9, 0, 0, 197, 196, 1, 0, 0, 0, 198, 201, 1, 0, 0, 0, 199, 197, 1, 0, - 0, 0, 199, 200, 1, 0, 0, 0, 200, 204, 1, 0, 0, 0, 201, 199, 1, 0, 0, 0, - 202, 205, 3, 14, 7, 0, 203, 205, 3, 24, 12, 0, 204, 202, 1, 0, 0, 0, 204, - 203, 1, 0, 0, 0, 205, 209, 1, 0, 0, 0, 206, 208, 5, 9, 0, 0, 207, 206, - 1, 0, 0, 0, 208, 211, 1, 0, 0, 0, 209, 207, 1, 0, 0, 0, 209, 210, 1, 0, - 0, 0, 210, 212, 1, 0, 0, 0, 211, 209, 1, 0, 0, 0, 212, 213, 5, 8, 0, 0, - 213, 23, 1, 0, 0, 0, 214, 218, 5, 7, 0, 0, 215, 217, 5, 9, 0, 0, 216, 215, - 1, 0, 0, 0, 217, 220, 1, 0, 0, 0, 218, 216, 1, 0, 0, 0, 218, 219, 1, 0, - 0, 0, 219, 223, 1, 0, 0, 0, 220, 218, 1, 0, 0, 0, 221, 224, 3, 16, 8, 0, - 222, 224, 3, 24, 12, 0, 223, 221, 1, 0, 0, 0, 223, 222, 1, 0, 0, 0, 224, - 228, 1, 0, 0, 0, 225, 227, 5, 9, 0, 0, 226, 225, 1, 0, 0, 0, 227, 230, - 1, 0, 0, 0, 228, 226, 1, 0, 0, 0, 228, 229, 1, 0, 0, 0, 229, 231, 1, 0, - 0, 0, 230, 228, 1, 0, 0, 0, 231, 232, 5, 8, 0, 0, 232, 25, 1, 0, 0, 0, - 233, 235, 5, 5, 0, 0, 234, 236, 5, 9, 0, 0, 235, 234, 1, 0, 0, 0, 235, - 236, 1, 0, 0, 0, 236, 237, 1, 0, 0, 0, 237, 239, 3, 30, 15, 0, 238, 240, - 5, 9, 0, 0, 239, 238, 1, 0, 0, 0, 239, 240, 1, 0, 0, 0, 240, 251, 1, 0, - 0, 0, 241, 243, 5, 2, 0, 0, 242, 244, 5, 9, 0, 0, 243, 242, 1, 0, 0, 0, - 243, 244, 1, 0, 0, 0, 244, 245, 1, 0, 0, 0, 245, 247, 3, 30, 15, 0, 246, - 248, 5, 9, 0, 0, 247, 246, 1, 0, 0, 0, 247, 248, 1, 0, 0, 0, 248, 250, - 1, 0, 0, 0, 249, 241, 1, 0, 0, 0, 250, 253, 1, 0, 0, 0, 251, 249, 1, 0, - 0, 0, 251, 252, 1, 0, 0, 0, 252, 254, 1, 0, 0, 0, 253, 251, 1, 0, 0, 0, - 254, 255, 5, 34, 0, 0, 255, 27, 1, 0, 0, 0, 256, 261, 3, 50, 25, 0, 257, - 258, 5, 9, 0, 0, 258, 259, 5, 15, 0, 0, 259, 260, 5, 9, 0, 0, 260, 262, - 3, 50, 25, 0, 261, 257, 1, 0, 0, 0, 261, 262, 1, 0, 0, 0, 262, 29, 1, 0, - 0, 0, 263, 265, 5, 55, 0, 0, 264, 263, 1, 0, 0, 0, 264, 265, 1, 0, 0, 0, - 265, 273, 1, 0, 0, 0, 266, 274, 3, 32, 16, 0, 267, 268, 3, 32, 16, 0, 268, - 269, 5, 9, 0, 0, 269, 270, 5, 26, 0, 0, 270, 271, 5, 9, 0, 0, 271, 272, - 3, 38, 19, 0, 272, 274, 1, 0, 0, 0, 273, 266, 1, 0, 0, 0, 273, 267, 1, - 0, 0, 0, 274, 276, 1, 0, 0, 0, 275, 277, 5, 55, 0, 0, 276, 275, 1, 0, 0, - 0, 276, 277, 1, 0, 0, 0, 277, 31, 1, 0, 0, 0, 278, 283, 3, 50, 25, 0, 279, - 280, 5, 1, 0, 0, 280, 284, 5, 42, 0, 0, 281, 282, 5, 11, 0, 0, 282, 284, - 3, 50, 25, 0, 283, 279, 1, 0, 0, 0, 283, 281, 1, 0, 0, 0, 283, 284, 1, - 0, 0, 0, 284, 33, 1, 0, 0, 0, 285, 287, 3, 36, 18, 0, 286, 285, 1, 0, 0, - 0, 287, 290, 1, 0, 0, 0, 288, 286, 1, 0, 0, 0, 288, 289, 1, 0, 0, 0, 289, - 35, 1, 0, 0, 0, 290, 288, 1, 0, 0, 0, 291, 292, 5, 55, 0, 0, 292, 294, - 3, 46, 23, 0, 293, 291, 1, 0, 0, 0, 293, 294, 1, 0, 0, 0, 294, 295, 1, - 0, 0, 0, 295, 296, 5, 55, 0, 0, 296, 297, 5, 22, 0, 0, 297, 298, 5, 9, - 0, 0, 298, 300, 3, 38, 19, 0, 299, 301, 5, 9, 0, 0, 300, 299, 1, 0, 0, - 0, 300, 301, 1, 0, 0, 0, 301, 302, 1, 0, 0, 0, 302, 304, 5, 7, 0, 0, 303, - 305, 5, 9, 0, 0, 304, 303, 1, 0, 0, 0, 304, 305, 1, 0, 0, 0, 305, 306, - 1, 0, 0, 0, 306, 308, 3, 40, 20, 0, 307, 309, 5, 9, 0, 0, 308, 307, 1, - 0, 0, 0, 308, 309, 1, 0, 0, 0, 309, 320, 1, 0, 0, 0, 310, 312, 5, 2, 0, - 0, 311, 313, 5, 9, 0, 0, 312, 311, 1, 0, 0, 0, 312, 313, 1, 0, 0, 0, 313, - 314, 1, 0, 0, 0, 314, 316, 3, 40, 20, 0, 315, 317, 5, 9, 0, 0, 316, 315, - 1, 0, 0, 0, 316, 317, 1, 0, 0, 0, 317, 319, 1, 0, 0, 0, 318, 310, 1, 0, - 0, 0, 319, 322, 1, 0, 0, 0, 320, 318, 1, 0, 0, 0, 320, 321, 1, 0, 0, 0, - 321, 324, 1, 0, 0, 0, 322, 320, 1, 0, 0, 0, 323, 325, 5, 55, 0, 0, 324, - 323, 1, 0, 0, 0, 324, 325, 1, 0, 0, 0, 325, 326, 1, 0, 0, 0, 326, 328, - 5, 8, 0, 0, 327, 329, 5, 9, 0, 0, 328, 327, 1, 0, 0, 0, 328, 329, 1, 0, - 0, 0, 329, 330, 1, 0, 0, 0, 330, 332, 5, 35, 0, 0, 331, 333, 5, 55, 0, - 0, 332, 331, 1, 0, 0, 0, 332, 333, 1, 0, 0, 0, 333, 335, 1, 0, 0, 0, 334, - 336, 5, 9, 0, 0, 335, 334, 1, 0, 0, 0, 335, 336, 1, 0, 0, 0, 336, 337, - 1, 0, 0, 0, 337, 339, 3, 52, 26, 0, 338, 340, 5, 55, 0, 0, 339, 338, 1, - 0, 0, 0, 339, 340, 1, 0, 0, 0, 340, 341, 1, 0, 0, 0, 341, 342, 5, 36, 0, - 0, 342, 37, 1, 0, 0, 0, 343, 344, 5, 10, 0, 0, 344, 39, 1, 0, 0, 0, 345, - 347, 5, 55, 0, 0, 346, 345, 1, 0, 0, 0, 346, 347, 1, 0, 0, 0, 347, 348, - 1, 0, 0, 0, 348, 350, 3, 42, 21, 0, 349, 351, 5, 9, 0, 0, 350, 349, 1, - 0, 0, 0, 350, 351, 1, 0, 0, 0, 351, 352, 1, 0, 0, 0, 352, 354, 5, 1, 0, - 0, 353, 355, 5, 9, 0, 0, 354, 353, 1, 0, 0, 0, 354, 355, 1, 0, 0, 0, 355, - 356, 1, 0, 0, 0, 356, 357, 3, 44, 22, 0, 357, 41, 1, 0, 0, 0, 358, 359, - 5, 10, 0, 0, 359, 43, 1, 0, 0, 0, 360, 366, 5, 57, 0, 0, 361, 362, 5, 56, - 0, 0, 362, 363, 5, 3, 0, 0, 363, 364, 5, 57, 0, 0, 364, 366, 5, 4, 0, 0, - 365, 360, 1, 0, 0, 0, 365, 361, 1, 0, 0, 0, 366, 45, 1, 0, 0, 0, 367, 371, - 5, 11, 0, 0, 368, 370, 8, 0, 0, 0, 369, 368, 1, 0, 0, 0, 370, 373, 1, 0, - 0, 0, 371, 369, 1, 0, 0, 0, 371, 372, 1, 0, 0, 0, 372, 376, 1, 0, 0, 0, - 373, 371, 1, 0, 0, 0, 374, 375, 5, 55, 0, 0, 375, 377, 3, 46, 23, 0, 376, - 374, 1, 0, 0, 0, 376, 377, 1, 0, 0, 0, 377, 47, 1, 0, 0, 0, 378, 379, 7, - 1, 0, 0, 379, 49, 1, 0, 0, 0, 380, 383, 3, 48, 24, 0, 381, 383, 5, 54, - 0, 0, 382, 380, 1, 0, 0, 0, 382, 381, 1, 0, 0, 0, 383, 51, 1, 0, 0, 0, - 384, 387, 7, 2, 0, 0, 385, 387, 8, 3, 0, 0, 386, 384, 1, 0, 0, 0, 386, - 385, 1, 0, 0, 0, 387, 390, 1, 0, 0, 0, 388, 386, 1, 0, 0, 0, 388, 389, - 1, 0, 0, 0, 389, 53, 1, 0, 0, 0, 390, 388, 1, 0, 0, 0, 66, 55, 58, 62, - 65, 69, 73, 80, 88, 93, 99, 104, 109, 114, 124, 126, 130, 137, 141, 150, - 153, 157, 160, 167, 171, 178, 182, 189, 191, 199, 204, 209, 218, 223, 228, - 235, 239, 243, 247, 251, 261, 264, 273, 276, 283, 288, 293, 300, 304, 308, - 312, 316, 320, 324, 328, 332, 335, 339, 346, 350, 354, 365, 371, 376, 382, - 386, 388, + 1, 15, 3, 15, 274, 8, 15, 3, 15, 276, 8, 15, 1, 15, 3, 15, 279, 8, 15, + 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 3, 16, 286, 8, 16, 1, 17, 5, 17, 289, + 8, 17, 10, 17, 12, 17, 292, 9, 17, 1, 18, 1, 18, 3, 18, 296, 8, 18, 1, + 18, 1, 18, 1, 18, 1, 18, 1, 18, 3, 18, 303, 8, 18, 1, 18, 1, 18, 3, 18, + 307, 8, 18, 1, 18, 1, 18, 3, 18, 311, 8, 18, 1, 18, 1, 18, 3, 18, 315, + 8, 18, 1, 18, 1, 18, 3, 18, 319, 8, 18, 5, 18, 321, 8, 18, 10, 18, 12, + 18, 324, 9, 18, 1, 18, 3, 18, 327, 8, 18, 1, 18, 1, 18, 3, 18, 331, 8, + 18, 1, 18, 1, 18, 3, 18, 335, 8, 18, 1, 18, 3, 18, 338, 8, 18, 1, 18, 1, + 18, 3, 18, 342, 8, 18, 1, 18, 1, 18, 1, 19, 1, 19, 1, 20, 3, 20, 349, 8, + 20, 1, 20, 1, 20, 3, 20, 353, 8, 20, 1, 20, 1, 20, 3, 20, 357, 8, 20, 1, + 20, 1, 20, 1, 21, 1, 21, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 3, 22, 368, + 8, 22, 1, 23, 1, 23, 5, 23, 372, 8, 23, 10, 23, 12, 23, 375, 9, 23, 1, + 23, 1, 23, 3, 23, 379, 8, 23, 1, 24, 1, 24, 1, 25, 1, 25, 3, 25, 385, 8, + 25, 1, 26, 1, 26, 5, 26, 389, 8, 26, 10, 26, 12, 26, 392, 9, 26, 1, 26, + 0, 0, 27, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, + 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 0, 4, 1, 0, 56, 56, 4, 0, 10, 10, + 16, 18, 20, 21, 24, 24, 5, 0, 3, 5, 7, 10, 27, 35, 37, 53, 56, 56, 1, 0, + 36, 36, 436, 0, 55, 1, 0, 0, 0, 2, 80, 1, 0, 0, 0, 4, 93, 1, 0, 0, 0, 6, + 104, 1, 0, 0, 0, 8, 109, 1, 0, 0, 0, 10, 130, 1, 0, 0, 0, 12, 145, 1, 0, + 0, 0, 14, 150, 1, 0, 0, 0, 16, 157, 1, 0, 0, 0, 18, 191, 1, 0, 0, 0, 20, + 193, 1, 0, 0, 0, 22, 195, 1, 0, 0, 0, 24, 214, 1, 0, 0, 0, 26, 233, 1, + 0, 0, 0, 28, 256, 1, 0, 0, 0, 30, 264, 1, 0, 0, 0, 32, 280, 1, 0, 0, 0, + 34, 290, 1, 0, 0, 0, 36, 295, 1, 0, 0, 0, 38, 345, 1, 0, 0, 0, 40, 348, + 1, 0, 0, 0, 42, 360, 1, 0, 0, 0, 44, 367, 1, 0, 0, 0, 46, 369, 1, 0, 0, + 0, 48, 380, 1, 0, 0, 0, 50, 384, 1, 0, 0, 0, 52, 390, 1, 0, 0, 0, 54, 56, + 5, 9, 0, 0, 55, 54, 1, 0, 0, 0, 55, 56, 1, 0, 0, 0, 56, 58, 1, 0, 0, 0, + 57, 59, 5, 56, 0, 0, 58, 57, 1, 0, 0, 0, 58, 59, 1, 0, 0, 0, 59, 62, 1, + 0, 0, 0, 60, 63, 3, 2, 1, 0, 61, 63, 3, 4, 2, 0, 62, 60, 1, 0, 0, 0, 62, + 61, 1, 0, 0, 0, 63, 65, 1, 0, 0, 0, 64, 66, 5, 56, 0, 0, 65, 64, 1, 0, + 0, 0, 65, 66, 1, 0, 0, 0, 66, 67, 1, 0, 0, 0, 67, 69, 3, 6, 3, 0, 68, 70, + 5, 56, 0, 0, 69, 68, 1, 0, 0, 0, 69, 70, 1, 0, 0, 0, 70, 71, 1, 0, 0, 0, + 71, 73, 3, 34, 17, 0, 72, 74, 5, 56, 0, 0, 73, 72, 1, 0, 0, 0, 73, 74, + 1, 0, 0, 0, 74, 75, 1, 0, 0, 0, 75, 76, 5, 0, 0, 1, 76, 1, 1, 0, 0, 0, + 77, 78, 3, 46, 23, 0, 78, 79, 5, 56, 0, 0, 79, 81, 1, 0, 0, 0, 80, 77, + 1, 0, 0, 0, 80, 81, 1, 0, 0, 0, 81, 82, 1, 0, 0, 0, 82, 83, 5, 17, 0, 0, + 83, 84, 5, 56, 0, 0, 84, 85, 5, 18, 0, 0, 85, 86, 5, 9, 0, 0, 86, 88, 5, + 19, 0, 0, 87, 89, 5, 9, 0, 0, 88, 87, 1, 0, 0, 0, 88, 89, 1, 0, 0, 0, 89, + 3, 1, 0, 0, 0, 90, 91, 3, 46, 23, 0, 91, 92, 5, 56, 0, 0, 92, 94, 1, 0, + 0, 0, 93, 90, 1, 0, 0, 0, 93, 94, 1, 0, 0, 0, 94, 95, 1, 0, 0, 0, 95, 96, + 5, 16, 0, 0, 96, 97, 5, 9, 0, 0, 97, 99, 3, 48, 24, 0, 98, 100, 5, 9, 0, + 0, 99, 98, 1, 0, 0, 0, 99, 100, 1, 0, 0, 0, 100, 5, 1, 0, 0, 0, 101, 103, + 3, 8, 4, 0, 102, 101, 1, 0, 0, 0, 103, 106, 1, 0, 0, 0, 104, 102, 1, 0, + 0, 0, 104, 105, 1, 0, 0, 0, 105, 7, 1, 0, 0, 0, 106, 104, 1, 0, 0, 0, 107, + 108, 5, 56, 0, 0, 108, 110, 3, 46, 23, 0, 109, 107, 1, 0, 0, 0, 109, 110, + 1, 0, 0, 0, 110, 111, 1, 0, 0, 0, 111, 114, 5, 56, 0, 0, 112, 113, 5, 20, + 0, 0, 113, 115, 5, 9, 0, 0, 114, 112, 1, 0, 0, 0, 114, 115, 1, 0, 0, 0, + 115, 116, 1, 0, 0, 0, 116, 117, 5, 21, 0, 0, 117, 118, 5, 9, 0, 0, 118, + 126, 3, 50, 25, 0, 119, 120, 5, 56, 0, 0, 120, 122, 5, 23, 0, 0, 121, 123, + 3, 10, 5, 0, 122, 121, 1, 0, 0, 0, 123, 124, 1, 0, 0, 0, 124, 122, 1, 0, + 0, 0, 124, 125, 1, 0, 0, 0, 125, 127, 1, 0, 0, 0, 126, 119, 1, 0, 0, 0, + 126, 127, 1, 0, 0, 0, 127, 9, 1, 0, 0, 0, 128, 129, 5, 56, 0, 0, 129, 131, + 3, 46, 23, 0, 130, 128, 1, 0, 0, 0, 130, 131, 1, 0, 0, 0, 131, 132, 1, + 0, 0, 0, 132, 133, 5, 56, 0, 0, 133, 134, 5, 25, 0, 0, 134, 135, 5, 9, + 0, 0, 135, 137, 3, 12, 6, 0, 136, 138, 5, 9, 0, 0, 137, 136, 1, 0, 0, 0, + 137, 138, 1, 0, 0, 0, 138, 139, 1, 0, 0, 0, 139, 141, 5, 1, 0, 0, 140, + 142, 5, 9, 0, 0, 141, 140, 1, 0, 0, 0, 141, 142, 1, 0, 0, 0, 142, 143, + 1, 0, 0, 0, 143, 144, 3, 14, 7, 0, 144, 11, 1, 0, 0, 0, 145, 146, 3, 50, + 25, 0, 146, 13, 1, 0, 0, 0, 147, 151, 3, 26, 13, 0, 148, 151, 3, 20, 10, + 0, 149, 151, 3, 22, 11, 0, 150, 147, 1, 0, 0, 0, 150, 148, 1, 0, 0, 0, + 150, 149, 1, 0, 0, 0, 151, 153, 1, 0, 0, 0, 152, 154, 3, 18, 9, 0, 153, + 152, 1, 0, 0, 0, 153, 154, 1, 0, 0, 0, 154, 15, 1, 0, 0, 0, 155, 158, 3, + 20, 10, 0, 156, 158, 3, 24, 12, 0, 157, 155, 1, 0, 0, 0, 157, 156, 1, 0, + 0, 0, 158, 160, 1, 0, 0, 0, 159, 161, 3, 18, 9, 0, 160, 159, 1, 0, 0, 0, + 160, 161, 1, 0, 0, 0, 161, 17, 1, 0, 0, 0, 162, 163, 5, 9, 0, 0, 163, 164, + 5, 13, 0, 0, 164, 167, 5, 9, 0, 0, 165, 168, 3, 20, 10, 0, 166, 168, 3, + 24, 12, 0, 167, 165, 1, 0, 0, 0, 167, 166, 1, 0, 0, 0, 168, 170, 1, 0, + 0, 0, 169, 162, 1, 0, 0, 0, 170, 171, 1, 0, 0, 0, 171, 169, 1, 0, 0, 0, + 171, 172, 1, 0, 0, 0, 172, 192, 1, 0, 0, 0, 173, 174, 5, 9, 0, 0, 174, + 175, 5, 12, 0, 0, 175, 178, 5, 9, 0, 0, 176, 179, 3, 20, 10, 0, 177, 179, + 3, 24, 12, 0, 178, 176, 1, 0, 0, 0, 178, 177, 1, 0, 0, 0, 179, 181, 1, + 0, 0, 0, 180, 173, 1, 0, 0, 0, 181, 182, 1, 0, 0, 0, 182, 180, 1, 0, 0, + 0, 182, 183, 1, 0, 0, 0, 183, 192, 1, 0, 0, 0, 184, 185, 5, 9, 0, 0, 185, + 186, 5, 14, 0, 0, 186, 189, 5, 9, 0, 0, 187, 190, 3, 20, 10, 0, 188, 190, + 3, 24, 12, 0, 189, 187, 1, 0, 0, 0, 189, 188, 1, 0, 0, 0, 190, 192, 1, + 0, 0, 0, 191, 169, 1, 0, 0, 0, 191, 180, 1, 0, 0, 0, 191, 184, 1, 0, 0, + 0, 192, 19, 1, 0, 0, 0, 193, 194, 3, 28, 14, 0, 194, 21, 1, 0, 0, 0, 195, + 199, 5, 7, 0, 0, 196, 198, 5, 9, 0, 0, 197, 196, 1, 0, 0, 0, 198, 201, + 1, 0, 0, 0, 199, 197, 1, 0, 0, 0, 199, 200, 1, 0, 0, 0, 200, 204, 1, 0, + 0, 0, 201, 199, 1, 0, 0, 0, 202, 205, 3, 14, 7, 0, 203, 205, 3, 24, 12, + 0, 204, 202, 1, 0, 0, 0, 204, 203, 1, 0, 0, 0, 205, 209, 1, 0, 0, 0, 206, + 208, 5, 9, 0, 0, 207, 206, 1, 0, 0, 0, 208, 211, 1, 0, 0, 0, 209, 207, + 1, 0, 0, 0, 209, 210, 1, 0, 0, 0, 210, 212, 1, 0, 0, 0, 211, 209, 1, 0, + 0, 0, 212, 213, 5, 8, 0, 0, 213, 23, 1, 0, 0, 0, 214, 218, 5, 7, 0, 0, + 215, 217, 5, 9, 0, 0, 216, 215, 1, 0, 0, 0, 217, 220, 1, 0, 0, 0, 218, + 216, 1, 0, 0, 0, 218, 219, 1, 0, 0, 0, 219, 223, 1, 0, 0, 0, 220, 218, + 1, 0, 0, 0, 221, 224, 3, 16, 8, 0, 222, 224, 3, 24, 12, 0, 223, 221, 1, + 0, 0, 0, 223, 222, 1, 0, 0, 0, 224, 228, 1, 0, 0, 0, 225, 227, 5, 9, 0, + 0, 226, 225, 1, 0, 0, 0, 227, 230, 1, 0, 0, 0, 228, 226, 1, 0, 0, 0, 228, + 229, 1, 0, 0, 0, 229, 231, 1, 0, 0, 0, 230, 228, 1, 0, 0, 0, 231, 232, + 5, 8, 0, 0, 232, 25, 1, 0, 0, 0, 233, 235, 5, 5, 0, 0, 234, 236, 5, 9, + 0, 0, 235, 234, 1, 0, 0, 0, 235, 236, 1, 0, 0, 0, 236, 237, 1, 0, 0, 0, + 237, 239, 3, 30, 15, 0, 238, 240, 5, 9, 0, 0, 239, 238, 1, 0, 0, 0, 239, + 240, 1, 0, 0, 0, 240, 251, 1, 0, 0, 0, 241, 243, 5, 2, 0, 0, 242, 244, + 5, 9, 0, 0, 243, 242, 1, 0, 0, 0, 243, 244, 1, 0, 0, 0, 244, 245, 1, 0, + 0, 0, 245, 247, 3, 30, 15, 0, 246, 248, 5, 9, 0, 0, 247, 246, 1, 0, 0, + 0, 247, 248, 1, 0, 0, 0, 248, 250, 1, 0, 0, 0, 249, 241, 1, 0, 0, 0, 250, + 253, 1, 0, 0, 0, 251, 249, 1, 0, 0, 0, 251, 252, 1, 0, 0, 0, 252, 254, + 1, 0, 0, 0, 253, 251, 1, 0, 0, 0, 254, 255, 5, 34, 0, 0, 255, 27, 1, 0, + 0, 0, 256, 261, 3, 50, 25, 0, 257, 258, 5, 9, 0, 0, 258, 259, 5, 15, 0, + 0, 259, 260, 5, 9, 0, 0, 260, 262, 3, 50, 25, 0, 261, 257, 1, 0, 0, 0, + 261, 262, 1, 0, 0, 0, 262, 29, 1, 0, 0, 0, 263, 265, 5, 56, 0, 0, 264, + 263, 1, 0, 0, 0, 264, 265, 1, 0, 0, 0, 265, 275, 1, 0, 0, 0, 266, 276, + 3, 32, 16, 0, 267, 268, 3, 32, 16, 0, 268, 269, 5, 9, 0, 0, 269, 270, 5, + 26, 0, 0, 270, 273, 5, 9, 0, 0, 271, 274, 3, 38, 19, 0, 272, 274, 5, 54, + 0, 0, 273, 271, 1, 0, 0, 0, 273, 272, 1, 0, 0, 0, 274, 276, 1, 0, 0, 0, + 275, 266, 1, 0, 0, 0, 275, 267, 1, 0, 0, 0, 276, 278, 1, 0, 0, 0, 277, + 279, 5, 56, 0, 0, 278, 277, 1, 0, 0, 0, 278, 279, 1, 0, 0, 0, 279, 31, + 1, 0, 0, 0, 280, 285, 3, 50, 25, 0, 281, 282, 5, 1, 0, 0, 282, 286, 5, + 42, 0, 0, 283, 284, 5, 11, 0, 0, 284, 286, 3, 50, 25, 0, 285, 281, 1, 0, + 0, 0, 285, 283, 1, 0, 0, 0, 285, 286, 1, 0, 0, 0, 286, 33, 1, 0, 0, 0, + 287, 289, 3, 36, 18, 0, 288, 287, 1, 0, 0, 0, 289, 292, 1, 0, 0, 0, 290, + 288, 1, 0, 0, 0, 290, 291, 1, 0, 0, 0, 291, 35, 1, 0, 0, 0, 292, 290, 1, + 0, 0, 0, 293, 294, 5, 56, 0, 0, 294, 296, 3, 46, 23, 0, 295, 293, 1, 0, + 0, 0, 295, 296, 1, 0, 0, 0, 296, 297, 1, 0, 0, 0, 297, 298, 5, 56, 0, 0, + 298, 299, 5, 22, 0, 0, 299, 300, 5, 9, 0, 0, 300, 302, 3, 38, 19, 0, 301, + 303, 5, 9, 0, 0, 302, 301, 1, 0, 0, 0, 302, 303, 1, 0, 0, 0, 303, 304, + 1, 0, 0, 0, 304, 306, 5, 7, 0, 0, 305, 307, 5, 9, 0, 0, 306, 305, 1, 0, + 0, 0, 306, 307, 1, 0, 0, 0, 307, 308, 1, 0, 0, 0, 308, 310, 3, 40, 20, + 0, 309, 311, 5, 9, 0, 0, 310, 309, 1, 0, 0, 0, 310, 311, 1, 0, 0, 0, 311, + 322, 1, 0, 0, 0, 312, 314, 5, 2, 0, 0, 313, 315, 5, 9, 0, 0, 314, 313, + 1, 0, 0, 0, 314, 315, 1, 0, 0, 0, 315, 316, 1, 0, 0, 0, 316, 318, 3, 40, + 20, 0, 317, 319, 5, 9, 0, 0, 318, 317, 1, 0, 0, 0, 318, 319, 1, 0, 0, 0, + 319, 321, 1, 0, 0, 0, 320, 312, 1, 0, 0, 0, 321, 324, 1, 0, 0, 0, 322, + 320, 1, 0, 0, 0, 322, 323, 1, 0, 0, 0, 323, 326, 1, 0, 0, 0, 324, 322, + 1, 0, 0, 0, 325, 327, 5, 56, 0, 0, 326, 325, 1, 0, 0, 0, 326, 327, 1, 0, + 0, 0, 327, 328, 1, 0, 0, 0, 328, 330, 5, 8, 0, 0, 329, 331, 5, 9, 0, 0, + 330, 329, 1, 0, 0, 0, 330, 331, 1, 0, 0, 0, 331, 332, 1, 0, 0, 0, 332, + 334, 5, 35, 0, 0, 333, 335, 5, 56, 0, 0, 334, 333, 1, 0, 0, 0, 334, 335, + 1, 0, 0, 0, 335, 337, 1, 0, 0, 0, 336, 338, 5, 9, 0, 0, 337, 336, 1, 0, + 0, 0, 337, 338, 1, 0, 0, 0, 338, 339, 1, 0, 0, 0, 339, 341, 3, 52, 26, + 0, 340, 342, 5, 56, 0, 0, 341, 340, 1, 0, 0, 0, 341, 342, 1, 0, 0, 0, 342, + 343, 1, 0, 0, 0, 343, 344, 5, 36, 0, 0, 344, 37, 1, 0, 0, 0, 345, 346, + 5, 10, 0, 0, 346, 39, 1, 0, 0, 0, 347, 349, 5, 56, 0, 0, 348, 347, 1, 0, + 0, 0, 348, 349, 1, 0, 0, 0, 349, 350, 1, 0, 0, 0, 350, 352, 3, 42, 21, + 0, 351, 353, 5, 9, 0, 0, 352, 351, 1, 0, 0, 0, 352, 353, 1, 0, 0, 0, 353, + 354, 1, 0, 0, 0, 354, 356, 5, 1, 0, 0, 355, 357, 5, 9, 0, 0, 356, 355, + 1, 0, 0, 0, 356, 357, 1, 0, 0, 0, 357, 358, 1, 0, 0, 0, 358, 359, 3, 44, + 22, 0, 359, 41, 1, 0, 0, 0, 360, 361, 5, 10, 0, 0, 361, 43, 1, 0, 0, 0, + 362, 368, 5, 58, 0, 0, 363, 364, 5, 57, 0, 0, 364, 365, 5, 3, 0, 0, 365, + 366, 5, 58, 0, 0, 366, 368, 5, 4, 0, 0, 367, 362, 1, 0, 0, 0, 367, 363, + 1, 0, 0, 0, 368, 45, 1, 0, 0, 0, 369, 373, 5, 11, 0, 0, 370, 372, 8, 0, + 0, 0, 371, 370, 1, 0, 0, 0, 372, 375, 1, 0, 0, 0, 373, 371, 1, 0, 0, 0, + 373, 374, 1, 0, 0, 0, 374, 378, 1, 0, 0, 0, 375, 373, 1, 0, 0, 0, 376, + 377, 5, 56, 0, 0, 377, 379, 3, 46, 23, 0, 378, 376, 1, 0, 0, 0, 378, 379, + 1, 0, 0, 0, 379, 47, 1, 0, 0, 0, 380, 381, 7, 1, 0, 0, 381, 49, 1, 0, 0, + 0, 382, 385, 3, 48, 24, 0, 383, 385, 5, 55, 0, 0, 384, 382, 1, 0, 0, 0, + 384, 383, 1, 0, 0, 0, 385, 51, 1, 0, 0, 0, 386, 389, 7, 2, 0, 0, 387, 389, + 8, 3, 0, 0, 388, 386, 1, 0, 0, 0, 388, 387, 1, 0, 0, 0, 389, 392, 1, 0, + 0, 0, 390, 388, 1, 0, 0, 0, 390, 391, 1, 0, 0, 0, 391, 53, 1, 0, 0, 0, + 392, 390, 1, 0, 0, 0, 67, 55, 58, 62, 65, 69, 73, 80, 88, 93, 99, 104, + 109, 114, 124, 126, 130, 137, 141, 150, 153, 157, 160, 167, 171, 178, 182, + 189, 191, 199, 204, 209, 218, 223, 228, 235, 239, 243, 247, 251, 261, 264, + 273, 275, 278, 285, 290, 295, 302, 306, 310, 314, 318, 322, 326, 330, 334, + 337, 341, 348, 352, 356, 367, 373, 378, 384, 388, 390, } deserializer := antlr.NewATNDeserializer(nil) staticData.atn = deserializer.Deserialize(staticData.serializedATN) @@ -337,10 +339,11 @@ const ( OpenFGAParserNUM_UINT = 51 OpenFGAParserSTRING = 52 OpenFGAParserBYTES = 53 - OpenFGAParserEXTENDED_IDENTIFIER = 54 - OpenFGAParserNEWLINE = 55 - OpenFGAParserCONDITION_PARAM_CONTAINER = 56 - OpenFGAParserCONDITION_PARAM_TYPE = 57 + OpenFGAParserDOLLAR_EXPRESSION = 54 + OpenFGAParserEXTENDED_IDENTIFIER = 55 + OpenFGAParserNEWLINE = 56 + OpenFGAParserCONDITION_PARAM_CONTAINER = 57 + OpenFGAParserCONDITION_PARAM_TYPE = 58 ) // OpenFGAParser rules. @@ -3989,6 +3992,7 @@ type IRelationDefTypeRestrictionContext interface { WHITESPACE(i int) antlr.TerminalNode KEYWORD_WITH() antlr.TerminalNode ConditionName() IConditionNameContext + DOLLAR_EXPRESSION() antlr.TerminalNode // IsRelationDefTypeRestrictionContext differentiates from other interfaces. IsRelationDefTypeRestrictionContext() @@ -4078,6 +4082,10 @@ func (s *RelationDefTypeRestrictionContext) ConditionName() IConditionNameContex return t.(IConditionNameContext) } +func (s *RelationDefTypeRestrictionContext) DOLLAR_EXPRESSION() antlr.TerminalNode { + return s.GetToken(OpenFGAParserDOLLAR_EXPRESSION, 0) +} + func (s *RelationDefTypeRestrictionContext) GetRuleContext() antlr.RuleContext { return s } @@ -4127,13 +4135,13 @@ func (p *OpenFGAParser) RelationDefTypeRestriction() (localctx IRelationDefTypeR } } - p.SetState(273) + p.SetState(275) p.GetErrorHandler().Sync(p) if p.HasError() { goto errorExit } - switch p.GetInterpreter().AdaptivePredict(p.BaseParser, p.GetTokenStream(), 41, p.GetParserRuleContext()) { + switch p.GetInterpreter().AdaptivePredict(p.BaseParser, p.GetTokenStream(), 42, p.GetParserRuleContext()) { case 1: { p.SetState(266) @@ -4170,16 +4178,42 @@ func (p *OpenFGAParser) RelationDefTypeRestriction() (localctx IRelationDefTypeR goto errorExit } } - { - p.SetState(271) - p.ConditionName() + p.SetState(273) + p.GetErrorHandler().Sync(p) + if p.HasError() { + goto errorExit + } + + switch p.GetTokenStream().LA(1) { + case OpenFGAParserIDENTIFIER: + { + p.SetState(271) + p.ConditionName() + } + + + case OpenFGAParserDOLLAR_EXPRESSION: + { + p.SetState(272) + p.Match(OpenFGAParserDOLLAR_EXPRESSION) + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + + + + default: + p.SetError(antlr.NewNoViableAltException(p, nil, nil, nil, nil, nil)) + goto errorExit } case antlr.ATNInvalidAltNumber: goto errorExit } - p.SetState(276) + p.SetState(278) p.GetErrorHandler().Sync(p) if p.HasError() { goto errorExit @@ -4189,7 +4223,7 @@ func (p *OpenFGAParser) RelationDefTypeRestriction() (localctx IRelationDefTypeR if _la == OpenFGAParserNEWLINE { { - p.SetState(275) + p.SetState(277) p.Match(OpenFGAParserNEWLINE) if p.HasError() { // Recognition error - abort rule @@ -4388,14 +4422,14 @@ func (p *OpenFGAParser) RelationDefTypeRestrictionBase() (localctx IRelationDefT p.EnterRule(localctx, 32, OpenFGAParserRULE_relationDefTypeRestrictionBase) p.EnterOuterAlt(localctx, 1) { - p.SetState(278) + p.SetState(280) var _x = p.Extended_identifier() localctx.(*RelationDefTypeRestrictionBaseContext).relationDefTypeRestrictionType = _x } - p.SetState(283) + p.SetState(285) p.GetErrorHandler().Sync(p) if p.HasError() { goto errorExit @@ -4403,7 +4437,7 @@ func (p *OpenFGAParser) RelationDefTypeRestrictionBase() (localctx IRelationDefT switch p.GetTokenStream().LA(1) { case OpenFGAParserCOLON: { - p.SetState(279) + p.SetState(281) p.Match(OpenFGAParserCOLON) if p.HasError() { // Recognition error - abort rule @@ -4411,7 +4445,7 @@ func (p *OpenFGAParser) RelationDefTypeRestrictionBase() (localctx IRelationDefT } } { - p.SetState(280) + p.SetState(282) var _m = p.Match(OpenFGAParserSTAR) @@ -4426,7 +4460,7 @@ func (p *OpenFGAParser) RelationDefTypeRestrictionBase() (localctx IRelationDefT case OpenFGAParserHASH: { - p.SetState(281) + p.SetState(283) p.Match(OpenFGAParserHASH) if p.HasError() { // Recognition error - abort rule @@ -4434,7 +4468,7 @@ func (p *OpenFGAParser) RelationDefTypeRestrictionBase() (localctx IRelationDefT } } { - p.SetState(282) + p.SetState(284) var _x = p.Extended_identifier() @@ -4585,30 +4619,30 @@ func (p *OpenFGAParser) Conditions() (localctx IConditionsContext) { var _alt int p.EnterOuterAlt(localctx, 1) - p.SetState(288) + p.SetState(290) p.GetErrorHandler().Sync(p) if p.HasError() { goto errorExit } - _alt = p.GetInterpreter().AdaptivePredict(p.BaseParser, p.GetTokenStream(), 44, p.GetParserRuleContext()) + _alt = p.GetInterpreter().AdaptivePredict(p.BaseParser, p.GetTokenStream(), 45, p.GetParserRuleContext()) if p.HasError() { goto errorExit } for _alt != 2 && _alt != antlr.ATNInvalidAltNumber { if _alt == 1 { { - p.SetState(285) + p.SetState(287) p.Condition() } } - p.SetState(290) + p.SetState(292) p.GetErrorHandler().Sync(p) if p.HasError() { goto errorExit } - _alt = p.GetInterpreter().AdaptivePredict(p.BaseParser, p.GetTokenStream(), 44, p.GetParserRuleContext()) + _alt = p.GetInterpreter().AdaptivePredict(p.BaseParser, p.GetTokenStream(), 45, p.GetParserRuleContext()) if p.HasError() { goto errorExit } @@ -4854,13 +4888,13 @@ func (p *OpenFGAParser) Condition() (localctx IConditionContext) { var _la int p.EnterOuterAlt(localctx, 1) - p.SetState(293) + p.SetState(295) p.GetErrorHandler().Sync(p) - if p.GetInterpreter().AdaptivePredict(p.BaseParser, p.GetTokenStream(), 45, p.GetParserRuleContext()) == 1 { + if p.GetInterpreter().AdaptivePredict(p.BaseParser, p.GetTokenStream(), 46, p.GetParserRuleContext()) == 1 { { - p.SetState(291) + p.SetState(293) p.Match(OpenFGAParserNEWLINE) if p.HasError() { // Recognition error - abort rule @@ -4868,7 +4902,7 @@ func (p *OpenFGAParser) Condition() (localctx IConditionContext) { } } { - p.SetState(292) + p.SetState(294) p.MultiLineComment() } @@ -4876,7 +4910,7 @@ func (p *OpenFGAParser) Condition() (localctx IConditionContext) { goto errorExit } { - p.SetState(295) + p.SetState(297) p.Match(OpenFGAParserNEWLINE) if p.HasError() { // Recognition error - abort rule @@ -4884,7 +4918,7 @@ func (p *OpenFGAParser) Condition() (localctx IConditionContext) { } } { - p.SetState(296) + p.SetState(298) p.Match(OpenFGAParserCONDITION) if p.HasError() { // Recognition error - abort rule @@ -4892,7 +4926,7 @@ func (p *OpenFGAParser) Condition() (localctx IConditionContext) { } } { - p.SetState(297) + p.SetState(299) p.Match(OpenFGAParserWHITESPACE) if p.HasError() { // Recognition error - abort rule @@ -4900,10 +4934,10 @@ func (p *OpenFGAParser) Condition() (localctx IConditionContext) { } } { - p.SetState(298) + p.SetState(300) p.ConditionName() } - p.SetState(300) + p.SetState(302) p.GetErrorHandler().Sync(p) if p.HasError() { goto errorExit @@ -4913,7 +4947,7 @@ func (p *OpenFGAParser) Condition() (localctx IConditionContext) { if _la == OpenFGAParserWHITESPACE { { - p.SetState(299) + p.SetState(301) p.Match(OpenFGAParserWHITESPACE) if p.HasError() { // Recognition error - abort rule @@ -4923,14 +4957,14 @@ func (p *OpenFGAParser) Condition() (localctx IConditionContext) { } { - p.SetState(302) + p.SetState(304) p.Match(OpenFGAParserLPAREN) if p.HasError() { // Recognition error - abort rule goto errorExit } } - p.SetState(304) + p.SetState(306) p.GetErrorHandler().Sync(p) if p.HasError() { goto errorExit @@ -4940,7 +4974,7 @@ func (p *OpenFGAParser) Condition() (localctx IConditionContext) { if _la == OpenFGAParserWHITESPACE { { - p.SetState(303) + p.SetState(305) p.Match(OpenFGAParserWHITESPACE) if p.HasError() { // Recognition error - abort rule @@ -4950,10 +4984,10 @@ func (p *OpenFGAParser) Condition() (localctx IConditionContext) { } { - p.SetState(306) + p.SetState(308) p.ConditionParameter() } - p.SetState(308) + p.SetState(310) p.GetErrorHandler().Sync(p) if p.HasError() { goto errorExit @@ -4963,7 +4997,7 @@ func (p *OpenFGAParser) Condition() (localctx IConditionContext) { if _la == OpenFGAParserWHITESPACE { { - p.SetState(307) + p.SetState(309) p.Match(OpenFGAParserWHITESPACE) if p.HasError() { // Recognition error - abort rule @@ -4972,7 +5006,7 @@ func (p *OpenFGAParser) Condition() (localctx IConditionContext) { } } - p.SetState(320) + p.SetState(322) p.GetErrorHandler().Sync(p) if p.HasError() { goto errorExit @@ -4982,14 +5016,14 @@ func (p *OpenFGAParser) Condition() (localctx IConditionContext) { for _la == OpenFGAParserCOMMA { { - p.SetState(310) + p.SetState(312) p.Match(OpenFGAParserCOMMA) if p.HasError() { // Recognition error - abort rule goto errorExit } } - p.SetState(312) + p.SetState(314) p.GetErrorHandler().Sync(p) if p.HasError() { goto errorExit @@ -4999,7 +5033,7 @@ func (p *OpenFGAParser) Condition() (localctx IConditionContext) { if _la == OpenFGAParserWHITESPACE { { - p.SetState(311) + p.SetState(313) p.Match(OpenFGAParserWHITESPACE) if p.HasError() { // Recognition error - abort rule @@ -5009,10 +5043,10 @@ func (p *OpenFGAParser) Condition() (localctx IConditionContext) { } { - p.SetState(314) + p.SetState(316) p.ConditionParameter() } - p.SetState(316) + p.SetState(318) p.GetErrorHandler().Sync(p) if p.HasError() { goto errorExit @@ -5022,7 +5056,7 @@ func (p *OpenFGAParser) Condition() (localctx IConditionContext) { if _la == OpenFGAParserWHITESPACE { { - p.SetState(315) + p.SetState(317) p.Match(OpenFGAParserWHITESPACE) if p.HasError() { // Recognition error - abort rule @@ -5033,14 +5067,14 @@ func (p *OpenFGAParser) Condition() (localctx IConditionContext) { } - p.SetState(322) + p.SetState(324) p.GetErrorHandler().Sync(p) if p.HasError() { goto errorExit } _la = p.GetTokenStream().LA(1) } - p.SetState(324) + p.SetState(326) p.GetErrorHandler().Sync(p) if p.HasError() { goto errorExit @@ -5050,7 +5084,7 @@ func (p *OpenFGAParser) Condition() (localctx IConditionContext) { if _la == OpenFGAParserNEWLINE { { - p.SetState(323) + p.SetState(325) p.Match(OpenFGAParserNEWLINE) if p.HasError() { // Recognition error - abort rule @@ -5060,14 +5094,14 @@ func (p *OpenFGAParser) Condition() (localctx IConditionContext) { } { - p.SetState(326) + p.SetState(328) p.Match(OpenFGAParserRPAREN) if p.HasError() { // Recognition error - abort rule goto errorExit } } - p.SetState(328) + p.SetState(330) p.GetErrorHandler().Sync(p) if p.HasError() { goto errorExit @@ -5077,7 +5111,7 @@ func (p *OpenFGAParser) Condition() (localctx IConditionContext) { if _la == OpenFGAParserWHITESPACE { { - p.SetState(327) + p.SetState(329) p.Match(OpenFGAParserWHITESPACE) if p.HasError() { // Recognition error - abort rule @@ -5087,20 +5121,20 @@ func (p *OpenFGAParser) Condition() (localctx IConditionContext) { } { - p.SetState(330) + p.SetState(332) p.Match(OpenFGAParserLBRACE) if p.HasError() { // Recognition error - abort rule goto errorExit } } - p.SetState(332) + p.SetState(334) p.GetErrorHandler().Sync(p) - if p.GetInterpreter().AdaptivePredict(p.BaseParser, p.GetTokenStream(), 54, p.GetParserRuleContext()) == 1 { + if p.GetInterpreter().AdaptivePredict(p.BaseParser, p.GetTokenStream(), 55, p.GetParserRuleContext()) == 1 { { - p.SetState(331) + p.SetState(333) p.Match(OpenFGAParserNEWLINE) if p.HasError() { // Recognition error - abort rule @@ -5111,13 +5145,13 @@ func (p *OpenFGAParser) Condition() (localctx IConditionContext) { } else if p.HasError() { // JIM goto errorExit } - p.SetState(335) + p.SetState(337) p.GetErrorHandler().Sync(p) - if p.GetInterpreter().AdaptivePredict(p.BaseParser, p.GetTokenStream(), 55, p.GetParserRuleContext()) == 1 { + if p.GetInterpreter().AdaptivePredict(p.BaseParser, p.GetTokenStream(), 56, p.GetParserRuleContext()) == 1 { { - p.SetState(334) + p.SetState(336) p.Match(OpenFGAParserWHITESPACE) if p.HasError() { // Recognition error - abort rule @@ -5129,10 +5163,10 @@ func (p *OpenFGAParser) Condition() (localctx IConditionContext) { goto errorExit } { - p.SetState(337) + p.SetState(339) p.ConditionExpression() } - p.SetState(339) + p.SetState(341) p.GetErrorHandler().Sync(p) if p.HasError() { goto errorExit @@ -5142,7 +5176,7 @@ func (p *OpenFGAParser) Condition() (localctx IConditionContext) { if _la == OpenFGAParserNEWLINE { { - p.SetState(338) + p.SetState(340) p.Match(OpenFGAParserNEWLINE) if p.HasError() { // Recognition error - abort rule @@ -5152,7 +5186,7 @@ func (p *OpenFGAParser) Condition() (localctx IConditionContext) { } { - p.SetState(341) + p.SetState(343) p.Match(OpenFGAParserRBRACE) if p.HasError() { // Recognition error - abort rule @@ -5255,7 +5289,7 @@ func (p *OpenFGAParser) ConditionName() (localctx IConditionNameContext) { p.EnterRule(localctx, 38, OpenFGAParserRULE_conditionName) p.EnterOuterAlt(localctx, 1) { - p.SetState(343) + p.SetState(345) p.Match(OpenFGAParserIDENTIFIER) if p.HasError() { // Recognition error - abort rule @@ -5408,7 +5442,7 @@ func (p *OpenFGAParser) ConditionParameter() (localctx IConditionParameterContex var _la int p.EnterOuterAlt(localctx, 1) - p.SetState(346) + p.SetState(348) p.GetErrorHandler().Sync(p) if p.HasError() { goto errorExit @@ -5418,7 +5452,7 @@ func (p *OpenFGAParser) ConditionParameter() (localctx IConditionParameterContex if _la == OpenFGAParserNEWLINE { { - p.SetState(345) + p.SetState(347) p.Match(OpenFGAParserNEWLINE) if p.HasError() { // Recognition error - abort rule @@ -5428,10 +5462,10 @@ func (p *OpenFGAParser) ConditionParameter() (localctx IConditionParameterContex } { - p.SetState(348) + p.SetState(350) p.ParameterName() } - p.SetState(350) + p.SetState(352) p.GetErrorHandler().Sync(p) if p.HasError() { goto errorExit @@ -5441,7 +5475,7 @@ func (p *OpenFGAParser) ConditionParameter() (localctx IConditionParameterContex if _la == OpenFGAParserWHITESPACE { { - p.SetState(349) + p.SetState(351) p.Match(OpenFGAParserWHITESPACE) if p.HasError() { // Recognition error - abort rule @@ -5451,14 +5485,14 @@ func (p *OpenFGAParser) ConditionParameter() (localctx IConditionParameterContex } { - p.SetState(352) + p.SetState(354) p.Match(OpenFGAParserCOLON) if p.HasError() { // Recognition error - abort rule goto errorExit } } - p.SetState(354) + p.SetState(356) p.GetErrorHandler().Sync(p) if p.HasError() { goto errorExit @@ -5468,7 +5502,7 @@ func (p *OpenFGAParser) ConditionParameter() (localctx IConditionParameterContex if _la == OpenFGAParserWHITESPACE { { - p.SetState(353) + p.SetState(355) p.Match(OpenFGAParserWHITESPACE) if p.HasError() { // Recognition error - abort rule @@ -5478,7 +5512,7 @@ func (p *OpenFGAParser) ConditionParameter() (localctx IConditionParameterContex } { - p.SetState(356) + p.SetState(358) p.ParameterType() } @@ -5577,7 +5611,7 @@ func (p *OpenFGAParser) ParameterName() (localctx IParameterNameContext) { p.EnterRule(localctx, 42, OpenFGAParserRULE_parameterName) p.EnterOuterAlt(localctx, 1) { - p.SetState(358) + p.SetState(360) p.Match(OpenFGAParserIDENTIFIER) if p.HasError() { // Recognition error - abort rule @@ -5693,7 +5727,7 @@ func (s *ParameterTypeContext) ExitRule(listener antlr.ParseTreeListener) { func (p *OpenFGAParser) ParameterType() (localctx IParameterTypeContext) { localctx = NewParameterTypeContext(p, p.GetParserRuleContext(), p.GetState()) p.EnterRule(localctx, 44, OpenFGAParserRULE_parameterType) - p.SetState(365) + p.SetState(367) p.GetErrorHandler().Sync(p) if p.HasError() { goto errorExit @@ -5703,7 +5737,7 @@ func (p *OpenFGAParser) ParameterType() (localctx IParameterTypeContext) { case OpenFGAParserCONDITION_PARAM_TYPE: p.EnterOuterAlt(localctx, 1) { - p.SetState(360) + p.SetState(362) p.Match(OpenFGAParserCONDITION_PARAM_TYPE) if p.HasError() { // Recognition error - abort rule @@ -5715,7 +5749,7 @@ func (p *OpenFGAParser) ParameterType() (localctx IParameterTypeContext) { case OpenFGAParserCONDITION_PARAM_CONTAINER: p.EnterOuterAlt(localctx, 2) { - p.SetState(361) + p.SetState(363) p.Match(OpenFGAParserCONDITION_PARAM_CONTAINER) if p.HasError() { // Recognition error - abort rule @@ -5723,7 +5757,7 @@ func (p *OpenFGAParser) ParameterType() (localctx IParameterTypeContext) { } } { - p.SetState(362) + p.SetState(364) p.Match(OpenFGAParserLESS) if p.HasError() { // Recognition error - abort rule @@ -5731,7 +5765,7 @@ func (p *OpenFGAParser) ParameterType() (localctx IParameterTypeContext) { } } { - p.SetState(363) + p.SetState(365) p.Match(OpenFGAParserCONDITION_PARAM_TYPE) if p.HasError() { // Recognition error - abort rule @@ -5739,7 +5773,7 @@ func (p *OpenFGAParser) ParameterType() (localctx IParameterTypeContext) { } } { - p.SetState(364) + p.SetState(366) p.Match(OpenFGAParserGREATER) if p.HasError() { // Recognition error - abort rule @@ -5878,14 +5912,14 @@ func (p *OpenFGAParser) MultiLineComment() (localctx IMultiLineCommentContext) { p.EnterOuterAlt(localctx, 1) { - p.SetState(367) + p.SetState(369) p.Match(OpenFGAParserHASH) if p.HasError() { // Recognition error - abort rule goto errorExit } } - p.SetState(371) + p.SetState(373) p.GetErrorHandler().Sync(p) if p.HasError() { goto errorExit @@ -5893,9 +5927,9 @@ func (p *OpenFGAParser) MultiLineComment() (localctx IMultiLineCommentContext) { _la = p.GetTokenStream().LA(1) - for ((int64(_la) & ^0x3f) == 0 && ((int64(1) << _la) & 252201579132747774) != 0) { + for ((int64(_la) & ^0x3f) == 0 && ((int64(1) << _la) & 504403158265495550) != 0) { { - p.SetState(368) + p.SetState(370) _la = p.GetTokenStream().LA(1) if _la <= 0 || _la == OpenFGAParserNEWLINE { @@ -5907,20 +5941,20 @@ func (p *OpenFGAParser) MultiLineComment() (localctx IMultiLineCommentContext) { } - p.SetState(373) + p.SetState(375) p.GetErrorHandler().Sync(p) if p.HasError() { goto errorExit } _la = p.GetTokenStream().LA(1) } - p.SetState(376) + p.SetState(378) p.GetErrorHandler().Sync(p) - if p.GetInterpreter().AdaptivePredict(p.BaseParser, p.GetTokenStream(), 62, p.GetParserRuleContext()) == 1 { + if p.GetInterpreter().AdaptivePredict(p.BaseParser, p.GetTokenStream(), 63, p.GetParserRuleContext()) == 1 { { - p.SetState(374) + p.SetState(376) p.Match(OpenFGAParserNEWLINE) if p.HasError() { // Recognition error - abort rule @@ -5928,7 +5962,7 @@ func (p *OpenFGAParser) MultiLineComment() (localctx IMultiLineCommentContext) { } } { - p.SetState(375) + p.SetState(377) p.MultiLineComment() } @@ -6063,7 +6097,7 @@ func (p *OpenFGAParser) Identifier() (localctx IIdentifierContext) { p.EnterOuterAlt(localctx, 1) { - p.SetState(378) + p.SetState(380) _la = p.GetTokenStream().LA(1) if !(((int64(_la) & ^0x3f) == 0 && ((int64(1) << _la) & 20382720) != 0)) { @@ -6184,7 +6218,7 @@ func (s *Extended_identifierContext) ExitRule(listener antlr.ParseTreeListener) func (p *OpenFGAParser) Extended_identifier() (localctx IExtended_identifierContext) { localctx = NewExtended_identifierContext(p, p.GetParserRuleContext(), p.GetState()) p.EnterRule(localctx, 50, OpenFGAParserRULE_extended_identifier) - p.SetState(382) + p.SetState(384) p.GetErrorHandler().Sync(p) if p.HasError() { goto errorExit @@ -6194,7 +6228,7 @@ func (p *OpenFGAParser) Extended_identifier() (localctx IExtended_identifierCont case OpenFGAParserIDENTIFIER, OpenFGAParserMODULE, OpenFGAParserMODEL, OpenFGAParserSCHEMA, OpenFGAParserEXTEND, OpenFGAParserTYPE, OpenFGAParserRELATION: p.EnterOuterAlt(localctx, 1) { - p.SetState(380) + p.SetState(382) p.Identifier() } @@ -6202,7 +6236,7 @@ func (p *OpenFGAParser) Extended_identifier() (localctx IExtended_identifierCont case OpenFGAParserEXTENDED_IDENTIFIER: p.EnterOuterAlt(localctx, 2) { - p.SetState(381) + p.SetState(383) p.Match(OpenFGAParserEXTENDED_IDENTIFIER) if p.HasError() { // Recognition error - abort rule @@ -6659,30 +6693,30 @@ func (p *OpenFGAParser) ConditionExpression() (localctx IConditionExpressionCont var _alt int p.EnterOuterAlt(localctx, 1) - p.SetState(388) + p.SetState(390) p.GetErrorHandler().Sync(p) if p.HasError() { goto errorExit } - _alt = p.GetInterpreter().AdaptivePredict(p.BaseParser, p.GetTokenStream(), 65, p.GetParserRuleContext()) + _alt = p.GetInterpreter().AdaptivePredict(p.BaseParser, p.GetTokenStream(), 66, p.GetParserRuleContext()) if p.HasError() { goto errorExit } for _alt != 2 && _alt != antlr.ATNInvalidAltNumber { if _alt == 1 { - p.SetState(386) + p.SetState(388) p.GetErrorHandler().Sync(p) if p.HasError() { goto errorExit } - switch p.GetInterpreter().AdaptivePredict(p.BaseParser, p.GetTokenStream(), 64, p.GetParserRuleContext()) { + switch p.GetInterpreter().AdaptivePredict(p.BaseParser, p.GetTokenStream(), 65, p.GetParserRuleContext()) { case 1: { - p.SetState(384) + p.SetState(386) _la = p.GetTokenStream().LA(1) - if !(((int64(_la) & ^0x3f) == 0 && ((int64(1) << _la) & 54043126674753464) != 0)) { + if !(((int64(_la) & ^0x3f) == 0 && ((int64(1) << _la) & 90071923693717432) != 0)) { p.GetErrorHandler().RecoverInline(p) } else { p.GetErrorHandler().ReportMatch(p) @@ -6693,7 +6727,7 @@ func (p *OpenFGAParser) ConditionExpression() (localctx IConditionExpressionCont case 2: { - p.SetState(385) + p.SetState(387) _la = p.GetTokenStream().LA(1) if _la <= 0 || _la == OpenFGAParserRBRACE { @@ -6709,12 +6743,12 @@ func (p *OpenFGAParser) ConditionExpression() (localctx IConditionExpressionCont } } - p.SetState(390) + p.SetState(392) p.GetErrorHandler().Sync(p) if p.HasError() { goto errorExit } - _alt = p.GetInterpreter().AdaptivePredict(p.BaseParser, p.GetTokenStream(), 65, p.GetParserRuleContext()) + _alt = p.GetInterpreter().AdaptivePredict(p.BaseParser, p.GetTokenStream(), 66, p.GetParserRuleContext()) if p.HasError() { goto errorExit } diff --git a/pkg/go/go.mod b/pkg/go/go.mod index 07ba054c..6ce07452 100644 --- a/pkg/go/go.mod +++ b/pkg/go/go.mod @@ -7,19 +7,18 @@ require ( github.com/google/go-cmp v0.7.0 github.com/oklog/ulid/v2 v2.1.2 github.com/openfga/api/proto v0.0.0-20260319214821-f153694bfc20 - github.com/stretchr/testify v1.11.1 + github.com/stretchr/testify v1.12.1 gonum.org/v1/gonum v0.17.0 - google.golang.org/protobuf v1.36.11 + google.golang.org/protobuf v1.36.12 gopkg.in/yaml.v3 v3.0.1 ) require ( - github.com/davecgh/go-spew v1.1.1 // indirect github.com/envoyproxy/protoc-gen-validate v1.3.3 // indirect github.com/grpc-ecosystem/grpc-gateway/v2 v2.28.0 // indirect github.com/kr/text v0.2.0 // indirect - github.com/pmezard/go-difflib v1.0.0 // indirect github.com/rogpeppe/go-internal v1.10.0 // indirect + go.yaml.in/yaml/v3 v3.0.5 // indirect golang.org/x/exp v0.0.0-20260312153236-7ab1446f8b90 // indirect golang.org/x/net v0.55.0 // indirect golang.org/x/sys v0.45.0 // indirect diff --git a/pkg/go/go.sum b/pkg/go/go.sum index c0b741cb..4074b15a 100644 --- a/pkg/go/go.sum +++ b/pkg/go/go.sum @@ -3,8 +3,6 @@ github.com/antlr4-go/antlr/v4 v4.13.1/go.mod h1:GKmUxMtwp6ZgGwZSva4eWPC5mS6vUAmO github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/envoyproxy/protoc-gen-validate v1.3.3 h1:MVQghNeW+LZcmXe7SY1V36Z+WFMDjpqGAGacLe2T0ds= github.com/envoyproxy/protoc-gen-validate v1.3.3/go.mod h1:TsndJ/ngyIdQRhMcVVGDDHINPLWB7C82oDArY51KfB0= github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= @@ -28,12 +26,10 @@ github.com/oklog/ulid/v2 v2.1.2/go.mod h1:rcEKHmBBKfef9DhnvX7y1HZBYxjXb0cP5ExxNs github.com/openfga/api/proto v0.0.0-20260319214821-f153694bfc20 h1:xdVG0EDz9Z9Uhd7YZ5OMN1F8tkAz/Dpgdjxd0cuTBJo= github.com/openfga/api/proto v0.0.0-20260319214821-f153694bfc20/go.mod h1:XDX4qYNBUM2Rsa2AbKPh+oocZc2zgme+EF2fFC6amVU= github.com/pborman/getopt v0.0.0-20170112200414-7148bc3a4c30/go.mod h1:85jBQOZwpVEaDAr341tbn15RS4fCAsIst0qp7i8ex1o= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= -github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= -github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +github.com/stretchr/testify v1.12.1 h1:EuwCh5fleGS7H32xRwO3wRGT7DxrDhLAT6FF8MpWDWE= +github.com/stretchr/testify v1.12.1/go.mod h1:MDEgiDPPsNp5cuIrHPPCyornHKgEVbtFUmoNlxoYthg= go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64= go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y= go.opentelemetry.io/otel v1.43.0 h1:mYIM03dnh5zfN7HautFE4ieIig9amkNANT+xcVxAj9I= @@ -46,6 +42,8 @@ go.opentelemetry.io/otel/sdk/metric v1.43.0 h1:S88dyqXjJkuBNLeMcVPRFXpRw2fuwdvfC go.opentelemetry.io/otel/sdk/metric v1.43.0/go.mod h1:C/RJtwSEJ5hzTiUz5pXF1kILHStzb9zFlIEe85bhj6A= go.opentelemetry.io/otel/trace v1.43.0 h1:BkNrHpup+4k4w+ZZ86CZoHHEkohws8AY+WTX09nk+3A= go.opentelemetry.io/otel/trace v1.43.0/go.mod h1:/QJhyVBUUswCphDVxq+8mld+AvhXZLhe+8WVFxiFff0= +go.yaml.in/yaml/v3 v3.0.5 h1:N6y/pJk8buWs9NY5ERU2HSMfm+IuD/OtfdAnq6kESPw= +go.yaml.in/yaml/v3 v3.0.5/go.mod h1:HVTZu1O7/Vkt2N+BFy8Zza+lnLsABggaTM2ZpNIGuKg= golang.org/x/exp v0.0.0-20260312153236-7ab1446f8b90 h1:jiDhWWeC7jfWqR9c/uplMOqJ0sbNlNWv0UkzE0vX1MA= golang.org/x/exp v0.0.0-20260312153236-7ab1446f8b90/go.mod h1:xE1HEv6b+1SCZ5/uscMRjUBKtIxworgEcEi+/n9NQDQ= golang.org/x/net v0.55.0 h1:bcvxaJn3e1U6InsFWt1JUq1aSjnRxLzT2rtD2KfkDF8= @@ -62,8 +60,8 @@ google.golang.org/genproto/googleapis/rpc v0.0.0-20260414002931-afd174a4e478 h1: google.golang.org/genproto/googleapis/rpc v0.0.0-20260414002931-afd174a4e478/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= google.golang.org/grpc v1.82.1 h1:NnAxzGRA0677vCa4BUkOAnO5+FfQqVl9iUXeD0IqcGE= google.golang.org/grpc v1.82.1/go.mod h1:yzTZ1TB1Z3SG+LIYaI+WiE8D5+PZ3ArnrSp8zF3+/ZA= -google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE= -google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= +google.golang.org/protobuf v1.36.12 h1:pJOKDDOyeXErUroCihFAd5LQuwXBSpVnKGrj5o/fwxc= +google.golang.org/protobuf v1.36.12/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= diff --git a/pkg/go/graph/graph.go b/pkg/go/graph/graph.go index 3f1b0dfe..775ee66f 100644 --- a/pkg/go/graph/graph.go +++ b/pkg/go/graph/graph.go @@ -83,6 +83,10 @@ func (g *AuthorizationModelGraph) Reversed() (*AuthorizationModelGraph, error) { if !ok { return nil, fmt.Errorf("%w: could not cast to AuthorizationModelEdge", ErrBuildingGraph) } + // AddEdge returns nil if either endpoint is nil (isNilNode check). If the source + // graph is corrupted with nil endpoints, this silently drops those edges. An error + // would be more correct, but AddEdge is also called from parseModel which shouldn't + // error on the builder's own nil checks. Documenting the behavior instead. graphBuilder.AddEdge(nextLine.To(), nextLine.From(), casted.edgeType, casted.tuplesetRelation, casted.conditions) } } diff --git a/pkg/go/graph/graph_builder.go b/pkg/go/graph/graph_builder.go index 8051c832..9c47313d 100644 --- a/pkg/go/graph/graph_builder.go +++ b/pkg/go/graph/graph_builder.go @@ -4,6 +4,7 @@ import ( "cmp" "fmt" "slices" + "strings" "github.com/oklog/ulid/v2" openfgav1 "github.com/openfga/api/proto/openfga/v1" @@ -117,32 +118,48 @@ func checkRewrite(graphBuilder *AuthorizationModelGraphBuilder, parentNode *Auth } } +// classifyRelationReference determines the label and node type for a RelationReference. +// It validates the Type field and classifies the reference based on its RelationOrWildcard oneof. +// Returns empty label if the Type is invalid (empty or contains special characters). +func classifyRelationReference(ref *openfgav1.RelationReference) (label string, nodeType NodeType) { + typeName := ref.GetType() + // Skip entries with invalid Type field: empty, or containing special characters + // that would break node label format (e.g., "user:admin" → "user:admin:*", + // "type#rel" → "type#rel#member"). + if typeName == "" || strings.ContainsAny(typeName, ":#") { + return "", 0 + } + + switch { + case ref.GetWildcard() != nil: + // direct assignment to wildcard + return typeName + ":*", SpecificTypeWildcard + case ref.GetRelation() != "": + // direct assignment to userset + return typeName + "#" + ref.GetRelation(), SpecificTypeAndRelation + default: + // Direct assignment to concrete type. Covers oneof unset and set-but-empty + // (openfga/api gates relation pattern on non-empty, so "" survives validation). + // Matches transformer/jsontodsl.go parseTypeRestriction behavior. + return typeName, SpecificType + } +} + func parseThis(graphBuilder *AuthorizationModelGraphBuilder, parentNode graph.Node, typeDef *openfgav1.TypeDefinition, relation string) { directlyRelated := make([]*openfgav1.RelationReference, 0) - var curNode *AuthorizationModelNode if relationMetadata, ok := typeDef.GetMetadata().GetRelations()[relation]; ok { directlyRelated = relationMetadata.GetDirectlyRelatedUserTypes() } for _, directlyRelatedDef := range directlyRelated { - if directlyRelatedDef.GetRelationOrWildcard() == nil { - // direct assignment to concrete type - assignableType := directlyRelatedDef.GetType() - curNode = graphBuilder.getOrAddNode(assignableType, assignableType, SpecificType) - } - - if directlyRelatedDef.GetWildcard() != nil { - // direct assignment to wildcard - assignableWildcard := directlyRelatedDef.GetType() + ":*" - curNode = graphBuilder.getOrAddNode(assignableWildcard, assignableWildcard, SpecificTypeWildcard) + label, nodeType := classifyRelationReference(directlyRelatedDef) + if label == "" { + // Invalid Type field (empty or contains special characters) + continue } - if directlyRelatedDef.GetRelation() != "" { - // direct assignment to userset - assignableUserset := directlyRelatedDef.GetType() + "#" + directlyRelatedDef.GetRelation() - curNode = graphBuilder.getOrAddNode(assignableUserset, assignableUserset, SpecificTypeAndRelation) - } + curNode := graphBuilder.getOrAddNode(label, label, nodeType) // de-dup types that are conditioned, e.g. if define viewer: [user, user with condX] // we only draw one edge from user to x#viewer, but with two conditions: none and condX @@ -238,8 +255,18 @@ func (g *AuthorizationModelGraphBuilder) getNodeByLabel(uniqueLabel string) *Aut return authModelNode } +// isNilNode reports whether n is nil or a typed-nil *AuthorizationModelNode. The latter is +// not == nil once boxed into graph.Node, and its promoted ID() nil-derefs. +func isNilNode(n graph.Node) bool { + if n == nil { + return true + } + amn, ok := n.(*AuthorizationModelNode) + return ok && amn == nil +} + func (g *AuthorizationModelGraphBuilder) AddEdge(from, to graph.Node, edgeType EdgeType, tuplesetRelation string, conditions []string) *AuthorizationModelEdge { - if from == nil || to == nil { + if isNilNode(from) || isNilNode(to) { return nil } if len(conditions) == 0 { @@ -254,14 +281,17 @@ func (g *AuthorizationModelGraphBuilder) AddEdge(from, to graph.Node, edgeType E } func (g *AuthorizationModelGraphBuilder) upsertEdge(from, to graph.Node, edgeType EdgeType, tuplesetRelation string, condition string) { - if from == nil || to == nil { + if isNilNode(from) || isNilNode(to) { return } iter := g.Lines(from.ID(), to.ID()) for iter.Next() { l := iter.Line() - edge, _ := l.(*AuthorizationModelEdge) + edge, ok := l.(*AuthorizationModelEdge) + if !ok { + continue + } if edge.edgeType == edgeType && edge.tuplesetRelation == tuplesetRelation { for _, cond := range edge.conditions { if cond == condition { @@ -277,14 +307,17 @@ func (g *AuthorizationModelGraphBuilder) upsertEdge(from, to graph.Node, edgeTyp } func (g *AuthorizationModelGraphBuilder) hasEdge(from, to graph.Node, edgeType EdgeType, tuplesetRelation string) bool { - if from == nil || to == nil { + if isNilNode(from) || isNilNode(to) { return false } iter := g.Lines(from.ID(), to.ID()) for iter.Next() { l := iter.Line() - edge, _ := l.(*AuthorizationModelEdge) + edge, ok := l.(*AuthorizationModelEdge) + if !ok { + continue + } if edge.edgeType == edgeType && edge.tuplesetRelation == tuplesetRelation { return true } diff --git a/pkg/go/graph/graph_builder_test.go b/pkg/go/graph/graph_builder_test.go index 76e586cd..f011ace9 100644 --- a/pkg/go/graph/graph_builder_test.go +++ b/pkg/go/graph/graph_builder_test.go @@ -9,7 +9,10 @@ import ( "testing" "github.com/google/go-cmp/cmp" + openfgav1 "github.com/openfga/api/proto/openfga/v1" "github.com/stretchr/testify/require" + "gonum.org/v1/gonum/graph" + "gonum.org/v1/gonum/graph/multi" language "github.com/openfga/language/pkg/go/transformer" ) @@ -1203,3 +1206,298 @@ func getSorted(input string) string { return strings.Join(lines, "\n") } + +// TestParseThisMalformedRelationReference tests that parseThis handles degenerate +// RelationReference shapes that survive proto validation but cannot be expressed in the DSL. +// These tests use hand-constructed protos because language.MustTransformDSLToProto cannot +// produce an empty relation name (the grammar requires at least one character after #). +func TestParseThisMalformedRelationReference(t *testing.T) { + t.Parallel() + + testCases := map[string]struct { + model *openfgav1.AuthorizationModel + expectPanic bool + expectedUserNode bool // whether a "user" node should exist + expectedGroupNode bool // whether a "group" node should exist + expectedUserEdgeCond []string // conditions on user -> document#viewer edge + expectedGroupEdgeCond []string // conditions on group -> document#viewer edge + }{ + `empty_relation_in_oneof_does_not_panic`: { + model: &openfgav1.AuthorizationModel{ + SchemaVersion: "1.1", + TypeDefinitions: []*openfgav1.TypeDefinition{ + {Type: "user"}, + { + Type: "document", + Relations: map[string]*openfgav1.Userset{ + "viewer": {Userset: &openfgav1.Userset_This{}}, + }, + Metadata: &openfgav1.Metadata{ + Relations: map[string]*openfgav1.RelationMetadata{ + "viewer": { + DirectlyRelatedUserTypes: []*openfgav1.RelationReference{ + { + Type: "user", + RelationOrWildcard: &openfgav1.RelationReference_Relation{ + Relation: "", + }, + }, + }, + }, + }, + }, + }, + }, + }, + expectPanic: false, // Should not panic; parseThis must handle all oneof states + expectedUserNode: true, + expectedGroupNode: false, + expectedUserEdgeCond: []string{""}, + expectedGroupEdgeCond: nil, + }, + `nil_wildcard_in_oneof_does_not_panic`: { + model: &openfgav1.AuthorizationModel{ + SchemaVersion: "1.1", + TypeDefinitions: []*openfgav1.TypeDefinition{ + {Type: "user"}, + { + Type: "document", + Relations: map[string]*openfgav1.Userset{ + "viewer": {Userset: &openfgav1.Userset_This{}}, + }, + Metadata: &openfgav1.Metadata{ + Relations: map[string]*openfgav1.RelationMetadata{ + "viewer": { + DirectlyRelatedUserTypes: []*openfgav1.RelationReference{ + { + Type: "user", + RelationOrWildcard: &openfgav1.RelationReference_Wildcard{ + Wildcard: nil, + }, + }, + }, + }, + }, + }, + }, + }, + }, + expectPanic: false, // Should not panic; parseThis must handle all oneof states + expectedUserNode: true, + expectedGroupNode: false, + expectedUserEdgeCond: []string{""}, + expectedGroupEdgeCond: nil, + }, + `degenerate_entry_does_not_inherit_previous_node`: { + // This is the silent graph-corruption variant: when a valid entry precedes + // a degenerate one, curNode is declared outside the loop so the degenerate + // entry reuses the previous iteration's node. The edge carrying condition "cond1" + // should originate from "group", not "user". + model: &openfgav1.AuthorizationModel{ + SchemaVersion: "1.1", + TypeDefinitions: []*openfgav1.TypeDefinition{ + {Type: "user"}, + { + Type: "group", + Relations: map[string]*openfgav1.Userset{ + "member": {Userset: &openfgav1.Userset_This{}}, + }, + Metadata: &openfgav1.Metadata{ + Relations: map[string]*openfgav1.RelationMetadata{ + "member": { + DirectlyRelatedUserTypes: []*openfgav1.RelationReference{ + {Type: "user"}, + }, + }, + }, + }, + }, + { + Type: "document", + Relations: map[string]*openfgav1.Userset{ + "viewer": {Userset: &openfgav1.Userset_This{}}, + }, + Metadata: &openfgav1.Metadata{ + Relations: map[string]*openfgav1.RelationMetadata{ + "viewer": { + DirectlyRelatedUserTypes: []*openfgav1.RelationReference{ + {Type: "user"}, // valid entry first + { + Type: "group", + Condition: "cond1", + RelationOrWildcard: &openfgav1.RelationReference_Relation{ + Relation: "", // degenerate entry second + }, + }, + }, + }, + }, + }, + }, + }, + Conditions: map[string]*openfgav1.Condition{ + "cond1": { + Name: "cond1", + Expression: "x == 1", + Parameters: map[string]*openfgav1.ConditionParamTypeRef{ + "x": {TypeName: openfgav1.ConditionParamTypeRef_TYPE_NAME_INT}, + }, + }, + }, + }, + expectPanic: false, // no panic, but curNode must not leak across loop iterations + expectedUserNode: true, + expectedGroupNode: true, // group node must exist; cond1 must be on group edge not user + expectedUserEdgeCond: []string{""}, // user edge should have no condition + expectedGroupEdgeCond: []string{"cond1"}, // group edge must have cond1; not merged onto user + }, + } + + for name, testCase := range testCases { + t.Run(name, func(t *testing.T) { + t.Parallel() + + if testCase.expectPanic { + // Test verifies parseThis handles degenerate RelationReference without panic + require.NotPanics(t, func() { + graph, err := NewAuthorizationModelGraph(testCase.model) + require.NoError(t, err) + require.NotNil(t, graph) + }) + } else { + graph, err := NewAuthorizationModelGraph(testCase.model) + require.NoError(t, err) + require.NotNil(t, graph) + + // Verify the expected nodes exist + userNode, _ := graph.GetNodeByLabel("user") + groupNode, _ := graph.GetNodeByLabel("group") + viewerNode, err := graph.GetNodeByLabel("document#viewer") + require.NoError(t, err, "document#viewer node should exist") + + if testCase.expectedUserNode { + require.NotNil(t, userNode, "user node should exist") + } else { + require.Nil(t, userNode, "user node should not exist") + } + + if testCase.expectedGroupNode { + require.NotNil(t, groupNode, "group node should exist") + } else { + require.Nil(t, groupNode, "group node should not exist") + } + + require.NotNil(t, viewerNode, "document#viewer node should exist") + + // Verify edge conditions + if testCase.expectedUserNode && len(testCase.expectedUserEdgeCond) > 0 { + userToViewer := findEdge(t, graph, userNode, viewerNode, DirectEdge, "") + require.NotNil(t, userToViewer, "edge from user to document#viewer should exist") + require.ElementsMatch(t, testCase.expectedUserEdgeCond, userToViewer.conditions, + "user -> document#viewer edge should have expected conditions") + } + + if testCase.expectedGroupNode && len(testCase.expectedGroupEdgeCond) > 0 { + groupToViewer := findEdge(t, graph, groupNode, viewerNode, DirectEdge, "") + require.NotNil(t, groupToViewer, "edge from group to document#viewer should exist") + require.ElementsMatch(t, testCase.expectedGroupEdgeCond, groupToViewer.conditions, + "group -> document#viewer edge should have expected conditions") + } + } + }) + } +} + +// findEdge returns the edge from fromNode to toNode matching the given edgeType and tuplesetRelation, +// or nil if no matching edge exists. +func findEdge(t *testing.T, graph *AuthorizationModelGraph, fromNode, toNode *AuthorizationModelNode, edgeType EdgeType, tuplesetRelation string) *AuthorizationModelEdge { + t.Helper() + if fromNode == nil || toNode == nil { + return nil + } + iter := graph.Lines(fromNode.ID(), toNode.ID()) + for iter.Next() { + edge, ok := iter.Line().(*AuthorizationModelEdge) + if !ok { + continue + } + if edge.edgeType == edgeType && edge.tuplesetRelation == tuplesetRelation { + return edge + } + } + return nil +} + +// TestIsNilNode verifies that isNilNode correctly detects both nil and typed-nil *AuthorizationModelNode. +func TestIsNilNode(t *testing.T) { + t.Parallel() + + testCases := []struct { + name string + node graph.Node + expected bool + }{ + { + name: "nil interface", + node: nil, + expected: true, + }, + { + name: "typed-nil *AuthorizationModelNode", + node: func() graph.Node { + var n *AuthorizationModelNode + return n + }(), + expected: true, + }, + { + name: "real *AuthorizationModelNode", + node: &AuthorizationModelNode{ + Node: &simpleNode{id: 1}, + label: "test", + nodeType: SpecificType, + uniqueLabel: "test", + }, + expected: false, + }, + } + + for _, testCase := range testCases { + t.Run(testCase.name, func(t *testing.T) { + t.Parallel() + actual := isNilNode(testCase.node) + require.Equal(t, testCase.expected, actual) + }) + } +} + +// TestUpsertEdgeWithTypedNil verifies that upsertEdge with a typed-nil from is a no-op instead of a panic. +func TestUpsertEdgeWithTypedNil(t *testing.T) { + t.Parallel() + + graphBuilder := &AuthorizationModelGraphBuilder{ + multi.NewDirectedGraph(), map[string]int64{}, + } + + validNode := graphBuilder.getOrAddNode("user", "user", SpecificType) + + var nilNode *AuthorizationModelNode + var nilNodeAsInterface graph.Node = nilNode + + // This should not panic, just return early + require.NotPanics(t, func() { + graphBuilder.upsertEdge(nilNodeAsInterface, validNode, DirectEdge, "", "") + }) + + // Verify no edge was created + require.False(t, graphBuilder.hasEdge(nilNodeAsInterface, validNode, DirectEdge, "")) +} + +// simpleNode is a minimal graph.Node implementation for testing. +type simpleNode struct { + id int64 +} + +func (n *simpleNode) ID() int64 { + return n.id +} diff --git a/pkg/go/graph/weighted_graph_builder.go b/pkg/go/graph/weighted_graph_builder.go index 9a05c9a2..653ea4be 100644 --- a/pkg/go/graph/weighted_graph_builder.go +++ b/pkg/go/graph/weighted_graph_builder.go @@ -188,7 +188,6 @@ func (wgb *WeightedAuthorizationModelGraphBuilder) parseComputed(wg *WeightedAut func (wgb *WeightedAuthorizationModelGraphBuilder) parseThis(wg *WeightedAuthorizationModelGraph, parentNode *WeightedAuthorizationModelNode, typeDef *openfgav1.TypeDefinition, relation string, parentRelationName string) error { var directlyRelated []*openfgav1.RelationReference - var curNode *WeightedAuthorizationModelNode if relationMetadata, ok := typeDef.GetMetadata().GetRelations()[relation]; ok { directlyRelated = relationMetadata.GetDirectlyRelatedUserTypes() @@ -207,21 +206,14 @@ func (wgb *WeightedAuthorizationModelGraphBuilder) parseThis(wg *WeightedAuthori return fmt.Errorf("%w: parent relation node %s not found", ErrInvalidModel, parentRelationName) } for _, directlyRelatedDef := range directlyRelated { - switch { - case directlyRelatedDef.GetRelationOrWildcard() == nil: - // direct assignment to concrete type - assignableType := directlyRelatedDef.GetType() - curNode = wg.GetOrAddNode(assignableType, assignableType, SpecificType) - case directlyRelatedDef.GetWildcard() != nil: - // direct assignment to wildcard - assignableWildcard := directlyRelatedDef.GetType() + ":*" - curNode = wg.GetOrAddNode(assignableWildcard, assignableWildcard, SpecificTypeWildcard) - default: - // direct assignment to userset - assignableUserset := directlyRelatedDef.GetType() + "#" + directlyRelatedDef.GetRelation() - curNode = wg.GetOrAddNode(assignableUserset, assignableUserset, SpecificTypeAndRelation) + label, nodeType := classifyRelationReference(directlyRelatedDef) + if label == "" { + // Invalid Type field (empty or contains special characters) + continue } + curNode := wg.GetOrAddNode(label, label, nodeType) + parentRelationNode.directAssigns = append(parentRelationNode.directAssigns, curNode.uniqueLabel) // de-dup types that are conditioned, e.g. if define viewer: [user, user with condX] // we only draw one edge from user to x#viewer, but with two conditions: none and condX diff --git a/pkg/go/graph/weighted_graph_builder_test.go b/pkg/go/graph/weighted_graph_builder_test.go index 592c21af..40b4ba01 100644 --- a/pkg/go/graph/weighted_graph_builder_test.go +++ b/pkg/go/graph/weighted_graph_builder_test.go @@ -4,6 +4,7 @@ import ( "slices" "testing" + openfgav1 "github.com/openfga/api/proto/openfga/v1" "github.com/stretchr/testify/require" language "github.com/openfga/language/pkg/go/transformer" @@ -2985,3 +2986,232 @@ func TestRecursionWithTwoIndependentTTUBranches(t *testing.T) { require.Equal(t, "group#member", unionEdges[2].recursiveRelation) require.True(t, unionEdges[2].tupleCycle) } + +// TestWeightedParseThisMalformedRelationReference verifies that the weighted builder's +// parseThis handles degenerate RelationReference shapes correctly, matching the regular +// builder's behavior after the fix. +func TestWeightedParseThisMalformedRelationReference(t *testing.T) { + t.Parallel() + + testCases := map[string]struct { + model *openfgav1.AuthorizationModel + expectUserNode bool + expectGroupNode bool + expectBogusUserHashNode bool // whether a "user#" node exists + userInDirectAssigns bool + groupInDirectAssigns bool + }{ + `empty_relation_in_oneof_creates_concrete_type_not_bogus_userset`: { + model: &openfgav1.AuthorizationModel{ + SchemaVersion: "1.1", + TypeDefinitions: []*openfgav1.TypeDefinition{ + {Type: "user"}, + { + Type: "document", + Relations: map[string]*openfgav1.Userset{ + "viewer": {Userset: &openfgav1.Userset_This{}}, + }, + Metadata: &openfgav1.Metadata{ + Relations: map[string]*openfgav1.RelationMetadata{ + "viewer": { + DirectlyRelatedUserTypes: []*openfgav1.RelationReference{ + { + Type: "user", + RelationOrWildcard: &openfgav1.RelationReference_Relation{ + Relation: "", + }, + }, + }, + }, + }, + }, + }, + }, + }, + expectUserNode: true, + expectGroupNode: false, + expectBogusUserHashNode: false, // Must not create bogus "user#" node; default case is concrete type + userInDirectAssigns: true, + groupInDirectAssigns: false, + }, + `degenerate_entry_does_not_inherit_previous_node_in_weighted`: { + model: &openfgav1.AuthorizationModel{ + SchemaVersion: "1.1", + TypeDefinitions: []*openfgav1.TypeDefinition{ + {Type: "user"}, + { + Type: "group", + Relations: map[string]*openfgav1.Userset{ + "member": {Userset: &openfgav1.Userset_This{}}, + }, + Metadata: &openfgav1.Metadata{ + Relations: map[string]*openfgav1.RelationMetadata{ + "member": { + DirectlyRelatedUserTypes: []*openfgav1.RelationReference{ + {Type: "user"}, + }, + }, + }, + }, + }, + { + Type: "document", + Relations: map[string]*openfgav1.Userset{ + "viewer": {Userset: &openfgav1.Userset_This{}}, + }, + Metadata: &openfgav1.Metadata{ + Relations: map[string]*openfgav1.RelationMetadata{ + "viewer": { + DirectlyRelatedUserTypes: []*openfgav1.RelationReference{ + {Type: "user"}, + { + Type: "group", + Condition: "cond1", + RelationOrWildcard: &openfgav1.RelationReference_Relation{ + Relation: "", + }, + }, + }, + }, + }, + }, + }, + }, + Conditions: map[string]*openfgav1.Condition{ + "cond1": { + Name: "cond1", + Expression: "x == 1", + Parameters: map[string]*openfgav1.ConditionParamTypeRef{ + "x": {TypeName: openfgav1.ConditionParamTypeRef_TYPE_NAME_INT}, + }, + }, + }, + }, + expectUserNode: true, + expectGroupNode: true, // group node must exist; curNode must not leak across iterations + expectBogusUserHashNode: false, + userInDirectAssigns: true, + groupInDirectAssigns: true, // group must be in directAssigns; not inherited from user + }, + `type_with_special_chars_is_skipped`: { + model: &openfgav1.AuthorizationModel{ + SchemaVersion: "1.1", + TypeDefinitions: []*openfgav1.TypeDefinition{ + {Type: "user"}, + { + Type: "document", + Relations: map[string]*openfgav1.Userset{ + "viewer": {Userset: &openfgav1.Userset_This{}}, + }, + Metadata: &openfgav1.Metadata{ + Relations: map[string]*openfgav1.RelationMetadata{ + "viewer": { + DirectlyRelatedUserTypes: []*openfgav1.RelationReference{ + {Type: "user"}, // Valid entry + {Type: "user:admin"}, // Invalid: contains colon, should be skipped + }, + }, + }, + }, + }, + }, + }, + expectUserNode: true, // Valid user entry creates node + expectGroupNode: false, + expectBogusUserHashNode: false, // Invalid entry skipped, no bogus node created + userInDirectAssigns: true, + groupInDirectAssigns: false, + }, + `nil_wildcard_in_oneof_creates_concrete_type`: { + model: &openfgav1.AuthorizationModel{ + SchemaVersion: "1.1", + TypeDefinitions: []*openfgav1.TypeDefinition{ + {Type: "user"}, + { + Type: "document", + Relations: map[string]*openfgav1.Userset{ + "viewer": {Userset: &openfgav1.Userset_This{}}, + }, + Metadata: &openfgav1.Metadata{ + Relations: map[string]*openfgav1.RelationMetadata{ + "viewer": { + DirectlyRelatedUserTypes: []*openfgav1.RelationReference{ + { + Type: "user", + RelationOrWildcard: &openfgav1.RelationReference_Wildcard{ + Wildcard: nil, + }, + }, + }, + }, + }, + }, + }, + }, + }, + expectUserNode: true, // Default case: treats as concrete type + expectGroupNode: false, + expectBogusUserHashNode: false, + userInDirectAssigns: true, + groupInDirectAssigns: false, + }, + } + + for name, testCase := range testCases { + t.Run(name, func(t *testing.T) { + t.Parallel() + + wgb := NewWeightedAuthorizationModelGraphBuilder() + graph, err := wgb.Build(testCase.model) + require.NoError(t, err) + require.NotNil(t, graph) + + // Verify expected nodes exist or don't exist + userNode, userExists := graph.GetNodeByID("user") + if testCase.expectUserNode { + require.True(t, userExists, "user node should exist") + require.NotNil(t, userNode) + } else { + require.False(t, userExists, "user node should not exist") + } + + groupNode, groupExists := graph.GetNodeByID("group") + if testCase.expectGroupNode { + require.True(t, groupExists, "group node should exist") + require.NotNil(t, groupNode) + } else { + require.False(t, groupExists, "group node should not exist") + } + + // Verify the bogus "user#" node doesn't exist + bogusUserHashNode, bogusExists := graph.GetNodeByID("user#") + if testCase.expectBogusUserHashNode { + require.True(t, bogusExists, "bogus user# node should exist (before fix)") + require.NotNil(t, bogusUserHashNode) + } else { + require.False(t, bogusExists, "bogus user# node should not exist (after fix)") + } + + // Verify directAssigns on document#viewer + viewerNode, viewerExists := graph.GetNodeByID("document#viewer") + require.True(t, viewerExists, "document#viewer node should exist") + require.NotNil(t, viewerNode) + + if testCase.userInDirectAssigns { + require.Contains(t, viewerNode.directAssigns, "user", + "user should be in document#viewer directAssigns") + } else { + require.NotContains(t, viewerNode.directAssigns, "user", + "user should not be in document#viewer directAssigns") + } + + if testCase.groupInDirectAssigns { + require.Contains(t, viewerNode.directAssigns, "group", + "group should be in document#viewer directAssigns") + } else { + require.NotContains(t, viewerNode.directAssigns, "group", + "group should not be in document#viewer directAssigns") + } + }) + } +} diff --git a/pkg/go/transformer/dsltojson.go b/pkg/go/transformer/dsltojson.go index 44b930dc..889fb283 100644 --- a/pkg/go/transformer/dsltojson.go +++ b/pkg/go/transformer/dsltojson.go @@ -330,6 +330,10 @@ func (l *OpenFgaDslListener) ExitRelationDefTypeRestriction(ctx *parser.Relation if conditionName != nil { relationRef.Condition = conditionName.GetText() + } else if dollarExpression := ctx.DOLLAR_EXPRESSION(); dollarExpression != nil { + // `$expression` is a reserved condition name for inline expressions; it + // is carried on the RelationReference exactly like a named condition. + relationRef.Condition = dollarExpression.GetText() } if usersetRestriction != nil { diff --git a/pkg/go/validation/condition_validation.go b/pkg/go/validation/condition_validation.go index 067468aa..c826d55c 100644 --- a/pkg/go/validation/condition_validation.go +++ b/pkg/go/validation/condition_validation.go @@ -95,9 +95,16 @@ func ValidateConditionReferences(collector *ErrorCollector, model *openfgav1.Aut validateConditionReferences(collector, NewConditionValidator(model), lines) } +// reservedInlineExpression is exempt from the "condition must be defined" check +// because it is not declared in the model's conditions block. +const reservedInlineExpression = "$expression" + func validateConditionReferences(collector *ErrorCollector, validator *ConditionValidator, lines []string) { model := validator.model for conditionName := range validator.usedConds { + if conditionName == reservedInlineExpression { + continue + } if _, exists := validator.definedConds[conditionName]; !exists { for _, ref := range validator.conditionRefs[conditionName] { // Anchor the relation line lookup to the referencing type's diff --git a/pkg/java/src/main/gen/dev/openfga/language/antlr/OpenFGALexer.interp b/pkg/java/src/main/gen/dev/openfga/language/antlr/OpenFGALexer.interp index 79d5cbb7..bfaefca8 100644 --- a/pkg/java/src/main/gen/dev/openfga/language/antlr/OpenFGALexer.interp +++ b/pkg/java/src/main/gen/dev/openfga/language/antlr/OpenFGALexer.interp @@ -53,6 +53,7 @@ null null null null +'$expression' null null null @@ -113,6 +114,7 @@ NUM_INT NUM_UINT STRING BYTES +DOLLAR_EXPRESSION EXTENDED_IDENTIFIER NEWLINE CONDITION_PARAM_CONTAINER @@ -181,6 +183,7 @@ NUM_INT NUM_UINT STRING BYTES +DOLLAR_EXPRESSION IDENTIFIER EXTENDED_IDENTIFIER NEWLINE @@ -204,4 +207,4 @@ DEFAULT_MODE CONDITION_DEF atn: -[4, 0, 57, 717, 6, -1, 6, -1, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 2, 41, 7, 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 2, 45, 7, 45, 2, 46, 7, 46, 2, 47, 7, 47, 2, 48, 7, 48, 2, 49, 7, 49, 2, 50, 7, 50, 2, 51, 7, 51, 2, 52, 7, 52, 2, 53, 7, 53, 2, 54, 7, 54, 2, 55, 7, 55, 2, 56, 7, 56, 2, 57, 7, 57, 2, 58, 7, 58, 2, 59, 7, 59, 2, 60, 7, 60, 2, 61, 7, 61, 2, 62, 7, 62, 2, 63, 7, 63, 2, 64, 7, 64, 2, 65, 7, 65, 2, 66, 7, 66, 2, 67, 7, 67, 2, 68, 7, 68, 2, 69, 7, 69, 2, 70, 7, 70, 2, 71, 7, 71, 2, 72, 7, 72, 2, 73, 7, 73, 2, 74, 7, 74, 1, 0, 1, 0, 1, 1, 1, 1, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 10, 4, 10, 200, 8, 10, 11, 10, 12, 10, 201, 1, 10, 1, 10, 4, 10, 206, 8, 10, 11, 10, 12, 10, 207, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 18, 1, 18, 1, 18, 1, 19, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 21, 1, 21, 1, 22, 1, 22, 1, 22, 1, 23, 1, 23, 1, 23, 1, 24, 1, 24, 1, 25, 1, 25, 1, 25, 1, 26, 1, 26, 1, 26, 1, 27, 1, 27, 1, 28, 1, 28, 1, 29, 1, 29, 1, 30, 1, 30, 1, 31, 1, 31, 1, 32, 1, 32, 1, 33, 1, 33, 1, 34, 1, 34, 1, 35, 1, 35, 1, 36, 1, 36, 1, 37, 1, 37, 1, 38, 1, 38, 1, 39, 1, 39, 1, 40, 1, 40, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 44, 1, 44, 1, 45, 1, 45, 1, 46, 1, 46, 1, 47, 1, 47, 3, 47, 342, 8, 47, 1, 47, 4, 47, 345, 8, 47, 11, 47, 12, 47, 346, 1, 48, 1, 48, 1, 49, 1, 49, 1, 50, 1, 50, 1, 50, 1, 50, 3, 50, 357, 8, 50, 1, 51, 1, 51, 1, 51, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 3, 54, 390, 8, 54, 1, 55, 4, 55, 393, 8, 55, 11, 55, 12, 55, 394, 1, 56, 1, 56, 1, 56, 1, 56, 5, 56, 401, 8, 56, 10, 56, 12, 56, 404, 9, 56, 1, 56, 1, 56, 1, 57, 4, 57, 409, 8, 57, 11, 57, 12, 57, 410, 1, 57, 1, 57, 4, 57, 415, 8, 57, 11, 57, 12, 57, 416, 1, 57, 3, 57, 420, 8, 57, 1, 57, 4, 57, 423, 8, 57, 11, 57, 12, 57, 424, 1, 57, 1, 57, 1, 57, 1, 57, 4, 57, 431, 8, 57, 11, 57, 12, 57, 432, 1, 57, 3, 57, 436, 8, 57, 3, 57, 438, 8, 57, 1, 58, 4, 58, 441, 8, 58, 11, 58, 12, 58, 442, 1, 58, 1, 58, 1, 58, 1, 58, 4, 58, 449, 8, 58, 11, 58, 12, 58, 450, 3, 58, 453, 8, 58, 1, 59, 4, 59, 456, 8, 59, 11, 59, 12, 59, 457, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 4, 59, 466, 8, 59, 11, 59, 12, 59, 467, 1, 59, 1, 59, 3, 59, 472, 8, 59, 1, 60, 1, 60, 1, 60, 5, 60, 477, 8, 60, 10, 60, 12, 60, 480, 9, 60, 1, 60, 1, 60, 1, 60, 1, 60, 5, 60, 486, 8, 60, 10, 60, 12, 60, 489, 9, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 5, 60, 498, 8, 60, 10, 60, 12, 60, 501, 9, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 5, 60, 512, 8, 60, 10, 60, 12, 60, 515, 9, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 5, 60, 523, 8, 60, 10, 60, 12, 60, 526, 9, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 5, 60, 533, 8, 60, 10, 60, 12, 60, 536, 9, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 5, 60, 546, 8, 60, 10, 60, 12, 60, 549, 9, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 5, 60, 561, 8, 60, 10, 60, 12, 60, 564, 9, 60, 1, 60, 1, 60, 1, 60, 1, 60, 3, 60, 570, 8, 60, 1, 61, 1, 61, 1, 61, 1, 62, 1, 62, 3, 62, 577, 8, 62, 1, 62, 1, 62, 1, 62, 1, 62, 5, 62, 583, 8, 62, 10, 62, 12, 62, 586, 9, 62, 1, 63, 1, 63, 3, 63, 590, 8, 63, 1, 63, 1, 63, 1, 63, 3, 63, 595, 8, 63, 1, 63, 1, 63, 1, 63, 4, 63, 600, 8, 63, 11, 63, 12, 63, 601, 5, 63, 604, 8, 63, 10, 63, 12, 63, 607, 9, 63, 1, 64, 3, 64, 610, 8, 64, 1, 64, 3, 64, 613, 8, 64, 1, 64, 1, 64, 3, 64, 617, 8, 64, 1, 64, 3, 64, 620, 8, 64, 1, 64, 3, 64, 623, 8, 64, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 3, 66, 637, 8, 66, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 3, 67, 688, 8, 67, 1, 68, 1, 68, 1, 68, 1, 68, 1, 69, 1, 69, 1, 69, 1, 69, 1, 70, 1, 70, 1, 70, 1, 70, 1, 71, 1, 71, 1, 71, 1, 71, 1, 72, 1, 72, 1, 72, 1, 72, 1, 73, 1, 73, 1, 73, 1, 73, 1, 74, 1, 74, 1, 74, 1, 74, 4, 499, 513, 547, 562, 0, 75, 2, 11, 4, 1, 6, 2, 8, 12, 10, 13, 12, 14, 14, 15, 16, 16, 18, 17, 20, 18, 22, 19, 24, 20, 26, 21, 28, 22, 30, 23, 32, 24, 34, 25, 36, 26, 38, 27, 40, 28, 42, 29, 44, 3, 46, 30, 48, 31, 50, 4, 52, 32, 54, 33, 56, 5, 58, 34, 60, 35, 62, 36, 64, 7, 66, 8, 68, 37, 70, 38, 72, 39, 74, 40, 76, 41, 78, 42, 80, 43, 82, 44, 84, 45, 86, 46, 88, 47, 90, 0, 92, 0, 94, 0, 96, 0, 98, 0, 100, 0, 102, 0, 104, 0, 106, 0, 108, 0, 110, 0, 112, 9, 114, 48, 116, 49, 118, 50, 120, 51, 122, 52, 124, 53, 126, 10, 128, 54, 130, 55, 132, 0, 134, 56, 136, 57, 138, 0, 140, 0, 142, 0, 144, 0, 146, 0, 148, 0, 150, 0, 2, 0, 1, 16, 2, 0, 65, 90, 97, 122, 2, 0, 69, 69, 101, 101, 2, 0, 43, 43, 45, 45, 3, 0, 48, 57, 65, 70, 97, 102, 2, 0, 82, 82, 114, 114, 10, 0, 34, 34, 39, 39, 63, 63, 92, 92, 96, 98, 102, 102, 110, 110, 114, 114, 116, 116, 118, 118, 2, 0, 88, 88, 120, 120, 3, 0, 9, 9, 12, 12, 32, 32, 1, 0, 10, 10, 2, 0, 85, 85, 117, 117, 4, 0, 10, 10, 13, 13, 34, 34, 92, 92, 4, 0, 10, 10, 13, 13, 39, 39, 92, 92, 1, 0, 92, 92, 3, 0, 10, 10, 13, 13, 34, 34, 3, 0, 10, 10, 13, 13, 39, 39, 2, 0, 66, 66, 98, 98, 773, 0, 2, 1, 0, 0, 0, 0, 4, 1, 0, 0, 0, 0, 6, 1, 0, 0, 0, 0, 8, 1, 0, 0, 0, 0, 10, 1, 0, 0, 0, 0, 12, 1, 0, 0, 0, 0, 14, 1, 0, 0, 0, 0, 16, 1, 0, 0, 0, 0, 18, 1, 0, 0, 0, 0, 20, 1, 0, 0, 0, 0, 22, 1, 0, 0, 0, 0, 24, 1, 0, 0, 0, 0, 26, 1, 0, 0, 0, 0, 28, 1, 0, 0, 0, 0, 30, 1, 0, 0, 0, 0, 32, 1, 0, 0, 0, 0, 34, 1, 0, 0, 0, 0, 36, 1, 0, 0, 0, 0, 38, 1, 0, 0, 0, 0, 40, 1, 0, 0, 0, 0, 42, 1, 0, 0, 0, 0, 44, 1, 0, 0, 0, 0, 46, 1, 0, 0, 0, 0, 48, 1, 0, 0, 0, 0, 50, 1, 0, 0, 0, 0, 52, 1, 0, 0, 0, 0, 54, 1, 0, 0, 0, 0, 56, 1, 0, 0, 0, 0, 58, 1, 0, 0, 0, 0, 60, 1, 0, 0, 0, 0, 62, 1, 0, 0, 0, 0, 64, 1, 0, 0, 0, 0, 66, 1, 0, 0, 0, 0, 68, 1, 0, 0, 0, 0, 70, 1, 0, 0, 0, 0, 72, 1, 0, 0, 0, 0, 74, 1, 0, 0, 0, 0, 76, 1, 0, 0, 0, 0, 78, 1, 0, 0, 0, 0, 80, 1, 0, 0, 0, 0, 82, 1, 0, 0, 0, 0, 84, 1, 0, 0, 0, 0, 86, 1, 0, 0, 0, 0, 88, 1, 0, 0, 0, 0, 112, 1, 0, 0, 0, 0, 114, 1, 0, 0, 0, 0, 116, 1, 0, 0, 0, 0, 118, 1, 0, 0, 0, 0, 120, 1, 0, 0, 0, 0, 122, 1, 0, 0, 0, 0, 124, 1, 0, 0, 0, 0, 126, 1, 0, 0, 0, 0, 128, 1, 0, 0, 0, 0, 130, 1, 0, 0, 0, 1, 132, 1, 0, 0, 0, 1, 134, 1, 0, 0, 0, 1, 136, 1, 0, 0, 0, 1, 138, 1, 0, 0, 0, 1, 140, 1, 0, 0, 0, 1, 142, 1, 0, 0, 0, 1, 144, 1, 0, 0, 0, 1, 146, 1, 0, 0, 0, 1, 148, 1, 0, 0, 0, 1, 150, 1, 0, 0, 0, 2, 152, 1, 0, 0, 0, 4, 154, 1, 0, 0, 0, 6, 156, 1, 0, 0, 0, 8, 158, 1, 0, 0, 0, 10, 162, 1, 0, 0, 0, 12, 165, 1, 0, 0, 0, 14, 173, 1, 0, 0, 0, 16, 178, 1, 0, 0, 0, 18, 185, 1, 0, 0, 0, 20, 191, 1, 0, 0, 0, 22, 199, 1, 0, 0, 0, 24, 209, 1, 0, 0, 0, 26, 216, 1, 0, 0, 0, 28, 221, 1, 0, 0, 0, 30, 233, 1, 0, 0, 0, 32, 243, 1, 0, 0, 0, 34, 252, 1, 0, 0, 0, 36, 259, 1, 0, 0, 0, 38, 264, 1, 0, 0, 0, 40, 267, 1, 0, 0, 0, 42, 270, 1, 0, 0, 0, 44, 273, 1, 0, 0, 0, 46, 275, 1, 0, 0, 0, 48, 278, 1, 0, 0, 0, 50, 281, 1, 0, 0, 0, 52, 283, 1, 0, 0, 0, 54, 286, 1, 0, 0, 0, 56, 289, 1, 0, 0, 0, 58, 291, 1, 0, 0, 0, 60, 293, 1, 0, 0, 0, 62, 295, 1, 0, 0, 0, 64, 297, 1, 0, 0, 0, 66, 299, 1, 0, 0, 0, 68, 301, 1, 0, 0, 0, 70, 303, 1, 0, 0, 0, 72, 305, 1, 0, 0, 0, 74, 307, 1, 0, 0, 0, 76, 309, 1, 0, 0, 0, 78, 311, 1, 0, 0, 0, 80, 313, 1, 0, 0, 0, 82, 315, 1, 0, 0, 0, 84, 317, 1, 0, 0, 0, 86, 322, 1, 0, 0, 0, 88, 328, 1, 0, 0, 0, 90, 333, 1, 0, 0, 0, 92, 335, 1, 0, 0, 0, 94, 337, 1, 0, 0, 0, 96, 339, 1, 0, 0, 0, 98, 348, 1, 0, 0, 0, 100, 350, 1, 0, 0, 0, 102, 356, 1, 0, 0, 0, 104, 358, 1, 0, 0, 0, 106, 361, 1, 0, 0, 0, 108, 366, 1, 0, 0, 0, 110, 389, 1, 0, 0, 0, 112, 392, 1, 0, 0, 0, 114, 396, 1, 0, 0, 0, 116, 437, 1, 0, 0, 0, 118, 452, 1, 0, 0, 0, 120, 471, 1, 0, 0, 0, 122, 569, 1, 0, 0, 0, 124, 571, 1, 0, 0, 0, 126, 576, 1, 0, 0, 0, 128, 589, 1, 0, 0, 0, 130, 609, 1, 0, 0, 0, 132, 624, 1, 0, 0, 0, 134, 636, 1, 0, 0, 0, 136, 687, 1, 0, 0, 0, 138, 689, 1, 0, 0, 0, 140, 693, 1, 0, 0, 0, 142, 697, 1, 0, 0, 0, 144, 701, 1, 0, 0, 0, 146, 705, 1, 0, 0, 0, 148, 709, 1, 0, 0, 0, 150, 713, 1, 0, 0, 0, 152, 153, 5, 35, 0, 0, 153, 3, 1, 0, 0, 0, 154, 155, 5, 58, 0, 0, 155, 5, 1, 0, 0, 0, 156, 157, 5, 44, 0, 0, 157, 7, 1, 0, 0, 0, 158, 159, 5, 97, 0, 0, 159, 160, 5, 110, 0, 0, 160, 161, 5, 100, 0, 0, 161, 9, 1, 0, 0, 0, 162, 163, 5, 111, 0, 0, 163, 164, 5, 114, 0, 0, 164, 11, 1, 0, 0, 0, 165, 166, 5, 98, 0, 0, 166, 167, 5, 117, 0, 0, 167, 168, 5, 116, 0, 0, 168, 169, 5, 32, 0, 0, 169, 170, 5, 110, 0, 0, 170, 171, 5, 111, 0, 0, 171, 172, 5, 116, 0, 0, 172, 13, 1, 0, 0, 0, 173, 174, 5, 102, 0, 0, 174, 175, 5, 114, 0, 0, 175, 176, 5, 111, 0, 0, 176, 177, 5, 109, 0, 0, 177, 15, 1, 0, 0, 0, 178, 179, 5, 109, 0, 0, 179, 180, 5, 111, 0, 0, 180, 181, 5, 100, 0, 0, 181, 182, 5, 117, 0, 0, 182, 183, 5, 108, 0, 0, 183, 184, 5, 101, 0, 0, 184, 17, 1, 0, 0, 0, 185, 186, 5, 109, 0, 0, 186, 187, 5, 111, 0, 0, 187, 188, 5, 100, 0, 0, 188, 189, 5, 101, 0, 0, 189, 190, 5, 108, 0, 0, 190, 19, 1, 0, 0, 0, 191, 192, 5, 115, 0, 0, 192, 193, 5, 99, 0, 0, 193, 194, 5, 104, 0, 0, 194, 195, 5, 101, 0, 0, 195, 196, 5, 109, 0, 0, 196, 197, 5, 97, 0, 0, 197, 21, 1, 0, 0, 0, 198, 200, 3, 94, 46, 0, 199, 198, 1, 0, 0, 0, 200, 201, 1, 0, 0, 0, 201, 199, 1, 0, 0, 0, 201, 202, 1, 0, 0, 0, 202, 203, 1, 0, 0, 0, 203, 205, 5, 46, 0, 0, 204, 206, 3, 94, 46, 0, 205, 204, 1, 0, 0, 0, 206, 207, 1, 0, 0, 0, 207, 205, 1, 0, 0, 0, 207, 208, 1, 0, 0, 0, 208, 23, 1, 0, 0, 0, 209, 210, 5, 101, 0, 0, 210, 211, 5, 120, 0, 0, 211, 212, 5, 116, 0, 0, 212, 213, 5, 101, 0, 0, 213, 214, 5, 110, 0, 0, 214, 215, 5, 100, 0, 0, 215, 25, 1, 0, 0, 0, 216, 217, 5, 116, 0, 0, 217, 218, 5, 121, 0, 0, 218, 219, 5, 112, 0, 0, 219, 220, 5, 101, 0, 0, 220, 27, 1, 0, 0, 0, 221, 222, 5, 99, 0, 0, 222, 223, 5, 111, 0, 0, 223, 224, 5, 110, 0, 0, 224, 225, 5, 100, 0, 0, 225, 226, 5, 105, 0, 0, 226, 227, 5, 116, 0, 0, 227, 228, 5, 105, 0, 0, 228, 229, 5, 111, 0, 0, 229, 230, 5, 110, 0, 0, 230, 231, 1, 0, 0, 0, 231, 232, 6, 13, 0, 0, 232, 29, 1, 0, 0, 0, 233, 234, 5, 114, 0, 0, 234, 235, 5, 101, 0, 0, 235, 236, 5, 108, 0, 0, 236, 237, 5, 97, 0, 0, 237, 238, 5, 116, 0, 0, 238, 239, 5, 105, 0, 0, 239, 240, 5, 111, 0, 0, 240, 241, 5, 110, 0, 0, 241, 242, 5, 115, 0, 0, 242, 31, 1, 0, 0, 0, 243, 244, 5, 114, 0, 0, 244, 245, 5, 101, 0, 0, 245, 246, 5, 108, 0, 0, 246, 247, 5, 97, 0, 0, 247, 248, 5, 116, 0, 0, 248, 249, 5, 105, 0, 0, 249, 250, 5, 111, 0, 0, 250, 251, 5, 110, 0, 0, 251, 33, 1, 0, 0, 0, 252, 253, 5, 100, 0, 0, 253, 254, 5, 101, 0, 0, 254, 255, 5, 102, 0, 0, 255, 256, 5, 105, 0, 0, 256, 257, 5, 110, 0, 0, 257, 258, 5, 101, 0, 0, 258, 35, 1, 0, 0, 0, 259, 260, 5, 119, 0, 0, 260, 261, 5, 105, 0, 0, 261, 262, 5, 116, 0, 0, 262, 263, 5, 104, 0, 0, 263, 37, 1, 0, 0, 0, 264, 265, 5, 61, 0, 0, 265, 266, 5, 61, 0, 0, 266, 39, 1, 0, 0, 0, 267, 268, 5, 33, 0, 0, 268, 269, 5, 61, 0, 0, 269, 41, 1, 0, 0, 0, 270, 271, 5, 105, 0, 0, 271, 272, 5, 110, 0, 0, 272, 43, 1, 0, 0, 0, 273, 274, 5, 60, 0, 0, 274, 45, 1, 0, 0, 0, 275, 276, 5, 60, 0, 0, 276, 277, 5, 61, 0, 0, 277, 47, 1, 0, 0, 0, 278, 279, 5, 62, 0, 0, 279, 280, 5, 61, 0, 0, 280, 49, 1, 0, 0, 0, 281, 282, 5, 62, 0, 0, 282, 51, 1, 0, 0, 0, 283, 284, 5, 38, 0, 0, 284, 285, 5, 38, 0, 0, 285, 53, 1, 0, 0, 0, 286, 287, 5, 124, 0, 0, 287, 288, 5, 124, 0, 0, 288, 55, 1, 0, 0, 0, 289, 290, 5, 91, 0, 0, 290, 57, 1, 0, 0, 0, 291, 292, 5, 93, 0, 0, 292, 59, 1, 0, 0, 0, 293, 294, 5, 123, 0, 0, 294, 61, 1, 0, 0, 0, 295, 296, 5, 125, 0, 0, 296, 63, 1, 0, 0, 0, 297, 298, 5, 40, 0, 0, 298, 65, 1, 0, 0, 0, 299, 300, 5, 41, 0, 0, 300, 67, 1, 0, 0, 0, 301, 302, 5, 46, 0, 0, 302, 69, 1, 0, 0, 0, 303, 304, 5, 45, 0, 0, 304, 71, 1, 0, 0, 0, 305, 306, 5, 33, 0, 0, 306, 73, 1, 0, 0, 0, 307, 308, 5, 63, 0, 0, 308, 75, 1, 0, 0, 0, 309, 310, 5, 43, 0, 0, 310, 77, 1, 0, 0, 0, 311, 312, 5, 42, 0, 0, 312, 79, 1, 0, 0, 0, 313, 314, 5, 47, 0, 0, 314, 81, 1, 0, 0, 0, 315, 316, 5, 37, 0, 0, 316, 83, 1, 0, 0, 0, 317, 318, 5, 116, 0, 0, 318, 319, 5, 114, 0, 0, 319, 320, 5, 117, 0, 0, 320, 321, 5, 101, 0, 0, 321, 85, 1, 0, 0, 0, 322, 323, 5, 102, 0, 0, 323, 324, 5, 97, 0, 0, 324, 325, 5, 108, 0, 0, 325, 326, 5, 115, 0, 0, 326, 327, 5, 101, 0, 0, 327, 87, 1, 0, 0, 0, 328, 329, 5, 110, 0, 0, 329, 330, 5, 117, 0, 0, 330, 331, 5, 108, 0, 0, 331, 332, 5, 108, 0, 0, 332, 89, 1, 0, 0, 0, 333, 334, 5, 92, 0, 0, 334, 91, 1, 0, 0, 0, 335, 336, 7, 0, 0, 0, 336, 93, 1, 0, 0, 0, 337, 338, 2, 48, 57, 0, 338, 95, 1, 0, 0, 0, 339, 341, 7, 1, 0, 0, 340, 342, 7, 2, 0, 0, 341, 340, 1, 0, 0, 0, 341, 342, 1, 0, 0, 0, 342, 344, 1, 0, 0, 0, 343, 345, 3, 94, 46, 0, 344, 343, 1, 0, 0, 0, 345, 346, 1, 0, 0, 0, 346, 344, 1, 0, 0, 0, 346, 347, 1, 0, 0, 0, 347, 97, 1, 0, 0, 0, 348, 349, 7, 3, 0, 0, 349, 99, 1, 0, 0, 0, 350, 351, 7, 4, 0, 0, 351, 101, 1, 0, 0, 0, 352, 357, 3, 104, 51, 0, 353, 357, 3, 108, 53, 0, 354, 357, 3, 110, 54, 0, 355, 357, 3, 106, 52, 0, 356, 352, 1, 0, 0, 0, 356, 353, 1, 0, 0, 0, 356, 354, 1, 0, 0, 0, 356, 355, 1, 0, 0, 0, 357, 103, 1, 0, 0, 0, 358, 359, 3, 90, 44, 0, 359, 360, 7, 5, 0, 0, 360, 105, 1, 0, 0, 0, 361, 362, 3, 90, 44, 0, 362, 363, 2, 48, 51, 0, 363, 364, 2, 48, 55, 0, 364, 365, 2, 48, 55, 0, 365, 107, 1, 0, 0, 0, 366, 367, 3, 90, 44, 0, 367, 368, 7, 6, 0, 0, 368, 369, 3, 98, 48, 0, 369, 370, 3, 98, 48, 0, 370, 109, 1, 0, 0, 0, 371, 372, 3, 90, 44, 0, 372, 373, 5, 117, 0, 0, 373, 374, 3, 98, 48, 0, 374, 375, 3, 98, 48, 0, 375, 376, 3, 98, 48, 0, 376, 377, 3, 98, 48, 0, 377, 390, 1, 0, 0, 0, 378, 379, 3, 90, 44, 0, 379, 380, 5, 85, 0, 0, 380, 381, 3, 98, 48, 0, 381, 382, 3, 98, 48, 0, 382, 383, 3, 98, 48, 0, 383, 384, 3, 98, 48, 0, 384, 385, 3, 98, 48, 0, 385, 386, 3, 98, 48, 0, 386, 387, 3, 98, 48, 0, 387, 388, 3, 98, 48, 0, 388, 390, 1, 0, 0, 0, 389, 371, 1, 0, 0, 0, 389, 378, 1, 0, 0, 0, 390, 111, 1, 0, 0, 0, 391, 393, 7, 7, 0, 0, 392, 391, 1, 0, 0, 0, 393, 394, 1, 0, 0, 0, 394, 392, 1, 0, 0, 0, 394, 395, 1, 0, 0, 0, 395, 113, 1, 0, 0, 0, 396, 397, 5, 47, 0, 0, 397, 398, 5, 47, 0, 0, 398, 402, 1, 0, 0, 0, 399, 401, 8, 8, 0, 0, 400, 399, 1, 0, 0, 0, 401, 404, 1, 0, 0, 0, 402, 400, 1, 0, 0, 0, 402, 403, 1, 0, 0, 0, 403, 405, 1, 0, 0, 0, 404, 402, 1, 0, 0, 0, 405, 406, 6, 56, 1, 0, 406, 115, 1, 0, 0, 0, 407, 409, 3, 94, 46, 0, 408, 407, 1, 0, 0, 0, 409, 410, 1, 0, 0, 0, 410, 408, 1, 0, 0, 0, 410, 411, 1, 0, 0, 0, 411, 412, 1, 0, 0, 0, 412, 414, 5, 46, 0, 0, 413, 415, 3, 94, 46, 0, 414, 413, 1, 0, 0, 0, 415, 416, 1, 0, 0, 0, 416, 414, 1, 0, 0, 0, 416, 417, 1, 0, 0, 0, 417, 419, 1, 0, 0, 0, 418, 420, 3, 96, 47, 0, 419, 418, 1, 0, 0, 0, 419, 420, 1, 0, 0, 0, 420, 438, 1, 0, 0, 0, 421, 423, 3, 94, 46, 0, 422, 421, 1, 0, 0, 0, 423, 424, 1, 0, 0, 0, 424, 422, 1, 0, 0, 0, 424, 425, 1, 0, 0, 0, 425, 426, 1, 0, 0, 0, 426, 427, 3, 96, 47, 0, 427, 438, 1, 0, 0, 0, 428, 430, 5, 46, 0, 0, 429, 431, 3, 94, 46, 0, 430, 429, 1, 0, 0, 0, 431, 432, 1, 0, 0, 0, 432, 430, 1, 0, 0, 0, 432, 433, 1, 0, 0, 0, 433, 435, 1, 0, 0, 0, 434, 436, 3, 96, 47, 0, 435, 434, 1, 0, 0, 0, 435, 436, 1, 0, 0, 0, 436, 438, 1, 0, 0, 0, 437, 408, 1, 0, 0, 0, 437, 422, 1, 0, 0, 0, 437, 428, 1, 0, 0, 0, 438, 117, 1, 0, 0, 0, 439, 441, 3, 94, 46, 0, 440, 439, 1, 0, 0, 0, 441, 442, 1, 0, 0, 0, 442, 440, 1, 0, 0, 0, 442, 443, 1, 0, 0, 0, 443, 453, 1, 0, 0, 0, 444, 445, 5, 48, 0, 0, 445, 446, 5, 120, 0, 0, 446, 448, 1, 0, 0, 0, 447, 449, 3, 98, 48, 0, 448, 447, 1, 0, 0, 0, 449, 450, 1, 0, 0, 0, 450, 448, 1, 0, 0, 0, 450, 451, 1, 0, 0, 0, 451, 453, 1, 0, 0, 0, 452, 440, 1, 0, 0, 0, 452, 444, 1, 0, 0, 0, 453, 119, 1, 0, 0, 0, 454, 456, 3, 94, 46, 0, 455, 454, 1, 0, 0, 0, 456, 457, 1, 0, 0, 0, 457, 455, 1, 0, 0, 0, 457, 458, 1, 0, 0, 0, 458, 459, 1, 0, 0, 0, 459, 460, 7, 9, 0, 0, 460, 472, 1, 0, 0, 0, 461, 462, 5, 48, 0, 0, 462, 463, 5, 120, 0, 0, 463, 465, 1, 0, 0, 0, 464, 466, 3, 98, 48, 0, 465, 464, 1, 0, 0, 0, 466, 467, 1, 0, 0, 0, 467, 465, 1, 0, 0, 0, 467, 468, 1, 0, 0, 0, 468, 469, 1, 0, 0, 0, 469, 470, 7, 9, 0, 0, 470, 472, 1, 0, 0, 0, 471, 455, 1, 0, 0, 0, 471, 461, 1, 0, 0, 0, 472, 121, 1, 0, 0, 0, 473, 478, 5, 34, 0, 0, 474, 477, 3, 102, 50, 0, 475, 477, 8, 10, 0, 0, 476, 474, 1, 0, 0, 0, 476, 475, 1, 0, 0, 0, 477, 480, 1, 0, 0, 0, 478, 476, 1, 0, 0, 0, 478, 479, 1, 0, 0, 0, 479, 481, 1, 0, 0, 0, 480, 478, 1, 0, 0, 0, 481, 570, 5, 34, 0, 0, 482, 487, 5, 39, 0, 0, 483, 486, 3, 102, 50, 0, 484, 486, 8, 11, 0, 0, 485, 483, 1, 0, 0, 0, 485, 484, 1, 0, 0, 0, 486, 489, 1, 0, 0, 0, 487, 485, 1, 0, 0, 0, 487, 488, 1, 0, 0, 0, 488, 490, 1, 0, 0, 0, 489, 487, 1, 0, 0, 0, 490, 570, 5, 39, 0, 0, 491, 492, 5, 34, 0, 0, 492, 493, 5, 34, 0, 0, 493, 494, 5, 34, 0, 0, 494, 499, 1, 0, 0, 0, 495, 498, 3, 102, 50, 0, 496, 498, 8, 12, 0, 0, 497, 495, 1, 0, 0, 0, 497, 496, 1, 0, 0, 0, 498, 501, 1, 0, 0, 0, 499, 500, 1, 0, 0, 0, 499, 497, 1, 0, 0, 0, 500, 502, 1, 0, 0, 0, 501, 499, 1, 0, 0, 0, 502, 503, 5, 34, 0, 0, 503, 504, 5, 34, 0, 0, 504, 570, 5, 34, 0, 0, 505, 506, 5, 39, 0, 0, 506, 507, 5, 39, 0, 0, 507, 508, 5, 39, 0, 0, 508, 513, 1, 0, 0, 0, 509, 512, 3, 102, 50, 0, 510, 512, 8, 12, 0, 0, 511, 509, 1, 0, 0, 0, 511, 510, 1, 0, 0, 0, 512, 515, 1, 0, 0, 0, 513, 514, 1, 0, 0, 0, 513, 511, 1, 0, 0, 0, 514, 516, 1, 0, 0, 0, 515, 513, 1, 0, 0, 0, 516, 517, 5, 39, 0, 0, 517, 518, 5, 39, 0, 0, 518, 570, 5, 39, 0, 0, 519, 520, 3, 100, 49, 0, 520, 524, 5, 34, 0, 0, 521, 523, 8, 13, 0, 0, 522, 521, 1, 0, 0, 0, 523, 526, 1, 0, 0, 0, 524, 522, 1, 0, 0, 0, 524, 525, 1, 0, 0, 0, 525, 527, 1, 0, 0, 0, 526, 524, 1, 0, 0, 0, 527, 528, 5, 34, 0, 0, 528, 570, 1, 0, 0, 0, 529, 530, 3, 100, 49, 0, 530, 534, 5, 39, 0, 0, 531, 533, 8, 14, 0, 0, 532, 531, 1, 0, 0, 0, 533, 536, 1, 0, 0, 0, 534, 532, 1, 0, 0, 0, 534, 535, 1, 0, 0, 0, 535, 537, 1, 0, 0, 0, 536, 534, 1, 0, 0, 0, 537, 538, 5, 39, 0, 0, 538, 570, 1, 0, 0, 0, 539, 540, 3, 100, 49, 0, 540, 541, 5, 34, 0, 0, 541, 542, 5, 34, 0, 0, 542, 543, 5, 34, 0, 0, 543, 547, 1, 0, 0, 0, 544, 546, 9, 0, 0, 0, 545, 544, 1, 0, 0, 0, 546, 549, 1, 0, 0, 0, 547, 548, 1, 0, 0, 0, 547, 545, 1, 0, 0, 0, 548, 550, 1, 0, 0, 0, 549, 547, 1, 0, 0, 0, 550, 551, 5, 34, 0, 0, 551, 552, 5, 34, 0, 0, 552, 553, 5, 34, 0, 0, 553, 570, 1, 0, 0, 0, 554, 555, 3, 100, 49, 0, 555, 556, 5, 39, 0, 0, 556, 557, 5, 39, 0, 0, 557, 558, 5, 39, 0, 0, 558, 562, 1, 0, 0, 0, 559, 561, 9, 0, 0, 0, 560, 559, 1, 0, 0, 0, 561, 564, 1, 0, 0, 0, 562, 563, 1, 0, 0, 0, 562, 560, 1, 0, 0, 0, 563, 565, 1, 0, 0, 0, 564, 562, 1, 0, 0, 0, 565, 566, 5, 39, 0, 0, 566, 567, 5, 39, 0, 0, 567, 568, 5, 39, 0, 0, 568, 570, 1, 0, 0, 0, 569, 473, 1, 0, 0, 0, 569, 482, 1, 0, 0, 0, 569, 491, 1, 0, 0, 0, 569, 505, 1, 0, 0, 0, 569, 519, 1, 0, 0, 0, 569, 529, 1, 0, 0, 0, 569, 539, 1, 0, 0, 0, 569, 554, 1, 0, 0, 0, 570, 123, 1, 0, 0, 0, 571, 572, 7, 15, 0, 0, 572, 573, 3, 122, 60, 0, 573, 125, 1, 0, 0, 0, 574, 577, 3, 92, 45, 0, 575, 577, 5, 95, 0, 0, 576, 574, 1, 0, 0, 0, 576, 575, 1, 0, 0, 0, 577, 584, 1, 0, 0, 0, 578, 583, 3, 92, 45, 0, 579, 583, 3, 94, 46, 0, 580, 583, 5, 95, 0, 0, 581, 583, 3, 70, 34, 0, 582, 578, 1, 0, 0, 0, 582, 579, 1, 0, 0, 0, 582, 580, 1, 0, 0, 0, 582, 581, 1, 0, 0, 0, 583, 586, 1, 0, 0, 0, 584, 582, 1, 0, 0, 0, 584, 585, 1, 0, 0, 0, 585, 127, 1, 0, 0, 0, 586, 584, 1, 0, 0, 0, 587, 590, 3, 92, 45, 0, 588, 590, 5, 95, 0, 0, 589, 587, 1, 0, 0, 0, 589, 588, 1, 0, 0, 0, 590, 605, 1, 0, 0, 0, 591, 595, 3, 80, 39, 0, 592, 595, 3, 68, 33, 0, 593, 595, 3, 70, 34, 0, 594, 591, 1, 0, 0, 0, 594, 592, 1, 0, 0, 0, 594, 593, 1, 0, 0, 0, 594, 595, 1, 0, 0, 0, 595, 599, 1, 0, 0, 0, 596, 600, 3, 92, 45, 0, 597, 600, 3, 94, 46, 0, 598, 600, 5, 95, 0, 0, 599, 596, 1, 0, 0, 0, 599, 597, 1, 0, 0, 0, 599, 598, 1, 0, 0, 0, 600, 601, 1, 0, 0, 0, 601, 599, 1, 0, 0, 0, 601, 602, 1, 0, 0, 0, 602, 604, 1, 0, 0, 0, 603, 594, 1, 0, 0, 0, 604, 607, 1, 0, 0, 0, 605, 603, 1, 0, 0, 0, 605, 606, 1, 0, 0, 0, 606, 129, 1, 0, 0, 0, 607, 605, 1, 0, 0, 0, 608, 610, 3, 112, 55, 0, 609, 608, 1, 0, 0, 0, 609, 610, 1, 0, 0, 0, 610, 616, 1, 0, 0, 0, 611, 613, 5, 13, 0, 0, 612, 611, 1, 0, 0, 0, 612, 613, 1, 0, 0, 0, 613, 614, 1, 0, 0, 0, 614, 617, 5, 10, 0, 0, 615, 617, 2, 12, 13, 0, 616, 612, 1, 0, 0, 0, 616, 615, 1, 0, 0, 0, 617, 619, 1, 0, 0, 0, 618, 620, 3, 112, 55, 0, 619, 618, 1, 0, 0, 0, 619, 620, 1, 0, 0, 0, 620, 622, 1, 0, 0, 0, 621, 623, 3, 130, 64, 0, 622, 621, 1, 0, 0, 0, 622, 623, 1, 0, 0, 0, 623, 131, 1, 0, 0, 0, 624, 625, 3, 66, 32, 0, 625, 626, 1, 0, 0, 0, 626, 627, 6, 65, 2, 0, 627, 628, 6, 65, 3, 0, 628, 133, 1, 0, 0, 0, 629, 630, 5, 109, 0, 0, 630, 631, 5, 97, 0, 0, 631, 637, 5, 112, 0, 0, 632, 633, 5, 108, 0, 0, 633, 634, 5, 105, 0, 0, 634, 635, 5, 115, 0, 0, 635, 637, 5, 116, 0, 0, 636, 629, 1, 0, 0, 0, 636, 632, 1, 0, 0, 0, 637, 135, 1, 0, 0, 0, 638, 639, 5, 98, 0, 0, 639, 640, 5, 111, 0, 0, 640, 641, 5, 111, 0, 0, 641, 688, 5, 108, 0, 0, 642, 643, 5, 115, 0, 0, 643, 644, 5, 116, 0, 0, 644, 645, 5, 114, 0, 0, 645, 646, 5, 105, 0, 0, 646, 647, 5, 110, 0, 0, 647, 688, 5, 103, 0, 0, 648, 649, 5, 105, 0, 0, 649, 650, 5, 110, 0, 0, 650, 688, 5, 116, 0, 0, 651, 652, 5, 117, 0, 0, 652, 653, 5, 105, 0, 0, 653, 654, 5, 110, 0, 0, 654, 688, 5, 116, 0, 0, 655, 656, 5, 100, 0, 0, 656, 657, 5, 111, 0, 0, 657, 658, 5, 117, 0, 0, 658, 659, 5, 98, 0, 0, 659, 660, 5, 108, 0, 0, 660, 688, 5, 101, 0, 0, 661, 662, 5, 100, 0, 0, 662, 663, 5, 117, 0, 0, 663, 664, 5, 114, 0, 0, 664, 665, 5, 97, 0, 0, 665, 666, 5, 116, 0, 0, 666, 667, 5, 105, 0, 0, 667, 668, 5, 111, 0, 0, 668, 688, 5, 110, 0, 0, 669, 670, 5, 116, 0, 0, 670, 671, 5, 105, 0, 0, 671, 672, 5, 109, 0, 0, 672, 673, 5, 101, 0, 0, 673, 674, 5, 115, 0, 0, 674, 675, 5, 116, 0, 0, 675, 676, 5, 97, 0, 0, 676, 677, 5, 109, 0, 0, 677, 688, 5, 112, 0, 0, 678, 679, 5, 105, 0, 0, 679, 680, 5, 112, 0, 0, 680, 681, 5, 97, 0, 0, 681, 682, 5, 100, 0, 0, 682, 683, 5, 100, 0, 0, 683, 684, 5, 114, 0, 0, 684, 685, 5, 101, 0, 0, 685, 686, 5, 115, 0, 0, 686, 688, 5, 115, 0, 0, 687, 638, 1, 0, 0, 0, 687, 642, 1, 0, 0, 0, 687, 648, 1, 0, 0, 0, 687, 651, 1, 0, 0, 0, 687, 655, 1, 0, 0, 0, 687, 661, 1, 0, 0, 0, 687, 669, 1, 0, 0, 0, 687, 678, 1, 0, 0, 0, 688, 137, 1, 0, 0, 0, 689, 690, 3, 44, 21, 0, 690, 691, 1, 0, 0, 0, 691, 692, 6, 68, 4, 0, 692, 139, 1, 0, 0, 0, 693, 694, 3, 50, 24, 0, 694, 695, 1, 0, 0, 0, 695, 696, 6, 69, 5, 0, 696, 141, 1, 0, 0, 0, 697, 698, 3, 64, 31, 0, 698, 699, 1, 0, 0, 0, 699, 700, 6, 70, 6, 0, 700, 143, 1, 0, 0, 0, 701, 702, 3, 4, 1, 0, 702, 703, 1, 0, 0, 0, 703, 704, 6, 71, 7, 0, 704, 145, 1, 0, 0, 0, 705, 706, 3, 6, 2, 0, 706, 707, 1, 0, 0, 0, 707, 708, 6, 72, 8, 0, 708, 147, 1, 0, 0, 0, 709, 710, 3, 112, 55, 0, 710, 711, 1, 0, 0, 0, 711, 712, 6, 73, 9, 0, 712, 149, 1, 0, 0, 0, 713, 714, 3, 126, 62, 0, 714, 715, 1, 0, 0, 0, 715, 716, 6, 74, 10, 0, 716, 151, 1, 0, 0, 0, 51, 0, 1, 201, 207, 341, 346, 356, 389, 394, 402, 410, 416, 419, 424, 432, 435, 437, 442, 450, 452, 457, 467, 471, 476, 478, 485, 487, 497, 499, 511, 513, 524, 534, 547, 562, 569, 576, 582, 584, 589, 594, 599, 601, 605, 609, 612, 616, 619, 622, 636, 687, 11, 5, 1, 0, 0, 1, 0, 7, 8, 0, 4, 0, 0, 7, 3, 0, 7, 4, 0, 7, 7, 0, 7, 1, 0, 7, 2, 0, 7, 9, 0, 7, 10, 0] \ No newline at end of file +[4, 0, 58, 731, 6, -1, 6, -1, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 2, 41, 7, 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 2, 45, 7, 45, 2, 46, 7, 46, 2, 47, 7, 47, 2, 48, 7, 48, 2, 49, 7, 49, 2, 50, 7, 50, 2, 51, 7, 51, 2, 52, 7, 52, 2, 53, 7, 53, 2, 54, 7, 54, 2, 55, 7, 55, 2, 56, 7, 56, 2, 57, 7, 57, 2, 58, 7, 58, 2, 59, 7, 59, 2, 60, 7, 60, 2, 61, 7, 61, 2, 62, 7, 62, 2, 63, 7, 63, 2, 64, 7, 64, 2, 65, 7, 65, 2, 66, 7, 66, 2, 67, 7, 67, 2, 68, 7, 68, 2, 69, 7, 69, 2, 70, 7, 70, 2, 71, 7, 71, 2, 72, 7, 72, 2, 73, 7, 73, 2, 74, 7, 74, 2, 75, 7, 75, 1, 0, 1, 0, 1, 1, 1, 1, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 10, 4, 10, 202, 8, 10, 11, 10, 12, 10, 203, 1, 10, 1, 10, 4, 10, 208, 8, 10, 11, 10, 12, 10, 209, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 18, 1, 18, 1, 18, 1, 19, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 21, 1, 21, 1, 22, 1, 22, 1, 22, 1, 23, 1, 23, 1, 23, 1, 24, 1, 24, 1, 25, 1, 25, 1, 25, 1, 26, 1, 26, 1, 26, 1, 27, 1, 27, 1, 28, 1, 28, 1, 29, 1, 29, 1, 30, 1, 30, 1, 31, 1, 31, 1, 32, 1, 32, 1, 33, 1, 33, 1, 34, 1, 34, 1, 35, 1, 35, 1, 36, 1, 36, 1, 37, 1, 37, 1, 38, 1, 38, 1, 39, 1, 39, 1, 40, 1, 40, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 44, 1, 44, 1, 45, 1, 45, 1, 46, 1, 46, 1, 47, 1, 47, 3, 47, 344, 8, 47, 1, 47, 4, 47, 347, 8, 47, 11, 47, 12, 47, 348, 1, 48, 1, 48, 1, 49, 1, 49, 1, 50, 1, 50, 1, 50, 1, 50, 3, 50, 359, 8, 50, 1, 51, 1, 51, 1, 51, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 3, 54, 392, 8, 54, 1, 55, 4, 55, 395, 8, 55, 11, 55, 12, 55, 396, 1, 56, 1, 56, 1, 56, 1, 56, 5, 56, 403, 8, 56, 10, 56, 12, 56, 406, 9, 56, 1, 56, 1, 56, 1, 57, 4, 57, 411, 8, 57, 11, 57, 12, 57, 412, 1, 57, 1, 57, 4, 57, 417, 8, 57, 11, 57, 12, 57, 418, 1, 57, 3, 57, 422, 8, 57, 1, 57, 4, 57, 425, 8, 57, 11, 57, 12, 57, 426, 1, 57, 1, 57, 1, 57, 1, 57, 4, 57, 433, 8, 57, 11, 57, 12, 57, 434, 1, 57, 3, 57, 438, 8, 57, 3, 57, 440, 8, 57, 1, 58, 4, 58, 443, 8, 58, 11, 58, 12, 58, 444, 1, 58, 1, 58, 1, 58, 1, 58, 4, 58, 451, 8, 58, 11, 58, 12, 58, 452, 3, 58, 455, 8, 58, 1, 59, 4, 59, 458, 8, 59, 11, 59, 12, 59, 459, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 4, 59, 468, 8, 59, 11, 59, 12, 59, 469, 1, 59, 1, 59, 3, 59, 474, 8, 59, 1, 60, 1, 60, 1, 60, 5, 60, 479, 8, 60, 10, 60, 12, 60, 482, 9, 60, 1, 60, 1, 60, 1, 60, 1, 60, 5, 60, 488, 8, 60, 10, 60, 12, 60, 491, 9, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 5, 60, 500, 8, 60, 10, 60, 12, 60, 503, 9, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 5, 60, 514, 8, 60, 10, 60, 12, 60, 517, 9, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 5, 60, 525, 8, 60, 10, 60, 12, 60, 528, 9, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 5, 60, 535, 8, 60, 10, 60, 12, 60, 538, 9, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 5, 60, 548, 8, 60, 10, 60, 12, 60, 551, 9, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 5, 60, 563, 8, 60, 10, 60, 12, 60, 566, 9, 60, 1, 60, 1, 60, 1, 60, 1, 60, 3, 60, 572, 8, 60, 1, 61, 1, 61, 1, 61, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 63, 1, 63, 3, 63, 591, 8, 63, 1, 63, 1, 63, 1, 63, 1, 63, 5, 63, 597, 8, 63, 10, 63, 12, 63, 600, 9, 63, 1, 64, 1, 64, 3, 64, 604, 8, 64, 1, 64, 1, 64, 1, 64, 3, 64, 609, 8, 64, 1, 64, 1, 64, 1, 64, 4, 64, 614, 8, 64, 11, 64, 12, 64, 615, 5, 64, 618, 8, 64, 10, 64, 12, 64, 621, 9, 64, 1, 65, 3, 65, 624, 8, 65, 1, 65, 3, 65, 627, 8, 65, 1, 65, 1, 65, 3, 65, 631, 8, 65, 1, 65, 3, 65, 634, 8, 65, 1, 65, 3, 65, 637, 8, 65, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 3, 67, 651, 8, 67, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 3, 68, 702, 8, 68, 1, 69, 1, 69, 1, 69, 1, 69, 1, 70, 1, 70, 1, 70, 1, 70, 1, 71, 1, 71, 1, 71, 1, 71, 1, 72, 1, 72, 1, 72, 1, 72, 1, 73, 1, 73, 1, 73, 1, 73, 1, 74, 1, 74, 1, 74, 1, 74, 1, 75, 1, 75, 1, 75, 1, 75, 4, 501, 515, 549, 564, 0, 76, 2, 11, 4, 1, 6, 2, 8, 12, 10, 13, 12, 14, 14, 15, 16, 16, 18, 17, 20, 18, 22, 19, 24, 20, 26, 21, 28, 22, 30, 23, 32, 24, 34, 25, 36, 26, 38, 27, 40, 28, 42, 29, 44, 3, 46, 30, 48, 31, 50, 4, 52, 32, 54, 33, 56, 5, 58, 34, 60, 35, 62, 36, 64, 7, 66, 8, 68, 37, 70, 38, 72, 39, 74, 40, 76, 41, 78, 42, 80, 43, 82, 44, 84, 45, 86, 46, 88, 47, 90, 0, 92, 0, 94, 0, 96, 0, 98, 0, 100, 0, 102, 0, 104, 0, 106, 0, 108, 0, 110, 0, 112, 9, 114, 48, 116, 49, 118, 50, 120, 51, 122, 52, 124, 53, 126, 54, 128, 10, 130, 55, 132, 56, 134, 0, 136, 57, 138, 58, 140, 0, 142, 0, 144, 0, 146, 0, 148, 0, 150, 0, 152, 0, 2, 0, 1, 16, 2, 0, 65, 90, 97, 122, 2, 0, 69, 69, 101, 101, 2, 0, 43, 43, 45, 45, 3, 0, 48, 57, 65, 70, 97, 102, 2, 0, 82, 82, 114, 114, 10, 0, 34, 34, 39, 39, 63, 63, 92, 92, 96, 98, 102, 102, 110, 110, 114, 114, 116, 116, 118, 118, 2, 0, 88, 88, 120, 120, 3, 0, 9, 9, 12, 12, 32, 32, 1, 0, 10, 10, 2, 0, 85, 85, 117, 117, 4, 0, 10, 10, 13, 13, 34, 34, 92, 92, 4, 0, 10, 10, 13, 13, 39, 39, 92, 92, 1, 0, 92, 92, 3, 0, 10, 10, 13, 13, 34, 34, 3, 0, 10, 10, 13, 13, 39, 39, 2, 0, 66, 66, 98, 98, 787, 0, 2, 1, 0, 0, 0, 0, 4, 1, 0, 0, 0, 0, 6, 1, 0, 0, 0, 0, 8, 1, 0, 0, 0, 0, 10, 1, 0, 0, 0, 0, 12, 1, 0, 0, 0, 0, 14, 1, 0, 0, 0, 0, 16, 1, 0, 0, 0, 0, 18, 1, 0, 0, 0, 0, 20, 1, 0, 0, 0, 0, 22, 1, 0, 0, 0, 0, 24, 1, 0, 0, 0, 0, 26, 1, 0, 0, 0, 0, 28, 1, 0, 0, 0, 0, 30, 1, 0, 0, 0, 0, 32, 1, 0, 0, 0, 0, 34, 1, 0, 0, 0, 0, 36, 1, 0, 0, 0, 0, 38, 1, 0, 0, 0, 0, 40, 1, 0, 0, 0, 0, 42, 1, 0, 0, 0, 0, 44, 1, 0, 0, 0, 0, 46, 1, 0, 0, 0, 0, 48, 1, 0, 0, 0, 0, 50, 1, 0, 0, 0, 0, 52, 1, 0, 0, 0, 0, 54, 1, 0, 0, 0, 0, 56, 1, 0, 0, 0, 0, 58, 1, 0, 0, 0, 0, 60, 1, 0, 0, 0, 0, 62, 1, 0, 0, 0, 0, 64, 1, 0, 0, 0, 0, 66, 1, 0, 0, 0, 0, 68, 1, 0, 0, 0, 0, 70, 1, 0, 0, 0, 0, 72, 1, 0, 0, 0, 0, 74, 1, 0, 0, 0, 0, 76, 1, 0, 0, 0, 0, 78, 1, 0, 0, 0, 0, 80, 1, 0, 0, 0, 0, 82, 1, 0, 0, 0, 0, 84, 1, 0, 0, 0, 0, 86, 1, 0, 0, 0, 0, 88, 1, 0, 0, 0, 0, 112, 1, 0, 0, 0, 0, 114, 1, 0, 0, 0, 0, 116, 1, 0, 0, 0, 0, 118, 1, 0, 0, 0, 0, 120, 1, 0, 0, 0, 0, 122, 1, 0, 0, 0, 0, 124, 1, 0, 0, 0, 0, 126, 1, 0, 0, 0, 0, 128, 1, 0, 0, 0, 0, 130, 1, 0, 0, 0, 0, 132, 1, 0, 0, 0, 1, 134, 1, 0, 0, 0, 1, 136, 1, 0, 0, 0, 1, 138, 1, 0, 0, 0, 1, 140, 1, 0, 0, 0, 1, 142, 1, 0, 0, 0, 1, 144, 1, 0, 0, 0, 1, 146, 1, 0, 0, 0, 1, 148, 1, 0, 0, 0, 1, 150, 1, 0, 0, 0, 1, 152, 1, 0, 0, 0, 2, 154, 1, 0, 0, 0, 4, 156, 1, 0, 0, 0, 6, 158, 1, 0, 0, 0, 8, 160, 1, 0, 0, 0, 10, 164, 1, 0, 0, 0, 12, 167, 1, 0, 0, 0, 14, 175, 1, 0, 0, 0, 16, 180, 1, 0, 0, 0, 18, 187, 1, 0, 0, 0, 20, 193, 1, 0, 0, 0, 22, 201, 1, 0, 0, 0, 24, 211, 1, 0, 0, 0, 26, 218, 1, 0, 0, 0, 28, 223, 1, 0, 0, 0, 30, 235, 1, 0, 0, 0, 32, 245, 1, 0, 0, 0, 34, 254, 1, 0, 0, 0, 36, 261, 1, 0, 0, 0, 38, 266, 1, 0, 0, 0, 40, 269, 1, 0, 0, 0, 42, 272, 1, 0, 0, 0, 44, 275, 1, 0, 0, 0, 46, 277, 1, 0, 0, 0, 48, 280, 1, 0, 0, 0, 50, 283, 1, 0, 0, 0, 52, 285, 1, 0, 0, 0, 54, 288, 1, 0, 0, 0, 56, 291, 1, 0, 0, 0, 58, 293, 1, 0, 0, 0, 60, 295, 1, 0, 0, 0, 62, 297, 1, 0, 0, 0, 64, 299, 1, 0, 0, 0, 66, 301, 1, 0, 0, 0, 68, 303, 1, 0, 0, 0, 70, 305, 1, 0, 0, 0, 72, 307, 1, 0, 0, 0, 74, 309, 1, 0, 0, 0, 76, 311, 1, 0, 0, 0, 78, 313, 1, 0, 0, 0, 80, 315, 1, 0, 0, 0, 82, 317, 1, 0, 0, 0, 84, 319, 1, 0, 0, 0, 86, 324, 1, 0, 0, 0, 88, 330, 1, 0, 0, 0, 90, 335, 1, 0, 0, 0, 92, 337, 1, 0, 0, 0, 94, 339, 1, 0, 0, 0, 96, 341, 1, 0, 0, 0, 98, 350, 1, 0, 0, 0, 100, 352, 1, 0, 0, 0, 102, 358, 1, 0, 0, 0, 104, 360, 1, 0, 0, 0, 106, 363, 1, 0, 0, 0, 108, 368, 1, 0, 0, 0, 110, 391, 1, 0, 0, 0, 112, 394, 1, 0, 0, 0, 114, 398, 1, 0, 0, 0, 116, 439, 1, 0, 0, 0, 118, 454, 1, 0, 0, 0, 120, 473, 1, 0, 0, 0, 122, 571, 1, 0, 0, 0, 124, 573, 1, 0, 0, 0, 126, 576, 1, 0, 0, 0, 128, 590, 1, 0, 0, 0, 130, 603, 1, 0, 0, 0, 132, 623, 1, 0, 0, 0, 134, 638, 1, 0, 0, 0, 136, 650, 1, 0, 0, 0, 138, 701, 1, 0, 0, 0, 140, 703, 1, 0, 0, 0, 142, 707, 1, 0, 0, 0, 144, 711, 1, 0, 0, 0, 146, 715, 1, 0, 0, 0, 148, 719, 1, 0, 0, 0, 150, 723, 1, 0, 0, 0, 152, 727, 1, 0, 0, 0, 154, 155, 5, 35, 0, 0, 155, 3, 1, 0, 0, 0, 156, 157, 5, 58, 0, 0, 157, 5, 1, 0, 0, 0, 158, 159, 5, 44, 0, 0, 159, 7, 1, 0, 0, 0, 160, 161, 5, 97, 0, 0, 161, 162, 5, 110, 0, 0, 162, 163, 5, 100, 0, 0, 163, 9, 1, 0, 0, 0, 164, 165, 5, 111, 0, 0, 165, 166, 5, 114, 0, 0, 166, 11, 1, 0, 0, 0, 167, 168, 5, 98, 0, 0, 168, 169, 5, 117, 0, 0, 169, 170, 5, 116, 0, 0, 170, 171, 5, 32, 0, 0, 171, 172, 5, 110, 0, 0, 172, 173, 5, 111, 0, 0, 173, 174, 5, 116, 0, 0, 174, 13, 1, 0, 0, 0, 175, 176, 5, 102, 0, 0, 176, 177, 5, 114, 0, 0, 177, 178, 5, 111, 0, 0, 178, 179, 5, 109, 0, 0, 179, 15, 1, 0, 0, 0, 180, 181, 5, 109, 0, 0, 181, 182, 5, 111, 0, 0, 182, 183, 5, 100, 0, 0, 183, 184, 5, 117, 0, 0, 184, 185, 5, 108, 0, 0, 185, 186, 5, 101, 0, 0, 186, 17, 1, 0, 0, 0, 187, 188, 5, 109, 0, 0, 188, 189, 5, 111, 0, 0, 189, 190, 5, 100, 0, 0, 190, 191, 5, 101, 0, 0, 191, 192, 5, 108, 0, 0, 192, 19, 1, 0, 0, 0, 193, 194, 5, 115, 0, 0, 194, 195, 5, 99, 0, 0, 195, 196, 5, 104, 0, 0, 196, 197, 5, 101, 0, 0, 197, 198, 5, 109, 0, 0, 198, 199, 5, 97, 0, 0, 199, 21, 1, 0, 0, 0, 200, 202, 3, 94, 46, 0, 201, 200, 1, 0, 0, 0, 202, 203, 1, 0, 0, 0, 203, 201, 1, 0, 0, 0, 203, 204, 1, 0, 0, 0, 204, 205, 1, 0, 0, 0, 205, 207, 5, 46, 0, 0, 206, 208, 3, 94, 46, 0, 207, 206, 1, 0, 0, 0, 208, 209, 1, 0, 0, 0, 209, 207, 1, 0, 0, 0, 209, 210, 1, 0, 0, 0, 210, 23, 1, 0, 0, 0, 211, 212, 5, 101, 0, 0, 212, 213, 5, 120, 0, 0, 213, 214, 5, 116, 0, 0, 214, 215, 5, 101, 0, 0, 215, 216, 5, 110, 0, 0, 216, 217, 5, 100, 0, 0, 217, 25, 1, 0, 0, 0, 218, 219, 5, 116, 0, 0, 219, 220, 5, 121, 0, 0, 220, 221, 5, 112, 0, 0, 221, 222, 5, 101, 0, 0, 222, 27, 1, 0, 0, 0, 223, 224, 5, 99, 0, 0, 224, 225, 5, 111, 0, 0, 225, 226, 5, 110, 0, 0, 226, 227, 5, 100, 0, 0, 227, 228, 5, 105, 0, 0, 228, 229, 5, 116, 0, 0, 229, 230, 5, 105, 0, 0, 230, 231, 5, 111, 0, 0, 231, 232, 5, 110, 0, 0, 232, 233, 1, 0, 0, 0, 233, 234, 6, 13, 0, 0, 234, 29, 1, 0, 0, 0, 235, 236, 5, 114, 0, 0, 236, 237, 5, 101, 0, 0, 237, 238, 5, 108, 0, 0, 238, 239, 5, 97, 0, 0, 239, 240, 5, 116, 0, 0, 240, 241, 5, 105, 0, 0, 241, 242, 5, 111, 0, 0, 242, 243, 5, 110, 0, 0, 243, 244, 5, 115, 0, 0, 244, 31, 1, 0, 0, 0, 245, 246, 5, 114, 0, 0, 246, 247, 5, 101, 0, 0, 247, 248, 5, 108, 0, 0, 248, 249, 5, 97, 0, 0, 249, 250, 5, 116, 0, 0, 250, 251, 5, 105, 0, 0, 251, 252, 5, 111, 0, 0, 252, 253, 5, 110, 0, 0, 253, 33, 1, 0, 0, 0, 254, 255, 5, 100, 0, 0, 255, 256, 5, 101, 0, 0, 256, 257, 5, 102, 0, 0, 257, 258, 5, 105, 0, 0, 258, 259, 5, 110, 0, 0, 259, 260, 5, 101, 0, 0, 260, 35, 1, 0, 0, 0, 261, 262, 5, 119, 0, 0, 262, 263, 5, 105, 0, 0, 263, 264, 5, 116, 0, 0, 264, 265, 5, 104, 0, 0, 265, 37, 1, 0, 0, 0, 266, 267, 5, 61, 0, 0, 267, 268, 5, 61, 0, 0, 268, 39, 1, 0, 0, 0, 269, 270, 5, 33, 0, 0, 270, 271, 5, 61, 0, 0, 271, 41, 1, 0, 0, 0, 272, 273, 5, 105, 0, 0, 273, 274, 5, 110, 0, 0, 274, 43, 1, 0, 0, 0, 275, 276, 5, 60, 0, 0, 276, 45, 1, 0, 0, 0, 277, 278, 5, 60, 0, 0, 278, 279, 5, 61, 0, 0, 279, 47, 1, 0, 0, 0, 280, 281, 5, 62, 0, 0, 281, 282, 5, 61, 0, 0, 282, 49, 1, 0, 0, 0, 283, 284, 5, 62, 0, 0, 284, 51, 1, 0, 0, 0, 285, 286, 5, 38, 0, 0, 286, 287, 5, 38, 0, 0, 287, 53, 1, 0, 0, 0, 288, 289, 5, 124, 0, 0, 289, 290, 5, 124, 0, 0, 290, 55, 1, 0, 0, 0, 291, 292, 5, 91, 0, 0, 292, 57, 1, 0, 0, 0, 293, 294, 5, 93, 0, 0, 294, 59, 1, 0, 0, 0, 295, 296, 5, 123, 0, 0, 296, 61, 1, 0, 0, 0, 297, 298, 5, 125, 0, 0, 298, 63, 1, 0, 0, 0, 299, 300, 5, 40, 0, 0, 300, 65, 1, 0, 0, 0, 301, 302, 5, 41, 0, 0, 302, 67, 1, 0, 0, 0, 303, 304, 5, 46, 0, 0, 304, 69, 1, 0, 0, 0, 305, 306, 5, 45, 0, 0, 306, 71, 1, 0, 0, 0, 307, 308, 5, 33, 0, 0, 308, 73, 1, 0, 0, 0, 309, 310, 5, 63, 0, 0, 310, 75, 1, 0, 0, 0, 311, 312, 5, 43, 0, 0, 312, 77, 1, 0, 0, 0, 313, 314, 5, 42, 0, 0, 314, 79, 1, 0, 0, 0, 315, 316, 5, 47, 0, 0, 316, 81, 1, 0, 0, 0, 317, 318, 5, 37, 0, 0, 318, 83, 1, 0, 0, 0, 319, 320, 5, 116, 0, 0, 320, 321, 5, 114, 0, 0, 321, 322, 5, 117, 0, 0, 322, 323, 5, 101, 0, 0, 323, 85, 1, 0, 0, 0, 324, 325, 5, 102, 0, 0, 325, 326, 5, 97, 0, 0, 326, 327, 5, 108, 0, 0, 327, 328, 5, 115, 0, 0, 328, 329, 5, 101, 0, 0, 329, 87, 1, 0, 0, 0, 330, 331, 5, 110, 0, 0, 331, 332, 5, 117, 0, 0, 332, 333, 5, 108, 0, 0, 333, 334, 5, 108, 0, 0, 334, 89, 1, 0, 0, 0, 335, 336, 5, 92, 0, 0, 336, 91, 1, 0, 0, 0, 337, 338, 7, 0, 0, 0, 338, 93, 1, 0, 0, 0, 339, 340, 2, 48, 57, 0, 340, 95, 1, 0, 0, 0, 341, 343, 7, 1, 0, 0, 342, 344, 7, 2, 0, 0, 343, 342, 1, 0, 0, 0, 343, 344, 1, 0, 0, 0, 344, 346, 1, 0, 0, 0, 345, 347, 3, 94, 46, 0, 346, 345, 1, 0, 0, 0, 347, 348, 1, 0, 0, 0, 348, 346, 1, 0, 0, 0, 348, 349, 1, 0, 0, 0, 349, 97, 1, 0, 0, 0, 350, 351, 7, 3, 0, 0, 351, 99, 1, 0, 0, 0, 352, 353, 7, 4, 0, 0, 353, 101, 1, 0, 0, 0, 354, 359, 3, 104, 51, 0, 355, 359, 3, 108, 53, 0, 356, 359, 3, 110, 54, 0, 357, 359, 3, 106, 52, 0, 358, 354, 1, 0, 0, 0, 358, 355, 1, 0, 0, 0, 358, 356, 1, 0, 0, 0, 358, 357, 1, 0, 0, 0, 359, 103, 1, 0, 0, 0, 360, 361, 3, 90, 44, 0, 361, 362, 7, 5, 0, 0, 362, 105, 1, 0, 0, 0, 363, 364, 3, 90, 44, 0, 364, 365, 2, 48, 51, 0, 365, 366, 2, 48, 55, 0, 366, 367, 2, 48, 55, 0, 367, 107, 1, 0, 0, 0, 368, 369, 3, 90, 44, 0, 369, 370, 7, 6, 0, 0, 370, 371, 3, 98, 48, 0, 371, 372, 3, 98, 48, 0, 372, 109, 1, 0, 0, 0, 373, 374, 3, 90, 44, 0, 374, 375, 5, 117, 0, 0, 375, 376, 3, 98, 48, 0, 376, 377, 3, 98, 48, 0, 377, 378, 3, 98, 48, 0, 378, 379, 3, 98, 48, 0, 379, 392, 1, 0, 0, 0, 380, 381, 3, 90, 44, 0, 381, 382, 5, 85, 0, 0, 382, 383, 3, 98, 48, 0, 383, 384, 3, 98, 48, 0, 384, 385, 3, 98, 48, 0, 385, 386, 3, 98, 48, 0, 386, 387, 3, 98, 48, 0, 387, 388, 3, 98, 48, 0, 388, 389, 3, 98, 48, 0, 389, 390, 3, 98, 48, 0, 390, 392, 1, 0, 0, 0, 391, 373, 1, 0, 0, 0, 391, 380, 1, 0, 0, 0, 392, 111, 1, 0, 0, 0, 393, 395, 7, 7, 0, 0, 394, 393, 1, 0, 0, 0, 395, 396, 1, 0, 0, 0, 396, 394, 1, 0, 0, 0, 396, 397, 1, 0, 0, 0, 397, 113, 1, 0, 0, 0, 398, 399, 5, 47, 0, 0, 399, 400, 5, 47, 0, 0, 400, 404, 1, 0, 0, 0, 401, 403, 8, 8, 0, 0, 402, 401, 1, 0, 0, 0, 403, 406, 1, 0, 0, 0, 404, 402, 1, 0, 0, 0, 404, 405, 1, 0, 0, 0, 405, 407, 1, 0, 0, 0, 406, 404, 1, 0, 0, 0, 407, 408, 6, 56, 1, 0, 408, 115, 1, 0, 0, 0, 409, 411, 3, 94, 46, 0, 410, 409, 1, 0, 0, 0, 411, 412, 1, 0, 0, 0, 412, 410, 1, 0, 0, 0, 412, 413, 1, 0, 0, 0, 413, 414, 1, 0, 0, 0, 414, 416, 5, 46, 0, 0, 415, 417, 3, 94, 46, 0, 416, 415, 1, 0, 0, 0, 417, 418, 1, 0, 0, 0, 418, 416, 1, 0, 0, 0, 418, 419, 1, 0, 0, 0, 419, 421, 1, 0, 0, 0, 420, 422, 3, 96, 47, 0, 421, 420, 1, 0, 0, 0, 421, 422, 1, 0, 0, 0, 422, 440, 1, 0, 0, 0, 423, 425, 3, 94, 46, 0, 424, 423, 1, 0, 0, 0, 425, 426, 1, 0, 0, 0, 426, 424, 1, 0, 0, 0, 426, 427, 1, 0, 0, 0, 427, 428, 1, 0, 0, 0, 428, 429, 3, 96, 47, 0, 429, 440, 1, 0, 0, 0, 430, 432, 5, 46, 0, 0, 431, 433, 3, 94, 46, 0, 432, 431, 1, 0, 0, 0, 433, 434, 1, 0, 0, 0, 434, 432, 1, 0, 0, 0, 434, 435, 1, 0, 0, 0, 435, 437, 1, 0, 0, 0, 436, 438, 3, 96, 47, 0, 437, 436, 1, 0, 0, 0, 437, 438, 1, 0, 0, 0, 438, 440, 1, 0, 0, 0, 439, 410, 1, 0, 0, 0, 439, 424, 1, 0, 0, 0, 439, 430, 1, 0, 0, 0, 440, 117, 1, 0, 0, 0, 441, 443, 3, 94, 46, 0, 442, 441, 1, 0, 0, 0, 443, 444, 1, 0, 0, 0, 444, 442, 1, 0, 0, 0, 444, 445, 1, 0, 0, 0, 445, 455, 1, 0, 0, 0, 446, 447, 5, 48, 0, 0, 447, 448, 5, 120, 0, 0, 448, 450, 1, 0, 0, 0, 449, 451, 3, 98, 48, 0, 450, 449, 1, 0, 0, 0, 451, 452, 1, 0, 0, 0, 452, 450, 1, 0, 0, 0, 452, 453, 1, 0, 0, 0, 453, 455, 1, 0, 0, 0, 454, 442, 1, 0, 0, 0, 454, 446, 1, 0, 0, 0, 455, 119, 1, 0, 0, 0, 456, 458, 3, 94, 46, 0, 457, 456, 1, 0, 0, 0, 458, 459, 1, 0, 0, 0, 459, 457, 1, 0, 0, 0, 459, 460, 1, 0, 0, 0, 460, 461, 1, 0, 0, 0, 461, 462, 7, 9, 0, 0, 462, 474, 1, 0, 0, 0, 463, 464, 5, 48, 0, 0, 464, 465, 5, 120, 0, 0, 465, 467, 1, 0, 0, 0, 466, 468, 3, 98, 48, 0, 467, 466, 1, 0, 0, 0, 468, 469, 1, 0, 0, 0, 469, 467, 1, 0, 0, 0, 469, 470, 1, 0, 0, 0, 470, 471, 1, 0, 0, 0, 471, 472, 7, 9, 0, 0, 472, 474, 1, 0, 0, 0, 473, 457, 1, 0, 0, 0, 473, 463, 1, 0, 0, 0, 474, 121, 1, 0, 0, 0, 475, 480, 5, 34, 0, 0, 476, 479, 3, 102, 50, 0, 477, 479, 8, 10, 0, 0, 478, 476, 1, 0, 0, 0, 478, 477, 1, 0, 0, 0, 479, 482, 1, 0, 0, 0, 480, 478, 1, 0, 0, 0, 480, 481, 1, 0, 0, 0, 481, 483, 1, 0, 0, 0, 482, 480, 1, 0, 0, 0, 483, 572, 5, 34, 0, 0, 484, 489, 5, 39, 0, 0, 485, 488, 3, 102, 50, 0, 486, 488, 8, 11, 0, 0, 487, 485, 1, 0, 0, 0, 487, 486, 1, 0, 0, 0, 488, 491, 1, 0, 0, 0, 489, 487, 1, 0, 0, 0, 489, 490, 1, 0, 0, 0, 490, 492, 1, 0, 0, 0, 491, 489, 1, 0, 0, 0, 492, 572, 5, 39, 0, 0, 493, 494, 5, 34, 0, 0, 494, 495, 5, 34, 0, 0, 495, 496, 5, 34, 0, 0, 496, 501, 1, 0, 0, 0, 497, 500, 3, 102, 50, 0, 498, 500, 8, 12, 0, 0, 499, 497, 1, 0, 0, 0, 499, 498, 1, 0, 0, 0, 500, 503, 1, 0, 0, 0, 501, 502, 1, 0, 0, 0, 501, 499, 1, 0, 0, 0, 502, 504, 1, 0, 0, 0, 503, 501, 1, 0, 0, 0, 504, 505, 5, 34, 0, 0, 505, 506, 5, 34, 0, 0, 506, 572, 5, 34, 0, 0, 507, 508, 5, 39, 0, 0, 508, 509, 5, 39, 0, 0, 509, 510, 5, 39, 0, 0, 510, 515, 1, 0, 0, 0, 511, 514, 3, 102, 50, 0, 512, 514, 8, 12, 0, 0, 513, 511, 1, 0, 0, 0, 513, 512, 1, 0, 0, 0, 514, 517, 1, 0, 0, 0, 515, 516, 1, 0, 0, 0, 515, 513, 1, 0, 0, 0, 516, 518, 1, 0, 0, 0, 517, 515, 1, 0, 0, 0, 518, 519, 5, 39, 0, 0, 519, 520, 5, 39, 0, 0, 520, 572, 5, 39, 0, 0, 521, 522, 3, 100, 49, 0, 522, 526, 5, 34, 0, 0, 523, 525, 8, 13, 0, 0, 524, 523, 1, 0, 0, 0, 525, 528, 1, 0, 0, 0, 526, 524, 1, 0, 0, 0, 526, 527, 1, 0, 0, 0, 527, 529, 1, 0, 0, 0, 528, 526, 1, 0, 0, 0, 529, 530, 5, 34, 0, 0, 530, 572, 1, 0, 0, 0, 531, 532, 3, 100, 49, 0, 532, 536, 5, 39, 0, 0, 533, 535, 8, 14, 0, 0, 534, 533, 1, 0, 0, 0, 535, 538, 1, 0, 0, 0, 536, 534, 1, 0, 0, 0, 536, 537, 1, 0, 0, 0, 537, 539, 1, 0, 0, 0, 538, 536, 1, 0, 0, 0, 539, 540, 5, 39, 0, 0, 540, 572, 1, 0, 0, 0, 541, 542, 3, 100, 49, 0, 542, 543, 5, 34, 0, 0, 543, 544, 5, 34, 0, 0, 544, 545, 5, 34, 0, 0, 545, 549, 1, 0, 0, 0, 546, 548, 9, 0, 0, 0, 547, 546, 1, 0, 0, 0, 548, 551, 1, 0, 0, 0, 549, 550, 1, 0, 0, 0, 549, 547, 1, 0, 0, 0, 550, 552, 1, 0, 0, 0, 551, 549, 1, 0, 0, 0, 552, 553, 5, 34, 0, 0, 553, 554, 5, 34, 0, 0, 554, 555, 5, 34, 0, 0, 555, 572, 1, 0, 0, 0, 556, 557, 3, 100, 49, 0, 557, 558, 5, 39, 0, 0, 558, 559, 5, 39, 0, 0, 559, 560, 5, 39, 0, 0, 560, 564, 1, 0, 0, 0, 561, 563, 9, 0, 0, 0, 562, 561, 1, 0, 0, 0, 563, 566, 1, 0, 0, 0, 564, 565, 1, 0, 0, 0, 564, 562, 1, 0, 0, 0, 565, 567, 1, 0, 0, 0, 566, 564, 1, 0, 0, 0, 567, 568, 5, 39, 0, 0, 568, 569, 5, 39, 0, 0, 569, 570, 5, 39, 0, 0, 570, 572, 1, 0, 0, 0, 571, 475, 1, 0, 0, 0, 571, 484, 1, 0, 0, 0, 571, 493, 1, 0, 0, 0, 571, 507, 1, 0, 0, 0, 571, 521, 1, 0, 0, 0, 571, 531, 1, 0, 0, 0, 571, 541, 1, 0, 0, 0, 571, 556, 1, 0, 0, 0, 572, 123, 1, 0, 0, 0, 573, 574, 7, 15, 0, 0, 574, 575, 3, 122, 60, 0, 575, 125, 1, 0, 0, 0, 576, 577, 5, 36, 0, 0, 577, 578, 5, 101, 0, 0, 578, 579, 5, 120, 0, 0, 579, 580, 5, 112, 0, 0, 580, 581, 5, 114, 0, 0, 581, 582, 5, 101, 0, 0, 582, 583, 5, 115, 0, 0, 583, 584, 5, 115, 0, 0, 584, 585, 5, 105, 0, 0, 585, 586, 5, 111, 0, 0, 586, 587, 5, 110, 0, 0, 587, 127, 1, 0, 0, 0, 588, 591, 3, 92, 45, 0, 589, 591, 5, 95, 0, 0, 590, 588, 1, 0, 0, 0, 590, 589, 1, 0, 0, 0, 591, 598, 1, 0, 0, 0, 592, 597, 3, 92, 45, 0, 593, 597, 3, 94, 46, 0, 594, 597, 5, 95, 0, 0, 595, 597, 3, 70, 34, 0, 596, 592, 1, 0, 0, 0, 596, 593, 1, 0, 0, 0, 596, 594, 1, 0, 0, 0, 596, 595, 1, 0, 0, 0, 597, 600, 1, 0, 0, 0, 598, 596, 1, 0, 0, 0, 598, 599, 1, 0, 0, 0, 599, 129, 1, 0, 0, 0, 600, 598, 1, 0, 0, 0, 601, 604, 3, 92, 45, 0, 602, 604, 5, 95, 0, 0, 603, 601, 1, 0, 0, 0, 603, 602, 1, 0, 0, 0, 604, 619, 1, 0, 0, 0, 605, 609, 3, 80, 39, 0, 606, 609, 3, 68, 33, 0, 607, 609, 3, 70, 34, 0, 608, 605, 1, 0, 0, 0, 608, 606, 1, 0, 0, 0, 608, 607, 1, 0, 0, 0, 608, 609, 1, 0, 0, 0, 609, 613, 1, 0, 0, 0, 610, 614, 3, 92, 45, 0, 611, 614, 3, 94, 46, 0, 612, 614, 5, 95, 0, 0, 613, 610, 1, 0, 0, 0, 613, 611, 1, 0, 0, 0, 613, 612, 1, 0, 0, 0, 614, 615, 1, 0, 0, 0, 615, 613, 1, 0, 0, 0, 615, 616, 1, 0, 0, 0, 616, 618, 1, 0, 0, 0, 617, 608, 1, 0, 0, 0, 618, 621, 1, 0, 0, 0, 619, 617, 1, 0, 0, 0, 619, 620, 1, 0, 0, 0, 620, 131, 1, 0, 0, 0, 621, 619, 1, 0, 0, 0, 622, 624, 3, 112, 55, 0, 623, 622, 1, 0, 0, 0, 623, 624, 1, 0, 0, 0, 624, 630, 1, 0, 0, 0, 625, 627, 5, 13, 0, 0, 626, 625, 1, 0, 0, 0, 626, 627, 1, 0, 0, 0, 627, 628, 1, 0, 0, 0, 628, 631, 5, 10, 0, 0, 629, 631, 2, 12, 13, 0, 630, 626, 1, 0, 0, 0, 630, 629, 1, 0, 0, 0, 631, 633, 1, 0, 0, 0, 632, 634, 3, 112, 55, 0, 633, 632, 1, 0, 0, 0, 633, 634, 1, 0, 0, 0, 634, 636, 1, 0, 0, 0, 635, 637, 3, 132, 65, 0, 636, 635, 1, 0, 0, 0, 636, 637, 1, 0, 0, 0, 637, 133, 1, 0, 0, 0, 638, 639, 3, 66, 32, 0, 639, 640, 1, 0, 0, 0, 640, 641, 6, 66, 2, 0, 641, 642, 6, 66, 3, 0, 642, 135, 1, 0, 0, 0, 643, 644, 5, 109, 0, 0, 644, 645, 5, 97, 0, 0, 645, 651, 5, 112, 0, 0, 646, 647, 5, 108, 0, 0, 647, 648, 5, 105, 0, 0, 648, 649, 5, 115, 0, 0, 649, 651, 5, 116, 0, 0, 650, 643, 1, 0, 0, 0, 650, 646, 1, 0, 0, 0, 651, 137, 1, 0, 0, 0, 652, 653, 5, 98, 0, 0, 653, 654, 5, 111, 0, 0, 654, 655, 5, 111, 0, 0, 655, 702, 5, 108, 0, 0, 656, 657, 5, 115, 0, 0, 657, 658, 5, 116, 0, 0, 658, 659, 5, 114, 0, 0, 659, 660, 5, 105, 0, 0, 660, 661, 5, 110, 0, 0, 661, 702, 5, 103, 0, 0, 662, 663, 5, 105, 0, 0, 663, 664, 5, 110, 0, 0, 664, 702, 5, 116, 0, 0, 665, 666, 5, 117, 0, 0, 666, 667, 5, 105, 0, 0, 667, 668, 5, 110, 0, 0, 668, 702, 5, 116, 0, 0, 669, 670, 5, 100, 0, 0, 670, 671, 5, 111, 0, 0, 671, 672, 5, 117, 0, 0, 672, 673, 5, 98, 0, 0, 673, 674, 5, 108, 0, 0, 674, 702, 5, 101, 0, 0, 675, 676, 5, 100, 0, 0, 676, 677, 5, 117, 0, 0, 677, 678, 5, 114, 0, 0, 678, 679, 5, 97, 0, 0, 679, 680, 5, 116, 0, 0, 680, 681, 5, 105, 0, 0, 681, 682, 5, 111, 0, 0, 682, 702, 5, 110, 0, 0, 683, 684, 5, 116, 0, 0, 684, 685, 5, 105, 0, 0, 685, 686, 5, 109, 0, 0, 686, 687, 5, 101, 0, 0, 687, 688, 5, 115, 0, 0, 688, 689, 5, 116, 0, 0, 689, 690, 5, 97, 0, 0, 690, 691, 5, 109, 0, 0, 691, 702, 5, 112, 0, 0, 692, 693, 5, 105, 0, 0, 693, 694, 5, 112, 0, 0, 694, 695, 5, 97, 0, 0, 695, 696, 5, 100, 0, 0, 696, 697, 5, 100, 0, 0, 697, 698, 5, 114, 0, 0, 698, 699, 5, 101, 0, 0, 699, 700, 5, 115, 0, 0, 700, 702, 5, 115, 0, 0, 701, 652, 1, 0, 0, 0, 701, 656, 1, 0, 0, 0, 701, 662, 1, 0, 0, 0, 701, 665, 1, 0, 0, 0, 701, 669, 1, 0, 0, 0, 701, 675, 1, 0, 0, 0, 701, 683, 1, 0, 0, 0, 701, 692, 1, 0, 0, 0, 702, 139, 1, 0, 0, 0, 703, 704, 3, 44, 21, 0, 704, 705, 1, 0, 0, 0, 705, 706, 6, 69, 4, 0, 706, 141, 1, 0, 0, 0, 707, 708, 3, 50, 24, 0, 708, 709, 1, 0, 0, 0, 709, 710, 6, 70, 5, 0, 710, 143, 1, 0, 0, 0, 711, 712, 3, 64, 31, 0, 712, 713, 1, 0, 0, 0, 713, 714, 6, 71, 6, 0, 714, 145, 1, 0, 0, 0, 715, 716, 3, 4, 1, 0, 716, 717, 1, 0, 0, 0, 717, 718, 6, 72, 7, 0, 718, 147, 1, 0, 0, 0, 719, 720, 3, 6, 2, 0, 720, 721, 1, 0, 0, 0, 721, 722, 6, 73, 8, 0, 722, 149, 1, 0, 0, 0, 723, 724, 3, 112, 55, 0, 724, 725, 1, 0, 0, 0, 725, 726, 6, 74, 9, 0, 726, 151, 1, 0, 0, 0, 727, 728, 3, 128, 63, 0, 728, 729, 1, 0, 0, 0, 729, 730, 6, 75, 10, 0, 730, 153, 1, 0, 0, 0, 51, 0, 1, 203, 209, 343, 348, 358, 391, 396, 404, 412, 418, 421, 426, 434, 437, 439, 444, 452, 454, 459, 469, 473, 478, 480, 487, 489, 499, 501, 513, 515, 526, 536, 549, 564, 571, 590, 596, 598, 603, 608, 613, 615, 619, 623, 626, 630, 633, 636, 650, 701, 11, 5, 1, 0, 0, 1, 0, 7, 8, 0, 4, 0, 0, 7, 3, 0, 7, 4, 0, 7, 7, 0, 7, 1, 0, 7, 2, 0, 7, 9, 0, 7, 10, 0] \ No newline at end of file diff --git a/pkg/java/src/main/gen/dev/openfga/language/antlr/OpenFGALexer.java b/pkg/java/src/main/gen/dev/openfga/language/antlr/OpenFGALexer.java index b62eea80..a9d63406 100644 --- a/pkg/java/src/main/gen/dev/openfga/language/antlr/OpenFGALexer.java +++ b/pkg/java/src/main/gen/dev/openfga/language/antlr/OpenFGALexer.java @@ -25,8 +25,8 @@ public class OpenFGALexer extends Lexer { LOGICAL_OR=33, RPRACKET=34, LBRACE=35, RBRACE=36, DOT=37, MINUS=38, EXCLAM=39, QUESTIONMARK=40, PLUS=41, STAR=42, SLASH=43, PERCENT=44, CEL_TRUE=45, CEL_FALSE=46, NUL=47, CEL_COMMENT=48, NUM_FLOAT=49, NUM_INT=50, NUM_UINT=51, - STRING=52, BYTES=53, EXTENDED_IDENTIFIER=54, NEWLINE=55, CONDITION_PARAM_CONTAINER=56, - CONDITION_PARAM_TYPE=57; + STRING=52, BYTES=53, DOLLAR_EXPRESSION=54, EXTENDED_IDENTIFIER=55, NEWLINE=56, + CONDITION_PARAM_CONTAINER=57, CONDITION_PARAM_TYPE=58; public static final int CONDITION_DEF=1; public static String[] channelNames = { @@ -48,10 +48,10 @@ private static String[] makeRuleNames() { "CEL_TRUE", "CEL_FALSE", "NUL", "BACKSLASH", "LETTER", "DIGIT", "EXPONENT", "HEXDIGIT", "RAW", "ESC_SEQ", "ESC_CHAR_SEQ", "ESC_OCT_SEQ", "ESC_BYTE_SEQ", "ESC_UNI_SEQ", "WHITESPACE", "CEL_COMMENT", "NUM_FLOAT", "NUM_INT", "NUM_UINT", - "STRING", "BYTES", "IDENTIFIER", "EXTENDED_IDENTIFIER", "NEWLINE", "CONDITION_DEF_END", - "CONDITION_PARAM_CONTAINER", "CONDITION_PARAM_TYPE", "CONDITION_PARAM_TYPE_LESS", - "CONDITION_PARAM_TYPE_GREATER", "CONDITION_OPEN", "CONDITION_COLON", - "CONDITION_COMMA", "CONDITION_WS", "CONDITION_NAME" + "STRING", "BYTES", "DOLLAR_EXPRESSION", "IDENTIFIER", "EXTENDED_IDENTIFIER", + "NEWLINE", "CONDITION_DEF_END", "CONDITION_PARAM_CONTAINER", "CONDITION_PARAM_TYPE", + "CONDITION_PARAM_TYPE_LESS", "CONDITION_PARAM_TYPE_GREATER", "CONDITION_OPEN", + "CONDITION_COLON", "CONDITION_COMMA", "CONDITION_WS", "CONDITION_NAME" }; } public static final String[] ruleNames = makeRuleNames(); @@ -63,7 +63,8 @@ private static String[] makeLiteralNames() { "'schema'", null, "'extend'", "'type'", "'condition'", "'relations'", "'relation'", "'define'", "'with'", "'=='", "'!='", "'in'", "'<='", "'>='", "'&&'", "'||'", "']'", "'{'", "'}'", "'.'", "'-'", "'!'", "'?'", "'+'", - "'*'", "'/'", "'%'", "'true'", "'false'", "'null'" + "'*'", "'/'", "'%'", "'true'", "'false'", "'null'", null, null, null, + null, null, null, "'$expression'" }; } private static final String[] _LITERAL_NAMES = makeLiteralNames(); @@ -76,8 +77,8 @@ private static String[] makeSymbolicNames() { "NOT_EQUALS", "IN", "LESS_EQUALS", "GREATER_EQUALS", "LOGICAL_AND", "LOGICAL_OR", "RPRACKET", "LBRACE", "RBRACE", "DOT", "MINUS", "EXCLAM", "QUESTIONMARK", "PLUS", "STAR", "SLASH", "PERCENT", "CEL_TRUE", "CEL_FALSE", "NUL", "CEL_COMMENT", - "NUM_FLOAT", "NUM_INT", "NUM_UINT", "STRING", "BYTES", "EXTENDED_IDENTIFIER", - "NEWLINE", "CONDITION_PARAM_CONTAINER", "CONDITION_PARAM_TYPE" + "NUM_FLOAT", "NUM_INT", "NUM_UINT", "STRING", "BYTES", "DOLLAR_EXPRESSION", + "EXTENDED_IDENTIFIER", "NEWLINE", "CONDITION_PARAM_CONTAINER", "CONDITION_PARAM_TYPE" }; } private static final String[] _SYMBOLIC_NAMES = makeSymbolicNames(); @@ -139,7 +140,7 @@ public OpenFGALexer(CharStream input) { public ATN getATN() { return _ATN; } public static final String _serializedATN = - "\u0004\u00009\u02cd\u0006\uffff\uffff\u0006\uffff\uffff\u0002\u0000\u0007"+ + "\u0004\u0000:\u02db\u0006\uffff\uffff\u0006\uffff\uffff\u0002\u0000\u0007"+ "\u0000\u0002\u0001\u0007\u0001\u0002\u0002\u0007\u0002\u0002\u0003\u0007"+ "\u0003\u0002\u0004\u0007\u0004\u0002\u0005\u0007\u0005\u0002\u0006\u0007"+ "\u0006\u0002\u0007\u0007\u0007\u0002\b\u0007\b\u0002\t\u0007\t\u0002\n"+ @@ -158,440 +159,447 @@ public OpenFGALexer(CharStream input) { "9\u00079\u0002:\u0007:\u0002;\u0007;\u0002<\u0007<\u0002=\u0007=\u0002"+ ">\u0007>\u0002?\u0007?\u0002@\u0007@\u0002A\u0007A\u0002B\u0007B\u0002"+ "C\u0007C\u0002D\u0007D\u0002E\u0007E\u0002F\u0007F\u0002G\u0007G\u0002"+ - "H\u0007H\u0002I\u0007I\u0002J\u0007J\u0001\u0000\u0001\u0000\u0001\u0001"+ - "\u0001\u0001\u0001\u0002\u0001\u0002\u0001\u0003\u0001\u0003\u0001\u0003"+ - "\u0001\u0003\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0005\u0001\u0005"+ + "H\u0007H\u0002I\u0007I\u0002J\u0007J\u0002K\u0007K\u0001\u0000\u0001\u0000"+ + "\u0001\u0001\u0001\u0001\u0001\u0002\u0001\u0002\u0001\u0003\u0001\u0003"+ + "\u0001\u0003\u0001\u0003\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0005"+ "\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005"+ - "\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0007"+ + "\u0001\u0005\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006"+ "\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007"+ - "\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\t\u0001\t\u0001"+ - "\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\n\u0004\n\u00c8\b\n\u000b\n\f"+ - "\n\u00c9\u0001\n\u0001\n\u0004\n\u00ce\b\n\u000b\n\f\n\u00cf\u0001\u000b"+ - "\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b"+ - "\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\r\u0001\r\u0001\r\u0001"+ - "\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001"+ - "\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001"+ - "\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000f\u0001\u000f\u0001"+ - "\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001"+ - "\u000f\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001"+ - "\u0010\u0001\u0010\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001"+ - "\u0011\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0013\u0001\u0013\u0001"+ - "\u0013\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0015\u0001\u0015\u0001"+ - "\u0016\u0001\u0016\u0001\u0016\u0001\u0017\u0001\u0017\u0001\u0017\u0001"+ - "\u0018\u0001\u0018\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u001a\u0001"+ - "\u001a\u0001\u001a\u0001\u001b\u0001\u001b\u0001\u001c\u0001\u001c\u0001"+ - "\u001d\u0001\u001d\u0001\u001e\u0001\u001e\u0001\u001f\u0001\u001f\u0001"+ - " \u0001 \u0001!\u0001!\u0001\"\u0001\"\u0001#\u0001#\u0001$\u0001$\u0001"+ - "%\u0001%\u0001&\u0001&\u0001\'\u0001\'\u0001(\u0001(\u0001)\u0001)\u0001"+ - ")\u0001)\u0001)\u0001*\u0001*\u0001*\u0001*\u0001*\u0001*\u0001+\u0001"+ - "+\u0001+\u0001+\u0001+\u0001,\u0001,\u0001-\u0001-\u0001.\u0001.\u0001"+ - "/\u0001/\u0003/\u0156\b/\u0001/\u0004/\u0159\b/\u000b/\f/\u015a\u0001"+ - "0\u00010\u00011\u00011\u00012\u00012\u00012\u00012\u00032\u0165\b2\u0001"+ - "3\u00013\u00013\u00014\u00014\u00014\u00014\u00014\u00015\u00015\u0001"+ - "5\u00015\u00015\u00016\u00016\u00016\u00016\u00016\u00016\u00016\u0001"+ + "\u0001\u0007\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\t\u0001"+ + "\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\n\u0004\n\u00ca\b\n\u000b"+ + "\n\f\n\u00cb\u0001\n\u0001\n\u0004\n\u00d0\b\n\u000b\n\f\n\u00d1\u0001"+ + "\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001"+ + "\u000b\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\r\u0001\r\u0001\r"+ + "\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001"+ + "\r\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e"+ + "\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000f\u0001\u000f"+ + "\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f"+ + "\u0001\u000f\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010"+ + "\u0001\u0010\u0001\u0010\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011"+ + "\u0001\u0011\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0013\u0001\u0013"+ + "\u0001\u0013\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0015\u0001\u0015"+ + "\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0017\u0001\u0017\u0001\u0017"+ + "\u0001\u0018\u0001\u0018\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u001a"+ + "\u0001\u001a\u0001\u001a\u0001\u001b\u0001\u001b\u0001\u001c\u0001\u001c"+ + "\u0001\u001d\u0001\u001d\u0001\u001e\u0001\u001e\u0001\u001f\u0001\u001f"+ + "\u0001 \u0001 \u0001!\u0001!\u0001\"\u0001\"\u0001#\u0001#\u0001$\u0001"+ + "$\u0001%\u0001%\u0001&\u0001&\u0001\'\u0001\'\u0001(\u0001(\u0001)\u0001"+ + ")\u0001)\u0001)\u0001)\u0001*\u0001*\u0001*\u0001*\u0001*\u0001*\u0001"+ + "+\u0001+\u0001+\u0001+\u0001+\u0001,\u0001,\u0001-\u0001-\u0001.\u0001"+ + ".\u0001/\u0001/\u0003/\u0158\b/\u0001/\u0004/\u015b\b/\u000b/\f/\u015c"+ + "\u00010\u00010\u00011\u00011\u00012\u00012\u00012\u00012\u00032\u0167"+ + "\b2\u00013\u00013\u00013\u00014\u00014\u00014\u00014\u00014\u00015\u0001"+ + "5\u00015\u00015\u00015\u00016\u00016\u00016\u00016\u00016\u00016\u0001"+ "6\u00016\u00016\u00016\u00016\u00016\u00016\u00016\u00016\u00016\u0001"+ - "6\u00036\u0186\b6\u00017\u00047\u0189\b7\u000b7\f7\u018a\u00018\u0001"+ - "8\u00018\u00018\u00058\u0191\b8\n8\f8\u0194\t8\u00018\u00018\u00019\u0004"+ - "9\u0199\b9\u000b9\f9\u019a\u00019\u00019\u00049\u019f\b9\u000b9\f9\u01a0"+ - "\u00019\u00039\u01a4\b9\u00019\u00049\u01a7\b9\u000b9\f9\u01a8\u00019"+ - "\u00019\u00019\u00019\u00049\u01af\b9\u000b9\f9\u01b0\u00019\u00039\u01b4"+ - "\b9\u00039\u01b6\b9\u0001:\u0004:\u01b9\b:\u000b:\f:\u01ba\u0001:\u0001"+ - ":\u0001:\u0001:\u0004:\u01c1\b:\u000b:\f:\u01c2\u0003:\u01c5\b:\u0001"+ - ";\u0004;\u01c8\b;\u000b;\f;\u01c9\u0001;\u0001;\u0001;\u0001;\u0001;\u0001"+ - ";\u0004;\u01d2\b;\u000b;\f;\u01d3\u0001;\u0001;\u0003;\u01d8\b;\u0001"+ - "<\u0001<\u0001<\u0005<\u01dd\b<\n<\f<\u01e0\t<\u0001<\u0001<\u0001<\u0001"+ - "<\u0005<\u01e6\b<\n<\f<\u01e9\t<\u0001<\u0001<\u0001<\u0001<\u0001<\u0001"+ - "<\u0001<\u0005<\u01f2\b<\n<\f<\u01f5\t<\u0001<\u0001<\u0001<\u0001<\u0001"+ - "<\u0001<\u0001<\u0001<\u0001<\u0005<\u0200\b<\n<\f<\u0203\t<\u0001<\u0001"+ - "<\u0001<\u0001<\u0001<\u0001<\u0005<\u020b\b<\n<\f<\u020e\t<\u0001<\u0001"+ - "<\u0001<\u0001<\u0001<\u0005<\u0215\b<\n<\f<\u0218\t<\u0001<\u0001<\u0001"+ - "<\u0001<\u0001<\u0001<\u0001<\u0001<\u0005<\u0222\b<\n<\f<\u0225\t<\u0001"+ - "<\u0001<\u0001<\u0001<\u0001<\u0001<\u0001<\u0001<\u0001<\u0001<\u0005"+ - "<\u0231\b<\n<\f<\u0234\t<\u0001<\u0001<\u0001<\u0001<\u0003<\u023a\b<"+ - "\u0001=\u0001=\u0001=\u0001>\u0001>\u0003>\u0241\b>\u0001>\u0001>\u0001"+ - ">\u0001>\u0005>\u0247\b>\n>\f>\u024a\t>\u0001?\u0001?\u0003?\u024e\b?"+ - "\u0001?\u0001?\u0001?\u0003?\u0253\b?\u0001?\u0001?\u0001?\u0004?\u0258"+ - "\b?\u000b?\f?\u0259\u0005?\u025c\b?\n?\f?\u025f\t?\u0001@\u0003@\u0262"+ - "\b@\u0001@\u0003@\u0265\b@\u0001@\u0001@\u0003@\u0269\b@\u0001@\u0003"+ - "@\u026c\b@\u0001@\u0003@\u026f\b@\u0001A\u0001A\u0001A\u0001A\u0001A\u0001"+ - "B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0003B\u027d\bB\u0001C\u0001"+ - "C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001"+ - "C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001"+ - "C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001"+ - "C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001"+ - "C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0003C\u02b0\bC\u0001"+ - "D\u0001D\u0001D\u0001D\u0001E\u0001E\u0001E\u0001E\u0001F\u0001F\u0001"+ - "F\u0001F\u0001G\u0001G\u0001G\u0001G\u0001H\u0001H\u0001H\u0001H\u0001"+ - "I\u0001I\u0001I\u0001I\u0001J\u0001J\u0001J\u0001J\u0004\u01f3\u0201\u0223"+ - "\u0232\u0000K\u0002\u000b\u0004\u0001\u0006\u0002\b\f\n\r\f\u000e\u000e"+ - "\u000f\u0010\u0010\u0012\u0011\u0014\u0012\u0016\u0013\u0018\u0014\u001a"+ - "\u0015\u001c\u0016\u001e\u0017 \u0018\"\u0019$\u001a&\u001b(\u001c*\u001d"+ - ",\u0003.\u001e0\u001f2\u00044 6!8\u0005:\"<#>$@\u0007B\bD%F&H\'J(L)N*"+ - "P+R,T-V.X/Z\u0000\\\u0000^\u0000`\u0000b\u0000d\u0000f\u0000h\u0000j\u0000"+ - "l\u0000n\u0000p\tr0t1v2x3z4|5~\n\u00806\u00827\u0084\u0000\u00868\u0088"+ - "9\u008a\u0000\u008c\u0000\u008e\u0000\u0090\u0000\u0092\u0000\u0094\u0000"+ - "\u0096\u0000\u0002\u0000\u0001\u0010\u0002\u0000AZaz\u0002\u0000EEee\u0002"+ - "\u0000++--\u0003\u000009AFaf\u0002\u0000RRrr\n\u0000\"\"\'\'??\\\\`bf"+ - "fnnrrttvv\u0002\u0000XXxx\u0003\u0000\t\t\f\f \u0001\u0000\n\n\u0002"+ - "\u0000UUuu\u0004\u0000\n\n\r\r\"\"\\\\\u0004\u0000\n\n\r\r\'\'\\\\\u0001"+ - "\u0000\\\\\u0003\u0000\n\n\r\r\"\"\u0003\u0000\n\n\r\r\'\'\u0002\u0000"+ - "BBbb\u0305\u0000\u0002\u0001\u0000\u0000\u0000\u0000\u0004\u0001\u0000"+ - "\u0000\u0000\u0000\u0006\u0001\u0000\u0000\u0000\u0000\b\u0001\u0000\u0000"+ - "\u0000\u0000\n\u0001\u0000\u0000\u0000\u0000\f\u0001\u0000\u0000\u0000"+ - "\u0000\u000e\u0001\u0000\u0000\u0000\u0000\u0010\u0001\u0000\u0000\u0000"+ - "\u0000\u0012\u0001\u0000\u0000\u0000\u0000\u0014\u0001\u0000\u0000\u0000"+ - "\u0000\u0016\u0001\u0000\u0000\u0000\u0000\u0018\u0001\u0000\u0000\u0000"+ - "\u0000\u001a\u0001\u0000\u0000\u0000\u0000\u001c\u0001\u0000\u0000\u0000"+ - "\u0000\u001e\u0001\u0000\u0000\u0000\u0000 \u0001\u0000\u0000\u0000\u0000"+ - "\"\u0001\u0000\u0000\u0000\u0000$\u0001\u0000\u0000\u0000\u0000&\u0001"+ - "\u0000\u0000\u0000\u0000(\u0001\u0000\u0000\u0000\u0000*\u0001\u0000\u0000"+ - "\u0000\u0000,\u0001\u0000\u0000\u0000\u0000.\u0001\u0000\u0000\u0000\u0000"+ - "0\u0001\u0000\u0000\u0000\u00002\u0001\u0000\u0000\u0000\u00004\u0001"+ - "\u0000\u0000\u0000\u00006\u0001\u0000\u0000\u0000\u00008\u0001\u0000\u0000"+ - "\u0000\u0000:\u0001\u0000\u0000\u0000\u0000<\u0001\u0000\u0000\u0000\u0000"+ - ">\u0001\u0000\u0000\u0000\u0000@\u0001\u0000\u0000\u0000\u0000B\u0001"+ - "\u0000\u0000\u0000\u0000D\u0001\u0000\u0000\u0000\u0000F\u0001\u0000\u0000"+ - "\u0000\u0000H\u0001\u0000\u0000\u0000\u0000J\u0001\u0000\u0000\u0000\u0000"+ - "L\u0001\u0000\u0000\u0000\u0000N\u0001\u0000\u0000\u0000\u0000P\u0001"+ - "\u0000\u0000\u0000\u0000R\u0001\u0000\u0000\u0000\u0000T\u0001\u0000\u0000"+ - "\u0000\u0000V\u0001\u0000\u0000\u0000\u0000X\u0001\u0000\u0000\u0000\u0000"+ - "p\u0001\u0000\u0000\u0000\u0000r\u0001\u0000\u0000\u0000\u0000t\u0001"+ - "\u0000\u0000\u0000\u0000v\u0001\u0000\u0000\u0000\u0000x\u0001\u0000\u0000"+ - "\u0000\u0000z\u0001\u0000\u0000\u0000\u0000|\u0001\u0000\u0000\u0000\u0000"+ - "~\u0001\u0000\u0000\u0000\u0000\u0080\u0001\u0000\u0000\u0000\u0000\u0082"+ - "\u0001\u0000\u0000\u0000\u0001\u0084\u0001\u0000\u0000\u0000\u0001\u0086"+ - "\u0001\u0000\u0000\u0000\u0001\u0088\u0001\u0000\u0000\u0000\u0001\u008a"+ - "\u0001\u0000\u0000\u0000\u0001\u008c\u0001\u0000\u0000\u0000\u0001\u008e"+ - "\u0001\u0000\u0000\u0000\u0001\u0090\u0001\u0000\u0000\u0000\u0001\u0092"+ - "\u0001\u0000\u0000\u0000\u0001\u0094\u0001\u0000\u0000\u0000\u0001\u0096"+ - "\u0001\u0000\u0000\u0000\u0002\u0098\u0001\u0000\u0000\u0000\u0004\u009a"+ - "\u0001\u0000\u0000\u0000\u0006\u009c\u0001\u0000\u0000\u0000\b\u009e\u0001"+ - "\u0000\u0000\u0000\n\u00a2\u0001\u0000\u0000\u0000\f\u00a5\u0001\u0000"+ - "\u0000\u0000\u000e\u00ad\u0001\u0000\u0000\u0000\u0010\u00b2\u0001\u0000"+ - "\u0000\u0000\u0012\u00b9\u0001\u0000\u0000\u0000\u0014\u00bf\u0001\u0000"+ - "\u0000\u0000\u0016\u00c7\u0001\u0000\u0000\u0000\u0018\u00d1\u0001\u0000"+ - "\u0000\u0000\u001a\u00d8\u0001\u0000\u0000\u0000\u001c\u00dd\u0001\u0000"+ - "\u0000\u0000\u001e\u00e9\u0001\u0000\u0000\u0000 \u00f3\u0001\u0000\u0000"+ - "\u0000\"\u00fc\u0001\u0000\u0000\u0000$\u0103\u0001\u0000\u0000\u0000"+ - "&\u0108\u0001\u0000\u0000\u0000(\u010b\u0001\u0000\u0000\u0000*\u010e"+ - "\u0001\u0000\u0000\u0000,\u0111\u0001\u0000\u0000\u0000.\u0113\u0001\u0000"+ - "\u0000\u00000\u0116\u0001\u0000\u0000\u00002\u0119\u0001\u0000\u0000\u0000"+ - "4\u011b\u0001\u0000\u0000\u00006\u011e\u0001\u0000\u0000\u00008\u0121"+ - "\u0001\u0000\u0000\u0000:\u0123\u0001\u0000\u0000\u0000<\u0125\u0001\u0000"+ - "\u0000\u0000>\u0127\u0001\u0000\u0000\u0000@\u0129\u0001\u0000\u0000\u0000"+ - "B\u012b\u0001\u0000\u0000\u0000D\u012d\u0001\u0000\u0000\u0000F\u012f"+ - "\u0001\u0000\u0000\u0000H\u0131\u0001\u0000\u0000\u0000J\u0133\u0001\u0000"+ - "\u0000\u0000L\u0135\u0001\u0000\u0000\u0000N\u0137\u0001\u0000\u0000\u0000"+ - "P\u0139\u0001\u0000\u0000\u0000R\u013b\u0001\u0000\u0000\u0000T\u013d"+ - "\u0001\u0000\u0000\u0000V\u0142\u0001\u0000\u0000\u0000X\u0148\u0001\u0000"+ - "\u0000\u0000Z\u014d\u0001\u0000\u0000\u0000\\\u014f\u0001\u0000\u0000"+ - "\u0000^\u0151\u0001\u0000\u0000\u0000`\u0153\u0001\u0000\u0000\u0000b"+ - "\u015c\u0001\u0000\u0000\u0000d\u015e\u0001\u0000\u0000\u0000f\u0164\u0001"+ - "\u0000\u0000\u0000h\u0166\u0001\u0000\u0000\u0000j\u0169\u0001\u0000\u0000"+ - "\u0000l\u016e\u0001\u0000\u0000\u0000n\u0185\u0001\u0000\u0000\u0000p"+ - "\u0188\u0001\u0000\u0000\u0000r\u018c\u0001\u0000\u0000\u0000t\u01b5\u0001"+ - "\u0000\u0000\u0000v\u01c4\u0001\u0000\u0000\u0000x\u01d7\u0001\u0000\u0000"+ - "\u0000z\u0239\u0001\u0000\u0000\u0000|\u023b\u0001\u0000\u0000\u0000~"+ - "\u0240\u0001\u0000\u0000\u0000\u0080\u024d\u0001\u0000\u0000\u0000\u0082"+ - "\u0261\u0001\u0000\u0000\u0000\u0084\u0270\u0001\u0000\u0000\u0000\u0086"+ - "\u027c\u0001\u0000\u0000\u0000\u0088\u02af\u0001\u0000\u0000\u0000\u008a"+ - "\u02b1\u0001\u0000\u0000\u0000\u008c\u02b5\u0001\u0000\u0000\u0000\u008e"+ - "\u02b9\u0001\u0000\u0000\u0000\u0090\u02bd\u0001\u0000\u0000\u0000\u0092"+ - "\u02c1\u0001\u0000\u0000\u0000\u0094\u02c5\u0001\u0000\u0000\u0000\u0096"+ - "\u02c9\u0001\u0000\u0000\u0000\u0098\u0099\u0005#\u0000\u0000\u0099\u0003"+ - "\u0001\u0000\u0000\u0000\u009a\u009b\u0005:\u0000\u0000\u009b\u0005\u0001"+ - "\u0000\u0000\u0000\u009c\u009d\u0005,\u0000\u0000\u009d\u0007\u0001\u0000"+ - "\u0000\u0000\u009e\u009f\u0005a\u0000\u0000\u009f\u00a0\u0005n\u0000\u0000"+ - "\u00a0\u00a1\u0005d\u0000\u0000\u00a1\t\u0001\u0000\u0000\u0000\u00a2"+ - "\u00a3\u0005o\u0000\u0000\u00a3\u00a4\u0005r\u0000\u0000\u00a4\u000b\u0001"+ - "\u0000\u0000\u0000\u00a5\u00a6\u0005b\u0000\u0000\u00a6\u00a7\u0005u\u0000"+ - "\u0000\u00a7\u00a8\u0005t\u0000\u0000\u00a8\u00a9\u0005 \u0000\u0000\u00a9"+ - "\u00aa\u0005n\u0000\u0000\u00aa\u00ab\u0005o\u0000\u0000\u00ab\u00ac\u0005"+ - "t\u0000\u0000\u00ac\r\u0001\u0000\u0000\u0000\u00ad\u00ae\u0005f\u0000"+ - "\u0000\u00ae\u00af\u0005r\u0000\u0000\u00af\u00b0\u0005o\u0000\u0000\u00b0"+ - "\u00b1\u0005m\u0000\u0000\u00b1\u000f\u0001\u0000\u0000\u0000\u00b2\u00b3"+ - "\u0005m\u0000\u0000\u00b3\u00b4\u0005o\u0000\u0000\u00b4\u00b5\u0005d"+ - "\u0000\u0000\u00b5\u00b6\u0005u\u0000\u0000\u00b6\u00b7\u0005l\u0000\u0000"+ - "\u00b7\u00b8\u0005e\u0000\u0000\u00b8\u0011\u0001\u0000\u0000\u0000\u00b9"+ - "\u00ba\u0005m\u0000\u0000\u00ba\u00bb\u0005o\u0000\u0000\u00bb\u00bc\u0005"+ - "d\u0000\u0000\u00bc\u00bd\u0005e\u0000\u0000\u00bd\u00be\u0005l\u0000"+ - "\u0000\u00be\u0013\u0001\u0000\u0000\u0000\u00bf\u00c0\u0005s\u0000\u0000"+ - "\u00c0\u00c1\u0005c\u0000\u0000\u00c1\u00c2\u0005h\u0000\u0000\u00c2\u00c3"+ - "\u0005e\u0000\u0000\u00c3\u00c4\u0005m\u0000\u0000\u00c4\u00c5\u0005a"+ - "\u0000\u0000\u00c5\u0015\u0001\u0000\u0000\u0000\u00c6\u00c8\u0003^.\u0000"+ - "\u00c7\u00c6\u0001\u0000\u0000\u0000\u00c8\u00c9\u0001\u0000\u0000\u0000"+ - "\u00c9\u00c7\u0001\u0000\u0000\u0000\u00c9\u00ca\u0001\u0000\u0000\u0000"+ - "\u00ca\u00cb\u0001\u0000\u0000\u0000\u00cb\u00cd\u0005.\u0000\u0000\u00cc"+ - "\u00ce\u0003^.\u0000\u00cd\u00cc\u0001\u0000\u0000\u0000\u00ce\u00cf\u0001"+ - "\u0000\u0000\u0000\u00cf\u00cd\u0001\u0000\u0000\u0000\u00cf\u00d0\u0001"+ - "\u0000\u0000\u0000\u00d0\u0017\u0001\u0000\u0000\u0000\u00d1\u00d2\u0005"+ - "e\u0000\u0000\u00d2\u00d3\u0005x\u0000\u0000\u00d3\u00d4\u0005t\u0000"+ - "\u0000\u00d4\u00d5\u0005e\u0000\u0000\u00d5\u00d6\u0005n\u0000\u0000\u00d6"+ - "\u00d7\u0005d\u0000\u0000\u00d7\u0019\u0001\u0000\u0000\u0000\u00d8\u00d9"+ - "\u0005t\u0000\u0000\u00d9\u00da\u0005y\u0000\u0000\u00da\u00db\u0005p"+ - "\u0000\u0000\u00db\u00dc\u0005e\u0000\u0000\u00dc\u001b\u0001\u0000\u0000"+ - "\u0000\u00dd\u00de\u0005c\u0000\u0000\u00de\u00df\u0005o\u0000\u0000\u00df"+ - "\u00e0\u0005n\u0000\u0000\u00e0\u00e1\u0005d\u0000\u0000\u00e1\u00e2\u0005"+ - "i\u0000\u0000\u00e2\u00e3\u0005t\u0000\u0000\u00e3\u00e4\u0005i\u0000"+ - "\u0000\u00e4\u00e5\u0005o\u0000\u0000\u00e5\u00e6\u0005n\u0000\u0000\u00e6"+ - "\u00e7\u0001\u0000\u0000\u0000\u00e7\u00e8\u0006\r\u0000\u0000\u00e8\u001d"+ - "\u0001\u0000\u0000\u0000\u00e9\u00ea\u0005r\u0000\u0000\u00ea\u00eb\u0005"+ - "e\u0000\u0000\u00eb\u00ec\u0005l\u0000\u0000\u00ec\u00ed\u0005a\u0000"+ - "\u0000\u00ed\u00ee\u0005t\u0000\u0000\u00ee\u00ef\u0005i\u0000\u0000\u00ef"+ - "\u00f0\u0005o\u0000\u0000\u00f0\u00f1\u0005n\u0000\u0000\u00f1\u00f2\u0005"+ - "s\u0000\u0000\u00f2\u001f\u0001\u0000\u0000\u0000\u00f3\u00f4\u0005r\u0000"+ - "\u0000\u00f4\u00f5\u0005e\u0000\u0000\u00f5\u00f6\u0005l\u0000\u0000\u00f6"+ - "\u00f7\u0005a\u0000\u0000\u00f7\u00f8\u0005t\u0000\u0000\u00f8\u00f9\u0005"+ - "i\u0000\u0000\u00f9\u00fa\u0005o\u0000\u0000\u00fa\u00fb\u0005n\u0000"+ - "\u0000\u00fb!\u0001\u0000\u0000\u0000\u00fc\u00fd\u0005d\u0000\u0000\u00fd"+ - "\u00fe\u0005e\u0000\u0000\u00fe\u00ff\u0005f\u0000\u0000\u00ff\u0100\u0005"+ - "i\u0000\u0000\u0100\u0101\u0005n\u0000\u0000\u0101\u0102\u0005e\u0000"+ - "\u0000\u0102#\u0001\u0000\u0000\u0000\u0103\u0104\u0005w\u0000\u0000\u0104"+ - "\u0105\u0005i\u0000\u0000\u0105\u0106\u0005t\u0000\u0000\u0106\u0107\u0005"+ - "h\u0000\u0000\u0107%\u0001\u0000\u0000\u0000\u0108\u0109\u0005=\u0000"+ - "\u0000\u0109\u010a\u0005=\u0000\u0000\u010a\'\u0001\u0000\u0000\u0000"+ - "\u010b\u010c\u0005!\u0000\u0000\u010c\u010d\u0005=\u0000\u0000\u010d)"+ - "\u0001\u0000\u0000\u0000\u010e\u010f\u0005i\u0000\u0000\u010f\u0110\u0005"+ - "n\u0000\u0000\u0110+\u0001\u0000\u0000\u0000\u0111\u0112\u0005<\u0000"+ - "\u0000\u0112-\u0001\u0000\u0000\u0000\u0113\u0114\u0005<\u0000\u0000\u0114"+ - "\u0115\u0005=\u0000\u0000\u0115/\u0001\u0000\u0000\u0000\u0116\u0117\u0005"+ - ">\u0000\u0000\u0117\u0118\u0005=\u0000\u0000\u01181\u0001\u0000\u0000"+ - "\u0000\u0119\u011a\u0005>\u0000\u0000\u011a3\u0001\u0000\u0000\u0000\u011b"+ - "\u011c\u0005&\u0000\u0000\u011c\u011d\u0005&\u0000\u0000\u011d5\u0001"+ - "\u0000\u0000\u0000\u011e\u011f\u0005|\u0000\u0000\u011f\u0120\u0005|\u0000"+ - "\u0000\u01207\u0001\u0000\u0000\u0000\u0121\u0122\u0005[\u0000\u0000\u0122"+ - "9\u0001\u0000\u0000\u0000\u0123\u0124\u0005]\u0000\u0000\u0124;\u0001"+ - "\u0000\u0000\u0000\u0125\u0126\u0005{\u0000\u0000\u0126=\u0001\u0000\u0000"+ - "\u0000\u0127\u0128\u0005}\u0000\u0000\u0128?\u0001\u0000\u0000\u0000\u0129"+ - "\u012a\u0005(\u0000\u0000\u012aA\u0001\u0000\u0000\u0000\u012b\u012c\u0005"+ - ")\u0000\u0000\u012cC\u0001\u0000\u0000\u0000\u012d\u012e\u0005.\u0000"+ - "\u0000\u012eE\u0001\u0000\u0000\u0000\u012f\u0130\u0005-\u0000\u0000\u0130"+ - "G\u0001\u0000\u0000\u0000\u0131\u0132\u0005!\u0000\u0000\u0132I\u0001"+ - "\u0000\u0000\u0000\u0133\u0134\u0005?\u0000\u0000\u0134K\u0001\u0000\u0000"+ - "\u0000\u0135\u0136\u0005+\u0000\u0000\u0136M\u0001\u0000\u0000\u0000\u0137"+ - "\u0138\u0005*\u0000\u0000\u0138O\u0001\u0000\u0000\u0000\u0139\u013a\u0005"+ - "/\u0000\u0000\u013aQ\u0001\u0000\u0000\u0000\u013b\u013c\u0005%\u0000"+ - "\u0000\u013cS\u0001\u0000\u0000\u0000\u013d\u013e\u0005t\u0000\u0000\u013e"+ - "\u013f\u0005r\u0000\u0000\u013f\u0140\u0005u\u0000\u0000\u0140\u0141\u0005"+ - "e\u0000\u0000\u0141U\u0001\u0000\u0000\u0000\u0142\u0143\u0005f\u0000"+ - "\u0000\u0143\u0144\u0005a\u0000\u0000\u0144\u0145\u0005l\u0000\u0000\u0145"+ - "\u0146\u0005s\u0000\u0000\u0146\u0147\u0005e\u0000\u0000\u0147W\u0001"+ - "\u0000\u0000\u0000\u0148\u0149\u0005n\u0000\u0000\u0149\u014a\u0005u\u0000"+ - "\u0000\u014a\u014b\u0005l\u0000\u0000\u014b\u014c\u0005l\u0000\u0000\u014c"+ - "Y\u0001\u0000\u0000\u0000\u014d\u014e\u0005\\\u0000\u0000\u014e[\u0001"+ - "\u0000\u0000\u0000\u014f\u0150\u0007\u0000\u0000\u0000\u0150]\u0001\u0000"+ - "\u0000\u0000\u0151\u0152\u000209\u0000\u0152_\u0001\u0000\u0000\u0000"+ - "\u0153\u0155\u0007\u0001\u0000\u0000\u0154\u0156\u0007\u0002\u0000\u0000"+ - "\u0155\u0154\u0001\u0000\u0000\u0000\u0155\u0156\u0001\u0000\u0000\u0000"+ - "\u0156\u0158\u0001\u0000\u0000\u0000\u0157\u0159\u0003^.\u0000\u0158\u0157"+ - "\u0001\u0000\u0000\u0000\u0159\u015a\u0001\u0000\u0000\u0000\u015a\u0158"+ - "\u0001\u0000\u0000\u0000\u015a\u015b\u0001\u0000\u0000\u0000\u015ba\u0001"+ - "\u0000\u0000\u0000\u015c\u015d\u0007\u0003\u0000\u0000\u015dc\u0001\u0000"+ - "\u0000\u0000\u015e\u015f\u0007\u0004\u0000\u0000\u015fe\u0001\u0000\u0000"+ - "\u0000\u0160\u0165\u0003h3\u0000\u0161\u0165\u0003l5\u0000\u0162\u0165"+ - "\u0003n6\u0000\u0163\u0165\u0003j4\u0000\u0164\u0160\u0001\u0000\u0000"+ - "\u0000\u0164\u0161\u0001\u0000\u0000\u0000\u0164\u0162\u0001\u0000\u0000"+ - "\u0000\u0164\u0163\u0001\u0000\u0000\u0000\u0165g\u0001\u0000\u0000\u0000"+ - "\u0166\u0167\u0003Z,\u0000\u0167\u0168\u0007\u0005\u0000\u0000\u0168i"+ - "\u0001\u0000\u0000\u0000\u0169\u016a\u0003Z,\u0000\u016a\u016b\u00020"+ - "3\u0000\u016b\u016c\u000207\u0000\u016c\u016d\u000207\u0000\u016dk\u0001"+ - "\u0000\u0000\u0000\u016e\u016f\u0003Z,\u0000\u016f\u0170\u0007\u0006\u0000"+ - "\u0000\u0170\u0171\u0003b0\u0000\u0171\u0172\u0003b0\u0000\u0172m\u0001"+ - "\u0000\u0000\u0000\u0173\u0174\u0003Z,\u0000\u0174\u0175\u0005u\u0000"+ - "\u0000\u0175\u0176\u0003b0\u0000\u0176\u0177\u0003b0\u0000\u0177\u0178"+ - "\u0003b0\u0000\u0178\u0179\u0003b0\u0000\u0179\u0186\u0001\u0000\u0000"+ - "\u0000\u017a\u017b\u0003Z,\u0000\u017b\u017c\u0005U\u0000\u0000\u017c"+ - "\u017d\u0003b0\u0000\u017d\u017e\u0003b0\u0000\u017e\u017f\u0003b0\u0000"+ - "\u017f\u0180\u0003b0\u0000\u0180\u0181\u0003b0\u0000\u0181\u0182\u0003"+ - "b0\u0000\u0182\u0183\u0003b0\u0000\u0183\u0184\u0003b0\u0000\u0184\u0186"+ - "\u0001\u0000\u0000\u0000\u0185\u0173\u0001\u0000\u0000\u0000\u0185\u017a"+ - "\u0001\u0000\u0000\u0000\u0186o\u0001\u0000\u0000\u0000\u0187\u0189\u0007"+ - "\u0007\u0000\u0000\u0188\u0187\u0001\u0000\u0000\u0000\u0189\u018a\u0001"+ - "\u0000\u0000\u0000\u018a\u0188\u0001\u0000\u0000\u0000\u018a\u018b\u0001"+ - "\u0000\u0000\u0000\u018bq\u0001\u0000\u0000\u0000\u018c\u018d\u0005/\u0000"+ - "\u0000\u018d\u018e\u0005/\u0000\u0000\u018e\u0192\u0001\u0000\u0000\u0000"+ - "\u018f\u0191\b\b\u0000\u0000\u0190\u018f\u0001\u0000\u0000\u0000\u0191"+ - "\u0194\u0001\u0000\u0000\u0000\u0192\u0190\u0001\u0000\u0000\u0000\u0192"+ - "\u0193\u0001\u0000\u0000\u0000\u0193\u0195\u0001\u0000\u0000\u0000\u0194"+ - "\u0192\u0001\u0000\u0000\u0000\u0195\u0196\u00068\u0001\u0000\u0196s\u0001"+ - "\u0000\u0000\u0000\u0197\u0199\u0003^.\u0000\u0198\u0197\u0001\u0000\u0000"+ - "\u0000\u0199\u019a\u0001\u0000\u0000\u0000\u019a\u0198\u0001\u0000\u0000"+ - "\u0000\u019a\u019b\u0001\u0000\u0000\u0000\u019b\u019c\u0001\u0000\u0000"+ - "\u0000\u019c\u019e\u0005.\u0000\u0000\u019d\u019f\u0003^.\u0000\u019e"+ - "\u019d\u0001\u0000\u0000\u0000\u019f\u01a0\u0001\u0000\u0000\u0000\u01a0"+ - "\u019e\u0001\u0000\u0000\u0000\u01a0\u01a1\u0001\u0000\u0000\u0000\u01a1"+ - "\u01a3\u0001\u0000\u0000\u0000\u01a2\u01a4\u0003`/\u0000\u01a3\u01a2\u0001"+ - "\u0000\u0000\u0000\u01a3\u01a4\u0001\u0000\u0000\u0000\u01a4\u01b6\u0001"+ - "\u0000\u0000\u0000\u01a5\u01a7\u0003^.\u0000\u01a6\u01a5\u0001\u0000\u0000"+ - "\u0000\u01a7\u01a8\u0001\u0000\u0000\u0000\u01a8\u01a6\u0001\u0000\u0000"+ - "\u0000\u01a8\u01a9\u0001\u0000\u0000\u0000\u01a9\u01aa\u0001\u0000\u0000"+ - "\u0000\u01aa\u01ab\u0003`/\u0000\u01ab\u01b6\u0001\u0000\u0000\u0000\u01ac"+ - "\u01ae\u0005.\u0000\u0000\u01ad\u01af\u0003^.\u0000\u01ae\u01ad\u0001"+ - "\u0000\u0000\u0000\u01af\u01b0\u0001\u0000\u0000\u0000\u01b0\u01ae\u0001"+ - "\u0000\u0000\u0000\u01b0\u01b1\u0001\u0000\u0000\u0000\u01b1\u01b3\u0001"+ - "\u0000\u0000\u0000\u01b2\u01b4\u0003`/\u0000\u01b3\u01b2\u0001\u0000\u0000"+ - "\u0000\u01b3\u01b4\u0001\u0000\u0000\u0000\u01b4\u01b6\u0001\u0000\u0000"+ - "\u0000\u01b5\u0198\u0001\u0000\u0000\u0000\u01b5\u01a6\u0001\u0000\u0000"+ - "\u0000\u01b5\u01ac\u0001\u0000\u0000\u0000\u01b6u\u0001\u0000\u0000\u0000"+ - "\u01b7\u01b9\u0003^.\u0000\u01b8\u01b7\u0001\u0000\u0000\u0000\u01b9\u01ba"+ - "\u0001\u0000\u0000\u0000\u01ba\u01b8\u0001\u0000\u0000\u0000\u01ba\u01bb"+ - "\u0001\u0000\u0000\u0000\u01bb\u01c5\u0001\u0000\u0000\u0000\u01bc\u01bd"+ - "\u00050\u0000\u0000\u01bd\u01be\u0005x\u0000\u0000\u01be\u01c0\u0001\u0000"+ - "\u0000\u0000\u01bf\u01c1\u0003b0\u0000\u01c0\u01bf\u0001\u0000\u0000\u0000"+ - "\u01c1\u01c2\u0001\u0000\u0000\u0000\u01c2\u01c0\u0001\u0000\u0000\u0000"+ - "\u01c2\u01c3\u0001\u0000\u0000\u0000\u01c3\u01c5\u0001\u0000\u0000\u0000"+ - "\u01c4\u01b8\u0001\u0000\u0000\u0000\u01c4\u01bc\u0001\u0000\u0000\u0000"+ - "\u01c5w\u0001\u0000\u0000\u0000\u01c6\u01c8\u0003^.\u0000\u01c7\u01c6"+ - "\u0001\u0000\u0000\u0000\u01c8\u01c9\u0001\u0000\u0000\u0000\u01c9\u01c7"+ - "\u0001\u0000\u0000\u0000\u01c9\u01ca\u0001\u0000\u0000\u0000\u01ca\u01cb"+ - "\u0001\u0000\u0000\u0000\u01cb\u01cc\u0007\t\u0000\u0000\u01cc\u01d8\u0001"+ - "\u0000\u0000\u0000\u01cd\u01ce\u00050\u0000\u0000\u01ce\u01cf\u0005x\u0000"+ - "\u0000\u01cf\u01d1\u0001\u0000\u0000\u0000\u01d0\u01d2\u0003b0\u0000\u01d1"+ - "\u01d0\u0001\u0000\u0000\u0000\u01d2\u01d3\u0001\u0000\u0000\u0000\u01d3"+ - "\u01d1\u0001\u0000\u0000\u0000\u01d3\u01d4\u0001\u0000\u0000\u0000\u01d4"+ - "\u01d5\u0001\u0000\u0000\u0000\u01d5\u01d6\u0007\t\u0000\u0000\u01d6\u01d8"+ - "\u0001\u0000\u0000\u0000\u01d7\u01c7\u0001\u0000\u0000\u0000\u01d7\u01cd"+ - "\u0001\u0000\u0000\u0000\u01d8y\u0001\u0000\u0000\u0000\u01d9\u01de\u0005"+ - "\"\u0000\u0000\u01da\u01dd\u0003f2\u0000\u01db\u01dd\b\n\u0000\u0000\u01dc"+ - "\u01da\u0001\u0000\u0000\u0000\u01dc\u01db\u0001\u0000\u0000\u0000\u01dd"+ - "\u01e0\u0001\u0000\u0000\u0000\u01de\u01dc\u0001\u0000\u0000\u0000\u01de"+ - "\u01df\u0001\u0000\u0000\u0000\u01df\u01e1\u0001\u0000\u0000\u0000\u01e0"+ - "\u01de\u0001\u0000\u0000\u0000\u01e1\u023a\u0005\"\u0000\u0000\u01e2\u01e7"+ - "\u0005\'\u0000\u0000\u01e3\u01e6\u0003f2\u0000\u01e4\u01e6\b\u000b\u0000"+ - "\u0000\u01e5\u01e3\u0001\u0000\u0000\u0000\u01e5\u01e4\u0001\u0000\u0000"+ - "\u0000\u01e6\u01e9\u0001\u0000\u0000\u0000\u01e7\u01e5\u0001\u0000\u0000"+ - "\u0000\u01e7\u01e8\u0001\u0000\u0000\u0000\u01e8\u01ea\u0001\u0000\u0000"+ - "\u0000\u01e9\u01e7\u0001\u0000\u0000\u0000\u01ea\u023a\u0005\'\u0000\u0000"+ - "\u01eb\u01ec\u0005\"\u0000\u0000\u01ec\u01ed\u0005\"\u0000\u0000\u01ed"+ - "\u01ee\u0005\"\u0000\u0000\u01ee\u01f3\u0001\u0000\u0000\u0000\u01ef\u01f2"+ - "\u0003f2\u0000\u01f0\u01f2\b\f\u0000\u0000\u01f1\u01ef\u0001\u0000\u0000"+ - "\u0000\u01f1\u01f0\u0001\u0000\u0000\u0000\u01f2\u01f5\u0001\u0000\u0000"+ - "\u0000\u01f3\u01f4\u0001\u0000\u0000\u0000\u01f3\u01f1\u0001\u0000\u0000"+ - "\u0000\u01f4\u01f6\u0001\u0000\u0000\u0000\u01f5\u01f3\u0001\u0000\u0000"+ - "\u0000\u01f6\u01f7\u0005\"\u0000\u0000\u01f7\u01f8\u0005\"\u0000\u0000"+ - "\u01f8\u023a\u0005\"\u0000\u0000\u01f9\u01fa\u0005\'\u0000\u0000\u01fa"+ - "\u01fb\u0005\'\u0000\u0000\u01fb\u01fc\u0005\'\u0000\u0000\u01fc\u0201"+ - "\u0001\u0000\u0000\u0000\u01fd\u0200\u0003f2\u0000\u01fe\u0200\b\f\u0000"+ - "\u0000\u01ff\u01fd\u0001\u0000\u0000\u0000\u01ff\u01fe\u0001\u0000\u0000"+ - "\u0000\u0200\u0203\u0001\u0000\u0000\u0000\u0201\u0202\u0001\u0000\u0000"+ - "\u0000\u0201\u01ff\u0001\u0000\u0000\u0000\u0202\u0204\u0001\u0000\u0000"+ - "\u0000\u0203\u0201\u0001\u0000\u0000\u0000\u0204\u0205\u0005\'\u0000\u0000"+ - "\u0205\u0206\u0005\'\u0000\u0000\u0206\u023a\u0005\'\u0000\u0000\u0207"+ - "\u0208\u0003d1\u0000\u0208\u020c\u0005\"\u0000\u0000\u0209\u020b\b\r\u0000"+ - "\u0000\u020a\u0209\u0001\u0000\u0000\u0000\u020b\u020e\u0001\u0000\u0000"+ - "\u0000\u020c\u020a\u0001\u0000\u0000\u0000\u020c\u020d\u0001\u0000\u0000"+ - "\u0000\u020d\u020f\u0001\u0000\u0000\u0000\u020e\u020c\u0001\u0000\u0000"+ - "\u0000\u020f\u0210\u0005\"\u0000\u0000\u0210\u023a\u0001\u0000\u0000\u0000"+ - "\u0211\u0212\u0003d1\u0000\u0212\u0216\u0005\'\u0000\u0000\u0213\u0215"+ - "\b\u000e\u0000\u0000\u0214\u0213\u0001\u0000\u0000\u0000\u0215\u0218\u0001"+ - "\u0000\u0000\u0000\u0216\u0214\u0001\u0000\u0000\u0000\u0216\u0217\u0001"+ - "\u0000\u0000\u0000\u0217\u0219\u0001\u0000\u0000\u0000\u0218\u0216\u0001"+ - "\u0000\u0000\u0000\u0219\u021a\u0005\'\u0000\u0000\u021a\u023a\u0001\u0000"+ - "\u0000\u0000\u021b\u021c\u0003d1\u0000\u021c\u021d\u0005\"\u0000\u0000"+ - "\u021d\u021e\u0005\"\u0000\u0000\u021e\u021f\u0005\"\u0000\u0000\u021f"+ - "\u0223\u0001\u0000\u0000\u0000\u0220\u0222\t\u0000\u0000\u0000\u0221\u0220"+ - "\u0001\u0000\u0000\u0000\u0222\u0225\u0001\u0000\u0000\u0000\u0223\u0224"+ - "\u0001\u0000\u0000\u0000\u0223\u0221\u0001\u0000\u0000\u0000\u0224\u0226"+ - "\u0001\u0000\u0000\u0000\u0225\u0223\u0001\u0000\u0000\u0000\u0226\u0227"+ - "\u0005\"\u0000\u0000\u0227\u0228\u0005\"\u0000\u0000\u0228\u0229\u0005"+ - "\"\u0000\u0000\u0229\u023a\u0001\u0000\u0000\u0000\u022a\u022b\u0003d"+ - "1\u0000\u022b\u022c\u0005\'\u0000\u0000\u022c\u022d\u0005\'\u0000\u0000"+ - "\u022d\u022e\u0005\'\u0000\u0000\u022e\u0232\u0001\u0000\u0000\u0000\u022f"+ - "\u0231\t\u0000\u0000\u0000\u0230\u022f\u0001\u0000\u0000\u0000\u0231\u0234"+ - "\u0001\u0000\u0000\u0000\u0232\u0233\u0001\u0000\u0000\u0000\u0232\u0230"+ - "\u0001\u0000\u0000\u0000\u0233\u0235\u0001\u0000\u0000\u0000\u0234\u0232"+ - "\u0001\u0000\u0000\u0000\u0235\u0236\u0005\'\u0000\u0000\u0236\u0237\u0005"+ - "\'\u0000\u0000\u0237\u0238\u0005\'\u0000\u0000\u0238\u023a\u0001\u0000"+ - "\u0000\u0000\u0239\u01d9\u0001\u0000\u0000\u0000\u0239\u01e2\u0001\u0000"+ - "\u0000\u0000\u0239\u01eb\u0001\u0000\u0000\u0000\u0239\u01f9\u0001\u0000"+ - "\u0000\u0000\u0239\u0207\u0001\u0000\u0000\u0000\u0239\u0211\u0001\u0000"+ - "\u0000\u0000\u0239\u021b\u0001\u0000\u0000\u0000\u0239\u022a\u0001\u0000"+ - "\u0000\u0000\u023a{\u0001\u0000\u0000\u0000\u023b\u023c\u0007\u000f\u0000"+ - "\u0000\u023c\u023d\u0003z<\u0000\u023d}\u0001\u0000\u0000\u0000\u023e"+ - "\u0241\u0003\\-\u0000\u023f\u0241\u0005_\u0000\u0000\u0240\u023e\u0001"+ - "\u0000\u0000\u0000\u0240\u023f\u0001\u0000\u0000\u0000\u0241\u0248\u0001"+ - "\u0000\u0000\u0000\u0242\u0247\u0003\\-\u0000\u0243\u0247\u0003^.\u0000"+ - "\u0244\u0247\u0005_\u0000\u0000\u0245\u0247\u0003F\"\u0000\u0246\u0242"+ - "\u0001\u0000\u0000\u0000\u0246\u0243\u0001\u0000\u0000\u0000\u0246\u0244"+ - "\u0001\u0000\u0000\u0000\u0246\u0245\u0001\u0000\u0000\u0000\u0247\u024a"+ - "\u0001\u0000\u0000\u0000\u0248\u0246\u0001\u0000\u0000\u0000\u0248\u0249"+ - "\u0001\u0000\u0000\u0000\u0249\u007f\u0001\u0000\u0000\u0000\u024a\u0248"+ - "\u0001\u0000\u0000\u0000\u024b\u024e\u0003\\-\u0000\u024c\u024e\u0005"+ - "_\u0000\u0000\u024d\u024b\u0001\u0000\u0000\u0000\u024d\u024c\u0001\u0000"+ - "\u0000\u0000\u024e\u025d\u0001\u0000\u0000\u0000\u024f\u0253\u0003P\'"+ - "\u0000\u0250\u0253\u0003D!\u0000\u0251\u0253\u0003F\"\u0000\u0252\u024f"+ - "\u0001\u0000\u0000\u0000\u0252\u0250\u0001\u0000\u0000\u0000\u0252\u0251"+ - "\u0001\u0000\u0000\u0000\u0252\u0253\u0001\u0000\u0000\u0000\u0253\u0257"+ - "\u0001\u0000\u0000\u0000\u0254\u0258\u0003\\-\u0000\u0255\u0258\u0003"+ - "^.\u0000\u0256\u0258\u0005_\u0000\u0000\u0257\u0254\u0001\u0000\u0000"+ - "\u0000\u0257\u0255\u0001\u0000\u0000\u0000\u0257\u0256\u0001\u0000\u0000"+ - "\u0000\u0258\u0259\u0001\u0000\u0000\u0000\u0259\u0257\u0001\u0000\u0000"+ - "\u0000\u0259\u025a\u0001\u0000\u0000\u0000\u025a\u025c\u0001\u0000\u0000"+ - "\u0000\u025b\u0252\u0001\u0000\u0000\u0000\u025c\u025f\u0001\u0000\u0000"+ - "\u0000\u025d\u025b\u0001\u0000\u0000\u0000\u025d\u025e\u0001\u0000\u0000"+ - "\u0000\u025e\u0081\u0001\u0000\u0000\u0000\u025f\u025d\u0001\u0000\u0000"+ - "\u0000\u0260\u0262\u0003p7\u0000\u0261\u0260\u0001\u0000\u0000\u0000\u0261"+ - "\u0262\u0001\u0000\u0000\u0000\u0262\u0268\u0001\u0000\u0000\u0000\u0263"+ - "\u0265\u0005\r\u0000\u0000\u0264\u0263\u0001\u0000\u0000\u0000\u0264\u0265"+ - "\u0001\u0000\u0000\u0000\u0265\u0266\u0001\u0000\u0000\u0000\u0266\u0269"+ - "\u0005\n\u0000\u0000\u0267\u0269\u0002\f\r\u0000\u0268\u0264\u0001\u0000"+ - "\u0000\u0000\u0268\u0267\u0001\u0000\u0000\u0000\u0269\u026b\u0001\u0000"+ - "\u0000\u0000\u026a\u026c\u0003p7\u0000\u026b\u026a\u0001\u0000\u0000\u0000"+ - "\u026b\u026c\u0001\u0000\u0000\u0000\u026c\u026e\u0001\u0000\u0000\u0000"+ - "\u026d\u026f\u0003\u0082@\u0000\u026e\u026d\u0001\u0000\u0000\u0000\u026e"+ - "\u026f\u0001\u0000\u0000\u0000\u026f\u0083\u0001\u0000\u0000\u0000\u0270"+ - "\u0271\u0003B \u0000\u0271\u0272\u0001\u0000\u0000\u0000\u0272\u0273\u0006"+ - "A\u0002\u0000\u0273\u0274\u0006A\u0003\u0000\u0274\u0085\u0001\u0000\u0000"+ - "\u0000\u0275\u0276\u0005m\u0000\u0000\u0276\u0277\u0005a\u0000\u0000\u0277"+ - "\u027d\u0005p\u0000\u0000\u0278\u0279\u0005l\u0000\u0000\u0279\u027a\u0005"+ - "i\u0000\u0000\u027a\u027b\u0005s\u0000\u0000\u027b\u027d\u0005t\u0000"+ - "\u0000\u027c\u0275\u0001\u0000\u0000\u0000\u027c\u0278\u0001\u0000\u0000"+ - "\u0000\u027d\u0087\u0001\u0000\u0000\u0000\u027e\u027f\u0005b\u0000\u0000"+ - "\u027f\u0280\u0005o\u0000\u0000\u0280\u0281\u0005o\u0000\u0000\u0281\u02b0"+ - "\u0005l\u0000\u0000\u0282\u0283\u0005s\u0000\u0000\u0283\u0284\u0005t"+ - "\u0000\u0000\u0284\u0285\u0005r\u0000\u0000\u0285\u0286\u0005i\u0000\u0000"+ - "\u0286\u0287\u0005n\u0000\u0000\u0287\u02b0\u0005g\u0000\u0000\u0288\u0289"+ - "\u0005i\u0000\u0000\u0289\u028a\u0005n\u0000\u0000\u028a\u02b0\u0005t"+ - "\u0000\u0000\u028b\u028c\u0005u\u0000\u0000\u028c\u028d\u0005i\u0000\u0000"+ - "\u028d\u028e\u0005n\u0000\u0000\u028e\u02b0\u0005t\u0000\u0000\u028f\u0290"+ - "\u0005d\u0000\u0000\u0290\u0291\u0005o\u0000\u0000\u0291\u0292\u0005u"+ - "\u0000\u0000\u0292\u0293\u0005b\u0000\u0000\u0293\u0294\u0005l\u0000\u0000"+ - "\u0294\u02b0\u0005e\u0000\u0000\u0295\u0296\u0005d\u0000\u0000\u0296\u0297"+ - "\u0005u\u0000\u0000\u0297\u0298\u0005r\u0000\u0000\u0298\u0299\u0005a"+ - "\u0000\u0000\u0299\u029a\u0005t\u0000\u0000\u029a\u029b\u0005i\u0000\u0000"+ - "\u029b\u029c\u0005o\u0000\u0000\u029c\u02b0\u0005n\u0000\u0000\u029d\u029e"+ - "\u0005t\u0000\u0000\u029e\u029f\u0005i\u0000\u0000\u029f\u02a0\u0005m"+ - "\u0000\u0000\u02a0\u02a1\u0005e\u0000\u0000\u02a1\u02a2\u0005s\u0000\u0000"+ - "\u02a2\u02a3\u0005t\u0000\u0000\u02a3\u02a4\u0005a\u0000\u0000\u02a4\u02a5"+ - "\u0005m\u0000\u0000\u02a5\u02b0\u0005p\u0000\u0000\u02a6\u02a7\u0005i"+ - "\u0000\u0000\u02a7\u02a8\u0005p\u0000\u0000\u02a8\u02a9\u0005a\u0000\u0000"+ - "\u02a9\u02aa\u0005d\u0000\u0000\u02aa\u02ab\u0005d\u0000\u0000\u02ab\u02ac"+ - "\u0005r\u0000\u0000\u02ac\u02ad\u0005e\u0000\u0000\u02ad\u02ae\u0005s"+ - "\u0000\u0000\u02ae\u02b0\u0005s\u0000\u0000\u02af\u027e\u0001\u0000\u0000"+ - "\u0000\u02af\u0282\u0001\u0000\u0000\u0000\u02af\u0288\u0001\u0000\u0000"+ - "\u0000\u02af\u028b\u0001\u0000\u0000\u0000\u02af\u028f\u0001\u0000\u0000"+ - "\u0000\u02af\u0295\u0001\u0000\u0000\u0000\u02af\u029d\u0001\u0000\u0000"+ - "\u0000\u02af\u02a6\u0001\u0000\u0000\u0000\u02b0\u0089\u0001\u0000\u0000"+ - "\u0000\u02b1\u02b2\u0003,\u0015\u0000\u02b2\u02b3\u0001\u0000\u0000\u0000"+ - "\u02b3\u02b4\u0006D\u0004\u0000\u02b4\u008b\u0001\u0000\u0000\u0000\u02b5"+ - "\u02b6\u00032\u0018\u0000\u02b6\u02b7\u0001\u0000\u0000\u0000\u02b7\u02b8"+ - "\u0006E\u0005\u0000\u02b8\u008d\u0001\u0000\u0000\u0000\u02b9\u02ba\u0003"+ - "@\u001f\u0000\u02ba\u02bb\u0001\u0000\u0000\u0000\u02bb\u02bc\u0006F\u0006"+ - "\u0000\u02bc\u008f\u0001\u0000\u0000\u0000\u02bd\u02be\u0003\u0004\u0001"+ - "\u0000\u02be\u02bf\u0001\u0000\u0000\u0000\u02bf\u02c0\u0006G\u0007\u0000"+ - "\u02c0\u0091\u0001\u0000\u0000\u0000\u02c1\u02c2\u0003\u0006\u0002\u0000"+ - "\u02c2\u02c3\u0001\u0000\u0000\u0000\u02c3\u02c4\u0006H\b\u0000\u02c4"+ - "\u0093\u0001\u0000\u0000\u0000\u02c5\u02c6\u0003p7\u0000\u02c6\u02c7\u0001"+ - "\u0000\u0000\u0000\u02c7\u02c8\u0006I\t\u0000\u02c8\u0095\u0001\u0000"+ - "\u0000\u0000\u02c9\u02ca\u0003~>\u0000\u02ca\u02cb\u0001\u0000\u0000\u0000"+ - "\u02cb\u02cc\u0006J\n\u0000\u02cc\u0097\u0001\u0000\u0000\u00003\u0000"+ - "\u0001\u00c9\u00cf\u0155\u015a\u0164\u0185\u018a\u0192\u019a\u01a0\u01a3"+ - "\u01a8\u01b0\u01b3\u01b5\u01ba\u01c2\u01c4\u01c9\u01d3\u01d7\u01dc\u01de"+ - "\u01e5\u01e7\u01f1\u01f3\u01ff\u0201\u020c\u0216\u0223\u0232\u0239\u0240"+ - "\u0246\u0248\u024d\u0252\u0257\u0259\u025d\u0261\u0264\u0268\u026b\u026e"+ - "\u027c\u02af\u000b\u0005\u0001\u0000\u0000\u0001\u0000\u0007\b\u0000\u0004"+ - "\u0000\u0000\u0007\u0003\u0000\u0007\u0004\u0000\u0007\u0007\u0000\u0007"+ - "\u0001\u0000\u0007\u0002\u0000\u0007\t\u0000\u0007\n\u0000"; + "6\u00016\u00036\u0188\b6\u00017\u00047\u018b\b7\u000b7\f7\u018c\u0001"+ + "8\u00018\u00018\u00018\u00058\u0193\b8\n8\f8\u0196\t8\u00018\u00018\u0001"+ + "9\u00049\u019b\b9\u000b9\f9\u019c\u00019\u00019\u00049\u01a1\b9\u000b"+ + "9\f9\u01a2\u00019\u00039\u01a6\b9\u00019\u00049\u01a9\b9\u000b9\f9\u01aa"+ + "\u00019\u00019\u00019\u00019\u00049\u01b1\b9\u000b9\f9\u01b2\u00019\u0003"+ + "9\u01b6\b9\u00039\u01b8\b9\u0001:\u0004:\u01bb\b:\u000b:\f:\u01bc\u0001"+ + ":\u0001:\u0001:\u0001:\u0004:\u01c3\b:\u000b:\f:\u01c4\u0003:\u01c7\b"+ + ":\u0001;\u0004;\u01ca\b;\u000b;\f;\u01cb\u0001;\u0001;\u0001;\u0001;\u0001"+ + ";\u0001;\u0004;\u01d4\b;\u000b;\f;\u01d5\u0001;\u0001;\u0003;\u01da\b"+ + ";\u0001<\u0001<\u0001<\u0005<\u01df\b<\n<\f<\u01e2\t<\u0001<\u0001<\u0001"+ + "<\u0001<\u0005<\u01e8\b<\n<\f<\u01eb\t<\u0001<\u0001<\u0001<\u0001<\u0001"+ + "<\u0001<\u0001<\u0005<\u01f4\b<\n<\f<\u01f7\t<\u0001<\u0001<\u0001<\u0001"+ + "<\u0001<\u0001<\u0001<\u0001<\u0001<\u0005<\u0202\b<\n<\f<\u0205\t<\u0001"+ + "<\u0001<\u0001<\u0001<\u0001<\u0001<\u0005<\u020d\b<\n<\f<\u0210\t<\u0001"+ + "<\u0001<\u0001<\u0001<\u0001<\u0005<\u0217\b<\n<\f<\u021a\t<\u0001<\u0001"+ + "<\u0001<\u0001<\u0001<\u0001<\u0001<\u0001<\u0005<\u0224\b<\n<\f<\u0227"+ + "\t<\u0001<\u0001<\u0001<\u0001<\u0001<\u0001<\u0001<\u0001<\u0001<\u0001"+ + "<\u0005<\u0233\b<\n<\f<\u0236\t<\u0001<\u0001<\u0001<\u0001<\u0003<\u023c"+ + "\b<\u0001=\u0001=\u0001=\u0001>\u0001>\u0001>\u0001>\u0001>\u0001>\u0001"+ + ">\u0001>\u0001>\u0001>\u0001>\u0001>\u0001?\u0001?\u0003?\u024f\b?\u0001"+ + "?\u0001?\u0001?\u0001?\u0005?\u0255\b?\n?\f?\u0258\t?\u0001@\u0001@\u0003"+ + "@\u025c\b@\u0001@\u0001@\u0001@\u0003@\u0261\b@\u0001@\u0001@\u0001@\u0004"+ + "@\u0266\b@\u000b@\f@\u0267\u0005@\u026a\b@\n@\f@\u026d\t@\u0001A\u0003"+ + "A\u0270\bA\u0001A\u0003A\u0273\bA\u0001A\u0001A\u0003A\u0277\bA\u0001"+ + "A\u0003A\u027a\bA\u0001A\u0003A\u027d\bA\u0001B\u0001B\u0001B\u0001B\u0001"+ + "B\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0003C\u028b\bC\u0001"+ + "D\u0001D\u0001D\u0001D\u0001D\u0001D\u0001D\u0001D\u0001D\u0001D\u0001"+ + "D\u0001D\u0001D\u0001D\u0001D\u0001D\u0001D\u0001D\u0001D\u0001D\u0001"+ + "D\u0001D\u0001D\u0001D\u0001D\u0001D\u0001D\u0001D\u0001D\u0001D\u0001"+ + "D\u0001D\u0001D\u0001D\u0001D\u0001D\u0001D\u0001D\u0001D\u0001D\u0001"+ + "D\u0001D\u0001D\u0001D\u0001D\u0001D\u0001D\u0001D\u0001D\u0003D\u02be"+ + "\bD\u0001E\u0001E\u0001E\u0001E\u0001F\u0001F\u0001F\u0001F\u0001G\u0001"+ + "G\u0001G\u0001G\u0001H\u0001H\u0001H\u0001H\u0001I\u0001I\u0001I\u0001"+ + "I\u0001J\u0001J\u0001J\u0001J\u0001K\u0001K\u0001K\u0001K\u0004\u01f5"+ + "\u0203\u0225\u0234\u0000L\u0002\u000b\u0004\u0001\u0006\u0002\b\f\n\r"+ + "\f\u000e\u000e\u000f\u0010\u0010\u0012\u0011\u0014\u0012\u0016\u0013\u0018"+ + "\u0014\u001a\u0015\u001c\u0016\u001e\u0017 \u0018\"\u0019$\u001a&\u001b"+ + "(\u001c*\u001d,\u0003.\u001e0\u001f2\u00044 6!8\u0005:\"<#>$@\u0007B\b"+ + "D%F&H\'J(L)N*P+R,T-V.X/Z\u0000\\\u0000^\u0000`\u0000b\u0000d\u0000f\u0000"+ + "h\u0000j\u0000l\u0000n\u0000p\tr0t1v2x3z4|5~6\u0080\n\u00827\u00848\u0086"+ + "\u0000\u00889\u008a:\u008c\u0000\u008e\u0000\u0090\u0000\u0092\u0000\u0094"+ + "\u0000\u0096\u0000\u0098\u0000\u0002\u0000\u0001\u0010\u0002\u0000AZa"+ + "z\u0002\u0000EEee\u0002\u0000++--\u0003\u000009AFaf\u0002\u0000RRrr\n"+ + "\u0000\"\"\'\'??\\\\`bffnnrrttvv\u0002\u0000XXxx\u0003\u0000\t\t\f\f "+ + " \u0001\u0000\n\n\u0002\u0000UUuu\u0004\u0000\n\n\r\r\"\"\\\\\u0004\u0000"+ + "\n\n\r\r\'\'\\\\\u0001\u0000\\\\\u0003\u0000\n\n\r\r\"\"\u0003\u0000\n"+ + "\n\r\r\'\'\u0002\u0000BBbb\u0313\u0000\u0002\u0001\u0000\u0000\u0000\u0000"+ + "\u0004\u0001\u0000\u0000\u0000\u0000\u0006\u0001\u0000\u0000\u0000\u0000"+ + "\b\u0001\u0000\u0000\u0000\u0000\n\u0001\u0000\u0000\u0000\u0000\f\u0001"+ + "\u0000\u0000\u0000\u0000\u000e\u0001\u0000\u0000\u0000\u0000\u0010\u0001"+ + "\u0000\u0000\u0000\u0000\u0012\u0001\u0000\u0000\u0000\u0000\u0014\u0001"+ + "\u0000\u0000\u0000\u0000\u0016\u0001\u0000\u0000\u0000\u0000\u0018\u0001"+ + "\u0000\u0000\u0000\u0000\u001a\u0001\u0000\u0000\u0000\u0000\u001c\u0001"+ + "\u0000\u0000\u0000\u0000\u001e\u0001\u0000\u0000\u0000\u0000 \u0001\u0000"+ + "\u0000\u0000\u0000\"\u0001\u0000\u0000\u0000\u0000$\u0001\u0000\u0000"+ + "\u0000\u0000&\u0001\u0000\u0000\u0000\u0000(\u0001\u0000\u0000\u0000\u0000"+ + "*\u0001\u0000\u0000\u0000\u0000,\u0001\u0000\u0000\u0000\u0000.\u0001"+ + "\u0000\u0000\u0000\u00000\u0001\u0000\u0000\u0000\u00002\u0001\u0000\u0000"+ + "\u0000\u00004\u0001\u0000\u0000\u0000\u00006\u0001\u0000\u0000\u0000\u0000"+ + "8\u0001\u0000\u0000\u0000\u0000:\u0001\u0000\u0000\u0000\u0000<\u0001"+ + "\u0000\u0000\u0000\u0000>\u0001\u0000\u0000\u0000\u0000@\u0001\u0000\u0000"+ + "\u0000\u0000B\u0001\u0000\u0000\u0000\u0000D\u0001\u0000\u0000\u0000\u0000"+ + "F\u0001\u0000\u0000\u0000\u0000H\u0001\u0000\u0000\u0000\u0000J\u0001"+ + "\u0000\u0000\u0000\u0000L\u0001\u0000\u0000\u0000\u0000N\u0001\u0000\u0000"+ + "\u0000\u0000P\u0001\u0000\u0000\u0000\u0000R\u0001\u0000\u0000\u0000\u0000"+ + "T\u0001\u0000\u0000\u0000\u0000V\u0001\u0000\u0000\u0000\u0000X\u0001"+ + "\u0000\u0000\u0000\u0000p\u0001\u0000\u0000\u0000\u0000r\u0001\u0000\u0000"+ + "\u0000\u0000t\u0001\u0000\u0000\u0000\u0000v\u0001\u0000\u0000\u0000\u0000"+ + "x\u0001\u0000\u0000\u0000\u0000z\u0001\u0000\u0000\u0000\u0000|\u0001"+ + "\u0000\u0000\u0000\u0000~\u0001\u0000\u0000\u0000\u0000\u0080\u0001\u0000"+ + "\u0000\u0000\u0000\u0082\u0001\u0000\u0000\u0000\u0000\u0084\u0001\u0000"+ + "\u0000\u0000\u0001\u0086\u0001\u0000\u0000\u0000\u0001\u0088\u0001\u0000"+ + "\u0000\u0000\u0001\u008a\u0001\u0000\u0000\u0000\u0001\u008c\u0001\u0000"+ + "\u0000\u0000\u0001\u008e\u0001\u0000\u0000\u0000\u0001\u0090\u0001\u0000"+ + "\u0000\u0000\u0001\u0092\u0001\u0000\u0000\u0000\u0001\u0094\u0001\u0000"+ + "\u0000\u0000\u0001\u0096\u0001\u0000\u0000\u0000\u0001\u0098\u0001\u0000"+ + "\u0000\u0000\u0002\u009a\u0001\u0000\u0000\u0000\u0004\u009c\u0001\u0000"+ + "\u0000\u0000\u0006\u009e\u0001\u0000\u0000\u0000\b\u00a0\u0001\u0000\u0000"+ + "\u0000\n\u00a4\u0001\u0000\u0000\u0000\f\u00a7\u0001\u0000\u0000\u0000"+ + "\u000e\u00af\u0001\u0000\u0000\u0000\u0010\u00b4\u0001\u0000\u0000\u0000"+ + "\u0012\u00bb\u0001\u0000\u0000\u0000\u0014\u00c1\u0001\u0000\u0000\u0000"+ + "\u0016\u00c9\u0001\u0000\u0000\u0000\u0018\u00d3\u0001\u0000\u0000\u0000"+ + "\u001a\u00da\u0001\u0000\u0000\u0000\u001c\u00df\u0001\u0000\u0000\u0000"+ + "\u001e\u00eb\u0001\u0000\u0000\u0000 \u00f5\u0001\u0000\u0000\u0000\""+ + "\u00fe\u0001\u0000\u0000\u0000$\u0105\u0001\u0000\u0000\u0000&\u010a\u0001"+ + "\u0000\u0000\u0000(\u010d\u0001\u0000\u0000\u0000*\u0110\u0001\u0000\u0000"+ + "\u0000,\u0113\u0001\u0000\u0000\u0000.\u0115\u0001\u0000\u0000\u00000"+ + "\u0118\u0001\u0000\u0000\u00002\u011b\u0001\u0000\u0000\u00004\u011d\u0001"+ + "\u0000\u0000\u00006\u0120\u0001\u0000\u0000\u00008\u0123\u0001\u0000\u0000"+ + "\u0000:\u0125\u0001\u0000\u0000\u0000<\u0127\u0001\u0000\u0000\u0000>"+ + "\u0129\u0001\u0000\u0000\u0000@\u012b\u0001\u0000\u0000\u0000B\u012d\u0001"+ + "\u0000\u0000\u0000D\u012f\u0001\u0000\u0000\u0000F\u0131\u0001\u0000\u0000"+ + "\u0000H\u0133\u0001\u0000\u0000\u0000J\u0135\u0001\u0000\u0000\u0000L"+ + "\u0137\u0001\u0000\u0000\u0000N\u0139\u0001\u0000\u0000\u0000P\u013b\u0001"+ + "\u0000\u0000\u0000R\u013d\u0001\u0000\u0000\u0000T\u013f\u0001\u0000\u0000"+ + "\u0000V\u0144\u0001\u0000\u0000\u0000X\u014a\u0001\u0000\u0000\u0000Z"+ + "\u014f\u0001\u0000\u0000\u0000\\\u0151\u0001\u0000\u0000\u0000^\u0153"+ + "\u0001\u0000\u0000\u0000`\u0155\u0001\u0000\u0000\u0000b\u015e\u0001\u0000"+ + "\u0000\u0000d\u0160\u0001\u0000\u0000\u0000f\u0166\u0001\u0000\u0000\u0000"+ + "h\u0168\u0001\u0000\u0000\u0000j\u016b\u0001\u0000\u0000\u0000l\u0170"+ + "\u0001\u0000\u0000\u0000n\u0187\u0001\u0000\u0000\u0000p\u018a\u0001\u0000"+ + "\u0000\u0000r\u018e\u0001\u0000\u0000\u0000t\u01b7\u0001\u0000\u0000\u0000"+ + "v\u01c6\u0001\u0000\u0000\u0000x\u01d9\u0001\u0000\u0000\u0000z\u023b"+ + "\u0001\u0000\u0000\u0000|\u023d\u0001\u0000\u0000\u0000~\u0240\u0001\u0000"+ + "\u0000\u0000\u0080\u024e\u0001\u0000\u0000\u0000\u0082\u025b\u0001\u0000"+ + "\u0000\u0000\u0084\u026f\u0001\u0000\u0000\u0000\u0086\u027e\u0001\u0000"+ + "\u0000\u0000\u0088\u028a\u0001\u0000\u0000\u0000\u008a\u02bd\u0001\u0000"+ + "\u0000\u0000\u008c\u02bf\u0001\u0000\u0000\u0000\u008e\u02c3\u0001\u0000"+ + "\u0000\u0000\u0090\u02c7\u0001\u0000\u0000\u0000\u0092\u02cb\u0001\u0000"+ + "\u0000\u0000\u0094\u02cf\u0001\u0000\u0000\u0000\u0096\u02d3\u0001\u0000"+ + "\u0000\u0000\u0098\u02d7\u0001\u0000\u0000\u0000\u009a\u009b\u0005#\u0000"+ + "\u0000\u009b\u0003\u0001\u0000\u0000\u0000\u009c\u009d\u0005:\u0000\u0000"+ + "\u009d\u0005\u0001\u0000\u0000\u0000\u009e\u009f\u0005,\u0000\u0000\u009f"+ + "\u0007\u0001\u0000\u0000\u0000\u00a0\u00a1\u0005a\u0000\u0000\u00a1\u00a2"+ + "\u0005n\u0000\u0000\u00a2\u00a3\u0005d\u0000\u0000\u00a3\t\u0001\u0000"+ + "\u0000\u0000\u00a4\u00a5\u0005o\u0000\u0000\u00a5\u00a6\u0005r\u0000\u0000"+ + "\u00a6\u000b\u0001\u0000\u0000\u0000\u00a7\u00a8\u0005b\u0000\u0000\u00a8"+ + "\u00a9\u0005u\u0000\u0000\u00a9\u00aa\u0005t\u0000\u0000\u00aa\u00ab\u0005"+ + " \u0000\u0000\u00ab\u00ac\u0005n\u0000\u0000\u00ac\u00ad\u0005o\u0000"+ + "\u0000\u00ad\u00ae\u0005t\u0000\u0000\u00ae\r\u0001\u0000\u0000\u0000"+ + "\u00af\u00b0\u0005f\u0000\u0000\u00b0\u00b1\u0005r\u0000\u0000\u00b1\u00b2"+ + "\u0005o\u0000\u0000\u00b2\u00b3\u0005m\u0000\u0000\u00b3\u000f\u0001\u0000"+ + "\u0000\u0000\u00b4\u00b5\u0005m\u0000\u0000\u00b5\u00b6\u0005o\u0000\u0000"+ + "\u00b6\u00b7\u0005d\u0000\u0000\u00b7\u00b8\u0005u\u0000\u0000\u00b8\u00b9"+ + "\u0005l\u0000\u0000\u00b9\u00ba\u0005e\u0000\u0000\u00ba\u0011\u0001\u0000"+ + "\u0000\u0000\u00bb\u00bc\u0005m\u0000\u0000\u00bc\u00bd\u0005o\u0000\u0000"+ + "\u00bd\u00be\u0005d\u0000\u0000\u00be\u00bf\u0005e\u0000\u0000\u00bf\u00c0"+ + "\u0005l\u0000\u0000\u00c0\u0013\u0001\u0000\u0000\u0000\u00c1\u00c2\u0005"+ + "s\u0000\u0000\u00c2\u00c3\u0005c\u0000\u0000\u00c3\u00c4\u0005h\u0000"+ + "\u0000\u00c4\u00c5\u0005e\u0000\u0000\u00c5\u00c6\u0005m\u0000\u0000\u00c6"+ + "\u00c7\u0005a\u0000\u0000\u00c7\u0015\u0001\u0000\u0000\u0000\u00c8\u00ca"+ + "\u0003^.\u0000\u00c9\u00c8\u0001\u0000\u0000\u0000\u00ca\u00cb\u0001\u0000"+ + "\u0000\u0000\u00cb\u00c9\u0001\u0000\u0000\u0000\u00cb\u00cc\u0001\u0000"+ + "\u0000\u0000\u00cc\u00cd\u0001\u0000\u0000\u0000\u00cd\u00cf\u0005.\u0000"+ + "\u0000\u00ce\u00d0\u0003^.\u0000\u00cf\u00ce\u0001\u0000\u0000\u0000\u00d0"+ + "\u00d1\u0001\u0000\u0000\u0000\u00d1\u00cf\u0001\u0000\u0000\u0000\u00d1"+ + "\u00d2\u0001\u0000\u0000\u0000\u00d2\u0017\u0001\u0000\u0000\u0000\u00d3"+ + "\u00d4\u0005e\u0000\u0000\u00d4\u00d5\u0005x\u0000\u0000\u00d5\u00d6\u0005"+ + "t\u0000\u0000\u00d6\u00d7\u0005e\u0000\u0000\u00d7\u00d8\u0005n\u0000"+ + "\u0000\u00d8\u00d9\u0005d\u0000\u0000\u00d9\u0019\u0001\u0000\u0000\u0000"+ + "\u00da\u00db\u0005t\u0000\u0000\u00db\u00dc\u0005y\u0000\u0000\u00dc\u00dd"+ + "\u0005p\u0000\u0000\u00dd\u00de\u0005e\u0000\u0000\u00de\u001b\u0001\u0000"+ + "\u0000\u0000\u00df\u00e0\u0005c\u0000\u0000\u00e0\u00e1\u0005o\u0000\u0000"+ + "\u00e1\u00e2\u0005n\u0000\u0000\u00e2\u00e3\u0005d\u0000\u0000\u00e3\u00e4"+ + "\u0005i\u0000\u0000\u00e4\u00e5\u0005t\u0000\u0000\u00e5\u00e6\u0005i"+ + "\u0000\u0000\u00e6\u00e7\u0005o\u0000\u0000\u00e7\u00e8\u0005n\u0000\u0000"+ + "\u00e8\u00e9\u0001\u0000\u0000\u0000\u00e9\u00ea\u0006\r\u0000\u0000\u00ea"+ + "\u001d\u0001\u0000\u0000\u0000\u00eb\u00ec\u0005r\u0000\u0000\u00ec\u00ed"+ + "\u0005e\u0000\u0000\u00ed\u00ee\u0005l\u0000\u0000\u00ee\u00ef\u0005a"+ + "\u0000\u0000\u00ef\u00f0\u0005t\u0000\u0000\u00f0\u00f1\u0005i\u0000\u0000"+ + "\u00f1\u00f2\u0005o\u0000\u0000\u00f2\u00f3\u0005n\u0000\u0000\u00f3\u00f4"+ + "\u0005s\u0000\u0000\u00f4\u001f\u0001\u0000\u0000\u0000\u00f5\u00f6\u0005"+ + "r\u0000\u0000\u00f6\u00f7\u0005e\u0000\u0000\u00f7\u00f8\u0005l\u0000"+ + "\u0000\u00f8\u00f9\u0005a\u0000\u0000\u00f9\u00fa\u0005t\u0000\u0000\u00fa"+ + "\u00fb\u0005i\u0000\u0000\u00fb\u00fc\u0005o\u0000\u0000\u00fc\u00fd\u0005"+ + "n\u0000\u0000\u00fd!\u0001\u0000\u0000\u0000\u00fe\u00ff\u0005d\u0000"+ + "\u0000\u00ff\u0100\u0005e\u0000\u0000\u0100\u0101\u0005f\u0000\u0000\u0101"+ + "\u0102\u0005i\u0000\u0000\u0102\u0103\u0005n\u0000\u0000\u0103\u0104\u0005"+ + "e\u0000\u0000\u0104#\u0001\u0000\u0000\u0000\u0105\u0106\u0005w\u0000"+ + "\u0000\u0106\u0107\u0005i\u0000\u0000\u0107\u0108\u0005t\u0000\u0000\u0108"+ + "\u0109\u0005h\u0000\u0000\u0109%\u0001\u0000\u0000\u0000\u010a\u010b\u0005"+ + "=\u0000\u0000\u010b\u010c\u0005=\u0000\u0000\u010c\'\u0001\u0000\u0000"+ + "\u0000\u010d\u010e\u0005!\u0000\u0000\u010e\u010f\u0005=\u0000\u0000\u010f"+ + ")\u0001\u0000\u0000\u0000\u0110\u0111\u0005i\u0000\u0000\u0111\u0112\u0005"+ + "n\u0000\u0000\u0112+\u0001\u0000\u0000\u0000\u0113\u0114\u0005<\u0000"+ + "\u0000\u0114-\u0001\u0000\u0000\u0000\u0115\u0116\u0005<\u0000\u0000\u0116"+ + "\u0117\u0005=\u0000\u0000\u0117/\u0001\u0000\u0000\u0000\u0118\u0119\u0005"+ + ">\u0000\u0000\u0119\u011a\u0005=\u0000\u0000\u011a1\u0001\u0000\u0000"+ + "\u0000\u011b\u011c\u0005>\u0000\u0000\u011c3\u0001\u0000\u0000\u0000\u011d"+ + "\u011e\u0005&\u0000\u0000\u011e\u011f\u0005&\u0000\u0000\u011f5\u0001"+ + "\u0000\u0000\u0000\u0120\u0121\u0005|\u0000\u0000\u0121\u0122\u0005|\u0000"+ + "\u0000\u01227\u0001\u0000\u0000\u0000\u0123\u0124\u0005[\u0000\u0000\u0124"+ + "9\u0001\u0000\u0000\u0000\u0125\u0126\u0005]\u0000\u0000\u0126;\u0001"+ + "\u0000\u0000\u0000\u0127\u0128\u0005{\u0000\u0000\u0128=\u0001\u0000\u0000"+ + "\u0000\u0129\u012a\u0005}\u0000\u0000\u012a?\u0001\u0000\u0000\u0000\u012b"+ + "\u012c\u0005(\u0000\u0000\u012cA\u0001\u0000\u0000\u0000\u012d\u012e\u0005"+ + ")\u0000\u0000\u012eC\u0001\u0000\u0000\u0000\u012f\u0130\u0005.\u0000"+ + "\u0000\u0130E\u0001\u0000\u0000\u0000\u0131\u0132\u0005-\u0000\u0000\u0132"+ + "G\u0001\u0000\u0000\u0000\u0133\u0134\u0005!\u0000\u0000\u0134I\u0001"+ + "\u0000\u0000\u0000\u0135\u0136\u0005?\u0000\u0000\u0136K\u0001\u0000\u0000"+ + "\u0000\u0137\u0138\u0005+\u0000\u0000\u0138M\u0001\u0000\u0000\u0000\u0139"+ + "\u013a\u0005*\u0000\u0000\u013aO\u0001\u0000\u0000\u0000\u013b\u013c\u0005"+ + "/\u0000\u0000\u013cQ\u0001\u0000\u0000\u0000\u013d\u013e\u0005%\u0000"+ + "\u0000\u013eS\u0001\u0000\u0000\u0000\u013f\u0140\u0005t\u0000\u0000\u0140"+ + "\u0141\u0005r\u0000\u0000\u0141\u0142\u0005u\u0000\u0000\u0142\u0143\u0005"+ + "e\u0000\u0000\u0143U\u0001\u0000\u0000\u0000\u0144\u0145\u0005f\u0000"+ + "\u0000\u0145\u0146\u0005a\u0000\u0000\u0146\u0147\u0005l\u0000\u0000\u0147"+ + "\u0148\u0005s\u0000\u0000\u0148\u0149\u0005e\u0000\u0000\u0149W\u0001"+ + "\u0000\u0000\u0000\u014a\u014b\u0005n\u0000\u0000\u014b\u014c\u0005u\u0000"+ + "\u0000\u014c\u014d\u0005l\u0000\u0000\u014d\u014e\u0005l\u0000\u0000\u014e"+ + "Y\u0001\u0000\u0000\u0000\u014f\u0150\u0005\\\u0000\u0000\u0150[\u0001"+ + "\u0000\u0000\u0000\u0151\u0152\u0007\u0000\u0000\u0000\u0152]\u0001\u0000"+ + "\u0000\u0000\u0153\u0154\u000209\u0000\u0154_\u0001\u0000\u0000\u0000"+ + "\u0155\u0157\u0007\u0001\u0000\u0000\u0156\u0158\u0007\u0002\u0000\u0000"+ + "\u0157\u0156\u0001\u0000\u0000\u0000\u0157\u0158\u0001\u0000\u0000\u0000"+ + "\u0158\u015a\u0001\u0000\u0000\u0000\u0159\u015b\u0003^.\u0000\u015a\u0159"+ + "\u0001\u0000\u0000\u0000\u015b\u015c\u0001\u0000\u0000\u0000\u015c\u015a"+ + "\u0001\u0000\u0000\u0000\u015c\u015d\u0001\u0000\u0000\u0000\u015da\u0001"+ + "\u0000\u0000\u0000\u015e\u015f\u0007\u0003\u0000\u0000\u015fc\u0001\u0000"+ + "\u0000\u0000\u0160\u0161\u0007\u0004\u0000\u0000\u0161e\u0001\u0000\u0000"+ + "\u0000\u0162\u0167\u0003h3\u0000\u0163\u0167\u0003l5\u0000\u0164\u0167"+ + "\u0003n6\u0000\u0165\u0167\u0003j4\u0000\u0166\u0162\u0001\u0000\u0000"+ + "\u0000\u0166\u0163\u0001\u0000\u0000\u0000\u0166\u0164\u0001\u0000\u0000"+ + "\u0000\u0166\u0165\u0001\u0000\u0000\u0000\u0167g\u0001\u0000\u0000\u0000"+ + "\u0168\u0169\u0003Z,\u0000\u0169\u016a\u0007\u0005\u0000\u0000\u016ai"+ + "\u0001\u0000\u0000\u0000\u016b\u016c\u0003Z,\u0000\u016c\u016d\u00020"+ + "3\u0000\u016d\u016e\u000207\u0000\u016e\u016f\u000207\u0000\u016fk\u0001"+ + "\u0000\u0000\u0000\u0170\u0171\u0003Z,\u0000\u0171\u0172\u0007\u0006\u0000"+ + "\u0000\u0172\u0173\u0003b0\u0000\u0173\u0174\u0003b0\u0000\u0174m\u0001"+ + "\u0000\u0000\u0000\u0175\u0176\u0003Z,\u0000\u0176\u0177\u0005u\u0000"+ + "\u0000\u0177\u0178\u0003b0\u0000\u0178\u0179\u0003b0\u0000\u0179\u017a"+ + "\u0003b0\u0000\u017a\u017b\u0003b0\u0000\u017b\u0188\u0001\u0000\u0000"+ + "\u0000\u017c\u017d\u0003Z,\u0000\u017d\u017e\u0005U\u0000\u0000\u017e"+ + "\u017f\u0003b0\u0000\u017f\u0180\u0003b0\u0000\u0180\u0181\u0003b0\u0000"+ + "\u0181\u0182\u0003b0\u0000\u0182\u0183\u0003b0\u0000\u0183\u0184\u0003"+ + "b0\u0000\u0184\u0185\u0003b0\u0000\u0185\u0186\u0003b0\u0000\u0186\u0188"+ + "\u0001\u0000\u0000\u0000\u0187\u0175\u0001\u0000\u0000\u0000\u0187\u017c"+ + "\u0001\u0000\u0000\u0000\u0188o\u0001\u0000\u0000\u0000\u0189\u018b\u0007"+ + "\u0007\u0000\u0000\u018a\u0189\u0001\u0000\u0000\u0000\u018b\u018c\u0001"+ + "\u0000\u0000\u0000\u018c\u018a\u0001\u0000\u0000\u0000\u018c\u018d\u0001"+ + "\u0000\u0000\u0000\u018dq\u0001\u0000\u0000\u0000\u018e\u018f\u0005/\u0000"+ + "\u0000\u018f\u0190\u0005/\u0000\u0000\u0190\u0194\u0001\u0000\u0000\u0000"+ + "\u0191\u0193\b\b\u0000\u0000\u0192\u0191\u0001\u0000\u0000\u0000\u0193"+ + "\u0196\u0001\u0000\u0000\u0000\u0194\u0192\u0001\u0000\u0000\u0000\u0194"+ + "\u0195\u0001\u0000\u0000\u0000\u0195\u0197\u0001\u0000\u0000\u0000\u0196"+ + "\u0194\u0001\u0000\u0000\u0000\u0197\u0198\u00068\u0001\u0000\u0198s\u0001"+ + "\u0000\u0000\u0000\u0199\u019b\u0003^.\u0000\u019a\u0199\u0001\u0000\u0000"+ + "\u0000\u019b\u019c\u0001\u0000\u0000\u0000\u019c\u019a\u0001\u0000\u0000"+ + "\u0000\u019c\u019d\u0001\u0000\u0000\u0000\u019d\u019e\u0001\u0000\u0000"+ + "\u0000\u019e\u01a0\u0005.\u0000\u0000\u019f\u01a1\u0003^.\u0000\u01a0"+ + "\u019f\u0001\u0000\u0000\u0000\u01a1\u01a2\u0001\u0000\u0000\u0000\u01a2"+ + "\u01a0\u0001\u0000\u0000\u0000\u01a2\u01a3\u0001\u0000\u0000\u0000\u01a3"+ + "\u01a5\u0001\u0000\u0000\u0000\u01a4\u01a6\u0003`/\u0000\u01a5\u01a4\u0001"+ + "\u0000\u0000\u0000\u01a5\u01a6\u0001\u0000\u0000\u0000\u01a6\u01b8\u0001"+ + "\u0000\u0000\u0000\u01a7\u01a9\u0003^.\u0000\u01a8\u01a7\u0001\u0000\u0000"+ + "\u0000\u01a9\u01aa\u0001\u0000\u0000\u0000\u01aa\u01a8\u0001\u0000\u0000"+ + "\u0000\u01aa\u01ab\u0001\u0000\u0000\u0000\u01ab\u01ac\u0001\u0000\u0000"+ + "\u0000\u01ac\u01ad\u0003`/\u0000\u01ad\u01b8\u0001\u0000\u0000\u0000\u01ae"+ + "\u01b0\u0005.\u0000\u0000\u01af\u01b1\u0003^.\u0000\u01b0\u01af\u0001"+ + "\u0000\u0000\u0000\u01b1\u01b2\u0001\u0000\u0000\u0000\u01b2\u01b0\u0001"+ + "\u0000\u0000\u0000\u01b2\u01b3\u0001\u0000\u0000\u0000\u01b3\u01b5\u0001"+ + "\u0000\u0000\u0000\u01b4\u01b6\u0003`/\u0000\u01b5\u01b4\u0001\u0000\u0000"+ + "\u0000\u01b5\u01b6\u0001\u0000\u0000\u0000\u01b6\u01b8\u0001\u0000\u0000"+ + "\u0000\u01b7\u019a\u0001\u0000\u0000\u0000\u01b7\u01a8\u0001\u0000\u0000"+ + "\u0000\u01b7\u01ae\u0001\u0000\u0000\u0000\u01b8u\u0001\u0000\u0000\u0000"+ + "\u01b9\u01bb\u0003^.\u0000\u01ba\u01b9\u0001\u0000\u0000\u0000\u01bb\u01bc"+ + "\u0001\u0000\u0000\u0000\u01bc\u01ba\u0001\u0000\u0000\u0000\u01bc\u01bd"+ + "\u0001\u0000\u0000\u0000\u01bd\u01c7\u0001\u0000\u0000\u0000\u01be\u01bf"+ + "\u00050\u0000\u0000\u01bf\u01c0\u0005x\u0000\u0000\u01c0\u01c2\u0001\u0000"+ + "\u0000\u0000\u01c1\u01c3\u0003b0\u0000\u01c2\u01c1\u0001\u0000\u0000\u0000"+ + "\u01c3\u01c4\u0001\u0000\u0000\u0000\u01c4\u01c2\u0001\u0000\u0000\u0000"+ + "\u01c4\u01c5\u0001\u0000\u0000\u0000\u01c5\u01c7\u0001\u0000\u0000\u0000"+ + "\u01c6\u01ba\u0001\u0000\u0000\u0000\u01c6\u01be\u0001\u0000\u0000\u0000"+ + "\u01c7w\u0001\u0000\u0000\u0000\u01c8\u01ca\u0003^.\u0000\u01c9\u01c8"+ + "\u0001\u0000\u0000\u0000\u01ca\u01cb\u0001\u0000\u0000\u0000\u01cb\u01c9"+ + "\u0001\u0000\u0000\u0000\u01cb\u01cc\u0001\u0000\u0000\u0000\u01cc\u01cd"+ + "\u0001\u0000\u0000\u0000\u01cd\u01ce\u0007\t\u0000\u0000\u01ce\u01da\u0001"+ + "\u0000\u0000\u0000\u01cf\u01d0\u00050\u0000\u0000\u01d0\u01d1\u0005x\u0000"+ + "\u0000\u01d1\u01d3\u0001\u0000\u0000\u0000\u01d2\u01d4\u0003b0\u0000\u01d3"+ + "\u01d2\u0001\u0000\u0000\u0000\u01d4\u01d5\u0001\u0000\u0000\u0000\u01d5"+ + "\u01d3\u0001\u0000\u0000\u0000\u01d5\u01d6\u0001\u0000\u0000\u0000\u01d6"+ + "\u01d7\u0001\u0000\u0000\u0000\u01d7\u01d8\u0007\t\u0000\u0000\u01d8\u01da"+ + "\u0001\u0000\u0000\u0000\u01d9\u01c9\u0001\u0000\u0000\u0000\u01d9\u01cf"+ + "\u0001\u0000\u0000\u0000\u01day\u0001\u0000\u0000\u0000\u01db\u01e0\u0005"+ + "\"\u0000\u0000\u01dc\u01df\u0003f2\u0000\u01dd\u01df\b\n\u0000\u0000\u01de"+ + "\u01dc\u0001\u0000\u0000\u0000\u01de\u01dd\u0001\u0000\u0000\u0000\u01df"+ + "\u01e2\u0001\u0000\u0000\u0000\u01e0\u01de\u0001\u0000\u0000\u0000\u01e0"+ + "\u01e1\u0001\u0000\u0000\u0000\u01e1\u01e3\u0001\u0000\u0000\u0000\u01e2"+ + "\u01e0\u0001\u0000\u0000\u0000\u01e3\u023c\u0005\"\u0000\u0000\u01e4\u01e9"+ + "\u0005\'\u0000\u0000\u01e5\u01e8\u0003f2\u0000\u01e6\u01e8\b\u000b\u0000"+ + "\u0000\u01e7\u01e5\u0001\u0000\u0000\u0000\u01e7\u01e6\u0001\u0000\u0000"+ + "\u0000\u01e8\u01eb\u0001\u0000\u0000\u0000\u01e9\u01e7\u0001\u0000\u0000"+ + "\u0000\u01e9\u01ea\u0001\u0000\u0000\u0000\u01ea\u01ec\u0001\u0000\u0000"+ + "\u0000\u01eb\u01e9\u0001\u0000\u0000\u0000\u01ec\u023c\u0005\'\u0000\u0000"+ + "\u01ed\u01ee\u0005\"\u0000\u0000\u01ee\u01ef\u0005\"\u0000\u0000\u01ef"+ + "\u01f0\u0005\"\u0000\u0000\u01f0\u01f5\u0001\u0000\u0000\u0000\u01f1\u01f4"+ + "\u0003f2\u0000\u01f2\u01f4\b\f\u0000\u0000\u01f3\u01f1\u0001\u0000\u0000"+ + "\u0000\u01f3\u01f2\u0001\u0000\u0000\u0000\u01f4\u01f7\u0001\u0000\u0000"+ + "\u0000\u01f5\u01f6\u0001\u0000\u0000\u0000\u01f5\u01f3\u0001\u0000\u0000"+ + "\u0000\u01f6\u01f8\u0001\u0000\u0000\u0000\u01f7\u01f5\u0001\u0000\u0000"+ + "\u0000\u01f8\u01f9\u0005\"\u0000\u0000\u01f9\u01fa\u0005\"\u0000\u0000"+ + "\u01fa\u023c\u0005\"\u0000\u0000\u01fb\u01fc\u0005\'\u0000\u0000\u01fc"+ + "\u01fd\u0005\'\u0000\u0000\u01fd\u01fe\u0005\'\u0000\u0000\u01fe\u0203"+ + "\u0001\u0000\u0000\u0000\u01ff\u0202\u0003f2\u0000\u0200\u0202\b\f\u0000"+ + "\u0000\u0201\u01ff\u0001\u0000\u0000\u0000\u0201\u0200\u0001\u0000\u0000"+ + "\u0000\u0202\u0205\u0001\u0000\u0000\u0000\u0203\u0204\u0001\u0000\u0000"+ + "\u0000\u0203\u0201\u0001\u0000\u0000\u0000\u0204\u0206\u0001\u0000\u0000"+ + "\u0000\u0205\u0203\u0001\u0000\u0000\u0000\u0206\u0207\u0005\'\u0000\u0000"+ + "\u0207\u0208\u0005\'\u0000\u0000\u0208\u023c\u0005\'\u0000\u0000\u0209"+ + "\u020a\u0003d1\u0000\u020a\u020e\u0005\"\u0000\u0000\u020b\u020d\b\r\u0000"+ + "\u0000\u020c\u020b\u0001\u0000\u0000\u0000\u020d\u0210\u0001\u0000\u0000"+ + "\u0000\u020e\u020c\u0001\u0000\u0000\u0000\u020e\u020f\u0001\u0000\u0000"+ + "\u0000\u020f\u0211\u0001\u0000\u0000\u0000\u0210\u020e\u0001\u0000\u0000"+ + "\u0000\u0211\u0212\u0005\"\u0000\u0000\u0212\u023c\u0001\u0000\u0000\u0000"+ + "\u0213\u0214\u0003d1\u0000\u0214\u0218\u0005\'\u0000\u0000\u0215\u0217"+ + "\b\u000e\u0000\u0000\u0216\u0215\u0001\u0000\u0000\u0000\u0217\u021a\u0001"+ + "\u0000\u0000\u0000\u0218\u0216\u0001\u0000\u0000\u0000\u0218\u0219\u0001"+ + "\u0000\u0000\u0000\u0219\u021b\u0001\u0000\u0000\u0000\u021a\u0218\u0001"+ + "\u0000\u0000\u0000\u021b\u021c\u0005\'\u0000\u0000\u021c\u023c\u0001\u0000"+ + "\u0000\u0000\u021d\u021e\u0003d1\u0000\u021e\u021f\u0005\"\u0000\u0000"+ + "\u021f\u0220\u0005\"\u0000\u0000\u0220\u0221\u0005\"\u0000\u0000\u0221"+ + "\u0225\u0001\u0000\u0000\u0000\u0222\u0224\t\u0000\u0000\u0000\u0223\u0222"+ + "\u0001\u0000\u0000\u0000\u0224\u0227\u0001\u0000\u0000\u0000\u0225\u0226"+ + "\u0001\u0000\u0000\u0000\u0225\u0223\u0001\u0000\u0000\u0000\u0226\u0228"+ + "\u0001\u0000\u0000\u0000\u0227\u0225\u0001\u0000\u0000\u0000\u0228\u0229"+ + "\u0005\"\u0000\u0000\u0229\u022a\u0005\"\u0000\u0000\u022a\u022b\u0005"+ + "\"\u0000\u0000\u022b\u023c\u0001\u0000\u0000\u0000\u022c\u022d\u0003d"+ + "1\u0000\u022d\u022e\u0005\'\u0000\u0000\u022e\u022f\u0005\'\u0000\u0000"+ + "\u022f\u0230\u0005\'\u0000\u0000\u0230\u0234\u0001\u0000\u0000\u0000\u0231"+ + "\u0233\t\u0000\u0000\u0000\u0232\u0231\u0001\u0000\u0000\u0000\u0233\u0236"+ + "\u0001\u0000\u0000\u0000\u0234\u0235\u0001\u0000\u0000\u0000\u0234\u0232"+ + "\u0001\u0000\u0000\u0000\u0235\u0237\u0001\u0000\u0000\u0000\u0236\u0234"+ + "\u0001\u0000\u0000\u0000\u0237\u0238\u0005\'\u0000\u0000\u0238\u0239\u0005"+ + "\'\u0000\u0000\u0239\u023a\u0005\'\u0000\u0000\u023a\u023c\u0001\u0000"+ + "\u0000\u0000\u023b\u01db\u0001\u0000\u0000\u0000\u023b\u01e4\u0001\u0000"+ + "\u0000\u0000\u023b\u01ed\u0001\u0000\u0000\u0000\u023b\u01fb\u0001\u0000"+ + "\u0000\u0000\u023b\u0209\u0001\u0000\u0000\u0000\u023b\u0213\u0001\u0000"+ + "\u0000\u0000\u023b\u021d\u0001\u0000\u0000\u0000\u023b\u022c\u0001\u0000"+ + "\u0000\u0000\u023c{\u0001\u0000\u0000\u0000\u023d\u023e\u0007\u000f\u0000"+ + "\u0000\u023e\u023f\u0003z<\u0000\u023f}\u0001\u0000\u0000\u0000\u0240"+ + "\u0241\u0005$\u0000\u0000\u0241\u0242\u0005e\u0000\u0000\u0242\u0243\u0005"+ + "x\u0000\u0000\u0243\u0244\u0005p\u0000\u0000\u0244\u0245\u0005r\u0000"+ + "\u0000\u0245\u0246\u0005e\u0000\u0000\u0246\u0247\u0005s\u0000\u0000\u0247"+ + "\u0248\u0005s\u0000\u0000\u0248\u0249\u0005i\u0000\u0000\u0249\u024a\u0005"+ + "o\u0000\u0000\u024a\u024b\u0005n\u0000\u0000\u024b\u007f\u0001\u0000\u0000"+ + "\u0000\u024c\u024f\u0003\\-\u0000\u024d\u024f\u0005_\u0000\u0000\u024e"+ + "\u024c\u0001\u0000\u0000\u0000\u024e\u024d\u0001\u0000\u0000\u0000\u024f"+ + "\u0256\u0001\u0000\u0000\u0000\u0250\u0255\u0003\\-\u0000\u0251\u0255"+ + "\u0003^.\u0000\u0252\u0255\u0005_\u0000\u0000\u0253\u0255\u0003F\"\u0000"+ + "\u0254\u0250\u0001\u0000\u0000\u0000\u0254\u0251\u0001\u0000\u0000\u0000"+ + "\u0254\u0252\u0001\u0000\u0000\u0000\u0254\u0253\u0001\u0000\u0000\u0000"+ + "\u0255\u0258\u0001\u0000\u0000\u0000\u0256\u0254\u0001\u0000\u0000\u0000"+ + "\u0256\u0257\u0001\u0000\u0000\u0000\u0257\u0081\u0001\u0000\u0000\u0000"+ + "\u0258\u0256\u0001\u0000\u0000\u0000\u0259\u025c\u0003\\-\u0000\u025a"+ + "\u025c\u0005_\u0000\u0000\u025b\u0259\u0001\u0000\u0000\u0000\u025b\u025a"+ + "\u0001\u0000\u0000\u0000\u025c\u026b\u0001\u0000\u0000\u0000\u025d\u0261"+ + "\u0003P\'\u0000\u025e\u0261\u0003D!\u0000\u025f\u0261\u0003F\"\u0000\u0260"+ + "\u025d\u0001\u0000\u0000\u0000\u0260\u025e\u0001\u0000\u0000\u0000\u0260"+ + "\u025f\u0001\u0000\u0000\u0000\u0260\u0261\u0001\u0000\u0000\u0000\u0261"+ + "\u0265\u0001\u0000\u0000\u0000\u0262\u0266\u0003\\-\u0000\u0263\u0266"+ + "\u0003^.\u0000\u0264\u0266\u0005_\u0000\u0000\u0265\u0262\u0001\u0000"+ + "\u0000\u0000\u0265\u0263\u0001\u0000\u0000\u0000\u0265\u0264\u0001\u0000"+ + "\u0000\u0000\u0266\u0267\u0001\u0000\u0000\u0000\u0267\u0265\u0001\u0000"+ + "\u0000\u0000\u0267\u0268\u0001\u0000\u0000\u0000\u0268\u026a\u0001\u0000"+ + "\u0000\u0000\u0269\u0260\u0001\u0000\u0000\u0000\u026a\u026d\u0001\u0000"+ + "\u0000\u0000\u026b\u0269\u0001\u0000\u0000\u0000\u026b\u026c\u0001\u0000"+ + "\u0000\u0000\u026c\u0083\u0001\u0000\u0000\u0000\u026d\u026b\u0001\u0000"+ + "\u0000\u0000\u026e\u0270\u0003p7\u0000\u026f\u026e\u0001\u0000\u0000\u0000"+ + "\u026f\u0270\u0001\u0000\u0000\u0000\u0270\u0276\u0001\u0000\u0000\u0000"+ + "\u0271\u0273\u0005\r\u0000\u0000\u0272\u0271\u0001\u0000\u0000\u0000\u0272"+ + "\u0273\u0001\u0000\u0000\u0000\u0273\u0274\u0001\u0000\u0000\u0000\u0274"+ + "\u0277\u0005\n\u0000\u0000\u0275\u0277\u0002\f\r\u0000\u0276\u0272\u0001"+ + "\u0000\u0000\u0000\u0276\u0275\u0001\u0000\u0000\u0000\u0277\u0279\u0001"+ + "\u0000\u0000\u0000\u0278\u027a\u0003p7\u0000\u0279\u0278\u0001\u0000\u0000"+ + "\u0000\u0279\u027a\u0001\u0000\u0000\u0000\u027a\u027c\u0001\u0000\u0000"+ + "\u0000\u027b\u027d\u0003\u0084A\u0000\u027c\u027b\u0001\u0000\u0000\u0000"+ + "\u027c\u027d\u0001\u0000\u0000\u0000\u027d\u0085\u0001\u0000\u0000\u0000"+ + "\u027e\u027f\u0003B \u0000\u027f\u0280\u0001\u0000\u0000\u0000\u0280\u0281"+ + "\u0006B\u0002\u0000\u0281\u0282\u0006B\u0003\u0000\u0282\u0087\u0001\u0000"+ + "\u0000\u0000\u0283\u0284\u0005m\u0000\u0000\u0284\u0285\u0005a\u0000\u0000"+ + "\u0285\u028b\u0005p\u0000\u0000\u0286\u0287\u0005l\u0000\u0000\u0287\u0288"+ + "\u0005i\u0000\u0000\u0288\u0289\u0005s\u0000\u0000\u0289\u028b\u0005t"+ + "\u0000\u0000\u028a\u0283\u0001\u0000\u0000\u0000\u028a\u0286\u0001\u0000"+ + "\u0000\u0000\u028b\u0089\u0001\u0000\u0000\u0000\u028c\u028d\u0005b\u0000"+ + "\u0000\u028d\u028e\u0005o\u0000\u0000\u028e\u028f\u0005o\u0000\u0000\u028f"+ + "\u02be\u0005l\u0000\u0000\u0290\u0291\u0005s\u0000\u0000\u0291\u0292\u0005"+ + "t\u0000\u0000\u0292\u0293\u0005r\u0000\u0000\u0293\u0294\u0005i\u0000"+ + "\u0000\u0294\u0295\u0005n\u0000\u0000\u0295\u02be\u0005g\u0000\u0000\u0296"+ + "\u0297\u0005i\u0000\u0000\u0297\u0298\u0005n\u0000\u0000\u0298\u02be\u0005"+ + "t\u0000\u0000\u0299\u029a\u0005u\u0000\u0000\u029a\u029b\u0005i\u0000"+ + "\u0000\u029b\u029c\u0005n\u0000\u0000\u029c\u02be\u0005t\u0000\u0000\u029d"+ + "\u029e\u0005d\u0000\u0000\u029e\u029f\u0005o\u0000\u0000\u029f\u02a0\u0005"+ + "u\u0000\u0000\u02a0\u02a1\u0005b\u0000\u0000\u02a1\u02a2\u0005l\u0000"+ + "\u0000\u02a2\u02be\u0005e\u0000\u0000\u02a3\u02a4\u0005d\u0000\u0000\u02a4"+ + "\u02a5\u0005u\u0000\u0000\u02a5\u02a6\u0005r\u0000\u0000\u02a6\u02a7\u0005"+ + "a\u0000\u0000\u02a7\u02a8\u0005t\u0000\u0000\u02a8\u02a9\u0005i\u0000"+ + "\u0000\u02a9\u02aa\u0005o\u0000\u0000\u02aa\u02be\u0005n\u0000\u0000\u02ab"+ + "\u02ac\u0005t\u0000\u0000\u02ac\u02ad\u0005i\u0000\u0000\u02ad\u02ae\u0005"+ + "m\u0000\u0000\u02ae\u02af\u0005e\u0000\u0000\u02af\u02b0\u0005s\u0000"+ + "\u0000\u02b0\u02b1\u0005t\u0000\u0000\u02b1\u02b2\u0005a\u0000\u0000\u02b2"+ + "\u02b3\u0005m\u0000\u0000\u02b3\u02be\u0005p\u0000\u0000\u02b4\u02b5\u0005"+ + "i\u0000\u0000\u02b5\u02b6\u0005p\u0000\u0000\u02b6\u02b7\u0005a\u0000"+ + "\u0000\u02b7\u02b8\u0005d\u0000\u0000\u02b8\u02b9\u0005d\u0000\u0000\u02b9"+ + "\u02ba\u0005r\u0000\u0000\u02ba\u02bb\u0005e\u0000\u0000\u02bb\u02bc\u0005"+ + "s\u0000\u0000\u02bc\u02be\u0005s\u0000\u0000\u02bd\u028c\u0001\u0000\u0000"+ + "\u0000\u02bd\u0290\u0001\u0000\u0000\u0000\u02bd\u0296\u0001\u0000\u0000"+ + "\u0000\u02bd\u0299\u0001\u0000\u0000\u0000\u02bd\u029d\u0001\u0000\u0000"+ + "\u0000\u02bd\u02a3\u0001\u0000\u0000\u0000\u02bd\u02ab\u0001\u0000\u0000"+ + "\u0000\u02bd\u02b4\u0001\u0000\u0000\u0000\u02be\u008b\u0001\u0000\u0000"+ + "\u0000\u02bf\u02c0\u0003,\u0015\u0000\u02c0\u02c1\u0001\u0000\u0000\u0000"+ + "\u02c1\u02c2\u0006E\u0004\u0000\u02c2\u008d\u0001\u0000\u0000\u0000\u02c3"+ + "\u02c4\u00032\u0018\u0000\u02c4\u02c5\u0001\u0000\u0000\u0000\u02c5\u02c6"+ + "\u0006F\u0005\u0000\u02c6\u008f\u0001\u0000\u0000\u0000\u02c7\u02c8\u0003"+ + "@\u001f\u0000\u02c8\u02c9\u0001\u0000\u0000\u0000\u02c9\u02ca\u0006G\u0006"+ + "\u0000\u02ca\u0091\u0001\u0000\u0000\u0000\u02cb\u02cc\u0003\u0004\u0001"+ + "\u0000\u02cc\u02cd\u0001\u0000\u0000\u0000\u02cd\u02ce\u0006H\u0007\u0000"+ + "\u02ce\u0093\u0001\u0000\u0000\u0000\u02cf\u02d0\u0003\u0006\u0002\u0000"+ + "\u02d0\u02d1\u0001\u0000\u0000\u0000\u02d1\u02d2\u0006I\b\u0000\u02d2"+ + "\u0095\u0001\u0000\u0000\u0000\u02d3\u02d4\u0003p7\u0000\u02d4\u02d5\u0001"+ + "\u0000\u0000\u0000\u02d5\u02d6\u0006J\t\u0000\u02d6\u0097\u0001\u0000"+ + "\u0000\u0000\u02d7\u02d8\u0003\u0080?\u0000\u02d8\u02d9\u0001\u0000\u0000"+ + "\u0000\u02d9\u02da\u0006K\n\u0000\u02da\u0099\u0001\u0000\u0000\u0000"+ + "3\u0000\u0001\u00cb\u00d1\u0157\u015c\u0166\u0187\u018c\u0194\u019c\u01a2"+ + "\u01a5\u01aa\u01b2\u01b5\u01b7\u01bc\u01c4\u01c6\u01cb\u01d5\u01d9\u01de"+ + "\u01e0\u01e7\u01e9\u01f3\u01f5\u0201\u0203\u020e\u0218\u0225\u0234\u023b"+ + "\u024e\u0254\u0256\u025b\u0260\u0265\u0267\u026b\u026f\u0272\u0276\u0279"+ + "\u027c\u028a\u02bd\u000b\u0005\u0001\u0000\u0000\u0001\u0000\u0007\b\u0000"+ + "\u0004\u0000\u0000\u0007\u0003\u0000\u0007\u0004\u0000\u0007\u0007\u0000"+ + "\u0007\u0001\u0000\u0007\u0002\u0000\u0007\t\u0000\u0007\n\u0000"; public static final ATN _ATN = new ATNDeserializer().deserialize(_serializedATN.toCharArray()); static { diff --git a/pkg/java/src/main/gen/dev/openfga/language/antlr/OpenFGALexer.tokens b/pkg/java/src/main/gen/dev/openfga/language/antlr/OpenFGALexer.tokens index 512cec30..b2523ac8 100644 --- a/pkg/java/src/main/gen/dev/openfga/language/antlr/OpenFGALexer.tokens +++ b/pkg/java/src/main/gen/dev/openfga/language/antlr/OpenFGALexer.tokens @@ -51,10 +51,11 @@ NUM_INT=50 NUM_UINT=51 STRING=52 BYTES=53 -EXTENDED_IDENTIFIER=54 -NEWLINE=55 -CONDITION_PARAM_CONTAINER=56 -CONDITION_PARAM_TYPE=57 +DOLLAR_EXPRESSION=54 +EXTENDED_IDENTIFIER=55 +NEWLINE=56 +CONDITION_PARAM_CONTAINER=57 +CONDITION_PARAM_TYPE=58 '#'=11 ':'=1 ','=2 @@ -98,3 +99,4 @@ CONDITION_PARAM_TYPE=57 'true'=45 'false'=46 'null'=47 +'$expression'=54 diff --git a/pkg/java/src/main/gen/dev/openfga/language/antlr/OpenFGAParser.interp b/pkg/java/src/main/gen/dev/openfga/language/antlr/OpenFGAParser.interp index 56431d97..fffd3847 100644 --- a/pkg/java/src/main/gen/dev/openfga/language/antlr/OpenFGAParser.interp +++ b/pkg/java/src/main/gen/dev/openfga/language/antlr/OpenFGAParser.interp @@ -53,6 +53,7 @@ null null null null +'$expression' null null null @@ -113,6 +114,7 @@ NUM_INT NUM_UINT STRING BYTES +DOLLAR_EXPRESSION EXTENDED_IDENTIFIER NEWLINE CONDITION_PARAM_CONTAINER @@ -149,4 +151,4 @@ conditionExpression atn: -[4, 1, 57, 392, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 1, 0, 3, 0, 56, 8, 0, 1, 0, 3, 0, 59, 8, 0, 1, 0, 1, 0, 3, 0, 63, 8, 0, 1, 0, 3, 0, 66, 8, 0, 1, 0, 1, 0, 3, 0, 70, 8, 0, 1, 0, 1, 0, 3, 0, 74, 8, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 3, 1, 81, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 89, 8, 1, 1, 2, 1, 2, 1, 2, 3, 2, 94, 8, 2, 1, 2, 1, 2, 1, 2, 1, 2, 3, 2, 100, 8, 2, 1, 3, 5, 3, 103, 8, 3, 10, 3, 12, 3, 106, 9, 3, 1, 4, 1, 4, 3, 4, 110, 8, 4, 1, 4, 1, 4, 1, 4, 3, 4, 115, 8, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 4, 4, 123, 8, 4, 11, 4, 12, 4, 124, 3, 4, 127, 8, 4, 1, 5, 1, 5, 3, 5, 131, 8, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 3, 5, 138, 8, 5, 1, 5, 1, 5, 3, 5, 142, 8, 5, 1, 5, 1, 5, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 3, 7, 151, 8, 7, 1, 7, 3, 7, 154, 8, 7, 1, 8, 1, 8, 3, 8, 158, 8, 8, 1, 8, 3, 8, 161, 8, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 3, 9, 168, 8, 9, 4, 9, 170, 8, 9, 11, 9, 12, 9, 171, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 3, 9, 179, 8, 9, 4, 9, 181, 8, 9, 11, 9, 12, 9, 182, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 3, 9, 190, 8, 9, 3, 9, 192, 8, 9, 1, 10, 1, 10, 1, 11, 1, 11, 5, 11, 198, 8, 11, 10, 11, 12, 11, 201, 9, 11, 1, 11, 1, 11, 3, 11, 205, 8, 11, 1, 11, 5, 11, 208, 8, 11, 10, 11, 12, 11, 211, 9, 11, 1, 11, 1, 11, 1, 12, 1, 12, 5, 12, 217, 8, 12, 10, 12, 12, 12, 220, 9, 12, 1, 12, 1, 12, 3, 12, 224, 8, 12, 1, 12, 5, 12, 227, 8, 12, 10, 12, 12, 12, 230, 9, 12, 1, 12, 1, 12, 1, 13, 1, 13, 3, 13, 236, 8, 13, 1, 13, 1, 13, 3, 13, 240, 8, 13, 1, 13, 1, 13, 3, 13, 244, 8, 13, 1, 13, 1, 13, 3, 13, 248, 8, 13, 5, 13, 250, 8, 13, 10, 13, 12, 13, 253, 9, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 3, 14, 262, 8, 14, 1, 15, 3, 15, 265, 8, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 3, 15, 274, 8, 15, 1, 15, 3, 15, 277, 8, 15, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 3, 16, 284, 8, 16, 1, 17, 5, 17, 287, 8, 17, 10, 17, 12, 17, 290, 9, 17, 1, 18, 1, 18, 3, 18, 294, 8, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 3, 18, 301, 8, 18, 1, 18, 1, 18, 3, 18, 305, 8, 18, 1, 18, 1, 18, 3, 18, 309, 8, 18, 1, 18, 1, 18, 3, 18, 313, 8, 18, 1, 18, 1, 18, 3, 18, 317, 8, 18, 5, 18, 319, 8, 18, 10, 18, 12, 18, 322, 9, 18, 1, 18, 3, 18, 325, 8, 18, 1, 18, 1, 18, 3, 18, 329, 8, 18, 1, 18, 1, 18, 3, 18, 333, 8, 18, 1, 18, 3, 18, 336, 8, 18, 1, 18, 1, 18, 3, 18, 340, 8, 18, 1, 18, 1, 18, 1, 19, 1, 19, 1, 20, 3, 20, 347, 8, 20, 1, 20, 1, 20, 3, 20, 351, 8, 20, 1, 20, 1, 20, 3, 20, 355, 8, 20, 1, 20, 1, 20, 1, 21, 1, 21, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 3, 22, 366, 8, 22, 1, 23, 1, 23, 5, 23, 370, 8, 23, 10, 23, 12, 23, 373, 9, 23, 1, 23, 1, 23, 3, 23, 377, 8, 23, 1, 24, 1, 24, 1, 25, 1, 25, 3, 25, 383, 8, 25, 1, 26, 1, 26, 5, 26, 387, 8, 26, 10, 26, 12, 26, 390, 9, 26, 1, 26, 0, 0, 27, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 0, 4, 1, 0, 55, 55, 4, 0, 10, 10, 16, 18, 20, 21, 24, 24, 5, 0, 3, 5, 7, 10, 27, 35, 37, 53, 55, 55, 1, 0, 36, 36, 433, 0, 55, 1, 0, 0, 0, 2, 80, 1, 0, 0, 0, 4, 93, 1, 0, 0, 0, 6, 104, 1, 0, 0, 0, 8, 109, 1, 0, 0, 0, 10, 130, 1, 0, 0, 0, 12, 145, 1, 0, 0, 0, 14, 150, 1, 0, 0, 0, 16, 157, 1, 0, 0, 0, 18, 191, 1, 0, 0, 0, 20, 193, 1, 0, 0, 0, 22, 195, 1, 0, 0, 0, 24, 214, 1, 0, 0, 0, 26, 233, 1, 0, 0, 0, 28, 256, 1, 0, 0, 0, 30, 264, 1, 0, 0, 0, 32, 278, 1, 0, 0, 0, 34, 288, 1, 0, 0, 0, 36, 293, 1, 0, 0, 0, 38, 343, 1, 0, 0, 0, 40, 346, 1, 0, 0, 0, 42, 358, 1, 0, 0, 0, 44, 365, 1, 0, 0, 0, 46, 367, 1, 0, 0, 0, 48, 378, 1, 0, 0, 0, 50, 382, 1, 0, 0, 0, 52, 388, 1, 0, 0, 0, 54, 56, 5, 9, 0, 0, 55, 54, 1, 0, 0, 0, 55, 56, 1, 0, 0, 0, 56, 58, 1, 0, 0, 0, 57, 59, 5, 55, 0, 0, 58, 57, 1, 0, 0, 0, 58, 59, 1, 0, 0, 0, 59, 62, 1, 0, 0, 0, 60, 63, 3, 2, 1, 0, 61, 63, 3, 4, 2, 0, 62, 60, 1, 0, 0, 0, 62, 61, 1, 0, 0, 0, 63, 65, 1, 0, 0, 0, 64, 66, 5, 55, 0, 0, 65, 64, 1, 0, 0, 0, 65, 66, 1, 0, 0, 0, 66, 67, 1, 0, 0, 0, 67, 69, 3, 6, 3, 0, 68, 70, 5, 55, 0, 0, 69, 68, 1, 0, 0, 0, 69, 70, 1, 0, 0, 0, 70, 71, 1, 0, 0, 0, 71, 73, 3, 34, 17, 0, 72, 74, 5, 55, 0, 0, 73, 72, 1, 0, 0, 0, 73, 74, 1, 0, 0, 0, 74, 75, 1, 0, 0, 0, 75, 76, 5, 0, 0, 1, 76, 1, 1, 0, 0, 0, 77, 78, 3, 46, 23, 0, 78, 79, 5, 55, 0, 0, 79, 81, 1, 0, 0, 0, 80, 77, 1, 0, 0, 0, 80, 81, 1, 0, 0, 0, 81, 82, 1, 0, 0, 0, 82, 83, 5, 17, 0, 0, 83, 84, 5, 55, 0, 0, 84, 85, 5, 18, 0, 0, 85, 86, 5, 9, 0, 0, 86, 88, 5, 19, 0, 0, 87, 89, 5, 9, 0, 0, 88, 87, 1, 0, 0, 0, 88, 89, 1, 0, 0, 0, 89, 3, 1, 0, 0, 0, 90, 91, 3, 46, 23, 0, 91, 92, 5, 55, 0, 0, 92, 94, 1, 0, 0, 0, 93, 90, 1, 0, 0, 0, 93, 94, 1, 0, 0, 0, 94, 95, 1, 0, 0, 0, 95, 96, 5, 16, 0, 0, 96, 97, 5, 9, 0, 0, 97, 99, 3, 48, 24, 0, 98, 100, 5, 9, 0, 0, 99, 98, 1, 0, 0, 0, 99, 100, 1, 0, 0, 0, 100, 5, 1, 0, 0, 0, 101, 103, 3, 8, 4, 0, 102, 101, 1, 0, 0, 0, 103, 106, 1, 0, 0, 0, 104, 102, 1, 0, 0, 0, 104, 105, 1, 0, 0, 0, 105, 7, 1, 0, 0, 0, 106, 104, 1, 0, 0, 0, 107, 108, 5, 55, 0, 0, 108, 110, 3, 46, 23, 0, 109, 107, 1, 0, 0, 0, 109, 110, 1, 0, 0, 0, 110, 111, 1, 0, 0, 0, 111, 114, 5, 55, 0, 0, 112, 113, 5, 20, 0, 0, 113, 115, 5, 9, 0, 0, 114, 112, 1, 0, 0, 0, 114, 115, 1, 0, 0, 0, 115, 116, 1, 0, 0, 0, 116, 117, 5, 21, 0, 0, 117, 118, 5, 9, 0, 0, 118, 126, 3, 50, 25, 0, 119, 120, 5, 55, 0, 0, 120, 122, 5, 23, 0, 0, 121, 123, 3, 10, 5, 0, 122, 121, 1, 0, 0, 0, 123, 124, 1, 0, 0, 0, 124, 122, 1, 0, 0, 0, 124, 125, 1, 0, 0, 0, 125, 127, 1, 0, 0, 0, 126, 119, 1, 0, 0, 0, 126, 127, 1, 0, 0, 0, 127, 9, 1, 0, 0, 0, 128, 129, 5, 55, 0, 0, 129, 131, 3, 46, 23, 0, 130, 128, 1, 0, 0, 0, 130, 131, 1, 0, 0, 0, 131, 132, 1, 0, 0, 0, 132, 133, 5, 55, 0, 0, 133, 134, 5, 25, 0, 0, 134, 135, 5, 9, 0, 0, 135, 137, 3, 12, 6, 0, 136, 138, 5, 9, 0, 0, 137, 136, 1, 0, 0, 0, 137, 138, 1, 0, 0, 0, 138, 139, 1, 0, 0, 0, 139, 141, 5, 1, 0, 0, 140, 142, 5, 9, 0, 0, 141, 140, 1, 0, 0, 0, 141, 142, 1, 0, 0, 0, 142, 143, 1, 0, 0, 0, 143, 144, 3, 14, 7, 0, 144, 11, 1, 0, 0, 0, 145, 146, 3, 50, 25, 0, 146, 13, 1, 0, 0, 0, 147, 151, 3, 26, 13, 0, 148, 151, 3, 20, 10, 0, 149, 151, 3, 22, 11, 0, 150, 147, 1, 0, 0, 0, 150, 148, 1, 0, 0, 0, 150, 149, 1, 0, 0, 0, 151, 153, 1, 0, 0, 0, 152, 154, 3, 18, 9, 0, 153, 152, 1, 0, 0, 0, 153, 154, 1, 0, 0, 0, 154, 15, 1, 0, 0, 0, 155, 158, 3, 20, 10, 0, 156, 158, 3, 24, 12, 0, 157, 155, 1, 0, 0, 0, 157, 156, 1, 0, 0, 0, 158, 160, 1, 0, 0, 0, 159, 161, 3, 18, 9, 0, 160, 159, 1, 0, 0, 0, 160, 161, 1, 0, 0, 0, 161, 17, 1, 0, 0, 0, 162, 163, 5, 9, 0, 0, 163, 164, 5, 13, 0, 0, 164, 167, 5, 9, 0, 0, 165, 168, 3, 20, 10, 0, 166, 168, 3, 24, 12, 0, 167, 165, 1, 0, 0, 0, 167, 166, 1, 0, 0, 0, 168, 170, 1, 0, 0, 0, 169, 162, 1, 0, 0, 0, 170, 171, 1, 0, 0, 0, 171, 169, 1, 0, 0, 0, 171, 172, 1, 0, 0, 0, 172, 192, 1, 0, 0, 0, 173, 174, 5, 9, 0, 0, 174, 175, 5, 12, 0, 0, 175, 178, 5, 9, 0, 0, 176, 179, 3, 20, 10, 0, 177, 179, 3, 24, 12, 0, 178, 176, 1, 0, 0, 0, 178, 177, 1, 0, 0, 0, 179, 181, 1, 0, 0, 0, 180, 173, 1, 0, 0, 0, 181, 182, 1, 0, 0, 0, 182, 180, 1, 0, 0, 0, 182, 183, 1, 0, 0, 0, 183, 192, 1, 0, 0, 0, 184, 185, 5, 9, 0, 0, 185, 186, 5, 14, 0, 0, 186, 189, 5, 9, 0, 0, 187, 190, 3, 20, 10, 0, 188, 190, 3, 24, 12, 0, 189, 187, 1, 0, 0, 0, 189, 188, 1, 0, 0, 0, 190, 192, 1, 0, 0, 0, 191, 169, 1, 0, 0, 0, 191, 180, 1, 0, 0, 0, 191, 184, 1, 0, 0, 0, 192, 19, 1, 0, 0, 0, 193, 194, 3, 28, 14, 0, 194, 21, 1, 0, 0, 0, 195, 199, 5, 7, 0, 0, 196, 198, 5, 9, 0, 0, 197, 196, 1, 0, 0, 0, 198, 201, 1, 0, 0, 0, 199, 197, 1, 0, 0, 0, 199, 200, 1, 0, 0, 0, 200, 204, 1, 0, 0, 0, 201, 199, 1, 0, 0, 0, 202, 205, 3, 14, 7, 0, 203, 205, 3, 24, 12, 0, 204, 202, 1, 0, 0, 0, 204, 203, 1, 0, 0, 0, 205, 209, 1, 0, 0, 0, 206, 208, 5, 9, 0, 0, 207, 206, 1, 0, 0, 0, 208, 211, 1, 0, 0, 0, 209, 207, 1, 0, 0, 0, 209, 210, 1, 0, 0, 0, 210, 212, 1, 0, 0, 0, 211, 209, 1, 0, 0, 0, 212, 213, 5, 8, 0, 0, 213, 23, 1, 0, 0, 0, 214, 218, 5, 7, 0, 0, 215, 217, 5, 9, 0, 0, 216, 215, 1, 0, 0, 0, 217, 220, 1, 0, 0, 0, 218, 216, 1, 0, 0, 0, 218, 219, 1, 0, 0, 0, 219, 223, 1, 0, 0, 0, 220, 218, 1, 0, 0, 0, 221, 224, 3, 16, 8, 0, 222, 224, 3, 24, 12, 0, 223, 221, 1, 0, 0, 0, 223, 222, 1, 0, 0, 0, 224, 228, 1, 0, 0, 0, 225, 227, 5, 9, 0, 0, 226, 225, 1, 0, 0, 0, 227, 230, 1, 0, 0, 0, 228, 226, 1, 0, 0, 0, 228, 229, 1, 0, 0, 0, 229, 231, 1, 0, 0, 0, 230, 228, 1, 0, 0, 0, 231, 232, 5, 8, 0, 0, 232, 25, 1, 0, 0, 0, 233, 235, 5, 5, 0, 0, 234, 236, 5, 9, 0, 0, 235, 234, 1, 0, 0, 0, 235, 236, 1, 0, 0, 0, 236, 237, 1, 0, 0, 0, 237, 239, 3, 30, 15, 0, 238, 240, 5, 9, 0, 0, 239, 238, 1, 0, 0, 0, 239, 240, 1, 0, 0, 0, 240, 251, 1, 0, 0, 0, 241, 243, 5, 2, 0, 0, 242, 244, 5, 9, 0, 0, 243, 242, 1, 0, 0, 0, 243, 244, 1, 0, 0, 0, 244, 245, 1, 0, 0, 0, 245, 247, 3, 30, 15, 0, 246, 248, 5, 9, 0, 0, 247, 246, 1, 0, 0, 0, 247, 248, 1, 0, 0, 0, 248, 250, 1, 0, 0, 0, 249, 241, 1, 0, 0, 0, 250, 253, 1, 0, 0, 0, 251, 249, 1, 0, 0, 0, 251, 252, 1, 0, 0, 0, 252, 254, 1, 0, 0, 0, 253, 251, 1, 0, 0, 0, 254, 255, 5, 34, 0, 0, 255, 27, 1, 0, 0, 0, 256, 261, 3, 50, 25, 0, 257, 258, 5, 9, 0, 0, 258, 259, 5, 15, 0, 0, 259, 260, 5, 9, 0, 0, 260, 262, 3, 50, 25, 0, 261, 257, 1, 0, 0, 0, 261, 262, 1, 0, 0, 0, 262, 29, 1, 0, 0, 0, 263, 265, 5, 55, 0, 0, 264, 263, 1, 0, 0, 0, 264, 265, 1, 0, 0, 0, 265, 273, 1, 0, 0, 0, 266, 274, 3, 32, 16, 0, 267, 268, 3, 32, 16, 0, 268, 269, 5, 9, 0, 0, 269, 270, 5, 26, 0, 0, 270, 271, 5, 9, 0, 0, 271, 272, 3, 38, 19, 0, 272, 274, 1, 0, 0, 0, 273, 266, 1, 0, 0, 0, 273, 267, 1, 0, 0, 0, 274, 276, 1, 0, 0, 0, 275, 277, 5, 55, 0, 0, 276, 275, 1, 0, 0, 0, 276, 277, 1, 0, 0, 0, 277, 31, 1, 0, 0, 0, 278, 283, 3, 50, 25, 0, 279, 280, 5, 1, 0, 0, 280, 284, 5, 42, 0, 0, 281, 282, 5, 11, 0, 0, 282, 284, 3, 50, 25, 0, 283, 279, 1, 0, 0, 0, 283, 281, 1, 0, 0, 0, 283, 284, 1, 0, 0, 0, 284, 33, 1, 0, 0, 0, 285, 287, 3, 36, 18, 0, 286, 285, 1, 0, 0, 0, 287, 290, 1, 0, 0, 0, 288, 286, 1, 0, 0, 0, 288, 289, 1, 0, 0, 0, 289, 35, 1, 0, 0, 0, 290, 288, 1, 0, 0, 0, 291, 292, 5, 55, 0, 0, 292, 294, 3, 46, 23, 0, 293, 291, 1, 0, 0, 0, 293, 294, 1, 0, 0, 0, 294, 295, 1, 0, 0, 0, 295, 296, 5, 55, 0, 0, 296, 297, 5, 22, 0, 0, 297, 298, 5, 9, 0, 0, 298, 300, 3, 38, 19, 0, 299, 301, 5, 9, 0, 0, 300, 299, 1, 0, 0, 0, 300, 301, 1, 0, 0, 0, 301, 302, 1, 0, 0, 0, 302, 304, 5, 7, 0, 0, 303, 305, 5, 9, 0, 0, 304, 303, 1, 0, 0, 0, 304, 305, 1, 0, 0, 0, 305, 306, 1, 0, 0, 0, 306, 308, 3, 40, 20, 0, 307, 309, 5, 9, 0, 0, 308, 307, 1, 0, 0, 0, 308, 309, 1, 0, 0, 0, 309, 320, 1, 0, 0, 0, 310, 312, 5, 2, 0, 0, 311, 313, 5, 9, 0, 0, 312, 311, 1, 0, 0, 0, 312, 313, 1, 0, 0, 0, 313, 314, 1, 0, 0, 0, 314, 316, 3, 40, 20, 0, 315, 317, 5, 9, 0, 0, 316, 315, 1, 0, 0, 0, 316, 317, 1, 0, 0, 0, 317, 319, 1, 0, 0, 0, 318, 310, 1, 0, 0, 0, 319, 322, 1, 0, 0, 0, 320, 318, 1, 0, 0, 0, 320, 321, 1, 0, 0, 0, 321, 324, 1, 0, 0, 0, 322, 320, 1, 0, 0, 0, 323, 325, 5, 55, 0, 0, 324, 323, 1, 0, 0, 0, 324, 325, 1, 0, 0, 0, 325, 326, 1, 0, 0, 0, 326, 328, 5, 8, 0, 0, 327, 329, 5, 9, 0, 0, 328, 327, 1, 0, 0, 0, 328, 329, 1, 0, 0, 0, 329, 330, 1, 0, 0, 0, 330, 332, 5, 35, 0, 0, 331, 333, 5, 55, 0, 0, 332, 331, 1, 0, 0, 0, 332, 333, 1, 0, 0, 0, 333, 335, 1, 0, 0, 0, 334, 336, 5, 9, 0, 0, 335, 334, 1, 0, 0, 0, 335, 336, 1, 0, 0, 0, 336, 337, 1, 0, 0, 0, 337, 339, 3, 52, 26, 0, 338, 340, 5, 55, 0, 0, 339, 338, 1, 0, 0, 0, 339, 340, 1, 0, 0, 0, 340, 341, 1, 0, 0, 0, 341, 342, 5, 36, 0, 0, 342, 37, 1, 0, 0, 0, 343, 344, 5, 10, 0, 0, 344, 39, 1, 0, 0, 0, 345, 347, 5, 55, 0, 0, 346, 345, 1, 0, 0, 0, 346, 347, 1, 0, 0, 0, 347, 348, 1, 0, 0, 0, 348, 350, 3, 42, 21, 0, 349, 351, 5, 9, 0, 0, 350, 349, 1, 0, 0, 0, 350, 351, 1, 0, 0, 0, 351, 352, 1, 0, 0, 0, 352, 354, 5, 1, 0, 0, 353, 355, 5, 9, 0, 0, 354, 353, 1, 0, 0, 0, 354, 355, 1, 0, 0, 0, 355, 356, 1, 0, 0, 0, 356, 357, 3, 44, 22, 0, 357, 41, 1, 0, 0, 0, 358, 359, 5, 10, 0, 0, 359, 43, 1, 0, 0, 0, 360, 366, 5, 57, 0, 0, 361, 362, 5, 56, 0, 0, 362, 363, 5, 3, 0, 0, 363, 364, 5, 57, 0, 0, 364, 366, 5, 4, 0, 0, 365, 360, 1, 0, 0, 0, 365, 361, 1, 0, 0, 0, 366, 45, 1, 0, 0, 0, 367, 371, 5, 11, 0, 0, 368, 370, 8, 0, 0, 0, 369, 368, 1, 0, 0, 0, 370, 373, 1, 0, 0, 0, 371, 369, 1, 0, 0, 0, 371, 372, 1, 0, 0, 0, 372, 376, 1, 0, 0, 0, 373, 371, 1, 0, 0, 0, 374, 375, 5, 55, 0, 0, 375, 377, 3, 46, 23, 0, 376, 374, 1, 0, 0, 0, 376, 377, 1, 0, 0, 0, 377, 47, 1, 0, 0, 0, 378, 379, 7, 1, 0, 0, 379, 49, 1, 0, 0, 0, 380, 383, 3, 48, 24, 0, 381, 383, 5, 54, 0, 0, 382, 380, 1, 0, 0, 0, 382, 381, 1, 0, 0, 0, 383, 51, 1, 0, 0, 0, 384, 387, 7, 2, 0, 0, 385, 387, 8, 3, 0, 0, 386, 384, 1, 0, 0, 0, 386, 385, 1, 0, 0, 0, 387, 390, 1, 0, 0, 0, 388, 386, 1, 0, 0, 0, 388, 389, 1, 0, 0, 0, 389, 53, 1, 0, 0, 0, 390, 388, 1, 0, 0, 0, 66, 55, 58, 62, 65, 69, 73, 80, 88, 93, 99, 104, 109, 114, 124, 126, 130, 137, 141, 150, 153, 157, 160, 167, 171, 178, 182, 189, 191, 199, 204, 209, 218, 223, 228, 235, 239, 243, 247, 251, 261, 264, 273, 276, 283, 288, 293, 300, 304, 308, 312, 316, 320, 324, 328, 332, 335, 339, 346, 350, 354, 365, 371, 376, 382, 386, 388] \ No newline at end of file +[4, 1, 58, 394, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 1, 0, 3, 0, 56, 8, 0, 1, 0, 3, 0, 59, 8, 0, 1, 0, 1, 0, 3, 0, 63, 8, 0, 1, 0, 3, 0, 66, 8, 0, 1, 0, 1, 0, 3, 0, 70, 8, 0, 1, 0, 1, 0, 3, 0, 74, 8, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 3, 1, 81, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 89, 8, 1, 1, 2, 1, 2, 1, 2, 3, 2, 94, 8, 2, 1, 2, 1, 2, 1, 2, 1, 2, 3, 2, 100, 8, 2, 1, 3, 5, 3, 103, 8, 3, 10, 3, 12, 3, 106, 9, 3, 1, 4, 1, 4, 3, 4, 110, 8, 4, 1, 4, 1, 4, 1, 4, 3, 4, 115, 8, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 4, 4, 123, 8, 4, 11, 4, 12, 4, 124, 3, 4, 127, 8, 4, 1, 5, 1, 5, 3, 5, 131, 8, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 3, 5, 138, 8, 5, 1, 5, 1, 5, 3, 5, 142, 8, 5, 1, 5, 1, 5, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 3, 7, 151, 8, 7, 1, 7, 3, 7, 154, 8, 7, 1, 8, 1, 8, 3, 8, 158, 8, 8, 1, 8, 3, 8, 161, 8, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 3, 9, 168, 8, 9, 4, 9, 170, 8, 9, 11, 9, 12, 9, 171, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 3, 9, 179, 8, 9, 4, 9, 181, 8, 9, 11, 9, 12, 9, 182, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 3, 9, 190, 8, 9, 3, 9, 192, 8, 9, 1, 10, 1, 10, 1, 11, 1, 11, 5, 11, 198, 8, 11, 10, 11, 12, 11, 201, 9, 11, 1, 11, 1, 11, 3, 11, 205, 8, 11, 1, 11, 5, 11, 208, 8, 11, 10, 11, 12, 11, 211, 9, 11, 1, 11, 1, 11, 1, 12, 1, 12, 5, 12, 217, 8, 12, 10, 12, 12, 12, 220, 9, 12, 1, 12, 1, 12, 3, 12, 224, 8, 12, 1, 12, 5, 12, 227, 8, 12, 10, 12, 12, 12, 230, 9, 12, 1, 12, 1, 12, 1, 13, 1, 13, 3, 13, 236, 8, 13, 1, 13, 1, 13, 3, 13, 240, 8, 13, 1, 13, 1, 13, 3, 13, 244, 8, 13, 1, 13, 1, 13, 3, 13, 248, 8, 13, 5, 13, 250, 8, 13, 10, 13, 12, 13, 253, 9, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 3, 14, 262, 8, 14, 1, 15, 3, 15, 265, 8, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 3, 15, 274, 8, 15, 3, 15, 276, 8, 15, 1, 15, 3, 15, 279, 8, 15, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 3, 16, 286, 8, 16, 1, 17, 5, 17, 289, 8, 17, 10, 17, 12, 17, 292, 9, 17, 1, 18, 1, 18, 3, 18, 296, 8, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 3, 18, 303, 8, 18, 1, 18, 1, 18, 3, 18, 307, 8, 18, 1, 18, 1, 18, 3, 18, 311, 8, 18, 1, 18, 1, 18, 3, 18, 315, 8, 18, 1, 18, 1, 18, 3, 18, 319, 8, 18, 5, 18, 321, 8, 18, 10, 18, 12, 18, 324, 9, 18, 1, 18, 3, 18, 327, 8, 18, 1, 18, 1, 18, 3, 18, 331, 8, 18, 1, 18, 1, 18, 3, 18, 335, 8, 18, 1, 18, 3, 18, 338, 8, 18, 1, 18, 1, 18, 3, 18, 342, 8, 18, 1, 18, 1, 18, 1, 19, 1, 19, 1, 20, 3, 20, 349, 8, 20, 1, 20, 1, 20, 3, 20, 353, 8, 20, 1, 20, 1, 20, 3, 20, 357, 8, 20, 1, 20, 1, 20, 1, 21, 1, 21, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 3, 22, 368, 8, 22, 1, 23, 1, 23, 5, 23, 372, 8, 23, 10, 23, 12, 23, 375, 9, 23, 1, 23, 1, 23, 3, 23, 379, 8, 23, 1, 24, 1, 24, 1, 25, 1, 25, 3, 25, 385, 8, 25, 1, 26, 1, 26, 5, 26, 389, 8, 26, 10, 26, 12, 26, 392, 9, 26, 1, 26, 0, 0, 27, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 0, 4, 1, 0, 56, 56, 4, 0, 10, 10, 16, 18, 20, 21, 24, 24, 5, 0, 3, 5, 7, 10, 27, 35, 37, 53, 56, 56, 1, 0, 36, 36, 436, 0, 55, 1, 0, 0, 0, 2, 80, 1, 0, 0, 0, 4, 93, 1, 0, 0, 0, 6, 104, 1, 0, 0, 0, 8, 109, 1, 0, 0, 0, 10, 130, 1, 0, 0, 0, 12, 145, 1, 0, 0, 0, 14, 150, 1, 0, 0, 0, 16, 157, 1, 0, 0, 0, 18, 191, 1, 0, 0, 0, 20, 193, 1, 0, 0, 0, 22, 195, 1, 0, 0, 0, 24, 214, 1, 0, 0, 0, 26, 233, 1, 0, 0, 0, 28, 256, 1, 0, 0, 0, 30, 264, 1, 0, 0, 0, 32, 280, 1, 0, 0, 0, 34, 290, 1, 0, 0, 0, 36, 295, 1, 0, 0, 0, 38, 345, 1, 0, 0, 0, 40, 348, 1, 0, 0, 0, 42, 360, 1, 0, 0, 0, 44, 367, 1, 0, 0, 0, 46, 369, 1, 0, 0, 0, 48, 380, 1, 0, 0, 0, 50, 384, 1, 0, 0, 0, 52, 390, 1, 0, 0, 0, 54, 56, 5, 9, 0, 0, 55, 54, 1, 0, 0, 0, 55, 56, 1, 0, 0, 0, 56, 58, 1, 0, 0, 0, 57, 59, 5, 56, 0, 0, 58, 57, 1, 0, 0, 0, 58, 59, 1, 0, 0, 0, 59, 62, 1, 0, 0, 0, 60, 63, 3, 2, 1, 0, 61, 63, 3, 4, 2, 0, 62, 60, 1, 0, 0, 0, 62, 61, 1, 0, 0, 0, 63, 65, 1, 0, 0, 0, 64, 66, 5, 56, 0, 0, 65, 64, 1, 0, 0, 0, 65, 66, 1, 0, 0, 0, 66, 67, 1, 0, 0, 0, 67, 69, 3, 6, 3, 0, 68, 70, 5, 56, 0, 0, 69, 68, 1, 0, 0, 0, 69, 70, 1, 0, 0, 0, 70, 71, 1, 0, 0, 0, 71, 73, 3, 34, 17, 0, 72, 74, 5, 56, 0, 0, 73, 72, 1, 0, 0, 0, 73, 74, 1, 0, 0, 0, 74, 75, 1, 0, 0, 0, 75, 76, 5, 0, 0, 1, 76, 1, 1, 0, 0, 0, 77, 78, 3, 46, 23, 0, 78, 79, 5, 56, 0, 0, 79, 81, 1, 0, 0, 0, 80, 77, 1, 0, 0, 0, 80, 81, 1, 0, 0, 0, 81, 82, 1, 0, 0, 0, 82, 83, 5, 17, 0, 0, 83, 84, 5, 56, 0, 0, 84, 85, 5, 18, 0, 0, 85, 86, 5, 9, 0, 0, 86, 88, 5, 19, 0, 0, 87, 89, 5, 9, 0, 0, 88, 87, 1, 0, 0, 0, 88, 89, 1, 0, 0, 0, 89, 3, 1, 0, 0, 0, 90, 91, 3, 46, 23, 0, 91, 92, 5, 56, 0, 0, 92, 94, 1, 0, 0, 0, 93, 90, 1, 0, 0, 0, 93, 94, 1, 0, 0, 0, 94, 95, 1, 0, 0, 0, 95, 96, 5, 16, 0, 0, 96, 97, 5, 9, 0, 0, 97, 99, 3, 48, 24, 0, 98, 100, 5, 9, 0, 0, 99, 98, 1, 0, 0, 0, 99, 100, 1, 0, 0, 0, 100, 5, 1, 0, 0, 0, 101, 103, 3, 8, 4, 0, 102, 101, 1, 0, 0, 0, 103, 106, 1, 0, 0, 0, 104, 102, 1, 0, 0, 0, 104, 105, 1, 0, 0, 0, 105, 7, 1, 0, 0, 0, 106, 104, 1, 0, 0, 0, 107, 108, 5, 56, 0, 0, 108, 110, 3, 46, 23, 0, 109, 107, 1, 0, 0, 0, 109, 110, 1, 0, 0, 0, 110, 111, 1, 0, 0, 0, 111, 114, 5, 56, 0, 0, 112, 113, 5, 20, 0, 0, 113, 115, 5, 9, 0, 0, 114, 112, 1, 0, 0, 0, 114, 115, 1, 0, 0, 0, 115, 116, 1, 0, 0, 0, 116, 117, 5, 21, 0, 0, 117, 118, 5, 9, 0, 0, 118, 126, 3, 50, 25, 0, 119, 120, 5, 56, 0, 0, 120, 122, 5, 23, 0, 0, 121, 123, 3, 10, 5, 0, 122, 121, 1, 0, 0, 0, 123, 124, 1, 0, 0, 0, 124, 122, 1, 0, 0, 0, 124, 125, 1, 0, 0, 0, 125, 127, 1, 0, 0, 0, 126, 119, 1, 0, 0, 0, 126, 127, 1, 0, 0, 0, 127, 9, 1, 0, 0, 0, 128, 129, 5, 56, 0, 0, 129, 131, 3, 46, 23, 0, 130, 128, 1, 0, 0, 0, 130, 131, 1, 0, 0, 0, 131, 132, 1, 0, 0, 0, 132, 133, 5, 56, 0, 0, 133, 134, 5, 25, 0, 0, 134, 135, 5, 9, 0, 0, 135, 137, 3, 12, 6, 0, 136, 138, 5, 9, 0, 0, 137, 136, 1, 0, 0, 0, 137, 138, 1, 0, 0, 0, 138, 139, 1, 0, 0, 0, 139, 141, 5, 1, 0, 0, 140, 142, 5, 9, 0, 0, 141, 140, 1, 0, 0, 0, 141, 142, 1, 0, 0, 0, 142, 143, 1, 0, 0, 0, 143, 144, 3, 14, 7, 0, 144, 11, 1, 0, 0, 0, 145, 146, 3, 50, 25, 0, 146, 13, 1, 0, 0, 0, 147, 151, 3, 26, 13, 0, 148, 151, 3, 20, 10, 0, 149, 151, 3, 22, 11, 0, 150, 147, 1, 0, 0, 0, 150, 148, 1, 0, 0, 0, 150, 149, 1, 0, 0, 0, 151, 153, 1, 0, 0, 0, 152, 154, 3, 18, 9, 0, 153, 152, 1, 0, 0, 0, 153, 154, 1, 0, 0, 0, 154, 15, 1, 0, 0, 0, 155, 158, 3, 20, 10, 0, 156, 158, 3, 24, 12, 0, 157, 155, 1, 0, 0, 0, 157, 156, 1, 0, 0, 0, 158, 160, 1, 0, 0, 0, 159, 161, 3, 18, 9, 0, 160, 159, 1, 0, 0, 0, 160, 161, 1, 0, 0, 0, 161, 17, 1, 0, 0, 0, 162, 163, 5, 9, 0, 0, 163, 164, 5, 13, 0, 0, 164, 167, 5, 9, 0, 0, 165, 168, 3, 20, 10, 0, 166, 168, 3, 24, 12, 0, 167, 165, 1, 0, 0, 0, 167, 166, 1, 0, 0, 0, 168, 170, 1, 0, 0, 0, 169, 162, 1, 0, 0, 0, 170, 171, 1, 0, 0, 0, 171, 169, 1, 0, 0, 0, 171, 172, 1, 0, 0, 0, 172, 192, 1, 0, 0, 0, 173, 174, 5, 9, 0, 0, 174, 175, 5, 12, 0, 0, 175, 178, 5, 9, 0, 0, 176, 179, 3, 20, 10, 0, 177, 179, 3, 24, 12, 0, 178, 176, 1, 0, 0, 0, 178, 177, 1, 0, 0, 0, 179, 181, 1, 0, 0, 0, 180, 173, 1, 0, 0, 0, 181, 182, 1, 0, 0, 0, 182, 180, 1, 0, 0, 0, 182, 183, 1, 0, 0, 0, 183, 192, 1, 0, 0, 0, 184, 185, 5, 9, 0, 0, 185, 186, 5, 14, 0, 0, 186, 189, 5, 9, 0, 0, 187, 190, 3, 20, 10, 0, 188, 190, 3, 24, 12, 0, 189, 187, 1, 0, 0, 0, 189, 188, 1, 0, 0, 0, 190, 192, 1, 0, 0, 0, 191, 169, 1, 0, 0, 0, 191, 180, 1, 0, 0, 0, 191, 184, 1, 0, 0, 0, 192, 19, 1, 0, 0, 0, 193, 194, 3, 28, 14, 0, 194, 21, 1, 0, 0, 0, 195, 199, 5, 7, 0, 0, 196, 198, 5, 9, 0, 0, 197, 196, 1, 0, 0, 0, 198, 201, 1, 0, 0, 0, 199, 197, 1, 0, 0, 0, 199, 200, 1, 0, 0, 0, 200, 204, 1, 0, 0, 0, 201, 199, 1, 0, 0, 0, 202, 205, 3, 14, 7, 0, 203, 205, 3, 24, 12, 0, 204, 202, 1, 0, 0, 0, 204, 203, 1, 0, 0, 0, 205, 209, 1, 0, 0, 0, 206, 208, 5, 9, 0, 0, 207, 206, 1, 0, 0, 0, 208, 211, 1, 0, 0, 0, 209, 207, 1, 0, 0, 0, 209, 210, 1, 0, 0, 0, 210, 212, 1, 0, 0, 0, 211, 209, 1, 0, 0, 0, 212, 213, 5, 8, 0, 0, 213, 23, 1, 0, 0, 0, 214, 218, 5, 7, 0, 0, 215, 217, 5, 9, 0, 0, 216, 215, 1, 0, 0, 0, 217, 220, 1, 0, 0, 0, 218, 216, 1, 0, 0, 0, 218, 219, 1, 0, 0, 0, 219, 223, 1, 0, 0, 0, 220, 218, 1, 0, 0, 0, 221, 224, 3, 16, 8, 0, 222, 224, 3, 24, 12, 0, 223, 221, 1, 0, 0, 0, 223, 222, 1, 0, 0, 0, 224, 228, 1, 0, 0, 0, 225, 227, 5, 9, 0, 0, 226, 225, 1, 0, 0, 0, 227, 230, 1, 0, 0, 0, 228, 226, 1, 0, 0, 0, 228, 229, 1, 0, 0, 0, 229, 231, 1, 0, 0, 0, 230, 228, 1, 0, 0, 0, 231, 232, 5, 8, 0, 0, 232, 25, 1, 0, 0, 0, 233, 235, 5, 5, 0, 0, 234, 236, 5, 9, 0, 0, 235, 234, 1, 0, 0, 0, 235, 236, 1, 0, 0, 0, 236, 237, 1, 0, 0, 0, 237, 239, 3, 30, 15, 0, 238, 240, 5, 9, 0, 0, 239, 238, 1, 0, 0, 0, 239, 240, 1, 0, 0, 0, 240, 251, 1, 0, 0, 0, 241, 243, 5, 2, 0, 0, 242, 244, 5, 9, 0, 0, 243, 242, 1, 0, 0, 0, 243, 244, 1, 0, 0, 0, 244, 245, 1, 0, 0, 0, 245, 247, 3, 30, 15, 0, 246, 248, 5, 9, 0, 0, 247, 246, 1, 0, 0, 0, 247, 248, 1, 0, 0, 0, 248, 250, 1, 0, 0, 0, 249, 241, 1, 0, 0, 0, 250, 253, 1, 0, 0, 0, 251, 249, 1, 0, 0, 0, 251, 252, 1, 0, 0, 0, 252, 254, 1, 0, 0, 0, 253, 251, 1, 0, 0, 0, 254, 255, 5, 34, 0, 0, 255, 27, 1, 0, 0, 0, 256, 261, 3, 50, 25, 0, 257, 258, 5, 9, 0, 0, 258, 259, 5, 15, 0, 0, 259, 260, 5, 9, 0, 0, 260, 262, 3, 50, 25, 0, 261, 257, 1, 0, 0, 0, 261, 262, 1, 0, 0, 0, 262, 29, 1, 0, 0, 0, 263, 265, 5, 56, 0, 0, 264, 263, 1, 0, 0, 0, 264, 265, 1, 0, 0, 0, 265, 275, 1, 0, 0, 0, 266, 276, 3, 32, 16, 0, 267, 268, 3, 32, 16, 0, 268, 269, 5, 9, 0, 0, 269, 270, 5, 26, 0, 0, 270, 273, 5, 9, 0, 0, 271, 274, 3, 38, 19, 0, 272, 274, 5, 54, 0, 0, 273, 271, 1, 0, 0, 0, 273, 272, 1, 0, 0, 0, 274, 276, 1, 0, 0, 0, 275, 266, 1, 0, 0, 0, 275, 267, 1, 0, 0, 0, 276, 278, 1, 0, 0, 0, 277, 279, 5, 56, 0, 0, 278, 277, 1, 0, 0, 0, 278, 279, 1, 0, 0, 0, 279, 31, 1, 0, 0, 0, 280, 285, 3, 50, 25, 0, 281, 282, 5, 1, 0, 0, 282, 286, 5, 42, 0, 0, 283, 284, 5, 11, 0, 0, 284, 286, 3, 50, 25, 0, 285, 281, 1, 0, 0, 0, 285, 283, 1, 0, 0, 0, 285, 286, 1, 0, 0, 0, 286, 33, 1, 0, 0, 0, 287, 289, 3, 36, 18, 0, 288, 287, 1, 0, 0, 0, 289, 292, 1, 0, 0, 0, 290, 288, 1, 0, 0, 0, 290, 291, 1, 0, 0, 0, 291, 35, 1, 0, 0, 0, 292, 290, 1, 0, 0, 0, 293, 294, 5, 56, 0, 0, 294, 296, 3, 46, 23, 0, 295, 293, 1, 0, 0, 0, 295, 296, 1, 0, 0, 0, 296, 297, 1, 0, 0, 0, 297, 298, 5, 56, 0, 0, 298, 299, 5, 22, 0, 0, 299, 300, 5, 9, 0, 0, 300, 302, 3, 38, 19, 0, 301, 303, 5, 9, 0, 0, 302, 301, 1, 0, 0, 0, 302, 303, 1, 0, 0, 0, 303, 304, 1, 0, 0, 0, 304, 306, 5, 7, 0, 0, 305, 307, 5, 9, 0, 0, 306, 305, 1, 0, 0, 0, 306, 307, 1, 0, 0, 0, 307, 308, 1, 0, 0, 0, 308, 310, 3, 40, 20, 0, 309, 311, 5, 9, 0, 0, 310, 309, 1, 0, 0, 0, 310, 311, 1, 0, 0, 0, 311, 322, 1, 0, 0, 0, 312, 314, 5, 2, 0, 0, 313, 315, 5, 9, 0, 0, 314, 313, 1, 0, 0, 0, 314, 315, 1, 0, 0, 0, 315, 316, 1, 0, 0, 0, 316, 318, 3, 40, 20, 0, 317, 319, 5, 9, 0, 0, 318, 317, 1, 0, 0, 0, 318, 319, 1, 0, 0, 0, 319, 321, 1, 0, 0, 0, 320, 312, 1, 0, 0, 0, 321, 324, 1, 0, 0, 0, 322, 320, 1, 0, 0, 0, 322, 323, 1, 0, 0, 0, 323, 326, 1, 0, 0, 0, 324, 322, 1, 0, 0, 0, 325, 327, 5, 56, 0, 0, 326, 325, 1, 0, 0, 0, 326, 327, 1, 0, 0, 0, 327, 328, 1, 0, 0, 0, 328, 330, 5, 8, 0, 0, 329, 331, 5, 9, 0, 0, 330, 329, 1, 0, 0, 0, 330, 331, 1, 0, 0, 0, 331, 332, 1, 0, 0, 0, 332, 334, 5, 35, 0, 0, 333, 335, 5, 56, 0, 0, 334, 333, 1, 0, 0, 0, 334, 335, 1, 0, 0, 0, 335, 337, 1, 0, 0, 0, 336, 338, 5, 9, 0, 0, 337, 336, 1, 0, 0, 0, 337, 338, 1, 0, 0, 0, 338, 339, 1, 0, 0, 0, 339, 341, 3, 52, 26, 0, 340, 342, 5, 56, 0, 0, 341, 340, 1, 0, 0, 0, 341, 342, 1, 0, 0, 0, 342, 343, 1, 0, 0, 0, 343, 344, 5, 36, 0, 0, 344, 37, 1, 0, 0, 0, 345, 346, 5, 10, 0, 0, 346, 39, 1, 0, 0, 0, 347, 349, 5, 56, 0, 0, 348, 347, 1, 0, 0, 0, 348, 349, 1, 0, 0, 0, 349, 350, 1, 0, 0, 0, 350, 352, 3, 42, 21, 0, 351, 353, 5, 9, 0, 0, 352, 351, 1, 0, 0, 0, 352, 353, 1, 0, 0, 0, 353, 354, 1, 0, 0, 0, 354, 356, 5, 1, 0, 0, 355, 357, 5, 9, 0, 0, 356, 355, 1, 0, 0, 0, 356, 357, 1, 0, 0, 0, 357, 358, 1, 0, 0, 0, 358, 359, 3, 44, 22, 0, 359, 41, 1, 0, 0, 0, 360, 361, 5, 10, 0, 0, 361, 43, 1, 0, 0, 0, 362, 368, 5, 58, 0, 0, 363, 364, 5, 57, 0, 0, 364, 365, 5, 3, 0, 0, 365, 366, 5, 58, 0, 0, 366, 368, 5, 4, 0, 0, 367, 362, 1, 0, 0, 0, 367, 363, 1, 0, 0, 0, 368, 45, 1, 0, 0, 0, 369, 373, 5, 11, 0, 0, 370, 372, 8, 0, 0, 0, 371, 370, 1, 0, 0, 0, 372, 375, 1, 0, 0, 0, 373, 371, 1, 0, 0, 0, 373, 374, 1, 0, 0, 0, 374, 378, 1, 0, 0, 0, 375, 373, 1, 0, 0, 0, 376, 377, 5, 56, 0, 0, 377, 379, 3, 46, 23, 0, 378, 376, 1, 0, 0, 0, 378, 379, 1, 0, 0, 0, 379, 47, 1, 0, 0, 0, 380, 381, 7, 1, 0, 0, 381, 49, 1, 0, 0, 0, 382, 385, 3, 48, 24, 0, 383, 385, 5, 55, 0, 0, 384, 382, 1, 0, 0, 0, 384, 383, 1, 0, 0, 0, 385, 51, 1, 0, 0, 0, 386, 389, 7, 2, 0, 0, 387, 389, 8, 3, 0, 0, 388, 386, 1, 0, 0, 0, 388, 387, 1, 0, 0, 0, 389, 392, 1, 0, 0, 0, 390, 388, 1, 0, 0, 0, 390, 391, 1, 0, 0, 0, 391, 53, 1, 0, 0, 0, 392, 390, 1, 0, 0, 0, 67, 55, 58, 62, 65, 69, 73, 80, 88, 93, 99, 104, 109, 114, 124, 126, 130, 137, 141, 150, 153, 157, 160, 167, 171, 178, 182, 189, 191, 199, 204, 209, 218, 223, 228, 235, 239, 243, 247, 251, 261, 264, 273, 275, 278, 285, 290, 295, 302, 306, 310, 314, 318, 322, 326, 330, 334, 337, 341, 348, 352, 356, 367, 373, 378, 384, 388, 390] \ No newline at end of file diff --git a/pkg/java/src/main/gen/dev/openfga/language/antlr/OpenFGAParser.java b/pkg/java/src/main/gen/dev/openfga/language/antlr/OpenFGAParser.java index 4f6586f4..2a36eae2 100644 --- a/pkg/java/src/main/gen/dev/openfga/language/antlr/OpenFGAParser.java +++ b/pkg/java/src/main/gen/dev/openfga/language/antlr/OpenFGAParser.java @@ -25,8 +25,8 @@ public class OpenFGAParser extends Parser { LOGICAL_OR=33, RPRACKET=34, LBRACE=35, RBRACE=36, DOT=37, MINUS=38, EXCLAM=39, QUESTIONMARK=40, PLUS=41, STAR=42, SLASH=43, PERCENT=44, CEL_TRUE=45, CEL_FALSE=46, NUL=47, CEL_COMMENT=48, NUM_FLOAT=49, NUM_INT=50, NUM_UINT=51, - STRING=52, BYTES=53, EXTENDED_IDENTIFIER=54, NEWLINE=55, CONDITION_PARAM_CONTAINER=56, - CONDITION_PARAM_TYPE=57; + STRING=52, BYTES=53, DOLLAR_EXPRESSION=54, EXTENDED_IDENTIFIER=55, NEWLINE=56, + CONDITION_PARAM_CONTAINER=57, CONDITION_PARAM_TYPE=58; public static final int RULE_main = 0, RULE_modelHeader = 1, RULE_moduleHeader = 2, RULE_typeDefs = 3, RULE_typeDef = 4, RULE_relationDeclaration = 5, RULE_relationName = 6, @@ -57,7 +57,8 @@ private static String[] makeLiteralNames() { "'schema'", null, "'extend'", "'type'", "'condition'", "'relations'", "'relation'", "'define'", "'with'", "'=='", "'!='", "'in'", "'<='", "'>='", "'&&'", "'||'", "']'", "'{'", "'}'", "'.'", "'-'", "'!'", "'?'", "'+'", - "'*'", "'/'", "'%'", "'true'", "'false'", "'null'" + "'*'", "'/'", "'%'", "'true'", "'false'", "'null'", null, null, null, + null, null, null, "'$expression'" }; } private static final String[] _LITERAL_NAMES = makeLiteralNames(); @@ -70,8 +71,8 @@ private static String[] makeSymbolicNames() { "NOT_EQUALS", "IN", "LESS_EQUALS", "GREATER_EQUALS", "LOGICAL_AND", "LOGICAL_OR", "RPRACKET", "LBRACE", "RBRACE", "DOT", "MINUS", "EXCLAM", "QUESTIONMARK", "PLUS", "STAR", "SLASH", "PERCENT", "CEL_TRUE", "CEL_FALSE", "NUL", "CEL_COMMENT", - "NUM_FLOAT", "NUM_INT", "NUM_UINT", "STRING", "BYTES", "EXTENDED_IDENTIFIER", - "NEWLINE", "CONDITION_PARAM_CONTAINER", "CONDITION_PARAM_TYPE" + "NUM_FLOAT", "NUM_INT", "NUM_UINT", "STRING", "BYTES", "DOLLAR_EXPRESSION", + "EXTENDED_IDENTIFIER", "NEWLINE", "CONDITION_PARAM_CONTAINER", "CONDITION_PARAM_TYPE" }; } private static final String[] _SYMBOLIC_NAMES = makeSymbolicNames(); @@ -1539,6 +1540,7 @@ public TerminalNode WHITESPACE(int i) { public ConditionNameContext conditionName() { return getRuleContext(ConditionNameContext.class,0); } + public TerminalNode DOLLAR_EXPRESSION() { return getToken(OpenFGAParser.DOLLAR_EXPRESSION, 0); } public RelationDefTypeRestrictionContext(ParserRuleContext parent, int invokingState) { super(parent, invokingState); } @@ -1570,9 +1572,9 @@ public final RelationDefTypeRestrictionContext relationDefTypeRestriction() thro } } - setState(273); + setState(275); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,41,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,42,_ctx) ) { case 1: { setState(266); @@ -1590,18 +1592,34 @@ public final RelationDefTypeRestrictionContext relationDefTypeRestriction() thro match(KEYWORD_WITH); setState(270); match(WHITESPACE); - setState(271); - conditionName(); + setState(273); + _errHandler.sync(this); + switch (_input.LA(1)) { + case IDENTIFIER: + { + setState(271); + conditionName(); + } + break; + case DOLLAR_EXPRESSION: + { + setState(272); + match(DOLLAR_EXPRESSION); + } + break; + default: + throw new NoViableAltException(this); + } } } break; } - setState(276); + setState(278); _errHandler.sync(this); _la = _input.LA(1); if (_la==NEWLINE) { { - setState(275); + setState(277); match(NEWLINE); } } @@ -1653,17 +1671,17 @@ public final RelationDefTypeRestrictionBaseContext relationDefTypeRestrictionBas try { enterOuterAlt(_localctx, 1); { - setState(278); + setState(280); ((RelationDefTypeRestrictionBaseContext)_localctx).relationDefTypeRestrictionType = extended_identifier(); - setState(283); + setState(285); _errHandler.sync(this); switch (_input.LA(1)) { case COLON: { { - setState(279); + setState(281); match(COLON); - setState(280); + setState(282); ((RelationDefTypeRestrictionBaseContext)_localctx).relationDefTypeRestrictionWildcard = match(STAR); } } @@ -1671,9 +1689,9 @@ public final RelationDefTypeRestrictionBaseContext relationDefTypeRestrictionBas case HASH: { { - setState(281); + setState(283); match(HASH); - setState(282); + setState(284); ((RelationDefTypeRestrictionBaseContext)_localctx).relationDefTypeRestrictionRelation = extended_identifier(); } } @@ -1728,21 +1746,21 @@ public final ConditionsContext conditions() throws RecognitionException { int _alt; enterOuterAlt(_localctx, 1); { - setState(288); + setState(290); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,44,_ctx); + _alt = getInterpreter().adaptivePredict(_input,45,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(285); + setState(287); condition(); } } } - setState(290); + setState(292); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,44,_ctx); + _alt = getInterpreter().adaptivePredict(_input,45,_ctx); } } } @@ -1812,153 +1830,153 @@ public final ConditionContext condition() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(293); + setState(295); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,45,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,46,_ctx) ) { case 1: { - setState(291); + setState(293); match(NEWLINE); - setState(292); + setState(294); multiLineComment(); } break; } - setState(295); + setState(297); match(NEWLINE); - setState(296); + setState(298); match(CONDITION); - setState(297); + setState(299); match(WHITESPACE); - setState(298); - conditionName(); setState(300); + conditionName(); + setState(302); _errHandler.sync(this); _la = _input.LA(1); if (_la==WHITESPACE) { { - setState(299); + setState(301); match(WHITESPACE); } } - setState(302); - match(LPAREN); setState(304); + match(LPAREN); + setState(306); _errHandler.sync(this); _la = _input.LA(1); if (_la==WHITESPACE) { { - setState(303); + setState(305); match(WHITESPACE); } } - setState(306); - conditionParameter(); setState(308); + conditionParameter(); + setState(310); _errHandler.sync(this); _la = _input.LA(1); if (_la==WHITESPACE) { { - setState(307); + setState(309); match(WHITESPACE); } } - setState(320); + setState(322); _errHandler.sync(this); _la = _input.LA(1); while (_la==COMMA) { { { - setState(310); - match(COMMA); setState(312); + match(COMMA); + setState(314); _errHandler.sync(this); _la = _input.LA(1); if (_la==WHITESPACE) { { - setState(311); + setState(313); match(WHITESPACE); } } - setState(314); - conditionParameter(); setState(316); + conditionParameter(); + setState(318); _errHandler.sync(this); _la = _input.LA(1); if (_la==WHITESPACE) { { - setState(315); + setState(317); match(WHITESPACE); } } } } - setState(322); + setState(324); _errHandler.sync(this); _la = _input.LA(1); } - setState(324); + setState(326); _errHandler.sync(this); _la = _input.LA(1); if (_la==NEWLINE) { { - setState(323); + setState(325); match(NEWLINE); } } - setState(326); - match(RPAREN); setState(328); + match(RPAREN); + setState(330); _errHandler.sync(this); _la = _input.LA(1); if (_la==WHITESPACE) { { - setState(327); + setState(329); match(WHITESPACE); } } - setState(330); - match(LBRACE); setState(332); + match(LBRACE); + setState(334); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,54,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,55,_ctx) ) { case 1: { - setState(331); + setState(333); match(NEWLINE); } break; } - setState(335); + setState(337); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,55,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,56,_ctx) ) { case 1: { - setState(334); + setState(336); match(WHITESPACE); } break; } - setState(337); - conditionExpression(); setState(339); + conditionExpression(); + setState(341); _errHandler.sync(this); _la = _input.LA(1); if (_la==NEWLINE) { { - setState(338); + setState(340); match(NEWLINE); } } - setState(341); + setState(343); match(RBRACE); } } @@ -1996,7 +2014,7 @@ public final ConditionNameContext conditionName() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(343); + setState(345); match(IDENTIFIER); } } @@ -2046,41 +2064,41 @@ public final ConditionParameterContext conditionParameter() throws RecognitionEx try { enterOuterAlt(_localctx, 1); { - setState(346); + setState(348); _errHandler.sync(this); _la = _input.LA(1); if (_la==NEWLINE) { { - setState(345); + setState(347); match(NEWLINE); } } - setState(348); - parameterName(); setState(350); + parameterName(); + setState(352); _errHandler.sync(this); _la = _input.LA(1); if (_la==WHITESPACE) { { - setState(349); + setState(351); match(WHITESPACE); } } - setState(352); - match(COLON); setState(354); + match(COLON); + setState(356); _errHandler.sync(this); _la = _input.LA(1); if (_la==WHITESPACE) { { - setState(353); + setState(355); match(WHITESPACE); } } - setState(356); + setState(358); parameterType(); } } @@ -2118,7 +2136,7 @@ public final ParameterNameContext parameterName() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(358); + setState(360); match(IDENTIFIER); } } @@ -2157,13 +2175,13 @@ public final ParameterTypeContext parameterType() throws RecognitionException { ParameterTypeContext _localctx = new ParameterTypeContext(_ctx, getState()); enterRule(_localctx, 44, RULE_parameterType); try { - setState(365); + setState(367); _errHandler.sync(this); switch (_input.LA(1)) { case CONDITION_PARAM_TYPE: enterOuterAlt(_localctx, 1); { - setState(360); + setState(362); match(CONDITION_PARAM_TYPE); } break; @@ -2171,13 +2189,13 @@ public final ParameterTypeContext parameterType() throws RecognitionException { enterOuterAlt(_localctx, 2); { { - setState(361); + setState(363); match(CONDITION_PARAM_CONTAINER); - setState(362); + setState(364); match(LESS); - setState(363); + setState(365); match(CONDITION_PARAM_TYPE); - setState(364); + setState(366); match(GREATER); } } @@ -2228,15 +2246,15 @@ public final MultiLineCommentContext multiLineComment() throws RecognitionExcept try { enterOuterAlt(_localctx, 1); { - setState(367); + setState(369); match(HASH); - setState(371); + setState(373); _errHandler.sync(this); _la = _input.LA(1); - while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 252201579132747774L) != 0)) { + while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 504403158265495550L) != 0)) { { { - setState(368); + setState(370); _la = _input.LA(1); if ( _la <= 0 || (_la==NEWLINE) ) { _errHandler.recoverInline(this); @@ -2248,18 +2266,18 @@ public final MultiLineCommentContext multiLineComment() throws RecognitionExcept } } } - setState(373); + setState(375); _errHandler.sync(this); _la = _input.LA(1); } - setState(376); + setState(378); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,62,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,63,_ctx) ) { case 1: { - setState(374); + setState(376); match(NEWLINE); - setState(375); + setState(377); multiLineComment(); } break; @@ -2307,7 +2325,7 @@ public final IdentifierContext identifier() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(378); + setState(380); _la = _input.LA(1); if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 20382720L) != 0)) ) { _errHandler.recoverInline(this); @@ -2354,7 +2372,7 @@ public final Extended_identifierContext extended_identifier() throws Recognition Extended_identifierContext _localctx = new Extended_identifierContext(_ctx, getState()); enterRule(_localctx, 50, RULE_extended_identifier); try { - setState(382); + setState(384); _errHandler.sync(this); switch (_input.LA(1)) { case IDENTIFIER: @@ -2366,14 +2384,14 @@ public final Extended_identifierContext extended_identifier() throws Recognition case RELATION: enterOuterAlt(_localctx, 1); { - setState(380); + setState(382); identifier(); } break; case EXTENDED_IDENTIFIER: enterOuterAlt(_localctx, 2); { - setState(381); + setState(383); match(EXTENDED_IDENTIFIER); } break; @@ -2556,20 +2574,20 @@ public final ConditionExpressionContext conditionExpression() throws Recognition int _alt; enterOuterAlt(_localctx, 1); { - setState(388); + setState(390); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,65,_ctx); + _alt = getInterpreter().adaptivePredict(_input,66,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { - setState(386); + setState(388); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,64,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,65,_ctx) ) { case 1: { - setState(384); + setState(386); _la = _input.LA(1); - if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 54043126674753464L) != 0)) ) { + if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 90071923693717432L) != 0)) ) { _errHandler.recoverInline(this); } else { @@ -2581,7 +2599,7 @@ public final ConditionExpressionContext conditionExpression() throws Recognition break; case 2: { - setState(385); + setState(387); _la = _input.LA(1); if ( _la <= 0 || (_la==RBRACE) ) { _errHandler.recoverInline(this); @@ -2596,9 +2614,9 @@ public final ConditionExpressionContext conditionExpression() throws Recognition } } } - setState(390); + setState(392); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,65,_ctx); + _alt = getInterpreter().adaptivePredict(_input,66,_ctx); } } } @@ -2614,7 +2632,7 @@ public final ConditionExpressionContext conditionExpression() throws Recognition } public static final String _serializedATN = - "\u0004\u00019\u0188\u0002\u0000\u0007\u0000\u0002\u0001\u0007\u0001\u0002"+ + "\u0004\u0001:\u018a\u0002\u0000\u0007\u0000\u0002\u0001\u0007\u0001\u0002"+ "\u0002\u0007\u0002\u0002\u0003\u0007\u0003\u0002\u0004\u0007\u0004\u0002"+ "\u0005\u0007\u0005\u0002\u0006\u0007\u0006\u0002\u0007\u0007\u0007\u0002"+ "\b\u0007\b\u0002\t\u0007\t\u0002\n\u0007\n\u0002\u000b\u0007\u000b\u0002"+ @@ -2654,230 +2672,231 @@ public final ConditionExpressionContext conditionExpression() throws Recognition "\b\r\n\r\f\r\u00fd\t\r\u0001\r\u0001\r\u0001\u000e\u0001\u000e\u0001\u000e"+ "\u0001\u000e\u0001\u000e\u0003\u000e\u0106\b\u000e\u0001\u000f\u0003\u000f"+ "\u0109\b\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f"+ - "\u0001\u000f\u0001\u000f\u0003\u000f\u0112\b\u000f\u0001\u000f\u0003\u000f"+ - "\u0115\b\u000f\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010"+ - "\u0003\u0010\u011c\b\u0010\u0001\u0011\u0005\u0011\u011f\b\u0011\n\u0011"+ - "\f\u0011\u0122\t\u0011\u0001\u0012\u0001\u0012\u0003\u0012\u0126\b\u0012"+ - "\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0003\u0012"+ - "\u012d\b\u0012\u0001\u0012\u0001\u0012\u0003\u0012\u0131\b\u0012\u0001"+ - "\u0012\u0001\u0012\u0003\u0012\u0135\b\u0012\u0001\u0012\u0001\u0012\u0003"+ - "\u0012\u0139\b\u0012\u0001\u0012\u0001\u0012\u0003\u0012\u013d\b\u0012"+ - "\u0005\u0012\u013f\b\u0012\n\u0012\f\u0012\u0142\t\u0012\u0001\u0012\u0003"+ - "\u0012\u0145\b\u0012\u0001\u0012\u0001\u0012\u0003\u0012\u0149\b\u0012"+ - "\u0001\u0012\u0001\u0012\u0003\u0012\u014d\b\u0012\u0001\u0012\u0003\u0012"+ - "\u0150\b\u0012\u0001\u0012\u0001\u0012\u0003\u0012\u0154\b\u0012\u0001"+ - "\u0012\u0001\u0012\u0001\u0013\u0001\u0013\u0001\u0014\u0003\u0014\u015b"+ - "\b\u0014\u0001\u0014\u0001\u0014\u0003\u0014\u015f\b\u0014\u0001\u0014"+ - "\u0001\u0014\u0003\u0014\u0163\b\u0014\u0001\u0014\u0001\u0014\u0001\u0015"+ - "\u0001\u0015\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0016"+ - "\u0003\u0016\u016e\b\u0016\u0001\u0017\u0001\u0017\u0005\u0017\u0172\b"+ - "\u0017\n\u0017\f\u0017\u0175\t\u0017\u0001\u0017\u0001\u0017\u0003\u0017"+ - "\u0179\b\u0017\u0001\u0018\u0001\u0018\u0001\u0019\u0001\u0019\u0003\u0019"+ - "\u017f\b\u0019\u0001\u001a\u0001\u001a\u0005\u001a\u0183\b\u001a\n\u001a"+ - "\f\u001a\u0186\t\u001a\u0001\u001a\u0000\u0000\u001b\u0000\u0002\u0004"+ - "\u0006\b\n\f\u000e\u0010\u0012\u0014\u0016\u0018\u001a\u001c\u001e \""+ - "$&(*,.024\u0000\u0004\u0001\u000077\u0004\u0000\n\n\u0010\u0012\u0014"+ - "\u0015\u0018\u0018\u0005\u0000\u0003\u0005\u0007\n\u001b#%577\u0001\u0000"+ - "$$\u01b1\u00007\u0001\u0000\u0000\u0000\u0002P\u0001\u0000\u0000\u0000"+ - "\u0004]\u0001\u0000\u0000\u0000\u0006h\u0001\u0000\u0000\u0000\bm\u0001"+ - "\u0000\u0000\u0000\n\u0082\u0001\u0000\u0000\u0000\f\u0091\u0001\u0000"+ - "\u0000\u0000\u000e\u0096\u0001\u0000\u0000\u0000\u0010\u009d\u0001\u0000"+ - "\u0000\u0000\u0012\u00bf\u0001\u0000\u0000\u0000\u0014\u00c1\u0001\u0000"+ - "\u0000\u0000\u0016\u00c3\u0001\u0000\u0000\u0000\u0018\u00d6\u0001\u0000"+ - "\u0000\u0000\u001a\u00e9\u0001\u0000\u0000\u0000\u001c\u0100\u0001\u0000"+ - "\u0000\u0000\u001e\u0108\u0001\u0000\u0000\u0000 \u0116\u0001\u0000\u0000"+ - "\u0000\"\u0120\u0001\u0000\u0000\u0000$\u0125\u0001\u0000\u0000\u0000"+ - "&\u0157\u0001\u0000\u0000\u0000(\u015a\u0001\u0000\u0000\u0000*\u0166"+ - "\u0001\u0000\u0000\u0000,\u016d\u0001\u0000\u0000\u0000.\u016f\u0001\u0000"+ - "\u0000\u00000\u017a\u0001\u0000\u0000\u00002\u017e\u0001\u0000\u0000\u0000"+ - "4\u0184\u0001\u0000\u0000\u000068\u0005\t\u0000\u000076\u0001\u0000\u0000"+ - "\u000078\u0001\u0000\u0000\u00008:\u0001\u0000\u0000\u00009;\u00057\u0000"+ - "\u0000:9\u0001\u0000\u0000\u0000:;\u0001\u0000\u0000\u0000;>\u0001\u0000"+ - "\u0000\u0000<\u0001"+ - "\u0000\u0000\u0000>=\u0001\u0000\u0000\u0000?A\u0001\u0000\u0000\u0000"+ - "@B\u00057\u0000\u0000A@\u0001\u0000\u0000\u0000AB\u0001\u0000\u0000\u0000"+ - "BC\u0001\u0000\u0000\u0000CE\u0003\u0006\u0003\u0000DF\u00057\u0000\u0000"+ - "ED\u0001\u0000\u0000\u0000EF\u0001\u0000\u0000\u0000FG\u0001\u0000\u0000"+ - "\u0000GI\u0003\"\u0011\u0000HJ\u00057\u0000\u0000IH\u0001\u0000\u0000"+ - "\u0000IJ\u0001\u0000\u0000\u0000JK\u0001\u0000\u0000\u0000KL\u0005\u0000"+ - "\u0000\u0001L\u0001\u0001\u0000\u0000\u0000MN\u0003.\u0017\u0000NO\u0005"+ - "7\u0000\u0000OQ\u0001\u0000\u0000\u0000PM\u0001\u0000\u0000\u0000PQ\u0001"+ - "\u0000\u0000\u0000QR\u0001\u0000\u0000\u0000RS\u0005\u0011\u0000\u0000"+ - "ST\u00057\u0000\u0000TU\u0005\u0012\u0000\u0000UV\u0005\t\u0000\u0000"+ - "VX\u0005\u0013\u0000\u0000WY\u0005\t\u0000\u0000XW\u0001\u0000\u0000\u0000"+ - "XY\u0001\u0000\u0000\u0000Y\u0003\u0001\u0000\u0000\u0000Z[\u0003.\u0017"+ - "\u0000[\\\u00057\u0000\u0000\\^\u0001\u0000\u0000\u0000]Z\u0001\u0000"+ - "\u0000\u0000]^\u0001\u0000\u0000\u0000^_\u0001\u0000\u0000\u0000_`\u0005"+ - "\u0010\u0000\u0000`a\u0005\t\u0000\u0000ac\u00030\u0018\u0000bd\u0005"+ - "\t\u0000\u0000cb\u0001\u0000\u0000\u0000cd\u0001\u0000\u0000\u0000d\u0005"+ - "\u0001\u0000\u0000\u0000eg\u0003\b\u0004\u0000fe\u0001\u0000\u0000\u0000"+ - "gj\u0001\u0000\u0000\u0000hf\u0001\u0000\u0000\u0000hi\u0001\u0000\u0000"+ - "\u0000i\u0007\u0001\u0000\u0000\u0000jh\u0001\u0000\u0000\u0000kl\u0005"+ - "7\u0000\u0000ln\u0003.\u0017\u0000mk\u0001\u0000\u0000\u0000mn\u0001\u0000"+ - "\u0000\u0000no\u0001\u0000\u0000\u0000or\u00057\u0000\u0000pq\u0005\u0014"+ - "\u0000\u0000qs\u0005\t\u0000\u0000rp\u0001\u0000\u0000\u0000rs\u0001\u0000"+ - "\u0000\u0000st\u0001\u0000\u0000\u0000tu\u0005\u0015\u0000\u0000uv\u0005"+ - "\t\u0000\u0000v~\u00032\u0019\u0000wx\u00057\u0000\u0000xz\u0005\u0017"+ - "\u0000\u0000y{\u0003\n\u0005\u0000zy\u0001\u0000\u0000\u0000{|\u0001\u0000"+ - "\u0000\u0000|z\u0001\u0000\u0000\u0000|}\u0001\u0000\u0000\u0000}\u007f"+ - "\u0001\u0000\u0000\u0000~w\u0001\u0000\u0000\u0000~\u007f\u0001\u0000"+ - "\u0000\u0000\u007f\t\u0001\u0000\u0000\u0000\u0080\u0081\u00057\u0000"+ - "\u0000\u0081\u0083\u0003.\u0017\u0000\u0082\u0080\u0001\u0000\u0000\u0000"+ - "\u0082\u0083\u0001\u0000\u0000\u0000\u0083\u0084\u0001\u0000\u0000\u0000"+ - "\u0084\u0085\u00057\u0000\u0000\u0085\u0086\u0005\u0019\u0000\u0000\u0086"+ - "\u0087\u0005\t\u0000\u0000\u0087\u0089\u0003\f\u0006\u0000\u0088\u008a"+ - "\u0005\t\u0000\u0000\u0089\u0088\u0001\u0000\u0000\u0000\u0089\u008a\u0001"+ - "\u0000\u0000\u0000\u008a\u008b\u0001\u0000\u0000\u0000\u008b\u008d\u0005"+ - "\u0001\u0000\u0000\u008c\u008e\u0005\t\u0000\u0000\u008d\u008c\u0001\u0000"+ - "\u0000\u0000\u008d\u008e\u0001\u0000\u0000\u0000\u008e\u008f\u0001\u0000"+ - "\u0000\u0000\u008f\u0090\u0003\u000e\u0007\u0000\u0090\u000b\u0001\u0000"+ - "\u0000\u0000\u0091\u0092\u00032\u0019\u0000\u0092\r\u0001\u0000\u0000"+ - "\u0000\u0093\u0097\u0003\u001a\r\u0000\u0094\u0097\u0003\u0014\n\u0000"+ - "\u0095\u0097\u0003\u0016\u000b\u0000\u0096\u0093\u0001\u0000\u0000\u0000"+ - "\u0096\u0094\u0001\u0000\u0000\u0000\u0096\u0095\u0001\u0000\u0000\u0000"+ - "\u0097\u0099\u0001\u0000\u0000\u0000\u0098\u009a\u0003\u0012\t\u0000\u0099"+ - "\u0098\u0001\u0000\u0000\u0000\u0099\u009a\u0001\u0000\u0000\u0000\u009a"+ - "\u000f\u0001\u0000\u0000\u0000\u009b\u009e\u0003\u0014\n\u0000\u009c\u009e"+ - "\u0003\u0018\f\u0000\u009d\u009b\u0001\u0000\u0000\u0000\u009d\u009c\u0001"+ - "\u0000\u0000\u0000\u009e\u00a0\u0001\u0000\u0000\u0000\u009f\u00a1\u0003"+ - "\u0012\t\u0000\u00a0\u009f\u0001\u0000\u0000\u0000\u00a0\u00a1\u0001\u0000"+ - "\u0000\u0000\u00a1\u0011\u0001\u0000\u0000\u0000\u00a2\u00a3\u0005\t\u0000"+ - "\u0000\u00a3\u00a4\u0005\r\u0000\u0000\u00a4\u00a7\u0005\t\u0000\u0000"+ - "\u00a5\u00a8\u0003\u0014\n\u0000\u00a6\u00a8\u0003\u0018\f\u0000\u00a7"+ - "\u00a5\u0001\u0000\u0000\u0000\u00a7\u00a6\u0001\u0000\u0000\u0000\u00a8"+ - "\u00aa\u0001\u0000\u0000\u0000\u00a9\u00a2\u0001\u0000\u0000\u0000\u00aa"+ - "\u00ab\u0001\u0000\u0000\u0000\u00ab\u00a9\u0001\u0000\u0000\u0000\u00ab"+ - "\u00ac\u0001\u0000\u0000\u0000\u00ac\u00c0\u0001\u0000\u0000\u0000\u00ad"+ - "\u00ae\u0005\t\u0000\u0000\u00ae\u00af\u0005\f\u0000\u0000\u00af\u00b2"+ - "\u0005\t\u0000\u0000\u00b0\u00b3\u0003\u0014\n\u0000\u00b1\u00b3\u0003"+ - "\u0018\f\u0000\u00b2\u00b0\u0001\u0000\u0000\u0000\u00b2\u00b1\u0001\u0000"+ - "\u0000\u0000\u00b3\u00b5\u0001\u0000\u0000\u0000\u00b4\u00ad\u0001\u0000"+ - "\u0000\u0000\u00b5\u00b6\u0001\u0000\u0000\u0000\u00b6\u00b4\u0001\u0000"+ - "\u0000\u0000\u00b6\u00b7\u0001\u0000\u0000\u0000\u00b7\u00c0\u0001\u0000"+ - "\u0000\u0000\u00b8\u00b9\u0005\t\u0000\u0000\u00b9\u00ba\u0005\u000e\u0000"+ - "\u0000\u00ba\u00bd\u0005\t\u0000\u0000\u00bb\u00be\u0003\u0014\n\u0000"+ - "\u00bc\u00be\u0003\u0018\f\u0000\u00bd\u00bb\u0001\u0000\u0000\u0000\u00bd"+ - "\u00bc\u0001\u0000\u0000\u0000\u00be\u00c0\u0001\u0000\u0000\u0000\u00bf"+ - "\u00a9\u0001\u0000\u0000\u0000\u00bf\u00b4\u0001\u0000\u0000\u0000\u00bf"+ - "\u00b8\u0001\u0000\u0000\u0000\u00c0\u0013\u0001\u0000\u0000\u0000\u00c1"+ - "\u00c2\u0003\u001c\u000e\u0000\u00c2\u0015\u0001\u0000\u0000\u0000\u00c3"+ - "\u00c7\u0005\u0007\u0000\u0000\u00c4\u00c6\u0005\t\u0000\u0000\u00c5\u00c4"+ - "\u0001\u0000\u0000\u0000\u00c6\u00c9\u0001\u0000\u0000\u0000\u00c7\u00c5"+ - "\u0001\u0000\u0000\u0000\u00c7\u00c8\u0001\u0000\u0000\u0000\u00c8\u00cc"+ - "\u0001\u0000\u0000\u0000\u00c9\u00c7\u0001\u0000\u0000\u0000\u00ca\u00cd"+ - "\u0003\u000e\u0007\u0000\u00cb\u00cd\u0003\u0018\f\u0000\u00cc\u00ca\u0001"+ - "\u0000\u0000\u0000\u00cc\u00cb\u0001\u0000\u0000\u0000\u00cd\u00d1\u0001"+ - "\u0000\u0000\u0000\u00ce\u00d0\u0005\t\u0000\u0000\u00cf\u00ce\u0001\u0000"+ - "\u0000\u0000\u00d0\u00d3\u0001\u0000\u0000\u0000\u00d1\u00cf\u0001\u0000"+ - "\u0000\u0000\u00d1\u00d2\u0001\u0000\u0000\u0000\u00d2\u00d4\u0001\u0000"+ - "\u0000\u0000\u00d3\u00d1\u0001\u0000\u0000\u0000\u00d4\u00d5\u0005\b\u0000"+ - "\u0000\u00d5\u0017\u0001\u0000\u0000\u0000\u00d6\u00da\u0005\u0007\u0000"+ - "\u0000\u00d7\u00d9\u0005\t\u0000\u0000\u00d8\u00d7\u0001\u0000\u0000\u0000"+ - "\u00d9\u00dc\u0001\u0000\u0000\u0000\u00da\u00d8\u0001\u0000\u0000\u0000"+ - "\u00da\u00db\u0001\u0000\u0000\u0000\u00db\u00df\u0001\u0000\u0000\u0000"+ - "\u00dc\u00da\u0001\u0000\u0000\u0000\u00dd\u00e0\u0003\u0010\b\u0000\u00de"+ - "\u00e0\u0003\u0018\f\u0000\u00df\u00dd\u0001\u0000\u0000\u0000\u00df\u00de"+ - "\u0001\u0000\u0000\u0000\u00e0\u00e4\u0001\u0000\u0000\u0000\u00e1\u00e3"+ - "\u0005\t\u0000\u0000\u00e2\u00e1\u0001\u0000\u0000\u0000\u00e3\u00e6\u0001"+ - "\u0000\u0000\u0000\u00e4\u00e2\u0001\u0000\u0000\u0000\u00e4\u00e5\u0001"+ - "\u0000\u0000\u0000\u00e5\u00e7\u0001\u0000\u0000\u0000\u00e6\u00e4\u0001"+ - "\u0000\u0000\u0000\u00e7\u00e8\u0005\b\u0000\u0000\u00e8\u0019\u0001\u0000"+ - "\u0000\u0000\u00e9\u00eb\u0005\u0005\u0000\u0000\u00ea\u00ec\u0005\t\u0000"+ - "\u0000\u00eb\u00ea\u0001\u0000\u0000\u0000\u00eb\u00ec\u0001\u0000\u0000"+ - "\u0000\u00ec\u00ed\u0001\u0000\u0000\u0000\u00ed\u00ef\u0003\u001e\u000f"+ - "\u0000\u00ee\u00f0\u0005\t\u0000\u0000\u00ef\u00ee\u0001\u0000\u0000\u0000"+ - "\u00ef\u00f0\u0001\u0000\u0000\u0000\u00f0\u00fb\u0001\u0000\u0000\u0000"+ - "\u00f1\u00f3\u0005\u0002\u0000\u0000\u00f2\u00f4\u0005\t\u0000\u0000\u00f3"+ - "\u00f2\u0001\u0000\u0000\u0000\u00f3\u00f4\u0001\u0000\u0000\u0000\u00f4"+ - "\u00f5\u0001\u0000\u0000\u0000\u00f5\u00f7\u0003\u001e\u000f\u0000\u00f6"+ - "\u00f8\u0005\t\u0000\u0000\u00f7\u00f6\u0001\u0000\u0000\u0000\u00f7\u00f8"+ - "\u0001\u0000\u0000\u0000\u00f8\u00fa\u0001\u0000\u0000\u0000\u00f9\u00f1"+ - "\u0001\u0000\u0000\u0000\u00fa\u00fd\u0001\u0000\u0000\u0000\u00fb\u00f9"+ - "\u0001\u0000\u0000\u0000\u00fb\u00fc\u0001\u0000\u0000\u0000\u00fc\u00fe"+ - "\u0001\u0000\u0000\u0000\u00fd\u00fb\u0001\u0000\u0000\u0000\u00fe\u00ff"+ - "\u0005\"\u0000\u0000\u00ff\u001b\u0001\u0000\u0000\u0000\u0100\u0105\u0003"+ - "2\u0019\u0000\u0101\u0102\u0005\t\u0000\u0000\u0102\u0103\u0005\u000f"+ - "\u0000\u0000\u0103\u0104\u0005\t\u0000\u0000\u0104\u0106\u00032\u0019"+ - "\u0000\u0105\u0101\u0001\u0000\u0000\u0000\u0105\u0106\u0001\u0000\u0000"+ - "\u0000\u0106\u001d\u0001\u0000\u0000\u0000\u0107\u0109\u00057\u0000\u0000"+ - "\u0108\u0107\u0001\u0000\u0000\u0000\u0108\u0109\u0001\u0000\u0000\u0000"+ - "\u0109\u0111\u0001\u0000\u0000\u0000\u010a\u0112\u0003 \u0010\u0000\u010b"+ - "\u010c\u0003 \u0010\u0000\u010c\u010d\u0005\t\u0000\u0000\u010d\u010e"+ - "\u0005\u001a\u0000\u0000\u010e\u010f\u0005\t\u0000\u0000\u010f\u0110\u0003"+ - "&\u0013\u0000\u0110\u0112\u0001\u0000\u0000\u0000\u0111\u010a\u0001\u0000"+ - "\u0000\u0000\u0111\u010b\u0001\u0000\u0000\u0000\u0112\u0114\u0001\u0000"+ - "\u0000\u0000\u0113\u0115\u00057\u0000\u0000\u0114\u0113\u0001\u0000\u0000"+ - "\u0000\u0114\u0115\u0001\u0000\u0000\u0000\u0115\u001f\u0001\u0000\u0000"+ - "\u0000\u0116\u011b\u00032\u0019\u0000\u0117\u0118\u0005\u0001\u0000\u0000"+ - "\u0118\u011c\u0005*\u0000\u0000\u0119\u011a\u0005\u000b\u0000\u0000\u011a"+ - "\u011c\u00032\u0019\u0000\u011b\u0117\u0001\u0000\u0000\u0000\u011b\u0119"+ - "\u0001\u0000\u0000\u0000\u011b\u011c\u0001\u0000\u0000\u0000\u011c!\u0001"+ - "\u0000\u0000\u0000\u011d\u011f\u0003$\u0012\u0000\u011e\u011d\u0001\u0000"+ - "\u0000\u0000\u011f\u0122\u0001\u0000\u0000\u0000\u0120\u011e\u0001\u0000"+ - "\u0000\u0000\u0120\u0121\u0001\u0000\u0000\u0000\u0121#\u0001\u0000\u0000"+ - "\u0000\u0122\u0120\u0001\u0000\u0000\u0000\u0123\u0124\u00057\u0000\u0000"+ - "\u0124\u0126\u0003.\u0017\u0000\u0125\u0123\u0001\u0000\u0000\u0000\u0125"+ - "\u0126\u0001\u0000\u0000\u0000\u0126\u0127\u0001\u0000\u0000\u0000\u0127"+ - "\u0128\u00057\u0000\u0000\u0128\u0129\u0005\u0016\u0000\u0000\u0129\u012a"+ - "\u0005\t\u0000\u0000\u012a\u012c\u0003&\u0013\u0000\u012b\u012d\u0005"+ - "\t\u0000\u0000\u012c\u012b\u0001\u0000\u0000\u0000\u012c\u012d\u0001\u0000"+ - "\u0000\u0000\u012d\u012e\u0001\u0000\u0000\u0000\u012e\u0130\u0005\u0007"+ - "\u0000\u0000\u012f\u0131\u0005\t\u0000\u0000\u0130\u012f\u0001\u0000\u0000"+ - "\u0000\u0130\u0131\u0001\u0000\u0000\u0000\u0131\u0132\u0001\u0000\u0000"+ - "\u0000\u0132\u0134\u0003(\u0014\u0000\u0133\u0135\u0005\t\u0000\u0000"+ - "\u0134\u0133\u0001\u0000\u0000\u0000\u0134\u0135\u0001\u0000\u0000\u0000"+ - "\u0135\u0140\u0001\u0000\u0000\u0000\u0136\u0138\u0005\u0002\u0000\u0000"+ - "\u0137\u0139\u0005\t\u0000\u0000\u0138\u0137\u0001\u0000\u0000\u0000\u0138"+ - "\u0139\u0001\u0000\u0000\u0000\u0139\u013a\u0001\u0000\u0000\u0000\u013a"+ - "\u013c\u0003(\u0014\u0000\u013b\u013d\u0005\t\u0000\u0000\u013c\u013b"+ - "\u0001\u0000\u0000\u0000\u013c\u013d\u0001\u0000\u0000\u0000\u013d\u013f"+ - "\u0001\u0000\u0000\u0000\u013e\u0136\u0001\u0000\u0000\u0000\u013f\u0142"+ - "\u0001\u0000\u0000\u0000\u0140\u013e\u0001\u0000\u0000\u0000\u0140\u0141"+ - "\u0001\u0000\u0000\u0000\u0141\u0144\u0001\u0000\u0000\u0000\u0142\u0140"+ - "\u0001\u0000\u0000\u0000\u0143\u0145\u00057\u0000\u0000\u0144\u0143\u0001"+ - "\u0000\u0000\u0000\u0144\u0145\u0001\u0000\u0000\u0000\u0145\u0146\u0001"+ - "\u0000\u0000\u0000\u0146\u0148\u0005\b\u0000\u0000\u0147\u0149\u0005\t"+ - "\u0000\u0000\u0148\u0147\u0001\u0000\u0000\u0000\u0148\u0149\u0001\u0000"+ - "\u0000\u0000\u0149\u014a\u0001\u0000\u0000\u0000\u014a\u014c\u0005#\u0000"+ - "\u0000\u014b\u014d\u00057\u0000\u0000\u014c\u014b\u0001\u0000\u0000\u0000"+ - "\u014c\u014d\u0001\u0000\u0000\u0000\u014d\u014f\u0001\u0000\u0000\u0000"+ - "\u014e\u0150\u0005\t\u0000\u0000\u014f\u014e\u0001\u0000\u0000\u0000\u014f"+ - "\u0150\u0001\u0000\u0000\u0000\u0150\u0151\u0001\u0000\u0000\u0000\u0151"+ - "\u0153\u00034\u001a\u0000\u0152\u0154\u00057\u0000\u0000\u0153\u0152\u0001"+ - "\u0000\u0000\u0000\u0153\u0154\u0001\u0000\u0000\u0000\u0154\u0155\u0001"+ - "\u0000\u0000\u0000\u0155\u0156\u0005$\u0000\u0000\u0156%\u0001\u0000\u0000"+ - "\u0000\u0157\u0158\u0005\n\u0000\u0000\u0158\'\u0001\u0000\u0000\u0000"+ - "\u0159\u015b\u00057\u0000\u0000\u015a\u0159\u0001\u0000\u0000\u0000\u015a"+ - "\u015b\u0001\u0000\u0000\u0000\u015b\u015c\u0001\u0000\u0000\u0000\u015c"+ - "\u015e\u0003*\u0015\u0000\u015d\u015f\u0005\t\u0000\u0000\u015e\u015d"+ - "\u0001\u0000\u0000\u0000\u015e\u015f\u0001\u0000\u0000\u0000\u015f\u0160"+ - "\u0001\u0000\u0000\u0000\u0160\u0162\u0005\u0001\u0000\u0000\u0161\u0163"+ - "\u0005\t\u0000\u0000\u0162\u0161\u0001\u0000\u0000\u0000\u0162\u0163\u0001"+ - "\u0000\u0000\u0000\u0163\u0164\u0001\u0000\u0000\u0000\u0164\u0165\u0003"+ - ",\u0016\u0000\u0165)\u0001\u0000\u0000\u0000\u0166\u0167\u0005\n\u0000"+ - "\u0000\u0167+\u0001\u0000\u0000\u0000\u0168\u016e\u00059\u0000\u0000\u0169"+ - "\u016a\u00058\u0000\u0000\u016a\u016b\u0005\u0003\u0000\u0000\u016b\u016c"+ - "\u00059\u0000\u0000\u016c\u016e\u0005\u0004\u0000\u0000\u016d\u0168\u0001"+ - "\u0000\u0000\u0000\u016d\u0169\u0001\u0000\u0000\u0000\u016e-\u0001\u0000"+ - "\u0000\u0000\u016f\u0173\u0005\u000b\u0000\u0000\u0170\u0172\b\u0000\u0000"+ - "\u0000\u0171\u0170\u0001\u0000\u0000\u0000\u0172\u0175\u0001\u0000\u0000"+ - "\u0000\u0173\u0171\u0001\u0000\u0000\u0000\u0173\u0174\u0001\u0000\u0000"+ - "\u0000\u0174\u0178\u0001\u0000\u0000\u0000\u0175\u0173\u0001\u0000\u0000"+ - "\u0000\u0176\u0177\u00057\u0000\u0000\u0177\u0179\u0003.\u0017\u0000\u0178"+ - "\u0176\u0001\u0000\u0000\u0000\u0178\u0179\u0001\u0000\u0000\u0000\u0179"+ - "/\u0001\u0000\u0000\u0000\u017a\u017b\u0007\u0001\u0000\u0000\u017b1\u0001"+ - "\u0000\u0000\u0000\u017c\u017f\u00030\u0018\u0000\u017d\u017f\u00056\u0000"+ - "\u0000\u017e\u017c\u0001\u0000\u0000\u0000\u017e\u017d\u0001\u0000\u0000"+ - "\u0000\u017f3\u0001\u0000\u0000\u0000\u0180\u0183\u0007\u0002\u0000\u0000"+ - "\u0181\u0183\b\u0003\u0000\u0000\u0182\u0180\u0001\u0000\u0000\u0000\u0182"+ - "\u0181\u0001\u0000\u0000\u0000\u0183\u0186\u0001\u0000\u0000\u0000\u0184"+ - "\u0182\u0001\u0000\u0000\u0000\u0184\u0185\u0001\u0000\u0000\u0000\u0185"+ - "5\u0001\u0000\u0000\u0000\u0186\u0184\u0001\u0000\u0000\u0000B7:>AEIP"+ - "X]chmr|~\u0082\u0089\u008d\u0096\u0099\u009d\u00a0\u00a7\u00ab\u00b2\u00b6"+ - "\u00bd\u00bf\u00c7\u00cc\u00d1\u00da\u00df\u00e4\u00eb\u00ef\u00f3\u00f7"+ - "\u00fb\u0105\u0108\u0111\u0114\u011b\u0120\u0125\u012c\u0130\u0134\u0138"+ - "\u013c\u0140\u0144\u0148\u014c\u014f\u0153\u015a\u015e\u0162\u016d\u0173"+ - "\u0178\u017e\u0182\u0184"; + "\u0001\u000f\u0001\u000f\u0003\u000f\u0112\b\u000f\u0003\u000f\u0114\b"+ + "\u000f\u0001\u000f\u0003\u000f\u0117\b\u000f\u0001\u0010\u0001\u0010\u0001"+ + "\u0010\u0001\u0010\u0001\u0010\u0003\u0010\u011e\b\u0010\u0001\u0011\u0005"+ + "\u0011\u0121\b\u0011\n\u0011\f\u0011\u0124\t\u0011\u0001\u0012\u0001\u0012"+ + "\u0003\u0012\u0128\b\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012"+ + "\u0001\u0012\u0003\u0012\u012f\b\u0012\u0001\u0012\u0001\u0012\u0003\u0012"+ + "\u0133\b\u0012\u0001\u0012\u0001\u0012\u0003\u0012\u0137\b\u0012\u0001"+ + "\u0012\u0001\u0012\u0003\u0012\u013b\b\u0012\u0001\u0012\u0001\u0012\u0003"+ + "\u0012\u013f\b\u0012\u0005\u0012\u0141\b\u0012\n\u0012\f\u0012\u0144\t"+ + "\u0012\u0001\u0012\u0003\u0012\u0147\b\u0012\u0001\u0012\u0001\u0012\u0003"+ + "\u0012\u014b\b\u0012\u0001\u0012\u0001\u0012\u0003\u0012\u014f\b\u0012"+ + "\u0001\u0012\u0003\u0012\u0152\b\u0012\u0001\u0012\u0001\u0012\u0003\u0012"+ + "\u0156\b\u0012\u0001\u0012\u0001\u0012\u0001\u0013\u0001\u0013\u0001\u0014"+ + "\u0003\u0014\u015d\b\u0014\u0001\u0014\u0001\u0014\u0003\u0014\u0161\b"+ + "\u0014\u0001\u0014\u0001\u0014\u0003\u0014\u0165\b\u0014\u0001\u0014\u0001"+ + "\u0014\u0001\u0015\u0001\u0015\u0001\u0016\u0001\u0016\u0001\u0016\u0001"+ + "\u0016\u0001\u0016\u0003\u0016\u0170\b\u0016\u0001\u0017\u0001\u0017\u0005"+ + "\u0017\u0174\b\u0017\n\u0017\f\u0017\u0177\t\u0017\u0001\u0017\u0001\u0017"+ + "\u0003\u0017\u017b\b\u0017\u0001\u0018\u0001\u0018\u0001\u0019\u0001\u0019"+ + "\u0003\u0019\u0181\b\u0019\u0001\u001a\u0001\u001a\u0005\u001a\u0185\b"+ + "\u001a\n\u001a\f\u001a\u0188\t\u001a\u0001\u001a\u0000\u0000\u001b\u0000"+ + "\u0002\u0004\u0006\b\n\f\u000e\u0010\u0012\u0014\u0016\u0018\u001a\u001c"+ + "\u001e \"$&(*,.024\u0000\u0004\u0001\u000088\u0004\u0000\n\n\u0010\u0012"+ + "\u0014\u0015\u0018\u0018\u0005\u0000\u0003\u0005\u0007\n\u001b#%588\u0001"+ + "\u0000$$\u01b4\u00007\u0001\u0000\u0000\u0000\u0002P\u0001\u0000\u0000"+ + "\u0000\u0004]\u0001\u0000\u0000\u0000\u0006h\u0001\u0000\u0000\u0000\b"+ + "m\u0001\u0000\u0000\u0000\n\u0082\u0001\u0000\u0000\u0000\f\u0091\u0001"+ + "\u0000\u0000\u0000\u000e\u0096\u0001\u0000\u0000\u0000\u0010\u009d\u0001"+ + "\u0000\u0000\u0000\u0012\u00bf\u0001\u0000\u0000\u0000\u0014\u00c1\u0001"+ + "\u0000\u0000\u0000\u0016\u00c3\u0001\u0000\u0000\u0000\u0018\u00d6\u0001"+ + "\u0000\u0000\u0000\u001a\u00e9\u0001\u0000\u0000\u0000\u001c\u0100\u0001"+ + "\u0000\u0000\u0000\u001e\u0108\u0001\u0000\u0000\u0000 \u0118\u0001\u0000"+ + "\u0000\u0000\"\u0122\u0001\u0000\u0000\u0000$\u0127\u0001\u0000\u0000"+ + "\u0000&\u0159\u0001\u0000\u0000\u0000(\u015c\u0001\u0000\u0000\u0000*"+ + "\u0168\u0001\u0000\u0000\u0000,\u016f\u0001\u0000\u0000\u0000.\u0171\u0001"+ + "\u0000\u0000\u00000\u017c\u0001\u0000\u0000\u00002\u0180\u0001\u0000\u0000"+ + "\u00004\u0186\u0001\u0000\u0000\u000068\u0005\t\u0000\u000076\u0001\u0000"+ + "\u0000\u000078\u0001\u0000\u0000\u00008:\u0001\u0000\u0000\u00009;\u0005"+ + "8\u0000\u0000:9\u0001\u0000\u0000\u0000:;\u0001\u0000\u0000\u0000;>\u0001"+ + "\u0000\u0000\u0000<\u0001\u0000\u0000\u0000>=\u0001\u0000\u0000\u0000?A\u0001\u0000\u0000"+ + "\u0000@B\u00058\u0000\u0000A@\u0001\u0000\u0000\u0000AB\u0001\u0000\u0000"+ + "\u0000BC\u0001\u0000\u0000\u0000CE\u0003\u0006\u0003\u0000DF\u00058\u0000"+ + "\u0000ED\u0001\u0000\u0000\u0000EF\u0001\u0000\u0000\u0000FG\u0001\u0000"+ + "\u0000\u0000GI\u0003\"\u0011\u0000HJ\u00058\u0000\u0000IH\u0001\u0000"+ + "\u0000\u0000IJ\u0001\u0000\u0000\u0000JK\u0001\u0000\u0000\u0000KL\u0005"+ + "\u0000\u0000\u0001L\u0001\u0001\u0000\u0000\u0000MN\u0003.\u0017\u0000"+ + "NO\u00058\u0000\u0000OQ\u0001\u0000\u0000\u0000PM\u0001\u0000\u0000\u0000"+ + "PQ\u0001\u0000\u0000\u0000QR\u0001\u0000\u0000\u0000RS\u0005\u0011\u0000"+ + "\u0000ST\u00058\u0000\u0000TU\u0005\u0012\u0000\u0000UV\u0005\t\u0000"+ + "\u0000VX\u0005\u0013\u0000\u0000WY\u0005\t\u0000\u0000XW\u0001\u0000\u0000"+ + "\u0000XY\u0001\u0000\u0000\u0000Y\u0003\u0001\u0000\u0000\u0000Z[\u0003"+ + ".\u0017\u0000[\\\u00058\u0000\u0000\\^\u0001\u0000\u0000\u0000]Z\u0001"+ + "\u0000\u0000\u0000]^\u0001\u0000\u0000\u0000^_\u0001\u0000\u0000\u0000"+ + "_`\u0005\u0010\u0000\u0000`a\u0005\t\u0000\u0000ac\u00030\u0018\u0000"+ + "bd\u0005\t\u0000\u0000cb\u0001\u0000\u0000\u0000cd\u0001\u0000\u0000\u0000"+ + "d\u0005\u0001\u0000\u0000\u0000eg\u0003\b\u0004\u0000fe\u0001\u0000\u0000"+ + "\u0000gj\u0001\u0000\u0000\u0000hf\u0001\u0000\u0000\u0000hi\u0001\u0000"+ + "\u0000\u0000i\u0007\u0001\u0000\u0000\u0000jh\u0001\u0000\u0000\u0000"+ + "kl\u00058\u0000\u0000ln\u0003.\u0017\u0000mk\u0001\u0000\u0000\u0000m"+ + "n\u0001\u0000\u0000\u0000no\u0001\u0000\u0000\u0000or\u00058\u0000\u0000"+ + "pq\u0005\u0014\u0000\u0000qs\u0005\t\u0000\u0000rp\u0001\u0000\u0000\u0000"+ + "rs\u0001\u0000\u0000\u0000st\u0001\u0000\u0000\u0000tu\u0005\u0015\u0000"+ + "\u0000uv\u0005\t\u0000\u0000v~\u00032\u0019\u0000wx\u00058\u0000\u0000"+ + "xz\u0005\u0017\u0000\u0000y{\u0003\n\u0005\u0000zy\u0001\u0000\u0000\u0000"+ + "{|\u0001\u0000\u0000\u0000|z\u0001\u0000\u0000\u0000|}\u0001\u0000\u0000"+ + "\u0000}\u007f\u0001\u0000\u0000\u0000~w\u0001\u0000\u0000\u0000~\u007f"+ + "\u0001\u0000\u0000\u0000\u007f\t\u0001\u0000\u0000\u0000\u0080\u0081\u0005"+ + "8\u0000\u0000\u0081\u0083\u0003.\u0017\u0000\u0082\u0080\u0001\u0000\u0000"+ + "\u0000\u0082\u0083\u0001\u0000\u0000\u0000\u0083\u0084\u0001\u0000\u0000"+ + "\u0000\u0084\u0085\u00058\u0000\u0000\u0085\u0086\u0005\u0019\u0000\u0000"+ + "\u0086\u0087\u0005\t\u0000\u0000\u0087\u0089\u0003\f\u0006\u0000\u0088"+ + "\u008a\u0005\t\u0000\u0000\u0089\u0088\u0001\u0000\u0000\u0000\u0089\u008a"+ + "\u0001\u0000\u0000\u0000\u008a\u008b\u0001\u0000\u0000\u0000\u008b\u008d"+ + "\u0005\u0001\u0000\u0000\u008c\u008e\u0005\t\u0000\u0000\u008d\u008c\u0001"+ + "\u0000\u0000\u0000\u008d\u008e\u0001\u0000\u0000\u0000\u008e\u008f\u0001"+ + "\u0000\u0000\u0000\u008f\u0090\u0003\u000e\u0007\u0000\u0090\u000b\u0001"+ + "\u0000\u0000\u0000\u0091\u0092\u00032\u0019\u0000\u0092\r\u0001\u0000"+ + "\u0000\u0000\u0093\u0097\u0003\u001a\r\u0000\u0094\u0097\u0003\u0014\n"+ + "\u0000\u0095\u0097\u0003\u0016\u000b\u0000\u0096\u0093\u0001\u0000\u0000"+ + "\u0000\u0096\u0094\u0001\u0000\u0000\u0000\u0096\u0095\u0001\u0000\u0000"+ + "\u0000\u0097\u0099\u0001\u0000\u0000\u0000\u0098\u009a\u0003\u0012\t\u0000"+ + "\u0099\u0098\u0001\u0000\u0000\u0000\u0099\u009a\u0001\u0000\u0000\u0000"+ + "\u009a\u000f\u0001\u0000\u0000\u0000\u009b\u009e\u0003\u0014\n\u0000\u009c"+ + "\u009e\u0003\u0018\f\u0000\u009d\u009b\u0001\u0000\u0000\u0000\u009d\u009c"+ + "\u0001\u0000\u0000\u0000\u009e\u00a0\u0001\u0000\u0000\u0000\u009f\u00a1"+ + "\u0003\u0012\t\u0000\u00a0\u009f\u0001\u0000\u0000\u0000\u00a0\u00a1\u0001"+ + "\u0000\u0000\u0000\u00a1\u0011\u0001\u0000\u0000\u0000\u00a2\u00a3\u0005"+ + "\t\u0000\u0000\u00a3\u00a4\u0005\r\u0000\u0000\u00a4\u00a7\u0005\t\u0000"+ + "\u0000\u00a5\u00a8\u0003\u0014\n\u0000\u00a6\u00a8\u0003\u0018\f\u0000"+ + "\u00a7\u00a5\u0001\u0000\u0000\u0000\u00a7\u00a6\u0001\u0000\u0000\u0000"+ + "\u00a8\u00aa\u0001\u0000\u0000\u0000\u00a9\u00a2\u0001\u0000\u0000\u0000"+ + "\u00aa\u00ab\u0001\u0000\u0000\u0000\u00ab\u00a9\u0001\u0000\u0000\u0000"+ + "\u00ab\u00ac\u0001\u0000\u0000\u0000\u00ac\u00c0\u0001\u0000\u0000\u0000"+ + "\u00ad\u00ae\u0005\t\u0000\u0000\u00ae\u00af\u0005\f\u0000\u0000\u00af"+ + "\u00b2\u0005\t\u0000\u0000\u00b0\u00b3\u0003\u0014\n\u0000\u00b1\u00b3"+ + "\u0003\u0018\f\u0000\u00b2\u00b0\u0001\u0000\u0000\u0000\u00b2\u00b1\u0001"+ + "\u0000\u0000\u0000\u00b3\u00b5\u0001\u0000\u0000\u0000\u00b4\u00ad\u0001"+ + "\u0000\u0000\u0000\u00b5\u00b6\u0001\u0000\u0000\u0000\u00b6\u00b4\u0001"+ + "\u0000\u0000\u0000\u00b6\u00b7\u0001\u0000\u0000\u0000\u00b7\u00c0\u0001"+ + "\u0000\u0000\u0000\u00b8\u00b9\u0005\t\u0000\u0000\u00b9\u00ba\u0005\u000e"+ + "\u0000\u0000\u00ba\u00bd\u0005\t\u0000\u0000\u00bb\u00be\u0003\u0014\n"+ + "\u0000\u00bc\u00be\u0003\u0018\f\u0000\u00bd\u00bb\u0001\u0000\u0000\u0000"+ + "\u00bd\u00bc\u0001\u0000\u0000\u0000\u00be\u00c0\u0001\u0000\u0000\u0000"+ + "\u00bf\u00a9\u0001\u0000\u0000\u0000\u00bf\u00b4\u0001\u0000\u0000\u0000"+ + "\u00bf\u00b8\u0001\u0000\u0000\u0000\u00c0\u0013\u0001\u0000\u0000\u0000"+ + "\u00c1\u00c2\u0003\u001c\u000e\u0000\u00c2\u0015\u0001\u0000\u0000\u0000"+ + "\u00c3\u00c7\u0005\u0007\u0000\u0000\u00c4\u00c6\u0005\t\u0000\u0000\u00c5"+ + "\u00c4\u0001\u0000\u0000\u0000\u00c6\u00c9\u0001\u0000\u0000\u0000\u00c7"+ + "\u00c5\u0001\u0000\u0000\u0000\u00c7\u00c8\u0001\u0000\u0000\u0000\u00c8"+ + "\u00cc\u0001\u0000\u0000\u0000\u00c9\u00c7\u0001\u0000\u0000\u0000\u00ca"+ + "\u00cd\u0003\u000e\u0007\u0000\u00cb\u00cd\u0003\u0018\f\u0000\u00cc\u00ca"+ + "\u0001\u0000\u0000\u0000\u00cc\u00cb\u0001\u0000\u0000\u0000\u00cd\u00d1"+ + "\u0001\u0000\u0000\u0000\u00ce\u00d0\u0005\t\u0000\u0000\u00cf\u00ce\u0001"+ + "\u0000\u0000\u0000\u00d0\u00d3\u0001\u0000\u0000\u0000\u00d1\u00cf\u0001"+ + "\u0000\u0000\u0000\u00d1\u00d2\u0001\u0000\u0000\u0000\u00d2\u00d4\u0001"+ + "\u0000\u0000\u0000\u00d3\u00d1\u0001\u0000\u0000\u0000\u00d4\u00d5\u0005"+ + "\b\u0000\u0000\u00d5\u0017\u0001\u0000\u0000\u0000\u00d6\u00da\u0005\u0007"+ + "\u0000\u0000\u00d7\u00d9\u0005\t\u0000\u0000\u00d8\u00d7\u0001\u0000\u0000"+ + "\u0000\u00d9\u00dc\u0001\u0000\u0000\u0000\u00da\u00d8\u0001\u0000\u0000"+ + "\u0000\u00da\u00db\u0001\u0000\u0000\u0000\u00db\u00df\u0001\u0000\u0000"+ + "\u0000\u00dc\u00da\u0001\u0000\u0000\u0000\u00dd\u00e0\u0003\u0010\b\u0000"+ + "\u00de\u00e0\u0003\u0018\f\u0000\u00df\u00dd\u0001\u0000\u0000\u0000\u00df"+ + "\u00de\u0001\u0000\u0000\u0000\u00e0\u00e4\u0001\u0000\u0000\u0000\u00e1"+ + "\u00e3\u0005\t\u0000\u0000\u00e2\u00e1\u0001\u0000\u0000\u0000\u00e3\u00e6"+ + "\u0001\u0000\u0000\u0000\u00e4\u00e2\u0001\u0000\u0000\u0000\u00e4\u00e5"+ + "\u0001\u0000\u0000\u0000\u00e5\u00e7\u0001\u0000\u0000\u0000\u00e6\u00e4"+ + "\u0001\u0000\u0000\u0000\u00e7\u00e8\u0005\b\u0000\u0000\u00e8\u0019\u0001"+ + "\u0000\u0000\u0000\u00e9\u00eb\u0005\u0005\u0000\u0000\u00ea\u00ec\u0005"+ + "\t\u0000\u0000\u00eb\u00ea\u0001\u0000\u0000\u0000\u00eb\u00ec\u0001\u0000"+ + "\u0000\u0000\u00ec\u00ed\u0001\u0000\u0000\u0000\u00ed\u00ef\u0003\u001e"+ + "\u000f\u0000\u00ee\u00f0\u0005\t\u0000\u0000\u00ef\u00ee\u0001\u0000\u0000"+ + "\u0000\u00ef\u00f0\u0001\u0000\u0000\u0000\u00f0\u00fb\u0001\u0000\u0000"+ + "\u0000\u00f1\u00f3\u0005\u0002\u0000\u0000\u00f2\u00f4\u0005\t\u0000\u0000"+ + "\u00f3\u00f2\u0001\u0000\u0000\u0000\u00f3\u00f4\u0001\u0000\u0000\u0000"+ + "\u00f4\u00f5\u0001\u0000\u0000\u0000\u00f5\u00f7\u0003\u001e\u000f\u0000"+ + "\u00f6\u00f8\u0005\t\u0000\u0000\u00f7\u00f6\u0001\u0000\u0000\u0000\u00f7"+ + "\u00f8\u0001\u0000\u0000\u0000\u00f8\u00fa\u0001\u0000\u0000\u0000\u00f9"+ + "\u00f1\u0001\u0000\u0000\u0000\u00fa\u00fd\u0001\u0000\u0000\u0000\u00fb"+ + "\u00f9\u0001\u0000\u0000\u0000\u00fb\u00fc\u0001\u0000\u0000\u0000\u00fc"+ + "\u00fe\u0001\u0000\u0000\u0000\u00fd\u00fb\u0001\u0000\u0000\u0000\u00fe"+ + "\u00ff\u0005\"\u0000\u0000\u00ff\u001b\u0001\u0000\u0000\u0000\u0100\u0105"+ + "\u00032\u0019\u0000\u0101\u0102\u0005\t\u0000\u0000\u0102\u0103\u0005"+ + "\u000f\u0000\u0000\u0103\u0104\u0005\t\u0000\u0000\u0104\u0106\u00032"+ + "\u0019\u0000\u0105\u0101\u0001\u0000\u0000\u0000\u0105\u0106\u0001\u0000"+ + "\u0000\u0000\u0106\u001d\u0001\u0000\u0000\u0000\u0107\u0109\u00058\u0000"+ + "\u0000\u0108\u0107\u0001\u0000\u0000\u0000\u0108\u0109\u0001\u0000\u0000"+ + "\u0000\u0109\u0113\u0001\u0000\u0000\u0000\u010a\u0114\u0003 \u0010\u0000"+ + "\u010b\u010c\u0003 \u0010\u0000\u010c\u010d\u0005\t\u0000\u0000\u010d"+ + "\u010e\u0005\u001a\u0000\u0000\u010e\u0111\u0005\t\u0000\u0000\u010f\u0112"+ + "\u0003&\u0013\u0000\u0110\u0112\u00056\u0000\u0000\u0111\u010f\u0001\u0000"+ + "\u0000\u0000\u0111\u0110\u0001\u0000\u0000\u0000\u0112\u0114\u0001\u0000"+ + "\u0000\u0000\u0113\u010a\u0001\u0000\u0000\u0000\u0113\u010b\u0001\u0000"+ + "\u0000\u0000\u0114\u0116\u0001\u0000\u0000\u0000\u0115\u0117\u00058\u0000"+ + "\u0000\u0116\u0115\u0001\u0000\u0000\u0000\u0116\u0117\u0001\u0000\u0000"+ + "\u0000\u0117\u001f\u0001\u0000\u0000\u0000\u0118\u011d\u00032\u0019\u0000"+ + "\u0119\u011a\u0005\u0001\u0000\u0000\u011a\u011e\u0005*\u0000\u0000\u011b"+ + "\u011c\u0005\u000b\u0000\u0000\u011c\u011e\u00032\u0019\u0000\u011d\u0119"+ + "\u0001\u0000\u0000\u0000\u011d\u011b\u0001\u0000\u0000\u0000\u011d\u011e"+ + "\u0001\u0000\u0000\u0000\u011e!\u0001\u0000\u0000\u0000\u011f\u0121\u0003"+ + "$\u0012\u0000\u0120\u011f\u0001\u0000\u0000\u0000\u0121\u0124\u0001\u0000"+ + "\u0000\u0000\u0122\u0120\u0001\u0000\u0000\u0000\u0122\u0123\u0001\u0000"+ + "\u0000\u0000\u0123#\u0001\u0000\u0000\u0000\u0124\u0122\u0001\u0000\u0000"+ + "\u0000\u0125\u0126\u00058\u0000\u0000\u0126\u0128\u0003.\u0017\u0000\u0127"+ + "\u0125\u0001\u0000\u0000\u0000\u0127\u0128\u0001\u0000\u0000\u0000\u0128"+ + "\u0129\u0001\u0000\u0000\u0000\u0129\u012a\u00058\u0000\u0000\u012a\u012b"+ + "\u0005\u0016\u0000\u0000\u012b\u012c\u0005\t\u0000\u0000\u012c\u012e\u0003"+ + "&\u0013\u0000\u012d\u012f\u0005\t\u0000\u0000\u012e\u012d\u0001\u0000"+ + "\u0000\u0000\u012e\u012f\u0001\u0000\u0000\u0000\u012f\u0130\u0001\u0000"+ + "\u0000\u0000\u0130\u0132\u0005\u0007\u0000\u0000\u0131\u0133\u0005\t\u0000"+ + "\u0000\u0132\u0131\u0001\u0000\u0000\u0000\u0132\u0133\u0001\u0000\u0000"+ + "\u0000\u0133\u0134\u0001\u0000\u0000\u0000\u0134\u0136\u0003(\u0014\u0000"+ + "\u0135\u0137\u0005\t\u0000\u0000\u0136\u0135\u0001\u0000\u0000\u0000\u0136"+ + "\u0137\u0001\u0000\u0000\u0000\u0137\u0142\u0001\u0000\u0000\u0000\u0138"+ + "\u013a\u0005\u0002\u0000\u0000\u0139\u013b\u0005\t\u0000\u0000\u013a\u0139"+ + "\u0001\u0000\u0000\u0000\u013a\u013b\u0001\u0000\u0000\u0000\u013b\u013c"+ + "\u0001\u0000\u0000\u0000\u013c\u013e\u0003(\u0014\u0000\u013d\u013f\u0005"+ + "\t\u0000\u0000\u013e\u013d\u0001\u0000\u0000\u0000\u013e\u013f\u0001\u0000"+ + "\u0000\u0000\u013f\u0141\u0001\u0000\u0000\u0000\u0140\u0138\u0001\u0000"+ + "\u0000\u0000\u0141\u0144\u0001\u0000\u0000\u0000\u0142\u0140\u0001\u0000"+ + "\u0000\u0000\u0142\u0143\u0001\u0000\u0000\u0000\u0143\u0146\u0001\u0000"+ + "\u0000\u0000\u0144\u0142\u0001\u0000\u0000\u0000\u0145\u0147\u00058\u0000"+ + "\u0000\u0146\u0145\u0001\u0000\u0000\u0000\u0146\u0147\u0001\u0000\u0000"+ + "\u0000\u0147\u0148\u0001\u0000\u0000\u0000\u0148\u014a\u0005\b\u0000\u0000"+ + "\u0149\u014b\u0005\t\u0000\u0000\u014a\u0149\u0001\u0000\u0000\u0000\u014a"+ + "\u014b\u0001\u0000\u0000\u0000\u014b\u014c\u0001\u0000\u0000\u0000\u014c"+ + "\u014e\u0005#\u0000\u0000\u014d\u014f\u00058\u0000\u0000\u014e\u014d\u0001"+ + "\u0000\u0000\u0000\u014e\u014f\u0001\u0000\u0000\u0000\u014f\u0151\u0001"+ + "\u0000\u0000\u0000\u0150\u0152\u0005\t\u0000\u0000\u0151\u0150\u0001\u0000"+ + "\u0000\u0000\u0151\u0152\u0001\u0000\u0000\u0000\u0152\u0153\u0001\u0000"+ + "\u0000\u0000\u0153\u0155\u00034\u001a\u0000\u0154\u0156\u00058\u0000\u0000"+ + "\u0155\u0154\u0001\u0000\u0000\u0000\u0155\u0156\u0001\u0000\u0000\u0000"+ + "\u0156\u0157\u0001\u0000\u0000\u0000\u0157\u0158\u0005$\u0000\u0000\u0158"+ + "%\u0001\u0000\u0000\u0000\u0159\u015a\u0005\n\u0000\u0000\u015a\'\u0001"+ + "\u0000\u0000\u0000\u015b\u015d\u00058\u0000\u0000\u015c\u015b\u0001\u0000"+ + "\u0000\u0000\u015c\u015d\u0001\u0000\u0000\u0000\u015d\u015e\u0001\u0000"+ + "\u0000\u0000\u015e\u0160\u0003*\u0015\u0000\u015f\u0161\u0005\t\u0000"+ + "\u0000\u0160\u015f\u0001\u0000\u0000\u0000\u0160\u0161\u0001\u0000\u0000"+ + "\u0000\u0161\u0162\u0001\u0000\u0000\u0000\u0162\u0164\u0005\u0001\u0000"+ + "\u0000\u0163\u0165\u0005\t\u0000\u0000\u0164\u0163\u0001\u0000\u0000\u0000"+ + "\u0164\u0165\u0001\u0000\u0000\u0000\u0165\u0166\u0001\u0000\u0000\u0000"+ + "\u0166\u0167\u0003,\u0016\u0000\u0167)\u0001\u0000\u0000\u0000\u0168\u0169"+ + "\u0005\n\u0000\u0000\u0169+\u0001\u0000\u0000\u0000\u016a\u0170\u0005"+ + ":\u0000\u0000\u016b\u016c\u00059\u0000\u0000\u016c\u016d\u0005\u0003\u0000"+ + "\u0000\u016d\u016e\u0005:\u0000\u0000\u016e\u0170\u0005\u0004\u0000\u0000"+ + "\u016f\u016a\u0001\u0000\u0000\u0000\u016f\u016b\u0001\u0000\u0000\u0000"+ + "\u0170-\u0001\u0000\u0000\u0000\u0171\u0175\u0005\u000b\u0000\u0000\u0172"+ + "\u0174\b\u0000\u0000\u0000\u0173\u0172\u0001\u0000\u0000\u0000\u0174\u0177"+ + "\u0001\u0000\u0000\u0000\u0175\u0173\u0001\u0000\u0000\u0000\u0175\u0176"+ + "\u0001\u0000\u0000\u0000\u0176\u017a\u0001\u0000\u0000\u0000\u0177\u0175"+ + "\u0001\u0000\u0000\u0000\u0178\u0179\u00058\u0000\u0000\u0179\u017b\u0003"+ + ".\u0017\u0000\u017a\u0178\u0001\u0000\u0000\u0000\u017a\u017b\u0001\u0000"+ + "\u0000\u0000\u017b/\u0001\u0000\u0000\u0000\u017c\u017d\u0007\u0001\u0000"+ + "\u0000\u017d1\u0001\u0000\u0000\u0000\u017e\u0181\u00030\u0018\u0000\u017f"+ + "\u0181\u00057\u0000\u0000\u0180\u017e\u0001\u0000\u0000\u0000\u0180\u017f"+ + "\u0001\u0000\u0000\u0000\u01813\u0001\u0000\u0000\u0000\u0182\u0185\u0007"+ + "\u0002\u0000\u0000\u0183\u0185\b\u0003\u0000\u0000\u0184\u0182\u0001\u0000"+ + "\u0000\u0000\u0184\u0183\u0001\u0000\u0000\u0000\u0185\u0188\u0001\u0000"+ + "\u0000\u0000\u0186\u0184\u0001\u0000\u0000\u0000\u0186\u0187\u0001\u0000"+ + "\u0000\u0000\u01875\u0001\u0000\u0000\u0000\u0188\u0186\u0001\u0000\u0000"+ + "\u0000C7:>AEIPX]chmr|~\u0082\u0089\u008d\u0096\u0099\u009d\u00a0\u00a7"+ + "\u00ab\u00b2\u00b6\u00bd\u00bf\u00c7\u00cc\u00d1\u00da\u00df\u00e4\u00eb"+ + "\u00ef\u00f3\u00f7\u00fb\u0105\u0108\u0111\u0113\u0116\u011d\u0122\u0127"+ + "\u012e\u0132\u0136\u013a\u013e\u0142\u0146\u014a\u014e\u0151\u0155\u015c"+ + "\u0160\u0164\u016f\u0175\u017a\u0180\u0184\u0186"; public static final ATN _ATN = new ATNDeserializer().deserialize(_serializedATN.toCharArray()); static { diff --git a/pkg/java/src/main/gen/dev/openfga/language/antlr/OpenFGAParser.tokens b/pkg/java/src/main/gen/dev/openfga/language/antlr/OpenFGAParser.tokens index 512cec30..b2523ac8 100644 --- a/pkg/java/src/main/gen/dev/openfga/language/antlr/OpenFGAParser.tokens +++ b/pkg/java/src/main/gen/dev/openfga/language/antlr/OpenFGAParser.tokens @@ -51,10 +51,11 @@ NUM_INT=50 NUM_UINT=51 STRING=52 BYTES=53 -EXTENDED_IDENTIFIER=54 -NEWLINE=55 -CONDITION_PARAM_CONTAINER=56 -CONDITION_PARAM_TYPE=57 +DOLLAR_EXPRESSION=54 +EXTENDED_IDENTIFIER=55 +NEWLINE=56 +CONDITION_PARAM_CONTAINER=57 +CONDITION_PARAM_TYPE=58 '#'=11 ':'=1 ','=2 @@ -98,3 +99,4 @@ CONDITION_PARAM_TYPE=57 'true'=45 'false'=46 'null'=47 +'$expression'=54 diff --git a/pkg/java/src/main/java/dev/openfga/language/OpenFgaDslListener.java b/pkg/java/src/main/java/dev/openfga/language/OpenFgaDslListener.java index 5d7b8c66..7f5de13c 100644 --- a/pkg/java/src/main/java/dev/openfga/language/OpenFgaDslListener.java +++ b/pkg/java/src/main/java/dev/openfga/language/OpenFgaDslListener.java @@ -259,6 +259,10 @@ public void exitRelationDefTypeRestriction(OpenFGAParser.RelationDefTypeRestrict if (conditionName != null) { relationRef.setCondition(conditionName.getText()); + } else if (ctx.DOLLAR_EXPRESSION() != null) { + // `$expression` is a reserved condition name for inline expressions; it + // is carried on the RelationReference exactly like a named condition. + relationRef.setCondition(ctx.DOLLAR_EXPRESSION().getText()); } if (usersetRestriction != null) { diff --git a/pkg/java/src/main/java/dev/openfga/language/validation/ModelValidator.java b/pkg/java/src/main/java/dev/openfga/language/validation/ModelValidator.java index 65412af3..5263c7ab 100644 --- a/pkg/java/src/main/java/dev/openfga/language/validation/ModelValidator.java +++ b/pkg/java/src/main/java/dev/openfga/language/validation/ModelValidator.java @@ -13,6 +13,11 @@ public class ModelValidator { + // Reserved condition name for inline expressions on a type restriction. Unlike + // named conditions it is not declared in the model's `conditions` block, so it + // is exempt from the "condition must be defined" validation. + private static final String RESERVED_INLINE_EXPRESSION = "$expression"; + private final ValidationOptions options; private final AuthorizationModel authorizationModel; private final Dsl dsl; @@ -335,6 +340,7 @@ private void childDefDefined( var decodedConditionName = type.getDecodedConditionName(); if (decodedConditionName != null + && !decodedConditionName.equals(RESERVED_INLINE_EXPRESSION) && !authorizationModel.getConditions().containsKey(decodedConditionName)) { var typeIndex = dsl.getTypeLineNumber(typeName); var lineIndex = dsl.getRelationLineNumber(relationName, typeIndex); diff --git a/pkg/js/gen/OpenFGALexer.interp b/pkg/js/gen/OpenFGALexer.interp index 79d5cbb7..bfaefca8 100644 --- a/pkg/js/gen/OpenFGALexer.interp +++ b/pkg/js/gen/OpenFGALexer.interp @@ -53,6 +53,7 @@ null null null null +'$expression' null null null @@ -113,6 +114,7 @@ NUM_INT NUM_UINT STRING BYTES +DOLLAR_EXPRESSION EXTENDED_IDENTIFIER NEWLINE CONDITION_PARAM_CONTAINER @@ -181,6 +183,7 @@ NUM_INT NUM_UINT STRING BYTES +DOLLAR_EXPRESSION IDENTIFIER EXTENDED_IDENTIFIER NEWLINE @@ -204,4 +207,4 @@ DEFAULT_MODE CONDITION_DEF atn: -[4, 0, 57, 717, 6, -1, 6, -1, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 2, 41, 7, 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 2, 45, 7, 45, 2, 46, 7, 46, 2, 47, 7, 47, 2, 48, 7, 48, 2, 49, 7, 49, 2, 50, 7, 50, 2, 51, 7, 51, 2, 52, 7, 52, 2, 53, 7, 53, 2, 54, 7, 54, 2, 55, 7, 55, 2, 56, 7, 56, 2, 57, 7, 57, 2, 58, 7, 58, 2, 59, 7, 59, 2, 60, 7, 60, 2, 61, 7, 61, 2, 62, 7, 62, 2, 63, 7, 63, 2, 64, 7, 64, 2, 65, 7, 65, 2, 66, 7, 66, 2, 67, 7, 67, 2, 68, 7, 68, 2, 69, 7, 69, 2, 70, 7, 70, 2, 71, 7, 71, 2, 72, 7, 72, 2, 73, 7, 73, 2, 74, 7, 74, 1, 0, 1, 0, 1, 1, 1, 1, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 10, 4, 10, 200, 8, 10, 11, 10, 12, 10, 201, 1, 10, 1, 10, 4, 10, 206, 8, 10, 11, 10, 12, 10, 207, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 18, 1, 18, 1, 18, 1, 19, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 21, 1, 21, 1, 22, 1, 22, 1, 22, 1, 23, 1, 23, 1, 23, 1, 24, 1, 24, 1, 25, 1, 25, 1, 25, 1, 26, 1, 26, 1, 26, 1, 27, 1, 27, 1, 28, 1, 28, 1, 29, 1, 29, 1, 30, 1, 30, 1, 31, 1, 31, 1, 32, 1, 32, 1, 33, 1, 33, 1, 34, 1, 34, 1, 35, 1, 35, 1, 36, 1, 36, 1, 37, 1, 37, 1, 38, 1, 38, 1, 39, 1, 39, 1, 40, 1, 40, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 44, 1, 44, 1, 45, 1, 45, 1, 46, 1, 46, 1, 47, 1, 47, 3, 47, 342, 8, 47, 1, 47, 4, 47, 345, 8, 47, 11, 47, 12, 47, 346, 1, 48, 1, 48, 1, 49, 1, 49, 1, 50, 1, 50, 1, 50, 1, 50, 3, 50, 357, 8, 50, 1, 51, 1, 51, 1, 51, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 3, 54, 390, 8, 54, 1, 55, 4, 55, 393, 8, 55, 11, 55, 12, 55, 394, 1, 56, 1, 56, 1, 56, 1, 56, 5, 56, 401, 8, 56, 10, 56, 12, 56, 404, 9, 56, 1, 56, 1, 56, 1, 57, 4, 57, 409, 8, 57, 11, 57, 12, 57, 410, 1, 57, 1, 57, 4, 57, 415, 8, 57, 11, 57, 12, 57, 416, 1, 57, 3, 57, 420, 8, 57, 1, 57, 4, 57, 423, 8, 57, 11, 57, 12, 57, 424, 1, 57, 1, 57, 1, 57, 1, 57, 4, 57, 431, 8, 57, 11, 57, 12, 57, 432, 1, 57, 3, 57, 436, 8, 57, 3, 57, 438, 8, 57, 1, 58, 4, 58, 441, 8, 58, 11, 58, 12, 58, 442, 1, 58, 1, 58, 1, 58, 1, 58, 4, 58, 449, 8, 58, 11, 58, 12, 58, 450, 3, 58, 453, 8, 58, 1, 59, 4, 59, 456, 8, 59, 11, 59, 12, 59, 457, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 4, 59, 466, 8, 59, 11, 59, 12, 59, 467, 1, 59, 1, 59, 3, 59, 472, 8, 59, 1, 60, 1, 60, 1, 60, 5, 60, 477, 8, 60, 10, 60, 12, 60, 480, 9, 60, 1, 60, 1, 60, 1, 60, 1, 60, 5, 60, 486, 8, 60, 10, 60, 12, 60, 489, 9, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 5, 60, 498, 8, 60, 10, 60, 12, 60, 501, 9, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 5, 60, 512, 8, 60, 10, 60, 12, 60, 515, 9, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 5, 60, 523, 8, 60, 10, 60, 12, 60, 526, 9, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 5, 60, 533, 8, 60, 10, 60, 12, 60, 536, 9, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 5, 60, 546, 8, 60, 10, 60, 12, 60, 549, 9, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 5, 60, 561, 8, 60, 10, 60, 12, 60, 564, 9, 60, 1, 60, 1, 60, 1, 60, 1, 60, 3, 60, 570, 8, 60, 1, 61, 1, 61, 1, 61, 1, 62, 1, 62, 3, 62, 577, 8, 62, 1, 62, 1, 62, 1, 62, 1, 62, 5, 62, 583, 8, 62, 10, 62, 12, 62, 586, 9, 62, 1, 63, 1, 63, 3, 63, 590, 8, 63, 1, 63, 1, 63, 1, 63, 3, 63, 595, 8, 63, 1, 63, 1, 63, 1, 63, 4, 63, 600, 8, 63, 11, 63, 12, 63, 601, 5, 63, 604, 8, 63, 10, 63, 12, 63, 607, 9, 63, 1, 64, 3, 64, 610, 8, 64, 1, 64, 3, 64, 613, 8, 64, 1, 64, 1, 64, 3, 64, 617, 8, 64, 1, 64, 3, 64, 620, 8, 64, 1, 64, 3, 64, 623, 8, 64, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 3, 66, 637, 8, 66, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 3, 67, 688, 8, 67, 1, 68, 1, 68, 1, 68, 1, 68, 1, 69, 1, 69, 1, 69, 1, 69, 1, 70, 1, 70, 1, 70, 1, 70, 1, 71, 1, 71, 1, 71, 1, 71, 1, 72, 1, 72, 1, 72, 1, 72, 1, 73, 1, 73, 1, 73, 1, 73, 1, 74, 1, 74, 1, 74, 1, 74, 4, 499, 513, 547, 562, 0, 75, 2, 11, 4, 1, 6, 2, 8, 12, 10, 13, 12, 14, 14, 15, 16, 16, 18, 17, 20, 18, 22, 19, 24, 20, 26, 21, 28, 22, 30, 23, 32, 24, 34, 25, 36, 26, 38, 27, 40, 28, 42, 29, 44, 3, 46, 30, 48, 31, 50, 4, 52, 32, 54, 33, 56, 5, 58, 34, 60, 35, 62, 36, 64, 7, 66, 8, 68, 37, 70, 38, 72, 39, 74, 40, 76, 41, 78, 42, 80, 43, 82, 44, 84, 45, 86, 46, 88, 47, 90, 0, 92, 0, 94, 0, 96, 0, 98, 0, 100, 0, 102, 0, 104, 0, 106, 0, 108, 0, 110, 0, 112, 9, 114, 48, 116, 49, 118, 50, 120, 51, 122, 52, 124, 53, 126, 10, 128, 54, 130, 55, 132, 0, 134, 56, 136, 57, 138, 0, 140, 0, 142, 0, 144, 0, 146, 0, 148, 0, 150, 0, 2, 0, 1, 16, 2, 0, 65, 90, 97, 122, 2, 0, 69, 69, 101, 101, 2, 0, 43, 43, 45, 45, 3, 0, 48, 57, 65, 70, 97, 102, 2, 0, 82, 82, 114, 114, 10, 0, 34, 34, 39, 39, 63, 63, 92, 92, 96, 98, 102, 102, 110, 110, 114, 114, 116, 116, 118, 118, 2, 0, 88, 88, 120, 120, 3, 0, 9, 9, 12, 12, 32, 32, 1, 0, 10, 10, 2, 0, 85, 85, 117, 117, 4, 0, 10, 10, 13, 13, 34, 34, 92, 92, 4, 0, 10, 10, 13, 13, 39, 39, 92, 92, 1, 0, 92, 92, 3, 0, 10, 10, 13, 13, 34, 34, 3, 0, 10, 10, 13, 13, 39, 39, 2, 0, 66, 66, 98, 98, 773, 0, 2, 1, 0, 0, 0, 0, 4, 1, 0, 0, 0, 0, 6, 1, 0, 0, 0, 0, 8, 1, 0, 0, 0, 0, 10, 1, 0, 0, 0, 0, 12, 1, 0, 0, 0, 0, 14, 1, 0, 0, 0, 0, 16, 1, 0, 0, 0, 0, 18, 1, 0, 0, 0, 0, 20, 1, 0, 0, 0, 0, 22, 1, 0, 0, 0, 0, 24, 1, 0, 0, 0, 0, 26, 1, 0, 0, 0, 0, 28, 1, 0, 0, 0, 0, 30, 1, 0, 0, 0, 0, 32, 1, 0, 0, 0, 0, 34, 1, 0, 0, 0, 0, 36, 1, 0, 0, 0, 0, 38, 1, 0, 0, 0, 0, 40, 1, 0, 0, 0, 0, 42, 1, 0, 0, 0, 0, 44, 1, 0, 0, 0, 0, 46, 1, 0, 0, 0, 0, 48, 1, 0, 0, 0, 0, 50, 1, 0, 0, 0, 0, 52, 1, 0, 0, 0, 0, 54, 1, 0, 0, 0, 0, 56, 1, 0, 0, 0, 0, 58, 1, 0, 0, 0, 0, 60, 1, 0, 0, 0, 0, 62, 1, 0, 0, 0, 0, 64, 1, 0, 0, 0, 0, 66, 1, 0, 0, 0, 0, 68, 1, 0, 0, 0, 0, 70, 1, 0, 0, 0, 0, 72, 1, 0, 0, 0, 0, 74, 1, 0, 0, 0, 0, 76, 1, 0, 0, 0, 0, 78, 1, 0, 0, 0, 0, 80, 1, 0, 0, 0, 0, 82, 1, 0, 0, 0, 0, 84, 1, 0, 0, 0, 0, 86, 1, 0, 0, 0, 0, 88, 1, 0, 0, 0, 0, 112, 1, 0, 0, 0, 0, 114, 1, 0, 0, 0, 0, 116, 1, 0, 0, 0, 0, 118, 1, 0, 0, 0, 0, 120, 1, 0, 0, 0, 0, 122, 1, 0, 0, 0, 0, 124, 1, 0, 0, 0, 0, 126, 1, 0, 0, 0, 0, 128, 1, 0, 0, 0, 0, 130, 1, 0, 0, 0, 1, 132, 1, 0, 0, 0, 1, 134, 1, 0, 0, 0, 1, 136, 1, 0, 0, 0, 1, 138, 1, 0, 0, 0, 1, 140, 1, 0, 0, 0, 1, 142, 1, 0, 0, 0, 1, 144, 1, 0, 0, 0, 1, 146, 1, 0, 0, 0, 1, 148, 1, 0, 0, 0, 1, 150, 1, 0, 0, 0, 2, 152, 1, 0, 0, 0, 4, 154, 1, 0, 0, 0, 6, 156, 1, 0, 0, 0, 8, 158, 1, 0, 0, 0, 10, 162, 1, 0, 0, 0, 12, 165, 1, 0, 0, 0, 14, 173, 1, 0, 0, 0, 16, 178, 1, 0, 0, 0, 18, 185, 1, 0, 0, 0, 20, 191, 1, 0, 0, 0, 22, 199, 1, 0, 0, 0, 24, 209, 1, 0, 0, 0, 26, 216, 1, 0, 0, 0, 28, 221, 1, 0, 0, 0, 30, 233, 1, 0, 0, 0, 32, 243, 1, 0, 0, 0, 34, 252, 1, 0, 0, 0, 36, 259, 1, 0, 0, 0, 38, 264, 1, 0, 0, 0, 40, 267, 1, 0, 0, 0, 42, 270, 1, 0, 0, 0, 44, 273, 1, 0, 0, 0, 46, 275, 1, 0, 0, 0, 48, 278, 1, 0, 0, 0, 50, 281, 1, 0, 0, 0, 52, 283, 1, 0, 0, 0, 54, 286, 1, 0, 0, 0, 56, 289, 1, 0, 0, 0, 58, 291, 1, 0, 0, 0, 60, 293, 1, 0, 0, 0, 62, 295, 1, 0, 0, 0, 64, 297, 1, 0, 0, 0, 66, 299, 1, 0, 0, 0, 68, 301, 1, 0, 0, 0, 70, 303, 1, 0, 0, 0, 72, 305, 1, 0, 0, 0, 74, 307, 1, 0, 0, 0, 76, 309, 1, 0, 0, 0, 78, 311, 1, 0, 0, 0, 80, 313, 1, 0, 0, 0, 82, 315, 1, 0, 0, 0, 84, 317, 1, 0, 0, 0, 86, 322, 1, 0, 0, 0, 88, 328, 1, 0, 0, 0, 90, 333, 1, 0, 0, 0, 92, 335, 1, 0, 0, 0, 94, 337, 1, 0, 0, 0, 96, 339, 1, 0, 0, 0, 98, 348, 1, 0, 0, 0, 100, 350, 1, 0, 0, 0, 102, 356, 1, 0, 0, 0, 104, 358, 1, 0, 0, 0, 106, 361, 1, 0, 0, 0, 108, 366, 1, 0, 0, 0, 110, 389, 1, 0, 0, 0, 112, 392, 1, 0, 0, 0, 114, 396, 1, 0, 0, 0, 116, 437, 1, 0, 0, 0, 118, 452, 1, 0, 0, 0, 120, 471, 1, 0, 0, 0, 122, 569, 1, 0, 0, 0, 124, 571, 1, 0, 0, 0, 126, 576, 1, 0, 0, 0, 128, 589, 1, 0, 0, 0, 130, 609, 1, 0, 0, 0, 132, 624, 1, 0, 0, 0, 134, 636, 1, 0, 0, 0, 136, 687, 1, 0, 0, 0, 138, 689, 1, 0, 0, 0, 140, 693, 1, 0, 0, 0, 142, 697, 1, 0, 0, 0, 144, 701, 1, 0, 0, 0, 146, 705, 1, 0, 0, 0, 148, 709, 1, 0, 0, 0, 150, 713, 1, 0, 0, 0, 152, 153, 5, 35, 0, 0, 153, 3, 1, 0, 0, 0, 154, 155, 5, 58, 0, 0, 155, 5, 1, 0, 0, 0, 156, 157, 5, 44, 0, 0, 157, 7, 1, 0, 0, 0, 158, 159, 5, 97, 0, 0, 159, 160, 5, 110, 0, 0, 160, 161, 5, 100, 0, 0, 161, 9, 1, 0, 0, 0, 162, 163, 5, 111, 0, 0, 163, 164, 5, 114, 0, 0, 164, 11, 1, 0, 0, 0, 165, 166, 5, 98, 0, 0, 166, 167, 5, 117, 0, 0, 167, 168, 5, 116, 0, 0, 168, 169, 5, 32, 0, 0, 169, 170, 5, 110, 0, 0, 170, 171, 5, 111, 0, 0, 171, 172, 5, 116, 0, 0, 172, 13, 1, 0, 0, 0, 173, 174, 5, 102, 0, 0, 174, 175, 5, 114, 0, 0, 175, 176, 5, 111, 0, 0, 176, 177, 5, 109, 0, 0, 177, 15, 1, 0, 0, 0, 178, 179, 5, 109, 0, 0, 179, 180, 5, 111, 0, 0, 180, 181, 5, 100, 0, 0, 181, 182, 5, 117, 0, 0, 182, 183, 5, 108, 0, 0, 183, 184, 5, 101, 0, 0, 184, 17, 1, 0, 0, 0, 185, 186, 5, 109, 0, 0, 186, 187, 5, 111, 0, 0, 187, 188, 5, 100, 0, 0, 188, 189, 5, 101, 0, 0, 189, 190, 5, 108, 0, 0, 190, 19, 1, 0, 0, 0, 191, 192, 5, 115, 0, 0, 192, 193, 5, 99, 0, 0, 193, 194, 5, 104, 0, 0, 194, 195, 5, 101, 0, 0, 195, 196, 5, 109, 0, 0, 196, 197, 5, 97, 0, 0, 197, 21, 1, 0, 0, 0, 198, 200, 3, 94, 46, 0, 199, 198, 1, 0, 0, 0, 200, 201, 1, 0, 0, 0, 201, 199, 1, 0, 0, 0, 201, 202, 1, 0, 0, 0, 202, 203, 1, 0, 0, 0, 203, 205, 5, 46, 0, 0, 204, 206, 3, 94, 46, 0, 205, 204, 1, 0, 0, 0, 206, 207, 1, 0, 0, 0, 207, 205, 1, 0, 0, 0, 207, 208, 1, 0, 0, 0, 208, 23, 1, 0, 0, 0, 209, 210, 5, 101, 0, 0, 210, 211, 5, 120, 0, 0, 211, 212, 5, 116, 0, 0, 212, 213, 5, 101, 0, 0, 213, 214, 5, 110, 0, 0, 214, 215, 5, 100, 0, 0, 215, 25, 1, 0, 0, 0, 216, 217, 5, 116, 0, 0, 217, 218, 5, 121, 0, 0, 218, 219, 5, 112, 0, 0, 219, 220, 5, 101, 0, 0, 220, 27, 1, 0, 0, 0, 221, 222, 5, 99, 0, 0, 222, 223, 5, 111, 0, 0, 223, 224, 5, 110, 0, 0, 224, 225, 5, 100, 0, 0, 225, 226, 5, 105, 0, 0, 226, 227, 5, 116, 0, 0, 227, 228, 5, 105, 0, 0, 228, 229, 5, 111, 0, 0, 229, 230, 5, 110, 0, 0, 230, 231, 1, 0, 0, 0, 231, 232, 6, 13, 0, 0, 232, 29, 1, 0, 0, 0, 233, 234, 5, 114, 0, 0, 234, 235, 5, 101, 0, 0, 235, 236, 5, 108, 0, 0, 236, 237, 5, 97, 0, 0, 237, 238, 5, 116, 0, 0, 238, 239, 5, 105, 0, 0, 239, 240, 5, 111, 0, 0, 240, 241, 5, 110, 0, 0, 241, 242, 5, 115, 0, 0, 242, 31, 1, 0, 0, 0, 243, 244, 5, 114, 0, 0, 244, 245, 5, 101, 0, 0, 245, 246, 5, 108, 0, 0, 246, 247, 5, 97, 0, 0, 247, 248, 5, 116, 0, 0, 248, 249, 5, 105, 0, 0, 249, 250, 5, 111, 0, 0, 250, 251, 5, 110, 0, 0, 251, 33, 1, 0, 0, 0, 252, 253, 5, 100, 0, 0, 253, 254, 5, 101, 0, 0, 254, 255, 5, 102, 0, 0, 255, 256, 5, 105, 0, 0, 256, 257, 5, 110, 0, 0, 257, 258, 5, 101, 0, 0, 258, 35, 1, 0, 0, 0, 259, 260, 5, 119, 0, 0, 260, 261, 5, 105, 0, 0, 261, 262, 5, 116, 0, 0, 262, 263, 5, 104, 0, 0, 263, 37, 1, 0, 0, 0, 264, 265, 5, 61, 0, 0, 265, 266, 5, 61, 0, 0, 266, 39, 1, 0, 0, 0, 267, 268, 5, 33, 0, 0, 268, 269, 5, 61, 0, 0, 269, 41, 1, 0, 0, 0, 270, 271, 5, 105, 0, 0, 271, 272, 5, 110, 0, 0, 272, 43, 1, 0, 0, 0, 273, 274, 5, 60, 0, 0, 274, 45, 1, 0, 0, 0, 275, 276, 5, 60, 0, 0, 276, 277, 5, 61, 0, 0, 277, 47, 1, 0, 0, 0, 278, 279, 5, 62, 0, 0, 279, 280, 5, 61, 0, 0, 280, 49, 1, 0, 0, 0, 281, 282, 5, 62, 0, 0, 282, 51, 1, 0, 0, 0, 283, 284, 5, 38, 0, 0, 284, 285, 5, 38, 0, 0, 285, 53, 1, 0, 0, 0, 286, 287, 5, 124, 0, 0, 287, 288, 5, 124, 0, 0, 288, 55, 1, 0, 0, 0, 289, 290, 5, 91, 0, 0, 290, 57, 1, 0, 0, 0, 291, 292, 5, 93, 0, 0, 292, 59, 1, 0, 0, 0, 293, 294, 5, 123, 0, 0, 294, 61, 1, 0, 0, 0, 295, 296, 5, 125, 0, 0, 296, 63, 1, 0, 0, 0, 297, 298, 5, 40, 0, 0, 298, 65, 1, 0, 0, 0, 299, 300, 5, 41, 0, 0, 300, 67, 1, 0, 0, 0, 301, 302, 5, 46, 0, 0, 302, 69, 1, 0, 0, 0, 303, 304, 5, 45, 0, 0, 304, 71, 1, 0, 0, 0, 305, 306, 5, 33, 0, 0, 306, 73, 1, 0, 0, 0, 307, 308, 5, 63, 0, 0, 308, 75, 1, 0, 0, 0, 309, 310, 5, 43, 0, 0, 310, 77, 1, 0, 0, 0, 311, 312, 5, 42, 0, 0, 312, 79, 1, 0, 0, 0, 313, 314, 5, 47, 0, 0, 314, 81, 1, 0, 0, 0, 315, 316, 5, 37, 0, 0, 316, 83, 1, 0, 0, 0, 317, 318, 5, 116, 0, 0, 318, 319, 5, 114, 0, 0, 319, 320, 5, 117, 0, 0, 320, 321, 5, 101, 0, 0, 321, 85, 1, 0, 0, 0, 322, 323, 5, 102, 0, 0, 323, 324, 5, 97, 0, 0, 324, 325, 5, 108, 0, 0, 325, 326, 5, 115, 0, 0, 326, 327, 5, 101, 0, 0, 327, 87, 1, 0, 0, 0, 328, 329, 5, 110, 0, 0, 329, 330, 5, 117, 0, 0, 330, 331, 5, 108, 0, 0, 331, 332, 5, 108, 0, 0, 332, 89, 1, 0, 0, 0, 333, 334, 5, 92, 0, 0, 334, 91, 1, 0, 0, 0, 335, 336, 7, 0, 0, 0, 336, 93, 1, 0, 0, 0, 337, 338, 2, 48, 57, 0, 338, 95, 1, 0, 0, 0, 339, 341, 7, 1, 0, 0, 340, 342, 7, 2, 0, 0, 341, 340, 1, 0, 0, 0, 341, 342, 1, 0, 0, 0, 342, 344, 1, 0, 0, 0, 343, 345, 3, 94, 46, 0, 344, 343, 1, 0, 0, 0, 345, 346, 1, 0, 0, 0, 346, 344, 1, 0, 0, 0, 346, 347, 1, 0, 0, 0, 347, 97, 1, 0, 0, 0, 348, 349, 7, 3, 0, 0, 349, 99, 1, 0, 0, 0, 350, 351, 7, 4, 0, 0, 351, 101, 1, 0, 0, 0, 352, 357, 3, 104, 51, 0, 353, 357, 3, 108, 53, 0, 354, 357, 3, 110, 54, 0, 355, 357, 3, 106, 52, 0, 356, 352, 1, 0, 0, 0, 356, 353, 1, 0, 0, 0, 356, 354, 1, 0, 0, 0, 356, 355, 1, 0, 0, 0, 357, 103, 1, 0, 0, 0, 358, 359, 3, 90, 44, 0, 359, 360, 7, 5, 0, 0, 360, 105, 1, 0, 0, 0, 361, 362, 3, 90, 44, 0, 362, 363, 2, 48, 51, 0, 363, 364, 2, 48, 55, 0, 364, 365, 2, 48, 55, 0, 365, 107, 1, 0, 0, 0, 366, 367, 3, 90, 44, 0, 367, 368, 7, 6, 0, 0, 368, 369, 3, 98, 48, 0, 369, 370, 3, 98, 48, 0, 370, 109, 1, 0, 0, 0, 371, 372, 3, 90, 44, 0, 372, 373, 5, 117, 0, 0, 373, 374, 3, 98, 48, 0, 374, 375, 3, 98, 48, 0, 375, 376, 3, 98, 48, 0, 376, 377, 3, 98, 48, 0, 377, 390, 1, 0, 0, 0, 378, 379, 3, 90, 44, 0, 379, 380, 5, 85, 0, 0, 380, 381, 3, 98, 48, 0, 381, 382, 3, 98, 48, 0, 382, 383, 3, 98, 48, 0, 383, 384, 3, 98, 48, 0, 384, 385, 3, 98, 48, 0, 385, 386, 3, 98, 48, 0, 386, 387, 3, 98, 48, 0, 387, 388, 3, 98, 48, 0, 388, 390, 1, 0, 0, 0, 389, 371, 1, 0, 0, 0, 389, 378, 1, 0, 0, 0, 390, 111, 1, 0, 0, 0, 391, 393, 7, 7, 0, 0, 392, 391, 1, 0, 0, 0, 393, 394, 1, 0, 0, 0, 394, 392, 1, 0, 0, 0, 394, 395, 1, 0, 0, 0, 395, 113, 1, 0, 0, 0, 396, 397, 5, 47, 0, 0, 397, 398, 5, 47, 0, 0, 398, 402, 1, 0, 0, 0, 399, 401, 8, 8, 0, 0, 400, 399, 1, 0, 0, 0, 401, 404, 1, 0, 0, 0, 402, 400, 1, 0, 0, 0, 402, 403, 1, 0, 0, 0, 403, 405, 1, 0, 0, 0, 404, 402, 1, 0, 0, 0, 405, 406, 6, 56, 1, 0, 406, 115, 1, 0, 0, 0, 407, 409, 3, 94, 46, 0, 408, 407, 1, 0, 0, 0, 409, 410, 1, 0, 0, 0, 410, 408, 1, 0, 0, 0, 410, 411, 1, 0, 0, 0, 411, 412, 1, 0, 0, 0, 412, 414, 5, 46, 0, 0, 413, 415, 3, 94, 46, 0, 414, 413, 1, 0, 0, 0, 415, 416, 1, 0, 0, 0, 416, 414, 1, 0, 0, 0, 416, 417, 1, 0, 0, 0, 417, 419, 1, 0, 0, 0, 418, 420, 3, 96, 47, 0, 419, 418, 1, 0, 0, 0, 419, 420, 1, 0, 0, 0, 420, 438, 1, 0, 0, 0, 421, 423, 3, 94, 46, 0, 422, 421, 1, 0, 0, 0, 423, 424, 1, 0, 0, 0, 424, 422, 1, 0, 0, 0, 424, 425, 1, 0, 0, 0, 425, 426, 1, 0, 0, 0, 426, 427, 3, 96, 47, 0, 427, 438, 1, 0, 0, 0, 428, 430, 5, 46, 0, 0, 429, 431, 3, 94, 46, 0, 430, 429, 1, 0, 0, 0, 431, 432, 1, 0, 0, 0, 432, 430, 1, 0, 0, 0, 432, 433, 1, 0, 0, 0, 433, 435, 1, 0, 0, 0, 434, 436, 3, 96, 47, 0, 435, 434, 1, 0, 0, 0, 435, 436, 1, 0, 0, 0, 436, 438, 1, 0, 0, 0, 437, 408, 1, 0, 0, 0, 437, 422, 1, 0, 0, 0, 437, 428, 1, 0, 0, 0, 438, 117, 1, 0, 0, 0, 439, 441, 3, 94, 46, 0, 440, 439, 1, 0, 0, 0, 441, 442, 1, 0, 0, 0, 442, 440, 1, 0, 0, 0, 442, 443, 1, 0, 0, 0, 443, 453, 1, 0, 0, 0, 444, 445, 5, 48, 0, 0, 445, 446, 5, 120, 0, 0, 446, 448, 1, 0, 0, 0, 447, 449, 3, 98, 48, 0, 448, 447, 1, 0, 0, 0, 449, 450, 1, 0, 0, 0, 450, 448, 1, 0, 0, 0, 450, 451, 1, 0, 0, 0, 451, 453, 1, 0, 0, 0, 452, 440, 1, 0, 0, 0, 452, 444, 1, 0, 0, 0, 453, 119, 1, 0, 0, 0, 454, 456, 3, 94, 46, 0, 455, 454, 1, 0, 0, 0, 456, 457, 1, 0, 0, 0, 457, 455, 1, 0, 0, 0, 457, 458, 1, 0, 0, 0, 458, 459, 1, 0, 0, 0, 459, 460, 7, 9, 0, 0, 460, 472, 1, 0, 0, 0, 461, 462, 5, 48, 0, 0, 462, 463, 5, 120, 0, 0, 463, 465, 1, 0, 0, 0, 464, 466, 3, 98, 48, 0, 465, 464, 1, 0, 0, 0, 466, 467, 1, 0, 0, 0, 467, 465, 1, 0, 0, 0, 467, 468, 1, 0, 0, 0, 468, 469, 1, 0, 0, 0, 469, 470, 7, 9, 0, 0, 470, 472, 1, 0, 0, 0, 471, 455, 1, 0, 0, 0, 471, 461, 1, 0, 0, 0, 472, 121, 1, 0, 0, 0, 473, 478, 5, 34, 0, 0, 474, 477, 3, 102, 50, 0, 475, 477, 8, 10, 0, 0, 476, 474, 1, 0, 0, 0, 476, 475, 1, 0, 0, 0, 477, 480, 1, 0, 0, 0, 478, 476, 1, 0, 0, 0, 478, 479, 1, 0, 0, 0, 479, 481, 1, 0, 0, 0, 480, 478, 1, 0, 0, 0, 481, 570, 5, 34, 0, 0, 482, 487, 5, 39, 0, 0, 483, 486, 3, 102, 50, 0, 484, 486, 8, 11, 0, 0, 485, 483, 1, 0, 0, 0, 485, 484, 1, 0, 0, 0, 486, 489, 1, 0, 0, 0, 487, 485, 1, 0, 0, 0, 487, 488, 1, 0, 0, 0, 488, 490, 1, 0, 0, 0, 489, 487, 1, 0, 0, 0, 490, 570, 5, 39, 0, 0, 491, 492, 5, 34, 0, 0, 492, 493, 5, 34, 0, 0, 493, 494, 5, 34, 0, 0, 494, 499, 1, 0, 0, 0, 495, 498, 3, 102, 50, 0, 496, 498, 8, 12, 0, 0, 497, 495, 1, 0, 0, 0, 497, 496, 1, 0, 0, 0, 498, 501, 1, 0, 0, 0, 499, 500, 1, 0, 0, 0, 499, 497, 1, 0, 0, 0, 500, 502, 1, 0, 0, 0, 501, 499, 1, 0, 0, 0, 502, 503, 5, 34, 0, 0, 503, 504, 5, 34, 0, 0, 504, 570, 5, 34, 0, 0, 505, 506, 5, 39, 0, 0, 506, 507, 5, 39, 0, 0, 507, 508, 5, 39, 0, 0, 508, 513, 1, 0, 0, 0, 509, 512, 3, 102, 50, 0, 510, 512, 8, 12, 0, 0, 511, 509, 1, 0, 0, 0, 511, 510, 1, 0, 0, 0, 512, 515, 1, 0, 0, 0, 513, 514, 1, 0, 0, 0, 513, 511, 1, 0, 0, 0, 514, 516, 1, 0, 0, 0, 515, 513, 1, 0, 0, 0, 516, 517, 5, 39, 0, 0, 517, 518, 5, 39, 0, 0, 518, 570, 5, 39, 0, 0, 519, 520, 3, 100, 49, 0, 520, 524, 5, 34, 0, 0, 521, 523, 8, 13, 0, 0, 522, 521, 1, 0, 0, 0, 523, 526, 1, 0, 0, 0, 524, 522, 1, 0, 0, 0, 524, 525, 1, 0, 0, 0, 525, 527, 1, 0, 0, 0, 526, 524, 1, 0, 0, 0, 527, 528, 5, 34, 0, 0, 528, 570, 1, 0, 0, 0, 529, 530, 3, 100, 49, 0, 530, 534, 5, 39, 0, 0, 531, 533, 8, 14, 0, 0, 532, 531, 1, 0, 0, 0, 533, 536, 1, 0, 0, 0, 534, 532, 1, 0, 0, 0, 534, 535, 1, 0, 0, 0, 535, 537, 1, 0, 0, 0, 536, 534, 1, 0, 0, 0, 537, 538, 5, 39, 0, 0, 538, 570, 1, 0, 0, 0, 539, 540, 3, 100, 49, 0, 540, 541, 5, 34, 0, 0, 541, 542, 5, 34, 0, 0, 542, 543, 5, 34, 0, 0, 543, 547, 1, 0, 0, 0, 544, 546, 9, 0, 0, 0, 545, 544, 1, 0, 0, 0, 546, 549, 1, 0, 0, 0, 547, 548, 1, 0, 0, 0, 547, 545, 1, 0, 0, 0, 548, 550, 1, 0, 0, 0, 549, 547, 1, 0, 0, 0, 550, 551, 5, 34, 0, 0, 551, 552, 5, 34, 0, 0, 552, 553, 5, 34, 0, 0, 553, 570, 1, 0, 0, 0, 554, 555, 3, 100, 49, 0, 555, 556, 5, 39, 0, 0, 556, 557, 5, 39, 0, 0, 557, 558, 5, 39, 0, 0, 558, 562, 1, 0, 0, 0, 559, 561, 9, 0, 0, 0, 560, 559, 1, 0, 0, 0, 561, 564, 1, 0, 0, 0, 562, 563, 1, 0, 0, 0, 562, 560, 1, 0, 0, 0, 563, 565, 1, 0, 0, 0, 564, 562, 1, 0, 0, 0, 565, 566, 5, 39, 0, 0, 566, 567, 5, 39, 0, 0, 567, 568, 5, 39, 0, 0, 568, 570, 1, 0, 0, 0, 569, 473, 1, 0, 0, 0, 569, 482, 1, 0, 0, 0, 569, 491, 1, 0, 0, 0, 569, 505, 1, 0, 0, 0, 569, 519, 1, 0, 0, 0, 569, 529, 1, 0, 0, 0, 569, 539, 1, 0, 0, 0, 569, 554, 1, 0, 0, 0, 570, 123, 1, 0, 0, 0, 571, 572, 7, 15, 0, 0, 572, 573, 3, 122, 60, 0, 573, 125, 1, 0, 0, 0, 574, 577, 3, 92, 45, 0, 575, 577, 5, 95, 0, 0, 576, 574, 1, 0, 0, 0, 576, 575, 1, 0, 0, 0, 577, 584, 1, 0, 0, 0, 578, 583, 3, 92, 45, 0, 579, 583, 3, 94, 46, 0, 580, 583, 5, 95, 0, 0, 581, 583, 3, 70, 34, 0, 582, 578, 1, 0, 0, 0, 582, 579, 1, 0, 0, 0, 582, 580, 1, 0, 0, 0, 582, 581, 1, 0, 0, 0, 583, 586, 1, 0, 0, 0, 584, 582, 1, 0, 0, 0, 584, 585, 1, 0, 0, 0, 585, 127, 1, 0, 0, 0, 586, 584, 1, 0, 0, 0, 587, 590, 3, 92, 45, 0, 588, 590, 5, 95, 0, 0, 589, 587, 1, 0, 0, 0, 589, 588, 1, 0, 0, 0, 590, 605, 1, 0, 0, 0, 591, 595, 3, 80, 39, 0, 592, 595, 3, 68, 33, 0, 593, 595, 3, 70, 34, 0, 594, 591, 1, 0, 0, 0, 594, 592, 1, 0, 0, 0, 594, 593, 1, 0, 0, 0, 594, 595, 1, 0, 0, 0, 595, 599, 1, 0, 0, 0, 596, 600, 3, 92, 45, 0, 597, 600, 3, 94, 46, 0, 598, 600, 5, 95, 0, 0, 599, 596, 1, 0, 0, 0, 599, 597, 1, 0, 0, 0, 599, 598, 1, 0, 0, 0, 600, 601, 1, 0, 0, 0, 601, 599, 1, 0, 0, 0, 601, 602, 1, 0, 0, 0, 602, 604, 1, 0, 0, 0, 603, 594, 1, 0, 0, 0, 604, 607, 1, 0, 0, 0, 605, 603, 1, 0, 0, 0, 605, 606, 1, 0, 0, 0, 606, 129, 1, 0, 0, 0, 607, 605, 1, 0, 0, 0, 608, 610, 3, 112, 55, 0, 609, 608, 1, 0, 0, 0, 609, 610, 1, 0, 0, 0, 610, 616, 1, 0, 0, 0, 611, 613, 5, 13, 0, 0, 612, 611, 1, 0, 0, 0, 612, 613, 1, 0, 0, 0, 613, 614, 1, 0, 0, 0, 614, 617, 5, 10, 0, 0, 615, 617, 2, 12, 13, 0, 616, 612, 1, 0, 0, 0, 616, 615, 1, 0, 0, 0, 617, 619, 1, 0, 0, 0, 618, 620, 3, 112, 55, 0, 619, 618, 1, 0, 0, 0, 619, 620, 1, 0, 0, 0, 620, 622, 1, 0, 0, 0, 621, 623, 3, 130, 64, 0, 622, 621, 1, 0, 0, 0, 622, 623, 1, 0, 0, 0, 623, 131, 1, 0, 0, 0, 624, 625, 3, 66, 32, 0, 625, 626, 1, 0, 0, 0, 626, 627, 6, 65, 2, 0, 627, 628, 6, 65, 3, 0, 628, 133, 1, 0, 0, 0, 629, 630, 5, 109, 0, 0, 630, 631, 5, 97, 0, 0, 631, 637, 5, 112, 0, 0, 632, 633, 5, 108, 0, 0, 633, 634, 5, 105, 0, 0, 634, 635, 5, 115, 0, 0, 635, 637, 5, 116, 0, 0, 636, 629, 1, 0, 0, 0, 636, 632, 1, 0, 0, 0, 637, 135, 1, 0, 0, 0, 638, 639, 5, 98, 0, 0, 639, 640, 5, 111, 0, 0, 640, 641, 5, 111, 0, 0, 641, 688, 5, 108, 0, 0, 642, 643, 5, 115, 0, 0, 643, 644, 5, 116, 0, 0, 644, 645, 5, 114, 0, 0, 645, 646, 5, 105, 0, 0, 646, 647, 5, 110, 0, 0, 647, 688, 5, 103, 0, 0, 648, 649, 5, 105, 0, 0, 649, 650, 5, 110, 0, 0, 650, 688, 5, 116, 0, 0, 651, 652, 5, 117, 0, 0, 652, 653, 5, 105, 0, 0, 653, 654, 5, 110, 0, 0, 654, 688, 5, 116, 0, 0, 655, 656, 5, 100, 0, 0, 656, 657, 5, 111, 0, 0, 657, 658, 5, 117, 0, 0, 658, 659, 5, 98, 0, 0, 659, 660, 5, 108, 0, 0, 660, 688, 5, 101, 0, 0, 661, 662, 5, 100, 0, 0, 662, 663, 5, 117, 0, 0, 663, 664, 5, 114, 0, 0, 664, 665, 5, 97, 0, 0, 665, 666, 5, 116, 0, 0, 666, 667, 5, 105, 0, 0, 667, 668, 5, 111, 0, 0, 668, 688, 5, 110, 0, 0, 669, 670, 5, 116, 0, 0, 670, 671, 5, 105, 0, 0, 671, 672, 5, 109, 0, 0, 672, 673, 5, 101, 0, 0, 673, 674, 5, 115, 0, 0, 674, 675, 5, 116, 0, 0, 675, 676, 5, 97, 0, 0, 676, 677, 5, 109, 0, 0, 677, 688, 5, 112, 0, 0, 678, 679, 5, 105, 0, 0, 679, 680, 5, 112, 0, 0, 680, 681, 5, 97, 0, 0, 681, 682, 5, 100, 0, 0, 682, 683, 5, 100, 0, 0, 683, 684, 5, 114, 0, 0, 684, 685, 5, 101, 0, 0, 685, 686, 5, 115, 0, 0, 686, 688, 5, 115, 0, 0, 687, 638, 1, 0, 0, 0, 687, 642, 1, 0, 0, 0, 687, 648, 1, 0, 0, 0, 687, 651, 1, 0, 0, 0, 687, 655, 1, 0, 0, 0, 687, 661, 1, 0, 0, 0, 687, 669, 1, 0, 0, 0, 687, 678, 1, 0, 0, 0, 688, 137, 1, 0, 0, 0, 689, 690, 3, 44, 21, 0, 690, 691, 1, 0, 0, 0, 691, 692, 6, 68, 4, 0, 692, 139, 1, 0, 0, 0, 693, 694, 3, 50, 24, 0, 694, 695, 1, 0, 0, 0, 695, 696, 6, 69, 5, 0, 696, 141, 1, 0, 0, 0, 697, 698, 3, 64, 31, 0, 698, 699, 1, 0, 0, 0, 699, 700, 6, 70, 6, 0, 700, 143, 1, 0, 0, 0, 701, 702, 3, 4, 1, 0, 702, 703, 1, 0, 0, 0, 703, 704, 6, 71, 7, 0, 704, 145, 1, 0, 0, 0, 705, 706, 3, 6, 2, 0, 706, 707, 1, 0, 0, 0, 707, 708, 6, 72, 8, 0, 708, 147, 1, 0, 0, 0, 709, 710, 3, 112, 55, 0, 710, 711, 1, 0, 0, 0, 711, 712, 6, 73, 9, 0, 712, 149, 1, 0, 0, 0, 713, 714, 3, 126, 62, 0, 714, 715, 1, 0, 0, 0, 715, 716, 6, 74, 10, 0, 716, 151, 1, 0, 0, 0, 51, 0, 1, 201, 207, 341, 346, 356, 389, 394, 402, 410, 416, 419, 424, 432, 435, 437, 442, 450, 452, 457, 467, 471, 476, 478, 485, 487, 497, 499, 511, 513, 524, 534, 547, 562, 569, 576, 582, 584, 589, 594, 599, 601, 605, 609, 612, 616, 619, 622, 636, 687, 11, 5, 1, 0, 0, 1, 0, 7, 8, 0, 4, 0, 0, 7, 3, 0, 7, 4, 0, 7, 7, 0, 7, 1, 0, 7, 2, 0, 7, 9, 0, 7, 10, 0] \ No newline at end of file +[4, 0, 58, 731, 6, -1, 6, -1, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 2, 41, 7, 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 2, 45, 7, 45, 2, 46, 7, 46, 2, 47, 7, 47, 2, 48, 7, 48, 2, 49, 7, 49, 2, 50, 7, 50, 2, 51, 7, 51, 2, 52, 7, 52, 2, 53, 7, 53, 2, 54, 7, 54, 2, 55, 7, 55, 2, 56, 7, 56, 2, 57, 7, 57, 2, 58, 7, 58, 2, 59, 7, 59, 2, 60, 7, 60, 2, 61, 7, 61, 2, 62, 7, 62, 2, 63, 7, 63, 2, 64, 7, 64, 2, 65, 7, 65, 2, 66, 7, 66, 2, 67, 7, 67, 2, 68, 7, 68, 2, 69, 7, 69, 2, 70, 7, 70, 2, 71, 7, 71, 2, 72, 7, 72, 2, 73, 7, 73, 2, 74, 7, 74, 2, 75, 7, 75, 1, 0, 1, 0, 1, 1, 1, 1, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 10, 4, 10, 202, 8, 10, 11, 10, 12, 10, 203, 1, 10, 1, 10, 4, 10, 208, 8, 10, 11, 10, 12, 10, 209, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 18, 1, 18, 1, 18, 1, 19, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 21, 1, 21, 1, 22, 1, 22, 1, 22, 1, 23, 1, 23, 1, 23, 1, 24, 1, 24, 1, 25, 1, 25, 1, 25, 1, 26, 1, 26, 1, 26, 1, 27, 1, 27, 1, 28, 1, 28, 1, 29, 1, 29, 1, 30, 1, 30, 1, 31, 1, 31, 1, 32, 1, 32, 1, 33, 1, 33, 1, 34, 1, 34, 1, 35, 1, 35, 1, 36, 1, 36, 1, 37, 1, 37, 1, 38, 1, 38, 1, 39, 1, 39, 1, 40, 1, 40, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 44, 1, 44, 1, 45, 1, 45, 1, 46, 1, 46, 1, 47, 1, 47, 3, 47, 344, 8, 47, 1, 47, 4, 47, 347, 8, 47, 11, 47, 12, 47, 348, 1, 48, 1, 48, 1, 49, 1, 49, 1, 50, 1, 50, 1, 50, 1, 50, 3, 50, 359, 8, 50, 1, 51, 1, 51, 1, 51, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 3, 54, 392, 8, 54, 1, 55, 4, 55, 395, 8, 55, 11, 55, 12, 55, 396, 1, 56, 1, 56, 1, 56, 1, 56, 5, 56, 403, 8, 56, 10, 56, 12, 56, 406, 9, 56, 1, 56, 1, 56, 1, 57, 4, 57, 411, 8, 57, 11, 57, 12, 57, 412, 1, 57, 1, 57, 4, 57, 417, 8, 57, 11, 57, 12, 57, 418, 1, 57, 3, 57, 422, 8, 57, 1, 57, 4, 57, 425, 8, 57, 11, 57, 12, 57, 426, 1, 57, 1, 57, 1, 57, 1, 57, 4, 57, 433, 8, 57, 11, 57, 12, 57, 434, 1, 57, 3, 57, 438, 8, 57, 3, 57, 440, 8, 57, 1, 58, 4, 58, 443, 8, 58, 11, 58, 12, 58, 444, 1, 58, 1, 58, 1, 58, 1, 58, 4, 58, 451, 8, 58, 11, 58, 12, 58, 452, 3, 58, 455, 8, 58, 1, 59, 4, 59, 458, 8, 59, 11, 59, 12, 59, 459, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 4, 59, 468, 8, 59, 11, 59, 12, 59, 469, 1, 59, 1, 59, 3, 59, 474, 8, 59, 1, 60, 1, 60, 1, 60, 5, 60, 479, 8, 60, 10, 60, 12, 60, 482, 9, 60, 1, 60, 1, 60, 1, 60, 1, 60, 5, 60, 488, 8, 60, 10, 60, 12, 60, 491, 9, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 5, 60, 500, 8, 60, 10, 60, 12, 60, 503, 9, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 5, 60, 514, 8, 60, 10, 60, 12, 60, 517, 9, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 5, 60, 525, 8, 60, 10, 60, 12, 60, 528, 9, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 5, 60, 535, 8, 60, 10, 60, 12, 60, 538, 9, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 5, 60, 548, 8, 60, 10, 60, 12, 60, 551, 9, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 5, 60, 563, 8, 60, 10, 60, 12, 60, 566, 9, 60, 1, 60, 1, 60, 1, 60, 1, 60, 3, 60, 572, 8, 60, 1, 61, 1, 61, 1, 61, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 63, 1, 63, 3, 63, 591, 8, 63, 1, 63, 1, 63, 1, 63, 1, 63, 5, 63, 597, 8, 63, 10, 63, 12, 63, 600, 9, 63, 1, 64, 1, 64, 3, 64, 604, 8, 64, 1, 64, 1, 64, 1, 64, 3, 64, 609, 8, 64, 1, 64, 1, 64, 1, 64, 4, 64, 614, 8, 64, 11, 64, 12, 64, 615, 5, 64, 618, 8, 64, 10, 64, 12, 64, 621, 9, 64, 1, 65, 3, 65, 624, 8, 65, 1, 65, 3, 65, 627, 8, 65, 1, 65, 1, 65, 3, 65, 631, 8, 65, 1, 65, 3, 65, 634, 8, 65, 1, 65, 3, 65, 637, 8, 65, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 3, 67, 651, 8, 67, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 3, 68, 702, 8, 68, 1, 69, 1, 69, 1, 69, 1, 69, 1, 70, 1, 70, 1, 70, 1, 70, 1, 71, 1, 71, 1, 71, 1, 71, 1, 72, 1, 72, 1, 72, 1, 72, 1, 73, 1, 73, 1, 73, 1, 73, 1, 74, 1, 74, 1, 74, 1, 74, 1, 75, 1, 75, 1, 75, 1, 75, 4, 501, 515, 549, 564, 0, 76, 2, 11, 4, 1, 6, 2, 8, 12, 10, 13, 12, 14, 14, 15, 16, 16, 18, 17, 20, 18, 22, 19, 24, 20, 26, 21, 28, 22, 30, 23, 32, 24, 34, 25, 36, 26, 38, 27, 40, 28, 42, 29, 44, 3, 46, 30, 48, 31, 50, 4, 52, 32, 54, 33, 56, 5, 58, 34, 60, 35, 62, 36, 64, 7, 66, 8, 68, 37, 70, 38, 72, 39, 74, 40, 76, 41, 78, 42, 80, 43, 82, 44, 84, 45, 86, 46, 88, 47, 90, 0, 92, 0, 94, 0, 96, 0, 98, 0, 100, 0, 102, 0, 104, 0, 106, 0, 108, 0, 110, 0, 112, 9, 114, 48, 116, 49, 118, 50, 120, 51, 122, 52, 124, 53, 126, 54, 128, 10, 130, 55, 132, 56, 134, 0, 136, 57, 138, 58, 140, 0, 142, 0, 144, 0, 146, 0, 148, 0, 150, 0, 152, 0, 2, 0, 1, 16, 2, 0, 65, 90, 97, 122, 2, 0, 69, 69, 101, 101, 2, 0, 43, 43, 45, 45, 3, 0, 48, 57, 65, 70, 97, 102, 2, 0, 82, 82, 114, 114, 10, 0, 34, 34, 39, 39, 63, 63, 92, 92, 96, 98, 102, 102, 110, 110, 114, 114, 116, 116, 118, 118, 2, 0, 88, 88, 120, 120, 3, 0, 9, 9, 12, 12, 32, 32, 1, 0, 10, 10, 2, 0, 85, 85, 117, 117, 4, 0, 10, 10, 13, 13, 34, 34, 92, 92, 4, 0, 10, 10, 13, 13, 39, 39, 92, 92, 1, 0, 92, 92, 3, 0, 10, 10, 13, 13, 34, 34, 3, 0, 10, 10, 13, 13, 39, 39, 2, 0, 66, 66, 98, 98, 787, 0, 2, 1, 0, 0, 0, 0, 4, 1, 0, 0, 0, 0, 6, 1, 0, 0, 0, 0, 8, 1, 0, 0, 0, 0, 10, 1, 0, 0, 0, 0, 12, 1, 0, 0, 0, 0, 14, 1, 0, 0, 0, 0, 16, 1, 0, 0, 0, 0, 18, 1, 0, 0, 0, 0, 20, 1, 0, 0, 0, 0, 22, 1, 0, 0, 0, 0, 24, 1, 0, 0, 0, 0, 26, 1, 0, 0, 0, 0, 28, 1, 0, 0, 0, 0, 30, 1, 0, 0, 0, 0, 32, 1, 0, 0, 0, 0, 34, 1, 0, 0, 0, 0, 36, 1, 0, 0, 0, 0, 38, 1, 0, 0, 0, 0, 40, 1, 0, 0, 0, 0, 42, 1, 0, 0, 0, 0, 44, 1, 0, 0, 0, 0, 46, 1, 0, 0, 0, 0, 48, 1, 0, 0, 0, 0, 50, 1, 0, 0, 0, 0, 52, 1, 0, 0, 0, 0, 54, 1, 0, 0, 0, 0, 56, 1, 0, 0, 0, 0, 58, 1, 0, 0, 0, 0, 60, 1, 0, 0, 0, 0, 62, 1, 0, 0, 0, 0, 64, 1, 0, 0, 0, 0, 66, 1, 0, 0, 0, 0, 68, 1, 0, 0, 0, 0, 70, 1, 0, 0, 0, 0, 72, 1, 0, 0, 0, 0, 74, 1, 0, 0, 0, 0, 76, 1, 0, 0, 0, 0, 78, 1, 0, 0, 0, 0, 80, 1, 0, 0, 0, 0, 82, 1, 0, 0, 0, 0, 84, 1, 0, 0, 0, 0, 86, 1, 0, 0, 0, 0, 88, 1, 0, 0, 0, 0, 112, 1, 0, 0, 0, 0, 114, 1, 0, 0, 0, 0, 116, 1, 0, 0, 0, 0, 118, 1, 0, 0, 0, 0, 120, 1, 0, 0, 0, 0, 122, 1, 0, 0, 0, 0, 124, 1, 0, 0, 0, 0, 126, 1, 0, 0, 0, 0, 128, 1, 0, 0, 0, 0, 130, 1, 0, 0, 0, 0, 132, 1, 0, 0, 0, 1, 134, 1, 0, 0, 0, 1, 136, 1, 0, 0, 0, 1, 138, 1, 0, 0, 0, 1, 140, 1, 0, 0, 0, 1, 142, 1, 0, 0, 0, 1, 144, 1, 0, 0, 0, 1, 146, 1, 0, 0, 0, 1, 148, 1, 0, 0, 0, 1, 150, 1, 0, 0, 0, 1, 152, 1, 0, 0, 0, 2, 154, 1, 0, 0, 0, 4, 156, 1, 0, 0, 0, 6, 158, 1, 0, 0, 0, 8, 160, 1, 0, 0, 0, 10, 164, 1, 0, 0, 0, 12, 167, 1, 0, 0, 0, 14, 175, 1, 0, 0, 0, 16, 180, 1, 0, 0, 0, 18, 187, 1, 0, 0, 0, 20, 193, 1, 0, 0, 0, 22, 201, 1, 0, 0, 0, 24, 211, 1, 0, 0, 0, 26, 218, 1, 0, 0, 0, 28, 223, 1, 0, 0, 0, 30, 235, 1, 0, 0, 0, 32, 245, 1, 0, 0, 0, 34, 254, 1, 0, 0, 0, 36, 261, 1, 0, 0, 0, 38, 266, 1, 0, 0, 0, 40, 269, 1, 0, 0, 0, 42, 272, 1, 0, 0, 0, 44, 275, 1, 0, 0, 0, 46, 277, 1, 0, 0, 0, 48, 280, 1, 0, 0, 0, 50, 283, 1, 0, 0, 0, 52, 285, 1, 0, 0, 0, 54, 288, 1, 0, 0, 0, 56, 291, 1, 0, 0, 0, 58, 293, 1, 0, 0, 0, 60, 295, 1, 0, 0, 0, 62, 297, 1, 0, 0, 0, 64, 299, 1, 0, 0, 0, 66, 301, 1, 0, 0, 0, 68, 303, 1, 0, 0, 0, 70, 305, 1, 0, 0, 0, 72, 307, 1, 0, 0, 0, 74, 309, 1, 0, 0, 0, 76, 311, 1, 0, 0, 0, 78, 313, 1, 0, 0, 0, 80, 315, 1, 0, 0, 0, 82, 317, 1, 0, 0, 0, 84, 319, 1, 0, 0, 0, 86, 324, 1, 0, 0, 0, 88, 330, 1, 0, 0, 0, 90, 335, 1, 0, 0, 0, 92, 337, 1, 0, 0, 0, 94, 339, 1, 0, 0, 0, 96, 341, 1, 0, 0, 0, 98, 350, 1, 0, 0, 0, 100, 352, 1, 0, 0, 0, 102, 358, 1, 0, 0, 0, 104, 360, 1, 0, 0, 0, 106, 363, 1, 0, 0, 0, 108, 368, 1, 0, 0, 0, 110, 391, 1, 0, 0, 0, 112, 394, 1, 0, 0, 0, 114, 398, 1, 0, 0, 0, 116, 439, 1, 0, 0, 0, 118, 454, 1, 0, 0, 0, 120, 473, 1, 0, 0, 0, 122, 571, 1, 0, 0, 0, 124, 573, 1, 0, 0, 0, 126, 576, 1, 0, 0, 0, 128, 590, 1, 0, 0, 0, 130, 603, 1, 0, 0, 0, 132, 623, 1, 0, 0, 0, 134, 638, 1, 0, 0, 0, 136, 650, 1, 0, 0, 0, 138, 701, 1, 0, 0, 0, 140, 703, 1, 0, 0, 0, 142, 707, 1, 0, 0, 0, 144, 711, 1, 0, 0, 0, 146, 715, 1, 0, 0, 0, 148, 719, 1, 0, 0, 0, 150, 723, 1, 0, 0, 0, 152, 727, 1, 0, 0, 0, 154, 155, 5, 35, 0, 0, 155, 3, 1, 0, 0, 0, 156, 157, 5, 58, 0, 0, 157, 5, 1, 0, 0, 0, 158, 159, 5, 44, 0, 0, 159, 7, 1, 0, 0, 0, 160, 161, 5, 97, 0, 0, 161, 162, 5, 110, 0, 0, 162, 163, 5, 100, 0, 0, 163, 9, 1, 0, 0, 0, 164, 165, 5, 111, 0, 0, 165, 166, 5, 114, 0, 0, 166, 11, 1, 0, 0, 0, 167, 168, 5, 98, 0, 0, 168, 169, 5, 117, 0, 0, 169, 170, 5, 116, 0, 0, 170, 171, 5, 32, 0, 0, 171, 172, 5, 110, 0, 0, 172, 173, 5, 111, 0, 0, 173, 174, 5, 116, 0, 0, 174, 13, 1, 0, 0, 0, 175, 176, 5, 102, 0, 0, 176, 177, 5, 114, 0, 0, 177, 178, 5, 111, 0, 0, 178, 179, 5, 109, 0, 0, 179, 15, 1, 0, 0, 0, 180, 181, 5, 109, 0, 0, 181, 182, 5, 111, 0, 0, 182, 183, 5, 100, 0, 0, 183, 184, 5, 117, 0, 0, 184, 185, 5, 108, 0, 0, 185, 186, 5, 101, 0, 0, 186, 17, 1, 0, 0, 0, 187, 188, 5, 109, 0, 0, 188, 189, 5, 111, 0, 0, 189, 190, 5, 100, 0, 0, 190, 191, 5, 101, 0, 0, 191, 192, 5, 108, 0, 0, 192, 19, 1, 0, 0, 0, 193, 194, 5, 115, 0, 0, 194, 195, 5, 99, 0, 0, 195, 196, 5, 104, 0, 0, 196, 197, 5, 101, 0, 0, 197, 198, 5, 109, 0, 0, 198, 199, 5, 97, 0, 0, 199, 21, 1, 0, 0, 0, 200, 202, 3, 94, 46, 0, 201, 200, 1, 0, 0, 0, 202, 203, 1, 0, 0, 0, 203, 201, 1, 0, 0, 0, 203, 204, 1, 0, 0, 0, 204, 205, 1, 0, 0, 0, 205, 207, 5, 46, 0, 0, 206, 208, 3, 94, 46, 0, 207, 206, 1, 0, 0, 0, 208, 209, 1, 0, 0, 0, 209, 207, 1, 0, 0, 0, 209, 210, 1, 0, 0, 0, 210, 23, 1, 0, 0, 0, 211, 212, 5, 101, 0, 0, 212, 213, 5, 120, 0, 0, 213, 214, 5, 116, 0, 0, 214, 215, 5, 101, 0, 0, 215, 216, 5, 110, 0, 0, 216, 217, 5, 100, 0, 0, 217, 25, 1, 0, 0, 0, 218, 219, 5, 116, 0, 0, 219, 220, 5, 121, 0, 0, 220, 221, 5, 112, 0, 0, 221, 222, 5, 101, 0, 0, 222, 27, 1, 0, 0, 0, 223, 224, 5, 99, 0, 0, 224, 225, 5, 111, 0, 0, 225, 226, 5, 110, 0, 0, 226, 227, 5, 100, 0, 0, 227, 228, 5, 105, 0, 0, 228, 229, 5, 116, 0, 0, 229, 230, 5, 105, 0, 0, 230, 231, 5, 111, 0, 0, 231, 232, 5, 110, 0, 0, 232, 233, 1, 0, 0, 0, 233, 234, 6, 13, 0, 0, 234, 29, 1, 0, 0, 0, 235, 236, 5, 114, 0, 0, 236, 237, 5, 101, 0, 0, 237, 238, 5, 108, 0, 0, 238, 239, 5, 97, 0, 0, 239, 240, 5, 116, 0, 0, 240, 241, 5, 105, 0, 0, 241, 242, 5, 111, 0, 0, 242, 243, 5, 110, 0, 0, 243, 244, 5, 115, 0, 0, 244, 31, 1, 0, 0, 0, 245, 246, 5, 114, 0, 0, 246, 247, 5, 101, 0, 0, 247, 248, 5, 108, 0, 0, 248, 249, 5, 97, 0, 0, 249, 250, 5, 116, 0, 0, 250, 251, 5, 105, 0, 0, 251, 252, 5, 111, 0, 0, 252, 253, 5, 110, 0, 0, 253, 33, 1, 0, 0, 0, 254, 255, 5, 100, 0, 0, 255, 256, 5, 101, 0, 0, 256, 257, 5, 102, 0, 0, 257, 258, 5, 105, 0, 0, 258, 259, 5, 110, 0, 0, 259, 260, 5, 101, 0, 0, 260, 35, 1, 0, 0, 0, 261, 262, 5, 119, 0, 0, 262, 263, 5, 105, 0, 0, 263, 264, 5, 116, 0, 0, 264, 265, 5, 104, 0, 0, 265, 37, 1, 0, 0, 0, 266, 267, 5, 61, 0, 0, 267, 268, 5, 61, 0, 0, 268, 39, 1, 0, 0, 0, 269, 270, 5, 33, 0, 0, 270, 271, 5, 61, 0, 0, 271, 41, 1, 0, 0, 0, 272, 273, 5, 105, 0, 0, 273, 274, 5, 110, 0, 0, 274, 43, 1, 0, 0, 0, 275, 276, 5, 60, 0, 0, 276, 45, 1, 0, 0, 0, 277, 278, 5, 60, 0, 0, 278, 279, 5, 61, 0, 0, 279, 47, 1, 0, 0, 0, 280, 281, 5, 62, 0, 0, 281, 282, 5, 61, 0, 0, 282, 49, 1, 0, 0, 0, 283, 284, 5, 62, 0, 0, 284, 51, 1, 0, 0, 0, 285, 286, 5, 38, 0, 0, 286, 287, 5, 38, 0, 0, 287, 53, 1, 0, 0, 0, 288, 289, 5, 124, 0, 0, 289, 290, 5, 124, 0, 0, 290, 55, 1, 0, 0, 0, 291, 292, 5, 91, 0, 0, 292, 57, 1, 0, 0, 0, 293, 294, 5, 93, 0, 0, 294, 59, 1, 0, 0, 0, 295, 296, 5, 123, 0, 0, 296, 61, 1, 0, 0, 0, 297, 298, 5, 125, 0, 0, 298, 63, 1, 0, 0, 0, 299, 300, 5, 40, 0, 0, 300, 65, 1, 0, 0, 0, 301, 302, 5, 41, 0, 0, 302, 67, 1, 0, 0, 0, 303, 304, 5, 46, 0, 0, 304, 69, 1, 0, 0, 0, 305, 306, 5, 45, 0, 0, 306, 71, 1, 0, 0, 0, 307, 308, 5, 33, 0, 0, 308, 73, 1, 0, 0, 0, 309, 310, 5, 63, 0, 0, 310, 75, 1, 0, 0, 0, 311, 312, 5, 43, 0, 0, 312, 77, 1, 0, 0, 0, 313, 314, 5, 42, 0, 0, 314, 79, 1, 0, 0, 0, 315, 316, 5, 47, 0, 0, 316, 81, 1, 0, 0, 0, 317, 318, 5, 37, 0, 0, 318, 83, 1, 0, 0, 0, 319, 320, 5, 116, 0, 0, 320, 321, 5, 114, 0, 0, 321, 322, 5, 117, 0, 0, 322, 323, 5, 101, 0, 0, 323, 85, 1, 0, 0, 0, 324, 325, 5, 102, 0, 0, 325, 326, 5, 97, 0, 0, 326, 327, 5, 108, 0, 0, 327, 328, 5, 115, 0, 0, 328, 329, 5, 101, 0, 0, 329, 87, 1, 0, 0, 0, 330, 331, 5, 110, 0, 0, 331, 332, 5, 117, 0, 0, 332, 333, 5, 108, 0, 0, 333, 334, 5, 108, 0, 0, 334, 89, 1, 0, 0, 0, 335, 336, 5, 92, 0, 0, 336, 91, 1, 0, 0, 0, 337, 338, 7, 0, 0, 0, 338, 93, 1, 0, 0, 0, 339, 340, 2, 48, 57, 0, 340, 95, 1, 0, 0, 0, 341, 343, 7, 1, 0, 0, 342, 344, 7, 2, 0, 0, 343, 342, 1, 0, 0, 0, 343, 344, 1, 0, 0, 0, 344, 346, 1, 0, 0, 0, 345, 347, 3, 94, 46, 0, 346, 345, 1, 0, 0, 0, 347, 348, 1, 0, 0, 0, 348, 346, 1, 0, 0, 0, 348, 349, 1, 0, 0, 0, 349, 97, 1, 0, 0, 0, 350, 351, 7, 3, 0, 0, 351, 99, 1, 0, 0, 0, 352, 353, 7, 4, 0, 0, 353, 101, 1, 0, 0, 0, 354, 359, 3, 104, 51, 0, 355, 359, 3, 108, 53, 0, 356, 359, 3, 110, 54, 0, 357, 359, 3, 106, 52, 0, 358, 354, 1, 0, 0, 0, 358, 355, 1, 0, 0, 0, 358, 356, 1, 0, 0, 0, 358, 357, 1, 0, 0, 0, 359, 103, 1, 0, 0, 0, 360, 361, 3, 90, 44, 0, 361, 362, 7, 5, 0, 0, 362, 105, 1, 0, 0, 0, 363, 364, 3, 90, 44, 0, 364, 365, 2, 48, 51, 0, 365, 366, 2, 48, 55, 0, 366, 367, 2, 48, 55, 0, 367, 107, 1, 0, 0, 0, 368, 369, 3, 90, 44, 0, 369, 370, 7, 6, 0, 0, 370, 371, 3, 98, 48, 0, 371, 372, 3, 98, 48, 0, 372, 109, 1, 0, 0, 0, 373, 374, 3, 90, 44, 0, 374, 375, 5, 117, 0, 0, 375, 376, 3, 98, 48, 0, 376, 377, 3, 98, 48, 0, 377, 378, 3, 98, 48, 0, 378, 379, 3, 98, 48, 0, 379, 392, 1, 0, 0, 0, 380, 381, 3, 90, 44, 0, 381, 382, 5, 85, 0, 0, 382, 383, 3, 98, 48, 0, 383, 384, 3, 98, 48, 0, 384, 385, 3, 98, 48, 0, 385, 386, 3, 98, 48, 0, 386, 387, 3, 98, 48, 0, 387, 388, 3, 98, 48, 0, 388, 389, 3, 98, 48, 0, 389, 390, 3, 98, 48, 0, 390, 392, 1, 0, 0, 0, 391, 373, 1, 0, 0, 0, 391, 380, 1, 0, 0, 0, 392, 111, 1, 0, 0, 0, 393, 395, 7, 7, 0, 0, 394, 393, 1, 0, 0, 0, 395, 396, 1, 0, 0, 0, 396, 394, 1, 0, 0, 0, 396, 397, 1, 0, 0, 0, 397, 113, 1, 0, 0, 0, 398, 399, 5, 47, 0, 0, 399, 400, 5, 47, 0, 0, 400, 404, 1, 0, 0, 0, 401, 403, 8, 8, 0, 0, 402, 401, 1, 0, 0, 0, 403, 406, 1, 0, 0, 0, 404, 402, 1, 0, 0, 0, 404, 405, 1, 0, 0, 0, 405, 407, 1, 0, 0, 0, 406, 404, 1, 0, 0, 0, 407, 408, 6, 56, 1, 0, 408, 115, 1, 0, 0, 0, 409, 411, 3, 94, 46, 0, 410, 409, 1, 0, 0, 0, 411, 412, 1, 0, 0, 0, 412, 410, 1, 0, 0, 0, 412, 413, 1, 0, 0, 0, 413, 414, 1, 0, 0, 0, 414, 416, 5, 46, 0, 0, 415, 417, 3, 94, 46, 0, 416, 415, 1, 0, 0, 0, 417, 418, 1, 0, 0, 0, 418, 416, 1, 0, 0, 0, 418, 419, 1, 0, 0, 0, 419, 421, 1, 0, 0, 0, 420, 422, 3, 96, 47, 0, 421, 420, 1, 0, 0, 0, 421, 422, 1, 0, 0, 0, 422, 440, 1, 0, 0, 0, 423, 425, 3, 94, 46, 0, 424, 423, 1, 0, 0, 0, 425, 426, 1, 0, 0, 0, 426, 424, 1, 0, 0, 0, 426, 427, 1, 0, 0, 0, 427, 428, 1, 0, 0, 0, 428, 429, 3, 96, 47, 0, 429, 440, 1, 0, 0, 0, 430, 432, 5, 46, 0, 0, 431, 433, 3, 94, 46, 0, 432, 431, 1, 0, 0, 0, 433, 434, 1, 0, 0, 0, 434, 432, 1, 0, 0, 0, 434, 435, 1, 0, 0, 0, 435, 437, 1, 0, 0, 0, 436, 438, 3, 96, 47, 0, 437, 436, 1, 0, 0, 0, 437, 438, 1, 0, 0, 0, 438, 440, 1, 0, 0, 0, 439, 410, 1, 0, 0, 0, 439, 424, 1, 0, 0, 0, 439, 430, 1, 0, 0, 0, 440, 117, 1, 0, 0, 0, 441, 443, 3, 94, 46, 0, 442, 441, 1, 0, 0, 0, 443, 444, 1, 0, 0, 0, 444, 442, 1, 0, 0, 0, 444, 445, 1, 0, 0, 0, 445, 455, 1, 0, 0, 0, 446, 447, 5, 48, 0, 0, 447, 448, 5, 120, 0, 0, 448, 450, 1, 0, 0, 0, 449, 451, 3, 98, 48, 0, 450, 449, 1, 0, 0, 0, 451, 452, 1, 0, 0, 0, 452, 450, 1, 0, 0, 0, 452, 453, 1, 0, 0, 0, 453, 455, 1, 0, 0, 0, 454, 442, 1, 0, 0, 0, 454, 446, 1, 0, 0, 0, 455, 119, 1, 0, 0, 0, 456, 458, 3, 94, 46, 0, 457, 456, 1, 0, 0, 0, 458, 459, 1, 0, 0, 0, 459, 457, 1, 0, 0, 0, 459, 460, 1, 0, 0, 0, 460, 461, 1, 0, 0, 0, 461, 462, 7, 9, 0, 0, 462, 474, 1, 0, 0, 0, 463, 464, 5, 48, 0, 0, 464, 465, 5, 120, 0, 0, 465, 467, 1, 0, 0, 0, 466, 468, 3, 98, 48, 0, 467, 466, 1, 0, 0, 0, 468, 469, 1, 0, 0, 0, 469, 467, 1, 0, 0, 0, 469, 470, 1, 0, 0, 0, 470, 471, 1, 0, 0, 0, 471, 472, 7, 9, 0, 0, 472, 474, 1, 0, 0, 0, 473, 457, 1, 0, 0, 0, 473, 463, 1, 0, 0, 0, 474, 121, 1, 0, 0, 0, 475, 480, 5, 34, 0, 0, 476, 479, 3, 102, 50, 0, 477, 479, 8, 10, 0, 0, 478, 476, 1, 0, 0, 0, 478, 477, 1, 0, 0, 0, 479, 482, 1, 0, 0, 0, 480, 478, 1, 0, 0, 0, 480, 481, 1, 0, 0, 0, 481, 483, 1, 0, 0, 0, 482, 480, 1, 0, 0, 0, 483, 572, 5, 34, 0, 0, 484, 489, 5, 39, 0, 0, 485, 488, 3, 102, 50, 0, 486, 488, 8, 11, 0, 0, 487, 485, 1, 0, 0, 0, 487, 486, 1, 0, 0, 0, 488, 491, 1, 0, 0, 0, 489, 487, 1, 0, 0, 0, 489, 490, 1, 0, 0, 0, 490, 492, 1, 0, 0, 0, 491, 489, 1, 0, 0, 0, 492, 572, 5, 39, 0, 0, 493, 494, 5, 34, 0, 0, 494, 495, 5, 34, 0, 0, 495, 496, 5, 34, 0, 0, 496, 501, 1, 0, 0, 0, 497, 500, 3, 102, 50, 0, 498, 500, 8, 12, 0, 0, 499, 497, 1, 0, 0, 0, 499, 498, 1, 0, 0, 0, 500, 503, 1, 0, 0, 0, 501, 502, 1, 0, 0, 0, 501, 499, 1, 0, 0, 0, 502, 504, 1, 0, 0, 0, 503, 501, 1, 0, 0, 0, 504, 505, 5, 34, 0, 0, 505, 506, 5, 34, 0, 0, 506, 572, 5, 34, 0, 0, 507, 508, 5, 39, 0, 0, 508, 509, 5, 39, 0, 0, 509, 510, 5, 39, 0, 0, 510, 515, 1, 0, 0, 0, 511, 514, 3, 102, 50, 0, 512, 514, 8, 12, 0, 0, 513, 511, 1, 0, 0, 0, 513, 512, 1, 0, 0, 0, 514, 517, 1, 0, 0, 0, 515, 516, 1, 0, 0, 0, 515, 513, 1, 0, 0, 0, 516, 518, 1, 0, 0, 0, 517, 515, 1, 0, 0, 0, 518, 519, 5, 39, 0, 0, 519, 520, 5, 39, 0, 0, 520, 572, 5, 39, 0, 0, 521, 522, 3, 100, 49, 0, 522, 526, 5, 34, 0, 0, 523, 525, 8, 13, 0, 0, 524, 523, 1, 0, 0, 0, 525, 528, 1, 0, 0, 0, 526, 524, 1, 0, 0, 0, 526, 527, 1, 0, 0, 0, 527, 529, 1, 0, 0, 0, 528, 526, 1, 0, 0, 0, 529, 530, 5, 34, 0, 0, 530, 572, 1, 0, 0, 0, 531, 532, 3, 100, 49, 0, 532, 536, 5, 39, 0, 0, 533, 535, 8, 14, 0, 0, 534, 533, 1, 0, 0, 0, 535, 538, 1, 0, 0, 0, 536, 534, 1, 0, 0, 0, 536, 537, 1, 0, 0, 0, 537, 539, 1, 0, 0, 0, 538, 536, 1, 0, 0, 0, 539, 540, 5, 39, 0, 0, 540, 572, 1, 0, 0, 0, 541, 542, 3, 100, 49, 0, 542, 543, 5, 34, 0, 0, 543, 544, 5, 34, 0, 0, 544, 545, 5, 34, 0, 0, 545, 549, 1, 0, 0, 0, 546, 548, 9, 0, 0, 0, 547, 546, 1, 0, 0, 0, 548, 551, 1, 0, 0, 0, 549, 550, 1, 0, 0, 0, 549, 547, 1, 0, 0, 0, 550, 552, 1, 0, 0, 0, 551, 549, 1, 0, 0, 0, 552, 553, 5, 34, 0, 0, 553, 554, 5, 34, 0, 0, 554, 555, 5, 34, 0, 0, 555, 572, 1, 0, 0, 0, 556, 557, 3, 100, 49, 0, 557, 558, 5, 39, 0, 0, 558, 559, 5, 39, 0, 0, 559, 560, 5, 39, 0, 0, 560, 564, 1, 0, 0, 0, 561, 563, 9, 0, 0, 0, 562, 561, 1, 0, 0, 0, 563, 566, 1, 0, 0, 0, 564, 565, 1, 0, 0, 0, 564, 562, 1, 0, 0, 0, 565, 567, 1, 0, 0, 0, 566, 564, 1, 0, 0, 0, 567, 568, 5, 39, 0, 0, 568, 569, 5, 39, 0, 0, 569, 570, 5, 39, 0, 0, 570, 572, 1, 0, 0, 0, 571, 475, 1, 0, 0, 0, 571, 484, 1, 0, 0, 0, 571, 493, 1, 0, 0, 0, 571, 507, 1, 0, 0, 0, 571, 521, 1, 0, 0, 0, 571, 531, 1, 0, 0, 0, 571, 541, 1, 0, 0, 0, 571, 556, 1, 0, 0, 0, 572, 123, 1, 0, 0, 0, 573, 574, 7, 15, 0, 0, 574, 575, 3, 122, 60, 0, 575, 125, 1, 0, 0, 0, 576, 577, 5, 36, 0, 0, 577, 578, 5, 101, 0, 0, 578, 579, 5, 120, 0, 0, 579, 580, 5, 112, 0, 0, 580, 581, 5, 114, 0, 0, 581, 582, 5, 101, 0, 0, 582, 583, 5, 115, 0, 0, 583, 584, 5, 115, 0, 0, 584, 585, 5, 105, 0, 0, 585, 586, 5, 111, 0, 0, 586, 587, 5, 110, 0, 0, 587, 127, 1, 0, 0, 0, 588, 591, 3, 92, 45, 0, 589, 591, 5, 95, 0, 0, 590, 588, 1, 0, 0, 0, 590, 589, 1, 0, 0, 0, 591, 598, 1, 0, 0, 0, 592, 597, 3, 92, 45, 0, 593, 597, 3, 94, 46, 0, 594, 597, 5, 95, 0, 0, 595, 597, 3, 70, 34, 0, 596, 592, 1, 0, 0, 0, 596, 593, 1, 0, 0, 0, 596, 594, 1, 0, 0, 0, 596, 595, 1, 0, 0, 0, 597, 600, 1, 0, 0, 0, 598, 596, 1, 0, 0, 0, 598, 599, 1, 0, 0, 0, 599, 129, 1, 0, 0, 0, 600, 598, 1, 0, 0, 0, 601, 604, 3, 92, 45, 0, 602, 604, 5, 95, 0, 0, 603, 601, 1, 0, 0, 0, 603, 602, 1, 0, 0, 0, 604, 619, 1, 0, 0, 0, 605, 609, 3, 80, 39, 0, 606, 609, 3, 68, 33, 0, 607, 609, 3, 70, 34, 0, 608, 605, 1, 0, 0, 0, 608, 606, 1, 0, 0, 0, 608, 607, 1, 0, 0, 0, 608, 609, 1, 0, 0, 0, 609, 613, 1, 0, 0, 0, 610, 614, 3, 92, 45, 0, 611, 614, 3, 94, 46, 0, 612, 614, 5, 95, 0, 0, 613, 610, 1, 0, 0, 0, 613, 611, 1, 0, 0, 0, 613, 612, 1, 0, 0, 0, 614, 615, 1, 0, 0, 0, 615, 613, 1, 0, 0, 0, 615, 616, 1, 0, 0, 0, 616, 618, 1, 0, 0, 0, 617, 608, 1, 0, 0, 0, 618, 621, 1, 0, 0, 0, 619, 617, 1, 0, 0, 0, 619, 620, 1, 0, 0, 0, 620, 131, 1, 0, 0, 0, 621, 619, 1, 0, 0, 0, 622, 624, 3, 112, 55, 0, 623, 622, 1, 0, 0, 0, 623, 624, 1, 0, 0, 0, 624, 630, 1, 0, 0, 0, 625, 627, 5, 13, 0, 0, 626, 625, 1, 0, 0, 0, 626, 627, 1, 0, 0, 0, 627, 628, 1, 0, 0, 0, 628, 631, 5, 10, 0, 0, 629, 631, 2, 12, 13, 0, 630, 626, 1, 0, 0, 0, 630, 629, 1, 0, 0, 0, 631, 633, 1, 0, 0, 0, 632, 634, 3, 112, 55, 0, 633, 632, 1, 0, 0, 0, 633, 634, 1, 0, 0, 0, 634, 636, 1, 0, 0, 0, 635, 637, 3, 132, 65, 0, 636, 635, 1, 0, 0, 0, 636, 637, 1, 0, 0, 0, 637, 133, 1, 0, 0, 0, 638, 639, 3, 66, 32, 0, 639, 640, 1, 0, 0, 0, 640, 641, 6, 66, 2, 0, 641, 642, 6, 66, 3, 0, 642, 135, 1, 0, 0, 0, 643, 644, 5, 109, 0, 0, 644, 645, 5, 97, 0, 0, 645, 651, 5, 112, 0, 0, 646, 647, 5, 108, 0, 0, 647, 648, 5, 105, 0, 0, 648, 649, 5, 115, 0, 0, 649, 651, 5, 116, 0, 0, 650, 643, 1, 0, 0, 0, 650, 646, 1, 0, 0, 0, 651, 137, 1, 0, 0, 0, 652, 653, 5, 98, 0, 0, 653, 654, 5, 111, 0, 0, 654, 655, 5, 111, 0, 0, 655, 702, 5, 108, 0, 0, 656, 657, 5, 115, 0, 0, 657, 658, 5, 116, 0, 0, 658, 659, 5, 114, 0, 0, 659, 660, 5, 105, 0, 0, 660, 661, 5, 110, 0, 0, 661, 702, 5, 103, 0, 0, 662, 663, 5, 105, 0, 0, 663, 664, 5, 110, 0, 0, 664, 702, 5, 116, 0, 0, 665, 666, 5, 117, 0, 0, 666, 667, 5, 105, 0, 0, 667, 668, 5, 110, 0, 0, 668, 702, 5, 116, 0, 0, 669, 670, 5, 100, 0, 0, 670, 671, 5, 111, 0, 0, 671, 672, 5, 117, 0, 0, 672, 673, 5, 98, 0, 0, 673, 674, 5, 108, 0, 0, 674, 702, 5, 101, 0, 0, 675, 676, 5, 100, 0, 0, 676, 677, 5, 117, 0, 0, 677, 678, 5, 114, 0, 0, 678, 679, 5, 97, 0, 0, 679, 680, 5, 116, 0, 0, 680, 681, 5, 105, 0, 0, 681, 682, 5, 111, 0, 0, 682, 702, 5, 110, 0, 0, 683, 684, 5, 116, 0, 0, 684, 685, 5, 105, 0, 0, 685, 686, 5, 109, 0, 0, 686, 687, 5, 101, 0, 0, 687, 688, 5, 115, 0, 0, 688, 689, 5, 116, 0, 0, 689, 690, 5, 97, 0, 0, 690, 691, 5, 109, 0, 0, 691, 702, 5, 112, 0, 0, 692, 693, 5, 105, 0, 0, 693, 694, 5, 112, 0, 0, 694, 695, 5, 97, 0, 0, 695, 696, 5, 100, 0, 0, 696, 697, 5, 100, 0, 0, 697, 698, 5, 114, 0, 0, 698, 699, 5, 101, 0, 0, 699, 700, 5, 115, 0, 0, 700, 702, 5, 115, 0, 0, 701, 652, 1, 0, 0, 0, 701, 656, 1, 0, 0, 0, 701, 662, 1, 0, 0, 0, 701, 665, 1, 0, 0, 0, 701, 669, 1, 0, 0, 0, 701, 675, 1, 0, 0, 0, 701, 683, 1, 0, 0, 0, 701, 692, 1, 0, 0, 0, 702, 139, 1, 0, 0, 0, 703, 704, 3, 44, 21, 0, 704, 705, 1, 0, 0, 0, 705, 706, 6, 69, 4, 0, 706, 141, 1, 0, 0, 0, 707, 708, 3, 50, 24, 0, 708, 709, 1, 0, 0, 0, 709, 710, 6, 70, 5, 0, 710, 143, 1, 0, 0, 0, 711, 712, 3, 64, 31, 0, 712, 713, 1, 0, 0, 0, 713, 714, 6, 71, 6, 0, 714, 145, 1, 0, 0, 0, 715, 716, 3, 4, 1, 0, 716, 717, 1, 0, 0, 0, 717, 718, 6, 72, 7, 0, 718, 147, 1, 0, 0, 0, 719, 720, 3, 6, 2, 0, 720, 721, 1, 0, 0, 0, 721, 722, 6, 73, 8, 0, 722, 149, 1, 0, 0, 0, 723, 724, 3, 112, 55, 0, 724, 725, 1, 0, 0, 0, 725, 726, 6, 74, 9, 0, 726, 151, 1, 0, 0, 0, 727, 728, 3, 128, 63, 0, 728, 729, 1, 0, 0, 0, 729, 730, 6, 75, 10, 0, 730, 153, 1, 0, 0, 0, 51, 0, 1, 203, 209, 343, 348, 358, 391, 396, 404, 412, 418, 421, 426, 434, 437, 439, 444, 452, 454, 459, 469, 473, 478, 480, 487, 489, 499, 501, 513, 515, 526, 536, 549, 564, 571, 590, 596, 598, 603, 608, 613, 615, 619, 623, 626, 630, 633, 636, 650, 701, 11, 5, 1, 0, 0, 1, 0, 7, 8, 0, 4, 0, 0, 7, 3, 0, 7, 4, 0, 7, 7, 0, 7, 1, 0, 7, 2, 0, 7, 9, 0, 7, 10, 0] \ No newline at end of file diff --git a/pkg/js/gen/OpenFGALexer.tokens b/pkg/js/gen/OpenFGALexer.tokens index 512cec30..b2523ac8 100644 --- a/pkg/js/gen/OpenFGALexer.tokens +++ b/pkg/js/gen/OpenFGALexer.tokens @@ -51,10 +51,11 @@ NUM_INT=50 NUM_UINT=51 STRING=52 BYTES=53 -EXTENDED_IDENTIFIER=54 -NEWLINE=55 -CONDITION_PARAM_CONTAINER=56 -CONDITION_PARAM_TYPE=57 +DOLLAR_EXPRESSION=54 +EXTENDED_IDENTIFIER=55 +NEWLINE=56 +CONDITION_PARAM_CONTAINER=57 +CONDITION_PARAM_TYPE=58 '#'=11 ':'=1 ','=2 @@ -98,3 +99,4 @@ CONDITION_PARAM_TYPE=57 'true'=45 'false'=46 'null'=47 +'$expression'=54 diff --git a/pkg/js/gen/OpenFGALexer.ts b/pkg/js/gen/OpenFGALexer.ts index dad8ef01..ffcd79c4 100644 --- a/pkg/js/gen/OpenFGALexer.ts +++ b/pkg/js/gen/OpenFGALexer.ts @@ -65,10 +65,11 @@ export default class OpenFGALexer extends Lexer { public static readonly NUM_UINT = 51; public static readonly STRING = 52; public static readonly BYTES = 53; - public static readonly EXTENDED_IDENTIFIER = 54; - public static readonly NEWLINE = 55; - public static readonly CONDITION_PARAM_CONTAINER = 56; - public static readonly CONDITION_PARAM_TYPE = 57; + public static readonly DOLLAR_EXPRESSION = 54; + public static readonly EXTENDED_IDENTIFIER = 55; + public static readonly NEWLINE = 56; + public static readonly CONDITION_PARAM_CONTAINER = 57; + public static readonly CONDITION_PARAM_TYPE = 58; public static readonly EOF = Token.EOF; public static readonly CONDITION_DEF = 1; @@ -98,7 +99,11 @@ export default class OpenFGALexer extends Lexer { "'?'", "'+'", "'*'", "'/'", "'%'", "'true'", - "'false'", "'null'" ]; + "'false'", "'null'", + null, null, + null, null, + null, null, + "'$expression'" ]; public static readonly symbolicNames: (string | null)[] = [ null, "COLON", "COMMA", "LESS", "GREATER", @@ -135,6 +140,7 @@ export default class OpenFGALexer extends Lexer { "NUM_INT", "NUM_UINT", "STRING", "BYTES", + "DOLLAR_EXPRESSION", "EXTENDED_IDENTIFIER", "NEWLINE", "CONDITION_PARAM_CONTAINER", @@ -151,10 +157,10 @@ export default class OpenFGALexer extends Lexer { "CEL_TRUE", "CEL_FALSE", "NUL", "BACKSLASH", "LETTER", "DIGIT", "EXPONENT", "HEXDIGIT", "RAW", "ESC_SEQ", "ESC_CHAR_SEQ", "ESC_OCT_SEQ", "ESC_BYTE_SEQ", "ESC_UNI_SEQ", "WHITESPACE", "CEL_COMMENT", "NUM_FLOAT", "NUM_INT", "NUM_UINT", - "STRING", "BYTES", "IDENTIFIER", "EXTENDED_IDENTIFIER", "NEWLINE", "CONDITION_DEF_END", - "CONDITION_PARAM_CONTAINER", "CONDITION_PARAM_TYPE", "CONDITION_PARAM_TYPE_LESS", - "CONDITION_PARAM_TYPE_GREATER", "CONDITION_OPEN", "CONDITION_COLON", "CONDITION_COMMA", - "CONDITION_WS", "CONDITION_NAME", + "STRING", "BYTES", "DOLLAR_EXPRESSION", "IDENTIFIER", "EXTENDED_IDENTIFIER", + "NEWLINE", "CONDITION_DEF_END", "CONDITION_PARAM_CONTAINER", "CONDITION_PARAM_TYPE", + "CONDITION_PARAM_TYPE_LESS", "CONDITION_PARAM_TYPE_GREATER", "CONDITION_OPEN", + "CONDITION_COLON", "CONDITION_COMMA", "CONDITION_WS", "CONDITION_NAME", ]; @@ -175,7 +181,7 @@ export default class OpenFGALexer extends Lexer { public get modeNames(): string[] { return OpenFGALexer.modeNames; } - public static readonly _serializedATN: number[] = [4,0,57,717,6,-1,6,-1, + public static readonly _serializedATN: number[] = [4,0,58,731,6,-1,6,-1, 2,0,7,0,2,1,7,1,2,2,7,2,2,3,7,3,2,4,7,4,2,5,7,5,2,6,7,6,2,7,7,7,2,8,7,8, 2,9,7,9,2,10,7,10,2,11,7,11,2,12,7,12,2,13,7,13,2,14,7,14,2,15,7,15,2,16, 7,16,2,17,7,17,2,18,7,18,2,19,7,19,2,20,7,20,2,21,7,21,2,22,7,22,2,23,7, @@ -186,241 +192,245 @@ export default class OpenFGALexer extends Lexer { 52,2,53,7,53,2,54,7,54,2,55,7,55,2,56,7,56,2,57,7,57,2,58,7,58,2,59,7,59, 2,60,7,60,2,61,7,61,2,62,7,62,2,63,7,63,2,64,7,64,2,65,7,65,2,66,7,66,2, 67,7,67,2,68,7,68,2,69,7,69,2,70,7,70,2,71,7,71,2,72,7,72,2,73,7,73,2,74, - 7,74,1,0,1,0,1,1,1,1,1,2,1,2,1,3,1,3,1,3,1,3,1,4,1,4,1,4,1,5,1,5,1,5,1, - 5,1,5,1,5,1,5,1,5,1,6,1,6,1,6,1,6,1,6,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,8,1, - 8,1,8,1,8,1,8,1,8,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,10,4,10,200,8,10,11,10, - 12,10,201,1,10,1,10,4,10,206,8,10,11,10,12,10,207,1,11,1,11,1,11,1,11,1, - 11,1,11,1,11,1,12,1,12,1,12,1,12,1,12,1,13,1,13,1,13,1,13,1,13,1,13,1,13, - 1,13,1,13,1,13,1,13,1,13,1,14,1,14,1,14,1,14,1,14,1,14,1,14,1,14,1,14,1, - 14,1,15,1,15,1,15,1,15,1,15,1,15,1,15,1,15,1,15,1,16,1,16,1,16,1,16,1,16, - 1,16,1,16,1,17,1,17,1,17,1,17,1,17,1,18,1,18,1,18,1,19,1,19,1,19,1,20,1, - 20,1,20,1,21,1,21,1,22,1,22,1,22,1,23,1,23,1,23,1,24,1,24,1,25,1,25,1,25, - 1,26,1,26,1,26,1,27,1,27,1,28,1,28,1,29,1,29,1,30,1,30,1,31,1,31,1,32,1, - 32,1,33,1,33,1,34,1,34,1,35,1,35,1,36,1,36,1,37,1,37,1,38,1,38,1,39,1,39, - 1,40,1,40,1,41,1,41,1,41,1,41,1,41,1,42,1,42,1,42,1,42,1,42,1,42,1,43,1, - 43,1,43,1,43,1,43,1,44,1,44,1,45,1,45,1,46,1,46,1,47,1,47,3,47,342,8,47, - 1,47,4,47,345,8,47,11,47,12,47,346,1,48,1,48,1,49,1,49,1,50,1,50,1,50,1, - 50,3,50,357,8,50,1,51,1,51,1,51,1,52,1,52,1,52,1,52,1,52,1,53,1,53,1,53, - 1,53,1,53,1,54,1,54,1,54,1,54,1,54,1,54,1,54,1,54,1,54,1,54,1,54,1,54,1, - 54,1,54,1,54,1,54,1,54,1,54,3,54,390,8,54,1,55,4,55,393,8,55,11,55,12,55, - 394,1,56,1,56,1,56,1,56,5,56,401,8,56,10,56,12,56,404,9,56,1,56,1,56,1, - 57,4,57,409,8,57,11,57,12,57,410,1,57,1,57,4,57,415,8,57,11,57,12,57,416, - 1,57,3,57,420,8,57,1,57,4,57,423,8,57,11,57,12,57,424,1,57,1,57,1,57,1, - 57,4,57,431,8,57,11,57,12,57,432,1,57,3,57,436,8,57,3,57,438,8,57,1,58, - 4,58,441,8,58,11,58,12,58,442,1,58,1,58,1,58,1,58,4,58,449,8,58,11,58,12, - 58,450,3,58,453,8,58,1,59,4,59,456,8,59,11,59,12,59,457,1,59,1,59,1,59, - 1,59,1,59,1,59,4,59,466,8,59,11,59,12,59,467,1,59,1,59,3,59,472,8,59,1, - 60,1,60,1,60,5,60,477,8,60,10,60,12,60,480,9,60,1,60,1,60,1,60,1,60,5,60, - 486,8,60,10,60,12,60,489,9,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,5,60,498, - 8,60,10,60,12,60,501,9,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60, - 5,60,512,8,60,10,60,12,60,515,9,60,1,60,1,60,1,60,1,60,1,60,1,60,5,60,523, - 8,60,10,60,12,60,526,9,60,1,60,1,60,1,60,1,60,1,60,5,60,533,8,60,10,60, - 12,60,536,9,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,5,60,546,8,60,10, - 60,12,60,549,9,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,5,60, - 561,8,60,10,60,12,60,564,9,60,1,60,1,60,1,60,1,60,3,60,570,8,60,1,61,1, - 61,1,61,1,62,1,62,3,62,577,8,62,1,62,1,62,1,62,1,62,5,62,583,8,62,10,62, - 12,62,586,9,62,1,63,1,63,3,63,590,8,63,1,63,1,63,1,63,3,63,595,8,63,1,63, - 1,63,1,63,4,63,600,8,63,11,63,12,63,601,5,63,604,8,63,10,63,12,63,607,9, - 63,1,64,3,64,610,8,64,1,64,3,64,613,8,64,1,64,1,64,3,64,617,8,64,1,64,3, - 64,620,8,64,1,64,3,64,623,8,64,1,65,1,65,1,65,1,65,1,65,1,66,1,66,1,66, - 1,66,1,66,1,66,1,66,3,66,637,8,66,1,67,1,67,1,67,1,67,1,67,1,67,1,67,1, - 67,1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,67, - 1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,67,1, - 67,1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,67,3,67,688, - 8,67,1,68,1,68,1,68,1,68,1,69,1,69,1,69,1,69,1,70,1,70,1,70,1,70,1,71,1, - 71,1,71,1,71,1,72,1,72,1,72,1,72,1,73,1,73,1,73,1,73,1,74,1,74,1,74,1,74, - 4,499,513,547,562,0,75,2,11,4,1,6,2,8,12,10,13,12,14,14,15,16,16,18,17, - 20,18,22,19,24,20,26,21,28,22,30,23,32,24,34,25,36,26,38,27,40,28,42,29, - 44,3,46,30,48,31,50,4,52,32,54,33,56,5,58,34,60,35,62,36,64,7,66,8,68,37, - 70,38,72,39,74,40,76,41,78,42,80,43,82,44,84,45,86,46,88,47,90,0,92,0,94, - 0,96,0,98,0,100,0,102,0,104,0,106,0,108,0,110,0,112,9,114,48,116,49,118, - 50,120,51,122,52,124,53,126,10,128,54,130,55,132,0,134,56,136,57,138,0, - 140,0,142,0,144,0,146,0,148,0,150,0,2,0,1,16,2,0,65,90,97,122,2,0,69,69, - 101,101,2,0,43,43,45,45,3,0,48,57,65,70,97,102,2,0,82,82,114,114,10,0,34, - 34,39,39,63,63,92,92,96,98,102,102,110,110,114,114,116,116,118,118,2,0, - 88,88,120,120,3,0,9,9,12,12,32,32,1,0,10,10,2,0,85,85,117,117,4,0,10,10, - 13,13,34,34,92,92,4,0,10,10,13,13,39,39,92,92,1,0,92,92,3,0,10,10,13,13, - 34,34,3,0,10,10,13,13,39,39,2,0,66,66,98,98,773,0,2,1,0,0,0,0,4,1,0,0,0, - 0,6,1,0,0,0,0,8,1,0,0,0,0,10,1,0,0,0,0,12,1,0,0,0,0,14,1,0,0,0,0,16,1,0, - 0,0,0,18,1,0,0,0,0,20,1,0,0,0,0,22,1,0,0,0,0,24,1,0,0,0,0,26,1,0,0,0,0, - 28,1,0,0,0,0,30,1,0,0,0,0,32,1,0,0,0,0,34,1,0,0,0,0,36,1,0,0,0,0,38,1,0, - 0,0,0,40,1,0,0,0,0,42,1,0,0,0,0,44,1,0,0,0,0,46,1,0,0,0,0,48,1,0,0,0,0, - 50,1,0,0,0,0,52,1,0,0,0,0,54,1,0,0,0,0,56,1,0,0,0,0,58,1,0,0,0,0,60,1,0, - 0,0,0,62,1,0,0,0,0,64,1,0,0,0,0,66,1,0,0,0,0,68,1,0,0,0,0,70,1,0,0,0,0, - 72,1,0,0,0,0,74,1,0,0,0,0,76,1,0,0,0,0,78,1,0,0,0,0,80,1,0,0,0,0,82,1,0, - 0,0,0,84,1,0,0,0,0,86,1,0,0,0,0,88,1,0,0,0,0,112,1,0,0,0,0,114,1,0,0,0, - 0,116,1,0,0,0,0,118,1,0,0,0,0,120,1,0,0,0,0,122,1,0,0,0,0,124,1,0,0,0,0, - 126,1,0,0,0,0,128,1,0,0,0,0,130,1,0,0,0,1,132,1,0,0,0,1,134,1,0,0,0,1,136, - 1,0,0,0,1,138,1,0,0,0,1,140,1,0,0,0,1,142,1,0,0,0,1,144,1,0,0,0,1,146,1, - 0,0,0,1,148,1,0,0,0,1,150,1,0,0,0,2,152,1,0,0,0,4,154,1,0,0,0,6,156,1,0, - 0,0,8,158,1,0,0,0,10,162,1,0,0,0,12,165,1,0,0,0,14,173,1,0,0,0,16,178,1, - 0,0,0,18,185,1,0,0,0,20,191,1,0,0,0,22,199,1,0,0,0,24,209,1,0,0,0,26,216, - 1,0,0,0,28,221,1,0,0,0,30,233,1,0,0,0,32,243,1,0,0,0,34,252,1,0,0,0,36, - 259,1,0,0,0,38,264,1,0,0,0,40,267,1,0,0,0,42,270,1,0,0,0,44,273,1,0,0,0, - 46,275,1,0,0,0,48,278,1,0,0,0,50,281,1,0,0,0,52,283,1,0,0,0,54,286,1,0, - 0,0,56,289,1,0,0,0,58,291,1,0,0,0,60,293,1,0,0,0,62,295,1,0,0,0,64,297, - 1,0,0,0,66,299,1,0,0,0,68,301,1,0,0,0,70,303,1,0,0,0,72,305,1,0,0,0,74, - 307,1,0,0,0,76,309,1,0,0,0,78,311,1,0,0,0,80,313,1,0,0,0,82,315,1,0,0,0, - 84,317,1,0,0,0,86,322,1,0,0,0,88,328,1,0,0,0,90,333,1,0,0,0,92,335,1,0, - 0,0,94,337,1,0,0,0,96,339,1,0,0,0,98,348,1,0,0,0,100,350,1,0,0,0,102,356, - 1,0,0,0,104,358,1,0,0,0,106,361,1,0,0,0,108,366,1,0,0,0,110,389,1,0,0,0, - 112,392,1,0,0,0,114,396,1,0,0,0,116,437,1,0,0,0,118,452,1,0,0,0,120,471, - 1,0,0,0,122,569,1,0,0,0,124,571,1,0,0,0,126,576,1,0,0,0,128,589,1,0,0,0, - 130,609,1,0,0,0,132,624,1,0,0,0,134,636,1,0,0,0,136,687,1,0,0,0,138,689, - 1,0,0,0,140,693,1,0,0,0,142,697,1,0,0,0,144,701,1,0,0,0,146,705,1,0,0,0, - 148,709,1,0,0,0,150,713,1,0,0,0,152,153,5,35,0,0,153,3,1,0,0,0,154,155, - 5,58,0,0,155,5,1,0,0,0,156,157,5,44,0,0,157,7,1,0,0,0,158,159,5,97,0,0, - 159,160,5,110,0,0,160,161,5,100,0,0,161,9,1,0,0,0,162,163,5,111,0,0,163, - 164,5,114,0,0,164,11,1,0,0,0,165,166,5,98,0,0,166,167,5,117,0,0,167,168, - 5,116,0,0,168,169,5,32,0,0,169,170,5,110,0,0,170,171,5,111,0,0,171,172, - 5,116,0,0,172,13,1,0,0,0,173,174,5,102,0,0,174,175,5,114,0,0,175,176,5, - 111,0,0,176,177,5,109,0,0,177,15,1,0,0,0,178,179,5,109,0,0,179,180,5,111, - 0,0,180,181,5,100,0,0,181,182,5,117,0,0,182,183,5,108,0,0,183,184,5,101, - 0,0,184,17,1,0,0,0,185,186,5,109,0,0,186,187,5,111,0,0,187,188,5,100,0, - 0,188,189,5,101,0,0,189,190,5,108,0,0,190,19,1,0,0,0,191,192,5,115,0,0, - 192,193,5,99,0,0,193,194,5,104,0,0,194,195,5,101,0,0,195,196,5,109,0,0, - 196,197,5,97,0,0,197,21,1,0,0,0,198,200,3,94,46,0,199,198,1,0,0,0,200,201, - 1,0,0,0,201,199,1,0,0,0,201,202,1,0,0,0,202,203,1,0,0,0,203,205,5,46,0, - 0,204,206,3,94,46,0,205,204,1,0,0,0,206,207,1,0,0,0,207,205,1,0,0,0,207, - 208,1,0,0,0,208,23,1,0,0,0,209,210,5,101,0,0,210,211,5,120,0,0,211,212, - 5,116,0,0,212,213,5,101,0,0,213,214,5,110,0,0,214,215,5,100,0,0,215,25, - 1,0,0,0,216,217,5,116,0,0,217,218,5,121,0,0,218,219,5,112,0,0,219,220,5, - 101,0,0,220,27,1,0,0,0,221,222,5,99,0,0,222,223,5,111,0,0,223,224,5,110, - 0,0,224,225,5,100,0,0,225,226,5,105,0,0,226,227,5,116,0,0,227,228,5,105, - 0,0,228,229,5,111,0,0,229,230,5,110,0,0,230,231,1,0,0,0,231,232,6,13,0, - 0,232,29,1,0,0,0,233,234,5,114,0,0,234,235,5,101,0,0,235,236,5,108,0,0, - 236,237,5,97,0,0,237,238,5,116,0,0,238,239,5,105,0,0,239,240,5,111,0,0, - 240,241,5,110,0,0,241,242,5,115,0,0,242,31,1,0,0,0,243,244,5,114,0,0,244, - 245,5,101,0,0,245,246,5,108,0,0,246,247,5,97,0,0,247,248,5,116,0,0,248, - 249,5,105,0,0,249,250,5,111,0,0,250,251,5,110,0,0,251,33,1,0,0,0,252,253, - 5,100,0,0,253,254,5,101,0,0,254,255,5,102,0,0,255,256,5,105,0,0,256,257, - 5,110,0,0,257,258,5,101,0,0,258,35,1,0,0,0,259,260,5,119,0,0,260,261,5, - 105,0,0,261,262,5,116,0,0,262,263,5,104,0,0,263,37,1,0,0,0,264,265,5,61, - 0,0,265,266,5,61,0,0,266,39,1,0,0,0,267,268,5,33,0,0,268,269,5,61,0,0,269, - 41,1,0,0,0,270,271,5,105,0,0,271,272,5,110,0,0,272,43,1,0,0,0,273,274,5, - 60,0,0,274,45,1,0,0,0,275,276,5,60,0,0,276,277,5,61,0,0,277,47,1,0,0,0, - 278,279,5,62,0,0,279,280,5,61,0,0,280,49,1,0,0,0,281,282,5,62,0,0,282,51, - 1,0,0,0,283,284,5,38,0,0,284,285,5,38,0,0,285,53,1,0,0,0,286,287,5,124, - 0,0,287,288,5,124,0,0,288,55,1,0,0,0,289,290,5,91,0,0,290,57,1,0,0,0,291, - 292,5,93,0,0,292,59,1,0,0,0,293,294,5,123,0,0,294,61,1,0,0,0,295,296,5, - 125,0,0,296,63,1,0,0,0,297,298,5,40,0,0,298,65,1,0,0,0,299,300,5,41,0,0, - 300,67,1,0,0,0,301,302,5,46,0,0,302,69,1,0,0,0,303,304,5,45,0,0,304,71, - 1,0,0,0,305,306,5,33,0,0,306,73,1,0,0,0,307,308,5,63,0,0,308,75,1,0,0,0, - 309,310,5,43,0,0,310,77,1,0,0,0,311,312,5,42,0,0,312,79,1,0,0,0,313,314, - 5,47,0,0,314,81,1,0,0,0,315,316,5,37,0,0,316,83,1,0,0,0,317,318,5,116,0, - 0,318,319,5,114,0,0,319,320,5,117,0,0,320,321,5,101,0,0,321,85,1,0,0,0, - 322,323,5,102,0,0,323,324,5,97,0,0,324,325,5,108,0,0,325,326,5,115,0,0, - 326,327,5,101,0,0,327,87,1,0,0,0,328,329,5,110,0,0,329,330,5,117,0,0,330, - 331,5,108,0,0,331,332,5,108,0,0,332,89,1,0,0,0,333,334,5,92,0,0,334,91, - 1,0,0,0,335,336,7,0,0,0,336,93,1,0,0,0,337,338,2,48,57,0,338,95,1,0,0,0, - 339,341,7,1,0,0,340,342,7,2,0,0,341,340,1,0,0,0,341,342,1,0,0,0,342,344, - 1,0,0,0,343,345,3,94,46,0,344,343,1,0,0,0,345,346,1,0,0,0,346,344,1,0,0, - 0,346,347,1,0,0,0,347,97,1,0,0,0,348,349,7,3,0,0,349,99,1,0,0,0,350,351, - 7,4,0,0,351,101,1,0,0,0,352,357,3,104,51,0,353,357,3,108,53,0,354,357,3, - 110,54,0,355,357,3,106,52,0,356,352,1,0,0,0,356,353,1,0,0,0,356,354,1,0, - 0,0,356,355,1,0,0,0,357,103,1,0,0,0,358,359,3,90,44,0,359,360,7,5,0,0,360, - 105,1,0,0,0,361,362,3,90,44,0,362,363,2,48,51,0,363,364,2,48,55,0,364,365, - 2,48,55,0,365,107,1,0,0,0,366,367,3,90,44,0,367,368,7,6,0,0,368,369,3,98, - 48,0,369,370,3,98,48,0,370,109,1,0,0,0,371,372,3,90,44,0,372,373,5,117, - 0,0,373,374,3,98,48,0,374,375,3,98,48,0,375,376,3,98,48,0,376,377,3,98, - 48,0,377,390,1,0,0,0,378,379,3,90,44,0,379,380,5,85,0,0,380,381,3,98,48, - 0,381,382,3,98,48,0,382,383,3,98,48,0,383,384,3,98,48,0,384,385,3,98,48, - 0,385,386,3,98,48,0,386,387,3,98,48,0,387,388,3,98,48,0,388,390,1,0,0,0, - 389,371,1,0,0,0,389,378,1,0,0,0,390,111,1,0,0,0,391,393,7,7,0,0,392,391, - 1,0,0,0,393,394,1,0,0,0,394,392,1,0,0,0,394,395,1,0,0,0,395,113,1,0,0,0, - 396,397,5,47,0,0,397,398,5,47,0,0,398,402,1,0,0,0,399,401,8,8,0,0,400,399, - 1,0,0,0,401,404,1,0,0,0,402,400,1,0,0,0,402,403,1,0,0,0,403,405,1,0,0,0, - 404,402,1,0,0,0,405,406,6,56,1,0,406,115,1,0,0,0,407,409,3,94,46,0,408, - 407,1,0,0,0,409,410,1,0,0,0,410,408,1,0,0,0,410,411,1,0,0,0,411,412,1,0, - 0,0,412,414,5,46,0,0,413,415,3,94,46,0,414,413,1,0,0,0,415,416,1,0,0,0, - 416,414,1,0,0,0,416,417,1,0,0,0,417,419,1,0,0,0,418,420,3,96,47,0,419,418, - 1,0,0,0,419,420,1,0,0,0,420,438,1,0,0,0,421,423,3,94,46,0,422,421,1,0,0, - 0,423,424,1,0,0,0,424,422,1,0,0,0,424,425,1,0,0,0,425,426,1,0,0,0,426,427, - 3,96,47,0,427,438,1,0,0,0,428,430,5,46,0,0,429,431,3,94,46,0,430,429,1, - 0,0,0,431,432,1,0,0,0,432,430,1,0,0,0,432,433,1,0,0,0,433,435,1,0,0,0,434, - 436,3,96,47,0,435,434,1,0,0,0,435,436,1,0,0,0,436,438,1,0,0,0,437,408,1, - 0,0,0,437,422,1,0,0,0,437,428,1,0,0,0,438,117,1,0,0,0,439,441,3,94,46,0, - 440,439,1,0,0,0,441,442,1,0,0,0,442,440,1,0,0,0,442,443,1,0,0,0,443,453, - 1,0,0,0,444,445,5,48,0,0,445,446,5,120,0,0,446,448,1,0,0,0,447,449,3,98, - 48,0,448,447,1,0,0,0,449,450,1,0,0,0,450,448,1,0,0,0,450,451,1,0,0,0,451, - 453,1,0,0,0,452,440,1,0,0,0,452,444,1,0,0,0,453,119,1,0,0,0,454,456,3,94, - 46,0,455,454,1,0,0,0,456,457,1,0,0,0,457,455,1,0,0,0,457,458,1,0,0,0,458, - 459,1,0,0,0,459,460,7,9,0,0,460,472,1,0,0,0,461,462,5,48,0,0,462,463,5, - 120,0,0,463,465,1,0,0,0,464,466,3,98,48,0,465,464,1,0,0,0,466,467,1,0,0, - 0,467,465,1,0,0,0,467,468,1,0,0,0,468,469,1,0,0,0,469,470,7,9,0,0,470,472, - 1,0,0,0,471,455,1,0,0,0,471,461,1,0,0,0,472,121,1,0,0,0,473,478,5,34,0, - 0,474,477,3,102,50,0,475,477,8,10,0,0,476,474,1,0,0,0,476,475,1,0,0,0,477, - 480,1,0,0,0,478,476,1,0,0,0,478,479,1,0,0,0,479,481,1,0,0,0,480,478,1,0, - 0,0,481,570,5,34,0,0,482,487,5,39,0,0,483,486,3,102,50,0,484,486,8,11,0, - 0,485,483,1,0,0,0,485,484,1,0,0,0,486,489,1,0,0,0,487,485,1,0,0,0,487,488, - 1,0,0,0,488,490,1,0,0,0,489,487,1,0,0,0,490,570,5,39,0,0,491,492,5,34,0, - 0,492,493,5,34,0,0,493,494,5,34,0,0,494,499,1,0,0,0,495,498,3,102,50,0, - 496,498,8,12,0,0,497,495,1,0,0,0,497,496,1,0,0,0,498,501,1,0,0,0,499,500, - 1,0,0,0,499,497,1,0,0,0,500,502,1,0,0,0,501,499,1,0,0,0,502,503,5,34,0, - 0,503,504,5,34,0,0,504,570,5,34,0,0,505,506,5,39,0,0,506,507,5,39,0,0,507, - 508,5,39,0,0,508,513,1,0,0,0,509,512,3,102,50,0,510,512,8,12,0,0,511,509, - 1,0,0,0,511,510,1,0,0,0,512,515,1,0,0,0,513,514,1,0,0,0,513,511,1,0,0,0, - 514,516,1,0,0,0,515,513,1,0,0,0,516,517,5,39,0,0,517,518,5,39,0,0,518,570, - 5,39,0,0,519,520,3,100,49,0,520,524,5,34,0,0,521,523,8,13,0,0,522,521,1, - 0,0,0,523,526,1,0,0,0,524,522,1,0,0,0,524,525,1,0,0,0,525,527,1,0,0,0,526, - 524,1,0,0,0,527,528,5,34,0,0,528,570,1,0,0,0,529,530,3,100,49,0,530,534, - 5,39,0,0,531,533,8,14,0,0,532,531,1,0,0,0,533,536,1,0,0,0,534,532,1,0,0, - 0,534,535,1,0,0,0,535,537,1,0,0,0,536,534,1,0,0,0,537,538,5,39,0,0,538, - 570,1,0,0,0,539,540,3,100,49,0,540,541,5,34,0,0,541,542,5,34,0,0,542,543, - 5,34,0,0,543,547,1,0,0,0,544,546,9,0,0,0,545,544,1,0,0,0,546,549,1,0,0, - 0,547,548,1,0,0,0,547,545,1,0,0,0,548,550,1,0,0,0,549,547,1,0,0,0,550,551, - 5,34,0,0,551,552,5,34,0,0,552,553,5,34,0,0,553,570,1,0,0,0,554,555,3,100, - 49,0,555,556,5,39,0,0,556,557,5,39,0,0,557,558,5,39,0,0,558,562,1,0,0,0, - 559,561,9,0,0,0,560,559,1,0,0,0,561,564,1,0,0,0,562,563,1,0,0,0,562,560, - 1,0,0,0,563,565,1,0,0,0,564,562,1,0,0,0,565,566,5,39,0,0,566,567,5,39,0, - 0,567,568,5,39,0,0,568,570,1,0,0,0,569,473,1,0,0,0,569,482,1,0,0,0,569, - 491,1,0,0,0,569,505,1,0,0,0,569,519,1,0,0,0,569,529,1,0,0,0,569,539,1,0, - 0,0,569,554,1,0,0,0,570,123,1,0,0,0,571,572,7,15,0,0,572,573,3,122,60,0, - 573,125,1,0,0,0,574,577,3,92,45,0,575,577,5,95,0,0,576,574,1,0,0,0,576, - 575,1,0,0,0,577,584,1,0,0,0,578,583,3,92,45,0,579,583,3,94,46,0,580,583, - 5,95,0,0,581,583,3,70,34,0,582,578,1,0,0,0,582,579,1,0,0,0,582,580,1,0, - 0,0,582,581,1,0,0,0,583,586,1,0,0,0,584,582,1,0,0,0,584,585,1,0,0,0,585, - 127,1,0,0,0,586,584,1,0,0,0,587,590,3,92,45,0,588,590,5,95,0,0,589,587, - 1,0,0,0,589,588,1,0,0,0,590,605,1,0,0,0,591,595,3,80,39,0,592,595,3,68, - 33,0,593,595,3,70,34,0,594,591,1,0,0,0,594,592,1,0,0,0,594,593,1,0,0,0, - 594,595,1,0,0,0,595,599,1,0,0,0,596,600,3,92,45,0,597,600,3,94,46,0,598, - 600,5,95,0,0,599,596,1,0,0,0,599,597,1,0,0,0,599,598,1,0,0,0,600,601,1, - 0,0,0,601,599,1,0,0,0,601,602,1,0,0,0,602,604,1,0,0,0,603,594,1,0,0,0,604, - 607,1,0,0,0,605,603,1,0,0,0,605,606,1,0,0,0,606,129,1,0,0,0,607,605,1,0, - 0,0,608,610,3,112,55,0,609,608,1,0,0,0,609,610,1,0,0,0,610,616,1,0,0,0, - 611,613,5,13,0,0,612,611,1,0,0,0,612,613,1,0,0,0,613,614,1,0,0,0,614,617, - 5,10,0,0,615,617,2,12,13,0,616,612,1,0,0,0,616,615,1,0,0,0,617,619,1,0, - 0,0,618,620,3,112,55,0,619,618,1,0,0,0,619,620,1,0,0,0,620,622,1,0,0,0, - 621,623,3,130,64,0,622,621,1,0,0,0,622,623,1,0,0,0,623,131,1,0,0,0,624, - 625,3,66,32,0,625,626,1,0,0,0,626,627,6,65,2,0,627,628,6,65,3,0,628,133, - 1,0,0,0,629,630,5,109,0,0,630,631,5,97,0,0,631,637,5,112,0,0,632,633,5, - 108,0,0,633,634,5,105,0,0,634,635,5,115,0,0,635,637,5,116,0,0,636,629,1, - 0,0,0,636,632,1,0,0,0,637,135,1,0,0,0,638,639,5,98,0,0,639,640,5,111,0, - 0,640,641,5,111,0,0,641,688,5,108,0,0,642,643,5,115,0,0,643,644,5,116,0, - 0,644,645,5,114,0,0,645,646,5,105,0,0,646,647,5,110,0,0,647,688,5,103,0, - 0,648,649,5,105,0,0,649,650,5,110,0,0,650,688,5,116,0,0,651,652,5,117,0, - 0,652,653,5,105,0,0,653,654,5,110,0,0,654,688,5,116,0,0,655,656,5,100,0, - 0,656,657,5,111,0,0,657,658,5,117,0,0,658,659,5,98,0,0,659,660,5,108,0, - 0,660,688,5,101,0,0,661,662,5,100,0,0,662,663,5,117,0,0,663,664,5,114,0, - 0,664,665,5,97,0,0,665,666,5,116,0,0,666,667,5,105,0,0,667,668,5,111,0, - 0,668,688,5,110,0,0,669,670,5,116,0,0,670,671,5,105,0,0,671,672,5,109,0, - 0,672,673,5,101,0,0,673,674,5,115,0,0,674,675,5,116,0,0,675,676,5,97,0, - 0,676,677,5,109,0,0,677,688,5,112,0,0,678,679,5,105,0,0,679,680,5,112,0, - 0,680,681,5,97,0,0,681,682,5,100,0,0,682,683,5,100,0,0,683,684,5,114,0, - 0,684,685,5,101,0,0,685,686,5,115,0,0,686,688,5,115,0,0,687,638,1,0,0,0, - 687,642,1,0,0,0,687,648,1,0,0,0,687,651,1,0,0,0,687,655,1,0,0,0,687,661, - 1,0,0,0,687,669,1,0,0,0,687,678,1,0,0,0,688,137,1,0,0,0,689,690,3,44,21, - 0,690,691,1,0,0,0,691,692,6,68,4,0,692,139,1,0,0,0,693,694,3,50,24,0,694, - 695,1,0,0,0,695,696,6,69,5,0,696,141,1,0,0,0,697,698,3,64,31,0,698,699, - 1,0,0,0,699,700,6,70,6,0,700,143,1,0,0,0,701,702,3,4,1,0,702,703,1,0,0, - 0,703,704,6,71,7,0,704,145,1,0,0,0,705,706,3,6,2,0,706,707,1,0,0,0,707, - 708,6,72,8,0,708,147,1,0,0,0,709,710,3,112,55,0,710,711,1,0,0,0,711,712, - 6,73,9,0,712,149,1,0,0,0,713,714,3,126,62,0,714,715,1,0,0,0,715,716,6,74, - 10,0,716,151,1,0,0,0,51,0,1,201,207,341,346,356,389,394,402,410,416,419, - 424,432,435,437,442,450,452,457,467,471,476,478,485,487,497,499,511,513, - 524,534,547,562,569,576,582,584,589,594,599,601,605,609,612,616,619,622, - 636,687,11,5,1,0,0,1,0,7,8,0,4,0,0,7,3,0,7,4,0,7,7,0,7,1,0,7,2,0,7,9,0, - 7,10,0]; + 7,74,2,75,7,75,1,0,1,0,1,1,1,1,1,2,1,2,1,3,1,3,1,3,1,3,1,4,1,4,1,4,1,5, + 1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,6,1,6,1,6,1,6,1,6,1,7,1,7,1,7,1,7,1,7,1,7, + 1,7,1,8,1,8,1,8,1,8,1,8,1,8,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,10,4,10,202,8, + 10,11,10,12,10,203,1,10,1,10,4,10,208,8,10,11,10,12,10,209,1,11,1,11,1, + 11,1,11,1,11,1,11,1,11,1,12,1,12,1,12,1,12,1,12,1,13,1,13,1,13,1,13,1,13, + 1,13,1,13,1,13,1,13,1,13,1,13,1,13,1,14,1,14,1,14,1,14,1,14,1,14,1,14,1, + 14,1,14,1,14,1,15,1,15,1,15,1,15,1,15,1,15,1,15,1,15,1,15,1,16,1,16,1,16, + 1,16,1,16,1,16,1,16,1,17,1,17,1,17,1,17,1,17,1,18,1,18,1,18,1,19,1,19,1, + 19,1,20,1,20,1,20,1,21,1,21,1,22,1,22,1,22,1,23,1,23,1,23,1,24,1,24,1,25, + 1,25,1,25,1,26,1,26,1,26,1,27,1,27,1,28,1,28,1,29,1,29,1,30,1,30,1,31,1, + 31,1,32,1,32,1,33,1,33,1,34,1,34,1,35,1,35,1,36,1,36,1,37,1,37,1,38,1,38, + 1,39,1,39,1,40,1,40,1,41,1,41,1,41,1,41,1,41,1,42,1,42,1,42,1,42,1,42,1, + 42,1,43,1,43,1,43,1,43,1,43,1,44,1,44,1,45,1,45,1,46,1,46,1,47,1,47,3,47, + 344,8,47,1,47,4,47,347,8,47,11,47,12,47,348,1,48,1,48,1,49,1,49,1,50,1, + 50,1,50,1,50,3,50,359,8,50,1,51,1,51,1,51,1,52,1,52,1,52,1,52,1,52,1,53, + 1,53,1,53,1,53,1,53,1,54,1,54,1,54,1,54,1,54,1,54,1,54,1,54,1,54,1,54,1, + 54,1,54,1,54,1,54,1,54,1,54,1,54,1,54,3,54,392,8,54,1,55,4,55,395,8,55, + 11,55,12,55,396,1,56,1,56,1,56,1,56,5,56,403,8,56,10,56,12,56,406,9,56, + 1,56,1,56,1,57,4,57,411,8,57,11,57,12,57,412,1,57,1,57,4,57,417,8,57,11, + 57,12,57,418,1,57,3,57,422,8,57,1,57,4,57,425,8,57,11,57,12,57,426,1,57, + 1,57,1,57,1,57,4,57,433,8,57,11,57,12,57,434,1,57,3,57,438,8,57,3,57,440, + 8,57,1,58,4,58,443,8,58,11,58,12,58,444,1,58,1,58,1,58,1,58,4,58,451,8, + 58,11,58,12,58,452,3,58,455,8,58,1,59,4,59,458,8,59,11,59,12,59,459,1,59, + 1,59,1,59,1,59,1,59,1,59,4,59,468,8,59,11,59,12,59,469,1,59,1,59,3,59,474, + 8,59,1,60,1,60,1,60,5,60,479,8,60,10,60,12,60,482,9,60,1,60,1,60,1,60,1, + 60,5,60,488,8,60,10,60,12,60,491,9,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60, + 5,60,500,8,60,10,60,12,60,503,9,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1, + 60,1,60,5,60,514,8,60,10,60,12,60,517,9,60,1,60,1,60,1,60,1,60,1,60,1,60, + 5,60,525,8,60,10,60,12,60,528,9,60,1,60,1,60,1,60,1,60,1,60,5,60,535,8, + 60,10,60,12,60,538,9,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,5,60,548, + 8,60,10,60,12,60,551,9,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60, + 1,60,5,60,563,8,60,10,60,12,60,566,9,60,1,60,1,60,1,60,1,60,3,60,572,8, + 60,1,61,1,61,1,61,1,62,1,62,1,62,1,62,1,62,1,62,1,62,1,62,1,62,1,62,1,62, + 1,62,1,63,1,63,3,63,591,8,63,1,63,1,63,1,63,1,63,5,63,597,8,63,10,63,12, + 63,600,9,63,1,64,1,64,3,64,604,8,64,1,64,1,64,1,64,3,64,609,8,64,1,64,1, + 64,1,64,4,64,614,8,64,11,64,12,64,615,5,64,618,8,64,10,64,12,64,621,9,64, + 1,65,3,65,624,8,65,1,65,3,65,627,8,65,1,65,1,65,3,65,631,8,65,1,65,3,65, + 634,8,65,1,65,3,65,637,8,65,1,66,1,66,1,66,1,66,1,66,1,67,1,67,1,67,1,67, + 1,67,1,67,1,67,3,67,651,8,67,1,68,1,68,1,68,1,68,1,68,1,68,1,68,1,68,1, + 68,1,68,1,68,1,68,1,68,1,68,1,68,1,68,1,68,1,68,1,68,1,68,1,68,1,68,1,68, + 1,68,1,68,1,68,1,68,1,68,1,68,1,68,1,68,1,68,1,68,1,68,1,68,1,68,1,68,1, + 68,1,68,1,68,1,68,1,68,1,68,1,68,1,68,1,68,1,68,1,68,1,68,3,68,702,8,68, + 1,69,1,69,1,69,1,69,1,70,1,70,1,70,1,70,1,71,1,71,1,71,1,71,1,72,1,72,1, + 72,1,72,1,73,1,73,1,73,1,73,1,74,1,74,1,74,1,74,1,75,1,75,1,75,1,75,4,501, + 515,549,564,0,76,2,11,4,1,6,2,8,12,10,13,12,14,14,15,16,16,18,17,20,18, + 22,19,24,20,26,21,28,22,30,23,32,24,34,25,36,26,38,27,40,28,42,29,44,3, + 46,30,48,31,50,4,52,32,54,33,56,5,58,34,60,35,62,36,64,7,66,8,68,37,70, + 38,72,39,74,40,76,41,78,42,80,43,82,44,84,45,86,46,88,47,90,0,92,0,94,0, + 96,0,98,0,100,0,102,0,104,0,106,0,108,0,110,0,112,9,114,48,116,49,118,50, + 120,51,122,52,124,53,126,54,128,10,130,55,132,56,134,0,136,57,138,58,140, + 0,142,0,144,0,146,0,148,0,150,0,152,0,2,0,1,16,2,0,65,90,97,122,2,0,69, + 69,101,101,2,0,43,43,45,45,3,0,48,57,65,70,97,102,2,0,82,82,114,114,10, + 0,34,34,39,39,63,63,92,92,96,98,102,102,110,110,114,114,116,116,118,118, + 2,0,88,88,120,120,3,0,9,9,12,12,32,32,1,0,10,10,2,0,85,85,117,117,4,0,10, + 10,13,13,34,34,92,92,4,0,10,10,13,13,39,39,92,92,1,0,92,92,3,0,10,10,13, + 13,34,34,3,0,10,10,13,13,39,39,2,0,66,66,98,98,787,0,2,1,0,0,0,0,4,1,0, + 0,0,0,6,1,0,0,0,0,8,1,0,0,0,0,10,1,0,0,0,0,12,1,0,0,0,0,14,1,0,0,0,0,16, + 1,0,0,0,0,18,1,0,0,0,0,20,1,0,0,0,0,22,1,0,0,0,0,24,1,0,0,0,0,26,1,0,0, + 0,0,28,1,0,0,0,0,30,1,0,0,0,0,32,1,0,0,0,0,34,1,0,0,0,0,36,1,0,0,0,0,38, + 1,0,0,0,0,40,1,0,0,0,0,42,1,0,0,0,0,44,1,0,0,0,0,46,1,0,0,0,0,48,1,0,0, + 0,0,50,1,0,0,0,0,52,1,0,0,0,0,54,1,0,0,0,0,56,1,0,0,0,0,58,1,0,0,0,0,60, + 1,0,0,0,0,62,1,0,0,0,0,64,1,0,0,0,0,66,1,0,0,0,0,68,1,0,0,0,0,70,1,0,0, + 0,0,72,1,0,0,0,0,74,1,0,0,0,0,76,1,0,0,0,0,78,1,0,0,0,0,80,1,0,0,0,0,82, + 1,0,0,0,0,84,1,0,0,0,0,86,1,0,0,0,0,88,1,0,0,0,0,112,1,0,0,0,0,114,1,0, + 0,0,0,116,1,0,0,0,0,118,1,0,0,0,0,120,1,0,0,0,0,122,1,0,0,0,0,124,1,0,0, + 0,0,126,1,0,0,0,0,128,1,0,0,0,0,130,1,0,0,0,0,132,1,0,0,0,1,134,1,0,0,0, + 1,136,1,0,0,0,1,138,1,0,0,0,1,140,1,0,0,0,1,142,1,0,0,0,1,144,1,0,0,0,1, + 146,1,0,0,0,1,148,1,0,0,0,1,150,1,0,0,0,1,152,1,0,0,0,2,154,1,0,0,0,4,156, + 1,0,0,0,6,158,1,0,0,0,8,160,1,0,0,0,10,164,1,0,0,0,12,167,1,0,0,0,14,175, + 1,0,0,0,16,180,1,0,0,0,18,187,1,0,0,0,20,193,1,0,0,0,22,201,1,0,0,0,24, + 211,1,0,0,0,26,218,1,0,0,0,28,223,1,0,0,0,30,235,1,0,0,0,32,245,1,0,0,0, + 34,254,1,0,0,0,36,261,1,0,0,0,38,266,1,0,0,0,40,269,1,0,0,0,42,272,1,0, + 0,0,44,275,1,0,0,0,46,277,1,0,0,0,48,280,1,0,0,0,50,283,1,0,0,0,52,285, + 1,0,0,0,54,288,1,0,0,0,56,291,1,0,0,0,58,293,1,0,0,0,60,295,1,0,0,0,62, + 297,1,0,0,0,64,299,1,0,0,0,66,301,1,0,0,0,68,303,1,0,0,0,70,305,1,0,0,0, + 72,307,1,0,0,0,74,309,1,0,0,0,76,311,1,0,0,0,78,313,1,0,0,0,80,315,1,0, + 0,0,82,317,1,0,0,0,84,319,1,0,0,0,86,324,1,0,0,0,88,330,1,0,0,0,90,335, + 1,0,0,0,92,337,1,0,0,0,94,339,1,0,0,0,96,341,1,0,0,0,98,350,1,0,0,0,100, + 352,1,0,0,0,102,358,1,0,0,0,104,360,1,0,0,0,106,363,1,0,0,0,108,368,1,0, + 0,0,110,391,1,0,0,0,112,394,1,0,0,0,114,398,1,0,0,0,116,439,1,0,0,0,118, + 454,1,0,0,0,120,473,1,0,0,0,122,571,1,0,0,0,124,573,1,0,0,0,126,576,1,0, + 0,0,128,590,1,0,0,0,130,603,1,0,0,0,132,623,1,0,0,0,134,638,1,0,0,0,136, + 650,1,0,0,0,138,701,1,0,0,0,140,703,1,0,0,0,142,707,1,0,0,0,144,711,1,0, + 0,0,146,715,1,0,0,0,148,719,1,0,0,0,150,723,1,0,0,0,152,727,1,0,0,0,154, + 155,5,35,0,0,155,3,1,0,0,0,156,157,5,58,0,0,157,5,1,0,0,0,158,159,5,44, + 0,0,159,7,1,0,0,0,160,161,5,97,0,0,161,162,5,110,0,0,162,163,5,100,0,0, + 163,9,1,0,0,0,164,165,5,111,0,0,165,166,5,114,0,0,166,11,1,0,0,0,167,168, + 5,98,0,0,168,169,5,117,0,0,169,170,5,116,0,0,170,171,5,32,0,0,171,172,5, + 110,0,0,172,173,5,111,0,0,173,174,5,116,0,0,174,13,1,0,0,0,175,176,5,102, + 0,0,176,177,5,114,0,0,177,178,5,111,0,0,178,179,5,109,0,0,179,15,1,0,0, + 0,180,181,5,109,0,0,181,182,5,111,0,0,182,183,5,100,0,0,183,184,5,117,0, + 0,184,185,5,108,0,0,185,186,5,101,0,0,186,17,1,0,0,0,187,188,5,109,0,0, + 188,189,5,111,0,0,189,190,5,100,0,0,190,191,5,101,0,0,191,192,5,108,0,0, + 192,19,1,0,0,0,193,194,5,115,0,0,194,195,5,99,0,0,195,196,5,104,0,0,196, + 197,5,101,0,0,197,198,5,109,0,0,198,199,5,97,0,0,199,21,1,0,0,0,200,202, + 3,94,46,0,201,200,1,0,0,0,202,203,1,0,0,0,203,201,1,0,0,0,203,204,1,0,0, + 0,204,205,1,0,0,0,205,207,5,46,0,0,206,208,3,94,46,0,207,206,1,0,0,0,208, + 209,1,0,0,0,209,207,1,0,0,0,209,210,1,0,0,0,210,23,1,0,0,0,211,212,5,101, + 0,0,212,213,5,120,0,0,213,214,5,116,0,0,214,215,5,101,0,0,215,216,5,110, + 0,0,216,217,5,100,0,0,217,25,1,0,0,0,218,219,5,116,0,0,219,220,5,121,0, + 0,220,221,5,112,0,0,221,222,5,101,0,0,222,27,1,0,0,0,223,224,5,99,0,0,224, + 225,5,111,0,0,225,226,5,110,0,0,226,227,5,100,0,0,227,228,5,105,0,0,228, + 229,5,116,0,0,229,230,5,105,0,0,230,231,5,111,0,0,231,232,5,110,0,0,232, + 233,1,0,0,0,233,234,6,13,0,0,234,29,1,0,0,0,235,236,5,114,0,0,236,237,5, + 101,0,0,237,238,5,108,0,0,238,239,5,97,0,0,239,240,5,116,0,0,240,241,5, + 105,0,0,241,242,5,111,0,0,242,243,5,110,0,0,243,244,5,115,0,0,244,31,1, + 0,0,0,245,246,5,114,0,0,246,247,5,101,0,0,247,248,5,108,0,0,248,249,5,97, + 0,0,249,250,5,116,0,0,250,251,5,105,0,0,251,252,5,111,0,0,252,253,5,110, + 0,0,253,33,1,0,0,0,254,255,5,100,0,0,255,256,5,101,0,0,256,257,5,102,0, + 0,257,258,5,105,0,0,258,259,5,110,0,0,259,260,5,101,0,0,260,35,1,0,0,0, + 261,262,5,119,0,0,262,263,5,105,0,0,263,264,5,116,0,0,264,265,5,104,0,0, + 265,37,1,0,0,0,266,267,5,61,0,0,267,268,5,61,0,0,268,39,1,0,0,0,269,270, + 5,33,0,0,270,271,5,61,0,0,271,41,1,0,0,0,272,273,5,105,0,0,273,274,5,110, + 0,0,274,43,1,0,0,0,275,276,5,60,0,0,276,45,1,0,0,0,277,278,5,60,0,0,278, + 279,5,61,0,0,279,47,1,0,0,0,280,281,5,62,0,0,281,282,5,61,0,0,282,49,1, + 0,0,0,283,284,5,62,0,0,284,51,1,0,0,0,285,286,5,38,0,0,286,287,5,38,0,0, + 287,53,1,0,0,0,288,289,5,124,0,0,289,290,5,124,0,0,290,55,1,0,0,0,291,292, + 5,91,0,0,292,57,1,0,0,0,293,294,5,93,0,0,294,59,1,0,0,0,295,296,5,123,0, + 0,296,61,1,0,0,0,297,298,5,125,0,0,298,63,1,0,0,0,299,300,5,40,0,0,300, + 65,1,0,0,0,301,302,5,41,0,0,302,67,1,0,0,0,303,304,5,46,0,0,304,69,1,0, + 0,0,305,306,5,45,0,0,306,71,1,0,0,0,307,308,5,33,0,0,308,73,1,0,0,0,309, + 310,5,63,0,0,310,75,1,0,0,0,311,312,5,43,0,0,312,77,1,0,0,0,313,314,5,42, + 0,0,314,79,1,0,0,0,315,316,5,47,0,0,316,81,1,0,0,0,317,318,5,37,0,0,318, + 83,1,0,0,0,319,320,5,116,0,0,320,321,5,114,0,0,321,322,5,117,0,0,322,323, + 5,101,0,0,323,85,1,0,0,0,324,325,5,102,0,0,325,326,5,97,0,0,326,327,5,108, + 0,0,327,328,5,115,0,0,328,329,5,101,0,0,329,87,1,0,0,0,330,331,5,110,0, + 0,331,332,5,117,0,0,332,333,5,108,0,0,333,334,5,108,0,0,334,89,1,0,0,0, + 335,336,5,92,0,0,336,91,1,0,0,0,337,338,7,0,0,0,338,93,1,0,0,0,339,340, + 2,48,57,0,340,95,1,0,0,0,341,343,7,1,0,0,342,344,7,2,0,0,343,342,1,0,0, + 0,343,344,1,0,0,0,344,346,1,0,0,0,345,347,3,94,46,0,346,345,1,0,0,0,347, + 348,1,0,0,0,348,346,1,0,0,0,348,349,1,0,0,0,349,97,1,0,0,0,350,351,7,3, + 0,0,351,99,1,0,0,0,352,353,7,4,0,0,353,101,1,0,0,0,354,359,3,104,51,0,355, + 359,3,108,53,0,356,359,3,110,54,0,357,359,3,106,52,0,358,354,1,0,0,0,358, + 355,1,0,0,0,358,356,1,0,0,0,358,357,1,0,0,0,359,103,1,0,0,0,360,361,3,90, + 44,0,361,362,7,5,0,0,362,105,1,0,0,0,363,364,3,90,44,0,364,365,2,48,51, + 0,365,366,2,48,55,0,366,367,2,48,55,0,367,107,1,0,0,0,368,369,3,90,44,0, + 369,370,7,6,0,0,370,371,3,98,48,0,371,372,3,98,48,0,372,109,1,0,0,0,373, + 374,3,90,44,0,374,375,5,117,0,0,375,376,3,98,48,0,376,377,3,98,48,0,377, + 378,3,98,48,0,378,379,3,98,48,0,379,392,1,0,0,0,380,381,3,90,44,0,381,382, + 5,85,0,0,382,383,3,98,48,0,383,384,3,98,48,0,384,385,3,98,48,0,385,386, + 3,98,48,0,386,387,3,98,48,0,387,388,3,98,48,0,388,389,3,98,48,0,389,390, + 3,98,48,0,390,392,1,0,0,0,391,373,1,0,0,0,391,380,1,0,0,0,392,111,1,0,0, + 0,393,395,7,7,0,0,394,393,1,0,0,0,395,396,1,0,0,0,396,394,1,0,0,0,396,397, + 1,0,0,0,397,113,1,0,0,0,398,399,5,47,0,0,399,400,5,47,0,0,400,404,1,0,0, + 0,401,403,8,8,0,0,402,401,1,0,0,0,403,406,1,0,0,0,404,402,1,0,0,0,404,405, + 1,0,0,0,405,407,1,0,0,0,406,404,1,0,0,0,407,408,6,56,1,0,408,115,1,0,0, + 0,409,411,3,94,46,0,410,409,1,0,0,0,411,412,1,0,0,0,412,410,1,0,0,0,412, + 413,1,0,0,0,413,414,1,0,0,0,414,416,5,46,0,0,415,417,3,94,46,0,416,415, + 1,0,0,0,417,418,1,0,0,0,418,416,1,0,0,0,418,419,1,0,0,0,419,421,1,0,0,0, + 420,422,3,96,47,0,421,420,1,0,0,0,421,422,1,0,0,0,422,440,1,0,0,0,423,425, + 3,94,46,0,424,423,1,0,0,0,425,426,1,0,0,0,426,424,1,0,0,0,426,427,1,0,0, + 0,427,428,1,0,0,0,428,429,3,96,47,0,429,440,1,0,0,0,430,432,5,46,0,0,431, + 433,3,94,46,0,432,431,1,0,0,0,433,434,1,0,0,0,434,432,1,0,0,0,434,435,1, + 0,0,0,435,437,1,0,0,0,436,438,3,96,47,0,437,436,1,0,0,0,437,438,1,0,0,0, + 438,440,1,0,0,0,439,410,1,0,0,0,439,424,1,0,0,0,439,430,1,0,0,0,440,117, + 1,0,0,0,441,443,3,94,46,0,442,441,1,0,0,0,443,444,1,0,0,0,444,442,1,0,0, + 0,444,445,1,0,0,0,445,455,1,0,0,0,446,447,5,48,0,0,447,448,5,120,0,0,448, + 450,1,0,0,0,449,451,3,98,48,0,450,449,1,0,0,0,451,452,1,0,0,0,452,450,1, + 0,0,0,452,453,1,0,0,0,453,455,1,0,0,0,454,442,1,0,0,0,454,446,1,0,0,0,455, + 119,1,0,0,0,456,458,3,94,46,0,457,456,1,0,0,0,458,459,1,0,0,0,459,457,1, + 0,0,0,459,460,1,0,0,0,460,461,1,0,0,0,461,462,7,9,0,0,462,474,1,0,0,0,463, + 464,5,48,0,0,464,465,5,120,0,0,465,467,1,0,0,0,466,468,3,98,48,0,467,466, + 1,0,0,0,468,469,1,0,0,0,469,467,1,0,0,0,469,470,1,0,0,0,470,471,1,0,0,0, + 471,472,7,9,0,0,472,474,1,0,0,0,473,457,1,0,0,0,473,463,1,0,0,0,474,121, + 1,0,0,0,475,480,5,34,0,0,476,479,3,102,50,0,477,479,8,10,0,0,478,476,1, + 0,0,0,478,477,1,0,0,0,479,482,1,0,0,0,480,478,1,0,0,0,480,481,1,0,0,0,481, + 483,1,0,0,0,482,480,1,0,0,0,483,572,5,34,0,0,484,489,5,39,0,0,485,488,3, + 102,50,0,486,488,8,11,0,0,487,485,1,0,0,0,487,486,1,0,0,0,488,491,1,0,0, + 0,489,487,1,0,0,0,489,490,1,0,0,0,490,492,1,0,0,0,491,489,1,0,0,0,492,572, + 5,39,0,0,493,494,5,34,0,0,494,495,5,34,0,0,495,496,5,34,0,0,496,501,1,0, + 0,0,497,500,3,102,50,0,498,500,8,12,0,0,499,497,1,0,0,0,499,498,1,0,0,0, + 500,503,1,0,0,0,501,502,1,0,0,0,501,499,1,0,0,0,502,504,1,0,0,0,503,501, + 1,0,0,0,504,505,5,34,0,0,505,506,5,34,0,0,506,572,5,34,0,0,507,508,5,39, + 0,0,508,509,5,39,0,0,509,510,5,39,0,0,510,515,1,0,0,0,511,514,3,102,50, + 0,512,514,8,12,0,0,513,511,1,0,0,0,513,512,1,0,0,0,514,517,1,0,0,0,515, + 516,1,0,0,0,515,513,1,0,0,0,516,518,1,0,0,0,517,515,1,0,0,0,518,519,5,39, + 0,0,519,520,5,39,0,0,520,572,5,39,0,0,521,522,3,100,49,0,522,526,5,34,0, + 0,523,525,8,13,0,0,524,523,1,0,0,0,525,528,1,0,0,0,526,524,1,0,0,0,526, + 527,1,0,0,0,527,529,1,0,0,0,528,526,1,0,0,0,529,530,5,34,0,0,530,572,1, + 0,0,0,531,532,3,100,49,0,532,536,5,39,0,0,533,535,8,14,0,0,534,533,1,0, + 0,0,535,538,1,0,0,0,536,534,1,0,0,0,536,537,1,0,0,0,537,539,1,0,0,0,538, + 536,1,0,0,0,539,540,5,39,0,0,540,572,1,0,0,0,541,542,3,100,49,0,542,543, + 5,34,0,0,543,544,5,34,0,0,544,545,5,34,0,0,545,549,1,0,0,0,546,548,9,0, + 0,0,547,546,1,0,0,0,548,551,1,0,0,0,549,550,1,0,0,0,549,547,1,0,0,0,550, + 552,1,0,0,0,551,549,1,0,0,0,552,553,5,34,0,0,553,554,5,34,0,0,554,555,5, + 34,0,0,555,572,1,0,0,0,556,557,3,100,49,0,557,558,5,39,0,0,558,559,5,39, + 0,0,559,560,5,39,0,0,560,564,1,0,0,0,561,563,9,0,0,0,562,561,1,0,0,0,563, + 566,1,0,0,0,564,565,1,0,0,0,564,562,1,0,0,0,565,567,1,0,0,0,566,564,1,0, + 0,0,567,568,5,39,0,0,568,569,5,39,0,0,569,570,5,39,0,0,570,572,1,0,0,0, + 571,475,1,0,0,0,571,484,1,0,0,0,571,493,1,0,0,0,571,507,1,0,0,0,571,521, + 1,0,0,0,571,531,1,0,0,0,571,541,1,0,0,0,571,556,1,0,0,0,572,123,1,0,0,0, + 573,574,7,15,0,0,574,575,3,122,60,0,575,125,1,0,0,0,576,577,5,36,0,0,577, + 578,5,101,0,0,578,579,5,120,0,0,579,580,5,112,0,0,580,581,5,114,0,0,581, + 582,5,101,0,0,582,583,5,115,0,0,583,584,5,115,0,0,584,585,5,105,0,0,585, + 586,5,111,0,0,586,587,5,110,0,0,587,127,1,0,0,0,588,591,3,92,45,0,589,591, + 5,95,0,0,590,588,1,0,0,0,590,589,1,0,0,0,591,598,1,0,0,0,592,597,3,92,45, + 0,593,597,3,94,46,0,594,597,5,95,0,0,595,597,3,70,34,0,596,592,1,0,0,0, + 596,593,1,0,0,0,596,594,1,0,0,0,596,595,1,0,0,0,597,600,1,0,0,0,598,596, + 1,0,0,0,598,599,1,0,0,0,599,129,1,0,0,0,600,598,1,0,0,0,601,604,3,92,45, + 0,602,604,5,95,0,0,603,601,1,0,0,0,603,602,1,0,0,0,604,619,1,0,0,0,605, + 609,3,80,39,0,606,609,3,68,33,0,607,609,3,70,34,0,608,605,1,0,0,0,608,606, + 1,0,0,0,608,607,1,0,0,0,608,609,1,0,0,0,609,613,1,0,0,0,610,614,3,92,45, + 0,611,614,3,94,46,0,612,614,5,95,0,0,613,610,1,0,0,0,613,611,1,0,0,0,613, + 612,1,0,0,0,614,615,1,0,0,0,615,613,1,0,0,0,615,616,1,0,0,0,616,618,1,0, + 0,0,617,608,1,0,0,0,618,621,1,0,0,0,619,617,1,0,0,0,619,620,1,0,0,0,620, + 131,1,0,0,0,621,619,1,0,0,0,622,624,3,112,55,0,623,622,1,0,0,0,623,624, + 1,0,0,0,624,630,1,0,0,0,625,627,5,13,0,0,626,625,1,0,0,0,626,627,1,0,0, + 0,627,628,1,0,0,0,628,631,5,10,0,0,629,631,2,12,13,0,630,626,1,0,0,0,630, + 629,1,0,0,0,631,633,1,0,0,0,632,634,3,112,55,0,633,632,1,0,0,0,633,634, + 1,0,0,0,634,636,1,0,0,0,635,637,3,132,65,0,636,635,1,0,0,0,636,637,1,0, + 0,0,637,133,1,0,0,0,638,639,3,66,32,0,639,640,1,0,0,0,640,641,6,66,2,0, + 641,642,6,66,3,0,642,135,1,0,0,0,643,644,5,109,0,0,644,645,5,97,0,0,645, + 651,5,112,0,0,646,647,5,108,0,0,647,648,5,105,0,0,648,649,5,115,0,0,649, + 651,5,116,0,0,650,643,1,0,0,0,650,646,1,0,0,0,651,137,1,0,0,0,652,653,5, + 98,0,0,653,654,5,111,0,0,654,655,5,111,0,0,655,702,5,108,0,0,656,657,5, + 115,0,0,657,658,5,116,0,0,658,659,5,114,0,0,659,660,5,105,0,0,660,661,5, + 110,0,0,661,702,5,103,0,0,662,663,5,105,0,0,663,664,5,110,0,0,664,702,5, + 116,0,0,665,666,5,117,0,0,666,667,5,105,0,0,667,668,5,110,0,0,668,702,5, + 116,0,0,669,670,5,100,0,0,670,671,5,111,0,0,671,672,5,117,0,0,672,673,5, + 98,0,0,673,674,5,108,0,0,674,702,5,101,0,0,675,676,5,100,0,0,676,677,5, + 117,0,0,677,678,5,114,0,0,678,679,5,97,0,0,679,680,5,116,0,0,680,681,5, + 105,0,0,681,682,5,111,0,0,682,702,5,110,0,0,683,684,5,116,0,0,684,685,5, + 105,0,0,685,686,5,109,0,0,686,687,5,101,0,0,687,688,5,115,0,0,688,689,5, + 116,0,0,689,690,5,97,0,0,690,691,5,109,0,0,691,702,5,112,0,0,692,693,5, + 105,0,0,693,694,5,112,0,0,694,695,5,97,0,0,695,696,5,100,0,0,696,697,5, + 100,0,0,697,698,5,114,0,0,698,699,5,101,0,0,699,700,5,115,0,0,700,702,5, + 115,0,0,701,652,1,0,0,0,701,656,1,0,0,0,701,662,1,0,0,0,701,665,1,0,0,0, + 701,669,1,0,0,0,701,675,1,0,0,0,701,683,1,0,0,0,701,692,1,0,0,0,702,139, + 1,0,0,0,703,704,3,44,21,0,704,705,1,0,0,0,705,706,6,69,4,0,706,141,1,0, + 0,0,707,708,3,50,24,0,708,709,1,0,0,0,709,710,6,70,5,0,710,143,1,0,0,0, + 711,712,3,64,31,0,712,713,1,0,0,0,713,714,6,71,6,0,714,145,1,0,0,0,715, + 716,3,4,1,0,716,717,1,0,0,0,717,718,6,72,7,0,718,147,1,0,0,0,719,720,3, + 6,2,0,720,721,1,0,0,0,721,722,6,73,8,0,722,149,1,0,0,0,723,724,3,112,55, + 0,724,725,1,0,0,0,725,726,6,74,9,0,726,151,1,0,0,0,727,728,3,128,63,0,728, + 729,1,0,0,0,729,730,6,75,10,0,730,153,1,0,0,0,51,0,1,203,209,343,348,358, + 391,396,404,412,418,421,426,434,437,439,444,452,454,459,469,473,478,480, + 487,489,499,501,513,515,526,536,549,564,571,590,596,598,603,608,613,615, + 619,623,626,630,633,636,650,701,11,5,1,0,0,1,0,7,8,0,4,0,0,7,3,0,7,4,0, + 7,7,0,7,1,0,7,2,0,7,9,0,7,10,0]; private static __ATN: ATN; public static get _ATN(): ATN { diff --git a/pkg/js/gen/OpenFGAParser.interp b/pkg/js/gen/OpenFGAParser.interp index 56431d97..fffd3847 100644 --- a/pkg/js/gen/OpenFGAParser.interp +++ b/pkg/js/gen/OpenFGAParser.interp @@ -53,6 +53,7 @@ null null null null +'$expression' null null null @@ -113,6 +114,7 @@ NUM_INT NUM_UINT STRING BYTES +DOLLAR_EXPRESSION EXTENDED_IDENTIFIER NEWLINE CONDITION_PARAM_CONTAINER @@ -149,4 +151,4 @@ conditionExpression atn: -[4, 1, 57, 392, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 1, 0, 3, 0, 56, 8, 0, 1, 0, 3, 0, 59, 8, 0, 1, 0, 1, 0, 3, 0, 63, 8, 0, 1, 0, 3, 0, 66, 8, 0, 1, 0, 1, 0, 3, 0, 70, 8, 0, 1, 0, 1, 0, 3, 0, 74, 8, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 3, 1, 81, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 89, 8, 1, 1, 2, 1, 2, 1, 2, 3, 2, 94, 8, 2, 1, 2, 1, 2, 1, 2, 1, 2, 3, 2, 100, 8, 2, 1, 3, 5, 3, 103, 8, 3, 10, 3, 12, 3, 106, 9, 3, 1, 4, 1, 4, 3, 4, 110, 8, 4, 1, 4, 1, 4, 1, 4, 3, 4, 115, 8, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 4, 4, 123, 8, 4, 11, 4, 12, 4, 124, 3, 4, 127, 8, 4, 1, 5, 1, 5, 3, 5, 131, 8, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 3, 5, 138, 8, 5, 1, 5, 1, 5, 3, 5, 142, 8, 5, 1, 5, 1, 5, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 3, 7, 151, 8, 7, 1, 7, 3, 7, 154, 8, 7, 1, 8, 1, 8, 3, 8, 158, 8, 8, 1, 8, 3, 8, 161, 8, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 3, 9, 168, 8, 9, 4, 9, 170, 8, 9, 11, 9, 12, 9, 171, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 3, 9, 179, 8, 9, 4, 9, 181, 8, 9, 11, 9, 12, 9, 182, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 3, 9, 190, 8, 9, 3, 9, 192, 8, 9, 1, 10, 1, 10, 1, 11, 1, 11, 5, 11, 198, 8, 11, 10, 11, 12, 11, 201, 9, 11, 1, 11, 1, 11, 3, 11, 205, 8, 11, 1, 11, 5, 11, 208, 8, 11, 10, 11, 12, 11, 211, 9, 11, 1, 11, 1, 11, 1, 12, 1, 12, 5, 12, 217, 8, 12, 10, 12, 12, 12, 220, 9, 12, 1, 12, 1, 12, 3, 12, 224, 8, 12, 1, 12, 5, 12, 227, 8, 12, 10, 12, 12, 12, 230, 9, 12, 1, 12, 1, 12, 1, 13, 1, 13, 3, 13, 236, 8, 13, 1, 13, 1, 13, 3, 13, 240, 8, 13, 1, 13, 1, 13, 3, 13, 244, 8, 13, 1, 13, 1, 13, 3, 13, 248, 8, 13, 5, 13, 250, 8, 13, 10, 13, 12, 13, 253, 9, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 3, 14, 262, 8, 14, 1, 15, 3, 15, 265, 8, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 3, 15, 274, 8, 15, 1, 15, 3, 15, 277, 8, 15, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 3, 16, 284, 8, 16, 1, 17, 5, 17, 287, 8, 17, 10, 17, 12, 17, 290, 9, 17, 1, 18, 1, 18, 3, 18, 294, 8, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 3, 18, 301, 8, 18, 1, 18, 1, 18, 3, 18, 305, 8, 18, 1, 18, 1, 18, 3, 18, 309, 8, 18, 1, 18, 1, 18, 3, 18, 313, 8, 18, 1, 18, 1, 18, 3, 18, 317, 8, 18, 5, 18, 319, 8, 18, 10, 18, 12, 18, 322, 9, 18, 1, 18, 3, 18, 325, 8, 18, 1, 18, 1, 18, 3, 18, 329, 8, 18, 1, 18, 1, 18, 3, 18, 333, 8, 18, 1, 18, 3, 18, 336, 8, 18, 1, 18, 1, 18, 3, 18, 340, 8, 18, 1, 18, 1, 18, 1, 19, 1, 19, 1, 20, 3, 20, 347, 8, 20, 1, 20, 1, 20, 3, 20, 351, 8, 20, 1, 20, 1, 20, 3, 20, 355, 8, 20, 1, 20, 1, 20, 1, 21, 1, 21, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 3, 22, 366, 8, 22, 1, 23, 1, 23, 5, 23, 370, 8, 23, 10, 23, 12, 23, 373, 9, 23, 1, 23, 1, 23, 3, 23, 377, 8, 23, 1, 24, 1, 24, 1, 25, 1, 25, 3, 25, 383, 8, 25, 1, 26, 1, 26, 5, 26, 387, 8, 26, 10, 26, 12, 26, 390, 9, 26, 1, 26, 0, 0, 27, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 0, 4, 1, 0, 55, 55, 4, 0, 10, 10, 16, 18, 20, 21, 24, 24, 5, 0, 3, 5, 7, 10, 27, 35, 37, 53, 55, 55, 1, 0, 36, 36, 433, 0, 55, 1, 0, 0, 0, 2, 80, 1, 0, 0, 0, 4, 93, 1, 0, 0, 0, 6, 104, 1, 0, 0, 0, 8, 109, 1, 0, 0, 0, 10, 130, 1, 0, 0, 0, 12, 145, 1, 0, 0, 0, 14, 150, 1, 0, 0, 0, 16, 157, 1, 0, 0, 0, 18, 191, 1, 0, 0, 0, 20, 193, 1, 0, 0, 0, 22, 195, 1, 0, 0, 0, 24, 214, 1, 0, 0, 0, 26, 233, 1, 0, 0, 0, 28, 256, 1, 0, 0, 0, 30, 264, 1, 0, 0, 0, 32, 278, 1, 0, 0, 0, 34, 288, 1, 0, 0, 0, 36, 293, 1, 0, 0, 0, 38, 343, 1, 0, 0, 0, 40, 346, 1, 0, 0, 0, 42, 358, 1, 0, 0, 0, 44, 365, 1, 0, 0, 0, 46, 367, 1, 0, 0, 0, 48, 378, 1, 0, 0, 0, 50, 382, 1, 0, 0, 0, 52, 388, 1, 0, 0, 0, 54, 56, 5, 9, 0, 0, 55, 54, 1, 0, 0, 0, 55, 56, 1, 0, 0, 0, 56, 58, 1, 0, 0, 0, 57, 59, 5, 55, 0, 0, 58, 57, 1, 0, 0, 0, 58, 59, 1, 0, 0, 0, 59, 62, 1, 0, 0, 0, 60, 63, 3, 2, 1, 0, 61, 63, 3, 4, 2, 0, 62, 60, 1, 0, 0, 0, 62, 61, 1, 0, 0, 0, 63, 65, 1, 0, 0, 0, 64, 66, 5, 55, 0, 0, 65, 64, 1, 0, 0, 0, 65, 66, 1, 0, 0, 0, 66, 67, 1, 0, 0, 0, 67, 69, 3, 6, 3, 0, 68, 70, 5, 55, 0, 0, 69, 68, 1, 0, 0, 0, 69, 70, 1, 0, 0, 0, 70, 71, 1, 0, 0, 0, 71, 73, 3, 34, 17, 0, 72, 74, 5, 55, 0, 0, 73, 72, 1, 0, 0, 0, 73, 74, 1, 0, 0, 0, 74, 75, 1, 0, 0, 0, 75, 76, 5, 0, 0, 1, 76, 1, 1, 0, 0, 0, 77, 78, 3, 46, 23, 0, 78, 79, 5, 55, 0, 0, 79, 81, 1, 0, 0, 0, 80, 77, 1, 0, 0, 0, 80, 81, 1, 0, 0, 0, 81, 82, 1, 0, 0, 0, 82, 83, 5, 17, 0, 0, 83, 84, 5, 55, 0, 0, 84, 85, 5, 18, 0, 0, 85, 86, 5, 9, 0, 0, 86, 88, 5, 19, 0, 0, 87, 89, 5, 9, 0, 0, 88, 87, 1, 0, 0, 0, 88, 89, 1, 0, 0, 0, 89, 3, 1, 0, 0, 0, 90, 91, 3, 46, 23, 0, 91, 92, 5, 55, 0, 0, 92, 94, 1, 0, 0, 0, 93, 90, 1, 0, 0, 0, 93, 94, 1, 0, 0, 0, 94, 95, 1, 0, 0, 0, 95, 96, 5, 16, 0, 0, 96, 97, 5, 9, 0, 0, 97, 99, 3, 48, 24, 0, 98, 100, 5, 9, 0, 0, 99, 98, 1, 0, 0, 0, 99, 100, 1, 0, 0, 0, 100, 5, 1, 0, 0, 0, 101, 103, 3, 8, 4, 0, 102, 101, 1, 0, 0, 0, 103, 106, 1, 0, 0, 0, 104, 102, 1, 0, 0, 0, 104, 105, 1, 0, 0, 0, 105, 7, 1, 0, 0, 0, 106, 104, 1, 0, 0, 0, 107, 108, 5, 55, 0, 0, 108, 110, 3, 46, 23, 0, 109, 107, 1, 0, 0, 0, 109, 110, 1, 0, 0, 0, 110, 111, 1, 0, 0, 0, 111, 114, 5, 55, 0, 0, 112, 113, 5, 20, 0, 0, 113, 115, 5, 9, 0, 0, 114, 112, 1, 0, 0, 0, 114, 115, 1, 0, 0, 0, 115, 116, 1, 0, 0, 0, 116, 117, 5, 21, 0, 0, 117, 118, 5, 9, 0, 0, 118, 126, 3, 50, 25, 0, 119, 120, 5, 55, 0, 0, 120, 122, 5, 23, 0, 0, 121, 123, 3, 10, 5, 0, 122, 121, 1, 0, 0, 0, 123, 124, 1, 0, 0, 0, 124, 122, 1, 0, 0, 0, 124, 125, 1, 0, 0, 0, 125, 127, 1, 0, 0, 0, 126, 119, 1, 0, 0, 0, 126, 127, 1, 0, 0, 0, 127, 9, 1, 0, 0, 0, 128, 129, 5, 55, 0, 0, 129, 131, 3, 46, 23, 0, 130, 128, 1, 0, 0, 0, 130, 131, 1, 0, 0, 0, 131, 132, 1, 0, 0, 0, 132, 133, 5, 55, 0, 0, 133, 134, 5, 25, 0, 0, 134, 135, 5, 9, 0, 0, 135, 137, 3, 12, 6, 0, 136, 138, 5, 9, 0, 0, 137, 136, 1, 0, 0, 0, 137, 138, 1, 0, 0, 0, 138, 139, 1, 0, 0, 0, 139, 141, 5, 1, 0, 0, 140, 142, 5, 9, 0, 0, 141, 140, 1, 0, 0, 0, 141, 142, 1, 0, 0, 0, 142, 143, 1, 0, 0, 0, 143, 144, 3, 14, 7, 0, 144, 11, 1, 0, 0, 0, 145, 146, 3, 50, 25, 0, 146, 13, 1, 0, 0, 0, 147, 151, 3, 26, 13, 0, 148, 151, 3, 20, 10, 0, 149, 151, 3, 22, 11, 0, 150, 147, 1, 0, 0, 0, 150, 148, 1, 0, 0, 0, 150, 149, 1, 0, 0, 0, 151, 153, 1, 0, 0, 0, 152, 154, 3, 18, 9, 0, 153, 152, 1, 0, 0, 0, 153, 154, 1, 0, 0, 0, 154, 15, 1, 0, 0, 0, 155, 158, 3, 20, 10, 0, 156, 158, 3, 24, 12, 0, 157, 155, 1, 0, 0, 0, 157, 156, 1, 0, 0, 0, 158, 160, 1, 0, 0, 0, 159, 161, 3, 18, 9, 0, 160, 159, 1, 0, 0, 0, 160, 161, 1, 0, 0, 0, 161, 17, 1, 0, 0, 0, 162, 163, 5, 9, 0, 0, 163, 164, 5, 13, 0, 0, 164, 167, 5, 9, 0, 0, 165, 168, 3, 20, 10, 0, 166, 168, 3, 24, 12, 0, 167, 165, 1, 0, 0, 0, 167, 166, 1, 0, 0, 0, 168, 170, 1, 0, 0, 0, 169, 162, 1, 0, 0, 0, 170, 171, 1, 0, 0, 0, 171, 169, 1, 0, 0, 0, 171, 172, 1, 0, 0, 0, 172, 192, 1, 0, 0, 0, 173, 174, 5, 9, 0, 0, 174, 175, 5, 12, 0, 0, 175, 178, 5, 9, 0, 0, 176, 179, 3, 20, 10, 0, 177, 179, 3, 24, 12, 0, 178, 176, 1, 0, 0, 0, 178, 177, 1, 0, 0, 0, 179, 181, 1, 0, 0, 0, 180, 173, 1, 0, 0, 0, 181, 182, 1, 0, 0, 0, 182, 180, 1, 0, 0, 0, 182, 183, 1, 0, 0, 0, 183, 192, 1, 0, 0, 0, 184, 185, 5, 9, 0, 0, 185, 186, 5, 14, 0, 0, 186, 189, 5, 9, 0, 0, 187, 190, 3, 20, 10, 0, 188, 190, 3, 24, 12, 0, 189, 187, 1, 0, 0, 0, 189, 188, 1, 0, 0, 0, 190, 192, 1, 0, 0, 0, 191, 169, 1, 0, 0, 0, 191, 180, 1, 0, 0, 0, 191, 184, 1, 0, 0, 0, 192, 19, 1, 0, 0, 0, 193, 194, 3, 28, 14, 0, 194, 21, 1, 0, 0, 0, 195, 199, 5, 7, 0, 0, 196, 198, 5, 9, 0, 0, 197, 196, 1, 0, 0, 0, 198, 201, 1, 0, 0, 0, 199, 197, 1, 0, 0, 0, 199, 200, 1, 0, 0, 0, 200, 204, 1, 0, 0, 0, 201, 199, 1, 0, 0, 0, 202, 205, 3, 14, 7, 0, 203, 205, 3, 24, 12, 0, 204, 202, 1, 0, 0, 0, 204, 203, 1, 0, 0, 0, 205, 209, 1, 0, 0, 0, 206, 208, 5, 9, 0, 0, 207, 206, 1, 0, 0, 0, 208, 211, 1, 0, 0, 0, 209, 207, 1, 0, 0, 0, 209, 210, 1, 0, 0, 0, 210, 212, 1, 0, 0, 0, 211, 209, 1, 0, 0, 0, 212, 213, 5, 8, 0, 0, 213, 23, 1, 0, 0, 0, 214, 218, 5, 7, 0, 0, 215, 217, 5, 9, 0, 0, 216, 215, 1, 0, 0, 0, 217, 220, 1, 0, 0, 0, 218, 216, 1, 0, 0, 0, 218, 219, 1, 0, 0, 0, 219, 223, 1, 0, 0, 0, 220, 218, 1, 0, 0, 0, 221, 224, 3, 16, 8, 0, 222, 224, 3, 24, 12, 0, 223, 221, 1, 0, 0, 0, 223, 222, 1, 0, 0, 0, 224, 228, 1, 0, 0, 0, 225, 227, 5, 9, 0, 0, 226, 225, 1, 0, 0, 0, 227, 230, 1, 0, 0, 0, 228, 226, 1, 0, 0, 0, 228, 229, 1, 0, 0, 0, 229, 231, 1, 0, 0, 0, 230, 228, 1, 0, 0, 0, 231, 232, 5, 8, 0, 0, 232, 25, 1, 0, 0, 0, 233, 235, 5, 5, 0, 0, 234, 236, 5, 9, 0, 0, 235, 234, 1, 0, 0, 0, 235, 236, 1, 0, 0, 0, 236, 237, 1, 0, 0, 0, 237, 239, 3, 30, 15, 0, 238, 240, 5, 9, 0, 0, 239, 238, 1, 0, 0, 0, 239, 240, 1, 0, 0, 0, 240, 251, 1, 0, 0, 0, 241, 243, 5, 2, 0, 0, 242, 244, 5, 9, 0, 0, 243, 242, 1, 0, 0, 0, 243, 244, 1, 0, 0, 0, 244, 245, 1, 0, 0, 0, 245, 247, 3, 30, 15, 0, 246, 248, 5, 9, 0, 0, 247, 246, 1, 0, 0, 0, 247, 248, 1, 0, 0, 0, 248, 250, 1, 0, 0, 0, 249, 241, 1, 0, 0, 0, 250, 253, 1, 0, 0, 0, 251, 249, 1, 0, 0, 0, 251, 252, 1, 0, 0, 0, 252, 254, 1, 0, 0, 0, 253, 251, 1, 0, 0, 0, 254, 255, 5, 34, 0, 0, 255, 27, 1, 0, 0, 0, 256, 261, 3, 50, 25, 0, 257, 258, 5, 9, 0, 0, 258, 259, 5, 15, 0, 0, 259, 260, 5, 9, 0, 0, 260, 262, 3, 50, 25, 0, 261, 257, 1, 0, 0, 0, 261, 262, 1, 0, 0, 0, 262, 29, 1, 0, 0, 0, 263, 265, 5, 55, 0, 0, 264, 263, 1, 0, 0, 0, 264, 265, 1, 0, 0, 0, 265, 273, 1, 0, 0, 0, 266, 274, 3, 32, 16, 0, 267, 268, 3, 32, 16, 0, 268, 269, 5, 9, 0, 0, 269, 270, 5, 26, 0, 0, 270, 271, 5, 9, 0, 0, 271, 272, 3, 38, 19, 0, 272, 274, 1, 0, 0, 0, 273, 266, 1, 0, 0, 0, 273, 267, 1, 0, 0, 0, 274, 276, 1, 0, 0, 0, 275, 277, 5, 55, 0, 0, 276, 275, 1, 0, 0, 0, 276, 277, 1, 0, 0, 0, 277, 31, 1, 0, 0, 0, 278, 283, 3, 50, 25, 0, 279, 280, 5, 1, 0, 0, 280, 284, 5, 42, 0, 0, 281, 282, 5, 11, 0, 0, 282, 284, 3, 50, 25, 0, 283, 279, 1, 0, 0, 0, 283, 281, 1, 0, 0, 0, 283, 284, 1, 0, 0, 0, 284, 33, 1, 0, 0, 0, 285, 287, 3, 36, 18, 0, 286, 285, 1, 0, 0, 0, 287, 290, 1, 0, 0, 0, 288, 286, 1, 0, 0, 0, 288, 289, 1, 0, 0, 0, 289, 35, 1, 0, 0, 0, 290, 288, 1, 0, 0, 0, 291, 292, 5, 55, 0, 0, 292, 294, 3, 46, 23, 0, 293, 291, 1, 0, 0, 0, 293, 294, 1, 0, 0, 0, 294, 295, 1, 0, 0, 0, 295, 296, 5, 55, 0, 0, 296, 297, 5, 22, 0, 0, 297, 298, 5, 9, 0, 0, 298, 300, 3, 38, 19, 0, 299, 301, 5, 9, 0, 0, 300, 299, 1, 0, 0, 0, 300, 301, 1, 0, 0, 0, 301, 302, 1, 0, 0, 0, 302, 304, 5, 7, 0, 0, 303, 305, 5, 9, 0, 0, 304, 303, 1, 0, 0, 0, 304, 305, 1, 0, 0, 0, 305, 306, 1, 0, 0, 0, 306, 308, 3, 40, 20, 0, 307, 309, 5, 9, 0, 0, 308, 307, 1, 0, 0, 0, 308, 309, 1, 0, 0, 0, 309, 320, 1, 0, 0, 0, 310, 312, 5, 2, 0, 0, 311, 313, 5, 9, 0, 0, 312, 311, 1, 0, 0, 0, 312, 313, 1, 0, 0, 0, 313, 314, 1, 0, 0, 0, 314, 316, 3, 40, 20, 0, 315, 317, 5, 9, 0, 0, 316, 315, 1, 0, 0, 0, 316, 317, 1, 0, 0, 0, 317, 319, 1, 0, 0, 0, 318, 310, 1, 0, 0, 0, 319, 322, 1, 0, 0, 0, 320, 318, 1, 0, 0, 0, 320, 321, 1, 0, 0, 0, 321, 324, 1, 0, 0, 0, 322, 320, 1, 0, 0, 0, 323, 325, 5, 55, 0, 0, 324, 323, 1, 0, 0, 0, 324, 325, 1, 0, 0, 0, 325, 326, 1, 0, 0, 0, 326, 328, 5, 8, 0, 0, 327, 329, 5, 9, 0, 0, 328, 327, 1, 0, 0, 0, 328, 329, 1, 0, 0, 0, 329, 330, 1, 0, 0, 0, 330, 332, 5, 35, 0, 0, 331, 333, 5, 55, 0, 0, 332, 331, 1, 0, 0, 0, 332, 333, 1, 0, 0, 0, 333, 335, 1, 0, 0, 0, 334, 336, 5, 9, 0, 0, 335, 334, 1, 0, 0, 0, 335, 336, 1, 0, 0, 0, 336, 337, 1, 0, 0, 0, 337, 339, 3, 52, 26, 0, 338, 340, 5, 55, 0, 0, 339, 338, 1, 0, 0, 0, 339, 340, 1, 0, 0, 0, 340, 341, 1, 0, 0, 0, 341, 342, 5, 36, 0, 0, 342, 37, 1, 0, 0, 0, 343, 344, 5, 10, 0, 0, 344, 39, 1, 0, 0, 0, 345, 347, 5, 55, 0, 0, 346, 345, 1, 0, 0, 0, 346, 347, 1, 0, 0, 0, 347, 348, 1, 0, 0, 0, 348, 350, 3, 42, 21, 0, 349, 351, 5, 9, 0, 0, 350, 349, 1, 0, 0, 0, 350, 351, 1, 0, 0, 0, 351, 352, 1, 0, 0, 0, 352, 354, 5, 1, 0, 0, 353, 355, 5, 9, 0, 0, 354, 353, 1, 0, 0, 0, 354, 355, 1, 0, 0, 0, 355, 356, 1, 0, 0, 0, 356, 357, 3, 44, 22, 0, 357, 41, 1, 0, 0, 0, 358, 359, 5, 10, 0, 0, 359, 43, 1, 0, 0, 0, 360, 366, 5, 57, 0, 0, 361, 362, 5, 56, 0, 0, 362, 363, 5, 3, 0, 0, 363, 364, 5, 57, 0, 0, 364, 366, 5, 4, 0, 0, 365, 360, 1, 0, 0, 0, 365, 361, 1, 0, 0, 0, 366, 45, 1, 0, 0, 0, 367, 371, 5, 11, 0, 0, 368, 370, 8, 0, 0, 0, 369, 368, 1, 0, 0, 0, 370, 373, 1, 0, 0, 0, 371, 369, 1, 0, 0, 0, 371, 372, 1, 0, 0, 0, 372, 376, 1, 0, 0, 0, 373, 371, 1, 0, 0, 0, 374, 375, 5, 55, 0, 0, 375, 377, 3, 46, 23, 0, 376, 374, 1, 0, 0, 0, 376, 377, 1, 0, 0, 0, 377, 47, 1, 0, 0, 0, 378, 379, 7, 1, 0, 0, 379, 49, 1, 0, 0, 0, 380, 383, 3, 48, 24, 0, 381, 383, 5, 54, 0, 0, 382, 380, 1, 0, 0, 0, 382, 381, 1, 0, 0, 0, 383, 51, 1, 0, 0, 0, 384, 387, 7, 2, 0, 0, 385, 387, 8, 3, 0, 0, 386, 384, 1, 0, 0, 0, 386, 385, 1, 0, 0, 0, 387, 390, 1, 0, 0, 0, 388, 386, 1, 0, 0, 0, 388, 389, 1, 0, 0, 0, 389, 53, 1, 0, 0, 0, 390, 388, 1, 0, 0, 0, 66, 55, 58, 62, 65, 69, 73, 80, 88, 93, 99, 104, 109, 114, 124, 126, 130, 137, 141, 150, 153, 157, 160, 167, 171, 178, 182, 189, 191, 199, 204, 209, 218, 223, 228, 235, 239, 243, 247, 251, 261, 264, 273, 276, 283, 288, 293, 300, 304, 308, 312, 316, 320, 324, 328, 332, 335, 339, 346, 350, 354, 365, 371, 376, 382, 386, 388] \ No newline at end of file +[4, 1, 58, 394, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 1, 0, 3, 0, 56, 8, 0, 1, 0, 3, 0, 59, 8, 0, 1, 0, 1, 0, 3, 0, 63, 8, 0, 1, 0, 3, 0, 66, 8, 0, 1, 0, 1, 0, 3, 0, 70, 8, 0, 1, 0, 1, 0, 3, 0, 74, 8, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 3, 1, 81, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 89, 8, 1, 1, 2, 1, 2, 1, 2, 3, 2, 94, 8, 2, 1, 2, 1, 2, 1, 2, 1, 2, 3, 2, 100, 8, 2, 1, 3, 5, 3, 103, 8, 3, 10, 3, 12, 3, 106, 9, 3, 1, 4, 1, 4, 3, 4, 110, 8, 4, 1, 4, 1, 4, 1, 4, 3, 4, 115, 8, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 4, 4, 123, 8, 4, 11, 4, 12, 4, 124, 3, 4, 127, 8, 4, 1, 5, 1, 5, 3, 5, 131, 8, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 3, 5, 138, 8, 5, 1, 5, 1, 5, 3, 5, 142, 8, 5, 1, 5, 1, 5, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 3, 7, 151, 8, 7, 1, 7, 3, 7, 154, 8, 7, 1, 8, 1, 8, 3, 8, 158, 8, 8, 1, 8, 3, 8, 161, 8, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 3, 9, 168, 8, 9, 4, 9, 170, 8, 9, 11, 9, 12, 9, 171, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 3, 9, 179, 8, 9, 4, 9, 181, 8, 9, 11, 9, 12, 9, 182, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 3, 9, 190, 8, 9, 3, 9, 192, 8, 9, 1, 10, 1, 10, 1, 11, 1, 11, 5, 11, 198, 8, 11, 10, 11, 12, 11, 201, 9, 11, 1, 11, 1, 11, 3, 11, 205, 8, 11, 1, 11, 5, 11, 208, 8, 11, 10, 11, 12, 11, 211, 9, 11, 1, 11, 1, 11, 1, 12, 1, 12, 5, 12, 217, 8, 12, 10, 12, 12, 12, 220, 9, 12, 1, 12, 1, 12, 3, 12, 224, 8, 12, 1, 12, 5, 12, 227, 8, 12, 10, 12, 12, 12, 230, 9, 12, 1, 12, 1, 12, 1, 13, 1, 13, 3, 13, 236, 8, 13, 1, 13, 1, 13, 3, 13, 240, 8, 13, 1, 13, 1, 13, 3, 13, 244, 8, 13, 1, 13, 1, 13, 3, 13, 248, 8, 13, 5, 13, 250, 8, 13, 10, 13, 12, 13, 253, 9, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 3, 14, 262, 8, 14, 1, 15, 3, 15, 265, 8, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 3, 15, 274, 8, 15, 3, 15, 276, 8, 15, 1, 15, 3, 15, 279, 8, 15, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 3, 16, 286, 8, 16, 1, 17, 5, 17, 289, 8, 17, 10, 17, 12, 17, 292, 9, 17, 1, 18, 1, 18, 3, 18, 296, 8, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 3, 18, 303, 8, 18, 1, 18, 1, 18, 3, 18, 307, 8, 18, 1, 18, 1, 18, 3, 18, 311, 8, 18, 1, 18, 1, 18, 3, 18, 315, 8, 18, 1, 18, 1, 18, 3, 18, 319, 8, 18, 5, 18, 321, 8, 18, 10, 18, 12, 18, 324, 9, 18, 1, 18, 3, 18, 327, 8, 18, 1, 18, 1, 18, 3, 18, 331, 8, 18, 1, 18, 1, 18, 3, 18, 335, 8, 18, 1, 18, 3, 18, 338, 8, 18, 1, 18, 1, 18, 3, 18, 342, 8, 18, 1, 18, 1, 18, 1, 19, 1, 19, 1, 20, 3, 20, 349, 8, 20, 1, 20, 1, 20, 3, 20, 353, 8, 20, 1, 20, 1, 20, 3, 20, 357, 8, 20, 1, 20, 1, 20, 1, 21, 1, 21, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 3, 22, 368, 8, 22, 1, 23, 1, 23, 5, 23, 372, 8, 23, 10, 23, 12, 23, 375, 9, 23, 1, 23, 1, 23, 3, 23, 379, 8, 23, 1, 24, 1, 24, 1, 25, 1, 25, 3, 25, 385, 8, 25, 1, 26, 1, 26, 5, 26, 389, 8, 26, 10, 26, 12, 26, 392, 9, 26, 1, 26, 0, 0, 27, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 0, 4, 1, 0, 56, 56, 4, 0, 10, 10, 16, 18, 20, 21, 24, 24, 5, 0, 3, 5, 7, 10, 27, 35, 37, 53, 56, 56, 1, 0, 36, 36, 436, 0, 55, 1, 0, 0, 0, 2, 80, 1, 0, 0, 0, 4, 93, 1, 0, 0, 0, 6, 104, 1, 0, 0, 0, 8, 109, 1, 0, 0, 0, 10, 130, 1, 0, 0, 0, 12, 145, 1, 0, 0, 0, 14, 150, 1, 0, 0, 0, 16, 157, 1, 0, 0, 0, 18, 191, 1, 0, 0, 0, 20, 193, 1, 0, 0, 0, 22, 195, 1, 0, 0, 0, 24, 214, 1, 0, 0, 0, 26, 233, 1, 0, 0, 0, 28, 256, 1, 0, 0, 0, 30, 264, 1, 0, 0, 0, 32, 280, 1, 0, 0, 0, 34, 290, 1, 0, 0, 0, 36, 295, 1, 0, 0, 0, 38, 345, 1, 0, 0, 0, 40, 348, 1, 0, 0, 0, 42, 360, 1, 0, 0, 0, 44, 367, 1, 0, 0, 0, 46, 369, 1, 0, 0, 0, 48, 380, 1, 0, 0, 0, 50, 384, 1, 0, 0, 0, 52, 390, 1, 0, 0, 0, 54, 56, 5, 9, 0, 0, 55, 54, 1, 0, 0, 0, 55, 56, 1, 0, 0, 0, 56, 58, 1, 0, 0, 0, 57, 59, 5, 56, 0, 0, 58, 57, 1, 0, 0, 0, 58, 59, 1, 0, 0, 0, 59, 62, 1, 0, 0, 0, 60, 63, 3, 2, 1, 0, 61, 63, 3, 4, 2, 0, 62, 60, 1, 0, 0, 0, 62, 61, 1, 0, 0, 0, 63, 65, 1, 0, 0, 0, 64, 66, 5, 56, 0, 0, 65, 64, 1, 0, 0, 0, 65, 66, 1, 0, 0, 0, 66, 67, 1, 0, 0, 0, 67, 69, 3, 6, 3, 0, 68, 70, 5, 56, 0, 0, 69, 68, 1, 0, 0, 0, 69, 70, 1, 0, 0, 0, 70, 71, 1, 0, 0, 0, 71, 73, 3, 34, 17, 0, 72, 74, 5, 56, 0, 0, 73, 72, 1, 0, 0, 0, 73, 74, 1, 0, 0, 0, 74, 75, 1, 0, 0, 0, 75, 76, 5, 0, 0, 1, 76, 1, 1, 0, 0, 0, 77, 78, 3, 46, 23, 0, 78, 79, 5, 56, 0, 0, 79, 81, 1, 0, 0, 0, 80, 77, 1, 0, 0, 0, 80, 81, 1, 0, 0, 0, 81, 82, 1, 0, 0, 0, 82, 83, 5, 17, 0, 0, 83, 84, 5, 56, 0, 0, 84, 85, 5, 18, 0, 0, 85, 86, 5, 9, 0, 0, 86, 88, 5, 19, 0, 0, 87, 89, 5, 9, 0, 0, 88, 87, 1, 0, 0, 0, 88, 89, 1, 0, 0, 0, 89, 3, 1, 0, 0, 0, 90, 91, 3, 46, 23, 0, 91, 92, 5, 56, 0, 0, 92, 94, 1, 0, 0, 0, 93, 90, 1, 0, 0, 0, 93, 94, 1, 0, 0, 0, 94, 95, 1, 0, 0, 0, 95, 96, 5, 16, 0, 0, 96, 97, 5, 9, 0, 0, 97, 99, 3, 48, 24, 0, 98, 100, 5, 9, 0, 0, 99, 98, 1, 0, 0, 0, 99, 100, 1, 0, 0, 0, 100, 5, 1, 0, 0, 0, 101, 103, 3, 8, 4, 0, 102, 101, 1, 0, 0, 0, 103, 106, 1, 0, 0, 0, 104, 102, 1, 0, 0, 0, 104, 105, 1, 0, 0, 0, 105, 7, 1, 0, 0, 0, 106, 104, 1, 0, 0, 0, 107, 108, 5, 56, 0, 0, 108, 110, 3, 46, 23, 0, 109, 107, 1, 0, 0, 0, 109, 110, 1, 0, 0, 0, 110, 111, 1, 0, 0, 0, 111, 114, 5, 56, 0, 0, 112, 113, 5, 20, 0, 0, 113, 115, 5, 9, 0, 0, 114, 112, 1, 0, 0, 0, 114, 115, 1, 0, 0, 0, 115, 116, 1, 0, 0, 0, 116, 117, 5, 21, 0, 0, 117, 118, 5, 9, 0, 0, 118, 126, 3, 50, 25, 0, 119, 120, 5, 56, 0, 0, 120, 122, 5, 23, 0, 0, 121, 123, 3, 10, 5, 0, 122, 121, 1, 0, 0, 0, 123, 124, 1, 0, 0, 0, 124, 122, 1, 0, 0, 0, 124, 125, 1, 0, 0, 0, 125, 127, 1, 0, 0, 0, 126, 119, 1, 0, 0, 0, 126, 127, 1, 0, 0, 0, 127, 9, 1, 0, 0, 0, 128, 129, 5, 56, 0, 0, 129, 131, 3, 46, 23, 0, 130, 128, 1, 0, 0, 0, 130, 131, 1, 0, 0, 0, 131, 132, 1, 0, 0, 0, 132, 133, 5, 56, 0, 0, 133, 134, 5, 25, 0, 0, 134, 135, 5, 9, 0, 0, 135, 137, 3, 12, 6, 0, 136, 138, 5, 9, 0, 0, 137, 136, 1, 0, 0, 0, 137, 138, 1, 0, 0, 0, 138, 139, 1, 0, 0, 0, 139, 141, 5, 1, 0, 0, 140, 142, 5, 9, 0, 0, 141, 140, 1, 0, 0, 0, 141, 142, 1, 0, 0, 0, 142, 143, 1, 0, 0, 0, 143, 144, 3, 14, 7, 0, 144, 11, 1, 0, 0, 0, 145, 146, 3, 50, 25, 0, 146, 13, 1, 0, 0, 0, 147, 151, 3, 26, 13, 0, 148, 151, 3, 20, 10, 0, 149, 151, 3, 22, 11, 0, 150, 147, 1, 0, 0, 0, 150, 148, 1, 0, 0, 0, 150, 149, 1, 0, 0, 0, 151, 153, 1, 0, 0, 0, 152, 154, 3, 18, 9, 0, 153, 152, 1, 0, 0, 0, 153, 154, 1, 0, 0, 0, 154, 15, 1, 0, 0, 0, 155, 158, 3, 20, 10, 0, 156, 158, 3, 24, 12, 0, 157, 155, 1, 0, 0, 0, 157, 156, 1, 0, 0, 0, 158, 160, 1, 0, 0, 0, 159, 161, 3, 18, 9, 0, 160, 159, 1, 0, 0, 0, 160, 161, 1, 0, 0, 0, 161, 17, 1, 0, 0, 0, 162, 163, 5, 9, 0, 0, 163, 164, 5, 13, 0, 0, 164, 167, 5, 9, 0, 0, 165, 168, 3, 20, 10, 0, 166, 168, 3, 24, 12, 0, 167, 165, 1, 0, 0, 0, 167, 166, 1, 0, 0, 0, 168, 170, 1, 0, 0, 0, 169, 162, 1, 0, 0, 0, 170, 171, 1, 0, 0, 0, 171, 169, 1, 0, 0, 0, 171, 172, 1, 0, 0, 0, 172, 192, 1, 0, 0, 0, 173, 174, 5, 9, 0, 0, 174, 175, 5, 12, 0, 0, 175, 178, 5, 9, 0, 0, 176, 179, 3, 20, 10, 0, 177, 179, 3, 24, 12, 0, 178, 176, 1, 0, 0, 0, 178, 177, 1, 0, 0, 0, 179, 181, 1, 0, 0, 0, 180, 173, 1, 0, 0, 0, 181, 182, 1, 0, 0, 0, 182, 180, 1, 0, 0, 0, 182, 183, 1, 0, 0, 0, 183, 192, 1, 0, 0, 0, 184, 185, 5, 9, 0, 0, 185, 186, 5, 14, 0, 0, 186, 189, 5, 9, 0, 0, 187, 190, 3, 20, 10, 0, 188, 190, 3, 24, 12, 0, 189, 187, 1, 0, 0, 0, 189, 188, 1, 0, 0, 0, 190, 192, 1, 0, 0, 0, 191, 169, 1, 0, 0, 0, 191, 180, 1, 0, 0, 0, 191, 184, 1, 0, 0, 0, 192, 19, 1, 0, 0, 0, 193, 194, 3, 28, 14, 0, 194, 21, 1, 0, 0, 0, 195, 199, 5, 7, 0, 0, 196, 198, 5, 9, 0, 0, 197, 196, 1, 0, 0, 0, 198, 201, 1, 0, 0, 0, 199, 197, 1, 0, 0, 0, 199, 200, 1, 0, 0, 0, 200, 204, 1, 0, 0, 0, 201, 199, 1, 0, 0, 0, 202, 205, 3, 14, 7, 0, 203, 205, 3, 24, 12, 0, 204, 202, 1, 0, 0, 0, 204, 203, 1, 0, 0, 0, 205, 209, 1, 0, 0, 0, 206, 208, 5, 9, 0, 0, 207, 206, 1, 0, 0, 0, 208, 211, 1, 0, 0, 0, 209, 207, 1, 0, 0, 0, 209, 210, 1, 0, 0, 0, 210, 212, 1, 0, 0, 0, 211, 209, 1, 0, 0, 0, 212, 213, 5, 8, 0, 0, 213, 23, 1, 0, 0, 0, 214, 218, 5, 7, 0, 0, 215, 217, 5, 9, 0, 0, 216, 215, 1, 0, 0, 0, 217, 220, 1, 0, 0, 0, 218, 216, 1, 0, 0, 0, 218, 219, 1, 0, 0, 0, 219, 223, 1, 0, 0, 0, 220, 218, 1, 0, 0, 0, 221, 224, 3, 16, 8, 0, 222, 224, 3, 24, 12, 0, 223, 221, 1, 0, 0, 0, 223, 222, 1, 0, 0, 0, 224, 228, 1, 0, 0, 0, 225, 227, 5, 9, 0, 0, 226, 225, 1, 0, 0, 0, 227, 230, 1, 0, 0, 0, 228, 226, 1, 0, 0, 0, 228, 229, 1, 0, 0, 0, 229, 231, 1, 0, 0, 0, 230, 228, 1, 0, 0, 0, 231, 232, 5, 8, 0, 0, 232, 25, 1, 0, 0, 0, 233, 235, 5, 5, 0, 0, 234, 236, 5, 9, 0, 0, 235, 234, 1, 0, 0, 0, 235, 236, 1, 0, 0, 0, 236, 237, 1, 0, 0, 0, 237, 239, 3, 30, 15, 0, 238, 240, 5, 9, 0, 0, 239, 238, 1, 0, 0, 0, 239, 240, 1, 0, 0, 0, 240, 251, 1, 0, 0, 0, 241, 243, 5, 2, 0, 0, 242, 244, 5, 9, 0, 0, 243, 242, 1, 0, 0, 0, 243, 244, 1, 0, 0, 0, 244, 245, 1, 0, 0, 0, 245, 247, 3, 30, 15, 0, 246, 248, 5, 9, 0, 0, 247, 246, 1, 0, 0, 0, 247, 248, 1, 0, 0, 0, 248, 250, 1, 0, 0, 0, 249, 241, 1, 0, 0, 0, 250, 253, 1, 0, 0, 0, 251, 249, 1, 0, 0, 0, 251, 252, 1, 0, 0, 0, 252, 254, 1, 0, 0, 0, 253, 251, 1, 0, 0, 0, 254, 255, 5, 34, 0, 0, 255, 27, 1, 0, 0, 0, 256, 261, 3, 50, 25, 0, 257, 258, 5, 9, 0, 0, 258, 259, 5, 15, 0, 0, 259, 260, 5, 9, 0, 0, 260, 262, 3, 50, 25, 0, 261, 257, 1, 0, 0, 0, 261, 262, 1, 0, 0, 0, 262, 29, 1, 0, 0, 0, 263, 265, 5, 56, 0, 0, 264, 263, 1, 0, 0, 0, 264, 265, 1, 0, 0, 0, 265, 275, 1, 0, 0, 0, 266, 276, 3, 32, 16, 0, 267, 268, 3, 32, 16, 0, 268, 269, 5, 9, 0, 0, 269, 270, 5, 26, 0, 0, 270, 273, 5, 9, 0, 0, 271, 274, 3, 38, 19, 0, 272, 274, 5, 54, 0, 0, 273, 271, 1, 0, 0, 0, 273, 272, 1, 0, 0, 0, 274, 276, 1, 0, 0, 0, 275, 266, 1, 0, 0, 0, 275, 267, 1, 0, 0, 0, 276, 278, 1, 0, 0, 0, 277, 279, 5, 56, 0, 0, 278, 277, 1, 0, 0, 0, 278, 279, 1, 0, 0, 0, 279, 31, 1, 0, 0, 0, 280, 285, 3, 50, 25, 0, 281, 282, 5, 1, 0, 0, 282, 286, 5, 42, 0, 0, 283, 284, 5, 11, 0, 0, 284, 286, 3, 50, 25, 0, 285, 281, 1, 0, 0, 0, 285, 283, 1, 0, 0, 0, 285, 286, 1, 0, 0, 0, 286, 33, 1, 0, 0, 0, 287, 289, 3, 36, 18, 0, 288, 287, 1, 0, 0, 0, 289, 292, 1, 0, 0, 0, 290, 288, 1, 0, 0, 0, 290, 291, 1, 0, 0, 0, 291, 35, 1, 0, 0, 0, 292, 290, 1, 0, 0, 0, 293, 294, 5, 56, 0, 0, 294, 296, 3, 46, 23, 0, 295, 293, 1, 0, 0, 0, 295, 296, 1, 0, 0, 0, 296, 297, 1, 0, 0, 0, 297, 298, 5, 56, 0, 0, 298, 299, 5, 22, 0, 0, 299, 300, 5, 9, 0, 0, 300, 302, 3, 38, 19, 0, 301, 303, 5, 9, 0, 0, 302, 301, 1, 0, 0, 0, 302, 303, 1, 0, 0, 0, 303, 304, 1, 0, 0, 0, 304, 306, 5, 7, 0, 0, 305, 307, 5, 9, 0, 0, 306, 305, 1, 0, 0, 0, 306, 307, 1, 0, 0, 0, 307, 308, 1, 0, 0, 0, 308, 310, 3, 40, 20, 0, 309, 311, 5, 9, 0, 0, 310, 309, 1, 0, 0, 0, 310, 311, 1, 0, 0, 0, 311, 322, 1, 0, 0, 0, 312, 314, 5, 2, 0, 0, 313, 315, 5, 9, 0, 0, 314, 313, 1, 0, 0, 0, 314, 315, 1, 0, 0, 0, 315, 316, 1, 0, 0, 0, 316, 318, 3, 40, 20, 0, 317, 319, 5, 9, 0, 0, 318, 317, 1, 0, 0, 0, 318, 319, 1, 0, 0, 0, 319, 321, 1, 0, 0, 0, 320, 312, 1, 0, 0, 0, 321, 324, 1, 0, 0, 0, 322, 320, 1, 0, 0, 0, 322, 323, 1, 0, 0, 0, 323, 326, 1, 0, 0, 0, 324, 322, 1, 0, 0, 0, 325, 327, 5, 56, 0, 0, 326, 325, 1, 0, 0, 0, 326, 327, 1, 0, 0, 0, 327, 328, 1, 0, 0, 0, 328, 330, 5, 8, 0, 0, 329, 331, 5, 9, 0, 0, 330, 329, 1, 0, 0, 0, 330, 331, 1, 0, 0, 0, 331, 332, 1, 0, 0, 0, 332, 334, 5, 35, 0, 0, 333, 335, 5, 56, 0, 0, 334, 333, 1, 0, 0, 0, 334, 335, 1, 0, 0, 0, 335, 337, 1, 0, 0, 0, 336, 338, 5, 9, 0, 0, 337, 336, 1, 0, 0, 0, 337, 338, 1, 0, 0, 0, 338, 339, 1, 0, 0, 0, 339, 341, 3, 52, 26, 0, 340, 342, 5, 56, 0, 0, 341, 340, 1, 0, 0, 0, 341, 342, 1, 0, 0, 0, 342, 343, 1, 0, 0, 0, 343, 344, 5, 36, 0, 0, 344, 37, 1, 0, 0, 0, 345, 346, 5, 10, 0, 0, 346, 39, 1, 0, 0, 0, 347, 349, 5, 56, 0, 0, 348, 347, 1, 0, 0, 0, 348, 349, 1, 0, 0, 0, 349, 350, 1, 0, 0, 0, 350, 352, 3, 42, 21, 0, 351, 353, 5, 9, 0, 0, 352, 351, 1, 0, 0, 0, 352, 353, 1, 0, 0, 0, 353, 354, 1, 0, 0, 0, 354, 356, 5, 1, 0, 0, 355, 357, 5, 9, 0, 0, 356, 355, 1, 0, 0, 0, 356, 357, 1, 0, 0, 0, 357, 358, 1, 0, 0, 0, 358, 359, 3, 44, 22, 0, 359, 41, 1, 0, 0, 0, 360, 361, 5, 10, 0, 0, 361, 43, 1, 0, 0, 0, 362, 368, 5, 58, 0, 0, 363, 364, 5, 57, 0, 0, 364, 365, 5, 3, 0, 0, 365, 366, 5, 58, 0, 0, 366, 368, 5, 4, 0, 0, 367, 362, 1, 0, 0, 0, 367, 363, 1, 0, 0, 0, 368, 45, 1, 0, 0, 0, 369, 373, 5, 11, 0, 0, 370, 372, 8, 0, 0, 0, 371, 370, 1, 0, 0, 0, 372, 375, 1, 0, 0, 0, 373, 371, 1, 0, 0, 0, 373, 374, 1, 0, 0, 0, 374, 378, 1, 0, 0, 0, 375, 373, 1, 0, 0, 0, 376, 377, 5, 56, 0, 0, 377, 379, 3, 46, 23, 0, 378, 376, 1, 0, 0, 0, 378, 379, 1, 0, 0, 0, 379, 47, 1, 0, 0, 0, 380, 381, 7, 1, 0, 0, 381, 49, 1, 0, 0, 0, 382, 385, 3, 48, 24, 0, 383, 385, 5, 55, 0, 0, 384, 382, 1, 0, 0, 0, 384, 383, 1, 0, 0, 0, 385, 51, 1, 0, 0, 0, 386, 389, 7, 2, 0, 0, 387, 389, 8, 3, 0, 0, 388, 386, 1, 0, 0, 0, 388, 387, 1, 0, 0, 0, 389, 392, 1, 0, 0, 0, 390, 388, 1, 0, 0, 0, 390, 391, 1, 0, 0, 0, 391, 53, 1, 0, 0, 0, 392, 390, 1, 0, 0, 0, 67, 55, 58, 62, 65, 69, 73, 80, 88, 93, 99, 104, 109, 114, 124, 126, 130, 137, 141, 150, 153, 157, 160, 167, 171, 178, 182, 189, 191, 199, 204, 209, 218, 223, 228, 235, 239, 243, 247, 251, 261, 264, 273, 275, 278, 285, 290, 295, 302, 306, 310, 314, 318, 322, 326, 330, 334, 337, 341, 348, 352, 356, 367, 373, 378, 384, 388, 390] \ No newline at end of file diff --git a/pkg/js/gen/OpenFGAParser.tokens b/pkg/js/gen/OpenFGAParser.tokens index 512cec30..b2523ac8 100644 --- a/pkg/js/gen/OpenFGAParser.tokens +++ b/pkg/js/gen/OpenFGAParser.tokens @@ -51,10 +51,11 @@ NUM_INT=50 NUM_UINT=51 STRING=52 BYTES=53 -EXTENDED_IDENTIFIER=54 -NEWLINE=55 -CONDITION_PARAM_CONTAINER=56 -CONDITION_PARAM_TYPE=57 +DOLLAR_EXPRESSION=54 +EXTENDED_IDENTIFIER=55 +NEWLINE=56 +CONDITION_PARAM_CONTAINER=57 +CONDITION_PARAM_TYPE=58 '#'=11 ':'=1 ','=2 @@ -98,3 +99,4 @@ CONDITION_PARAM_TYPE=57 'true'=45 'false'=46 'null'=47 +'$expression'=54 diff --git a/pkg/js/gen/OpenFGAParser.ts b/pkg/js/gen/OpenFGAParser.ts index e51b674a..81482fd0 100644 --- a/pkg/js/gen/OpenFGAParser.ts +++ b/pkg/js/gen/OpenFGAParser.ts @@ -70,10 +70,11 @@ export default class OpenFGAParser extends Parser { public static readonly NUM_UINT = 51; public static readonly STRING = 52; public static readonly BYTES = 53; - public static readonly EXTENDED_IDENTIFIER = 54; - public static readonly NEWLINE = 55; - public static readonly CONDITION_PARAM_CONTAINER = 56; - public static readonly CONDITION_PARAM_TYPE = 57; + public static readonly DOLLAR_EXPRESSION = 54; + public static readonly EXTENDED_IDENTIFIER = 55; + public static readonly NEWLINE = 56; + public static readonly CONDITION_PARAM_CONTAINER = 57; + public static readonly CONDITION_PARAM_TYPE = 58; public static readonly EOF = Token.EOF; public static readonly RULE_main = 0; public static readonly RULE_modelHeader = 1; @@ -127,7 +128,11 @@ export default class OpenFGAParser extends Parser { "'?'", "'+'", "'*'", "'/'", "'%'", "'true'", - "'false'", "'null'" ]; + "'false'", "'null'", + null, null, + null, null, + null, null, + "'$expression'" ]; public static readonly symbolicNames: (string | null)[] = [ null, "COLON", "COMMA", "LESS", "GREATER", @@ -164,6 +169,7 @@ export default class OpenFGAParser extends Parser { "NUM_INT", "NUM_UINT", "STRING", "BYTES", + "DOLLAR_EXPRESSION", "EXTENDED_IDENTIFIER", "NEWLINE", "CONDITION_PARAM_CONTAINER", @@ -213,7 +219,7 @@ export default class OpenFGAParser extends Parser { this.state = 58; this._errHandler.sync(this); _la = this._input.LA(1); - if (_la===55) { + if (_la===56) { { this.state = 57; this.match(OpenFGAParser.NEWLINE); @@ -263,7 +269,7 @@ export default class OpenFGAParser extends Parser { this.state = 73; this._errHandler.sync(this); _la = this._input.LA(1); - if (_la===55) { + if (_la===56) { { this.state = 72; this.match(OpenFGAParser.NEWLINE); @@ -643,7 +649,7 @@ export default class OpenFGAParser extends Parser { case 20: case 21: case 24: - case 54: + case 55: { this.state = 148; this.relationDefGrouping(); @@ -701,7 +707,7 @@ export default class OpenFGAParser extends Parser { case 20: case 21: case 24: - case 54: + case 55: { this.state = 155; this.relationDefGrouping(); @@ -778,7 +784,7 @@ export default class OpenFGAParser extends Parser { case 20: case 21: case 24: - case 54: + case 55: { this.state = 165; this.relationDefGrouping(); @@ -832,7 +838,7 @@ export default class OpenFGAParser extends Parser { case 20: case 21: case 24: - case 54: + case 55: { this.state = 176; this.relationDefGrouping(); @@ -879,7 +885,7 @@ export default class OpenFGAParser extends Parser { case 20: case 21: case 24: - case 54: + case 55: { this.state = 187; this.relationDefGrouping(); @@ -1220,16 +1226,16 @@ export default class OpenFGAParser extends Parser { this.state = 264; this._errHandler.sync(this); _la = this._input.LA(1); - if (_la===55) { + if (_la===56) { { this.state = 263; this.match(OpenFGAParser.NEWLINE); } } - this.state = 273; + this.state = 275; this._errHandler.sync(this); - switch ( this._interp.adaptivePredict(this._input, 41, this._ctx) ) { + switch ( this._interp.adaptivePredict(this._input, 42, this._ctx) ) { case 1: { this.state = 266; @@ -1247,18 +1253,34 @@ export default class OpenFGAParser extends Parser { this.match(OpenFGAParser.KEYWORD_WITH); this.state = 270; this.match(OpenFGAParser.WHITESPACE); - this.state = 271; - this.conditionName(); + this.state = 273; + this._errHandler.sync(this); + switch (this._input.LA(1)) { + case 10: + { + this.state = 271; + this.conditionName(); + } + break; + case 54: + { + this.state = 272; + this.match(OpenFGAParser.DOLLAR_EXPRESSION); + } + break; + default: + throw new NoViableAltException(this); + } } } break; } - this.state = 276; + this.state = 278; this._errHandler.sync(this); _la = this._input.LA(1); - if (_la===55) { + if (_la===56) { { - this.state = 275; + this.state = 277; this.match(OpenFGAParser.NEWLINE); } } @@ -1286,17 +1308,17 @@ export default class OpenFGAParser extends Parser { try { this.enterOuterAlt(localctx, 1); { - this.state = 278; + this.state = 280; localctx._relationDefTypeRestrictionType = this.extended_identifier(); - this.state = 283; + this.state = 285; this._errHandler.sync(this); switch (this._input.LA(1)) { case 1: { { - this.state = 279; + this.state = 281; this.match(OpenFGAParser.COLON); - this.state = 280; + this.state = 282; localctx._relationDefTypeRestrictionWildcard = this.match(OpenFGAParser.STAR); } } @@ -1304,9 +1326,9 @@ export default class OpenFGAParser extends Parser { case 11: { { - this.state = 281; + this.state = 283; this.match(OpenFGAParser.HASH); - this.state = 282; + this.state = 284; localctx._relationDefTypeRestrictionRelation = this.extended_identifier(); } } @@ -1314,7 +1336,7 @@ export default class OpenFGAParser extends Parser { case 2: case 9: case 34: - case 55: + case 56: break; default: break; @@ -1343,21 +1365,21 @@ export default class OpenFGAParser extends Parser { let _alt: number; this.enterOuterAlt(localctx, 1); { - this.state = 288; + this.state = 290; this._errHandler.sync(this); - _alt = this._interp.adaptivePredict(this._input, 44, this._ctx); + _alt = this._interp.adaptivePredict(this._input, 45, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 285; + this.state = 287; this.condition(); } } } - this.state = 290; + this.state = 292; this._errHandler.sync(this); - _alt = this._interp.adaptivePredict(this._input, 44, this._ctx); + _alt = this._interp.adaptivePredict(this._input, 45, this._ctx); } } } @@ -1383,153 +1405,153 @@ export default class OpenFGAParser extends Parser { try { this.enterOuterAlt(localctx, 1); { - this.state = 293; + this.state = 295; this._errHandler.sync(this); - switch ( this._interp.adaptivePredict(this._input, 45, this._ctx) ) { + switch ( this._interp.adaptivePredict(this._input, 46, this._ctx) ) { case 1: { - this.state = 291; + this.state = 293; this.match(OpenFGAParser.NEWLINE); - this.state = 292; + this.state = 294; this.multiLineComment(); } break; } - this.state = 295; + this.state = 297; this.match(OpenFGAParser.NEWLINE); - this.state = 296; + this.state = 298; this.match(OpenFGAParser.CONDITION); - this.state = 297; + this.state = 299; this.match(OpenFGAParser.WHITESPACE); - this.state = 298; - this.conditionName(); this.state = 300; + this.conditionName(); + this.state = 302; this._errHandler.sync(this); _la = this._input.LA(1); if (_la===9) { { - this.state = 299; + this.state = 301; this.match(OpenFGAParser.WHITESPACE); } } - this.state = 302; - this.match(OpenFGAParser.LPAREN); this.state = 304; + this.match(OpenFGAParser.LPAREN); + this.state = 306; this._errHandler.sync(this); _la = this._input.LA(1); if (_la===9) { { - this.state = 303; + this.state = 305; this.match(OpenFGAParser.WHITESPACE); } } - this.state = 306; - this.conditionParameter(); this.state = 308; + this.conditionParameter(); + this.state = 310; this._errHandler.sync(this); _la = this._input.LA(1); if (_la===9) { { - this.state = 307; + this.state = 309; this.match(OpenFGAParser.WHITESPACE); } } - this.state = 320; + this.state = 322; this._errHandler.sync(this); _la = this._input.LA(1); while (_la===2) { { { - this.state = 310; - this.match(OpenFGAParser.COMMA); this.state = 312; + this.match(OpenFGAParser.COMMA); + this.state = 314; this._errHandler.sync(this); _la = this._input.LA(1); if (_la===9) { { - this.state = 311; + this.state = 313; this.match(OpenFGAParser.WHITESPACE); } } - this.state = 314; - this.conditionParameter(); this.state = 316; + this.conditionParameter(); + this.state = 318; this._errHandler.sync(this); _la = this._input.LA(1); if (_la===9) { { - this.state = 315; + this.state = 317; this.match(OpenFGAParser.WHITESPACE); } } } } - this.state = 322; + this.state = 324; this._errHandler.sync(this); _la = this._input.LA(1); } - this.state = 324; + this.state = 326; this._errHandler.sync(this); _la = this._input.LA(1); - if (_la===55) { + if (_la===56) { { - this.state = 323; + this.state = 325; this.match(OpenFGAParser.NEWLINE); } } - this.state = 326; - this.match(OpenFGAParser.RPAREN); this.state = 328; + this.match(OpenFGAParser.RPAREN); + this.state = 330; this._errHandler.sync(this); _la = this._input.LA(1); if (_la===9) { { - this.state = 327; + this.state = 329; this.match(OpenFGAParser.WHITESPACE); } } - this.state = 330; - this.match(OpenFGAParser.LBRACE); this.state = 332; + this.match(OpenFGAParser.LBRACE); + this.state = 334; this._errHandler.sync(this); - switch ( this._interp.adaptivePredict(this._input, 54, this._ctx) ) { + switch ( this._interp.adaptivePredict(this._input, 55, this._ctx) ) { case 1: { - this.state = 331; + this.state = 333; this.match(OpenFGAParser.NEWLINE); } break; } - this.state = 335; + this.state = 337; this._errHandler.sync(this); - switch ( this._interp.adaptivePredict(this._input, 55, this._ctx) ) { + switch ( this._interp.adaptivePredict(this._input, 56, this._ctx) ) { case 1: { - this.state = 334; + this.state = 336; this.match(OpenFGAParser.WHITESPACE); } break; } - this.state = 337; - this.conditionExpression(); this.state = 339; + this.conditionExpression(); + this.state = 341; this._errHandler.sync(this); _la = this._input.LA(1); - if (_la===55) { + if (_la===56) { { - this.state = 338; + this.state = 340; this.match(OpenFGAParser.NEWLINE); } } - this.state = 341; + this.state = 343; this.match(OpenFGAParser.RBRACE); } } @@ -1554,7 +1576,7 @@ export default class OpenFGAParser extends Parser { try { this.enterOuterAlt(localctx, 1); { - this.state = 343; + this.state = 345; this.match(OpenFGAParser.IDENTIFIER); } } @@ -1580,41 +1602,41 @@ export default class OpenFGAParser extends Parser { try { this.enterOuterAlt(localctx, 1); { - this.state = 346; + this.state = 348; this._errHandler.sync(this); _la = this._input.LA(1); - if (_la===55) { + if (_la===56) { { - this.state = 345; + this.state = 347; this.match(OpenFGAParser.NEWLINE); } } - this.state = 348; - this.parameterName(); this.state = 350; + this.parameterName(); + this.state = 352; this._errHandler.sync(this); _la = this._input.LA(1); if (_la===9) { { - this.state = 349; + this.state = 351; this.match(OpenFGAParser.WHITESPACE); } } - this.state = 352; - this.match(OpenFGAParser.COLON); this.state = 354; + this.match(OpenFGAParser.COLON); + this.state = 356; this._errHandler.sync(this); _la = this._input.LA(1); if (_la===9) { { - this.state = 353; + this.state = 355; this.match(OpenFGAParser.WHITESPACE); } } - this.state = 356; + this.state = 358; this.parameterType(); } } @@ -1639,7 +1661,7 @@ export default class OpenFGAParser extends Parser { try { this.enterOuterAlt(localctx, 1); { - this.state = 358; + this.state = 360; this.match(OpenFGAParser.IDENTIFIER); } } @@ -1662,27 +1684,27 @@ export default class OpenFGAParser extends Parser { let localctx: ParameterTypeContext = new ParameterTypeContext(this, this._ctx, this.state); this.enterRule(localctx, 44, OpenFGAParser.RULE_parameterType); try { - this.state = 365; + this.state = 367; this._errHandler.sync(this); switch (this._input.LA(1)) { - case 57: + case 58: this.enterOuterAlt(localctx, 1); { - this.state = 360; + this.state = 362; this.match(OpenFGAParser.CONDITION_PARAM_TYPE); } break; - case 56: + case 57: this.enterOuterAlt(localctx, 2); { { - this.state = 361; + this.state = 363; this.match(OpenFGAParser.CONDITION_PARAM_CONTAINER); - this.state = 362; + this.state = 364; this.match(OpenFGAParser.LESS); - this.state = 363; + this.state = 365; this.match(OpenFGAParser.CONDITION_PARAM_TYPE); - this.state = 364; + this.state = 366; this.match(OpenFGAParser.GREATER); } } @@ -1713,17 +1735,17 @@ export default class OpenFGAParser extends Parser { try { this.enterOuterAlt(localctx, 1); { - this.state = 367; + this.state = 369; this.match(OpenFGAParser.HASH); - this.state = 371; + this.state = 373; this._errHandler.sync(this); _la = this._input.LA(1); - while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 4294967294) !== 0) || ((((_la - 32)) & ~0x1F) === 0 && ((1 << (_la - 32)) & 58720255) !== 0)) { + while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 4294967294) !== 0) || ((((_la - 32)) & ~0x1F) === 0 && ((1 << (_la - 32)) & 117440511) !== 0)) { { { - this.state = 368; + this.state = 370; _la = this._input.LA(1); - if(_la<=0 || _la===55) { + if(_la<=0 || _la===56) { this._errHandler.recoverInline(this); } else { @@ -1732,18 +1754,18 @@ export default class OpenFGAParser extends Parser { } } } - this.state = 373; + this.state = 375; this._errHandler.sync(this); _la = this._input.LA(1); } - this.state = 376; + this.state = 378; this._errHandler.sync(this); - switch ( this._interp.adaptivePredict(this._input, 62, this._ctx) ) { + switch ( this._interp.adaptivePredict(this._input, 63, this._ctx) ) { case 1: { - this.state = 374; + this.state = 376; this.match(OpenFGAParser.NEWLINE); - this.state = 375; + this.state = 377; this.multiLineComment(); } break; @@ -1772,7 +1794,7 @@ export default class OpenFGAParser extends Parser { try { this.enterOuterAlt(localctx, 1); { - this.state = 378; + this.state = 380; _la = this._input.LA(1); if(!((((_la) & ~0x1F) === 0 && ((1 << _la) & 20382720) !== 0))) { this._errHandler.recoverInline(this); @@ -1802,7 +1824,7 @@ export default class OpenFGAParser extends Parser { let localctx: Extended_identifierContext = new Extended_identifierContext(this, this._ctx, this.state); this.enterRule(localctx, 50, OpenFGAParser.RULE_extended_identifier); try { - this.state = 382; + this.state = 384; this._errHandler.sync(this); switch (this._input.LA(1)) { case 10: @@ -1814,14 +1836,14 @@ export default class OpenFGAParser extends Parser { case 24: this.enterOuterAlt(localctx, 1); { - this.state = 380; + this.state = 382; this.identifier(); } break; - case 54: + case 55: this.enterOuterAlt(localctx, 2); { - this.state = 381; + this.state = 383; this.match(OpenFGAParser.EXTENDED_IDENTIFIER); } break; @@ -1852,20 +1874,20 @@ export default class OpenFGAParser extends Parser { let _alt: number; this.enterOuterAlt(localctx, 1); { - this.state = 388; + this.state = 390; this._errHandler.sync(this); - _alt = this._interp.adaptivePredict(this._input, 65, this._ctx); + _alt = this._interp.adaptivePredict(this._input, 66, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { - this.state = 386; + this.state = 388; this._errHandler.sync(this); - switch ( this._interp.adaptivePredict(this._input, 64, this._ctx) ) { + switch ( this._interp.adaptivePredict(this._input, 65, this._ctx) ) { case 1: { - this.state = 384; + this.state = 386; _la = this._input.LA(1); - if(!((((_la) & ~0x1F) === 0 && ((1 << _la) & 4160751544) !== 0) || ((((_la - 32)) & ~0x1F) === 0 && ((1 << (_la - 32)) & 12582895) !== 0))) { + if(!((((_la) & ~0x1F) === 0 && ((1 << _la) & 4160751544) !== 0) || ((((_la - 32)) & ~0x1F) === 0 && ((1 << (_la - 32)) & 20971503) !== 0))) { this._errHandler.recoverInline(this); } else { @@ -1876,7 +1898,7 @@ export default class OpenFGAParser extends Parser { break; case 2: { - this.state = 385; + this.state = 387; _la = this._input.LA(1); if(_la<=0 || _la===36) { this._errHandler.recoverInline(this); @@ -1890,9 +1912,9 @@ export default class OpenFGAParser extends Parser { } } } - this.state = 390; + this.state = 392; this._errHandler.sync(this); - _alt = this._interp.adaptivePredict(this._input, 65, this._ctx); + _alt = this._interp.adaptivePredict(this._input, 66, this._ctx); } } } @@ -1911,7 +1933,7 @@ export default class OpenFGAParser extends Parser { return localctx; } - public static readonly _serializedATN: number[] = [4,1,57,392,2,0,7,0,2, + public static readonly _serializedATN: number[] = [4,1,58,394,2,0,7,0,2, 1,7,1,2,2,7,2,2,3,7,3,2,4,7,4,2,5,7,5,2,6,7,6,2,7,7,7,2,8,7,8,2,9,7,9,2, 10,7,10,2,11,7,11,2,12,7,12,2,13,7,13,2,14,7,14,2,15,7,15,2,16,7,16,2,17, 7,17,2,18,7,18,2,19,7,19,2,20,7,20,2,21,7,21,2,22,7,22,2,23,7,23,2,24,7, @@ -1931,118 +1953,119 @@ export default class OpenFGAParser extends Parser { 230,9,12,1,12,1,12,1,13,1,13,3,13,236,8,13,1,13,1,13,3,13,240,8,13,1,13, 1,13,3,13,244,8,13,1,13,1,13,3,13,248,8,13,5,13,250,8,13,10,13,12,13,253, 9,13,1,13,1,13,1,14,1,14,1,14,1,14,1,14,3,14,262,8,14,1,15,3,15,265,8,15, - 1,15,1,15,1,15,1,15,1,15,1,15,1,15,3,15,274,8,15,1,15,3,15,277,8,15,1,16, - 1,16,1,16,1,16,1,16,3,16,284,8,16,1,17,5,17,287,8,17,10,17,12,17,290,9, - 17,1,18,1,18,3,18,294,8,18,1,18,1,18,1,18,1,18,1,18,3,18,301,8,18,1,18, - 1,18,3,18,305,8,18,1,18,1,18,3,18,309,8,18,1,18,1,18,3,18,313,8,18,1,18, - 1,18,3,18,317,8,18,5,18,319,8,18,10,18,12,18,322,9,18,1,18,3,18,325,8,18, - 1,18,1,18,3,18,329,8,18,1,18,1,18,3,18,333,8,18,1,18,3,18,336,8,18,1,18, - 1,18,3,18,340,8,18,1,18,1,18,1,19,1,19,1,20,3,20,347,8,20,1,20,1,20,3,20, - 351,8,20,1,20,1,20,3,20,355,8,20,1,20,1,20,1,21,1,21,1,22,1,22,1,22,1,22, - 1,22,3,22,366,8,22,1,23,1,23,5,23,370,8,23,10,23,12,23,373,9,23,1,23,1, - 23,3,23,377,8,23,1,24,1,24,1,25,1,25,3,25,383,8,25,1,26,1,26,5,26,387,8, - 26,10,26,12,26,390,9,26,1,26,0,0,27,0,2,4,6,8,10,12,14,16,18,20,22,24,26, - 28,30,32,34,36,38,40,42,44,46,48,50,52,0,4,1,0,55,55,4,0,10,10,16,18,20, - 21,24,24,5,0,3,5,7,10,27,35,37,53,55,55,1,0,36,36,433,0,55,1,0,0,0,2,80, - 1,0,0,0,4,93,1,0,0,0,6,104,1,0,0,0,8,109,1,0,0,0,10,130,1,0,0,0,12,145, - 1,0,0,0,14,150,1,0,0,0,16,157,1,0,0,0,18,191,1,0,0,0,20,193,1,0,0,0,22, - 195,1,0,0,0,24,214,1,0,0,0,26,233,1,0,0,0,28,256,1,0,0,0,30,264,1,0,0,0, - 32,278,1,0,0,0,34,288,1,0,0,0,36,293,1,0,0,0,38,343,1,0,0,0,40,346,1,0, - 0,0,42,358,1,0,0,0,44,365,1,0,0,0,46,367,1,0,0,0,48,378,1,0,0,0,50,382, - 1,0,0,0,52,388,1,0,0,0,54,56,5,9,0,0,55,54,1,0,0,0,55,56,1,0,0,0,56,58, - 1,0,0,0,57,59,5,55,0,0,58,57,1,0,0,0,58,59,1,0,0,0,59,62,1,0,0,0,60,63, - 3,2,1,0,61,63,3,4,2,0,62,60,1,0,0,0,62,61,1,0,0,0,63,65,1,0,0,0,64,66,5, - 55,0,0,65,64,1,0,0,0,65,66,1,0,0,0,66,67,1,0,0,0,67,69,3,6,3,0,68,70,5, - 55,0,0,69,68,1,0,0,0,69,70,1,0,0,0,70,71,1,0,0,0,71,73,3,34,17,0,72,74, - 5,55,0,0,73,72,1,0,0,0,73,74,1,0,0,0,74,75,1,0,0,0,75,76,5,0,0,1,76,1,1, - 0,0,0,77,78,3,46,23,0,78,79,5,55,0,0,79,81,1,0,0,0,80,77,1,0,0,0,80,81, - 1,0,0,0,81,82,1,0,0,0,82,83,5,17,0,0,83,84,5,55,0,0,84,85,5,18,0,0,85,86, - 5,9,0,0,86,88,5,19,0,0,87,89,5,9,0,0,88,87,1,0,0,0,88,89,1,0,0,0,89,3,1, - 0,0,0,90,91,3,46,23,0,91,92,5,55,0,0,92,94,1,0,0,0,93,90,1,0,0,0,93,94, - 1,0,0,0,94,95,1,0,0,0,95,96,5,16,0,0,96,97,5,9,0,0,97,99,3,48,24,0,98,100, - 5,9,0,0,99,98,1,0,0,0,99,100,1,0,0,0,100,5,1,0,0,0,101,103,3,8,4,0,102, - 101,1,0,0,0,103,106,1,0,0,0,104,102,1,0,0,0,104,105,1,0,0,0,105,7,1,0,0, - 0,106,104,1,0,0,0,107,108,5,55,0,0,108,110,3,46,23,0,109,107,1,0,0,0,109, - 110,1,0,0,0,110,111,1,0,0,0,111,114,5,55,0,0,112,113,5,20,0,0,113,115,5, - 9,0,0,114,112,1,0,0,0,114,115,1,0,0,0,115,116,1,0,0,0,116,117,5,21,0,0, - 117,118,5,9,0,0,118,126,3,50,25,0,119,120,5,55,0,0,120,122,5,23,0,0,121, - 123,3,10,5,0,122,121,1,0,0,0,123,124,1,0,0,0,124,122,1,0,0,0,124,125,1, - 0,0,0,125,127,1,0,0,0,126,119,1,0,0,0,126,127,1,0,0,0,127,9,1,0,0,0,128, - 129,5,55,0,0,129,131,3,46,23,0,130,128,1,0,0,0,130,131,1,0,0,0,131,132, - 1,0,0,0,132,133,5,55,0,0,133,134,5,25,0,0,134,135,5,9,0,0,135,137,3,12, - 6,0,136,138,5,9,0,0,137,136,1,0,0,0,137,138,1,0,0,0,138,139,1,0,0,0,139, - 141,5,1,0,0,140,142,5,9,0,0,141,140,1,0,0,0,141,142,1,0,0,0,142,143,1,0, - 0,0,143,144,3,14,7,0,144,11,1,0,0,0,145,146,3,50,25,0,146,13,1,0,0,0,147, - 151,3,26,13,0,148,151,3,20,10,0,149,151,3,22,11,0,150,147,1,0,0,0,150,148, - 1,0,0,0,150,149,1,0,0,0,151,153,1,0,0,0,152,154,3,18,9,0,153,152,1,0,0, - 0,153,154,1,0,0,0,154,15,1,0,0,0,155,158,3,20,10,0,156,158,3,24,12,0,157, - 155,1,0,0,0,157,156,1,0,0,0,158,160,1,0,0,0,159,161,3,18,9,0,160,159,1, - 0,0,0,160,161,1,0,0,0,161,17,1,0,0,0,162,163,5,9,0,0,163,164,5,13,0,0,164, - 167,5,9,0,0,165,168,3,20,10,0,166,168,3,24,12,0,167,165,1,0,0,0,167,166, - 1,0,0,0,168,170,1,0,0,0,169,162,1,0,0,0,170,171,1,0,0,0,171,169,1,0,0,0, - 171,172,1,0,0,0,172,192,1,0,0,0,173,174,5,9,0,0,174,175,5,12,0,0,175,178, - 5,9,0,0,176,179,3,20,10,0,177,179,3,24,12,0,178,176,1,0,0,0,178,177,1,0, - 0,0,179,181,1,0,0,0,180,173,1,0,0,0,181,182,1,0,0,0,182,180,1,0,0,0,182, - 183,1,0,0,0,183,192,1,0,0,0,184,185,5,9,0,0,185,186,5,14,0,0,186,189,5, - 9,0,0,187,190,3,20,10,0,188,190,3,24,12,0,189,187,1,0,0,0,189,188,1,0,0, - 0,190,192,1,0,0,0,191,169,1,0,0,0,191,180,1,0,0,0,191,184,1,0,0,0,192,19, - 1,0,0,0,193,194,3,28,14,0,194,21,1,0,0,0,195,199,5,7,0,0,196,198,5,9,0, - 0,197,196,1,0,0,0,198,201,1,0,0,0,199,197,1,0,0,0,199,200,1,0,0,0,200,204, - 1,0,0,0,201,199,1,0,0,0,202,205,3,14,7,0,203,205,3,24,12,0,204,202,1,0, - 0,0,204,203,1,0,0,0,205,209,1,0,0,0,206,208,5,9,0,0,207,206,1,0,0,0,208, - 211,1,0,0,0,209,207,1,0,0,0,209,210,1,0,0,0,210,212,1,0,0,0,211,209,1,0, - 0,0,212,213,5,8,0,0,213,23,1,0,0,0,214,218,5,7,0,0,215,217,5,9,0,0,216, - 215,1,0,0,0,217,220,1,0,0,0,218,216,1,0,0,0,218,219,1,0,0,0,219,223,1,0, - 0,0,220,218,1,0,0,0,221,224,3,16,8,0,222,224,3,24,12,0,223,221,1,0,0,0, - 223,222,1,0,0,0,224,228,1,0,0,0,225,227,5,9,0,0,226,225,1,0,0,0,227,230, - 1,0,0,0,228,226,1,0,0,0,228,229,1,0,0,0,229,231,1,0,0,0,230,228,1,0,0,0, - 231,232,5,8,0,0,232,25,1,0,0,0,233,235,5,5,0,0,234,236,5,9,0,0,235,234, - 1,0,0,0,235,236,1,0,0,0,236,237,1,0,0,0,237,239,3,30,15,0,238,240,5,9,0, - 0,239,238,1,0,0,0,239,240,1,0,0,0,240,251,1,0,0,0,241,243,5,2,0,0,242,244, - 5,9,0,0,243,242,1,0,0,0,243,244,1,0,0,0,244,245,1,0,0,0,245,247,3,30,15, - 0,246,248,5,9,0,0,247,246,1,0,0,0,247,248,1,0,0,0,248,250,1,0,0,0,249,241, - 1,0,0,0,250,253,1,0,0,0,251,249,1,0,0,0,251,252,1,0,0,0,252,254,1,0,0,0, - 253,251,1,0,0,0,254,255,5,34,0,0,255,27,1,0,0,0,256,261,3,50,25,0,257,258, - 5,9,0,0,258,259,5,15,0,0,259,260,5,9,0,0,260,262,3,50,25,0,261,257,1,0, - 0,0,261,262,1,0,0,0,262,29,1,0,0,0,263,265,5,55,0,0,264,263,1,0,0,0,264, - 265,1,0,0,0,265,273,1,0,0,0,266,274,3,32,16,0,267,268,3,32,16,0,268,269, - 5,9,0,0,269,270,5,26,0,0,270,271,5,9,0,0,271,272,3,38,19,0,272,274,1,0, - 0,0,273,266,1,0,0,0,273,267,1,0,0,0,274,276,1,0,0,0,275,277,5,55,0,0,276, - 275,1,0,0,0,276,277,1,0,0,0,277,31,1,0,0,0,278,283,3,50,25,0,279,280,5, - 1,0,0,280,284,5,42,0,0,281,282,5,11,0,0,282,284,3,50,25,0,283,279,1,0,0, - 0,283,281,1,0,0,0,283,284,1,0,0,0,284,33,1,0,0,0,285,287,3,36,18,0,286, - 285,1,0,0,0,287,290,1,0,0,0,288,286,1,0,0,0,288,289,1,0,0,0,289,35,1,0, - 0,0,290,288,1,0,0,0,291,292,5,55,0,0,292,294,3,46,23,0,293,291,1,0,0,0, - 293,294,1,0,0,0,294,295,1,0,0,0,295,296,5,55,0,0,296,297,5,22,0,0,297,298, - 5,9,0,0,298,300,3,38,19,0,299,301,5,9,0,0,300,299,1,0,0,0,300,301,1,0,0, - 0,301,302,1,0,0,0,302,304,5,7,0,0,303,305,5,9,0,0,304,303,1,0,0,0,304,305, - 1,0,0,0,305,306,1,0,0,0,306,308,3,40,20,0,307,309,5,9,0,0,308,307,1,0,0, - 0,308,309,1,0,0,0,309,320,1,0,0,0,310,312,5,2,0,0,311,313,5,9,0,0,312,311, - 1,0,0,0,312,313,1,0,0,0,313,314,1,0,0,0,314,316,3,40,20,0,315,317,5,9,0, - 0,316,315,1,0,0,0,316,317,1,0,0,0,317,319,1,0,0,0,318,310,1,0,0,0,319,322, - 1,0,0,0,320,318,1,0,0,0,320,321,1,0,0,0,321,324,1,0,0,0,322,320,1,0,0,0, - 323,325,5,55,0,0,324,323,1,0,0,0,324,325,1,0,0,0,325,326,1,0,0,0,326,328, - 5,8,0,0,327,329,5,9,0,0,328,327,1,0,0,0,328,329,1,0,0,0,329,330,1,0,0,0, - 330,332,5,35,0,0,331,333,5,55,0,0,332,331,1,0,0,0,332,333,1,0,0,0,333,335, - 1,0,0,0,334,336,5,9,0,0,335,334,1,0,0,0,335,336,1,0,0,0,336,337,1,0,0,0, - 337,339,3,52,26,0,338,340,5,55,0,0,339,338,1,0,0,0,339,340,1,0,0,0,340, - 341,1,0,0,0,341,342,5,36,0,0,342,37,1,0,0,0,343,344,5,10,0,0,344,39,1,0, - 0,0,345,347,5,55,0,0,346,345,1,0,0,0,346,347,1,0,0,0,347,348,1,0,0,0,348, - 350,3,42,21,0,349,351,5,9,0,0,350,349,1,0,0,0,350,351,1,0,0,0,351,352,1, - 0,0,0,352,354,5,1,0,0,353,355,5,9,0,0,354,353,1,0,0,0,354,355,1,0,0,0,355, - 356,1,0,0,0,356,357,3,44,22,0,357,41,1,0,0,0,358,359,5,10,0,0,359,43,1, - 0,0,0,360,366,5,57,0,0,361,362,5,56,0,0,362,363,5,3,0,0,363,364,5,57,0, - 0,364,366,5,4,0,0,365,360,1,0,0,0,365,361,1,0,0,0,366,45,1,0,0,0,367,371, - 5,11,0,0,368,370,8,0,0,0,369,368,1,0,0,0,370,373,1,0,0,0,371,369,1,0,0, - 0,371,372,1,0,0,0,372,376,1,0,0,0,373,371,1,0,0,0,374,375,5,55,0,0,375, - 377,3,46,23,0,376,374,1,0,0,0,376,377,1,0,0,0,377,47,1,0,0,0,378,379,7, - 1,0,0,379,49,1,0,0,0,380,383,3,48,24,0,381,383,5,54,0,0,382,380,1,0,0,0, - 382,381,1,0,0,0,383,51,1,0,0,0,384,387,7,2,0,0,385,387,8,3,0,0,386,384, - 1,0,0,0,386,385,1,0,0,0,387,390,1,0,0,0,388,386,1,0,0,0,388,389,1,0,0,0, - 389,53,1,0,0,0,390,388,1,0,0,0,66,55,58,62,65,69,73,80,88,93,99,104,109, - 114,124,126,130,137,141,150,153,157,160,167,171,178,182,189,191,199,204, - 209,218,223,228,235,239,243,247,251,261,264,273,276,283,288,293,300,304, - 308,312,316,320,324,328,332,335,339,346,350,354,365,371,376,382,386,388]; + 1,15,1,15,1,15,1,15,1,15,1,15,1,15,3,15,274,8,15,3,15,276,8,15,1,15,3,15, + 279,8,15,1,16,1,16,1,16,1,16,1,16,3,16,286,8,16,1,17,5,17,289,8,17,10,17, + 12,17,292,9,17,1,18,1,18,3,18,296,8,18,1,18,1,18,1,18,1,18,1,18,3,18,303, + 8,18,1,18,1,18,3,18,307,8,18,1,18,1,18,3,18,311,8,18,1,18,1,18,3,18,315, + 8,18,1,18,1,18,3,18,319,8,18,5,18,321,8,18,10,18,12,18,324,9,18,1,18,3, + 18,327,8,18,1,18,1,18,3,18,331,8,18,1,18,1,18,3,18,335,8,18,1,18,3,18,338, + 8,18,1,18,1,18,3,18,342,8,18,1,18,1,18,1,19,1,19,1,20,3,20,349,8,20,1,20, + 1,20,3,20,353,8,20,1,20,1,20,3,20,357,8,20,1,20,1,20,1,21,1,21,1,22,1,22, + 1,22,1,22,1,22,3,22,368,8,22,1,23,1,23,5,23,372,8,23,10,23,12,23,375,9, + 23,1,23,1,23,3,23,379,8,23,1,24,1,24,1,25,1,25,3,25,385,8,25,1,26,1,26, + 5,26,389,8,26,10,26,12,26,392,9,26,1,26,0,0,27,0,2,4,6,8,10,12,14,16,18, + 20,22,24,26,28,30,32,34,36,38,40,42,44,46,48,50,52,0,4,1,0,56,56,4,0,10, + 10,16,18,20,21,24,24,5,0,3,5,7,10,27,35,37,53,56,56,1,0,36,36,436,0,55, + 1,0,0,0,2,80,1,0,0,0,4,93,1,0,0,0,6,104,1,0,0,0,8,109,1,0,0,0,10,130,1, + 0,0,0,12,145,1,0,0,0,14,150,1,0,0,0,16,157,1,0,0,0,18,191,1,0,0,0,20,193, + 1,0,0,0,22,195,1,0,0,0,24,214,1,0,0,0,26,233,1,0,0,0,28,256,1,0,0,0,30, + 264,1,0,0,0,32,280,1,0,0,0,34,290,1,0,0,0,36,295,1,0,0,0,38,345,1,0,0,0, + 40,348,1,0,0,0,42,360,1,0,0,0,44,367,1,0,0,0,46,369,1,0,0,0,48,380,1,0, + 0,0,50,384,1,0,0,0,52,390,1,0,0,0,54,56,5,9,0,0,55,54,1,0,0,0,55,56,1,0, + 0,0,56,58,1,0,0,0,57,59,5,56,0,0,58,57,1,0,0,0,58,59,1,0,0,0,59,62,1,0, + 0,0,60,63,3,2,1,0,61,63,3,4,2,0,62,60,1,0,0,0,62,61,1,0,0,0,63,65,1,0,0, + 0,64,66,5,56,0,0,65,64,1,0,0,0,65,66,1,0,0,0,66,67,1,0,0,0,67,69,3,6,3, + 0,68,70,5,56,0,0,69,68,1,0,0,0,69,70,1,0,0,0,70,71,1,0,0,0,71,73,3,34,17, + 0,72,74,5,56,0,0,73,72,1,0,0,0,73,74,1,0,0,0,74,75,1,0,0,0,75,76,5,0,0, + 1,76,1,1,0,0,0,77,78,3,46,23,0,78,79,5,56,0,0,79,81,1,0,0,0,80,77,1,0,0, + 0,80,81,1,0,0,0,81,82,1,0,0,0,82,83,5,17,0,0,83,84,5,56,0,0,84,85,5,18, + 0,0,85,86,5,9,0,0,86,88,5,19,0,0,87,89,5,9,0,0,88,87,1,0,0,0,88,89,1,0, + 0,0,89,3,1,0,0,0,90,91,3,46,23,0,91,92,5,56,0,0,92,94,1,0,0,0,93,90,1,0, + 0,0,93,94,1,0,0,0,94,95,1,0,0,0,95,96,5,16,0,0,96,97,5,9,0,0,97,99,3,48, + 24,0,98,100,5,9,0,0,99,98,1,0,0,0,99,100,1,0,0,0,100,5,1,0,0,0,101,103, + 3,8,4,0,102,101,1,0,0,0,103,106,1,0,0,0,104,102,1,0,0,0,104,105,1,0,0,0, + 105,7,1,0,0,0,106,104,1,0,0,0,107,108,5,56,0,0,108,110,3,46,23,0,109,107, + 1,0,0,0,109,110,1,0,0,0,110,111,1,0,0,0,111,114,5,56,0,0,112,113,5,20,0, + 0,113,115,5,9,0,0,114,112,1,0,0,0,114,115,1,0,0,0,115,116,1,0,0,0,116,117, + 5,21,0,0,117,118,5,9,0,0,118,126,3,50,25,0,119,120,5,56,0,0,120,122,5,23, + 0,0,121,123,3,10,5,0,122,121,1,0,0,0,123,124,1,0,0,0,124,122,1,0,0,0,124, + 125,1,0,0,0,125,127,1,0,0,0,126,119,1,0,0,0,126,127,1,0,0,0,127,9,1,0,0, + 0,128,129,5,56,0,0,129,131,3,46,23,0,130,128,1,0,0,0,130,131,1,0,0,0,131, + 132,1,0,0,0,132,133,5,56,0,0,133,134,5,25,0,0,134,135,5,9,0,0,135,137,3, + 12,6,0,136,138,5,9,0,0,137,136,1,0,0,0,137,138,1,0,0,0,138,139,1,0,0,0, + 139,141,5,1,0,0,140,142,5,9,0,0,141,140,1,0,0,0,141,142,1,0,0,0,142,143, + 1,0,0,0,143,144,3,14,7,0,144,11,1,0,0,0,145,146,3,50,25,0,146,13,1,0,0, + 0,147,151,3,26,13,0,148,151,3,20,10,0,149,151,3,22,11,0,150,147,1,0,0,0, + 150,148,1,0,0,0,150,149,1,0,0,0,151,153,1,0,0,0,152,154,3,18,9,0,153,152, + 1,0,0,0,153,154,1,0,0,0,154,15,1,0,0,0,155,158,3,20,10,0,156,158,3,24,12, + 0,157,155,1,0,0,0,157,156,1,0,0,0,158,160,1,0,0,0,159,161,3,18,9,0,160, + 159,1,0,0,0,160,161,1,0,0,0,161,17,1,0,0,0,162,163,5,9,0,0,163,164,5,13, + 0,0,164,167,5,9,0,0,165,168,3,20,10,0,166,168,3,24,12,0,167,165,1,0,0,0, + 167,166,1,0,0,0,168,170,1,0,0,0,169,162,1,0,0,0,170,171,1,0,0,0,171,169, + 1,0,0,0,171,172,1,0,0,0,172,192,1,0,0,0,173,174,5,9,0,0,174,175,5,12,0, + 0,175,178,5,9,0,0,176,179,3,20,10,0,177,179,3,24,12,0,178,176,1,0,0,0,178, + 177,1,0,0,0,179,181,1,0,0,0,180,173,1,0,0,0,181,182,1,0,0,0,182,180,1,0, + 0,0,182,183,1,0,0,0,183,192,1,0,0,0,184,185,5,9,0,0,185,186,5,14,0,0,186, + 189,5,9,0,0,187,190,3,20,10,0,188,190,3,24,12,0,189,187,1,0,0,0,189,188, + 1,0,0,0,190,192,1,0,0,0,191,169,1,0,0,0,191,180,1,0,0,0,191,184,1,0,0,0, + 192,19,1,0,0,0,193,194,3,28,14,0,194,21,1,0,0,0,195,199,5,7,0,0,196,198, + 5,9,0,0,197,196,1,0,0,0,198,201,1,0,0,0,199,197,1,0,0,0,199,200,1,0,0,0, + 200,204,1,0,0,0,201,199,1,0,0,0,202,205,3,14,7,0,203,205,3,24,12,0,204, + 202,1,0,0,0,204,203,1,0,0,0,205,209,1,0,0,0,206,208,5,9,0,0,207,206,1,0, + 0,0,208,211,1,0,0,0,209,207,1,0,0,0,209,210,1,0,0,0,210,212,1,0,0,0,211, + 209,1,0,0,0,212,213,5,8,0,0,213,23,1,0,0,0,214,218,5,7,0,0,215,217,5,9, + 0,0,216,215,1,0,0,0,217,220,1,0,0,0,218,216,1,0,0,0,218,219,1,0,0,0,219, + 223,1,0,0,0,220,218,1,0,0,0,221,224,3,16,8,0,222,224,3,24,12,0,223,221, + 1,0,0,0,223,222,1,0,0,0,224,228,1,0,0,0,225,227,5,9,0,0,226,225,1,0,0,0, + 227,230,1,0,0,0,228,226,1,0,0,0,228,229,1,0,0,0,229,231,1,0,0,0,230,228, + 1,0,0,0,231,232,5,8,0,0,232,25,1,0,0,0,233,235,5,5,0,0,234,236,5,9,0,0, + 235,234,1,0,0,0,235,236,1,0,0,0,236,237,1,0,0,0,237,239,3,30,15,0,238,240, + 5,9,0,0,239,238,1,0,0,0,239,240,1,0,0,0,240,251,1,0,0,0,241,243,5,2,0,0, + 242,244,5,9,0,0,243,242,1,0,0,0,243,244,1,0,0,0,244,245,1,0,0,0,245,247, + 3,30,15,0,246,248,5,9,0,0,247,246,1,0,0,0,247,248,1,0,0,0,248,250,1,0,0, + 0,249,241,1,0,0,0,250,253,1,0,0,0,251,249,1,0,0,0,251,252,1,0,0,0,252,254, + 1,0,0,0,253,251,1,0,0,0,254,255,5,34,0,0,255,27,1,0,0,0,256,261,3,50,25, + 0,257,258,5,9,0,0,258,259,5,15,0,0,259,260,5,9,0,0,260,262,3,50,25,0,261, + 257,1,0,0,0,261,262,1,0,0,0,262,29,1,0,0,0,263,265,5,56,0,0,264,263,1,0, + 0,0,264,265,1,0,0,0,265,275,1,0,0,0,266,276,3,32,16,0,267,268,3,32,16,0, + 268,269,5,9,0,0,269,270,5,26,0,0,270,273,5,9,0,0,271,274,3,38,19,0,272, + 274,5,54,0,0,273,271,1,0,0,0,273,272,1,0,0,0,274,276,1,0,0,0,275,266,1, + 0,0,0,275,267,1,0,0,0,276,278,1,0,0,0,277,279,5,56,0,0,278,277,1,0,0,0, + 278,279,1,0,0,0,279,31,1,0,0,0,280,285,3,50,25,0,281,282,5,1,0,0,282,286, + 5,42,0,0,283,284,5,11,0,0,284,286,3,50,25,0,285,281,1,0,0,0,285,283,1,0, + 0,0,285,286,1,0,0,0,286,33,1,0,0,0,287,289,3,36,18,0,288,287,1,0,0,0,289, + 292,1,0,0,0,290,288,1,0,0,0,290,291,1,0,0,0,291,35,1,0,0,0,292,290,1,0, + 0,0,293,294,5,56,0,0,294,296,3,46,23,0,295,293,1,0,0,0,295,296,1,0,0,0, + 296,297,1,0,0,0,297,298,5,56,0,0,298,299,5,22,0,0,299,300,5,9,0,0,300,302, + 3,38,19,0,301,303,5,9,0,0,302,301,1,0,0,0,302,303,1,0,0,0,303,304,1,0,0, + 0,304,306,5,7,0,0,305,307,5,9,0,0,306,305,1,0,0,0,306,307,1,0,0,0,307,308, + 1,0,0,0,308,310,3,40,20,0,309,311,5,9,0,0,310,309,1,0,0,0,310,311,1,0,0, + 0,311,322,1,0,0,0,312,314,5,2,0,0,313,315,5,9,0,0,314,313,1,0,0,0,314,315, + 1,0,0,0,315,316,1,0,0,0,316,318,3,40,20,0,317,319,5,9,0,0,318,317,1,0,0, + 0,318,319,1,0,0,0,319,321,1,0,0,0,320,312,1,0,0,0,321,324,1,0,0,0,322,320, + 1,0,0,0,322,323,1,0,0,0,323,326,1,0,0,0,324,322,1,0,0,0,325,327,5,56,0, + 0,326,325,1,0,0,0,326,327,1,0,0,0,327,328,1,0,0,0,328,330,5,8,0,0,329,331, + 5,9,0,0,330,329,1,0,0,0,330,331,1,0,0,0,331,332,1,0,0,0,332,334,5,35,0, + 0,333,335,5,56,0,0,334,333,1,0,0,0,334,335,1,0,0,0,335,337,1,0,0,0,336, + 338,5,9,0,0,337,336,1,0,0,0,337,338,1,0,0,0,338,339,1,0,0,0,339,341,3,52, + 26,0,340,342,5,56,0,0,341,340,1,0,0,0,341,342,1,0,0,0,342,343,1,0,0,0,343, + 344,5,36,0,0,344,37,1,0,0,0,345,346,5,10,0,0,346,39,1,0,0,0,347,349,5,56, + 0,0,348,347,1,0,0,0,348,349,1,0,0,0,349,350,1,0,0,0,350,352,3,42,21,0,351, + 353,5,9,0,0,352,351,1,0,0,0,352,353,1,0,0,0,353,354,1,0,0,0,354,356,5,1, + 0,0,355,357,5,9,0,0,356,355,1,0,0,0,356,357,1,0,0,0,357,358,1,0,0,0,358, + 359,3,44,22,0,359,41,1,0,0,0,360,361,5,10,0,0,361,43,1,0,0,0,362,368,5, + 58,0,0,363,364,5,57,0,0,364,365,5,3,0,0,365,366,5,58,0,0,366,368,5,4,0, + 0,367,362,1,0,0,0,367,363,1,0,0,0,368,45,1,0,0,0,369,373,5,11,0,0,370,372, + 8,0,0,0,371,370,1,0,0,0,372,375,1,0,0,0,373,371,1,0,0,0,373,374,1,0,0,0, + 374,378,1,0,0,0,375,373,1,0,0,0,376,377,5,56,0,0,377,379,3,46,23,0,378, + 376,1,0,0,0,378,379,1,0,0,0,379,47,1,0,0,0,380,381,7,1,0,0,381,49,1,0,0, + 0,382,385,3,48,24,0,383,385,5,55,0,0,384,382,1,0,0,0,384,383,1,0,0,0,385, + 51,1,0,0,0,386,389,7,2,0,0,387,389,8,3,0,0,388,386,1,0,0,0,388,387,1,0, + 0,0,389,392,1,0,0,0,390,388,1,0,0,0,390,391,1,0,0,0,391,53,1,0,0,0,392, + 390,1,0,0,0,67,55,58,62,65,69,73,80,88,93,99,104,109,114,124,126,130,137, + 141,150,153,157,160,167,171,178,182,189,191,199,204,209,218,223,228,235, + 239,243,247,251,261,264,273,275,278,285,290,295,302,306,310,314,318,322, + 326,330,334,337,341,348,352,356,367,373,378,384,388,390]; private static __ATN: ATN; public static get _ATN(): ATN { @@ -2671,6 +2694,9 @@ export class RelationDefTypeRestrictionContext extends ParserRuleContext { public conditionName(): ConditionNameContext { return this.getTypedRuleContext(ConditionNameContext, 0) as ConditionNameContext; } + public DOLLAR_EXPRESSION(): TerminalNode { + return this.getToken(OpenFGAParser.DOLLAR_EXPRESSION, 0); + } public get ruleIndex(): number { return OpenFGAParser.RULE_relationDefTypeRestriction; } diff --git a/pkg/js/package-lock.json b/pkg/js/package-lock.json index 574846c7..00279dcf 100644 --- a/pkg/js/package-lock.json +++ b/pkg/js/package-lock.json @@ -629,9 +629,9 @@ } }, "node_modules/@eslint/config-array/node_modules/brace-expansion": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz", - "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==", + "version": "1.1.18", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.18.tgz", + "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==", "dev": true, "license": "MIT", "dependencies": { @@ -720,9 +720,9 @@ } }, "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { - "version": "1.1.16", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.16.tgz", - "integrity": "sha512-IDw48K2/2kRkg9LdJxurvq3lV3aBgq0REY89duEqFRthjlPdXHKMj7EnQOXVckxzgisinf3nHfrcE2FufFLXMw==", + "version": "1.1.18", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.18.tgz", + "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==", "dev": true, "license": "MIT", "dependencies": { @@ -2537,16 +2537,16 @@ } }, "node_modules/brace-expansion": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", - "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.9.tgz", + "integrity": "sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg==", "dev": true, "license": "MIT", "dependencies": { "balanced-match": "^4.0.2" }, "engines": { - "node": "18 || 20 || >=22" + "node": "20 || >=22" } }, "node_modules/brace-expansion/node_modules/balanced-match": { @@ -3557,9 +3557,9 @@ } }, "node_modules/eslint-plugin-import/node_modules/brace-expansion": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz", - "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==", + "version": "1.1.18", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.18.tgz", + "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==", "dev": true, "license": "MIT", "dependencies": { @@ -3648,9 +3648,9 @@ } }, "node_modules/eslint/node_modules/brace-expansion": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz", - "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==", + "version": "1.1.18", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.18.tgz", + "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==", "dev": true, "license": "MIT", "dependencies": { @@ -3858,9 +3858,9 @@ "license": "MIT" }, "node_modules/fast-uri": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.4.tgz", - "integrity": "sha512-8JnbkQ4juDyvYs4mgFGQqg4yCYtFDtUtmp2QIQq11ZZe5CFQ5wcqm1rqDgAh/QdMySuBnPzMUiJUNZG5N/AiQw==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.5.tgz", + "integrity": "sha512-gHwA1O9LDIcKunMKhObS/HimwtehO1nPUECKAu5TpKgaO19fcWEl4bliWe1jWxVFvIXztJjjQ4L8XQ1EU9f7Jw==", "funding": [ { "type": "github", @@ -5729,9 +5729,9 @@ "license": "MIT" }, "node_modules/js-yaml": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.2.0.tgz", - "integrity": "sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.1.tgz", + "integrity": "sha512-CY6crGq313MX8GkwvB7tzgp99vjQxY1++5y10/BKN/GUfHqWaOGQMNZkBvqSzsZKWk/ijwHlWzzkLulsGHhjWQ==", "dev": true, "funding": [ { @@ -7337,9 +7337,9 @@ } }, "node_modules/test-exclude/node_modules/brace-expansion": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz", - "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==", + "version": "1.1.18", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.18.tgz", + "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==", "dev": true, "license": "MIT", "dependencies": { diff --git a/pkg/js/transformer/dsltojson.ts b/pkg/js/transformer/dsltojson.ts index 878254a5..4084196f 100644 --- a/pkg/js/transformer/dsltojson.ts +++ b/pkg/js/transformer/dsltojson.ts @@ -255,6 +255,10 @@ class OpenFgaDslListener extends OpenFGAListener { if (ctx.conditionName()) { relationRef.condition = ctx.conditionName().getText(); + } else if (ctx.DOLLAR_EXPRESSION()) { + // `$expression` is a reserved condition name for inline expressions; it + // is carried on the RelationReference exactly like a named condition. + relationRef.condition = ctx.DOLLAR_EXPRESSION().getText(); } if (usersetRestriction) { diff --git a/pkg/js/validator/validate-dsl.ts b/pkg/js/validator/validate-dsl.ts index a52f90ac..d83f889a 100644 --- a/pkg/js/validator/validate-dsl.ts +++ b/pkg/js/validator/validate-dsl.ts @@ -11,6 +11,11 @@ enum RelationDefOperator { Difference = "difference", } +// Reserved condition name for inline expressions on a type restriction. Unlike +// named conditions it is not declared in the model's `conditions` block, so it +// is exempt from the "condition must be defined" validation. +const RESERVED_INLINE_EXPRESSION = "$expression"; + interface ValidationRegex { rule: string; regex: RegExp; @@ -480,7 +485,11 @@ function childDefDefined( collector.raiseInvalidType(decodedType, type, relation, { file, module }, lineIndex); } - if (decodedConditionName && !conditions[decodedConditionName]) { + if ( + decodedConditionName && + decodedConditionName !== RESERVED_INLINE_EXPRESSION && + !conditions[decodedConditionName] + ) { // condition name is not defined const typeIndex = getTypeLineNumber(type, lines); const lineIndex = getRelationLineNumber(relation, lines, typeIndex); diff --git a/tests/data/dsl-semantic-validation-cases.yaml b/tests/data/dsl-semantic-validation-cases.yaml index d788997a..b1cdb555 100644 --- a/tests/data/dsl-semantic-validation-cases.yaml +++ b/tests/data/dsl-semantic-validation-cases.yaml @@ -2275,3 +2275,28 @@ metadata: symbol: "less" errorType: condition-not-used +- name: inline expression mixed with plain and named condition is valid + dsl: | + model + schema 1.1 + type user + type document + relations + define viewer: [user, user with cond1, user with $expression] + + condition cond1(x: int) { + x < 100 + } + expected_errors: [] +- name: inline expression on userset is valid + dsl: | + model + schema 1.1 + type user + type group + relations + define member: [user] + type document + relations + define viewer: [group#member with $expression] + expected_errors: []